]> granicus.if.org Git - php/commit
Fix #79922: Crash after multiple calls to xml_parser_free()
authorChristoph M. Becker <cmbecker69@gmx.de>
Mon, 10 Aug 2020 08:40:31 +0000 (10:40 +0200)
committerChristoph M. Becker <cmbecker69@gmx.de>
Mon, 10 Aug 2020 10:23:44 +0000 (12:23 +0200)
commit0af3f493121f8eb5f71051303c5ee1a42a81fc6f
treeefd307aa7d82397faf96300a748b6ba3e6f6671c
parent5be670265b261f2c0162ba89827f5652ba584b05
Fix #79922: Crash after multiple calls to xml_parser_free()

We must not call `zend_list_delete()` in resource closer functions
exposed to userland, because decreasing the refcount there leads to
use-after-free scenarios.  In this case, commit 4a42fbb worked for
typical use-cases where `xml_parser_free()` has been called exactly
once for the resource, because there is an internal zval (`->index`)
referencing the same resource which already increased the refcount by
one.  However, when `xml_parser_free()` is called multiple times on the
same XML parser resource, the resource would be freed prematurely.

Instead we forcefully close the resource in `xml_parser_free()`.  We
also could decrease the refcount of the resource there, but that would
require to call `xml_parser_free()` which is somewhat uncommon, and
would be particularly bad wrt. PHP 8 where that function is a NOP, and
as such doesn't have to be called.  So we do no longer increase the
refcount of the resource when copying it to the internal zval, and let
the usualy refcounting semantics take care of the resource destruction.

[1] <http://git.php.net/?p=php-src.git;a=commit;h=4a42fbbbc73aad7427aef5c89974d1833636e082>
NEWS
ext/xml/tests/bug79922.phpt [new file with mode: 0644]
ext/xml/xml.c