Fix compilation on OpenSSL 1.0.2 and LibreSSL
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Tue, 30 Apr 2024 05:22:24 +0000 (08:22 +0300)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Tue, 30 Apr 2024 05:22:24 +0000 (08:22 +0300)
SSL_AD_NO_APPLICATION_PROTOCOL was introduced in OpenSSL 1.1.0.

While we're at it, add a link to the related OpenSSL github issue to
the comment.

Per buildfarm and Tom Lane.

Discussion: https://www.postgresql.org/message-id/1452995.1714433552@sss.pgh.pa.us

src/interfaces/libpq/fe-secure-openssl.c

index ee1a47f2b18616ed3f3ecb31efa5e32205d0d1c4..4f8ec3221ea7a282022bcb6e57f9ceca1c24067a 100644 (file)
@@ -1741,17 +1741,21 @@ SSLerrmessage(unsigned long ecode)
        return errbuf;
    }
 
+   /*
+    * Server aborted the connection with TLS "no_application_protocol" alert.
+    * The ERR_reason_error_string() function doesn't give any error string
+    * for that for some reason, so do it ourselves.  See
+    * https://github.com/openssl/openssl/issues/24300.  This is available in
+    * OpenSSL 1.1.0 and later, but as of this writing not in LibreSSL.
+    */
+#ifdef SSL_AD_NO_APPLICATION_PROTOCOL
    if (ERR_GET_LIB(ecode) == ERR_LIB_SSL &&
        ERR_GET_REASON(ecode) == SSL_AD_REASON_OFFSET + SSL_AD_NO_APPLICATION_PROTOCOL)
    {
-       /*
-        * Server aborted the connection with TLS "no_application_protocol"
-        * alert.  The ERR_reason_error_string() function doesn't give any
-        * error string for that for some reason, so do it ourselves.
-        */
        snprintf(errbuf, SSL_ERR_LEN, libpq_gettext("no application protocol"));
        return errbuf;
    }
+#endif
 
    /*
     * In OpenSSL 3.0.0 and later, ERR_reason_error_string randomly refuses to