diff options
author | Jeff King <peff@peff.net> | 2018-04-13 23:18:35 +0200 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2018-04-16 07:15:03 +0200 |
commit | 8b44b2be89bf59c0fada6095bdfea66ff53c6074 (patch) | |
tree | 18d3cd098a0cbc8b989f0fd7945927ec75c4f524 /gpg-interface.c | |
parent | gpg-interface: extract gpg line matching helper (diff) | |
download | git-8b44b2be89bf59c0fada6095bdfea66ff53c6074.tar.xz git-8b44b2be89bf59c0fada6095bdfea66ff53c6074.zip |
gpg-interface: find the last gpg signature line
A signed tag has a detached signature like this:
object ...
[...more header...]
This is the tag body.
-----BEGIN PGP SIGNATURE-----
[opaque gpg data]
-----END PGP SIGNATURE-----
Our parser finds the _first_ line that appears to start a
PGP signature block, meaning we may be confused by a
signature (or a signature-like line) in the actual body.
Let's keep parsing and always find the final block, which
should be the detached signature over all of the preceding
content.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Ben Toews <mastahyeti@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'gpg-interface.c')
-rw-r--r-- | gpg-interface.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/gpg-interface.c b/gpg-interface.c index 79333c1ee8..0647bd6348 100644 --- a/gpg-interface.c +++ b/gpg-interface.c @@ -110,11 +110,17 @@ static int is_gpg_start(const char *line) size_t parse_signature(const char *buf, size_t size) { size_t len = 0; - while (len < size && !is_gpg_start(buf + len)) { - const char *eol = memchr(buf + len, '\n', size - len); + size_t match = size; + while (len < size) { + const char *eol; + + if (is_gpg_start(buf + len)) + match = len; + + eol = memchr(buf + len, '\n', size - len); len += eol ? eol - (buf + len) + 1 : size - len; } - return len; + return match; } void set_signing_key(const char *key) |