blame.c: fix garbled error message
The helper functions prepare_final() and prepare_initial() return a pointer to a string that is a member of an object in the revs->pending array. This array is later rebuilt when running prepare_revision_walk() which potentially transforms the pointer target into a bogus string. Fix this by maintaining a copy of the original string. Signed-off-by: Lukas Fleischer <git@cryptocrack.de> Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Lukas Fleischer committed
Jan 12, 2015 at 20:59 UTC
a46442f1675722eb68238b329a4a285f03f41dda
1 file changed
+7
-5
builtin/blame.c
+7
-5
@@ -2390,7 +2390,7 @@ static struct commit *fake_working_tree_commit(struct diff_options *opt,
2390
return commit;
2391
}
2392
2393
-static const char *prepare_final(struct scoreboard *sb)
2393
+static char *prepare_final(struct scoreboard *sb)
2394
{
2395
int i;
2396
const char *final_commit_name = NULL;
@@ -2415,10 +2415,10 @@ static const char *prepare_final(struct scoreboard *sb)
2415
sb->final = (struct commit *) obj;
2416
final_commit_name = revs->pending.objects[i].name;
2417
}
2418
- return final_commit_name;
2418
+ return xstrdup_or_null(final_commit_name);
2419
}
2420
2421
-static const char *prepare_initial(struct scoreboard *sb)
2421
+static char *prepare_initial(struct scoreboard *sb)
2422
{
2423
int i;
2424
const char *final_commit_name = NULL;
@@ -2445,7 +2445,7 @@ static const char *prepare_initial(struct scoreboard *sb)
2445
}
2446
if (!final_commit_name)
2447
die("No commit to dig down to?");
2448
- return final_commit_name;
2448
+ return xstrdup(final_commit_name);
2449
}
2450
2451
static int blame_copy_callback(const struct option *option, const char *arg, int unset)
@@ -2489,7 +2489,7 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
2489
struct origin *o;
2490
struct blame_entry *ent = NULL;
2491
long dashdash_pos, lno;
2492
- const char *final_commit_name = NULL;
2492
+ char *final_commit_name = NULL;
2493
enum object_type type;
2494
2495
static struct string_list range_list;
@@ -2786,6 +2786,8 @@ parse_done:
2786
2787
assign_blame(&sb, opt);
2788
2789
+ free(final_commit_name);
2790
+
2791
if (incremental)
2792
return 0;
2793