Subject: bug#38602: 26.3; gnutls-negotiate fails to handle :verify-error being set to t

From: Robert Pluim <[email-masked]>
Date: Sat, 14 Dec 2019 13:59:19 +0100

>>>>> On Sat, 14 Dec 2019 13:25:56 +1100, Alexis <[email-masked]> said:

    Alexis> When establishing a connection to an XMPP server, jabber.el ends up
    Alexis> calling `gnutls-negotiate' with :verify-error set to `t'. When
    Alexis> `gnutls-negotiate' calls `gnutls-boot-parameters', the lines:

    Alexis>    (when verify-hostname-error
    Alexis>      (push :hostname verify-error))

    Alexis> in the latter create a dotted list rather than a proper list,
    Alexis> resulting in jabber.el returning the error message:

    Alexis>    connection lost: 'STARTTLS negotiation failed: Wrong type
    Alexis>    argument: listp, (:hostname . t)'

Thatʼs a misleading error message. Itʼs not a proper list, as you say,
but it *is* a list.

How about this? Producing a list (:hostname t) is not what you want,
since that removes the 'check everything' feature of specifying just
't'.

diff --git a/lisp/net/gnutls.el b/lisp/net/gnutls.el
index 9b13adaefe..14368bc298 100644
--- a/lisp/net/gnutls.el
+++ b/lisp/net/gnutls.el
@@ -345,8 +345,11 @@ gnutls-boot-parameters
                             (t nil))))
          (min-prime-bits (or min-prime-bits gnutls-min-prime-bits)))
 
-    (when verify-hostname-error
-      (push :hostname verify-error))
+    ;; Only add :hostname if `verify-error' is not t, since t
+    ;; means "include :hostname" Bug#38602.
+    (and verify-hostname-error
+         (not (eq verify-error t))
+         (push :hostname verify-error))
 
     `(:priority ,priority-string
                 :hostname ,hostname