From 3a299f54bc1c95e78fd68ca716a1b9dadf47e3cc Mon Sep 17 00:00:00 2001 From: Christian Schneider Date: Wed, 5 Mar 2025 20:59:07 +0100 Subject: [PATCH 1/3] Fix bug and add test for dba_open same file twice --- ext/dba/dba.c | 3 ++- ext/dba/tests/dba_duplicateopen.phpt | 34 ++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 ext/dba/tests/dba_duplicateopen.phpt diff --git a/ext/dba/dba.c b/ext/dba/dba.c index e4986e1cd2321..1fa545ce27e8f 100644 --- a/ext/dba/dba.c +++ b/ext/dba/dba.c @@ -57,6 +57,7 @@ ZEND_BEGIN_MODULE_GLOBALS(dba) const char *default_handler; const dba_handler *default_hptr; HashTable connections; + int connection_counter; ZEND_END_MODULE_GLOBALS(dba) ZEND_DECLARE_MODULE_GLOBALS(dba) @@ -571,7 +572,7 @@ static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, bool persistent) char *resource_key; size_t resource_key_len = spprintf(&resource_key, 0, - "dba_%d_%s_%s_%s", persistent, ZSTR_VAL(path), ZSTR_VAL(mode), handler_str ? ZSTR_VAL(handler_str) : "" + "dba_%d_%d_%s_%s_%s", persistent, persistent ? 0 : DBA_G(connection_counter)++, ZSTR_VAL(path), ZSTR_VAL(mode), handler_str ? ZSTR_VAL(handler_str) : "" ); if (persistent) { diff --git a/ext/dba/tests/dba_duplicateopen.phpt b/ext/dba/tests/dba_duplicateopen.phpt new file mode 100644 index 0000000000000..bb9a0f75f13c9 --- /dev/null +++ b/ext/dba/tests/dba_duplicateopen.phpt @@ -0,0 +1,34 @@ +--TEST-- +DBA open same read only file multiple times +--EXTENSIONS-- +dba +--SKIPIF-- + +--CONFLICTS-- +test.cdb +--FILE-- + +--EXPECT-- +database handler: cdb +1122 From 1ae93ef79de0332ef857478c79c1c301787a62e8 Mon Sep 17 00:00:00 2001 From: Christian Schneider Date: Thu, 6 Mar 2025 20:34:21 +0100 Subject: [PATCH 2/3] Remove indentation to match current test file style --- ext/dba/tests/dba_duplicateopen.phpt | 30 ++++++++++++++-------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/ext/dba/tests/dba_duplicateopen.phpt b/ext/dba/tests/dba_duplicateopen.phpt index bb9a0f75f13c9..7068981f1a3c8 100644 --- a/ext/dba/tests/dba_duplicateopen.phpt +++ b/ext/dba/tests/dba_duplicateopen.phpt @@ -11,23 +11,23 @@ check_skip('cdb_make'); test.cdb --FILE-- --EXPECT-- database handler: cdb From 6673d73239ce3066473d2e33e21970eaa479b13e Mon Sep 17 00:00:00 2001 From: Christian Schneider Date: Thu, 6 Mar 2025 20:48:27 +0100 Subject: [PATCH 3/3] Make counter unsigned as signed integer overflow is undefined behaviour --- ext/dba/dba.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/dba/dba.c b/ext/dba/dba.c index 1fa545ce27e8f..2205b13dfe050 100644 --- a/ext/dba/dba.c +++ b/ext/dba/dba.c @@ -57,7 +57,7 @@ ZEND_BEGIN_MODULE_GLOBALS(dba) const char *default_handler; const dba_handler *default_hptr; HashTable connections; - int connection_counter; + unsigned int connection_counter; ZEND_END_MODULE_GLOBALS(dba) ZEND_DECLARE_MODULE_GLOBALS(dba) @@ -572,7 +572,7 @@ static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, bool persistent) char *resource_key; size_t resource_key_len = spprintf(&resource_key, 0, - "dba_%d_%d_%s_%s_%s", persistent, persistent ? 0 : DBA_G(connection_counter)++, ZSTR_VAL(path), ZSTR_VAL(mode), handler_str ? ZSTR_VAL(handler_str) : "" + "dba_%d_%u_%s_%s_%s", persistent, persistent ? 0 : DBA_G(connection_counter)++, ZSTR_VAL(path), ZSTR_VAL(mode), handler_str ? ZSTR_VAL(handler_str) : "" ); if (persistent) {