Skip to content

Commit

Permalink
fsck: properly bound "invalid tag name" error message
Browse files Browse the repository at this point in the history
When we detect an invalid tag-name header in a tag object,
like, "tag foo bar\n", we feed the pointer starting at "foo
bar" to a printf "%s" formatter. This shows the name, as we
want, but then it keeps printing the rest of the tag buffer,
rather than stopping at the end of the line.

Our tests did not notice because they look only for the
matching line, but the bug is that we print much more than
we wanted to. So we also adjust the test to be more exact.

Note that when fscking tags with "index-pack --strict", this
is even worse. index-pack does not add a trailing
NUL-terminator after the object, so we may actually read
past the buffer and print uninitialized memory. Running
t5302 with valgrind does notice the bug for that reason.

Signed-off-by: Jeff King <peff@peff.net>
Acked-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Jeff King authored and Junio C Hamano committed Dec 9, 2014
1 parent f99b7af commit 7add441
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 3 deletions.
3 changes: 2 additions & 1 deletion fsck.c
Original file line number Diff line number Diff line change
Expand Up @@ -423,7 +423,8 @@ static int fsck_tag_buffer(struct tag *tag, const char *data,
}
strbuf_addf(&sb, "refs/tags/%.*s", (int)(eol - buffer), buffer);
if (check_refname_format(sb.buf, 0))
error_func(&tag->object, FSCK_WARN, "invalid 'tag' name: %s", buffer);
error_func(&tag->object, FSCK_WARN, "invalid 'tag' name: %.*s",
(int)(eol - buffer), buffer);
buffer = eol + 1;

if (!skip_prefix(buffer, "tagger ", &buffer))
Expand Down
8 changes: 6 additions & 2 deletions t/t1450-fsck.sh
Original file line number Diff line number Diff line change
Expand Up @@ -209,8 +209,12 @@ test_expect_success 'tag with incorrect tag name & missing tagger' '
echo $tag >.git/refs/tags/wrong &&
test_when_finished "git update-ref -d refs/tags/wrong" &&
git fsck --tags 2>out &&
grep "invalid .tag. name" out &&
grep "expected .tagger. line" out
cat >expect <<-EOF &&
warning in tag $tag: invalid '\''tag'\'' name: wrong name format
warning in tag $tag: invalid format - expected '\''tagger'\'' line
EOF
test_cmp expect out
'

test_expect_success 'cleaned up' '
Expand Down

0 comments on commit 7add441

Please sign in to comment.