summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntony Dovgal <tony2001@php.net>2007-06-26 12:10:08 +0000
committerAntony Dovgal <tony2001@php.net>2007-06-26 12:10:08 +0000
commitce22f44493fc70935dffd4241dd2839e3d720a01 (patch)
tree3b8539e6c90646c85f5f34c937111227e488836e
parent7210ab56957eb1523ac5d0acc00cf38b398a9b68 (diff)
downloadphp-git-ce22f44493fc70935dffd4241dd2839e3d720a01.tar.gz
MFH: fix #41445 (parse_ini_file() has a problem with certain types of integer as sections)
-rw-r--r--NEWS2
-rw-r--r--ext/standard/basic_functions.c36
-rw-r--r--ext/standard/tests/general_functions/bug41445.phpt75
-rw-r--r--ext/standard/tests/general_functions/bug41445_1.phpt54
4 files changed, 144 insertions, 23 deletions
diff --git a/NEWS b/NEWS
index be6ee7c21d..8cd511005e 100644
--- a/NEWS
+++ b/NEWS
@@ -84,6 +84,8 @@ PHP NEWS
- Fixed bug #41527 (WDDX deserialize numeric string array key). (Matt, Ilia)
- Fixed bug #41518 (file_exists() warns of open_basedir restriction on
non-existent file). (Tony)
+- Fixed bug #41445 (parse_ini_file() has a problem with certain types of
+ integer as sections). (Tony)
- Fixed bug #41350 (my_thread_global_end() error during request shutdown
on Windows). (Scott, Andrey)
- Fixed bug #39330 (apache2handler does not call shutdown actions before
diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c
index fe672d0fa5..4ca820ddf0 100644
--- a/ext/standard/basic_functions.c
+++ b/ext/standard/basic_functions.c
@@ -6130,12 +6130,7 @@ static void php_simple_ini_parser_cb(zval *arg1, zval *arg2, int callback_type,
*element = *arg2;
zval_copy_ctor(element);
INIT_PZVAL(element);
- if (is_numeric_string(Z_STRVAL_P(arg1), Z_STRLEN_P(arg1), NULL, NULL, 0) != IS_LONG) {
- zend_hash_update(Z_ARRVAL_P(arr), Z_STRVAL_P(arg1), Z_STRLEN_P(arg1)+1, &element, sizeof(zval *), NULL);
- } else {
- ulong key = (ulong) zend_atoi(Z_STRVAL_P(arg1), Z_STRLEN_P(arg1));
- zend_hash_index_update(Z_ARRVAL_P(arr), key, &element, sizeof(zval *), NULL);
- }
+ zend_symtable_update(Z_ARRVAL_P(arr), Z_STRVAL_P(arg1), Z_STRLEN_P(arg1)+1, &element, sizeof(zval *), NULL);
break;
case ZEND_INI_PARSER_POP_ENTRY:
@@ -6147,17 +6142,7 @@ static void php_simple_ini_parser_cb(zval *arg1, zval *arg2, int callback_type,
break;
}
- if (is_numeric_string(Z_STRVAL_P(arg1), Z_STRLEN_P(arg1), NULL, NULL, 0) != IS_LONG) {
- if (zend_hash_find(Z_ARRVAL_P(arr), Z_STRVAL_P(arg1), Z_STRLEN_P(arg1)+1, (void **) &find_hash) == FAILURE) {
- ALLOC_ZVAL(hash);
- INIT_PZVAL(hash);
- array_init(hash);
-
- zend_hash_update(Z_ARRVAL_P(arr), Z_STRVAL_P(arg1), Z_STRLEN_P(arg1)+1, &hash, sizeof(zval *), NULL);
- } else {
- hash = *find_hash;
- }
- } else {
+ if (!(Z_STRLEN_P(arg1) > 1 && Z_STRVAL_P(arg1)[0]=='0') && is_numeric_string(Z_STRVAL_P(arg1), Z_STRLEN_P(arg1), NULL, NULL, 0) == IS_LONG) {
ulong key = (ulong) zend_atoi(Z_STRVAL_P(arg1), Z_STRLEN_P(arg1));
if (zend_hash_index_find(Z_ARRVAL_P(arr), key, (void **) &find_hash) == FAILURE) {
ALLOC_ZVAL(hash);
@@ -6168,6 +6153,16 @@ static void php_simple_ini_parser_cb(zval *arg1, zval *arg2, int callback_type,
} else {
hash = *find_hash;
}
+ } else {
+ if (zend_hash_find(Z_ARRVAL_P(arr), Z_STRVAL_P(arg1), Z_STRLEN_P(arg1)+1, (void **) &find_hash) == FAILURE) {
+ ALLOC_ZVAL(hash);
+ INIT_PZVAL(hash);
+ array_init(hash);
+
+ zend_hash_update(Z_ARRVAL_P(arr), Z_STRVAL_P(arg1), Z_STRLEN_P(arg1)+1, &hash, sizeof(zval *), NULL);
+ } else {
+ hash = *find_hash;
+ }
}
if (Z_TYPE_P(hash) != IS_ARRAY) {
@@ -6196,12 +6191,7 @@ static void php_ini_parser_cb_with_sections(zval *arg1, zval *arg2, int callback
if (callback_type == ZEND_INI_PARSER_SECTION) {
MAKE_STD_ZVAL(BG(active_ini_file_section));
array_init(BG(active_ini_file_section));
- if (is_numeric_string(Z_STRVAL_P(arg1), Z_STRLEN_P(arg1), NULL, NULL, 0) != IS_LONG) {
- zend_hash_update(Z_ARRVAL_P(arr), Z_STRVAL_P(arg1), Z_STRLEN_P(arg1)+1, &BG(active_ini_file_section), sizeof(zval *), NULL);
- } else {
- ulong key = (ulong) zend_atoi(Z_STRVAL_P(arg1), Z_STRLEN_P(arg1));
- zend_hash_index_update(Z_ARRVAL_P(arr), key, &BG(active_ini_file_section), sizeof(zval *), NULL);
- }
+ zend_symtable_update(Z_ARRVAL_P(arr), Z_STRVAL_P(arg1), Z_STRLEN_P(arg1)+1, &BG(active_ini_file_section), sizeof(zval *), NULL);
} else if (arg2) {
zval *active_arr;
diff --git a/ext/standard/tests/general_functions/bug41445.phpt b/ext/standard/tests/general_functions/bug41445.phpt
new file mode 100644
index 0000000000..23888df7d7
--- /dev/null
+++ b/ext/standard/tests/general_functions/bug41445.phpt
@@ -0,0 +1,75 @@
+--TEST--
+Bug #41445 (parse_ini_file() function parses octal numbers in section names)
+--FILE--
+<?php
+
+$file = dirname(__FILE__)."/bug41445.ini";
+
+$data = <<<DATA
+[001099030277]
+option1 = yes
+
+[011099030277]
+option2 = yes
+DATA;
+
+file_put_contents($file, $data);
+
+var_dump(parse_ini_file($file, TRUE));
+var_dump(parse_ini_file($file));
+
+$data = <<<DATA
+[23.44]
+option1 = yes
+
+[9633337363542736472364]
+option2 = yes
+DATA;
+
+file_put_contents($file, $data);
+
+var_dump(parse_ini_file($file, TRUE));
+var_dump(parse_ini_file($file));
+
+@unlink($file);
+
+echo "Done\n";
+?>
+--EXPECTF--
+array(2) {
+ ["001099030277"]=>
+ array(1) {
+ ["option1"]=>
+ string(1) "1"
+ }
+ ["011099030277"]=>
+ array(1) {
+ ["option2"]=>
+ string(1) "1"
+ }
+}
+array(2) {
+ ["option1"]=>
+ string(1) "1"
+ ["option2"]=>
+ string(1) "1"
+}
+array(2) {
+ ["23.44"]=>
+ array(1) {
+ ["option1"]=>
+ string(1) "1"
+ }
+ ["9633337363542736472364"]=>
+ array(1) {
+ ["option2"]=>
+ string(1) "1"
+ }
+}
+array(2) {
+ ["option1"]=>
+ string(1) "1"
+ ["option2"]=>
+ string(1) "1"
+}
+Done
diff --git a/ext/standard/tests/general_functions/bug41445_1.phpt b/ext/standard/tests/general_functions/bug41445_1.phpt
new file mode 100644
index 0000000000..e65e7afcc8
--- /dev/null
+++ b/ext/standard/tests/general_functions/bug41445_1.phpt
@@ -0,0 +1,54 @@
+--TEST--
+Bug #41445 (parse_ini_file() function parses octal numbers in section names) - 2
+--FILE--
+<?php
+
+$file = dirname(__FILE__)."/bug41445.ini";
+
+$data = <<<DATA
+[2454.33]
+09 = yes
+
+[9876543]
+098765434567876543 = yes
+
+[09876543]
+987654345678765432456798765434567876543 = yes
+DATA;
+
+file_put_contents($file, $data);
+
+var_dump(parse_ini_file($file, TRUE));
+var_dump(parse_ini_file($file));
+
+@unlink($file);
+
+echo "Done\n";
+?>
+--EXPECTF--
+array(3) {
+ ["2454.33"]=>
+ array(1) {
+ ["09"]=>
+ string(1) "1"
+ }
+ [9876543]=>
+ array(1) {
+ ["098765434567876543"]=>
+ string(1) "1"
+ }
+ ["09876543"]=>
+ array(1) {
+ ["987654345678765432456798765434567876543"]=>
+ string(1) "1"
+ }
+}
+array(3) {
+ ["09"]=>
+ string(1) "1"
+ ["098765434567876543"]=>
+ string(1) "1"
+ ["987654345678765432456798765434567876543"]=>
+ string(1) "1"
+}
+Done