Skip to content

Commit

Permalink
parse_signed_commit: really use the entire commit log message
Browse files Browse the repository at this point in the history
... even beyond the first NUL in the buffer, when checking the commit
against the detached signature in the header.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
gitster committed Oct 20, 2011
1 parent d542c72 commit 33a11a2
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 14 deletions.
21 changes: 12 additions & 9 deletions commit.c
Original file line number Diff line number Diff line change
Expand Up @@ -854,28 +854,31 @@ int parse_signed_commit(const unsigned char *sha1,
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:
Expand Down
21 changes: 16 additions & 5 deletions t/t7510-signed-commit.sh
Original file line number Diff line number Diff line change
Expand Up @@ -50,11 +50,22 @@ test_expect_success GPG 'show signatures' '

test_expect_success GPG 'detect fudged signature' '
git cat-file commit master >raw &&
sed -e "s/fourth signed/4th forged/" raw >forged &&
git hash-object -w -t commit forged >forged.commit &&
git show --pretty=short --show-signature $(cat forged.commit) >actual &&
grep "BAD signature from" actual &&
! grep "Good signature from" actual
sed -e "s/fourth signed/4th forged/" raw >forged1 &&
git hash-object -w -t commit forged1 >forged1.commit &&
git show --pretty=short --show-signature $(cat forged1.commit) >actual1 &&
grep "BAD signature from" actual1 &&
! grep "Good signature from" actual1
'

test_expect_success GPG 'detect fudged signature with NUL' '
git cat-file commit master >raw &&
cat raw >forged2 &&
echo Qwik | tr "Q" "\000" >>forged2 &&
git hash-object -w -t commit forged2 >forged2.commit &&
git show --pretty=short --show-signature $(cat forged2.commit) >actual2 &&
grep "BAD signature from" actual2 &&
! grep "Good signature from" actual2
'

test_done

0 comments on commit 33a11a2

Please sign in to comment.