[PATCH 2/6] shortlog: use strbufs to read from stdin
From: Jeff King <hidden>
Date: 2016-06-15 23:07:46
Subsystem:
the rest · Maintainer:
Linus Torvalds
We currently use fixed-size buffers with fgets(), which could lead to incorrect results in the unlikely event that a line had something like "Author:" at exactly its 1024th character. But it's easy to convert this to a strbuf, and because we can reuse the same buffer through the loop, we don't even pay the extra allocation cost. Signed-off-by: Jeff King <redacted> --- builtin/shortlog.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-)
diff --git a/builtin/shortlog.c b/builtin/shortlog.c
index fe9fa2f..bb2ee5b 100644
--- a/builtin/shortlog.c
+++ b/builtin/shortlog.c@@ -112,20 +112,23 @@ static int match_ident_header(const char *candidate, const char *header, static void read_from_stdin(struct shortlog *log) { - char author[1024], oneline[1024]; + struct strbuf author = STRBUF_INIT; + struct strbuf oneline = STRBUF_INIT; - while (fgets(author, sizeof(author), stdin) != NULL) { + while (strbuf_getline(&author, stdin, '\n') != EOF) { const char *v; - if (!match_ident_header(author, "author", &v)) + if (!match_ident_header(author.buf, "author", &v)) continue; - while (fgets(oneline, sizeof(oneline), stdin) && - oneline[0] != '\n') + while (strbuf_getline(&oneline, stdin, '\n') != EOF && + oneline.len) ; /* discard headers */ - while (fgets(oneline, sizeof(oneline), stdin) && - oneline[0] == '\n') + while (strbuf_getline(&oneline, stdin, '\n') != EOF && + !oneline.len) ; /* discard blanks */ - insert_one_record(log, v, oneline); + insert_one_record(log, v, oneline.buf); } + strbuf_release(&author); + strbuf_release(&oneline); } void shortlog_add_commit(struct shortlog *log, struct commit *commit)
--
2.7.0.244.g0701a9d