From: Matt Caswell Date: Thu, 23 Apr 2015 19:01:33 +0000 (+0100) Subject: Add Error state X-Git-Tag: OpenSSL_1_1_0-pre1~1192 X-Git-Url: https://git.openssl.org/?p=openssl.git;a=commitdiff_plain;h=a89db885e0d8aac3a9df1bbccb0c1ddfd8b2e10a Add Error state Reusing an SSL object when it has encountered a fatal error can have bad consequences. This is a bug in application code not libssl but libssl should be more forgiving and not crash. Reviewed-by: Rich Salz --- diff --git a/include/openssl/ssl.h b/include/openssl/ssl.h index ecd6c696e9..d99e9f2991 100644 --- a/include/openssl/ssl.h +++ b/include/openssl/ssl.h @@ -975,6 +975,7 @@ extern "C" { # define SSL_ST_BEFORE 0x4000 # define SSL_ST_OK 0x03 # define SSL_ST_RENEGOTIATE (0x04|SSL_ST_INIT) +# define SSL_ST_ERR 0x05 # define SSL_CB_LOOP 0x01 # define SSL_CB_EXIT 0x02 diff --git a/ssl/s3_srvr.c b/ssl/s3_srvr.c index 7a399673b1..266952831c 100644 --- a/ssl/s3_srvr.c +++ b/ssl/s3_srvr.c @@ -847,6 +847,7 @@ int ssl3_accept(SSL *s) goto end; /* break; */ + case SSL_ST_ERR: default: SSLerr(SSL_F_SSL3_ACCEPT, SSL_R_UNKNOWN_STATE); ret = -1; @@ -1444,8 +1445,10 @@ int ssl3_get_client_hello(SSL *s) if (0) { f_err: ssl3_send_alert(s, SSL3_AL_FATAL, al); - } err: + s->state = SSL_ST_ERR; + } + sk_SSL_CIPHER_free(ciphers); return ret < 0 ? -1 : ret; } diff --git a/ssl/ssl_stat.c b/ssl/ssl_stat.c index 258c4eb2b4..76b550cda3 100644 --- a/ssl/ssl_stat.c +++ b/ssl/ssl_stat.c @@ -117,6 +117,9 @@ const char *SSL_state_string_long(const SSL *s) case SSL_ST_OK | SSL_ST_ACCEPT: str = "ok/accept SSL initialization"; break; + case SSL_ST_ERR: + str = "error"; + break; #ifndef OPENSSL_NO_SSL3 /* SSLv3 additions */ @@ -360,6 +363,9 @@ const char *SSL_state_string(const SSL *s) case SSL_ST_OK: str = "SSLOK "; break; + case SSL_ST_ERR: + str = "SSLERR"; + break; #ifndef OPENSSL_NO_SSL3 /* SSLv3 additions */