Skip to content

Commit

Permalink
mailinfo & mailsplit: check for EOF while parsing
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
dscho authored and gitster committed May 8, 2017
1 parent e7b65e2 commit f0733c1
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 1 deletion.
10 changes: 10 additions & 0 deletions builtin/mailsplit.c
Expand Up @@ -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);

Expand Down
9 changes: 8 additions & 1 deletion mailinfo.c
Expand Up @@ -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))
Expand Down Expand Up @@ -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);

Expand Down

0 comments on commit f0733c1

Please sign in to comment.