From: Jakub Zelenka Date: Tue, 5 May 2026 17:56:34 +0000 (+0200) Subject: Add various MFAIL tests to excercise ht insert X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=658181faa860aa3902b1f5e486e76d3b938ec342;p=thirdparty%2Fopenssl.git Add various MFAIL tests to excercise ht insert Reviewed-by: Nikola Pajkovsky Reviewed-by: Neil Horman Reviewed-by: Tomas Mraz MergeDate: Mon May 11 08:21:56 2026 (Merged from https://github.com/openssl/openssl/pull/31092) --- diff --git a/test/lhash_test.c b/test/lhash_test.c index eae2999f4e5..39fab54a056 100644 --- a/test/lhash_test.c +++ b/test/lhash_test.c @@ -1,5 +1,5 @@ /* - * Copyright 2017-2025 The OpenSSL Project Authors. All Rights Reserved. + * Copyright 2017-2026 The OpenSSL Project Authors. All Rights Reserved. * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. * * Licensed under the Apache License 2.0 (the "License"). You may not use @@ -304,6 +304,43 @@ end: return rc; } +/* + * MFAIL coverage for the RCU replacement branch of ossl_ht_insert_locked. + */ +static int test_hashtable_insert_replace_mfail(void) +{ + HT_CONFIG hash_conf = { + .collision_check = 1, + .no_rcu = 0, /* RCU enabled - exercises cbi pre-alloc on replace */ + }; + INTKEY key; + HT *ht = NULL; + int *old = NULL; + int ret = 0; + static int v1 = 100; + static int v2 = 200; + + if (!TEST_ptr(ht = ossl_ht_new(&hash_conf))) + goto end; + + /* Seed the table outside MFAIL for later replacement */ + HT_INIT_KEY(&key); + HT_KEY_RESET(&key); + HT_SET_KEY_FIELD(&key, mykey, int_tests[0]); + if (!TEST_int_eq(ossl_ht_test_int_insert(ht, TO_HT_KEY(&key), &v1, NULL), + 1)) + goto end; + + /* Replacement under MFAIL. */ + MFAIL_start(); + ret = ossl_ht_test_int_insert(ht, TO_HT_KEY(&key), &v2, &old); + MFAIL_end(); + +end: + ossl_ht_free(ht); + return ret > 0 ? 1 : 0; +} + static unsigned long int stress_hash(const int *p) { return *p; @@ -799,5 +836,6 @@ int setup_tests(void) ADD_ALL_TESTS(test_int_hashtable, 2); ADD_ALL_TESTS(test_hashtable_stress, 4); ADD_ALL_TESTS(test_hashtable_multithread, 2); + ADD_MFAIL_TEST(test_hashtable_insert_replace_mfail); return 1; } diff --git a/test/namemap_internal_test.c b/test/namemap_internal_test.c index c8163f84a3d..ec5d23d7144 100644 --- a/test/namemap_internal_test.c +++ b/test/namemap_internal_test.c @@ -1,5 +1,5 @@ /* - * Copyright 2019-2024 The OpenSSL Project Authors. All Rights Reserved. + * Copyright 2019-2026 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 @@ -170,6 +170,27 @@ static int test_digest_is_a(void) return rv; } +/* + * Test memory failures for ossl_namemap_add_name. + */ +static int test_namemap_add_name_mfail(void) +{ + OSSL_NAMEMAP *nm = NULL; + int ret = 0; + + nm = ossl_namemap_new(NULL); + if (!TEST_ptr(nm)) + goto err; + + MFAIL_start(); + ret = ossl_namemap_add_name(nm, 0, "mfail_test_name"); + MFAIL_end(); + +err: + ossl_namemap_free(nm); + return ret; +} + int setup_tests(void) { ADD_TEST(test_namemap_empty); @@ -179,5 +200,6 @@ int setup_tests(void) ADD_TEST(test_cipherbyname); ADD_TEST(test_digest_is_a); ADD_TEST(test_cipher_is_a); + ADD_MFAIL_TEST(test_namemap_add_name_mfail); return 1; } diff --git a/test/x509_load_cert_file_test.c b/test/x509_load_cert_file_test.c index 721eff9cb52..0df654559af 100644 --- a/test/x509_load_cert_file_test.c +++ b/test/x509_load_cert_file_test.c @@ -172,6 +172,32 @@ err: return ret; } +/* + * Test to trigger memory failures in X509_STORE_add_cert. + */ +static int test_x509_store_add_mfail(void) +{ + X509 *cert = NULL; + X509_STORE *store = NULL; + int ret = 0; + + cert = X509_from_strings(cn_cert1); + if (!TEST_ptr(cert)) + goto err; + store = X509_STORE_new(); + if (!TEST_ptr(store)) + goto err; + + MFAIL_start(); + ret = X509_STORE_add_cert(store, cert); + MFAIL_end(); + +err: + X509_STORE_free(store); + X509_free(cert); + return ret; +} + OPT_TEST_DECLARE_USAGE("cert.pem [crl.pem]\n") int setup_tests(void) @@ -189,6 +215,7 @@ int setup_tests(void) ADD_TEST(test_load_cert_file); ADD_TEST(test_load_same_cn_certs); + ADD_MFAIL_TEST(test_x509_store_add_mfail); return 1; }