mirror of
https://gitlab.gnome.org/GNOME/libxml2.git
synced 2025-03-09 04:58:16 +03:00
Don't switch encoding for internal parameter entities
This is only needed for external entities. Trying to switch the encoding for internal entities could also cause a memory leak in recovery mode.
This commit is contained in:
parent
03904159f8
commit
46dc989080
54
parser.c
54
parser.c
@ -8020,34 +8020,36 @@ xmlParsePEReference(xmlParserCtxtPtr ctxt)
|
||||
input = xmlNewEntityInputStream(ctxt, entity);
|
||||
if (xmlPushInput(ctxt, input) < 0)
|
||||
return;
|
||||
/*
|
||||
* Get the 4 first bytes and decode the charset
|
||||
* if enc != XML_CHAR_ENCODING_NONE
|
||||
* plug some encoding conversion routines.
|
||||
* Note that, since we may have some non-UTF8
|
||||
* encoding (like UTF16, bug 135229), the 'length'
|
||||
* is not known, but we can calculate based upon
|
||||
* the amount of data in the buffer.
|
||||
*/
|
||||
GROW
|
||||
if (ctxt->instate == XML_PARSER_EOF)
|
||||
return;
|
||||
if ((ctxt->input->end - ctxt->input->cur)>=4) {
|
||||
start[0] = RAW;
|
||||
start[1] = NXT(1);
|
||||
start[2] = NXT(2);
|
||||
start[3] = NXT(3);
|
||||
enc = xmlDetectCharEncoding(start, 4);
|
||||
if (enc != XML_CHAR_ENCODING_NONE) {
|
||||
xmlSwitchEncoding(ctxt, enc);
|
||||
|
||||
if (entity->etype == XML_EXTERNAL_PARAMETER_ENTITY) {
|
||||
/*
|
||||
* Get the 4 first bytes and decode the charset
|
||||
* if enc != XML_CHAR_ENCODING_NONE
|
||||
* plug some encoding conversion routines.
|
||||
* Note that, since we may have some non-UTF8
|
||||
* encoding (like UTF16, bug 135229), the 'length'
|
||||
* is not known, but we can calculate based upon
|
||||
* the amount of data in the buffer.
|
||||
*/
|
||||
GROW
|
||||
if (ctxt->instate == XML_PARSER_EOF)
|
||||
return;
|
||||
if ((ctxt->input->end - ctxt->input->cur)>=4) {
|
||||
start[0] = RAW;
|
||||
start[1] = NXT(1);
|
||||
start[2] = NXT(2);
|
||||
start[3] = NXT(3);
|
||||
enc = xmlDetectCharEncoding(start, 4);
|
||||
if (enc != XML_CHAR_ENCODING_NONE) {
|
||||
xmlSwitchEncoding(ctxt, enc);
|
||||
}
|
||||
}
|
||||
|
||||
if ((CMP5(CUR_PTR, '<', '?', 'x', 'm', 'l')) &&
|
||||
(IS_BLANK_CH(NXT(5)))) {
|
||||
xmlParseTextDecl(ctxt);
|
||||
}
|
||||
}
|
||||
|
||||
if ((entity->etype == XML_EXTERNAL_PARAMETER_ENTITY) &&
|
||||
(CMP5(CUR_PTR, '<', '?', 'x', 'm', 'l')) &&
|
||||
(IS_BLANK_CH(NXT(5)))) {
|
||||
xmlParseTextDecl(ctxt);
|
||||
}
|
||||
}
|
||||
}
|
||||
ctxt->hasPErefs = 1;
|
||||
|
@ -1244,11 +1244,7 @@ xmlSwitchInputEncodingInt(xmlParserCtxtPtr ctxt, xmlParserInputPtr input,
|
||||
input->buf->rawconsumed += use - xmlBufUse(input->buf->raw);
|
||||
}
|
||||
return (0);
|
||||
} else if (input->length == 0) {
|
||||
/*
|
||||
* When parsing a static memory array one must know the
|
||||
* size to be able to convert the buffer.
|
||||
*/
|
||||
} else {
|
||||
xmlErrInternal(ctxt, "switching encoding : no input\n", NULL);
|
||||
return (-1);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user