Bug #81351 [Opn->Ver]: xml_parse errs, but has no error code, when xmlns isn't a FQDN

From: Date: Thu, 12 Aug 2021 13:45:22 +0000
Subject: Bug #81351 [Opn->Ver]: xml_parse errs, but has no error code, when xmlns isn't a FQDN
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-235793@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
 Updated by:         cmb@php.net
 Reported by:        dave dot lampert at rpm6 dot com
 Summary:            xml_parse errs, but has no error code, when xmlns
                     isn't a FQDN
-Status:             Open
+Status:             Verified
 Type:               Bug
 Package:            *XML functions
 Operating System:   Windows
 PHP Version:        8.0.9
-Assigned To:        
+Assigned To:        cmb
 Block user comment: N
 Private report:     N

 New Comment:

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.


Previous Comments:
------------------------------------------------------------------------
[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


Thread (5 messages)

« previous php.bugs (#235793) next »