From: Michael Haggerty Date: Wed, 13 Sep 2017 17:16:00 +0000 (+0200) Subject: read_packed_refs(): only check for a header at the top of the file X-Git-Tag: v2.15.0-rc0~13^2~15 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=36f23534aef58f747048ffea5addb0367406896d;p=git-core%2Fgit.git read_packed_refs(): only check for a header at the top of the file This tightens up the parsing a bit; previously, stray header-looking lines would have been processed. Signed-off-by: Michael Haggerty Signed-off-by: Junio C Hamano --- diff --git a/refs/packed-backend.c b/refs/packed-backend.c index 154abbd83..141f02b9c 100644 --- a/refs/packed-backend.c +++ b/refs/packed-backend.c @@ -255,11 +255,34 @@ static struct packed_ref_cache *read_packed_refs(struct packed_ref_store *refs) pos = buf; eof = buf + size; + /* If the file has a header line, process it: */ + if (pos < eof && *pos == '#') { + const char *traits; + + eol = memchr(pos, '\n', eof - pos); + if (!eol) + die_unterminated_line(refs->path, pos, eof - pos); + + strbuf_add(&line, pos, eol + 1 - pos); + + if (!skip_prefix(line.buf, "# pack-refs with:", &traits)) + die_invalid_line(refs->path, pos, eof - pos); + + if (strstr(traits, " fully-peeled ")) + peeled = PEELED_FULLY; + else if (strstr(traits, " peeled ")) + peeled = PEELED_TAGS; + /* perhaps other traits later as well */ + + /* The "+ 1" is for the LF character. */ + pos = eol + 1; + strbuf_reset(&line); + } + dir = get_ref_dir(packed_refs->cache->root); while (pos < eof) { struct object_id oid; const char *refname; - const char *traits; eol = memchr(pos, '\n', eof - pos); if (!eol) @@ -267,15 +290,6 @@ static struct packed_ref_cache *read_packed_refs(struct packed_ref_store *refs) strbuf_add(&line, pos, eol + 1 - pos); - if (skip_prefix(line.buf, "# pack-refs with:", &traits)) { - if (strstr(traits, " fully-peeled ")) - peeled = PEELED_FULLY; - else if (strstr(traits, " peeled ")) - peeled = PEELED_TAGS; - /* perhaps other traits later as well */ - goto next_line; - } - refname = parse_ref_line(&line, &oid); if (refname) { int flag = REF_ISPACKED; @@ -307,7 +321,6 @@ static struct packed_ref_cache *read_packed_refs(struct packed_ref_store *refs) die_invalid_line(refs->path, line.buf, line.len); } - next_line: /* The "+ 1" is for the LF character. */ pos = eol + 1; strbuf_reset(&line);