Bug #81351 [PATCH]: xml_parse may fail, but has no error code
| From: | cmb@php.net | Date: | Thu, 12 Aug 2021 14:34:21 +0000 |
| Subject: | Bug #81351 [PATCH]: xml_parse may fail, but has no error code | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-235794@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=81351&edit=1
ID: 81351
Patch added by: cmb@php.net
Reported by: dave dot lampert at rpm6 dot com
Summary: xml_parse may fail, but has no error code
Status: Verified
Type: Bug
Package: *XML functions
Operating System: Windows
PHP Version: 8.0.9
Assigned To: cmb
Block user comment: N
Private report: N
New Comment:
The following pull request has been associated:
Patch Name: Fix #81351: xml_parse may fail, but has no error code
On GitHub: https://github.com/php/php-src/pull/7363
Patch: https://github.com/php/php-src/pull/7363.patch
Previous Comments:
------------------------------------------------------------------------
[2021-08-12 13:45:21] cmb@php.net
I can confirm the behavior. The problem is the handling of
warnings. xml_get_error_code() returns 0 for these, but
xml_parse() bails out early, if a warning had already been raised.
You can see that when dumping the result of
libxml_get_last_error() after the first xml_parse():
object(LibXMLError)#2 (6) {
["level"]=>
int(1)
["code"]=>
int(100)
["column"]=>
int(239)
["message"]=>
string(39) "xmlns: URI example.org is not absolute
"
["file"]=>
string(0) ""
["line"]=>
int(1)
}
Ah, actually this is a regression by an unappropriate fix for bug
#73135.
------------------------------------------------------------------------
[2021-08-11 19:08:16] dave dot lampert at rpm6 dot com
See also https://paiza.io/projects/YqtMZmN079wvnbHbQcGz_Q
to test it out. It won't fail if you combine the two strings and parse all at once.
------------------------------------------------------------------------
[2021-08-11 19:04:56] dave dot lampert at rpm6 dot com
Description:
------------
---
From manual page: https://php.net/function.xml-parse
---
If xml_parse tries to parse XML containing <X xmlns="something">, it sees that
"something" doesn't start with "http://" or
"https://", so xml_parse returns 0; however,
xml_get_error_code also returns 0 ("No error"). This only happens when parsing in
fragments near that bad XML namespace.
Test script:
---------------
<?php
class XMLProcessor
{
public function test()
{
$bad_xmlns = true;
$parser = xml_parser_create_ns('UTF-8');
xml_set_object($parser, $this);
$success = xml_parse($parser, '<?xml version="1.0"
encoding="utf-8"?><soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><X
xmlns="'.($bad_xmlns ? '' : 'http://').'example.org"><', false);
$code = xml_get_error_code($parser);
$error = xml_error_string($code);
echo "xml_parse returned $success, xml_get_error_code = $code, xml_error_string =
$error\r\n";
$success = xml_parse($parser, 'Y>', false);
$code = xml_get_error_code($parser);
$error = xml_error_string($code);
echo "xml_parse returned $success, xml_get_error_code = $code, xml_error_string =
$error\r\n";
}
}
(new XMLProcessor())->test();
Expected result:
----------------
xml_parse returned 1, xml_get_error_code = 0, xml_error_string = No error
xml_parse returned 0, xml_get_error_code = {some number), xml_error_string = {some description}
Actual result:
--------------
xml_parse returned 1, xml_get_error_code = 0, xml_error_string = No error
xml_parse returned 0, xml_get_error_code = 0, xml_error_string = No error
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=81351&edit=1