Commit fad1c77059 for openssl.org

commit fad1c77059655e646c5caaf41a6435123e2fe17e
Author: Jakub Zelenka <jakub.zelenka@openssl.foundation>
Date:   Tue May 12 20:27:38 2026 +0200

    Add mfail test for ossl_ht_free

    Reviewed-by: Neil Horman <nhorman@openssl.org>
    Reviewed-by: Paul Dale <paul.dale@oracle.com>
    Reviewed-by: Tomas Mraz <tomas@openssl.foundation>
    MergeDate: Thu May 21 09:09:37 2026
    (Merged from https://github.com/openssl/openssl/pull/31237)

diff --git a/test/lhash_test.c b/test/lhash_test.c
index 39fab54a05..87dc71f829 100644
--- a/test/lhash_test.c
+++ b/test/lhash_test.c
@@ -32,6 +32,8 @@

 DEFINE_LHASH_OF_EX(int);

+static void hashtable_intfree(HT_VALUE *v);
+
 static int int_tests[] = { 65537, 13, 1, 3, -5, 6, 7, 4, -10, -12, -14, 22, 9,
     -17, 16, 17, -23, 35, 37, 173, 11 };
 static const size_t n_int_tests = OSSL_NELEM(int_tests);
@@ -341,6 +343,47 @@ end:
     return ret > 0 ? 1 : 0;
 }

+static int test_hashtable_free_mfail(void)
+{
+    HT_CONFIG hash_conf = {
+        .ht_free_fn = hashtable_intfree,
+        .collision_check = 1,
+        .no_rcu = 0,
+    };
+    INTKEY key;
+    HT *ht = NULL;
+    int *p;
+    size_t i;
+
+    if (!TEST_ptr(ht = ossl_ht_new(&hash_conf)))
+        return 0;
+
+    /* Seed values. */
+    HT_INIT_KEY(&key);
+    for (i = 0; i < n_int_tests; i++) {
+        if (!TEST_ptr(p = OPENSSL_malloc(sizeof(*p))))
+            goto end;
+        *p = int_tests[i];
+        HT_KEY_RESET(&key);
+        HT_SET_KEY_FIELD(&key, mykey, *p);
+        if (!TEST_int_eq(ossl_ht_test_int_insert(ht, TO_HT_KEY(&key),
+                             p, NULL),
+                1)) {
+            OPENSSL_free(p);
+            goto end;
+        }
+    }
+    MFAIL_start();
+    ossl_ht_free(ht);
+    MFAIL_end();
+    ht = NULL;
+
+    return 1;
+end:
+    ossl_ht_free(ht);
+    return 0;
+}
+
 static unsigned long int stress_hash(const int *p)
 {
     return *p;
@@ -837,5 +880,6 @@ int setup_tests(void)
     ADD_ALL_TESTS(test_hashtable_stress, 4);
     ADD_ALL_TESTS(test_hashtable_multithread, 2);
     ADD_MFAIL_TEST(test_hashtable_insert_replace_mfail);
+    ADD_MFAIL_NO_CHECK_TEST(test_hashtable_free_mfail);
     return 1;
 }