shortlog: use strbufs to read from stdin
authorJeff King <peff@peff.net>
Mon, 18 Jan 2016 20:02:44 +0000 (15:02 -0500)
committerJunio C Hamano <gitster@pobox.com>
Tue, 19 Jan 2016 17:53:08 +0000 (09:53 -0800)
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 <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/shortlog.c
index ab25b443d0d3cfbd59e4bc32040f1f74a6656537..6c0a72edef864016c5faafd260df61e9242a7937 100644 (file)
@@ -91,21 +91,24 @@ static void insert_one_record(struct shortlog *log,
 
 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 (!skip_prefix(author, "Author: ", &v) &&
-                   !skip_prefix(author, "author ", &v))
+               if (!skip_prefix(author.buf, "Author: ", &v) &&
+                   !skip_prefix(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)