Add Error state
authorMatt Caswell <matt@openssl.org>
Thu, 23 Apr 2015 19:01:33 +0000 (20:01 +0100)
committerMatt Caswell <matt@openssl.org>
Tue, 5 May 2015 19:07:48 +0000 (20:07 +0100)
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 <rsalz@openssl.org>
(cherry picked from commit a89db885e0d8aac3a9df1bbccb0c1ddfd8b2e10a)

Conflicts:
ssl/s3_srvr.c
ssl/ssl_stat.c

ssl/s3_srvr.c
ssl/ssl.h
ssl/ssl_stat.c

index 92acb0ab06f1db2a4c1264b19335a51c75db5553..306959bcbe3eb675dfca58793cfd8e4053385b48 100644 (file)
@@ -857,6 +857,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;
@@ -1489,8 +1490,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;
+    }
+
     if (ciphers != NULL)
         sk_SSL_CIPHER_free(ciphers);
     return (ret);
index 790589d54104fdec842a55637f86587e7b5f3de3..62472a1e3c0166e1f5e70b8af64beaf8f75b96fe 100644 (file)
--- a/ssl/ssl.h
+++ b/ssl/ssl.h
@@ -1544,6 +1544,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
index d725d783423968b3ee97580f8de6d381fbe17457..1b9069f978d2b937409383e884b895c5e99faa9d 100644 (file)
@@ -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_SSL2
     case SSL2_ST_CLIENT_START_ENCRYPTION:
         str = "SSLv2 client start encryption";
@@ -496,6 +499,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_SSL2
     case SSL2_ST_CLIENT_START_ENCRYPTION:
         str = "2CSENC";