threads / patch / 46453

patchblame: fix memory corruption scrambling revision name in error message

Subject: [PATCH] blame: fix memory corruption scrambling revision name in error message

## tl;dr

One message between Jul 24, 2017 and Jul 24, 2017. Diffs are folded; open one to read it.

replies: 0people: 1as markdown or json

SZEDER Gábor· Jul 24, 2017, 17:06 UTC · lore

When attempting to blame a non-existing path, git should show an error message like this:

  $ git blame e83c51633 -- nonexisting-file
  fatal: no such path nonexisting-file in e83c51633

Since the recent commit 835c49f7d (blame: rework methods that determine 'final' commit, 2017-05-24) the revision name is either missing or some scrambled characters are shown instead. The reason is that the revision name must be duplicated, because it is invalidated when the pending objects array is cleared in the meantime, but this commit dropped the duplication.

Restore the duplication of the revision name in the affected functions (find_single_final() and find_single_initial()).

Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
---
 blame.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)
Show changes to blame.c +5 −3
diff --git a/blame.c b/blame.c
index 91e26e93e..9ee0a375f 100644
--- a/blame.c
+++ b/blame.c
@@ -1662,8 +1662,8 @@ static struct commit *find_single_final(struct rev_info *revs,
 		found = (struct commit *)obj;
 		name = revs->pending.objects[i].name;
 	}
-	if (name_p)
-		*name_p = name;
+	if (name_p && name)
+		*name_p = xstrdup(name);
 	return found;
 }
 
@@ -1735,7 +1735,7 @@ static struct commit *find_single_initial(struct rev_info *revs,
 		die("No commit to dig up from?");
 
 	if (name_p)
-		*name_p = name;
+		*name_p = xstrdup(name);
 	return found;
 }
 
@@ -1843,6 +1843,8 @@ void setup_scoreboard(struct blame_scoreboard *sb, const char *path, struct blam
 
 	if (orig)
 		*orig = o;
+
+	free((char *)final_commit_name);
 }
 
 
-- 
2.14.0.rc0.88.ge338f4246

← back to recent threads