From 6d2bc7253018baa57487f622e706b8962c16d148 Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Fri, 23 Oct 2020 11:06:30 +0200 Subject: [PATCH] Fix #80268: loadHTML() truncates at NUL bytes libxml2 has no particular issues parsing HTML strings with NUL bytes; these just cause truncation of the current text content, but parsing continues generally. Since `::loadHTMLFile()` already supports NUL bytes, `::loadHTML()` should as well. Note that this is different from XML, which does not allow any NUL bytes. Closes GH-6368. --- NEWS | 3 +++ ext/dom/document.c | 1 - ext/dom/tests/bug80268.phpt | 24 ++++++++++++++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 ext/dom/tests/bug80268.phpt diff --git a/NEWS b/NEWS index 8a1ea004e04..6d74ead2b98 100644 --- a/NEWS +++ b/NEWS @@ -11,6 +11,9 @@ PHP NEWS - COM: . Fixed bug #62474 (com_event_sink crashes on certain arguments). (cmb) +- DOM: + . Fixed bug #80268 (loadHTML() truncates at NUL bytes). (cmb) + - IMAP: . Fixed bug #64076 (imap_sort() does not return FALSE on failure). (cmb) . Fixed bug #76618 (segfault on imap_reopen). (girgias) diff --git a/ext/dom/document.c b/ext/dom/document.c index 22bb90d5d88..0e15e7a1106 100644 --- a/ext/dom/document.c +++ b/ext/dom/document.c @@ -2024,7 +2024,6 @@ static void dom_load_html(INTERNAL_FUNCTION_PARAMETERS, int mode) /* {{{ */ } ctxt = htmlCreateFileParserCtxt(source, NULL); } else { - source_len = xmlStrlen((xmlChar *) source); if (ZEND_SIZE_T_INT_OVFL(source_len)) { php_error_docref(NULL, E_WARNING, "Input string is too long"); RETURN_FALSE; diff --git a/ext/dom/tests/bug80268.phpt b/ext/dom/tests/bug80268.phpt new file mode 100644 index 00000000000..0fe50b85e86 --- /dev/null +++ b/ext/dom/tests/bug80268.phpt @@ -0,0 +1,24 @@ +--TEST-- +Bug #80268 (loadHTML() truncates at NUL bytes) +--SKIPIF-- + +--FILE-- +loadHTML("

foo\0bar

"); +$html = $doc->saveHTML(); +var_dump(strpos($html, '

foo

') !== false); + +file_put_contents(__DIR__ . '/80268.html', "

foo\0bar

"); +$doc = new DOMDocument; +$doc->loadHTMLFile(__DIR__ . '/80268.html'); +$html = $doc->saveHTML(); +var_dump(strpos($html, '

foo

') !== false); +?> +--CLEAN-- + +--EXPECT-- +bool(true) +bool(true)