diff --git a/CVE-2023-52425-libexpat-2.6.0-backport.patch b/CVE-2023-52425-libexpat-2.6.0-backport.patch index 6600f2c..6238018 100644 --- a/CVE-2023-52425-libexpat-2.6.0-backport.patch +++ b/CVE-2023-52425-libexpat-2.6.0-backport.patch @@ -1,57 +1,184 @@ -Index: Python-3.11.9/Lib/test/test_xml_etree.py -=================================================================== ---- Python-3.11.9.orig/Lib/test/test_xml_etree.py -+++ Python-3.11.9/Lib/test/test_xml_etree.py -@@ -1424,9 +1424,13 @@ class XMLPullParserTest(unittest.TestCas - self.assert_event_tags(parser, [('end', 'root')]) - self.assertIsNone(parser.close()) +--- + Lib/test/support/__init__.py | 9 ++++++++- + Lib/test/test_pyexpat.py | 8 ++++---- + Lib/test/test_sax.py | 18 +++++++++--------- + Lib/test/test_xml_etree.py | 12 +++++------- + 4 files changed, 26 insertions(+), 21 deletions(-) + +--- a/Lib/test/support/__init__.py ++++ b/Lib/test/support/__init__.py +@@ -8,6 +8,7 @@ import dataclasses + import functools + import os + import re ++import pyexpat + import stat + import sys + import sysconfig +@@ -56,7 +57,7 @@ __all__ = [ + "run_with_tz", "PGO", "missing_compiler_executable", + "ALWAYS_EQ", "NEVER_EQ", "LARGEST", "SMALLEST", + "LOOPBACK_TIMEOUT", "INTERNET_TIMEOUT", "SHORT_TIMEOUT", "LONG_TIMEOUT", +- "skip_on_s390x", ++ "skip_on_s390x", "fails_with_expat_2_6_0" + ] -+ @unittest.skipIf(pyexpat.version_info < (2, 6, 0), -+ f'Fail with patched version of Expat {pyexpat.version_info}') - def test_simple_xml_chunk_1(self): - self.test_simple_xml(chunk_size=1, flush=True) -+ @unittest.skipIf(pyexpat.version_info < (2, 6, 0), -+ f'Fail with patched version of Expat {pyexpat.version_info}') - def test_simple_xml_chunk_5(self): - self.test_simple_xml(chunk_size=5, flush=True) +@@ -2243,3 +2244,9 @@ def copy_python_src_ignore(path, names): + #Windows doesn't have os.uname() but it doesn't support s390x. + skip_on_s390x = unittest.skipIf(hasattr(os, 'uname') and os.uname().machine == 's390x', + 'skipped on s390x') ++ ++ ++_null_pyexpat_parser=pyexpat.ParserCreate() ++fails_with_expat_2_6_0 = (unittest.expectedFailure ++ if hasattr(_null_pyexpat_parser, 'GetReparseDeferralEnabled') else ++ lambda test: test) +--- a/Lib/test/test_pyexpat.py ++++ b/Lib/test/test_pyexpat.py +@@ -14,8 +14,7 @@ from test.support import os_helper + from xml.parsers import expat + from xml.parsers.expat import errors -@@ -1651,6 +1655,9 @@ class XMLPullParserTest(unittest.TestCas +-from test.support import sortdict, is_emscripten, is_wasi +- ++from test.support import sortdict, is_emscripten, is_wasi, fails_with_expat_2_6_0 - self.assert_event_tags(parser, [('end', 'doc')]) + class SetAttributeTest(unittest.TestCase): + def setUp(self): +@@ -793,6 +792,7 @@ class ReparseDeferralTest(unittest.TestC -+ @unittest.skipIf(pyexpat.version_info < (2, 6, 0), -+ f'Expat {pyexpat.version_info} does not ' -+ 'support reparse deferral') - def test_flush_reparse_deferral_disabled(self): - parser = ET.XMLPullParser(events=('start', 'end')) + self.assertEqual(started, ['doc']) -Index: Python-3.11.9/Lib/test/test_sax.py -=================================================================== ---- Python-3.11.9.orig/Lib/test/test_sax.py -+++ Python-3.11.9/Lib/test/test_sax.py -@@ -1240,6 +1240,9 @@ class ExpatReaderTest(XmlTestBase): ++ @fails_with_expat_2_6_0 + def test_reparse_deferral_disabled(self): + started = [] + +@@ -800,9 +800,9 @@ class ReparseDeferralTest(unittest.TestC + started.append(name) + + parser = expat.ParserCreate() ++ self.assertTrue(hasattr(parser, 'GetReparseDeferralEnabled')) + parser.StartElementHandler = start_element +- if expat.version_info >= (2, 6, 0): +- parser.SetReparseDeferralEnabled(False) ++ parser.SetReparseDeferralEnabled(False) + self.assertFalse(parser.GetReparseDeferralEnabled()) + + for chunk in (b''): +--- a/Lib/test/test_sax.py ++++ b/Lib/test/test_sax.py +@@ -19,13 +19,11 @@ from xml.sax.xmlreader import InputSourc + from io import BytesIO, StringIO + import codecs + import os.path +-import pyexpat + import shutil + import sys + from urllib.error import URLError + import urllib.request +-from test.support import os_helper +-from test.support import findfile ++from test.support import os_helper, findfile, fails_with_expat_2_6_0 + from test.support.os_helper import FakePath, TESTFN + + +@@ -1215,9 +1213,7 @@ class ExpatReaderTest(XmlTestBase): + + self.assertEqual(result.getvalue(), start + b"text") + +- @unittest.skipIf(pyexpat.version_info < (2, 6, 0), +- f'Expat {pyexpat.version_info} does not ' +- 'support reparse deferral') ++ @fails_with_expat_2_6_0 + def test_flush_reparse_deferral_enabled(self): + result = BytesIO() + xmlgen = XMLGenerator(result) +@@ -1227,6 +1223,8 @@ class ExpatReaderTest(XmlTestBase): + for chunk in (""): + parser.feed(chunk) + ++ self.assertTrue(hasattr(parser._parser, 'GetReparseDeferralEnabled')) ++ + self.assertEqual(result.getvalue(), start) # i.e. no elements started + self.assertTrue(parser._parser.GetReparseDeferralEnabled()) + +@@ -1240,6 +1238,7 @@ class ExpatReaderTest(XmlTestBase): self.assertEqual(result.getvalue(), start + b"") -+ @unittest.skipIf(pyexpat.version_info < (2, 6, 0), -+ f'Expat {pyexpat.version_info} does not ' -+ 'support reparse deferral') ++ @fails_with_expat_2_6_0 def test_flush_reparse_deferral_disabled(self): result = BytesIO() xmlgen = XMLGenerator(result) -Index: Python-3.11.9/Lib/test/test_pyexpat.py -=================================================================== ---- Python-3.11.9.orig/Lib/test/test_pyexpat.py -+++ Python-3.11.9/Lib/test/test_pyexpat.py -@@ -794,6 +794,10 @@ class ReparseDeferralTest(unittest.TestC - self.assertEqual(started, ['doc']) +@@ -1249,9 +1248,10 @@ class ExpatReaderTest(XmlTestBase): + for chunk in (""): + parser.feed(chunk) - def test_reparse_deferral_disabled(self): -+ if expat.version_info < (2, 6, 0): -+ self.skipTest(f'Expat {expat.version_info} does not ' -+ 'support reparse deferral') +- if pyexpat.version_info >= (2, 6, 0): +- parser._parser.SetReparseDeferralEnabled(False) +- self.assertEqual(result.getvalue(), start) # i.e. no elements started ++ self.assertTrue(hasattr(parser._parser, 'SetReparseDeferralEnabled')) + - started = [] ++ parser._parser.SetReparseDeferralEnabled(False) ++ self.assertEqual(result.getvalue(), start) # i.e. no elements started - def start_element(name, _): + self.assertFalse(parser._parser.GetReparseDeferralEnabled()) + +--- a/Lib/test/test_xml_etree.py ++++ b/Lib/test/test_xml_etree.py +@@ -13,7 +13,6 @@ import itertools + import operator + import os + import pickle +-import pyexpat + import sys + import textwrap + import types +@@ -26,7 +25,7 @@ from itertools import product, islice + from test import support + from test.support import os_helper + from test.support import warnings_helper +-from test.support import findfile, gc_collect, swap_attr, swap_item ++from test.support import findfile, gc_collect, swap_attr, swap_item, fails_with_expat_2_6_0 + from test.support.import_helper import import_fresh_module + from test.support.os_helper import TESTFN + +@@ -1424,9 +1423,11 @@ class XMLPullParserTest(unittest.TestCas + self.assert_event_tags(parser, [('end', 'root')]) + self.assertIsNone(parser.close()) + ++ @fails_with_expat_2_6_0 + def test_simple_xml_chunk_1(self): + self.test_simple_xml(chunk_size=1, flush=True) + ++ @fails_with_expat_2_6_0 + def test_simple_xml_chunk_5(self): + self.test_simple_xml(chunk_size=5, flush=True) + +@@ -1627,9 +1628,7 @@ class XMLPullParserTest(unittest.TestCas + with self.assertRaises(ValueError): + ET.XMLPullParser(events=('start', 'end', 'bogus')) + +- @unittest.skipIf(pyexpat.version_info < (2, 6, 0), +- f'Expat {pyexpat.version_info} does not ' +- 'support reparse deferral') ++ @fails_with_expat_2_6_0 + def test_flush_reparse_deferral_enabled(self): + parser = ET.XMLPullParser(events=('start', 'end')) + +@@ -1651,13 +1650,12 @@ class XMLPullParserTest(unittest.TestCas + + self.assert_event_tags(parser, [('end', 'doc')]) + ++ @fails_with_expat_2_6_0 + def test_flush_reparse_deferral_disabled(self): + parser = ET.XMLPullParser(events=('start', 'end')) + + for chunk in (""): + parser.feed(chunk) +- +- if pyexpat.version_info >= (2, 6, 0): + if not ET is pyET: + self.skipTest(f'XMLParser.(Get|Set)ReparseDeferralEnabled ' + 'methods not available in C')