PR: 2748
authorDr. Stephen Henson <steve@openssl.org>
Tue, 6 Mar 2012 13:26:15 +0000 (13:26 +0000)
committerDr. Stephen Henson <steve@openssl.org>
Tue, 6 Mar 2012 13:26:15 +0000 (13:26 +0000)
Submitted by: Robin Seggelmann <seggelmann@fh-muenster.de>

Fix possible DTLS timer deadlock.

ssl/d1_clnt.c
ssl/d1_srvr.c

index 299ffb39b645524010364143ce8f95495fbf0357..00cb43f09ee0239c8f2e81a0aa1952a2b0b1e7a2 100644 (file)
@@ -330,7 +330,6 @@ int dtls1_connect(SSL *s)
                        if (ret <= 0) goto end;
                        else
                                {
-                               dtls1_stop_timer(s);
                                if (s->hit)
                                        {
 #ifndef OPENSSL_NO_SCTP
@@ -441,6 +440,7 @@ int dtls1_connect(SSL *s)
                case SSL3_ST_CR_SRVR_DONE_B:
                        ret=ssl3_get_server_done(s);
                        if (ret <= 0) goto end;
+                       dtls1_stop_timer(s);
                        if (s->s3->tmp.cert_req)
                                s->s3->tmp.next_state=SSL3_ST_CW_CERT_A;
                        else
index 89f47ce97fb095822a1873a26b1e15ca399992ea..e0d9388c38b7cfe63c7290b242d51b59d4542ed2 100644 (file)
@@ -591,15 +591,16 @@ int dtls1_accept(SSL *s)
                        ret = ssl3_check_client_hello(s);
                        if (ret <= 0)
                                goto end;
-                       dtls1_stop_timer(s);
                        if (ret == 2)
+                               {
+                               dtls1_stop_timer(s);
                                s->state = SSL3_ST_SR_CLNT_HELLO_C;
+                               }
                        else {
                                /* could be sent for a DH cert, even if we
                                 * have not asked for it :-) */
                                ret=ssl3_get_client_certificate(s);
                                if (ret <= 0) goto end;
-                               dtls1_stop_timer(s);
                                s->init_num=0;
                                s->state=SSL3_ST_SR_KEY_EXCH_A;
                        }
@@ -609,7 +610,6 @@ int dtls1_accept(SSL *s)
                case SSL3_ST_SR_KEY_EXCH_B:
                        ret=ssl3_get_client_key_exchange(s);
                        if (ret <= 0) goto end;
-                       dtls1_stop_timer(s);
 #ifndef OPENSSL_NO_SCTP
                        /* Add new shared key for SCTP-Auth,
                         * will be ignored if no SCTP used.
@@ -661,7 +661,6 @@ int dtls1_accept(SSL *s)
                        /* we should decide if we expected this one */
                        ret=ssl3_get_cert_verify(s);
                        if (ret <= 0) goto end;
-                       dtls1_stop_timer(s);
 #ifndef OPENSSL_NO_SCTP
                        if (BIO_dgram_is_sctp(SSL_get_wbio(s)) &&
                            state == SSL_ST_RENEGOTIATE)