com php-src: Merge branch 'PHP-5.6': Zend/zend_ini_parser .y ext/standard/basic_functions.c

From: Date: Sat, 15 Aug 2015 08:49:30 +0000
Subject: com php-src: Merge branch 'PHP-5.6': Zend/zend_ini_parser .y ext/standard/basic_functions.c
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-88544@lists.php.net to get a copy of this message
Commit: 0bd7d7a3691cee4e916d1008500cf21b80e03056 Author: Tjerk Meesters <datibbaw@php.net> Sat, 15 Aug 2015 16:29:12 +0800 Parents: c63b50557318132723494d945ae284f517ab2e16 b0c5439b5f1874070b1baae2dd4c70530b724da1 Branches: master Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=0bd7d7a3691cee4e916d1008500cf21b80e03056 Log: Merge branch 'PHP-5.6' * PHP-5.6: Updated NEWS for #70157 Fixed #70157 parse_ini_string() segmentation fault with INI_SCANNER_TYPED Bugs: https://bugs.php.net/70157 Changed paths: MM Zend/zend_ini_parser.y MM ext/standard/basic_functions.c Diff: diff --cc Zend/zend_ini_parser.y index 565d83e,22b92db..2bcebe8 --- a/Zend/zend_ini_parser.y +++ b/Zend/zend_ini_parser.y @@@ -102,12 -108,24 +102,20 @@@ static void zend_ini_init_string(zval * */ static void zend_ini_add_string(zval *result, zval *op1, zval *op2) { - int op1_len = (int)Z_STRLEN_P(op1); - int length = op1_len + (int)Z_STRLEN_P(op2); - int length; ++ int length, op1_len; + + if (Z_TYPE_P(op1) != IS_STRING) { - zval copy; - MAKE_COPY_ZVAL(&op1, &copy); - convert_to_string(&copy); - Z_STRVAL_P(op1) = zend_strndup(Z_STRVAL(copy), Z_STRLEN(copy)); - Z_STRLEN_P(op1) = Z_STRLEN(copy); - zval_dtor(&copy); ++ zend_string *str = zval_get_string(op1); ++ ZVAL_PSTRINGL(op1, str->val, str->len); ++ zend_string_release(str); + } + - length = Z_STRLEN_P(op1) + Z_STRLEN_P(op2); ++ op1_len = (int)Z_STRLEN_P(op1); ++ length = op1_len + (int)Z_STRLEN_P(op2); - Z_STRVAL_P(result) = (char *) realloc(Z_STRVAL_P(op1), length+1); - memcpy(Z_STRVAL_P(result)+Z_STRLEN_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op2)); + ZVAL_NEW_STR(result, zend_string_extend(Z_STR_P(op1), length, 1)); + memcpy(Z_STRVAL_P(result)+op1_len, Z_STRVAL_P(op2), Z_STRLEN_P(op2)); Z_STRVAL_P(result)[length] = 0; - Z_STRLEN_P(result) = length; - Z_TYPE_P(result) = IS_STRING; } /* }}} */ @@@ -298,12 -312,16 +306,16 @@@ statement #if DEBUG_CFG_PARSER printf("OFFSET: '%s'[%s] = '%s'\n", Z_STRVAL($1), Z_STRVAL($2), Z_STRVAL($5)); #endif - ZEND_INI_PARSER_CB(&$1, &$5, &$2, ZEND_INI_PARSER_POP_ENTRY, ZEND_INI_PARSER_ARG TSRMLS_CC); - free(Z_STRVAL($1)); + ZEND_INI_PARSER_CB(&$1, &$5, &$2, ZEND_INI_PARSER_POP_ENTRY, ZEND_INI_PARSER_ARG); + zend_string_release(Z_STR($1)); - zend_string_release(Z_STR($2)); + if (Z_TYPE($2) == IS_STRING) { - free(Z_STRVAL($2)); ++ zend_string_release(Z_STR($2)); + } else { + zval_dtor(&$2); + } - zval_internal_dtor(&$5); + zval_ptr_dtor(&$5); } - | TC_LABEL { ZEND_INI_PARSER_CB(&$1, NULL, NULL, ZEND_INI_PARSER_ENTRY, ZEND_INI_PARSER_ARG TSRMLS_CC); free(Z_STRVAL($1)); } + | TC_LABEL { ZEND_INI_PARSER_CB(&$1, NULL, NULL, ZEND_INI_PARSER_ENTRY, ZEND_INI_PARSER_ARG); zend_string_release(Z_STR($1)); } | END_OF_LINE ; diff --cc ext/standard/basic_functions.c index 3f03275,1abe3e6..8b83d55 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@@ -5839,17 -5894,20 +5839,17 @@@ static void php_simple_ini_parser_cb(zv } } - if (Z_TYPE_P(hash) != IS_ARRAY) { - zval_dtor(hash); - INIT_PZVAL(hash); - array_init(hash); + if (Z_TYPE_P(find_hash) != IS_ARRAY) { + zval_dtor(find_hash); + array_init(find_hash); } - ALLOC_ZVAL(element); - MAKE_COPY_ZVAL(&arg2, element); - + ZVAL_DUP(&element, arg2); - - if (arg3 && Z_STRLEN_P(arg3) > 0) { - zend_symtable_update(Z_ARRVAL_P(find_hash), Z_STR_P(arg3), &element); - } else { + if (!arg3 || (Z_TYPE_P(arg3) == IS_STRING && Z_STRLEN_P(arg3) == 0)) { - add_next_index_zval(hash, element); + add_next_index_zval(find_hash, &element); + } else { - array_set_zval_key(Z_ARRVAL_P(hash), arg3, element); ++ array_set_zval_key(Z_ARRVAL_P(find_hash), arg3, &element); + zval_ptr_dtor(&element); } } break;

« previous php.cvs (#88544) next »