@@ -1345,7 +1345,17 @@ const char *dom_get_valid_file_path(const char *source, char *resolved_path, int
1345
1345
}
1346
1346
/* }}} */
1347
1347
1348
- xmlDocPtr dom_document_parser (zval * id , dom_load_mode mode , const char * source , size_t source_len , size_t options , xmlCharEncodingHandlerPtr encoding ) /* {{{ */
1348
+ static int dom_stream_read (void * context , char * buffer , int len )
1349
+ {
1350
+ zend_resource * resource = context ;
1351
+ if (EXPECTED (resource -> ptr )) {
1352
+ php_stream * stream = resource -> ptr ;
1353
+ return php_stream_read (stream , buffer , len );
1354
+ }
1355
+ return -1 ;
1356
+ }
1357
+
1358
+ xmlDocPtr dom_document_parser (zval * id , dom_load_mode mode , dom_source_union source , size_t options , xmlCharEncodingHandlerPtr encoding , const char * override_document_uri ) /* {{{ */
1349
1359
{
1350
1360
xmlDocPtr ret ;
1351
1361
xmlParserCtxtPtr ctxt = NULL ;
@@ -1371,16 +1381,18 @@ xmlDocPtr dom_document_parser(zval *id, dom_load_mode mode, const char *source,
1371
1381
xmlInitParser ();
1372
1382
1373
1383
if (mode == DOM_LOAD_FILE ) {
1374
- if (CHECK_NULL_PATH (source , source_len )) {
1384
+ if (CHECK_NULL_PATH (source . str , source . str_len )) {
1375
1385
zend_argument_value_error (1 , "must not contain any null bytes" );
1376
1386
return NULL ;
1377
1387
}
1378
- const char * file_dest = dom_get_valid_file_path (source , resolved_path , MAXPATHLEN );
1388
+ const char * file_dest = dom_get_valid_file_path (source . str , resolved_path , MAXPATHLEN );
1379
1389
if (file_dest ) {
1380
1390
ctxt = xmlCreateFileParserCtxt (file_dest );
1381
1391
}
1392
+ } else if (mode == DOM_LOAD_STRING ) {
1393
+ ctxt = xmlCreateMemoryParserCtxt (source .str , source .str_len );
1382
1394
} else {
1383
- ctxt = xmlCreateMemoryParserCtxt ( source , source_len );
1395
+ ctxt = xmlCreateIOParserCtxt ( NULL , NULL , dom_stream_read , NULL , source . stream -> res , XML_CHAR_ENCODING_NONE );
1384
1396
}
1385
1397
1386
1398
if (ctxt == NULL ) {
@@ -1393,7 +1405,7 @@ xmlDocPtr dom_document_parser(zval *id, dom_load_mode mode, const char *source,
1393
1405
}
1394
1406
1395
1407
/* If loading from memory, we need to set the base directory for the document */
1396
- if (mode != DOM_LOAD_FILE ) {
1408
+ if (mode == DOM_LOAD_STRING ) {
1397
1409
#ifdef HAVE_GETCWD
1398
1410
directory = VCWD_GETCWD (resolved_path , MAXPATHLEN );
1399
1411
#elif defined(HAVE_GETWD )
@@ -1410,6 +1422,11 @@ xmlDocPtr dom_document_parser(zval *id, dom_load_mode mode, const char *source,
1410
1422
}
1411
1423
ctxt -> directory = (char * ) xmlCanonicPath ((const xmlChar * ) resolved_path );
1412
1424
}
1425
+ } else if (override_document_uri ) {
1426
+ if (ctxt -> directory != NULL ) {
1427
+ xmlFree (ctxt -> directory );
1428
+ }
1429
+ ctxt -> directory = (char * ) xmlCanonicPath ((const xmlChar * ) override_document_uri );
1413
1430
}
1414
1431
1415
1432
ctxt -> vctxt .error = php_libxml_ctx_error ;
@@ -1507,21 +1524,20 @@ static void php_dom_finish_loading_document(zval *this, zval *return_value, xmlD
1507
1524
RETURN_TRUE ;
1508
1525
}
1509
1526
1510
- static void dom_parse_document (INTERNAL_FUNCTION_PARAMETERS , int mode )
1527
+ static void dom_legacy_parse_document (INTERNAL_FUNCTION_PARAMETERS , int mode )
1511
1528
{
1512
- char * source ;
1513
- size_t source_len ;
1529
+ dom_source_union source ;
1514
1530
zend_long options = 0 ;
1515
1531
1516
- if (zend_parse_parameters (ZEND_NUM_ARGS (), "s|l" , & source , & source_len , & options ) == FAILURE ) {
1532
+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "s|l" , & source . str , & source . str_len , & options ) == FAILURE ) {
1517
1533
RETURN_THROWS ();
1518
1534
}
1519
1535
1520
- if (!source_len ) {
1536
+ if (!source . str_len ) {
1521
1537
zend_argument_must_not_be_empty_error (1 );
1522
1538
RETURN_THROWS ();
1523
1539
}
1524
- if (ZEND_SIZE_T_INT_OVFL (source_len )) {
1540
+ if (ZEND_SIZE_T_INT_OVFL (source . str_len )) {
1525
1541
php_error_docref (NULL , E_WARNING , "Input string is too long" );
1526
1542
RETURN_FALSE ;
1527
1543
}
@@ -1530,7 +1546,7 @@ static void dom_parse_document(INTERNAL_FUNCTION_PARAMETERS, int mode)
1530
1546
RETURN_FALSE ;
1531
1547
}
1532
1548
1533
- xmlDocPtr newdoc = dom_document_parser (ZEND_THIS , mode , source , source_len , options , NULL );
1549
+ xmlDocPtr newdoc = dom_document_parser (ZEND_THIS , mode , source , options , NULL , NULL );
1534
1550
if (newdoc == DOM_DOCUMENT_MALFORMED ) {
1535
1551
newdoc = NULL ;
1536
1552
}
@@ -1542,7 +1558,7 @@ Since: DOM Level 3
1542
1558
*/
1543
1559
PHP_METHOD (DOMDocument , load )
1544
1560
{
1545
- dom_parse_document (INTERNAL_FUNCTION_PARAM_PASSTHRU , DOM_LOAD_FILE );
1561
+ dom_legacy_parse_document (INTERNAL_FUNCTION_PARAM_PASSTHRU , DOM_LOAD_FILE );
1546
1562
}
1547
1563
/* }}} end dom_document_load */
1548
1564
@@ -1551,7 +1567,7 @@ Since: DOM Level 3
1551
1567
*/
1552
1568
PHP_METHOD (DOMDocument , loadXML )
1553
1569
{
1554
- dom_parse_document (INTERNAL_FUNCTION_PARAM_PASSTHRU , DOM_LOAD_STRING );
1570
+ dom_legacy_parse_document (INTERNAL_FUNCTION_PARAM_PASSTHRU , DOM_LOAD_STRING );
1555
1571
}
1556
1572
/* }}} end dom_document_loadxml */
1557
1573
0 commit comments