On 1/28/26 06:35, Sam James via Gnupg-devel wrote:
* g10/keyedit.c (keyedit_quick_revsig): Check 'keyblock' in log_assert.

--

Found by GCC's -fanalyzer.

Signed-off-by: Sam James <[email protected]>
---
  g10/keyedit.c | 4 ++--
  1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/g10/keyedit.c b/g10/keyedit.c
index 970a72027..567de4efd 100644
--- a/g10/keyedit.c
+++ b/g10/keyedit.c
@@ -3306,8 +3306,8 @@ keyedit_quick_revsig (ctrl_t ctrl, const char *username, 
const char *sigtorev,
    err = quick_find_keyblock (ctrl, username, 0, &kdbhd, &keyblock);
    if (err)
      goto leave;
-  log_assert (keyblock->pkt->pkttype == PKT_PUBLIC_KEY
-              || keyblock->pkt->pkttype == PKT_SECRET_KEY);
+  log_assert (keyblock && (keyblock->pkt->pkttype == PKT_PUBLIC_KEY
+              || keyblock->pkt->pkttype == PKT_SECRET_KEY));
    primarypk = keyblock->pkt->pkt.public_key;
    primarykid = pk_keyid (primarypk);

Minor nit:  this expression should either be split across three lines or the second line indented to line up after the opening paren.  As it stands, it is easy for a human to misread.

Alternately, is it possible for this code to be reached if keyblock is NULL?  Perhaps a better solution would be to change the "if (err)" to "if (err || !keyblock)" or the more verbose "if (err != 0 || keyblock == NULL)"?  (I assume that quick_find_keyblock always returns an error if keyblock is NULL upon return, but the analyzer does not know that.)

Some future version of GCC can optimize the "|| !keyblock" away when it is able to prove that "!err" implies "keyblock".  Current GCC clearly cannot do this.

Now that I look at this a bit more, I think we may have found another shortcoming in the analyzer:  does log_assert crash the program on an assertion failure?  Does the analyzer know that?  If not, a NULL keyblock would be dereferenced on the very next line, but the analyzer sees that it was checked and is happy... oops.


-- Jacob



_______________________________________________
Gnupg-devel mailing list
[email protected]
https://lists.gnupg.org/mailman/listinfo/gnupg-devel

Reply via email to