libpq: Use strerror_r instead of strerror

Commit 453c468737 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 453c468737, 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
This commit is contained in:
Peter Eisentraut 2024-07-28 09:12:00 +02:00
parent ce3045e9b0
commit 6ddc8556ce
2 changed files with 11 additions and 9 deletions

View File

@ -1270,10 +1270,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))

View File

@ -1689,15 +1689,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