You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
89 lines
2.5 KiB
89 lines
2.5 KiB
7 months ago
|
From d258422d3e653621ce6340ba9af0153f8d4e8c07 Mon Sep 17 00:00:00 2001
|
||
|
From: =?UTF-8?q?Ond=C5=99ej=20Sur=C3=BD?= <ondrej@isc.org>
|
||
|
Date: Sun, 11 Feb 2024 00:49:32 +0100
|
||
|
Subject: [PATCH] Test case insensitive matching in isc_ht hash table
|
||
|
implementation
|
||
|
|
||
|
The case insensitive matching in isc_ht was basically completely broken
|
||
|
as only the hashvalue computation was case insensitive, but the key
|
||
|
comparison was always case sensitive.
|
||
|
|
||
|
Import only test part from upstream.
|
||
|
|
||
|
(cherry picked from commit 175655b771fd17b06dfb8cfb29eaadf0f3b6a8b5)
|
||
|
(cherry picked from upstream commit f493a8394102b0aeb101d5dc2f963004c8741175)
|
||
|
---
|
||
|
lib/isc/tests/ht_test.c | 53 +++++++++++++++++++++++++++++++++++++++++
|
||
|
1 file changed, 53 insertions(+)
|
||
|
|
||
|
diff --git a/lib/isc/tests/ht_test.c b/lib/isc/tests/ht_test.c
|
||
|
index 74d95c1..65502b5 100644
|
||
|
--- a/lib/isc/tests/ht_test.c
|
||
|
+++ b/lib/isc/tests/ht_test.c
|
||
|
@@ -334,9 +334,62 @@ isc_ht_iterator_test(void **state) {
|
||
|
test_ht_iterator();
|
||
|
}
|
||
|
|
||
|
+static void
|
||
|
+isc_ht_case(void **state) {
|
||
|
+ UNUSED(state);
|
||
|
+
|
||
|
+ isc_ht_t *ht = NULL;
|
||
|
+ void *f = NULL;
|
||
|
+ isc_result_t result = ISC_R_UNSET;
|
||
|
+
|
||
|
+ unsigned char lower[16] = { "test case" };
|
||
|
+ unsigned char same[16] = { "test case" };
|
||
|
+ unsigned char upper[16] = { "TEST CASE" };
|
||
|
+ unsigned char mixed[16] = { "tEsT CaSe" };
|
||
|
+
|
||
|
+ isc_ht_init(&ht, test_mctx, 8, ISC_HT_CASE_SENSITIVE);
|
||
|
+ assert_non_null(ht);
|
||
|
+
|
||
|
+ result = isc_ht_add(ht, lower, 16, (void *)lower);
|
||
|
+ assert_int_equal(result, ISC_R_SUCCESS);
|
||
|
+
|
||
|
+ result = isc_ht_add(ht, same, 16, (void *)same);
|
||
|
+ assert_int_equal(result, ISC_R_EXISTS);
|
||
|
+
|
||
|
+ result = isc_ht_add(ht, upper, 16, (void *)upper);
|
||
|
+ assert_int_equal(result, ISC_R_SUCCESS);
|
||
|
+
|
||
|
+ result = isc_ht_find(ht, mixed, 16, &f);
|
||
|
+ assert_int_equal(result, ISC_R_NOTFOUND);
|
||
|
+ assert_null(f);
|
||
|
+
|
||
|
+ isc_ht_destroy(&ht);
|
||
|
+ assert_null(ht);
|
||
|
+
|
||
|
+ isc_ht_init(&ht, test_mctx, 8, ISC_HT_CASE_INSENSITIVE);
|
||
|
+ assert_non_null(ht);
|
||
|
+
|
||
|
+ result = isc_ht_add(ht, lower, 16, (void *)lower);
|
||
|
+ assert_int_equal(result, ISC_R_SUCCESS);
|
||
|
+
|
||
|
+ result = isc_ht_add(ht, same, 16, (void *)same);
|
||
|
+ assert_int_equal(result, ISC_R_EXISTS);
|
||
|
+
|
||
|
+ result = isc_ht_add(ht, upper, 16, (void *)upper);
|
||
|
+ assert_int_equal(result, ISC_R_EXISTS);
|
||
|
+
|
||
|
+ result = isc_ht_find(ht, mixed, 16, &f);
|
||
|
+ assert_int_equal(result, ISC_R_SUCCESS);
|
||
|
+ assert_ptr_equal(f, &lower);
|
||
|
+
|
||
|
+ isc_ht_destroy(&ht);
|
||
|
+ assert_null(ht);
|
||
|
+}
|
||
|
+
|
||
|
int
|
||
|
main(void) {
|
||
|
const struct CMUnitTest tests[] = {
|
||
|
+ cmocka_unit_test(isc_ht_case),
|
||
|
cmocka_unit_test(isc_ht_20),
|
||
|
cmocka_unit_test(isc_ht_8),
|
||
|
cmocka_unit_test(isc_ht_1),
|
||
|
--
|
||
|
2.43.0
|
||
|
|