mailinfo & mailsplit: check for EOF while parsing
While POSIX states that it is okay to pass EOF to isspace() (and it seems to be implied that EOF should *not* be treated as whitespace), and also to pass EOF to ungetc() (which seems to be intended to fail without buffering the character), it is much better to handle these cases explicitly. Not only does it reduce head-scratching (and helps static analysis avoid reporting false positives), it also lets us handle files containing nothing but whitespace by erroring out. Reported via Coverity. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
e7b65e205a
commit
f0733c13ed
@ -232,6 +232,16 @@ static int split_mbox(const char *file, const char *dir, int allow_bare,
|
||||
|
||||
do {
|
||||
peek = fgetc(f);
|
||||
if (peek == EOF) {
|
||||
if (f == stdin)
|
||||
/* empty stdin is OK */
|
||||
ret = skip;
|
||||
else {
|
||||
fclose(f);
|
||||
error(_("empty mbox: '%s'"), file);
|
||||
}
|
||||
goto out;
|
||||
}
|
||||
} while (isspace(peek));
|
||||
ungetc(peek, f);
|
||||
|
||||
|
@ -882,7 +882,10 @@ static int read_one_header_line(struct strbuf *line, FILE *in)
|
||||
for (;;) {
|
||||
int peek;
|
||||
|
||||
peek = fgetc(in); ungetc(peek, in);
|
||||
peek = fgetc(in);
|
||||
if (peek == EOF)
|
||||
break;
|
||||
ungetc(peek, in);
|
||||
if (peek != ' ' && peek != '\t')
|
||||
break;
|
||||
if (strbuf_getline_lf(&continuation, in))
|
||||
@ -1099,6 +1102,10 @@ int mailinfo(struct mailinfo *mi, const char *msg, const char *patch)
|
||||
|
||||
do {
|
||||
peek = fgetc(mi->input);
|
||||
if (peek == EOF) {
|
||||
fclose(cmitmsg);
|
||||
return error("empty patch: '%s'", patch);
|
||||
}
|
||||
} while (isspace(peek));
|
||||
ungetc(peek, mi->input);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user