Only auto-retry for DTLS if configured to do so
authorMatt Caswell <matt@openssl.org>
Thu, 3 May 2018 15:00:05 +0000 (16:00 +0100)
committerMatt Caswell <matt@openssl.org>
Tue, 8 May 2018 08:40:17 +0000 (09:40 +0100)
Otherwise we may end up in a hang when using blocking sockets

Reviewed-by: Rich Salz <rsalz@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/6170)

ssl/record/rec_layer_d1.c

index 97943d43bb910de5952c71f74b1c154a40df6004..f1e35f407c5e3aed8878bb14572d2f9da406e036 100644 (file)
@@ -664,6 +664,18 @@ int dtls1_read_bytes(SSL *s, int type, int *recvd_type, unsigned char *buf,
                     return -1;
             }
             SSL3_RECORD_set_length(rr, 0);
+            if (!(s->mode & SSL_MODE_AUTO_RETRY)) {
+                if (SSL3_BUFFER_get_left(&s->rlayer.rbuf) == 0) {
+                    /* no read-ahead left? */
+                    BIO *bio;
+
+                    s->rwstate = SSL_READING;
+                    bio = SSL_get_rbio(s);
+                    BIO_clear_retry_flags(bio);
+                    BIO_set_retry_read(bio);
+                    return -1;
+                }
+            }
             goto start;
         }