From e92519b5a6ad5fa1ca36316dd9256e65dcb2c6db Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Wed, 4 Nov 2020 14:36:38 +0100 Subject: [PATCH] SSL: refactor ossl_statem_fatal() and SSLfatal() ossl_statem_fatal() is refactored to be an extended ERR_set_error(), and SSLfatal() is refactored to work like ERR_raise(). We also add SSLfatal_data() to work like ERR_raise_data(). Reviewed-by: Paul Dale (Merged from https://github.com/openssl/openssl/pull/13316) --- ssl/statem/statem.c | 15 ++++++++++----- ssl/statem/statem.h | 14 ++++++-------- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/ssl/statem/statem.c b/ssl/statem/statem.c index ac09e5f2ebe..23f73b7c4b0 100644 --- a/ssl/statem/statem.c +++ b/ssl/statem/statem.c @@ -112,14 +112,19 @@ void ossl_statem_set_renegotiate(SSL *s) } /* - * Put the state machine into an error state and send an alert if appropriate. + * Error reporting building block that's used instead of ERR_set_error(). + * In addition to what ERR_set_error() does, this puts the state machine + * into an error state and sends an alert if appropriate. * This is a permanent error for the current connection. */ -void ossl_statem_fatal(SSL *s, int al, int func, int reason, const char *file, - int line) +void ossl_statem_fatal(SSL *s, int al, int reason, const char *fmt, ...) { - ERR_raise(ERR_LIB_SSL, reason); - ERR_set_debug(file, line, NULL); /* Override what ERR_raise set */ + va_list args; + + va_start(args, fmt); + ERR_vset_error(ERR_LIB_SSL, reason, fmt, args); + va_end(args); + /* We shouldn't call SSLfatal() twice. Once is enough */ if (s->statem.in_init && s->statem.state == MSG_FLOW_ERROR) return; diff --git a/ssl/statem/statem.h b/ssl/statem/statem.h index a9309c967d9..41f50d23b22 100644 --- a/ssl/statem/statem.h +++ b/ssl/statem/statem.h @@ -132,15 +132,13 @@ __owur int ossl_statem_accept(SSL *s); __owur int ossl_statem_connect(SSL *s); void ossl_statem_clear(SSL *s); void ossl_statem_set_renegotiate(SSL *s); -void ossl_statem_fatal(SSL *s, int al, int func, int reason, const char *file, - int line); +void ossl_statem_fatal(SSL *s, int al, int reason, const char *fmt, ...); # define SSL_AD_NO_ALERT -1 -# ifndef OPENSSL_NO_ERR -# define SSLfatal(s, al, f, r) ossl_statem_fatal((s), (al), (0), (r), \ - OPENSSL_FILE, OPENSSL_LINE) -# else -# define SSLfatal(s, al, f, r) ossl_statem_fatal((s), (al), (0), (r), NULL, 0) -# endif +# define SSLfatal(s, al, r) SSLfatal_data((s), (al), (r), NULL) +# define SSLfatal_data \ + (ERR_new(), \ + ERR_set_debug(OPENSSL_FILE, OPENSSL_LINE, OPENSSL_FUNC), \ + ossl_statem_fatal) int ossl_statem_in_error(const SSL *s); void ossl_statem_set_in_init(SSL *s, int init); -- 2.47.2