From: Hugo Landau Date: Tue, 31 Oct 2023 16:47:55 +0000 (+0000) Subject: QUIC SSTREAM: Fix bug in ossl_quic_sstream_is_totally_acked X-Git-Tag: openssl-3.3.0-alpha1~689 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=115ee28263c28c78a34ce4e40a9e4be8361deee6;p=thirdparty%2Fopenssl.git 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) --- diff --git a/ssl/quic/quic_sstream.c b/ssl/quic/quic_sstream.c index a5ae234a8e8..1f0b5497fce 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 c80a4bf0494..e2935be0d53 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);