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)
return 0;
}
+ b->grows_on_write = 1;
+
bio->init = 1;
return 1;
}
}
b->req_buf_len = len;
- b->fixed_size = 1;
+ b->grows_on_write = 0;
return 1;
}
}
/* 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;
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);
} 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);
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;
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
#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