From b5dab1b9dc15400c40ac2e25d3204c62757f12e4 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 18 Apr 2006 13:08:11 +0000 Subject: [PATCH] Fixed bug #37083 (Frequent crashs in SOAP extension with new WSDL caching code in multithread WS). (Andrei, Dmitry) --- ext/soap/php_sdl.c | 15 +++-- ext/soap/tests/bugs/bug37083.phpt | 58 ++++++++++++++++++ ext/soap/tests/bugs/bug37083.wsdl | 99 +++++++++++++++++++++++++++++++ 3 files changed, 167 insertions(+), 5 deletions(-) create mode 100755 ext/soap/tests/bugs/bug37083.phpt create mode 100755 ext/soap/tests/bugs/bug37083.wsdl diff --git a/ext/soap/php_sdl.c b/ext/soap/php_sdl.c index ba7fa5ad57..455b965391 100644 --- a/ext/soap/php_sdl.c +++ b/ext/soap/php_sdl.c @@ -143,13 +143,18 @@ encodePtr get_encoder(sdlPtr sdl, const char *ns, const char *type) enc = get_encoder_ex(NULL, enc_nscat, enc_len); efree(enc_nscat); if (enc && sdl) { - encodePtr new_enc = emalloc(sizeof(encode)); + encodePtr new_enc = pemalloc(sizeof(encode), sdl->is_persistent); memcpy(new_enc, enc, sizeof(encode)); - new_enc->details.ns = estrndup(ns, ns_len); - new_enc->details.type_str = estrdup(new_enc->details.type_str); + if (sdl->is_persistent) { + new_enc->details.ns = zend_strndup(ns, ns_len); + new_enc->details.type_str = strdup(new_enc->details.type_str); + } else { + new_enc->details.ns = estrndup(ns, ns_len); + new_enc->details.type_str = estrdup(new_enc->details.type_str); + } if (sdl->encoders == NULL) { - sdl->encoders = emalloc(sizeof(HashTable)); - zend_hash_init(sdl->encoders, 0, NULL, delete_encoder, 0); + sdl->encoders = pemalloc(sizeof(HashTable), sdl->is_persistent); + zend_hash_init(sdl->encoders, 0, NULL, delete_encoder, sdl->is_persistent); } zend_hash_update(sdl->encoders, nscat, len + 1, &new_enc, sizeof(encodePtr), NULL); enc = new_enc; diff --git a/ext/soap/tests/bugs/bug37083.phpt b/ext/soap/tests/bugs/bug37083.phpt new file mode 100755 index 0000000000..77e9181a92 --- /dev/null +++ b/ext/soap/tests/bugs/bug37083.phpt @@ -0,0 +1,58 @@ +--TEST-- +Bug #37083 (Frequent crashs in SOAP extension with new WSDL caching code in multithread WS) +--SKIPIF-- + +--INI-- +soap.wsdl_cache_enabled=0 +--FILE-- + + + + + + +0343501 +oai:dlmd.ifremer.fr:59001680.13684115xml1 +oai:dlmd.ifremer.fr:59000390.13684115xml2 +oai:dlmd.ifremer.fr:59000400.13684115xml3 +oai:dlmd.ifremer.fr:415340.13684115xml4 +oai:dlmd.ifremer.fr:59000380.13684115xml5 +oai:dlmd.ifremer.fr:29002290.13684115xml6 +oai:dlmd.ifremer.fr:29002280.13684115xml7 +oai:dlmd.ifremer.fr:29002300.13684115xml8 +oai:dlmd.ifremer.fr:29002350.13684115xml9 +oai:dlmd.ifremer.fr:59001960.13684115xml10 +maxDateTime2038-12-31T22:59:59.000ZminDateTime2004-12-01T04:58:00.000ZminLongitude105.539maxLongitude112.283maxLatitude-30.024minLatitude-34.788 +maxDateTime2038-12-31T22:59:59.000ZminDateTime2004-06-07T17:41:44.000ZminLongitude129.882maxLongitude133.635maxLatitude39.529minLatitude36.419 +maxDateTime2038-12-31T22:59:59.000ZminDateTime2004-03-10T01:40:00.000ZminLongitude63.121maxLongitude80.92maxLatitude0.158minLatitude-3.675 +maxDateTime2038-12-31T22:59:59.000ZminDateTime2003-01-12T05:15:00.000ZminLongitude-42.88maxLongitude-20.85maxLatitude61.41minLatitude43.2 +maxDateTime2038-12-31T22:59:59.000ZminDateTime2004-12-01T16:50:00.000ZminLongitude108.962maxLongitude114.713maxLatitude-35.262minLatitude-42.756 +maxDateTime2038-12-31T22:59:59.000ZminDateTime2003-10-10T11:52:00.000ZminLongitude68.14maxLongitude95.987maxLatitude3.97minLatitude-1.242 +maxDateTime2038-12-31T22:59:59.000ZminDateTime2004-01-10T10:35:00.000ZminLongitude67.71maxLongitude77.743maxLatitude3.546minLatitude-1.965 +maxDateTime2038-12-31T22:59:59.000ZminDateTime2004-04-09T23:00:00.000ZminLongitude59.116maxLongitude69.206maxLatitude-2.274minLatitude-4.093 +maxDateTime2038-12-31T22:59:59.000ZminDateTime2002-11-09T23:10:00.000ZminLongitude156.013maxLongitude160.042maxLatitude5.648minLatitude4.773 +maxDateTime2038-12-31T22:59:59.000ZminDateTime2004-11-01T16:58:00.000ZminLongitude108.11maxLongitude113.383maxLatitude-31.666minLatitude-35.075 + +EOF; + } +} +for ($i = 0; $i < 10; $i++) { + $ws=new TestSoapClient(dirname(__FILE__).'/bug37083.wsdl', + array('encoding'=>'ISO-8859-1', + 'cache_wsdl'=>1)); + $search=new stdClass(); + $search->queryString='argo'; + $search->ranges[]=$r=new stdClass(); + $r->field='maxDateTime'; + $r->min='2003-04-01'; + $search->index='all'; + $res=$ws->search($search,0,10); +} +echo "ok\n"; +?> +--EXPECT-- +ok diff --git a/ext/soap/tests/bugs/bug37083.wsdl b/ext/soap/tests/bugs/bug37083.wsdl new file mode 100755 index 0000000000..2a3b379802 --- /dev/null +++ b/ext/soap/tests/bugs/bug37083.wsdl @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- 2.50.1