Compare commits
1 commit
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
24fb39e652 |
11 changed files with 1801 additions and 1774 deletions
|
|
@ -1 +0,0 @@
|
|||
1
|
||||
16
.gitignore
vendored
16
.gitignore
vendored
|
|
@ -57,19 +57,3 @@ lxml-2.2.7.tar.gz.asc
|
|||
/lxml-4.6.2.tar.gz
|
||||
/lxml-4.6.3.tar.gz
|
||||
/lxml-4.7.1.tar.gz
|
||||
/lxml-4.9.1.tar.gz
|
||||
/lxml-4.9.2.tar.gz
|
||||
/lxml-4.9.2-no-isoschematron.tar.gz
|
||||
/lxml-4.9.2-no-isoschematron-rng.tar.gz
|
||||
/lxml-4.9.3-no-isoschematron-rng.tar.gz
|
||||
/lxml-4.9.4-no-isoschematron-rng.tar.gz
|
||||
/lxml-5.1.0-no-isoschematron-rng.tar.gz
|
||||
/lxml-5.2.0-no-isoschematron-rng.tar.gz
|
||||
/lxml-5.2.1-no-isoschematron-rng.tar.gz
|
||||
/lxml-5.3.0-no-isoschematron-rng.tar.gz
|
||||
/lxml-5.3.1-no-isoschematron-rng.tar.gz
|
||||
/lxml-5.3.2-no-isoschematron-rng.tar.gz
|
||||
/lxml-5.4.0-no-isoschematron-rng.tar.gz
|
||||
/lxml-6.0.0-no-isoschematron-rng.tar.gz
|
||||
/lxml-6.0.1-no-isoschematron-rng.tar.gz
|
||||
/lxml-6.0.2-no-isoschematron-rng.tar.gz
|
||||
|
|
|
|||
186
CVE-2022-2309.patch
Normal file
186
CVE-2022-2309.patch
Normal file
|
|
@ -0,0 +1,186 @@
|
|||
From 85b664e506d73780232c256b6dfbaf1f266cdabd Mon Sep 17 00:00:00 2001
|
||||
From: Stefan Behnel <stefan_ml@behnel.de>
|
||||
Date: Fri, 1 Jul 2022 21:06:10 +0200
|
||||
Subject: [PATCH 1/3] Fix a crash when incorrect parser input occurs together
|
||||
with usages of iterwalk() on trees generated by the same parser.
|
||||
|
||||
---
|
||||
src/lxml/apihelpers.pxi | 7 ++++---
|
||||
src/lxml/iterparse.pxi | 11 ++++++-----
|
||||
src/lxml/tests/test_etree.py | 20 ++++++++++++++++++++
|
||||
3 files changed, 30 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/src/lxml/apihelpers.pxi b/src/lxml/apihelpers.pxi
|
||||
index 5eb3416..88a031d 100644
|
||||
--- a/src/lxml/apihelpers.pxi
|
||||
+++ b/src/lxml/apihelpers.pxi
|
||||
@@ -246,9 +246,10 @@ cdef dict _build_nsmap(xmlNode* c_node):
|
||||
while c_node is not NULL and c_node.type == tree.XML_ELEMENT_NODE:
|
||||
c_ns = c_node.nsDef
|
||||
while c_ns is not NULL:
|
||||
- prefix = funicodeOrNone(c_ns.prefix)
|
||||
- if prefix not in nsmap:
|
||||
- nsmap[prefix] = funicodeOrNone(c_ns.href)
|
||||
+ if c_ns.prefix or c_ns.href:
|
||||
+ prefix = funicodeOrNone(c_ns.prefix)
|
||||
+ if prefix not in nsmap:
|
||||
+ nsmap[prefix] = funicodeOrNone(c_ns.href)
|
||||
c_ns = c_ns.next
|
||||
c_node = c_node.parent
|
||||
return nsmap
|
||||
diff --git a/src/lxml/iterparse.pxi b/src/lxml/iterparse.pxi
|
||||
index 4c20506..3da7485 100644
|
||||
--- a/src/lxml/iterparse.pxi
|
||||
+++ b/src/lxml/iterparse.pxi
|
||||
@@ -419,7 +419,7 @@ cdef int _countNsDefs(xmlNode* c_node):
|
||||
count = 0
|
||||
c_ns = c_node.nsDef
|
||||
while c_ns is not NULL:
|
||||
- count += 1
|
||||
+ count += (c_ns.href is not NULL)
|
||||
c_ns = c_ns.next
|
||||
return count
|
||||
|
||||
@@ -430,9 +430,10 @@ cdef int _appendStartNsEvents(xmlNode* c_node, list event_list) except -1:
|
||||
count = 0
|
||||
c_ns = c_node.nsDef
|
||||
while c_ns is not NULL:
|
||||
- ns_tuple = (funicode(c_ns.prefix) if c_ns.prefix is not NULL else '',
|
||||
- funicode(c_ns.href))
|
||||
- event_list.append( (u"start-ns", ns_tuple) )
|
||||
- count += 1
|
||||
+ if c_ns.href:
|
||||
+ ns_tuple = (funicodeOrEmpty(c_ns.prefix),
|
||||
+ funicode(c_ns.href))
|
||||
+ event_list.append( (u"start-ns", ns_tuple) )
|
||||
+ count += 1
|
||||
c_ns = c_ns.next
|
||||
return count
|
||||
diff --git a/src/lxml/tests/test_etree.py b/src/lxml/tests/test_etree.py
|
||||
index ef5c54b..7b85596 100644
|
||||
--- a/src/lxml/tests/test_etree.py
|
||||
+++ b/src/lxml/tests/test_etree.py
|
||||
@@ -1459,6 +1459,26 @@ class ETreeOnlyTestCase(HelperTestCase):
|
||||
[1,2,1,4],
|
||||
counts)
|
||||
|
||||
+ def test_walk_after_parse_failure(self):
|
||||
+ # This used to be an issue because libxml2 can leak empty namespaces
|
||||
+ # between failed parser runs. iterwalk() failed to handle such a tree.
|
||||
+ try:
|
||||
+ etree.XML('''<anot xmlns="1">''')
|
||||
+ except etree.XMLSyntaxError:
|
||||
+ pass
|
||||
+ else:
|
||||
+ assert False, "invalid input did not fail to parse"
|
||||
+
|
||||
+ et = etree.XML('''<root> </root>''')
|
||||
+ try:
|
||||
+ ns = next(etree.iterwalk(et, events=('start-ns',)))
|
||||
+ except StopIteration:
|
||||
+ # This would be the expected result, because there was no namespace
|
||||
+ pass
|
||||
+ else:
|
||||
+ # This is a bug in libxml2
|
||||
+ assert not ns, repr(ns)
|
||||
+
|
||||
def test_itertext_comment_pi(self):
|
||||
# https://bugs.launchpad.net/lxml/+bug/1844674
|
||||
XML = self.etree.XML
|
||||
--
|
||||
2.37.2
|
||||
|
||||
|
||||
From c26503461af4c250fc6e771887fae7f9dd208e9b Mon Sep 17 00:00:00 2001
|
||||
From: Stefan Behnel <stefan_ml@behnel.de>
|
||||
Date: Fri, 1 Jul 2022 21:19:44 +0200
|
||||
Subject: [PATCH 2/3] Prevent parse failure in new test from leaking into later
|
||||
test runs.
|
||||
|
||||
---
|
||||
src/lxml/tests/test_etree.py | 6 ++++--
|
||||
1 file changed, 4 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/lxml/tests/test_etree.py b/src/lxml/tests/test_etree.py
|
||||
index 7b85596..8171e03 100644
|
||||
--- a/src/lxml/tests/test_etree.py
|
||||
+++ b/src/lxml/tests/test_etree.py
|
||||
@@ -1462,14 +1462,16 @@ class ETreeOnlyTestCase(HelperTestCase):
|
||||
def test_walk_after_parse_failure(self):
|
||||
# This used to be an issue because libxml2 can leak empty namespaces
|
||||
# between failed parser runs. iterwalk() failed to handle such a tree.
|
||||
+ parser = etree.XMLParser()
|
||||
+
|
||||
try:
|
||||
- etree.XML('''<anot xmlns="1">''')
|
||||
+ etree.XML('''<anot xmlns="1">''', parser=parser)
|
||||
except etree.XMLSyntaxError:
|
||||
pass
|
||||
else:
|
||||
assert False, "invalid input did not fail to parse"
|
||||
|
||||
- et = etree.XML('''<root> </root>''')
|
||||
+ et = etree.XML('''<root> </root>''', parser=parser)
|
||||
try:
|
||||
ns = next(etree.iterwalk(et, events=('start-ns',)))
|
||||
except StopIteration:
|
||||
--
|
||||
2.37.2
|
||||
|
||||
|
||||
From 2e37fbe5c54a188394aa066c3074ab974f6b9f61 Mon Sep 17 00:00:00 2001
|
||||
From: Stefan Behnel <stefan_ml@behnel.de>
|
||||
Date: Tue, 19 Jul 2022 08:25:20 +0200
|
||||
Subject: [PATCH 3/3] Work around libxml2 bug in affected versions that failed
|
||||
to reset the namespace count in the parser context.
|
||||
|
||||
See https://gitlab.gnome.org/GNOME/libxml2/-/issues/378
|
||||
---
|
||||
src/lxml/includes/xmlparser.pxd | 1 +
|
||||
src/lxml/parser.pxi | 3 +++
|
||||
src/lxml/tests/test_etree.py | 3 +--
|
||||
3 files changed, 5 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/lxml/includes/xmlparser.pxd b/src/lxml/includes/xmlparser.pxd
|
||||
index a196e34..45acfc8 100644
|
||||
--- a/src/lxml/includes/xmlparser.pxd
|
||||
+++ b/src/lxml/includes/xmlparser.pxd
|
||||
@@ -144,6 +144,7 @@ cdef extern from "libxml/parser.h":
|
||||
void* userData
|
||||
int* spaceTab
|
||||
int spaceMax
|
||||
+ int nsNr
|
||||
bint html
|
||||
bint progressive
|
||||
int inSubset
|
||||
diff --git a/src/lxml/parser.pxi b/src/lxml/parser.pxi
|
||||
index 35b5145..3187a38 100644
|
||||
--- a/src/lxml/parser.pxi
|
||||
+++ b/src/lxml/parser.pxi
|
||||
@@ -569,6 +569,9 @@ cdef class _ParserContext(_ResolverContext):
|
||||
self._c_ctxt.disableSAX = 0 # work around bug in libxml2
|
||||
else:
|
||||
xmlparser.xmlClearParserCtxt(self._c_ctxt)
|
||||
+ # work around bug in libxml2 [2.9.10 .. 2.9.14]:
|
||||
+ # https://gitlab.gnome.org/GNOME/libxml2/-/issues/378
|
||||
+ self._c_ctxt.nsNr = 0
|
||||
|
||||
cdef int prepare(self, bint set_document_loader=True) except -1:
|
||||
cdef int result
|
||||
diff --git a/src/lxml/tests/test_etree.py b/src/lxml/tests/test_etree.py
|
||||
index 8171e03..d767cfb 100644
|
||||
--- a/src/lxml/tests/test_etree.py
|
||||
+++ b/src/lxml/tests/test_etree.py
|
||||
@@ -1478,8 +1478,7 @@ class ETreeOnlyTestCase(HelperTestCase):
|
||||
# This would be the expected result, because there was no namespace
|
||||
pass
|
||||
else:
|
||||
- # This is a bug in libxml2
|
||||
- assert not ns, repr(ns)
|
||||
+ assert False, "Found unexpected namespace '%s'" % ns
|
||||
|
||||
def test_itertext_comment_pi(self):
|
||||
# https://bugs.launchpad.net/lxml/+bug/1844674
|
||||
--
|
||||
2.37.2
|
||||
|
||||
1
ci.fmf
1
ci.fmf
|
|
@ -1 +0,0 @@
|
|||
resultsdb-testcase: separate
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
--- !Policy
|
||||
product_versions:
|
||||
- fedora-*
|
||||
decision_contexts:
|
||||
- bodhi_update_push_testing
|
||||
- bodhi_update_push_stable
|
||||
rules:
|
||||
- !PassingTestCaseRule {test_case_name: fedora-ci.koji-build./plans/smoke.functional}
|
||||
|
|
@ -1,28 +0,0 @@
|
|||
#! /bin/bash -ex
|
||||
|
||||
# Download a release of lxml (if missing) and remove the isoschematron module from it
|
||||
|
||||
version=$1
|
||||
|
||||
if [ -z "${version}" ]; then
|
||||
echo "Usage: $0 VERSION" >& 2
|
||||
echo "" >& 2
|
||||
echo "example: $0 4.9.2" >& 2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
versionedname=lxml-${version}
|
||||
orig_archive=${versionedname}.tar.gz
|
||||
new_archive=${versionedname}-no-isoschematron-rng.tar.gz
|
||||
|
||||
if [ ! -e ${orig_archive} ]; then
|
||||
wget -N https://files.pythonhosted.org/packages/source/l/lxml/${orig_archive}
|
||||
fi
|
||||
|
||||
deleted_directory=lxml-${version}/src/lxml/isoschematron/resources/rng
|
||||
|
||||
# tar --delete does not operate on compressed archives, so do
|
||||
# gz decompression explicitly
|
||||
gzip --decompress ${orig_archive}
|
||||
tar -v --delete -f ${orig_archive//.gz} ${deleted_directory}
|
||||
gzip -cf ${orig_archive//.gz} > ${new_archive}
|
||||
|
|
@ -1,7 +0,0 @@
|
|||
import lxml.etree as et
|
||||
s = '<foo><bar baz="xyzzy">a<![CDATA[b]]>c</bar></foo>'
|
||||
x = et.fromstring(s)
|
||||
t = x.find('bar').text
|
||||
print(t)
|
||||
if t != 'abc':
|
||||
raise Exception()
|
||||
|
|
@ -1,12 +0,0 @@
|
|||
summary: Basic smoke test
|
||||
discover:
|
||||
how: shell
|
||||
tests:
|
||||
- name: /smoke/import-python-module
|
||||
test: |
|
||||
python3 -c 'import importlib as il; print(il.import_module("lxml"))'
|
||||
- name: /smoke/etree-fromstring
|
||||
test: |
|
||||
python3 plans/etree-fromstring.py
|
||||
execute:
|
||||
how: tmt
|
||||
1672
python-lxml.spec
1672
python-lxml.spec
File diff suppressed because it is too large
Load diff
2
sources
2
sources
|
|
@ -1 +1 @@
|
|||
SHA512 (lxml-6.0.2-no-isoschematron-rng.tar.gz) = dc89f75c3a3c828a46bcb2eefbebe8f98ce8072b9fb66f8ef81edbf2babed74e4c54e26392603319d60ab3bfab6a4795eedc85b28efba815797d43d53aae4060
|
||||
SHA512 (lxml-4.7.1.tar.gz) = dd0d421e10db6c9084cf5b2c04a4fc54d74bd62b4dfa83efcf92dd46cd1c5f043c47613521b2de04c450b83eb1161d197b017c53e615e5785e97e7afe106b6cf
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue