summaryrefslogtreecommitdiff
path: root/rerere.c
diff options
context:
space:
mode:
authorJim Meyering <jim@meyering.net>2011-05-26 13:54:18 (GMT)
committerJunio C Hamano <gitster@pobox.com>2011-05-26 18:07:52 (GMT)
commit5743350f696745a48dfe7976c98dc8eb5c842d72 (patch)
tree25de41a88ebaa9217b2493d1b0eca7aa88ef8acb /rerere.c
parentbac9c06ba093d9254cb2ab3eed074722a3e635a6 (diff)
downloadgit-5743350f696745a48dfe7976c98dc8eb5c842d72.zip
git-5743350f696745a48dfe7976c98dc8eb5c842d72.tar.gz
git-5743350f696745a48dfe7976c98dc8eb5c842d72.tar.bz2
rerere.c: diagnose a corrupt MERGE_RR when hitting EOF between TAB and '\0'
If we reach EOF after the SHA1-then-TAB, yet before the NUL that terminates each file name, we would fill the file name buffer with \255 bytes resulting from the repeatedly-failing fgetc (returns EOF/-1) and ultimately complain about "filename too long", because no NUL was encountered. Signed-off-by: Jim Meyering <jim@meyering.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'rerere.c')
-rw-r--r--rerere.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/rerere.c b/rerere.c
index d260843..283a002 100644
--- a/rerere.c
+++ b/rerere.c
@@ -42,8 +42,14 @@ static void read_rr(struct string_list *rr)
name = xstrdup(buf);
if (fgetc(in) != '\t')
die("corrupt MERGE_RR");
- for (i = 0; i < sizeof(buf) && (buf[i] = fgetc(in)); i++)
- ; /* do nothing */
+ for (i = 0; i < sizeof(buf); i++) {
+ int c = fgetc(in);
+ if (c < 0)
+ die("corrupt MERGE_RR");
+ buf[i] = c;
+ if (c == 0)
+ break;
+ }
if (i == sizeof(buf))
die("filename too long");
string_list_insert(rr, buf)->util = name;