Clarify dtls1_do_write's interaction with the buffering BIO.
The existing comments are not very helpful. This code is also quite buggy.
Document two of them as TODOs.
Change-Id: Idfaf93d9c3b8b1ee92f2fb0d292ef513b5f6d824
Reviewed-on: https://boringssl-review.googlesource.com/2830
Reviewed-by: Adam Langley <agl@google.com>
diff --git a/ssl/d1_both.c b/ssl/d1_both.c
index 2604466..5edc93f 100644
--- a/ssl/d1_both.c
+++ b/ssl/d1_both.c
@@ -278,15 +278,27 @@
frag_off = 0;
while (s->init_num) {
+ /* Account for data in the buffering BIO; multiple records may be packed
+ * into a single packet during the handshake.
+ *
+ * TODO(davidben): This is buggy; if the MTU is larger than the buffer size,
+ * the large record will be split across two packets. Moreover, in that
+ * case, the |dtls1_write_bytes| call may not return synchronously. This
+ * will break on retry as the |s->init_off| and |s->init_num| adjustment
+ * will run a second time. */
curr_mtu = s->d1->mtu - BIO_wpending(SSL_get_wbio(s)) -
DTLS1_RT_HEADER_LENGTH - max_overhead;
if (curr_mtu <= DTLS1_HM_HEADER_LENGTH) {
- /* grr.. we could get an error if MTU picked was wrong */
+ /* Flush the buffer and continue with a fresh packet.
+ *
+ * TODO(davidben): If |BIO_flush| is not synchronous and requires multiple
+ * calls to |dtls1_do_write|, |frag_off| will be wrong. */
ret = BIO_flush(SSL_get_wbio(s));
if (ret <= 0) {
return ret;
}
+ assert(BIO_wpending(SSL_get_wbio(s)) == 0);
curr_mtu = s->d1->mtu - DTLS1_RT_HEADER_LENGTH - max_overhead;
}