mirror of
https://github.com/php/php-src.git
synced 2025-08-16 22:18:50 +02:00
Merge branch 'PHP-8.0'
* PHP-8.0: Fix #51903: simplexml_load_file() doesn't use HTTP headers
This commit is contained in:
commit
9f826e8ce9
2 changed files with 86 additions and 0 deletions
|
@ -361,6 +361,54 @@ php_libxml_input_buffer_create_filename(const char *URI, xmlCharEncoding enc)
|
||||||
return(NULL);
|
return(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Check if there's been an external transport protocol with an encoding information */
|
||||||
|
if (enc == XML_CHAR_ENCODING_NONE) {
|
||||||
|
php_stream *s = (php_stream *) context;
|
||||||
|
|
||||||
|
if (Z_TYPE(s->wrapperdata) == IS_ARRAY) {
|
||||||
|
zval *header;
|
||||||
|
|
||||||
|
ZEND_HASH_FOREACH_VAL_IND(Z_ARRVAL(s->wrapperdata), header) {
|
||||||
|
const char buf[] = "Content-Type:";
|
||||||
|
if (Z_TYPE_P(header) == IS_STRING &&
|
||||||
|
!zend_binary_strncasecmp(Z_STRVAL_P(header), Z_STRLEN_P(header), buf, sizeof(buf)-1, sizeof(buf)-1)) {
|
||||||
|
char *needle = estrdup("charset=");
|
||||||
|
char *haystack = estrndup(Z_STRVAL_P(header), Z_STRLEN_P(header));
|
||||||
|
char *encoding = php_stristr(haystack, needle, Z_STRLEN_P(header), sizeof("charset=")-1);
|
||||||
|
|
||||||
|
if (encoding) {
|
||||||
|
char *end;
|
||||||
|
|
||||||
|
encoding += sizeof("charset=")-1;
|
||||||
|
if (*encoding == '"') {
|
||||||
|
encoding++;
|
||||||
|
}
|
||||||
|
end = strchr(encoding, ';');
|
||||||
|
if (end == NULL) {
|
||||||
|
end = encoding + strlen(encoding);
|
||||||
|
}
|
||||||
|
end--; /* end == encoding-1 isn't a buffer underrun */
|
||||||
|
while (*end == ' ' || *end == '\t') {
|
||||||
|
end--;
|
||||||
|
}
|
||||||
|
if (*end == '"') {
|
||||||
|
end--;
|
||||||
|
}
|
||||||
|
if (encoding >= end) continue;
|
||||||
|
*(end+1) = '\0';
|
||||||
|
enc = xmlParseCharEncoding(encoding);
|
||||||
|
if (enc <= XML_CHAR_ENCODING_NONE) {
|
||||||
|
enc = XML_CHAR_ENCODING_NONE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
efree(haystack);
|
||||||
|
efree(needle);
|
||||||
|
break; /* found content-type */
|
||||||
|
}
|
||||||
|
} ZEND_HASH_FOREACH_END();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Allocate the Input buffer front-end. */
|
/* Allocate the Input buffer front-end. */
|
||||||
ret = xmlAllocParserInputBuffer(enc);
|
ret = xmlAllocParserInputBuffer(enc);
|
||||||
if (ret != NULL) {
|
if (ret != NULL) {
|
||||||
|
|
38
ext/libxml/tests/bug51903.phpt
Normal file
38
ext/libxml/tests/bug51903.phpt
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
--TEST--
|
||||||
|
Bug #51903 (simplexml_load_file() doesn't use HTTP headers)
|
||||||
|
--SKIPIF--
|
||||||
|
<?php
|
||||||
|
if (!extension_loaded('simplexml')) die('skip simplexml extension not available');
|
||||||
|
if (@!include "./ext/standard/tests/http/server.inc") die('skip server.inc not available');
|
||||||
|
http_server_skipif();
|
||||||
|
?>
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
require "./ext/standard/tests/http/server.inc";
|
||||||
|
$responses = [
|
||||||
|
"data://text/plain,HTTP/1.1 200 OK\r\n"
|
||||||
|
. "Content-Type: text/xml; charset=ISO-8859-1\r\n\r\n"
|
||||||
|
. "<?xml version=\"1.0\"?>\n"
|
||||||
|
. "<root>\xE4\xF6\xFC</root>\n",
|
||||||
|
"data://text/plain,HTTP/1.1 200 OK\r\n"
|
||||||
|
. "Content-Type: text/xml; charset=ISO-8859-1; foo=bar\r\n\r\n"
|
||||||
|
. "<?xml version=\"1.0\"?>\n"
|
||||||
|
. "<root>\xE4\xF6\xFC</root>\n",
|
||||||
|
"data://text/plain,HTTP/1.1 200 OK\r\n"
|
||||||
|
. "Content-Type: text/xml; charset=\"ISO-8859-1\" ; foo=bar\r\n\r\n"
|
||||||
|
. "<?xml version=\"1.0\"?>\n"
|
||||||
|
. "<root>\xE4\xF6\xFC</root>\n",
|
||||||
|
];
|
||||||
|
['pid' => $pid, 'uri' => $uri] = http_server($responses);
|
||||||
|
|
||||||
|
for ($i = 0; $i < count($responses); $i++) {
|
||||||
|
$sxe = simplexml_load_file($uri);
|
||||||
|
echo "$sxe\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
http_server_kill($pid);
|
||||||
|
?>
|
||||||
|
--EXPECT--
|
||||||
|
äöü
|
||||||
|
äöü
|
||||||
|
äöü
|
Loading…
Add table
Add a link
Reference in a new issue