summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2018-01-01 21:23:10 +0100
committerNikita Popov <nikita.ppv@gmail.com>2018-01-01 21:29:24 +0100
commitd534d59bd81798a9dfb0dd7bed2f0d1afe63fca6 (patch)
tree20600bb009e46da77ec7fe41d30f4e257f5d33e4 /ext
parent2fd0b994dd938e4bff8588323d378161388eb9ff (diff)
downloadphp-git-d534d59bd81798a9dfb0dd7bed2f0d1afe63fca6.tar.gz
Fixed bug #75502
The string keys were not duplicated into persistent memory in this case.
Diffstat (limited to 'ext')
-rw-r--r--ext/soap/php_sdl.c14
-rw-r--r--ext/soap/tests/bugs/bug75502.phpt16
2 files changed, 23 insertions, 7 deletions
diff --git a/ext/soap/php_sdl.c b/ext/soap/php_sdl.c
index b8f1911f69..eb22a0fa85 100644
--- a/ext/soap/php_sdl.c
+++ b/ext/soap/php_sdl.c
@@ -2397,12 +2397,6 @@ static void make_persistent_restriction_char_int(sdlRestrictionCharPtr *rest)
}
-static void make_persistent_restriction_char(zval *zv)
-{
- make_persistent_restriction_char_int((sdlRestrictionCharPtr*)&Z_PTR_P(zv));
-}
-
-
static void make_persistent_sdl_type_ref(sdlTypePtr *type, HashTable *ptr_map, HashTable *bp_types)
{
sdlTypePtr tmp;
@@ -2764,9 +2758,15 @@ static sdlTypePtr make_persistent_sdl_type(sdlTypePtr type, HashTable *ptr_map,
}
if (type->restrictions->enumeration) {
+ sdlRestrictionCharPtr tmp, penum;
ptype->restrictions->enumeration = malloc(sizeof(HashTable));
zend_hash_init(ptype->restrictions->enumeration, zend_hash_num_elements(type->restrictions->enumeration), NULL, delete_restriction_var_char_persistent, 1);
- zend_hash_copy(ptype->restrictions->enumeration, type->restrictions->enumeration, make_persistent_restriction_char);
+ ZEND_HASH_FOREACH_STR_KEY_PTR(type->restrictions->enumeration, key, tmp) {
+ penum = tmp;
+ make_persistent_restriction_char_int(&penum);
+ /* We have to duplicate key emalloc->malloc */
+ zend_hash_str_add_ptr(ptype->restrictions->enumeration, ZSTR_VAL(key), ZSTR_LEN(key), penum);
+ } ZEND_HASH_FOREACH_END();
}
}
diff --git a/ext/soap/tests/bugs/bug75502.phpt b/ext/soap/tests/bugs/bug75502.phpt
new file mode 100644
index 0000000000..43cd800556
--- /dev/null
+++ b/ext/soap/tests/bugs/bug75502.phpt
@@ -0,0 +1,16 @@
+--TEST--
+Bug #75502 (Segmentation fault in zend_string_release)
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--INI--
+soap.wsdl_cache_enabled=1
+soap.wsdl_cache=2
+--FILE--
+<?php
+/* The important part is that restriction>enumeration is used together with mem cache.
+ * Reuse a WSDL file contains this. */
+$client = new SoapClient(dirname(__FILE__)."/bug29236.wsdl");
+?>
+===DONE===
+--EXPECT--
+===DONE===