[libgit2-glib] diff-line: keep a copy of the content to avoid corrupted data



commit 98b881f9ba55c59cfdaad3d67a4df69e93606b07
Author: Ignacio Casal Quinteiro <icq gnome org>
Date:   Sat Aug 29 19:03:35 2015 +0200

    diff-line: keep a copy of the content to avoid corrupted data
    
    We are copying the data of the line exect for some reason the content.
    We need to also copy the content, if not it will go away once the
    real line gets freed.

 libgit2-glib/ggit-diff-line.c |   22 ++++++++++++----------
 1 files changed, 12 insertions(+), 10 deletions(-)
---
diff --git a/libgit2-glib/ggit-diff-line.c b/libgit2-glib/ggit-diff-line.c
index 6c78b0d..e962bde 100644
--- a/libgit2-glib/ggit-diff-line.c
+++ b/libgit2-glib/ggit-diff-line.c
@@ -31,12 +31,11 @@ struct _GgitDiffLine {
        gint old_lineno;
        gint new_lineno;
        gint num_lines;
-       gsize content_len;
        gint64 content_offset;
-       const gchar *content;
+       GBytes *content;
 
        gchar *text;
-       const gchar *encoding;
+       gchar *encoding;
 };
 
 G_DEFINE_BOXED_TYPE (GgitDiffLine, ggit_diff_line,
@@ -56,10 +55,9 @@ _ggit_diff_line_wrap (const git_diff_line *line,
        gline->origin = (GgitDiffLineType)line->origin;
        gline->old_lineno = line->old_lineno;
        gline->new_lineno = line->new_lineno;
-       gline->content_len = line->content_len;
        gline->content_offset = line->content_offset;
-       gline->content = line->content;
-       gline->encoding = encoding;
+       gline->content = g_bytes_new (line->content, line->content_len);
+       gline->encoding = g_strdup (encoding);
        gline->text = NULL;
 
        return gline;
@@ -184,10 +182,10 @@ ggit_diff_line_get_content (GgitDiffLine *line,
 
        if (length)
        {
-               *length = line->content_len;
+               *length = g_bytes_get_size (line->content);
        }
 
-       return (const guint8 *)line->content;
+       return g_bytes_get_data (line->content, NULL);
 }
 
 /**
@@ -206,8 +204,12 @@ ggit_diff_line_get_text (GgitDiffLine *line)
 
        if (line->text == NULL)
        {
-               line->text = ggit_convert_utf8 (line->content,
-                                               line->content_len,
+               const gchar *content;
+               gsize content_len;
+
+               content = g_bytes_get_data (line->content, &content_len);
+               line->text = ggit_convert_utf8 (content,
+                                               content_len,
                                                line->encoding);
        }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]