]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
libpq: Use strerror_r instead of strerror
authorPeter Eisentraut <peter@eisentraut.org>
Sun, 28 Jul 2024 07:12:00 +0000 (09:12 +0200)
committerPeter Eisentraut <peter@eisentraut.org>
Sun, 28 Jul 2024 07:26:21 +0000 (09:26 +0200)
Commit 453c4687377 introduced a use of strerror() into libpq, but that
is not thread-safe.  Fix by using strerror_r() instead.

In passing, update some of the code comments added by 453c4687377, as
we have learned more about the reason for the change in OpenSSL that
started this.

Reviewed-by: Daniel Gustafsson <daniel@yesql.se>
Discussion: Discussion: https://postgr.es/m/b6fb018b-f05c-4afd-abd3-318c649faf18@highgo.ca

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

index 70fa303ae5b64756043a9d41e609fd022337e8e6..02f6b870f9486312ec9aa510fcc83b60002172d0 100644 (file)
@@ -1254,10 +1254,11 @@ SSLerrmessage(unsigned long ecode)
                return errreason;
 
        /*
-        * In OpenSSL 3.0.0 and later, ERR_reason_error_string randomly refuses to
-        * map system errno values.  We can cover that shortcoming with this bit
-        * of code.  Older OpenSSL versions don't have the ERR_SYSTEM_ERROR macro,
-        * but that's okay because they don't have the shortcoming either.
+        * In OpenSSL 3.0.0 and later, ERR_reason_error_string does not map system
+        * errno values anymore.  (See OpenSSL source code for the explanation.)
+        * We can cover that shortcoming with this bit of code.  Older OpenSSL
+        * versions don't have the ERR_SYSTEM_ERROR macro, but that's okay because
+        * they don't have the shortcoming either.
         */
 #ifdef ERR_SYSTEM_ERROR
        if (ERR_SYSTEM_ERROR(ecode))
index e96dcec9d5a209e30a3a4474ddd2cd7233d24d5b..5f340494b7f46c6373b7d041d7db49b4e8bb1961 100644 (file)
@@ -1557,15 +1557,16 @@ SSLerrmessage(unsigned long ecode)
        }
 
        /*
-        * In OpenSSL 3.0.0 and later, ERR_reason_error_string randomly refuses to
-        * map system errno values.  We can cover that shortcoming with this bit
-        * of code.  Older OpenSSL versions don't have the ERR_SYSTEM_ERROR macro,
-        * but that's okay because they don't have the shortcoming either.
+        * In OpenSSL 3.0.0 and later, ERR_reason_error_string does not map system
+        * errno values anymore.  (See OpenSSL source code for the explanation.)
+        * We can cover that shortcoming with this bit of code.  Older OpenSSL
+        * versions don't have the ERR_SYSTEM_ERROR macro, but that's okay because
+        * they don't have the shortcoming either.
         */
 #ifdef ERR_SYSTEM_ERROR
        if (ERR_SYSTEM_ERROR(ecode))
        {
-               strlcpy(errbuf, strerror(ERR_GET_REASON(ecode)), SSL_ERR_LEN);
+               strerror_r(ERR_GET_REASON(ecode), errbuf, SSL_ERR_LEN);
                return errbuf;
        }
 #endif