Ensure |rwstate| is set correctly on BIO_flush
authorMatt Caswell <matt@openssl.org>
Wed, 4 Nov 2015 11:20:50 +0000 (11:20 +0000)
committerMatt Caswell <matt@openssl.org>
Thu, 10 Dec 2015 12:50:56 +0000 (12:50 +0000)
A BIO_flush call in the DTLS code was not correctly setting the |rwstate|
variable to SSL_WRITING. This means that SSL_get_error() will not return
SSL_ERROR_WANT_WRITE in the event of an IO retry.

Reviewed-by: Richard Levitte <levitte@openssl.org>
(cherry picked from commit 67f60be8c9ae5ff3129fcd6238baf124385a41d8)

ssl/d1_both.c

index 09e922a..aaa1867 100644 (file)
@@ -291,6 +291,8 @@ int dtls1_do_write(SSL *s, int type)
         blocksize = 0;
 
     frag_off = 0;
+    s->rwstate = SSL_NOTHING;
+
     /* s->init_num shouldn't ever be < 0...but just in case */
     while (s->init_num > 0) {
         if (type == SSL3_RT_HANDSHAKE && s->init_off != 0) {
@@ -339,8 +341,10 @@ int dtls1_do_write(SSL *s, int type)
              * grr.. we could get an error if MTU picked was wrong
              */
             ret = BIO_flush(SSL_get_wbio(s));
-            if (ret <= 0)
+            if (ret <= 0) {
+                s->rwstate = SSL_WRITING;
                 return ret;
+            }
             used_len = DTLS1_RT_HEADER_LENGTH + mac_size + blocksize;
             if (s->d1->mtu > used_len + DTLS1_HM_HEADER_LENGTH) {
                 curr_mtu = s->d1->mtu - used_len;