]> granicus.if.org Git - git/commitdiff
gpg-interface: find the last gpg signature line
authorJeff King <peff@peff.net>
Fri, 13 Apr 2018 21:18:35 +0000 (15:18 -0600)
committerJunio C Hamano <gitster@pobox.com>
Mon, 16 Apr 2018 05:15:03 +0000 (14:15 +0900)
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>
gpg-interface.c
t/t7004-tag.sh

index 79333c1ee8a6a1454cc7989186297e9412086ac5..0647bd6348cdedd0e32f30ed23934d390eae4122 100644 (file)
@@ -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)
index ee093b393d51a2dce6752dcf7bf66cc74a42202a..e3f1e014aaa07444445cbb1d50d8fdc76e1b4aa5 100755 (executable)
@@ -1059,6 +1059,17 @@ test_expect_success GPG \
        git tag -v blanknonlfile-signed-tag
 '
 
+test_expect_success GPG 'signed tag with embedded PGP message' '
+       cat >msg <<-\EOF &&
+       -----BEGIN PGP MESSAGE-----
+
+       this is not a real PGP message
+       -----END PGP MESSAGE-----
+       EOF
+       git tag -s -F msg confusing-pgp-message &&
+       git tag -v confusing-pgp-message
+'
+
 # messages with commented lines for signed tags:
 
 cat >sigcommentsfile <<EOF