From c29346240bf888716da6de930ffbf6ea75be19b9 Mon Sep 17 00:00:00 2001 From: arshidkv12 Date: Sun, 26 Apr 2026 22:32:51 +0530 Subject: [PATCH 1/4] ext/dba: Use ZEND_HASH_FOREACH_VAL in php_dba_make_key() --- ext/dba/dba.c | 49 ++++++++++++++++++++++++++----------------------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/ext/dba/dba.c b/ext/dba/dba.c index a70951467be5..d013805657ef 100644 --- a/ext/dba/dba.c +++ b/ext/dba/dba.c @@ -95,38 +95,41 @@ static zend_string* php_dba_make_key(const HashTable *key) zval *group, *name; zend_string *group_str, *name_str; HashPosition pos; + int i = 0; if (zend_hash_num_elements(key) != 2) { zend_argument_error(NULL, 1, "must have exactly two elements: \"key\" and \"name\""); return NULL; } - // TODO: Use ZEND_HASH_FOREACH_VAL() API? - zend_hash_internal_pointer_reset_ex(key, &pos); - group = zend_hash_get_current_data_ex(key, &pos); - group_str = zval_try_get_string(group); - if (!group_str) { - return NULL; - } + ZEND_HASH_FOREACH_VAL(key, group) { + zend_string *tmp = zval_try_get_string(group); + if (!tmp) { + if (group_str) zend_string_release(group_str); + return NULL; + } - zend_hash_move_forward_ex(key, &pos); - name = zend_hash_get_current_data_ex(key, &pos); - name_str = zval_try_get_string(name); - if (!name_str) { - zend_string_release_ex(group_str, false); - return NULL; - } + if (i == 0) { + group_str = tmp; + } else { + name_str = tmp; + } - // TODO: Check ZSTR_LEN(name) != 0 - if (ZSTR_LEN(group_str) == 0) { - zend_string_release_ex(group_str, false); - return name_str; - } + i++; + } ZEND_HASH_FOREACH_END(); + + if (ZSTR_LEN(group_str) == 0) { + zend_string_release(group_str); + return name_str; + } + + zend_string *key_str = zend_strpprintf(0, "[%s]%s", + ZSTR_VAL(group_str), ZSTR_VAL(name_str)); + + zend_string_release(group_str); + zend_string_release(name_str); - zend_string *key_str = zend_strpprintf(0, "[%s]%s", ZSTR_VAL(group_str), ZSTR_VAL(name_str)); - zend_string_release_ex(group_str, false); - zend_string_release_ex(name_str, false); - return key_str; + return key_str; } /* }}} */ From 7366a40a0b3a8a4924e4f0e8a64bee16845298c4 Mon Sep 17 00:00:00 2001 From: arshidkv12 Date: Sun, 26 Apr 2026 22:50:53 +0530 Subject: [PATCH 2/4] ext/dba: Use ZEND_HASH_FOREACH_VAL in php_dba_make_key() --- ext/dba/dba.c | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/ext/dba/dba.c b/ext/dba/dba.c index d013805657ef..2090256be56c 100644 --- a/ext/dba/dba.c +++ b/ext/dba/dba.c @@ -92,39 +92,39 @@ ZEND_GET_MODULE(dba) /* {{{ php_dba_make_key */ static zend_string* php_dba_make_key(const HashTable *key) { - zval *group, *name; - zend_string *group_str, *name_str; - HashPosition pos; - int i = 0; - - if (zend_hash_num_elements(key) != 2) { - zend_argument_error(NULL, 1, "must have exactly two elements: \"key\" and \"name\""); - return NULL; - } + zval *zv; + zend_string *group_str = NULL, *name_str = NULL; + int i = 0; + + if (zend_hash_num_elements(key) != 2) { + zend_argument_error(NULL, 1, "must have exactly two elements: \"key\" and \"name\""); + return NULL; + } - ZEND_HASH_FOREACH_VAL(key, group) { - zend_string *tmp = zval_try_get_string(group); + ZEND_HASH_FOREACH_VAL(key, zv) { + zend_string *tmp = zval_try_get_string(zv); if (!tmp) { if (group_str) zend_string_release(group_str); + if (name_str) zend_string_release(name_str); return NULL; } - if (i == 0) { + if (i++ == 0) { group_str = tmp; } else { name_str = tmp; } - - i++; } ZEND_HASH_FOREACH_END(); if (ZSTR_LEN(group_str) == 0) { zend_string_release(group_str); - return name_str; + return name_str; // ownership transferred } - zend_string *key_str = zend_strpprintf(0, "[%s]%s", - ZSTR_VAL(group_str), ZSTR_VAL(name_str)); + zend_string *key_str = zend_strpprintf( + 0, "[%s]%s", + ZSTR_VAL(group_str), ZSTR_VAL(name_str) + ); zend_string_release(group_str); zend_string_release(name_str); From b8bcba125a1cf3227e0cbd3dd67f668f2c05775f Mon Sep 17 00:00:00 2001 From: arshidkv12 Date: Sun, 26 Apr 2026 22:51:53 +0530 Subject: [PATCH 3/4] ext/dba: Use ZEND_HASH_FOREACH_VAL in php_dba_make_key() --- ext/dba/dba.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/dba/dba.c b/ext/dba/dba.c index 2090256be56c..5f305b8b89ba 100644 --- a/ext/dba/dba.c +++ b/ext/dba/dba.c @@ -118,7 +118,7 @@ static zend_string* php_dba_make_key(const HashTable *key) if (ZSTR_LEN(group_str) == 0) { zend_string_release(group_str); - return name_str; // ownership transferred + return name_str; } zend_string *key_str = zend_strpprintf( From ae439c518b1c69e09c97aebdc2d5387853e00f43 Mon Sep 17 00:00:00 2001 From: arshidkv12 Date: Mon, 27 Apr 2026 20:33:33 +0530 Subject: [PATCH 4/4] ext/dba add test --- ext/dba/tests/dba_insert_numeric_keys.phpt | 52 ++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 ext/dba/tests/dba_insert_numeric_keys.phpt diff --git a/ext/dba/tests/dba_insert_numeric_keys.phpt b/ext/dba/tests/dba_insert_numeric_keys.phpt new file mode 100644 index 000000000000..298beb85a4c5 --- /dev/null +++ b/ext/dba/tests/dba_insert_numeric_keys.phpt @@ -0,0 +1,52 @@ +--TEST-- +dba_insert should correctly handle numeric array-like keys (php_dba_make_key) +--EXTENSIONS-- +dba +--SKIPIF-- + +--FILE-- + +--CLEAN-- + +--EXPECTF-- +Using handler: "%s" +abc +mixed +value +OK \ No newline at end of file