summaryrefslogtreecommitdiff
path: root/gpg-interface.c
diff options
context:
space:
mode:
authorJeff King <peff@peff.net>2018-04-13 21:18:35 (GMT)
committerJunio C Hamano <gitster@pobox.com>2018-04-16 05:15:03 (GMT)
commit8b44b2be89bf59c0fada6095bdfea66ff53c6074 (patch)
tree18d3cd098a0cbc8b989f0fd7945927ec75c4f524 /gpg-interface.c
parentf68f2dd57f55e0b1782b20b615dd7a96d7fb6a41 (diff)
downloadgit-8b44b2be89bf59c0fada6095bdfea66ff53c6074.zip
git-8b44b2be89bf59c0fada6095bdfea66ff53c6074.tar.gz
git-8b44b2be89bf59c0fada6095bdfea66ff53c6074.tar.bz2
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.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/gpg-interface.c b/gpg-interface.c
index 79333c1..0647bd6 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)