QUIC SSTREAM: Fix bug in ossl_quic_sstream_is_totally_acked
authorHugo Landau <hlandau@openssl.org>
Tue, 31 Oct 2023 16:47:55 +0000 (16:47 +0000)
committerHugo Landau <hlandau@openssl.org>
Thu, 2 Nov 2023 08:49:01 +0000 (08:49 +0000)
ossl_quic_sstream_is_totally_acked would return 0
if no data had been appended to the stream yet.
Fixed and added tests.

Reviewed-by: Tomas Mraz <tomas@openssl.org>
Reviewed-by: Matt Caswell <matt@openssl.org>
Reviewed-by: Paul Dale <pauli@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/22580)

ssl/quic/quic_sstream.c
test/quic_stream_test.c

index a5ae234a8e817881d66a46af43d7a81f44bafca7..1f0b5497fce55c1e90fad4ecfe92385193aeb41f 100644 (file)
@@ -379,8 +379,13 @@ int ossl_quic_sstream_is_totally_acked(QUIC_SSTREAM *qss)
     UINT_RANGE r;
     uint64_t cur_size;
 
-    if ((qss->have_final_size && !qss->acked_final_size)
-        || ossl_list_uint_set_num(&qss->acked_set) != 1)
+    if (qss->have_final_size && !qss->acked_final_size)
+        return 0;
+
+    if (ossl_quic_sstream_get_cur_size(qss) == 0)
+        return 1;
+
+    if (ossl_list_uint_set_num(&qss->acked_set) != 1)
         return 0;
 
     r = ossl_list_uint_set_head(&qss->acked_set)->range;
index c80a4bf0494c4f29619d522d6e407d7de1defa18..e2935be0d53b7f22a3b6a90c960cdbec5dcfe88b 100644 (file)
@@ -48,6 +48,10 @@ static int test_sstream_simple(void)
     if (!TEST_ptr(sstream = ossl_quic_sstream_new(init_size)))
         goto err;
 
+    /* A stream with nothing yet appended is totally acked */
+    if (!TEST_true(ossl_quic_sstream_is_totally_acked(sstream)))
+        goto err;
+
     /* Should not have any data yet */
     num_iov = OSSL_NELEM(iov);
     if (!TEST_false(ossl_quic_sstream_get_stream_frame(sstream, 0, &hdr, iov,
@@ -60,6 +64,10 @@ static int test_sstream_simple(void)
         || !TEST_size_t_eq(wr, sizeof(data_1)))
         goto err;
 
+    /* No longer totally acked */
+    if (!TEST_false(ossl_quic_sstream_is_totally_acked(sstream)))
+        goto err;
+
     /* Read data */
     num_iov = OSSL_NELEM(iov);
     if (!TEST_true(ossl_quic_sstream_get_stream_frame(sstream, 0, &hdr, iov,
@@ -196,6 +204,9 @@ static int test_sstream_simple(void)
     if (!TEST_true(ossl_quic_sstream_mark_acked_fin(sstream)))
         goto err;
 
+    if (!TEST_true(ossl_quic_sstream_is_totally_acked(sstream)))
+        goto err;
+
     testresult = 1;
  err:
     ossl_quic_sstream_free(sstream);