1
0
mirror of https://gitlab.gnome.org/GNOME/libxml2.git synced 2024-10-26 12:25:09 +03:00

parser: Make unsupported encodings an error in declarations

This was changed in 45157261, but in encoding declarations, unsupported
encodings should raise a fatal error.

Fixes #794.
This commit is contained in:
Nick Wellnhofer 2024-09-02 18:37:41 +02:00
parent 40abebbc73
commit bd9eed4694
5 changed files with 42 additions and 10 deletions

View File

@ -475,20 +475,14 @@ void
xmlFatalErr(xmlParserCtxtPtr ctxt, xmlParserErrors code, const char *info)
{
const char *errmsg;
xmlErrorLevel level;
if (code == XML_ERR_UNSUPPORTED_ENCODING)
level = XML_ERR_WARNING;
else
level = XML_ERR_FATAL;
errmsg = xmlErrString(code);
if (info == NULL) {
xmlCtxtErr(ctxt, NULL, XML_FROM_PARSER, code, level,
xmlCtxtErr(ctxt, NULL, XML_FROM_PARSER, code, XML_ERR_FATAL,
NULL, NULL, NULL, 0, "%s\n", errmsg);
} else {
xmlCtxtErr(ctxt, NULL, XML_FROM_PARSER, code, level,
xmlCtxtErr(ctxt, NULL, XML_FROM_PARSER, code, XML_ERR_FATAL,
(const xmlChar *) info, NULL, NULL, 0,
"%s: %s\n", errmsg, info);
}
@ -1223,7 +1217,11 @@ xmlSwitchInputEncodingName(xmlParserCtxtPtr ctxt, xmlParserInputPtr input,
res = xmlCreateCharEncodingHandler(encoding, /* output */ 0,
ctxt->convImpl, ctxt->convCtxt, &handler);
if (res != XML_ERR_OK) {
if (res == XML_ERR_UNSUPPORTED_ENCODING) {
xmlWarningMsg(ctxt, XML_ERR_UNSUPPORTED_ENCODING,
"Unsupported encoding: %s\n", BAD_CAST encoding, NULL);
return(-1);
} else if (res != XML_ERR_OK) {
xmlFatalErr(ctxt, res, encoding);
return(-1);
}
@ -1535,7 +1533,29 @@ void
xmlSetDeclaredEncoding(xmlParserCtxtPtr ctxt, xmlChar *encoding) {
if (((ctxt->input->flags & XML_INPUT_HAS_ENCODING) == 0) &&
((ctxt->options & XML_PARSE_IGNORE_ENC) == 0)) {
xmlSwitchEncodingName(ctxt, (const char *) encoding);
xmlCharEncodingHandlerPtr handler;
int res;
/*
* xmlSwitchEncodingName treats unsupported encodings as
* warnings, but we want it to be an error in an encoding
* declaration.
*/
res = xmlCreateCharEncodingHandler((const char *) encoding,
/* output */ 0, ctxt->convImpl, ctxt->convCtxt, &handler);
if (res != XML_ERR_OK) {
xmlFatalErr(ctxt, res, (const char *) encoding);
xmlFree(encoding);
return;
}
res = xmlInputSetEncodingHandler(ctxt->input, handler);
if (res != XML_ERR_OK) {
xmlCtxtErrIO(ctxt, res, NULL);
xmlFree(encoding);
return;
}
ctxt->input->flags |= XML_INPUT_USES_ENC_DECL;
} else if (ctxt->input->flags & XML_INPUT_AUTO_ENCODING) {
static const char *allowedUTF8[] = {

View File

@ -0,0 +1,3 @@
./test/errors/unsupported-encoding.xml:1: parser error : Unsupported encoding: unsupported-encoding
<?xml version="1.0" encoding="unsupported-encoding"?>
^

View File

@ -0,0 +1,3 @@
./test/errors/unsupported-encoding.xml:1: parser error : Unsupported encoding: unsupported-encoding
<?xml version="1.0" encoding="unsupported-encoding"?>
^

View File

@ -0,0 +1,4 @@
./test/errors/unsupported-encoding.xml:1: parser error : Unsupported encoding: unsupported-encoding
<?xml version="1.0" encoding="unsupported-encoding"?>
^
./test/errors/unsupported-encoding.xml : failed to parse

View File

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="unsupported-encoding"?>
<doc/>