diff options
Diffstat (limited to 'Zend/zend_ini_parser.y')
| -rw-r--r-- | Zend/zend_ini_parser.y | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/Zend/zend_ini_parser.y b/Zend/zend_ini_parser.y index 952ef9c506..22b92db033 100644 --- a/Zend/zend_ini_parser.y +++ b/Zend/zend_ini_parser.y @@ -108,7 +108,18 @@ static void zend_ini_init_string(zval *result) */ static void zend_ini_add_string(zval *result, zval *op1, zval *op2) { - int length = Z_STRLEN_P(op1) + Z_STRLEN_P(op2); + int length; + + if (Z_TYPE_P(op1) != IS_STRING) { + zval copy; + MAKE_COPY_ZVAL(&op1, ©); + convert_to_string(©); + Z_STRVAL_P(op1) = zend_strndup(Z_STRVAL(copy), Z_STRLEN(copy)); + Z_STRLEN_P(op1) = Z_STRLEN(copy); + zval_dtor(©); + } + + length = Z_STRLEN_P(op1) + 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)); @@ -213,7 +224,7 @@ ZEND_API int zend_parse_ini_file(zend_file_handle *fh, zend_bool unbuffered_erro zend_file_handle_dtor(fh TSRMLS_CC); shutdown_ini_scanner(TSRMLS_C); - + if (retval == 0) { return SUCCESS; } else { @@ -303,7 +314,11 @@ statement: #endif ZEND_INI_PARSER_CB(&$1, &$5, &$2, ZEND_INI_PARSER_POP_ENTRY, ZEND_INI_PARSER_ARG TSRMLS_CC); free(Z_STRVAL($1)); - free(Z_STRVAL($2)); + if (Z_TYPE($2) == IS_STRING) { + free(Z_STRVAL($2)); + } else { + zval_dtor(&$2); + } zval_internal_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)); } |
