gpg: Do not bail on an invalid packet in the local keyring.
authorWerner Koch <wk@gnupg.org>
Tue, 21 May 2019 15:27:42 +0000 (17:27 +0200)
committerDaniel Kahn Gillmor <dkg@fifthhorseman.net>
Fri, 1 Jul 2022 16:06:43 +0000 (17:06 +0100)
* g10/keydb.c (parse_keyblock_image): Treat invalid packet special.
--

This is in particular useful to run --list-keys on a keyring with
corrupted packets.  The extra flush is to keep the diagnostic close to
the regular --list-key output.

Signed-off-by: Werner Koch <wk@gnupg.org>
This is a backport from master with support for the unsupported v5 key
handling.

(cherry picked from commit 30f44957ccd1433846709911798af3da4e437900)

Gbp-Pq: Topic from-2.2.16
Gbp-Pq: Name gpg-Do-not-bail-on-an-invalid-packet-in-the-local-keyring.patch

g10/keydb.c

index 0475f8561a12c252f5ff6663ddf346b212941b84..670a8a19151902255c49a6a48adfa7e2df27ddcb 100644 (file)
@@ -1249,12 +1249,19 @@ parse_keyblock_image (iobuf_t iobuf, int pk_no, int uid_no,
        }
       if (err)
         {
-          if (gpg_err_code (err) != GPG_ERR_UNKNOWN_VERSION)
+          es_fflush (es_stdout);
+          log_error ("parse_keyblock_image: read error: %s\n",
+                     gpg_strerror (err));
+          if (gpg_err_code (err) == GPG_ERR_INV_PACKET)
             {
-              log_error ("parse_keyblock_image: read error: %s\n",
-                         gpg_strerror (err));
-              err = gpg_error (GPG_ERR_INV_KEYRING);
+              free_packet (pkt, &parsectx);
+              init_packet (pkt);
+              continue;
             }
+          /* Unknown version maybe due to v5 keys - we treat this
+           * error different.  */
+          if (gpg_err_code (err) != GPG_ERR_UNKNOWN_VERSION)
+            err = gpg_error (GPG_ERR_INV_KEYRING);
           break;
         }