Bug #79536 [Opn->Csd]: zend_clear_exception can not call exception destructor
| From: | laruence@php.net | Date: | Wed, 29 Apr 2020 10:59:42 +0000 |
| Subject: | Bug #79536 [Opn->Csd]: zend_clear_exception can not call exception destructor | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-226820@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=79536&edit=1
ID: 79536
Updated by: laruence@php.net
Reported by: laruence@php.net
Summary: zend_clear_exception can not call exception
destructor
-Status: Open
+Status: Closed
Type: Bug
Package: Scripting Engine problem
PHP Version: 7.3.17
Block user comment: N
Private report: N
New Comment:
Automatic comment on behalf of laruence@gmail.com
Revision: http://git.php.net/?p=php-src.git;a=commit;h=8555c2bff01291e00e4e6af9f0df3b4fe848a390
Log: Fixed bug #79536 (zend_clear_exception prevent exception's destructor to be called).
Previous Comments:
------------------------------------------------------------------------
[2020-04-29 10:55:20] laruence@php.net
Description:
------------
zend_clear_exception:
OBJ_RELEASE(EG(exception));
if the exception is refcount 1, and has __destruct, the destructor can not be called because
EG(exception) is set.
Test script:
---------------
it could be seen by soap.
<?php
$GLOBALS['HTTP_RAW_POST_DATA']="
<env:Envelope xmlns:env=\"http://schemas.xmlsoap.org/soap/envelope/\"
xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"
xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"
xmlns:enc=\"http://schemas.xmlsoap.org/soap/encoding/\"
xmlns:ns1=\"http://schemas.nothing.com\"
>
<env:Body>
<ns1:dotest2>
<dotest2 xsi:type=\"xsd:string\">???</dotest2>
</ns1:dotest2>
</env:Body>
<env:Header/>
</env:Envelope>";
class myFault extends SoapFault {
public function __destruct() {
}
}
function book_to_xml($book) {
throw new myFault("Server", "Conversion Fault");
}
class test{
function dotest2($str){
$book = new book;
$book->a = "foo";
$book->b = "bar";
return $book;
}
}
class book{
public $a="a";
public $b="c";
}
$options=Array(
'actor' =>'http://schemas.nothing.com',
'typemap' => array(array("type_ns" => "http://schemas.nothing.com",
"type_name" => "book",
"to_xml" => "book_to_xml"))
);
$server = new SoapServer(__DIR__."/classmap.wsdl",$options);
$server->setClass("test");
$server->handle($HTTP_RAW_POST_DATA);
echo "ok\n";
Expected result:
----------------
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Body><SOAP-ENV:Fault><faultcode>SOAP-ENV:Server</faultcode><faultstring>Conversion
Fault</faultstring></SOAP-ENV:Fault></SOAP-ENV:Body></SOAP-ENV:Envelope>
ok
Actual result:
--------------
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Body><SOAP-ENV:Fault><faultcode>SOAP-ENV:Server</faultcode><faultstring>Attempt
to destruct pending
exception</faultstring></SOAP-ENV:Fault></SOAP-ENV:Body></SOAP-ENV:Envelope>
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=79536&edit=1