Submitted by: Robin Seggelmann <seggelmann@fh-muenster.de>

Fix possible DTLS timer deadlock.
This commit is contained in:
Dr. Stephen Henson 2012-03-06 13:22:57 +00:00
parent ad83334e73
commit 9c2bed0b65
2 changed files with 4 additions and 5 deletions

View File

@ -260,7 +260,6 @@ int dtls1_connect(SSL *s)
if (ret <= 0) goto end; if (ret <= 0) goto end;
else else
{ {
dtls1_stop_timer(s);
if (s->hit) if (s->hit)
s->state=SSL3_ST_CR_FINISHED_A; s->state=SSL3_ST_CR_FINISHED_A;
else else
@ -354,6 +353,7 @@ int dtls1_connect(SSL *s)
case SSL3_ST_CR_SRVR_DONE_B: case SSL3_ST_CR_SRVR_DONE_B:
ret=ssl3_get_server_done(s); ret=ssl3_get_server_done(s);
if (ret <= 0) goto end; if (ret <= 0) goto end;
dtls1_stop_timer(s);
if (s->s3->tmp.cert_req) if (s->s3->tmp.cert_req)
s->state=SSL3_ST_CW_CERT_A; s->state=SSL3_ST_CW_CERT_A;
else else

View File

@ -485,15 +485,16 @@ int dtls1_accept(SSL *s)
ret = ssl3_check_client_hello(s); ret = ssl3_check_client_hello(s);
if (ret <= 0) if (ret <= 0)
goto end; goto end;
dtls1_stop_timer(s);
if (ret == 2) if (ret == 2)
{
dtls1_stop_timer(s);
s->state = SSL3_ST_SR_CLNT_HELLO_C; s->state = SSL3_ST_SR_CLNT_HELLO_C;
}
else { else {
/* could be sent for a DH cert, even if we /* could be sent for a DH cert, even if we
* have not asked for it :-) */ * have not asked for it :-) */
ret=ssl3_get_client_certificate(s); ret=ssl3_get_client_certificate(s);
if (ret <= 0) goto end; if (ret <= 0) goto end;
dtls1_stop_timer(s);
s->init_num=0; s->init_num=0;
s->state=SSL3_ST_SR_KEY_EXCH_A; s->state=SSL3_ST_SR_KEY_EXCH_A;
} }
@ -503,7 +504,6 @@ int dtls1_accept(SSL *s)
case SSL3_ST_SR_KEY_EXCH_B: case SSL3_ST_SR_KEY_EXCH_B:
ret=ssl3_get_client_key_exchange(s); ret=ssl3_get_client_key_exchange(s);
if (ret <= 0) goto end; if (ret <= 0) goto end;
dtls1_stop_timer(s);
s->state=SSL3_ST_SR_CERT_VRFY_A; s->state=SSL3_ST_SR_CERT_VRFY_A;
s->init_num=0; s->init_num=0;
@ -540,7 +540,6 @@ int dtls1_accept(SSL *s)
/* we should decide if we expected this one */ /* we should decide if we expected this one */
ret=ssl3_get_cert_verify(s); ret=ssl3_get_cert_verify(s);
if (ret <= 0) goto end; if (ret <= 0) goto end;
dtls1_stop_timer(s);
s->state=SSL3_ST_SR_FINISHED_A; s->state=SSL3_ST_SR_FINISHED_A;
s->init_num=0; s->init_num=0;