]> git.ipfire.org Git - thirdparty/git.git/commitdiff
line-log: always allocate the output prefix
authorPatrick Steinhardt <ps@pks.im>
Fri, 7 Jun 2024 06:38:16 +0000 (08:38 +0200)
committerJunio C Hamano <gitster@pobox.com>
Fri, 7 Jun 2024 17:30:51 +0000 (10:30 -0700)
The returned string by `output_prefix()` is sometimes a string constant
and sometimes an allocated string. This has been fine until now because
we always leak the allocated strings, and thus we never tried to free
the string constant.

Fix the code to always return an allocated string and free the returned
value at all callsites.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
line-log.c

index bd3e663c24275e375282e5376f9a653c74253343..67c80b39a0df2ecbec2ae0c82547e6115e3f8eac 100644 (file)
@@ -899,14 +899,12 @@ static void print_line(const char *prefix, char first,
 
 static char *output_prefix(struct diff_options *opt)
 {
-       char *prefix = "";
-
        if (opt->output_prefix) {
                struct strbuf *sb = opt->output_prefix(opt, opt->output_prefix_data);
-               prefix = sb->buf;
+               return sb->buf;
+       } else {
+               return xstrdup("");
        }
-
-       return prefix;
 }
 
 static void dump_diff_hacky_one(struct rev_info *rev, struct line_log_data *range)
@@ -927,7 +925,7 @@ static void dump_diff_hacky_one(struct rev_info *rev, struct line_log_data *rang
        const char *c_context = diff_get_color(opt->use_color, DIFF_CONTEXT);
 
        if (!pair || !diff)
-               return;
+               goto out;
 
        if (pair->one->oid_valid)
                fill_line_ends(rev->diffopt.repo, pair->one, &p_lines, &p_ends);
@@ -1002,8 +1000,10 @@ static void dump_diff_hacky_one(struct rev_info *rev, struct line_log_data *rang
                                   c_context, c_reset, opt->file);
        }
 
+out:
        free(p_ends);
        free(t_ends);
+       free(prefix);
 }
 
 /*
@@ -1012,7 +1012,11 @@ static void dump_diff_hacky_one(struct rev_info *rev, struct line_log_data *rang
  */
 static void dump_diff_hacky(struct rev_info *rev, struct line_log_data *range)
 {
-       fprintf(rev->diffopt.file, "%s\n", output_prefix(&rev->diffopt));
+       char *prefix = output_prefix(&rev->diffopt);
+
+       fprintf(rev->diffopt.file, "%s\n", prefix);
+       free(prefix);
+
        while (range) {
                dump_diff_hacky_one(rev, range);
                range = range->next;