mirror of
https://github.com/openssl/openssl.git
synced 2025-01-30 14:01:55 +08:00
Correct the fixed size handling for dgram_pair and dgram_mem
Reviewed-by: Hugo Landau <hlandau@openssl.org> Reviewed-by: Matt Caswell <matt@openssl.org> (Merged from https://github.com/openssl/openssl/pull/21866)
This commit is contained in:
parent
bd3b026faa
commit
b56b034e9a
@ -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);
|
||||
|
@ -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
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user