Skip to content

Commit a46442f

Browse files
Lukas Fleischergitster
authored andcommitted
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 <[email protected]> Signed-off-by: Jeff King <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 8c53f07 commit a46442f

File tree

1 file changed

+7
-5
lines changed

1 file changed

+7
-5
lines changed

builtin/blame.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2390,7 +2390,7 @@ static struct commit *fake_working_tree_commit(struct diff_options *opt,
23902390
return commit;
23912391
}
23922392

2393-
static const char *prepare_final(struct scoreboard *sb)
2393+
static char *prepare_final(struct scoreboard *sb)
23942394
{
23952395
int i;
23962396
const char *final_commit_name = NULL;
@@ -2415,10 +2415,10 @@ static const char *prepare_final(struct scoreboard *sb)
24152415
sb->final = (struct commit *) obj;
24162416
final_commit_name = revs->pending.objects[i].name;
24172417
}
2418-
return final_commit_name;
2418+
return xstrdup_or_null(final_commit_name);
24192419
}
24202420

2421-
static const char *prepare_initial(struct scoreboard *sb)
2421+
static char *prepare_initial(struct scoreboard *sb)
24222422
{
24232423
int i;
24242424
const char *final_commit_name = NULL;
@@ -2445,7 +2445,7 @@ static const char *prepare_initial(struct scoreboard *sb)
24452445
}
24462446
if (!final_commit_name)
24472447
die("No commit to dig down to?");
2448-
return final_commit_name;
2448+
return xstrdup(final_commit_name);
24492449
}
24502450

24512451
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)
24892489
struct origin *o;
24902490
struct blame_entry *ent = NULL;
24912491
long dashdash_pos, lno;
2492-
const char *final_commit_name = NULL;
2492+
char *final_commit_name = NULL;
24932493
enum object_type type;
24942494

24952495
static struct string_list range_list;
@@ -2786,6 +2786,8 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
27862786

27872787
assign_blame(&sb, opt);
27882788

2789+
free(final_commit_name);
2790+
27892791
if (incremental)
27902792
return 0;
27912793

0 commit comments

Comments
 (0)