diff options
author | Jim Meyering <jim@meyering.net> | 2011-05-26 15:54:18 +0200 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2011-05-26 11:07:52 -0700 |
commit | 5743350f696745a48dfe7976c98dc8eb5c842d72 (patch) | |
tree | 25de41a88ebaa9217b2493d1b0eca7aa88ef8acb /rerere.c | |
parent | bac9c06ba093d9254cb2ab3eed074722a3e635a6 (diff) | |
download | git-5743350f696745a48dfe7976c98dc8eb5c842d72.tar.gz |
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.c | 10 |
1 files changed, 8 insertions, 2 deletions
@@ -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; |