summaryrefslogtreecommitdiff
path: root/ext/soap/php_encoding.c
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2019-06-27 10:57:49 +0200
committerNikita Popov <nikita.ppv@gmail.com>2019-06-27 14:20:10 +0200
commit78375aa52f1f2ae79e2d014f24e15b48ef72bea7 (patch)
tree220f78276f11534189aae36fdcc2d0be096655ce /ext/soap/php_encoding.c
parentcfeda978dfa093f9d5da5a6fd6fa1090915bf418 (diff)
downloadphp-git-78375aa52f1f2ae79e2d014f24e15b48ef72bea7.tar.gz
Fix persistent XML memory leaks in SOAP
SOAP uses a horrible bailout based error handling approach -- avoid leaking persistent XML memory by catching bailouts in a number of places.
Diffstat (limited to 'ext/soap/php_encoding.c')
-rw-r--r--ext/soap/php_encoding.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/ext/soap/php_encoding.c b/ext/soap/php_encoding.c
index e88012af52..7e8a5da935 100644
--- a/ext/soap/php_encoding.c
+++ b/ext/soap/php_encoding.c
@@ -1519,7 +1519,13 @@ static zval *to_zval_object_ex(zval *ret, encodeTypePtr type, xmlNodePtr data, z
text = xmlNewText(BAD_CAST(str_val));
xmlAddChild(dummy, text);
ZVAL_NULL(&data);
- master_to_zval(&data, attr->encode, dummy);
+ /* TODO: There are other places using dummy nodes -- generalize? */
+ zend_try {
+ master_to_zval(&data, attr->encode, dummy);
+ } zend_catch {
+ xmlFreeNode(dummy);
+ zend_bailout();
+ } zend_end_try();
xmlFreeNode(dummy);
set_zval_property(ret, attr->name, &data);
}