mirror of
https://github.com/php/php-src.git
synced 2025-08-17 06:28:50 +02:00
Fixed memory leaks in parse_ini_file()
This commit is contained in:
parent
0c78fe4bb5
commit
97b65cc9c2
3 changed files with 27 additions and 16 deletions
|
@ -46,6 +46,8 @@ int ini_parse(void);
|
||||||
#define YYFREE free
|
#define YYFREE free
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define ZEND_SYSTEM_INI CG(ini_parser_unbuffered_errors)
|
||||||
|
|
||||||
/* {{{ zend_ini_do_op()
|
/* {{{ zend_ini_do_op()
|
||||||
*/
|
*/
|
||||||
static void zend_ini_do_op(char type, zval *result, zval *op1, zval *op2)
|
static void zend_ini_do_op(char type, zval *result, zval *op1, zval *op2)
|
||||||
|
@ -86,7 +88,7 @@ static void zend_ini_do_op(char type, zval *result, zval *op1, zval *op2)
|
||||||
}
|
}
|
||||||
|
|
||||||
str_len = zend_sprintf(str_result, "%d", i_result);
|
str_len = zend_sprintf(str_result, "%d", i_result);
|
||||||
ZVAL_PSTRINGL(result, str_result, str_len);
|
ZVAL_NEW_STR(result, zend_string_init(str_result, str_len, ZEND_SYSTEM_INI));
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
||||||
|
@ -94,7 +96,11 @@ static void zend_ini_do_op(char type, zval *result, zval *op1, zval *op2)
|
||||||
*/
|
*/
|
||||||
static void zend_ini_init_string(zval *result)
|
static void zend_ini_init_string(zval *result)
|
||||||
{
|
{
|
||||||
ZVAL_EMPTY_PSTRING(result);
|
if (ZEND_SYSTEM_INI) {
|
||||||
|
ZVAL_EMPTY_PSTRING(result);
|
||||||
|
} else {
|
||||||
|
ZVAL_EMPTY_STRING(result);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
||||||
|
@ -107,7 +113,11 @@ static void zend_ini_add_string(zval *result, zval *op1, zval *op2)
|
||||||
if (Z_TYPE_P(op1) != IS_STRING) {
|
if (Z_TYPE_P(op1) != IS_STRING) {
|
||||||
zend_string *str = zval_get_string(op1);
|
zend_string *str = zval_get_string(op1);
|
||||||
/* ZEND_ASSERT(!Z_REFCOUNTED_P(op1)); */
|
/* ZEND_ASSERT(!Z_REFCOUNTED_P(op1)); */
|
||||||
ZVAL_PSTRINGL(op1, ZSTR_VAL(str), ZSTR_LEN(str));
|
if (ZEND_SYSTEM_INI) {
|
||||||
|
ZVAL_PSTRINGL(op1, ZSTR_VAL(str), ZSTR_LEN(str));
|
||||||
|
} else {
|
||||||
|
ZVAL_STR(op1, str);
|
||||||
|
}
|
||||||
zend_string_release(str);
|
zend_string_release(str);
|
||||||
}
|
}
|
||||||
op1_len = (int)Z_STRLEN_P(op1);
|
op1_len = (int)Z_STRLEN_P(op1);
|
||||||
|
@ -117,7 +127,7 @@ static void zend_ini_add_string(zval *result, zval *op1, zval *op2)
|
||||||
}
|
}
|
||||||
length = op1_len + (int)Z_STRLEN_P(op2);
|
length = op1_len + (int)Z_STRLEN_P(op2);
|
||||||
|
|
||||||
ZVAL_NEW_STR(result, zend_string_extend(Z_STR_P(op1), length, 1));
|
ZVAL_NEW_STR(result, zend_string_extend(Z_STR_P(op1), length, ZEND_SYSTEM_INI));
|
||||||
memcpy(Z_STRVAL_P(result) + op1_len, Z_STRVAL_P(op2), Z_STRLEN_P(op2) + 1);
|
memcpy(Z_STRVAL_P(result) + op1_len, Z_STRVAL_P(op2), Z_STRLEN_P(op2) + 1);
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
@ -140,7 +150,7 @@ static void zend_ini_get_constant(zval *result, zval *name)
|
||||||
convert_to_string(&tmp);
|
convert_to_string(&tmp);
|
||||||
c = &tmp;
|
c = &tmp;
|
||||||
}
|
}
|
||||||
ZVAL_PSTRINGL(result, Z_STRVAL_P(c), Z_STRLEN_P(c));
|
ZVAL_NEW_STR(result, zend_string_init(Z_STRVAL_P(c), Z_STRLEN_P(c), ZEND_SYSTEM_INI));
|
||||||
if (c == &tmp) {
|
if (c == &tmp) {
|
||||||
zend_string_release(Z_STR(tmp));
|
zend_string_release(Z_STR(tmp));
|
||||||
}
|
}
|
||||||
|
@ -160,11 +170,11 @@ static void zend_ini_get_var(zval *result, zval *name)
|
||||||
|
|
||||||
/* Fetch configuration option value */
|
/* Fetch configuration option value */
|
||||||
if ((curval = zend_get_configuration_directive(Z_STR_P(name))) != NULL) {
|
if ((curval = zend_get_configuration_directive(Z_STR_P(name))) != NULL) {
|
||||||
ZVAL_PSTRINGL(result, Z_STRVAL_P(curval), Z_STRLEN_P(curval));
|
ZVAL_NEW_STR(result, zend_string_init(Z_STRVAL_P(curval), Z_STRLEN_P(curval), ZEND_SYSTEM_INI));
|
||||||
/* ..or if not found, try ENV */
|
/* ..or if not found, try ENV */
|
||||||
} else if ((envvar = zend_getenv(Z_STRVAL_P(name), Z_STRLEN_P(name))) != NULL ||
|
} else if ((envvar = zend_getenv(Z_STRVAL_P(name), Z_STRLEN_P(name))) != NULL ||
|
||||||
(envvar = getenv(Z_STRVAL_P(name))) != NULL) {
|
(envvar = getenv(Z_STRVAL_P(name))) != NULL) {
|
||||||
ZVAL_PSTRING(result, envvar);
|
ZVAL_NEW_STR(result, zend_string_init(envvar, strlen(envvar), ZEND_SYSTEM_INI));
|
||||||
} else {
|
} else {
|
||||||
zend_ini_init_string(result);
|
zend_ini_init_string(result);
|
||||||
}
|
}
|
||||||
|
@ -282,6 +292,8 @@ ZEND_API int zend_parse_ini_string(char *str, zend_bool unbuffered_errors, int s
|
||||||
%left '|' '&' '^'
|
%left '|' '&' '^'
|
||||||
%right '~' '!'
|
%right '~' '!'
|
||||||
|
|
||||||
|
%destructor { zval_ptr_dtor(&$$); } TC_RAW TC_CONSTANT TC_NUMBER TC_STRING TC_WHITESPACE TC_LABEL TC_OFFSET TC_VARNAME BOOL_TRUE BOOL_FALSE NULL_NULL
|
||||||
|
|
||||||
%%
|
%%
|
||||||
|
|
||||||
statement_list:
|
statement_list:
|
||||||
|
|
|
@ -110,6 +110,8 @@ ZEND_API ts_rsrc_id ini_scanner_globals_id;
|
||||||
ZEND_API zend_ini_scanner_globals ini_scanner_globals;
|
ZEND_API zend_ini_scanner_globals ini_scanner_globals;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define ZEND_SYSTEM_INI CG(ini_parser_unbuffered_errors)
|
||||||
|
|
||||||
/* Eat leading whitespace */
|
/* Eat leading whitespace */
|
||||||
#define EAT_LEADING_WHITESPACE() \
|
#define EAT_LEADING_WHITESPACE() \
|
||||||
while (yyleng) { \
|
while (yyleng) { \
|
||||||
|
@ -137,7 +139,7 @@ ZEND_API zend_ini_scanner_globals ini_scanner_globals;
|
||||||
#define EAT_TRAILING_WHITESPACE() EAT_TRAILING_WHITESPACE_EX('X')
|
#define EAT_TRAILING_WHITESPACE() EAT_TRAILING_WHITESPACE_EX('X')
|
||||||
|
|
||||||
#define zend_ini_copy_value(retval, str, len) \
|
#define zend_ini_copy_value(retval, str, len) \
|
||||||
ZVAL_NEW_STR(retval, zend_string_init(str, len, 1))
|
ZVAL_NEW_STR(retval, zend_string_init(str, len, ZEND_SYSTEM_INI))
|
||||||
|
|
||||||
|
|
||||||
#define RETURN_TOKEN(type, str, len) { \
|
#define RETURN_TOKEN(type, str, len) { \
|
||||||
|
|
|
@ -5796,8 +5796,6 @@ PHP_FUNCTION(move_uploaded_file)
|
||||||
*/
|
*/
|
||||||
static void php_simple_ini_parser_cb(zval *arg1, zval *arg2, zval *arg3, int callback_type, zval *arr)
|
static void php_simple_ini_parser_cb(zval *arg1, zval *arg2, zval *arg3, int callback_type, zval *arr)
|
||||||
{
|
{
|
||||||
zval element;
|
|
||||||
|
|
||||||
switch (callback_type) {
|
switch (callback_type) {
|
||||||
|
|
||||||
case ZEND_INI_PARSER_ENTRY:
|
case ZEND_INI_PARSER_ENTRY:
|
||||||
|
@ -5805,8 +5803,8 @@ static void php_simple_ini_parser_cb(zval *arg1, zval *arg2, zval *arg3, int cal
|
||||||
/* bare string - nothing to do */
|
/* bare string - nothing to do */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
ZVAL_DUP(&element, arg2);
|
Z_TRY_ADDREF_P(arg2);
|
||||||
zend_symtable_update(Z_ARRVAL_P(arr), Z_STR_P(arg1), &element);
|
zend_symtable_update(Z_ARRVAL_P(arr), Z_STR_P(arg1), arg2);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ZEND_INI_PARSER_POP_ENTRY:
|
case ZEND_INI_PARSER_POP_ENTRY:
|
||||||
|
@ -5836,12 +5834,11 @@ static void php_simple_ini_parser_cb(zval *arg1, zval *arg2, zval *arg3, int cal
|
||||||
array_init(find_hash);
|
array_init(find_hash);
|
||||||
}
|
}
|
||||||
|
|
||||||
ZVAL_DUP(&element, arg2);
|
|
||||||
if (!arg3 || (Z_TYPE_P(arg3) == IS_STRING && Z_STRLEN_P(arg3) == 0)) {
|
if (!arg3 || (Z_TYPE_P(arg3) == IS_STRING && Z_STRLEN_P(arg3) == 0)) {
|
||||||
add_next_index_zval(find_hash, &element);
|
Z_TRY_ADDREF_P(arg2);
|
||||||
|
add_next_index_zval(find_hash, arg2);
|
||||||
} else {
|
} else {
|
||||||
array_set_zval_key(Z_ARRVAL_P(find_hash), arg3, &element);
|
array_set_zval_key(Z_ARRVAL_P(find_hash), arg3, arg2);
|
||||||
zval_ptr_dtor(&element);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue