diff --git a/commit.c b/commit.c
index 93045a2cdae33426182c544e92ba0330133a10d7..09693f78d92c2851c2edb9e627f99ee4e7bfbf57 100644 (file)
--- a/commit.c
+++ b/commit.c
unsigned long size;
enum object_type type;
char *buffer = read_sha1_file(sha1, &type, &size);
- int in_header, saw_signature = -1;
- char *line;
+ int saw_signature = -1;
+ char *line, *tail;
if (!buffer || type != OBJ_COMMIT)
goto cleanup;
line = buffer;
- in_header = 1;
+ tail = buffer + size;
saw_signature = 0;
- while (*line) {
- char *next = strchrnul(line, '\n');
- if (*next)
+ while (line < tail) {
+ char *next = memchr(line, '\n', tail - line);
+ if (!next)
+ next = tail;
+ else
next++;
- if (in_header && !prefixcmp(line, gpg_sig_header)) {
+ if (!prefixcmp(line, gpg_sig_header)) {
const char *sig = line + gpg_sig_header_len;
strbuf_add(signature, sig, next - sig);
saw_signature = 1;
} else {
+ if (*line == '\n')
+ /* dump the whole remainder of the buffer */
+ next = tail;
strbuf_add(payload, line, next - line);
}
- if (*line == '\n')
- in_header = 0;
line = next;
}
cleanup: