mirror of
https://gitlab.gnome.org/GNOME/libxml2.git
synced 2025-10-26 00:37:43 +03:00
Fix regression with librsvg
Instead of using xmlCreateIOParserCtxt, librsvg pushes its own
xmlParserInput on top of a memory push parser. This incorrect use of
the API confuses several parser checks and, since 2.9.5, completely
breaks documents with internal subsets. Work around the problem with
internal subsets.
Thanks to Petr Sumbera for the report:
https://mail.gnome.org/archives/xml/2017-September/msg00011.html
Also see
https://bugzilla.gnome.org/show_bug.cgi?id=787895
This commit is contained in:
5
parser.c
5
parser.c
@@ -8271,6 +8271,7 @@ xmlParseInternalSubset(xmlParserCtxtPtr ctxt) {
|
||||
* Is there any DTD definition ?
|
||||
*/
|
||||
if (RAW == '[') {
|
||||
int baseInputNr = ctxt->inputNr;
|
||||
ctxt->instate = XML_PARSER_DTD;
|
||||
NEXT;
|
||||
/*
|
||||
@@ -8278,7 +8279,7 @@ xmlParseInternalSubset(xmlParserCtxtPtr ctxt) {
|
||||
* PEReferences.
|
||||
* Subsequence (markupdecl | PEReference | S)*
|
||||
*/
|
||||
while (((RAW != ']') || (ctxt->inputNr > 1)) &&
|
||||
while (((RAW != ']') || (ctxt->inputNr > baseInputNr)) &&
|
||||
(ctxt->instate != XML_PARSER_EOF)) {
|
||||
const xmlChar *check = CUR_PTR;
|
||||
unsigned int cons = ctxt->input->consumed;
|
||||
@@ -8290,7 +8291,7 @@ xmlParseInternalSubset(xmlParserCtxtPtr ctxt) {
|
||||
if ((CUR_PTR == check) && (cons == ctxt->input->consumed)) {
|
||||
xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR,
|
||||
"xmlParseInternalSubset: error detected in Markup declaration\n");
|
||||
if (ctxt->inputNr > 1)
|
||||
if (ctxt->inputNr > baseInputNr)
|
||||
xmlPopInput(ctxt);
|
||||
else
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user