diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2019-02-26 15:32:18 +0100 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2019-06-05 14:25:07 +0200 |
commit | a31f46421d7bf6f55dd9ac5876b8e2eacf7e0708 (patch) | |
tree | 24ffd7c5ae5e321c3994048fdd0fd9f68ae7457c /ext/xsl/xsltprocessor.c | |
parent | 528aa7932a839fc6319979c34aa372805d8dc41c (diff) | |
download | php-git-a31f46421d7bf6f55dd9ac5876b8e2eacf7e0708.tar.gz |
Allow exceptions in __toString()
RFC: https://wiki.php.net/rfc/tostring_exceptions
And convert some object to string conversion related recoverable
fatal errors into Error exceptions.
Improve exception safety of internal code performing string
conversions.
Diffstat (limited to 'ext/xsl/xsltprocessor.c')
-rw-r--r-- | ext/xsl/xsltprocessor.c | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/ext/xsl/xsltprocessor.c b/ext/xsl/xsltprocessor.c index 18443f9efa..919006041a 100644 --- a/ext/xsl/xsltprocessor.c +++ b/ext/xsl/xsltprocessor.c @@ -150,7 +150,10 @@ static char **php_xsl_xslt_make_params(HashTable *parht, int xpath_params) return NULL; } else { if (Z_TYPE_P(value) != IS_STRING) { - convert_to_string(value); + if (!try_convert_to_string(value)) { + efree(params); + return NULL; + } } if (!xpath_params) { @@ -753,13 +756,16 @@ PHP_FUNCTION(xsl_xsltprocessor_set_parameter) if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS(), "sa", &namespace, &namespace_len, &array_value) == SUCCESS) { intern = Z_XSL_P(id); ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(array_value), string_key, entry) { + zval tmp; if (string_key == NULL) { php_error_docref(NULL, E_WARNING, "Invalid parameter array"); RETURN_FALSE; } - convert_to_string_ex(entry); - Z_TRY_ADDREF_P(entry); - zend_hash_update(intern->parameter, string_key, entry); + ZVAL_STR(&tmp, zval_get_string(entry)); + if (EG(exception)) { + return; + } + zend_hash_update(intern->parameter, string_key, &tmp); } ZEND_HASH_FOREACH_END(); RETURN_TRUE; } else if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS(), "sSS", &namespace, &namespace_len, &name, &value) == SUCCESS) { @@ -841,9 +847,13 @@ PHP_FUNCTION(xsl_xsltprocessor_register_php_functions) intern = Z_XSL_P(id); ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(array_value), entry) { - convert_to_string_ex(entry); - ZVAL_LONG(&new_string ,1); - zend_hash_update(intern->registered_phpfunctions, Z_STR_P(entry), &new_string); + zend_string *str = zval_get_string(entry); + if (EG(exception)) { + return; + } + ZVAL_LONG(&new_string, 1); + zend_hash_update(intern->registered_phpfunctions, str, &new_string); + zend_string_release(str); } ZEND_HASH_FOREACH_END(); intern->registerPhpFunctions = 2; |