Avoid using ERR_put_error() directly in OpenSSL code
authorRichard Levitte <levitte@openssl.org>
Wed, 24 Jul 2019 14:55:32 +0000 (16:55 +0200)
committerRichard Levitte <levitte@openssl.org>
Wed, 31 Jul 2019 04:45:21 +0000 (06:45 +0200)
If compiled with 'no-deprecated', ERR_put_error() is undefined.  We
had one spot where we were using it directly, because the file and
line information was passed from elsewhere.

Fortunately, it's possible to use ERR_raise() for that situation, and
call ERR_set_debug() immediately after and thereby override the
information that ERR_raise() stored in the error record.

util/mkerr.pl needed a small adjustment to not generate code that
won't compile in a 'no-deprecated' configuration.

Reviewed-by: Paul Dale <paul.dale@oracle.com>
(Merged from https://github.com/openssl/openssl/pull/9452)

engines/e_afalg_err.c
engines/e_capi_err.c
engines/e_dasync_err.c
engines/e_ossltest_err.c
ssl/statem/statem.c
util/mkerr.pl

index c436f10a419a5bc21658067f95b59d66726b1e33..4db6d660c99af2f1e918e899bccf66cb51272118 100644 (file)
@@ -66,5 +66,6 @@ static void ERR_AFALG_error(int function, int reason, char *file, int line)
 {
     if (lib_code == 0)
         lib_code = ERR_get_next_error_library();
-    ERR_PUT_error(lib_code, function, reason, file, line);
+    ERR_raise(lib_code, reason);
+    ERR_set_debug(file, line, NULL);
 }
index acbec41d08b11d01845f043049c7bb4c4685d84d..e2b1f7561f3c181d7ef5bb3bf6361c5e88f17264 100644 (file)
@@ -89,5 +89,6 @@ static void ERR_CAPI_error(int function, int reason, char *file, int line)
 {
     if (lib_code == 0)
         lib_code = ERR_get_next_error_library();
-    ERR_PUT_error(lib_code, function, reason, file, line);
+    ERR_raise(lib_code, reason);
+    ERR_set_debug(file, line, NULL);
 }
index 0920690af697b995776352a3183263b62454ffb6..a2e6c0dc864401167df441ac0487f737946b9a65 100644 (file)
@@ -51,5 +51,6 @@ static void ERR_DASYNC_error(int function, int reason, char *file, int line)
 {
     if (lib_code == 0)
         lib_code = ERR_get_next_error_library();
-    ERR_PUT_error(lib_code, function, reason, file, line);
+    ERR_raise(lib_code, reason);
+    ERR_set_debug(file, line, NULL);
 }
index b81e00b43c669b85df74dfe6f53efcf909ec70da..d9ee80cb839971b4acb2ead770e399abf4a4ee88 100644 (file)
@@ -51,5 +51,6 @@ static void ERR_OSSLTEST_error(int function, int reason, char *file, int line)
 {
     if (lib_code == 0)
         lib_code = ERR_get_next_error_library();
-    ERR_PUT_error(lib_code, function, reason, file, line);
+    ERR_raise(lib_code, reason);
+    ERR_set_debug(file, line, NULL);
 }
index a35573c935ed9533306388e548872f7304fcd0c3..bd9277b71ec3281bc924c852fe439bca9e9d7b78 100644 (file)
@@ -118,7 +118,8 @@ void ossl_statem_set_renegotiate(SSL *s)
 void ossl_statem_fatal(SSL *s, int al, int func, int reason, const char *file,
                        int line)
 {
-    ERR_put_error(ERR_LIB_SSL, func, reason, file, line);
+    ERR_raise(ERR_LIB_SSL, reason);
+    ERR_set_debug(file, line, NULL); /* Override what ERR_raise set */
     /* We shouldn't call SSLfatal() twice. Once is enough */
     if (s->statem.in_init && s->statem.state == MSG_FLOW_ERROR)
       return;
index 956b66179ae3c470e056071a7f5f05eba487c329..51e034703d4d8b25ca4da97ff1992c899bba3c73 100755 (executable)
@@ -650,7 +650,8 @@ ${st}void ERR_${lib}_error(int function, int reason, char *file, int line)
 {
     if (lib_code == 0)
         lib_code = ERR_get_next_error_library();
-    ERR_PUT_error(lib_code, function, reason, file, line);
+    ERR_raise(lib_code, reason);
+    ERR_set_debug(file, line, NULL);
 }
 EOF