Modernise ERR_print_errors_cb()
authorRichard Levitte <levitte@openssl.org>
Wed, 4 Sep 2019 20:14:21 +0000 (22:14 +0200)
committerRichard Levitte <levitte@openssl.org>
Thu, 12 Sep 2019 15:59:52 +0000 (17:59 +0200)
ERR_print_errors_cb() used functionality that isn't suitable any more,
as that functionality couldn't integrate the error record function
name strings.  We therefore refactor it a bit to use better adapted
methods.

Fixes #9756

Reviewed-by: Matt Caswell <matt@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/9756)

crypto/err/err_prn.c

index b43367f..9ea3eb3 100644 (file)
 #include <openssl/crypto.h>
 #include <openssl/buffer.h>
 #include <openssl/err.h>
+#include "err_locl.h"
 
 void ERR_print_errors_cb(int (*cb) (const char *str, size_t len, void *u),
                          void *u)
 {
     CRYPTO_THREAD_ID tid = CRYPTO_THREAD_get_current_id();
     unsigned long l;
-    char buf[256];
-    char buf2[4096], *hex;
-    const char *file, *data;
+    char buf[4096], *hex;
+    const char *lib, *reason;
+    const char *file, *data, *func;
     int line, flags;
 
-    while ((l = ERR_get_error_line_data(&file, &line, &data, &flags)) != 0) {
-        ERR_error_string_n(l, buf, sizeof(buf));
+    while ((l = ERR_get_error_all(&file, &line, &func, &data, &flags)) != 0) {
+        lib = ERR_lib_error_string(l);
+        reason = ERR_reason_error_string(l);
+        if (func == NULL)
+            func = "unknown function";
+        if ((flags & ERR_TXT_STRING) == 0)
+            data = "";
         hex = OPENSSL_buf2hexstr((const unsigned char *)&tid, sizeof(tid));
-        BIO_snprintf(buf2, sizeof(buf2), "%s:%s:%s:%d:%s\n", hex, buf, file,
-                     line, (flags & ERR_TXT_STRING) ? data : "");
+        BIO_snprintf(buf, sizeof(buf), "%s:error:%s:%s:%s:%s:%d:%s\n",
+                     hex, lib, func, reason, file, line, data);
         OPENSSL_free(hex);
-        if (cb(buf2, strlen(buf2), u) <= 0)
+        if (cb(buf, strlen(buf), u) <= 0)
             break;              /* abort outputting the error report */
     }
 }