From a0a631122ab345306fe106288a0bd1d3f2b8f3da Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Tue, 20 Apr 2021 14:09:29 -0700 Subject: xml parsing: add XML_PARSE_HUGE flag to xmlReadMemory() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It looks like libxml2 has some internal limitations by default that causes parse failures in some situations. Avoid them with XML_PARSE_HUGE. Without this, you get errors like test.xml:349250: parser error : internal error: Huge input lookup όμουν τουλάχιστον αλλά +2kg και ενδεχομένως +4 ^ when something in the xml file grows too large. I don't know libxml2 internals, so I have no idea what exactly goes wrong, but the docs say: XML_PARSE_HUGE = 524288 : relax any hardcoded limit from the parser and that makes us successfully parse the Greek file from Kostas. Reported-by: Kostas Katsioulis Signed-off-by: Linus Torvalds --- core/parse-xml.c | 4 ++-- core/save-xml.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'core') diff --git a/core/parse-xml.c b/core/parse-xml.c index 7b1a62ef9..da3a54ec3 100644 --- a/core/parse-xml.c +++ b/core/parse-xml.c @@ -1748,9 +1748,9 @@ int parse_xml_buffer(const char *url, const char *buffer, int size, state.sites = sites; state.devices = devices; state.filter_presets = filter_presets; - doc = xmlReadMemory(res, strlen(res), url, NULL, 0); + doc = xmlReadMemory(res, strlen(res), url, NULL, XML_PARSE_HUGE); if (!doc) - doc = xmlReadMemory(res, strlen(res), url, "latin1", 0); + doc = xmlReadMemory(res, strlen(res), url, "latin1", XML_PARSE_HUGE); if (res != buffer) free((char *)res); diff --git a/core/save-xml.c b/core/save-xml.c index 9d5b8f6f8..4c7c2ee04 100644 --- a/core/save-xml.c +++ b/core/save-xml.c @@ -871,7 +871,7 @@ static int export_dives_xslt_doit(const char *filename, struct xml_params *param * transform it to selected export format, finally dumping * the XML into a character buffer. */ - doc = xmlReadMemory(buf.buffer, buf.len, "divelog", NULL, 0); + doc = xmlReadMemory(buf.buffer, buf.len, "divelog", NULL, XML_PARSE_HUGE); free_buffer(&buf); if (!doc) return report_error("Failed to read XML memory"); -- cgit v1.2.3-70-g09d2