Skip to content

Commit f00afae

Browse files
committed
Merge branch 'PHP-7.4'
* PHP-7.4: Fix #79191: Error in SoapClient ctor disables DOMDocument::save()
2 parents f8d7958 + 3fb41c2 commit f00afae

File tree

5 files changed

+66
-12
lines changed

5 files changed

+66
-12
lines changed

ext/libxml/libxml.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -354,9 +354,6 @@ static int php_libxml_streams_IO_read(void *context, char *buffer, int len)
354354

355355
static int php_libxml_streams_IO_write(void *context, const char *buffer, int len)
356356
{
357-
if (CG(unclean_shutdown)) {
358-
return -1;
359-
}
360357
return php_stream_write((php_stream*)context, buffer, len);
361358
}
362359

ext/libxml/tests/bug79191.phpt

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
--TEST--
2+
Bug #79191 (Error in SoapClient ctor disables DOMDocument::save())
3+
--SKIPIF--
4+
<?php
5+
if (!extension_loaded('soap')) die('skip soap extension not available');
6+
if (!extension_loaded('dom')) die('dom extension not available');
7+
?>
8+
--FILE--
9+
<?php
10+
try {
11+
new \SoapClient('does-not-exist.wsdl');
12+
} catch (Throwable $t) {
13+
}
14+
15+
$dom = new DOMDocument;
16+
$dom->loadxml('<?xml version="1.0" ?><root />');
17+
var_dump($dom->save(__DIR__ . '/bug79191.xml'));
18+
?>
19+
--CLEAN--
20+
<?php
21+
unlink(__DIR__ . '/bug79191.xml');
22+
?>
23+
--EXPECTF--
24+
int(%d)

ext/xmlwriter/php_xmlwriter.c

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -89,13 +89,12 @@ typedef int (*xmlwriter_read_int_t)(xmlTextWriterPtr writer);
8989

9090
static zend_object_handlers xmlwriter_object_handlers;
9191

92-
/* {{{ xmlwriter_object_free_storage */
93-
static void xmlwriter_object_free_storage(zend_object *object)
92+
/* {{{{ xmlwriter_object_dtor */
93+
static void xmlwriter_object_dtor(zend_object *object)
9494
{
9595
ze_xmlwriter_object *intern = php_xmlwriter_fetch_object(object);
96-
if (!intern) {
97-
return;
98-
}
96+
97+
/* freeing the resource here may leak, but otherwise we may use it after it has been freed */
9998
if (intern->ptr) {
10099
xmlFreeTextWriter(intern->ptr);
101100
intern->ptr = NULL;
@@ -104,6 +103,15 @@ static void xmlwriter_object_free_storage(zend_object *object)
104103
xmlBufferFree(intern->output);
105104
intern->output = NULL;
106105
}
106+
zend_objects_destroy_object(object);
107+
}
108+
/* }}} */
109+
110+
/* {{{ xmlwriter_object_free_storage */
111+
static void xmlwriter_object_free_storage(zend_object *object)
112+
{
113+
ze_xmlwriter_object *intern = php_xmlwriter_fetch_object(object);
114+
107115
zend_object_std_dtor(&intern->std);
108116
}
109117
/* }}} */
@@ -1211,6 +1219,7 @@ static PHP_MINIT_FUNCTION(xmlwriter)
12111219

12121220
memcpy(&xmlwriter_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
12131221
xmlwriter_object_handlers.offset = XtOffsetOf(ze_xmlwriter_object, std);
1222+
xmlwriter_object_handlers.dtor_obj = xmlwriter_object_dtor;
12141223
xmlwriter_object_handlers.free_obj = xmlwriter_object_free_storage;
12151224
xmlwriter_object_handlers.clone_obj = NULL;
12161225
INIT_CLASS_ENTRY(ce, "XMLWriter", xmlwriter_class_functions);

ext/xmlwriter/tests/bug71536.phpt

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
--TEST--
2+
Bug #71536 (Access Violation crashes php-cgi.exe)
3+
--SKIPIF--
4+
<?php
5+
if (!extension_loaded('xmlwriter')) die('skip xmlwriter extension not available');
6+
?>
7+
--FILE--
8+
<?php
9+
class Test {
10+
public static function init()
11+
{
12+
$xml = new \XMLWriter();
13+
$xml->openUri('php://memory');
14+
$xml->setIndent(false);
15+
$xml->startDocument('1.0', 'UTF-8');
16+
$xml->startElement('response');
17+
die('now'); // crashed with die()
18+
}
19+
}
20+
21+
Test::init();
22+
?>
23+
--EXPECT--
24+
now

ext/xmlwriter/tests/bug79029.phpt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,13 @@ $x = array( new XMLWriter() );
1111
$x[0]->openUri("bug79029_1.txt");
1212
$x[0]->startComment();
1313

14-
$x = new XMLWriter();
15-
$x->openUri("bug79029_2.txt");
14+
$y = new XMLWriter();
15+
$y->openUri("bug79029_2.txt");
1616
fclose(@end(get_resources()));
1717

1818
file_put_contents("bug79029_3.txt", "a");
19-
$x = new XMLReader();
20-
$x->open("bug79029_3.txt");
19+
$z = new XMLReader();
20+
$z->open("bug79029_3.txt");
2121
fclose(@end(get_resources()));
2222
?>
2323
okey

0 commit comments

Comments
 (0)