Ensure we are in accept state in DTLSv1_listen
authorMatt Caswell <matt@openssl.org>
Wed, 23 Nov 2016 23:03:13 +0000 (23:03 +0000)
committerMatt Caswell <matt@openssl.org>
Tue, 29 Nov 2016 10:04:37 +0000 (10:04 +0000)
Calling SSL_set_accept_state() after DTLSv1_listen() clears the state, so
SSL_accept() no longer works. In 1.0.2 calling DTLSv1_listen() would set
the accept state automatically. We should still do that.

Fixes #1989

Reviewed-by: Andy Polyakov <appro@openssl.org>
(cherry picked from commit 5bdcd362d24cbbcf18c5eb9df655fe9f7bcf5850)

ssl/d1_lib.c

index 0ada7edf7709fee3e5851c0f2db286bac74239f5..55a81c34ba678d3332aadc10c3c752077e258b53 100644 (file)
@@ -441,6 +441,11 @@ int DTLSv1_listen(SSL *s, BIO_ADDR *client)
     BIO_ADDR *tmpclient = NULL;
     PACKET pkt, msgpkt, msgpayload, session, cookiepkt;
 
+    if (s->handshake_func == NULL) {
+        /* Not properly initialized yet */
+        SSL_set_accept_state(s);
+    }
+
     /* Ensure there is no state left over from a previous invocation */
     if (!SSL_clear(s))
         return -1;