From 115ee28263c28c78a34ce4e40a9e4be8361deee6 Mon Sep 17 00:00:00 2001 From: Hugo Landau Date: Tue, 31 Oct 2023 16:47:55 +0000 Subject: [PATCH] QUIC SSTREAM: Fix bug in ossl_quic_sstream_is_totally_acked 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 Reviewed-by: Matt Caswell Reviewed-by: Paul Dale (Merged from https://github.com/openssl/openssl/pull/22580) --- ssl/quic/quic_sstream.c | 9 +++++++-- test/quic_stream_test.c | 11 +++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/ssl/quic/quic_sstream.c b/ssl/quic/quic_sstream.c index a5ae234a8e..1f0b5497fc 100644 --- a/ssl/quic/quic_sstream.c +++ b/ssl/quic/quic_sstream.c @@ -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; diff --git a/test/quic_stream_test.c b/test/quic_stream_test.c index c80a4bf049..e2935be0d5 100644 --- a/test/quic_stream_test.c +++ b/test/quic_stream_test.c @@ -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);