Add more error state transitions (DTLS)

Ensure all fatal errors transition into the new error state for DTLS.

Reviewed-by: Rich Salz <rsalz@openssl.org>
(cherry picked from commit cefc93910c4c0f7fa9f8c1f8f7aad084a7fa87d2)

Conflicts:
	ssl/d1_srvr.c

Conflicts:
	ssl/d1_srvr.c
This commit is contained in:
Matt Caswell 2015-04-30 11:50:08 +01:00
parent a329ae2268
commit 76d0c6d48e
2 changed files with 18 additions and 0 deletions

View File

@ -212,6 +212,7 @@ int dtls1_connect(SSL *s)
(s->version & 0xff00) != (DTLS1_BAD_VER & 0xff00)) { (s->version & 0xff00) != (DTLS1_BAD_VER & 0xff00)) {
SSLerr(SSL_F_DTLS1_CONNECT, ERR_R_INTERNAL_ERROR); SSLerr(SSL_F_DTLS1_CONNECT, ERR_R_INTERNAL_ERROR);
ret = -1; ret = -1;
s->state = SSL_ST_ERR;
goto end; goto end;
} }
@ -221,10 +222,12 @@ int dtls1_connect(SSL *s)
if (s->init_buf == NULL) { if (s->init_buf == NULL) {
if ((buf = BUF_MEM_new()) == NULL) { if ((buf = BUF_MEM_new()) == NULL) {
ret = -1; ret = -1;
s->state = SSL_ST_ERR;
goto end; goto end;
} }
if (!BUF_MEM_grow(buf, SSL3_RT_MAX_PLAIN_LENGTH)) { if (!BUF_MEM_grow(buf, SSL3_RT_MAX_PLAIN_LENGTH)) {
ret = -1; ret = -1;
s->state = SSL_ST_ERR;
goto end; goto end;
} }
s->init_buf = buf; s->init_buf = buf;
@ -233,12 +236,14 @@ int dtls1_connect(SSL *s)
if (!ssl3_setup_buffers(s)) { if (!ssl3_setup_buffers(s)) {
ret = -1; ret = -1;
s->state = SSL_ST_ERR;
goto end; goto end;
} }
/* setup buffing BIO */ /* setup buffing BIO */
if (!ssl_init_wbio_buffer(s, 0)) { if (!ssl_init_wbio_buffer(s, 0)) {
ret = -1; ret = -1;
s->state = SSL_ST_ERR;
goto end; goto end;
} }
@ -417,6 +422,7 @@ int dtls1_connect(SSL *s)
*/ */
if (!ssl3_check_cert_and_algorithm(s)) { if (!ssl3_check_cert_and_algorithm(s)) {
ret = -1; ret = -1;
s->state = SSL_ST_ERR;
goto end; goto end;
} }
break; break;
@ -548,6 +554,7 @@ int dtls1_connect(SSL *s)
#endif #endif
if (!s->method->ssl3_enc->setup_key_block(s)) { if (!s->method->ssl3_enc->setup_key_block(s)) {
ret = -1; ret = -1;
s->state = SSL_ST_ERR;
goto end; goto end;
} }
@ -555,6 +562,7 @@ int dtls1_connect(SSL *s)
SSL3_CHANGE_CIPHER_CLIENT_WRITE)) SSL3_CHANGE_CIPHER_CLIENT_WRITE))
{ {
ret = -1; ret = -1;
s->state = SSL_ST_ERR;
goto end; goto end;
} }
#ifndef OPENSSL_NO_SCTP #ifndef OPENSSL_NO_SCTP
@ -735,6 +743,7 @@ int dtls1_connect(SSL *s)
goto end; goto end;
/* break; */ /* break; */
case SSL_ST_ERR:
default: default:
SSLerr(SSL_F_DTLS1_CONNECT, SSL_R_UNKNOWN_STATE); SSLerr(SSL_F_DTLS1_CONNECT, SSL_R_UNKNOWN_STATE);
ret = -1; ret = -1;
@ -945,6 +954,7 @@ static int dtls1_get_hello_verify(SSL *s)
f_err: f_err:
ssl3_send_alert(s, SSL3_AL_FATAL, al); ssl3_send_alert(s, SSL3_AL_FATAL, al);
s->state = SSL_ST_ERR;
return -1; return -1;
} }

View File

@ -224,11 +224,13 @@ int dtls1_accept(SSL *s)
if (s->init_buf == NULL) { if (s->init_buf == NULL) {
if ((buf = BUF_MEM_new()) == NULL) { if ((buf = BUF_MEM_new()) == NULL) {
ret = -1; ret = -1;
s->state = SSL_ST_ERR;
goto end; goto end;
} }
if (!BUF_MEM_grow(buf, SSL3_RT_MAX_PLAIN_LENGTH)) { if (!BUF_MEM_grow(buf, SSL3_RT_MAX_PLAIN_LENGTH)) {
BUF_MEM_free(buf); BUF_MEM_free(buf);
ret = -1; ret = -1;
s->state = SSL_ST_ERR;
goto end; goto end;
} }
s->init_buf = buf; s->init_buf = buf;
@ -236,6 +238,7 @@ int dtls1_accept(SSL *s)
if (!ssl3_setup_buffers(s)) { if (!ssl3_setup_buffers(s)) {
ret = -1; ret = -1;
s->state = SSL_ST_ERR;
goto end; goto end;
} }
@ -257,6 +260,7 @@ int dtls1_accept(SSL *s)
#endif #endif
if (!ssl_init_wbio_buffer(s, 1)) { if (!ssl_init_wbio_buffer(s, 1)) {
ret = -1; ret = -1;
s->state = SSL_ST_ERR;
goto end; goto end;
} }
@ -744,6 +748,7 @@ int dtls1_accept(SSL *s)
s->session->cipher = s->s3->tmp.new_cipher; s->session->cipher = s->s3->tmp.new_cipher;
if (!s->method->ssl3_enc->setup_key_block(s)) { if (!s->method->ssl3_enc->setup_key_block(s)) {
ret = -1; ret = -1;
s->state = SSL_ST_ERR;
goto end; goto end;
} }
@ -772,6 +777,7 @@ int dtls1_accept(SSL *s)
SSL3_CHANGE_CIPHER_SERVER_WRITE)) SSL3_CHANGE_CIPHER_SERVER_WRITE))
{ {
ret = -1; ret = -1;
s->state = SSL_ST_ERR;
goto end; goto end;
} }
@ -852,6 +858,7 @@ int dtls1_accept(SSL *s)
goto end; goto end;
/* break; */ /* break; */
case SSL_ST_ERR:
default: default:
SSLerr(SSL_F_DTLS1_ACCEPT, SSL_R_UNKNOWN_STATE); SSLerr(SSL_F_DTLS1_ACCEPT, SSL_R_UNKNOWN_STATE);
ret = -1; ret = -1;
@ -932,6 +939,7 @@ int dtls1_send_hello_verify_request(SSL *s)
&(s->d1->cookie_len)) == 0) { &(s->d1->cookie_len)) == 0) {
SSLerr(SSL_F_DTLS1_SEND_HELLO_VERIFY_REQUEST, SSLerr(SSL_F_DTLS1_SEND_HELLO_VERIFY_REQUEST,
ERR_R_INTERNAL_ERROR); ERR_R_INTERNAL_ERROR);
s->state = SSL_ST_ERR;
return 0; return 0;
} }