krb5 commit: Fix PKINIT display of system errors from OpenSSL
ghudson at mit.edu
ghudson at mit.edu
Thu Jul 9 22:03:32 EDT 2026
https://github.com/krb5/krb5/commit/2cd34d81af21347c11a18556c58eabf3d010615f
commit 2cd34d81af21347c11a18556c58eabf3d010615f
Author: Greg Hudson <ghudson at mit.edu>
Date: Tue Jul 7 02:13:47 2026 -0400
Fix PKINIT display of system errors from OpenSSL
In oerr(), if ERR_reason_error_string() returns null for an OpenSSL
error code, fall back to strerror_r() if it is a system code. If we
do not successfully produce a reason string, do not pass a null string
to krb5_set_error_message().
src/plugins/preauth/pkinit/pkinit_crypto_openssl.c | 19 ++++++++++++++-----
1 file changed, 14 insertions(+), 5 deletions(-)
diff --git a/src/plugins/preauth/pkinit/pkinit_crypto_openssl.c b/src/plugins/preauth/pkinit/pkinit_crypto_openssl.c
index 11c570f0e..0a6fd7c1e 100644
--- a/src/plugins/preauth/pkinit/pkinit_crypto_openssl.c
+++ b/src/plugins/preauth/pkinit/pkinit_crypto_openssl.c
@@ -758,6 +758,7 @@ oerr(krb5_context context, krb5_error_code code, const char *fmt, ...)
unsigned long err;
va_list ap;
char *str, buf[128];
+ const char *reason;
int r;
if (!code)
@@ -770,12 +771,20 @@ oerr(krb5_context context, krb5_error_code code, const char *fmt, ...)
return code;
err = ERR_peek_error();
- if (err) {
- krb5_set_error_message(context, code, _("%s: %s"), str,
- ERR_reason_error_string(err));
- } else {
- krb5_set_error_message(context, code, "%s", str);
+ reason = err ? ERR_reason_error_string(err) : NULL;
+
+#if OPENSSL_VERSION_NUMBER >= 0x30000000L
+ /* Fall back to strerror_r() for system errors. */
+ if (reason == NULL && ERR_SYSTEM_ERROR(err)) {
+ if (strerror_r(ERR_GET_REASON(err), buf, sizeof(buf)) == 0)
+ reason = buf;
}
+#endif
+
+ if (reason != NULL)
+ krb5_set_error_message(context, code, _("%s: %s"), str, reason);
+ else
+ krb5_set_error_message(context, code, "%s", str);
TRACE_PKINIT_OPENSSL_ERROR(context, str);
while ((err = ERR_get_error()) != 0) {
More information about the cvs-krb5
mailing list