diff options
author | slontis <shane.lontis@oracle.com> | 2024-03-04 13:08:08 +1100 |
---|---|---|
committer | Matt Caswell <matt@openssl.org> | 2024-03-11 11:34:25 +0000 |
commit | d60b37506da65f3aebc5043984b3ec78fd53f75f (patch) | |
tree | ce52cc280c0364565853767cf3e2af69e5f3ac74 /test/bio_meth_test.c | |
parent | 53a8728686663f4fe044cd1a5757f6fcfd777317 (diff) | |
download | openssl-d60b37506da65f3aebc5043984b3ec78fd53f75f.zip openssl-d60b37506da65f3aebc5043984b3ec78fd53f75f.tar.gz openssl-d60b37506da65f3aebc5043984b3ec78fd53f75f.tar.bz2 |
Fix BIO_get_new_index() to return an error when it is exhausted.
Fixes #23655
BIO_get_new_index() returns a range of 129..255.
It is set to BIO_TYPE_START (128) initially and is incremented on each
call.
>= 256 is reserved for the class type flags (BIO_TYPE_DESCRIPTOR) so it
should error if it reaches the upper bound.
Reviewed-by: Hugo Landau <hlandau@openssl.org>
Reviewed-by: Tomas Mraz <tomas@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/23732)
Diffstat (limited to 'test/bio_meth_test.c')
-rw-r--r-- | test/bio_meth_test.c | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/test/bio_meth_test.c b/test/bio_meth_test.c new file mode 100644 index 0000000..3eeafe3 --- /dev/null +++ b/test/bio_meth_test.c @@ -0,0 +1,71 @@ +/* + * Copyright 2024 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include <openssl/bio.h> +#include "testutil.h" + +static int test_bio_meth(void) +{ + int i, ret = 0, id; + BIO_METHOD *meth1 = NULL, *meth2 = NULL, *meth3 = NULL; + BIO *membio = NULL, *bio1 = NULL, *bio2 = NULL, *bio3 = NULL; + + id = BIO_get_new_index(); + if (!TEST_int_eq(id, BIO_TYPE_START + 1)) + goto err; + + if (!TEST_ptr(meth1 = BIO_meth_new(id, "Method1")) + || !TEST_ptr(meth2 = BIO_meth_new(BIO_TYPE_NONE, "Method2")) + || !TEST_ptr(meth3 = BIO_meth_new(BIO_TYPE_NONE|BIO_TYPE_FILTER, "Method3")) + || !TEST_ptr(bio1 = BIO_new(meth1)) + || !TEST_ptr(bio2 = BIO_new(meth2)) + || !TEST_ptr(bio3 = BIO_new(meth3)) + || !TEST_ptr(membio = BIO_new(BIO_s_mem()))) + goto err; + + BIO_set_next(bio3, bio2); + BIO_set_next(bio2, bio1); + BIO_set_next(bio1, membio); + + /* Check that we get an error if we exhaust BIO_get_new_index() */ + for (i = id + 1; i <= BIO_TYPE_MASK; ++i) { + if (!TEST_int_eq(BIO_get_new_index(), i)) + goto err; + } + if (!TEST_int_eq(BIO_get_new_index(), -1)) + goto err; + + /* test searching works */ + if (!TEST_ptr_eq(BIO_find_type(bio3, BIO_TYPE_MEM), membio) + || !TEST_ptr_eq(BIO_find_type(bio3, id), bio1)) + goto err; + + /* Check searching for BIO_TYPE_NONE returns NULL */ + if (!TEST_ptr_null(BIO_find_type(bio3, BIO_TYPE_NONE))) + goto err; + /* Check searching for BIO_TYPE_NONE + BIO_TYPE_FILTER works */ + if (!TEST_ptr_eq(BIO_find_type(bio3, BIO_TYPE_FILTER), bio3)) + goto err; + ret = 1; +err: + BIO_free(membio); + BIO_free(bio3); + BIO_free(bio2); + BIO_free(bio1); + BIO_meth_free(meth3); + BIO_meth_free(meth2); + BIO_meth_free(meth1); + return ret; +} + +int setup_tests(void) +{ + ADD_TEST(test_bio_meth); + return 1; +} |