]> git.ipfire.org Git - thirdparty/openssl.git/commitdiff
Correct the fixed size handling for dgram_pair and dgram_mem
authorTomas Mraz <tomas@openssl.org>
Mon, 28 Aug 2023 09:31:15 +0000 (11:31 +0200)
committerHugo Landau <hlandau@openssl.org>
Wed, 30 Aug 2023 10:43:34 +0000 (11:43 +0100)
Reviewed-by: Hugo Landau <hlandau@openssl.org>
Reviewed-by: Matt Caswell <matt@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/21866)

crypto/bio/bss_dgram_pair.c
test/bio_dgram_test.c

index 3685d51f55d9947d8e1a900a7210fa902bfca229..393af7dab444a45ef99fc39a34b19c3db9c9a2ed 100644 (file)
@@ -265,7 +265,7 @@ struct bio_dgram_pair_st {
     unsigned int no_trunc          : 1; /* Reads fail if they would truncate */
     unsigned int local_addr_enable : 1; /* Can use BIO_MSG->local? */
     unsigned int role              : 1; /* Determines lock order */
-    unsigned int fixed_size        : 1; /* Affects BIO_s_dgram_mem only */
+    unsigned int grows_on_write    : 1; /* Set for BIO_s_dgram_mem only */
 };
 
 #define MIN_BUF_LEN (1024)
@@ -306,6 +306,8 @@ static int dgram_mem_init(BIO *bio)
         return 0;
     }
 
+    b->grows_on_write = 1;
+
     bio->init = 1;
     return 1;
 }
@@ -469,7 +471,7 @@ static int dgram_pair_ctrl_set_write_buf_size(BIO *bio, size_t len)
     }
 
     b->req_buf_len = len;
-    b->fixed_size = 1;
+    b->grows_on_write = 0;
     return 1;
 }
 
@@ -1145,7 +1147,8 @@ static ossl_inline size_t compute_rbuf_growth(size_t target, size_t current)
 }
 
 /* Must hold local write lock */
-static size_t dgram_pair_write_inner(struct bio_dgram_pair_st *b, const uint8_t *buf, size_t sz)
+static size_t dgram_pair_write_inner(struct bio_dgram_pair_st *b,
+                                     const uint8_t *buf, size_t sz)
 {
     size_t total_written = 0;
 
@@ -1166,7 +1169,7 @@ static size_t dgram_pair_write_inner(struct bio_dgram_pair_st *b, const uint8_t
         if (dst_len == 0) {
             size_t new_len;
 
-            if (!b->fixed_size) /* resizeable only unless size not set explicitly */
+            if (!b->grows_on_write) /* resize only if size not set explicitly */
                 break;
             /* increase the size */
             new_len = compute_rbuf_growth(b->req_buf_len + sz, b->req_buf_len);
index 0e2fb53103b3c77f0bd2fc3af9e28365a6d8c617..5aafe389f70569abf943a7c4e21e098542cf7699 100644 (file)
@@ -519,6 +519,8 @@ static int test_bio_dgram_pair(int idx)
     } else {
         if (!TEST_ptr(bio1 = bio2 = BIO_new(BIO_s_dgram_mem())))
             goto err;
+        if (idx == 1 && !TEST_true(BIO_set_write_buf_size(bio1, 20 * 1024)))
+            goto err;
     }
 
     mtu1 = BIO_dgram_get_mtu(bio1);
@@ -535,7 +537,7 @@ static int test_bio_dgram_pair(int idx)
     if (!TEST_int_le(mtu1, sizeof(scratch) - 4))
         goto err;
 
-    for (i = 0; idx == 0 || i < 9; ++i) {
+    for (i = 0; total < 1 * 1024 * 1024; ++i) {
         if (!TEST_int_eq(random_data(key, scratch, sizeof(scratch), i), 1))
             goto err;
 
@@ -548,10 +550,14 @@ static int test_bio_dgram_pair(int idx)
             goto err;
 
         total += blen;
-        if (!TEST_size_t_lt(total, 1 * 1024 * 1024))
-            goto err;
     }
 
+    if (idx <= 1 && !TEST_size_t_lt(total, 1 * 1024 * 1024))
+        goto err;
+
+    if (idx == 2 && !TEST_size_t_ge(total, 1 * 1024 * 1024))
+        goto err;
+
     /*
      * Should be able to fit at least 9 datagrams in default write buffer size
      * in worst case
@@ -766,7 +772,7 @@ int setup_tests(void)
 #if !defined(OPENSSL_NO_DGRAM) && !defined(OPENSSL_NO_SOCK)
     ADD_ALL_TESTS(test_bio_dgram, OSSL_NELEM(bio_dgram_cases));
 # if !defined(OPENSSL_NO_CHACHA)
-    ADD_ALL_TESTS(test_bio_dgram_pair, 2);
+    ADD_ALL_TESTS(test_bio_dgram_pair, 3);
 # endif
 #endif