Update to 2.9.8
Signed-off-by: Igor Gnatenko <ignatenkobrain@fedoraproject.org>
This commit is contained in:
parent
b373f2b88f
commit
7523b3ad02
1
.gitignore
vendored
1
.gitignore
vendored
@ -36,3 +36,4 @@ libxml2-2.7.7.tar.gz
|
|||||||
/libxml2-2.9.4.tar.gz
|
/libxml2-2.9.4.tar.gz
|
||||||
/libxml2-2.9.5.tar.gz
|
/libxml2-2.9.5.tar.gz
|
||||||
/libxml2-2.9.7.tar.gz
|
/libxml2-2.9.7.tar.gz
|
||||||
|
/libxml2-2.9.8.tar.gz
|
||||||
|
@ -0,0 +1,66 @@
|
|||||||
|
From 7a1bd7f6497ac33a9023d556f6f47a48f01deac0 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Nick Wellnhofer <wellnhofer@aevum.de>
|
||||||
|
Date: Sat, 17 Mar 2018 00:03:24 +0100
|
||||||
|
Subject: [PATCH] Revert "Change calls to xmlCharEncInput to set flush false"
|
||||||
|
|
||||||
|
This reverts commit 6e6ae5daa6cd9640c9a83c1070896273e9b30d14 which
|
||||||
|
broke decoding of larger documents with ICU.
|
||||||
|
|
||||||
|
See https://bugs.chromium.org/p/chromium/issues/detail?id=820163
|
||||||
|
---
|
||||||
|
HTMLparser.c | 2 +-
|
||||||
|
parserInternals.c | 2 +-
|
||||||
|
xmlIO.c | 4 ++--
|
||||||
|
3 files changed, 4 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/HTMLparser.c b/HTMLparser.c
|
||||||
|
index 9adeb174..7e243e60 100644
|
||||||
|
--- a/HTMLparser.c
|
||||||
|
+++ b/HTMLparser.c
|
||||||
|
@@ -3635,7 +3635,7 @@ htmlCheckEncodingDirect(htmlParserCtxtPtr ctxt, const xmlChar *encoding) {
|
||||||
|
*/
|
||||||
|
processed = ctxt->input->cur - ctxt->input->base;
|
||||||
|
xmlBufShrink(ctxt->input->buf->buffer, processed);
|
||||||
|
- nbchars = xmlCharEncInput(ctxt->input->buf, 0);
|
||||||
|
+ nbchars = xmlCharEncInput(ctxt->input->buf, 1);
|
||||||
|
if (nbchars < 0) {
|
||||||
|
htmlParseErr(ctxt, XML_ERR_INVALID_ENCODING,
|
||||||
|
"htmlCheckEncoding: encoder error\n",
|
||||||
|
diff --git a/parserInternals.c b/parserInternals.c
|
||||||
|
index 8c0cd57a..09876ab4 100644
|
||||||
|
--- a/parserInternals.c
|
||||||
|
+++ b/parserInternals.c
|
||||||
|
@@ -1214,7 +1214,7 @@ xmlSwitchInputEncodingInt(xmlParserCtxtPtr ctxt, xmlParserInputPtr input,
|
||||||
|
/*
|
||||||
|
* convert as much as possible of the buffer
|
||||||
|
*/
|
||||||
|
- nbchars = xmlCharEncInput(input->buf, 0);
|
||||||
|
+ nbchars = xmlCharEncInput(input->buf, 1);
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
* convert just enough to get
|
||||||
|
diff --git a/xmlIO.c b/xmlIO.c
|
||||||
|
index 82543477..f61dd05a 100644
|
||||||
|
--- a/xmlIO.c
|
||||||
|
+++ b/xmlIO.c
|
||||||
|
@@ -3157,7 +3157,7 @@ xmlParserInputBufferPush(xmlParserInputBufferPtr in,
|
||||||
|
* convert as much as possible to the parser reading buffer.
|
||||||
|
*/
|
||||||
|
use = xmlBufUse(in->raw);
|
||||||
|
- nbchars = xmlCharEncInput(in, 0);
|
||||||
|
+ nbchars = xmlCharEncInput(in, 1);
|
||||||
|
if (nbchars < 0) {
|
||||||
|
xmlIOErr(XML_IO_ENCODER, NULL);
|
||||||
|
in->error = XML_IO_ENCODER;
|
||||||
|
@@ -3273,7 +3273,7 @@ xmlParserInputBufferGrow(xmlParserInputBufferPtr in, int len) {
|
||||||
|
* convert as much as possible to the parser reading buffer.
|
||||||
|
*/
|
||||||
|
use = xmlBufUse(in->raw);
|
||||||
|
- nbchars = xmlCharEncInput(in, 0);
|
||||||
|
+ nbchars = xmlCharEncInput(in, 1);
|
||||||
|
if (nbchars < 0) {
|
||||||
|
xmlIOErr(XML_IO_ENCODER, NULL);
|
||||||
|
in->error = XML_IO_ENCODER;
|
||||||
|
--
|
||||||
|
2.17.0.rc2
|
||||||
|
|
@ -1,35 +0,0 @@
|
|||||||
diff -up libxml2-2.9.0/xzlib.c.do-not-check-crc libxml2-2.9.0/xzlib.c
|
|
||||||
--- libxml2-2.9.0/xzlib.c.do-not-check-crc 2012-09-11 05:52:46.000000000 +0200
|
|
||||||
+++ libxml2-2.9.0/xzlib.c 2012-11-19 19:28:42.431700534 +0100
|
|
||||||
@@ -552,17 +552,20 @@ xz_decomp(xz_statep state)
|
|
||||||
#ifdef HAVE_ZLIB_H
|
|
||||||
if (state->how == GZIP) {
|
|
||||||
if (gz_next4(state, &crc) == -1 || gz_next4(state, &len) == -1) {
|
|
||||||
- xz_error(state, LZMA_DATA_ERROR, "unexpected end of file");
|
|
||||||
- return -1;
|
|
||||||
- }
|
|
||||||
- if (crc != state->zstrm.adler) {
|
|
||||||
- xz_error(state, LZMA_DATA_ERROR, "incorrect data check");
|
|
||||||
- return -1;
|
|
||||||
- }
|
|
||||||
- if (len != (state->zstrm.total_out & 0xffffffffL)) {
|
|
||||||
- xz_error(state, LZMA_DATA_ERROR, "incorrect length check");
|
|
||||||
- return -1;
|
|
||||||
- }
|
|
||||||
+ /*
|
|
||||||
+ xz_error(state, LZMA_DATA_ERROR, "unexpected end of file");
|
|
||||||
+ return -1;
|
|
||||||
+ */
|
|
||||||
+ } else {
|
|
||||||
+ if (crc != state->zstrm.adler) {
|
|
||||||
+ xz_error(state, LZMA_DATA_ERROR, "incorrect data check");
|
|
||||||
+ return -1;
|
|
||||||
+ }
|
|
||||||
+ if (len != (state->zstrm.total_out & 0xffffffffL)) {
|
|
||||||
+ xz_error(state, LZMA_DATA_ERROR, "incorrect length check");
|
|
||||||
+ return -1;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
state->strm.avail_in = 0;
|
|
||||||
state->strm.next_in = NULL;
|
|
||||||
state->strm.avail_out = 0;
|
|
@ -1,12 +0,0 @@
|
|||||||
diff -Nur libxml2-2.9.4.orig/python/types.c libxml2-2.9.4/python/types.c
|
|
||||||
--- libxml2-2.9.4.orig/python/types.c 2016-02-09 03:17:33.000000000 -0700
|
|
||||||
+++ libxml2-2.9.4/python/types.c 2016-12-21 12:34:06.755650986 -0700
|
|
||||||
@@ -31,8 +31,6 @@
|
|
||||||
const char *mode;
|
|
||||||
|
|
||||||
fd = PyObject_AsFileDescriptor(f);
|
|
||||||
- if (!_PyVerify_fd(fd))
|
|
||||||
- return(NULL);
|
|
||||||
/*
|
|
||||||
* Get the flags on the fd to understand how it was opened
|
|
||||||
*/
|
|
@ -1,191 +0,0 @@
|
|||||||
Make the XML entity recursion check more precise.
|
|
||||||
|
|
||||||
libxml doesn't detect entity recursion specifically but has a variety
|
|
||||||
of related checks, such as entities not expanding too deeply or
|
|
||||||
producing exponential blow-ups in content.
|
|
||||||
|
|
||||||
Because entity declarations are parsed in a separate context with
|
|
||||||
their own element recursion budget, a recursive entity can overflow
|
|
||||||
the stack using a lot of open elements (but within the per-context
|
|
||||||
limit) as it slowly consumes (but does not exhaust) the entity depth
|
|
||||||
budget.
|
|
||||||
|
|
||||||
This adds a specific, precise check for recursive entities that
|
|
||||||
detects entity recursion specifically and fails immediately.
|
|
||||||
|
|
||||||
The existing entity expansion depth checks are still relevant for long
|
|
||||||
chains of different entities.
|
|
||||||
|
|
||||||
BUG=628581
|
|
||||||
|
|
||||||
Review-Url: https://codereview.chromium.org/2539003002
|
|
||||||
Cr-Commit-Position: refs/heads/master@{#436899}
|
|
||||||
|
|
||||||
|
|
||||||
Index: libxml2-2.9.4/entities.c
|
|
||||||
===================================================================
|
|
||||||
--- libxml2-2.9.4.orig/entities.c
|
|
||||||
+++ libxml2-2.9.4/entities.c
|
|
||||||
@@ -159,6 +159,7 @@ xmlCreateEntity(xmlDictPtr dict, const x
|
|
||||||
memset(ret, 0, sizeof(xmlEntity));
|
|
||||||
ret->type = XML_ENTITY_DECL;
|
|
||||||
ret->checked = 0;
|
|
||||||
+ ret->guard = XML_ENTITY_NOT_BEING_CHECKED;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* fill the structure.
|
|
||||||
@@ -931,6 +932,7 @@ xmlCopyEntity(xmlEntityPtr ent) {
|
|
||||||
cur->orig = xmlStrdup(ent->orig);
|
|
||||||
if (ent->URI != NULL)
|
|
||||||
cur->URI = xmlStrdup(ent->URI);
|
|
||||||
+ cur->guard = 0;
|
|
||||||
return(cur);
|
|
||||||
}
|
|
||||||
|
|
||||||
Index: libxml2-2.9.4/include/libxml/entities.h
|
|
||||||
===================================================================
|
|
||||||
--- libxml2-2.9.4.orig/include/libxml/entities.h
|
|
||||||
+++ libxml2-2.9.4/include/libxml/entities.h
|
|
||||||
@@ -30,6 +30,11 @@ typedef enum {
|
|
||||||
XML_INTERNAL_PREDEFINED_ENTITY = 6
|
|
||||||
} xmlEntityType;
|
|
||||||
|
|
||||||
+typedef enum {
|
|
||||||
+ XML_ENTITY_NOT_BEING_CHECKED,
|
|
||||||
+ XML_ENTITY_BEING_CHECKED /* entity check is in progress */
|
|
||||||
+} xmlEntityRecursionGuard;
|
|
||||||
+
|
|
||||||
/*
|
|
||||||
* An unit of storage for an entity, contains the string, the value
|
|
||||||
* and the linkind data needed for the linking in the hash table.
|
|
||||||
@@ -60,6 +65,7 @@ struct _xmlEntity {
|
|
||||||
/* this is also used to count entities
|
|
||||||
* references done from that entity
|
|
||||||
* and if it contains '<' */
|
|
||||||
+ xmlEntityRecursionGuard guard;
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
Index: libxml2-2.9.4/parser.c
|
|
||||||
===================================================================
|
|
||||||
--- libxml2-2.9.4.orig/parser.c
|
|
||||||
+++ libxml2-2.9.4/parser.c
|
|
||||||
@@ -133,6 +133,10 @@ xmlParserEntityCheck(xmlParserCtxtPtr ct
|
|
||||||
if (ctxt->lastError.code == XML_ERR_ENTITY_LOOP)
|
|
||||||
return (1);
|
|
||||||
|
|
||||||
+ if ((ent != NULL) && (ent->guard == XML_ENTITY_BEING_CHECKED)) {
|
|
||||||
+ xmlFatalErr(ctxt, XML_ERR_ENTITY_LOOP, NULL);
|
|
||||||
+ return (1);
|
|
||||||
+ }
|
|
||||||
/*
|
|
||||||
* This may look absurd but is needed to detect
|
|
||||||
* entities problems
|
|
||||||
@@ -143,12 +147,14 @@ xmlParserEntityCheck(xmlParserCtxtPtr ct
|
|
||||||
unsigned long oldnbent = ctxt->nbentities;
|
|
||||||
xmlChar *rep;
|
|
||||||
|
|
||||||
+ ent->guard = XML_ENTITY_BEING_CHECKED;
|
|
||||||
ent->checked = 1;
|
|
||||||
|
|
||||||
++ctxt->depth;
|
|
||||||
rep = xmlStringDecodeEntities(ctxt, ent->content,
|
|
||||||
XML_SUBSTITUTE_REF, 0, 0, 0);
|
|
||||||
--ctxt->depth;
|
|
||||||
+ ent->guard = XML_ENTITY_NOT_BEING_CHECKED;
|
|
||||||
if (ctxt->errNo == XML_ERR_ENTITY_LOOP) {
|
|
||||||
ent->content[0] = 0;
|
|
||||||
}
|
|
||||||
@@ -7337,23 +7343,28 @@ xmlParseReference(xmlParserCtxtPtr ctxt)
|
|
||||||
* if its replacement text matches the production labeled
|
|
||||||
* content.
|
|
||||||
*/
|
|
||||||
- if (ent->etype == XML_INTERNAL_GENERAL_ENTITY) {
|
|
||||||
- ctxt->depth++;
|
|
||||||
- ret = xmlParseBalancedChunkMemoryInternal(ctxt, ent->content,
|
|
||||||
- user_data, &list);
|
|
||||||
- ctxt->depth--;
|
|
||||||
-
|
|
||||||
- } else if (ent->etype == XML_EXTERNAL_GENERAL_PARSED_ENTITY) {
|
|
||||||
- ctxt->depth++;
|
|
||||||
- ret = xmlParseExternalEntityPrivate(ctxt->myDoc, ctxt, ctxt->sax,
|
|
||||||
- user_data, ctxt->depth, ent->URI,
|
|
||||||
- ent->ExternalID, &list);
|
|
||||||
- ctxt->depth--;
|
|
||||||
- } else {
|
|
||||||
- ret = XML_ERR_ENTITY_PE_INTERNAL;
|
|
||||||
- xmlErrMsgStr(ctxt, XML_ERR_INTERNAL_ERROR,
|
|
||||||
- "invalid entity type found\n", NULL);
|
|
||||||
- }
|
|
||||||
+ if (ent->guard == XML_ENTITY_BEING_CHECKED) {
|
|
||||||
+ ret = XML_ERR_ENTITY_LOOP;
|
|
||||||
+ } else {
|
|
||||||
+ ent->guard = XML_ENTITY_BEING_CHECKED;
|
|
||||||
+ if (ent->etype == XML_INTERNAL_GENERAL_ENTITY) {
|
|
||||||
+ ctxt->depth++;
|
|
||||||
+ ret = xmlParseBalancedChunkMemoryInternal(ctxt, ent->content,
|
|
||||||
+ user_data, &list);
|
|
||||||
+ ctxt->depth--;
|
|
||||||
+ } else if (ent->etype == XML_EXTERNAL_GENERAL_PARSED_ENTITY) {
|
|
||||||
+ ctxt->depth++;
|
|
||||||
+ ret = xmlParseExternalEntityPrivate(ctxt->myDoc, ctxt, ctxt->sax,
|
|
||||||
+ user_data, ctxt->depth, ent->URI,
|
|
||||||
+ ent->ExternalID, &list);
|
|
||||||
+ ctxt->depth--;
|
|
||||||
+ } else {
|
|
||||||
+ ret = XML_ERR_ENTITY_PE_INTERNAL;
|
|
||||||
+ xmlErrMsgStr(ctxt, XML_ERR_INTERNAL_ERROR,
|
|
||||||
+ "invalid entity type found\n", NULL);
|
|
||||||
+ }
|
|
||||||
+ ent->guard = XML_ENTITY_NOT_BEING_CHECKED;
|
|
||||||
+ }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Store the number of entities needing parsing for this entity
|
|
||||||
@@ -7456,23 +7467,29 @@ xmlParseReference(xmlParserCtxtPtr ctxt)
|
|
||||||
else
|
|
||||||
user_data = ctxt->userData;
|
|
||||||
|
|
||||||
- if (ent->etype == XML_INTERNAL_GENERAL_ENTITY) {
|
|
||||||
- ctxt->depth++;
|
|
||||||
- ret = xmlParseBalancedChunkMemoryInternal(ctxt,
|
|
||||||
- ent->content, user_data, NULL);
|
|
||||||
- ctxt->depth--;
|
|
||||||
- } else if (ent->etype ==
|
|
||||||
- XML_EXTERNAL_GENERAL_PARSED_ENTITY) {
|
|
||||||
- ctxt->depth++;
|
|
||||||
- ret = xmlParseExternalEntityPrivate(ctxt->myDoc, ctxt,
|
|
||||||
- ctxt->sax, user_data, ctxt->depth,
|
|
||||||
- ent->URI, ent->ExternalID, NULL);
|
|
||||||
- ctxt->depth--;
|
|
||||||
- } else {
|
|
||||||
- ret = XML_ERR_ENTITY_PE_INTERNAL;
|
|
||||||
- xmlErrMsgStr(ctxt, XML_ERR_INTERNAL_ERROR,
|
|
||||||
- "invalid entity type found\n", NULL);
|
|
||||||
- }
|
|
||||||
+ if (ent->guard == XML_ENTITY_BEING_CHECKED) {
|
|
||||||
+ ret = XML_ERR_ENTITY_LOOP;
|
|
||||||
+ } else {
|
|
||||||
+ ent->guard = XML_ENTITY_BEING_CHECKED;
|
|
||||||
+ if (ent->etype == XML_INTERNAL_GENERAL_ENTITY) {
|
|
||||||
+ ctxt->depth++;
|
|
||||||
+ ret = xmlParseBalancedChunkMemoryInternal(ctxt,
|
|
||||||
+ ent->content, user_data, NULL);
|
|
||||||
+ ctxt->depth--;
|
|
||||||
+ } else if (ent->etype ==
|
|
||||||
+ XML_EXTERNAL_GENERAL_PARSED_ENTITY) {
|
|
||||||
+ ctxt->depth++;
|
|
||||||
+ ret = xmlParseExternalEntityPrivate(ctxt->myDoc, ctxt,
|
|
||||||
+ ctxt->sax, user_data, ctxt->depth,
|
|
||||||
+ ent->URI, ent->ExternalID, NULL);
|
|
||||||
+ ctxt->depth--;
|
|
||||||
+ } else {
|
|
||||||
+ ret = XML_ERR_ENTITY_PE_INTERNAL;
|
|
||||||
+ xmlErrMsgStr(ctxt, XML_ERR_INTERNAL_ERROR,
|
|
||||||
+ "invalid entity type found\n", NULL);
|
|
||||||
+ }
|
|
||||||
+ ent->guard = XML_ENTITY_NOT_BEING_CHECKED;
|
|
||||||
+ }
|
|
||||||
if (ret == XML_ERR_ENTITY_LOOP) {
|
|
||||||
xmlFatalErr(ctxt, XML_ERR_ENTITY_LOOP, NULL);
|
|
||||||
return;
|
|
16
libxml2.spec
16
libxml2.spec
@ -1,19 +1,14 @@
|
|||||||
Name: libxml2
|
Name: libxml2
|
||||||
Version: 2.9.7
|
Version: 2.9.8
|
||||||
Release: 4%{?dist}
|
Release: 1%{?dist}
|
||||||
Summary: Library providing XML and HTML support
|
Summary: Library providing XML and HTML support
|
||||||
|
|
||||||
License: MIT
|
License: MIT
|
||||||
URL: http://xmlsoft.org/
|
URL: http://xmlsoft.org/
|
||||||
Source: ftp://xmlsoft.org/libxml2/libxml2-%{version}.tar.gz
|
Source: ftp://xmlsoft.org/libxml2/libxml2-%{version}.tar.gz
|
||||||
Patch0: libxml2-multilib.patch
|
Patch0: libxml2-multilib.patch
|
||||||
# workaround for #877567 - Very weird bug gzip decompression bug in "recent" libxml2 versions
|
# https://git.gnome.org/browse/libxml2/commit/?id=7a1bd7f6497ac33a9023d556f6f47a48f01deac0
|
||||||
Patch1: libxml2-2.9.0-do-not-check-crc.patch
|
Patch1: 0001-Revert-Change-calls-to-xmlCharEncInput-to-set-flush-.patch
|
||||||
# In python3.6 _PyVerify_fd is no more
|
|
||||||
# http://bugs.python.org/issue23524
|
|
||||||
Patch2: libxml2-2.9.4-remove-pyverify_fd.patch
|
|
||||||
# https://codereview.chromium.org/2539003002
|
|
||||||
Patch3: libxml2-CVE-2016-9597.patch
|
|
||||||
|
|
||||||
BuildRequires: gcc
|
BuildRequires: gcc
|
||||||
BuildRequires: cmake-rpm-macros
|
BuildRequires: cmake-rpm-macros
|
||||||
@ -170,6 +165,9 @@ gzip -9 -c doc/libxml2-api.xml > doc/libxml2-api.xml.gz
|
|||||||
%{python3_sitearch}/libxml2mod.so
|
%{python3_sitearch}/libxml2mod.so
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Tue Apr 03 2018 Igor Gnatenko <ignatenkobrain@fedoraproject.org> - 2.9.8-1
|
||||||
|
- Update to 2.9.8
|
||||||
|
|
||||||
* Sat Feb 24 2018 Florian Weimer <fweimer@redhat.com> - 2.9.7-4
|
* Sat Feb 24 2018 Florian Weimer <fweimer@redhat.com> - 2.9.7-4
|
||||||
- Rebuild with new LDFLAGS from redhat-rpm-config
|
- Rebuild with new LDFLAGS from redhat-rpm-config
|
||||||
|
|
||||||
|
2
sources
2
sources
@ -1 +1 @@
|
|||||||
SHA512 (libxml2-2.9.7.tar.gz) = da06cb7c5032ef4b7c8e902fabb9d2c74634c42c161be07a7c66a00d53a68029f89b0d4de32a6b9d4ff338c2d1d9c4e53aefb9cf50cb1c2d6c6b06b442ef42d5
|
SHA512 (libxml2-2.9.8.tar.gz) = 28903282c7672206effa1362fd564cbe4cf5be44264b083a7d14e383f73bccd1b81bcafb5f4f2f56f5e7e05914c660e27668c9ce91b1b9f256ef5358d55ba917
|
||||||
|
Loading…
Reference in New Issue
Block a user