tony2001 Tue Jun 26 12:08:50 2007 UTC Added files: /php-src/ext/standard/tests/general_functions bug41445.phpt bug41445_1.phpt
Modified files: /php-src/ext/standard basic_functions.c Log: fix #41445 (parse_ini_file() has a problem with certain types of integer as sections)
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/basic_functions.c?r1=1.859&r2=1.860&diff_format=u Index: php-src/ext/standard/basic_functions.c diff -u php-src/ext/standard/basic_functions.c:1.859 php-src/ext/standard/basic_functions.c:1.860 --- php-src/ext/standard/basic_functions.c:1.859 Sat Jun 9 11:42:55 2007 +++ php-src/ext/standard/basic_functions.c Tue Jun 26 12:08:50 2007 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: basic_functions.c,v 1.859 2007/06/09 11:42:55 sniper Exp $ */ +/* $Id: basic_functions.c,v 1.860 2007/06/26 12:08:50 tony2001 Exp $ */ #include "php.h" #include "php_streams.h" @@ -6122,7 +6122,7 @@ static void php_simple_ini_parser_cb(zval *arg1, zval *arg2, int callback_type, zval *arr) { - zval *element; + zval *element, name; TSRMLS_FETCH(); switch (callback_type) { @@ -6136,29 +6136,17 @@ *element = *arg2; zval_copy_ctor(element); INIT_PZVAL(element); + + name = *arg1; + zval_copy_ctor(&name); + INIT_PZVAL(&name); + if (UG(unicode)) { convert_to_unicode_with_converter(element, UG(utf8_conv)); + convert_to_unicode_with_converter(&name, UG(utf8_conv)); } - if (is_numeric_string(Z_STRVAL_P(arg1), Z_STRLEN_P(arg1), NULL, NULL, 0) != IS_LONG) { - zstr key; - int key_len; - - if (UG(unicode)) { - if (zend_string_to_unicode(UG(utf8_conv), &key.u, &key_len, Z_STRVAL_P(arg1), Z_STRLEN_P(arg1) TSRMLS_CC) == FAILURE) { - return; - } - } else { - key.s = Z_STRVAL_P(arg1); - key_len = Z_STRLEN_P(arg1); - } - zend_u_hash_update(Z_ARRVAL_P(arr), ZEND_STR_TYPE, key, key_len+1, &element, sizeof(zval *), NULL); - if (UG(unicode)) { - efree(key.u); - } - } 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_u_symtable_update(Z_ARRVAL_P(arr), ZEND_STR_TYPE, Z_UNIVAL(name), Z_UNILEN(name)+1, &element, sizeof(zval *), NULL); + zval_dtor(&name); break; case ZEND_INI_PARSER_POP_ENTRY: @@ -6170,7 +6158,18 @@ break; } - if (is_numeric_string(Z_STRVAL_P(arg1), Z_STRLEN_P(arg1), NULL, NULL, 0) != IS_LONG) { + 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); + INIT_PZVAL(hash); + array_init(hash); + + zend_hash_index_update(Z_ARRVAL_P(arr), key, &hash, sizeof(zval *), NULL); + } else { + hash = *find_hash; + } + } else { zstr key; int key_len; @@ -6196,17 +6195,6 @@ if (UG(unicode)) { efree(key.u); } - } else { - 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); - INIT_PZVAL(hash); - array_init(hash); - - zend_hash_index_update(Z_ARRVAL_P(arr), key, &hash, sizeof(zval *), NULL); - } else { - hash = *find_hash; - } } if (Z_TYPE_P(hash) != IS_ARRAY) { @@ -6233,31 +6221,21 @@ static void php_ini_parser_cb_with_sections(zval *arg1, zval *arg2, int callback_type, zval *arr) { + zval name; TSRMLS_FETCH(); 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) { - zstr key; - int key_len; + name = *arg1; + zval_copy_ctor(&name); + INIT_PZVAL(&name); - if (UG(unicode)) { - if (zend_string_to_unicode(UG(utf8_conv), &key.u, &key_len, Z_STRVAL_P(arg1), Z_STRLEN_P(arg1) TSRMLS_CC) == FAILURE) { - return; - } - } else { - key.s = Z_STRVAL_P(arg1); - key_len = Z_STRLEN_P(arg1); - } - zend_u_hash_update(Z_ARRVAL_P(arr), ZEND_STR_TYPE, key, key_len+1, &BG(active_ini_file_section), sizeof(zval *), NULL); - if (UG(unicode)) { - efree(key.u); - } - } 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); + if (UG(unicode)) { + convert_to_unicode_with_converter(&name, UG(utf8_conv)); } + zend_u_symtable_update(Z_ARRVAL_P(arr), ZEND_STR_TYPE, Z_UNIVAL(name), Z_UNILEN(name)+1, &BG(active_ini_file_section), sizeof(zval *), NULL); + zval_dtor(&name); } else if (arg2) { zval *active_arr; http://cvs.php.net/viewvc.cgi/php-src/ext/standard/tests/general_functions/bug41445.phpt?view=markup&rev=1.1 Index: php-src/ext/standard/tests/general_functions/bug41445.phpt +++ php-src/ext/standard/tests/general_functions/bug41445.phpt --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 --UEXPECTF-- array(2) { [u"001099030277"]=> array(1) { [u"option1"]=> unicode(1) "1" } [u"011099030277"]=> array(1) { [u"option2"]=> unicode(1) "1" } } array(2) { [u"option1"]=> unicode(1) "1" [u"option2"]=> unicode(1) "1" } array(2) { [u"23.44"]=> array(1) { [u"option1"]=> unicode(1) "1" } [u"9633337363542736472364"]=> array(1) { [u"option2"]=> unicode(1) "1" } } array(2) { [u"option1"]=> unicode(1) "1" [u"option2"]=> unicode(1) "1" } Done http://cvs.php.net/viewvc.cgi/php-src/ext/standard/tests/general_functions/bug41445_1.phpt?view=markup&rev=1.1 Index: php-src/ext/standard/tests/general_functions/bug41445_1.phpt +++ php-src/ext/standard/tests/general_functions/bug41445_1.phpt --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 --UEXPECTF-- array(3) { [u"2454.33"]=> array(1) { [u"09"]=> unicode(1) "1" } [9876543]=> array(1) { [u"098765434567876543"]=> unicode(1) "1" } [u"09876543"]=> array(1) { [u"987654345678765432456798765434567876543"]=> unicode(1) "1" } } array(3) { [u"09"]=> unicode(1) "1" [u"098765434567876543"]=> unicode(1) "1" [u"987654345678765432456798765434567876543"]=> unicode(1) "1" } Done
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php