forked from pool/python
Accepting request 1169941 from devel:languages:python:Factory
- Modify CVE-2023-27043-email-parsing-errors.patch to fix the unicode string handling in email.utils.parseaddr() (bsc#1222537). - Revert CVE-2022-48560-after-free-heappushpop.patch, the fix was unneeded. - Modify CVE-2023-27043-email-parsing-errors.patch to fix the unicode string handling in email.utils.parseaddr() (bsc#1222537). - Revert CVE-2022-48560-after-free-heappushpop.patch, the fix was unneeded. - Modify CVE-2023-27043-email-parsing-errors.patch to fix the unicode string handling in email.utils.parseaddr() (bsc#1222537). - Revert CVE-2022-48560-after-free-heappushpop.patch, the fix was unneeded. OBS-URL: https://build.opensuse.org/request/show/1169941 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/python?expand=0&rev=194
This commit is contained in:
@@ -1,132 +0,0 @@
|
|||||||
From 5179d30710e6185dc7e6a6098ab23fe068b0d85b Mon Sep 17 00:00:00 2001
|
|
||||||
From: Lumir Balhar <lbalhar@redhat.com>
|
|
||||||
Date: Thu, 23 Nov 2023 13:25:44 +0100
|
|
||||||
Subject: [PATCH] 00408-cve-2022-48560.patch
|
|
||||||
MIME-Version: 1.0
|
|
||||||
Content-Type: text/plain; charset=UTF-8
|
|
||||||
Content-Transfer-Encoding: 8bit
|
|
||||||
|
|
||||||
Security fix for CVE-2022-48560: python3: use after free in heappushpop()
|
|
||||||
of heapq module
|
|
||||||
Resolved upstream: https://github.com/python/cpython/issues/83602
|
|
||||||
|
|
||||||
Backported from Python 3.6.11.
|
|
||||||
|
|
||||||
Co-authored-by: Pablo Galindo <Pablogsal@gmail.com>
|
|
||||||
Co-authored-by: Lumír Balhar <lbalhar@redhat.com>
|
|
||||||
---
|
|
||||||
Lib/test/test_heapq.py | 32 ++++++++++++++++++++++++++++++++
|
|
||||||
Modules/_heapqmodule.c | 31 ++++++++++++++++++++++++-------
|
|
||||||
2 files changed, 56 insertions(+), 7 deletions(-)
|
|
||||||
|
|
||||||
--- a/Lib/test/test_heapq.py
|
|
||||||
+++ b/Lib/test/test_heapq.py
|
|
||||||
@@ -396,6 +396,38 @@ class TestErrorHandling(TestCase):
|
|
||||||
with self.assertRaises((IndexError, RuntimeError)):
|
|
||||||
self.module.heappop(heap)
|
|
||||||
|
|
||||||
+ def test_comparison_operator_modifiying_heap(self):
|
|
||||||
+ # See bpo-39421: Strong references need to be taken
|
|
||||||
+ # when comparing objects as they can alter the heap
|
|
||||||
+ class EvilClass(int):
|
|
||||||
+ def __lt__(self, o):
|
|
||||||
+ heap[:] = []
|
|
||||||
+ return NotImplemented
|
|
||||||
+
|
|
||||||
+ heap = []
|
|
||||||
+ self.module.heappush(heap, EvilClass(0))
|
|
||||||
+ self.assertRaises(IndexError, self.module.heappushpop, heap, 1)
|
|
||||||
+
|
|
||||||
+ def test_comparison_operator_modifiying_heap_two_heaps(self):
|
|
||||||
+
|
|
||||||
+ class h(int):
|
|
||||||
+ def __lt__(self, o):
|
|
||||||
+ list2[:] = []
|
|
||||||
+ return NotImplemented
|
|
||||||
+
|
|
||||||
+ class g(int):
|
|
||||||
+ def __lt__(self, o):
|
|
||||||
+ list1[:] = []
|
|
||||||
+ return NotImplemented
|
|
||||||
+
|
|
||||||
+ list1, list2 = [], []
|
|
||||||
+
|
|
||||||
+ self.module.heappush(list1, h(0))
|
|
||||||
+ self.module.heappush(list2, g(0))
|
|
||||||
+
|
|
||||||
+ self.assertRaises((IndexError, RuntimeError), self.module.heappush, list1, g(1))
|
|
||||||
+ self.assertRaises((IndexError, RuntimeError), self.module.heappush, list2, h(1))
|
|
||||||
+
|
|
||||||
|
|
||||||
class TestErrorHandlingPython(TestErrorHandling):
|
|
||||||
module = py_heapq
|
|
||||||
--- a/Modules/_heapqmodule.c
|
|
||||||
+++ b/Modules/_heapqmodule.c
|
|
||||||
@@ -52,7 +52,11 @@ _siftdown(PyListObject *heap, Py_ssize_t
|
|
||||||
while (pos > startpos) {
|
|
||||||
parentpos = (pos - 1) >> 1;
|
|
||||||
parent = PyList_GET_ITEM(heap, parentpos);
|
|
||||||
+ Py_INCREF(newitem);
|
|
||||||
+ Py_INCREF(parent);
|
|
||||||
cmp = cmp_lt(newitem, parent);
|
|
||||||
+ Py_DECREF(parent);
|
|
||||||
+ Py_DECREF(newitem);
|
|
||||||
if (cmp == -1)
|
|
||||||
return -1;
|
|
||||||
if (size != PyList_GET_SIZE(heap)) {
|
|
||||||
@@ -93,9 +97,13 @@ _siftup(PyListObject *heap, Py_ssize_t p
|
|
||||||
childpos = 2*pos + 1; /* leftmost child position */
|
|
||||||
rightpos = childpos + 1;
|
|
||||||
if (rightpos < endpos) {
|
|
||||||
- cmp = cmp_lt(
|
|
||||||
- PyList_GET_ITEM(heap, childpos),
|
|
||||||
- PyList_GET_ITEM(heap, rightpos));
|
|
||||||
+ PyObject* a = PyList_GET_ITEM(heap, childpos);
|
|
||||||
+ PyObject* b = PyList_GET_ITEM(heap, rightpos);
|
|
||||||
+ Py_INCREF(a);
|
|
||||||
+ Py_INCREF(b);
|
|
||||||
+ cmp = cmp_lt(a, b);
|
|
||||||
+ Py_DECREF(a);
|
|
||||||
+ Py_DECREF(b);
|
|
||||||
if (cmp == -1)
|
|
||||||
return -1;
|
|
||||||
if (cmp == 0)
|
|
||||||
@@ -236,7 +244,10 @@ heappushpop(PyObject *self, PyObject *ar
|
|
||||||
return item;
|
|
||||||
}
|
|
||||||
|
|
||||||
- cmp = cmp_lt(PyList_GET_ITEM(heap, 0), item);
|
|
||||||
+ PyObject* top = PyList_GET_ITEM(heap, 0);
|
|
||||||
+ Py_INCREF(top);
|
|
||||||
+ cmp = cmp_lt(top, item);
|
|
||||||
+ Py_DECREF(top);
|
|
||||||
if (cmp == -1)
|
|
||||||
return NULL;
|
|
||||||
if (cmp == 0) {
|
|
||||||
@@ -395,7 +406,9 @@ _siftdownmax(PyListObject *heap, Py_ssiz
|
|
||||||
while (pos > startpos){
|
|
||||||
parentpos = (pos - 1) >> 1;
|
|
||||||
parent = PyList_GET_ITEM(heap, parentpos);
|
|
||||||
+ Py_INCREF(parent);
|
|
||||||
cmp = cmp_lt(parent, newitem);
|
|
||||||
+ Py_DECREF(parent);
|
|
||||||
if (cmp == -1) {
|
|
||||||
Py_DECREF(newitem);
|
|
||||||
return -1;
|
|
||||||
@@ -436,9 +449,13 @@ _siftupmax(PyListObject *heap, Py_ssize_
|
|
||||||
childpos = 2*pos + 1; /* leftmost child position */
|
|
||||||
rightpos = childpos + 1;
|
|
||||||
if (rightpos < endpos) {
|
|
||||||
- cmp = cmp_lt(
|
|
||||||
- PyList_GET_ITEM(heap, rightpos),
|
|
||||||
- PyList_GET_ITEM(heap, childpos));
|
|
||||||
+ PyObject* a = PyList_GET_ITEM(heap, rightpos);
|
|
||||||
+ PyObject* b = PyList_GET_ITEM(heap, childpos);
|
|
||||||
+ Py_INCREF(a);
|
|
||||||
+ Py_INCREF(b);
|
|
||||||
+ cmp = cmp_lt(a, b);
|
|
||||||
+ Py_DECREF(a);
|
|
||||||
+ Py_DECREF(b);
|
|
||||||
if (cmp == -1) {
|
|
||||||
Py_DECREF(newitem);
|
|
||||||
return -1;
|
|
@@ -1,14 +1,13 @@
|
|||||||
---
|
---
|
||||||
Doc/library/email.utils.rst | 19 -
|
Doc/library/email.utils.rst | 19
|
||||||
Lib/email/utils.py | 151 +++++++-
|
Lib/email/test/test_email.py | 192 +++++++++-
|
||||||
Lib/test/test_email/test_email.py | 187 +++++++++-
|
Lib/email/test/test_email_renamed.py | 50 ++
|
||||||
|
Lib/email/utils.py | 155 +++++++-
|
||||||
Misc/NEWS.d/next/Library/2023-10-20-15-28-08.gh-issue-102988.dStNO7.rst | 8
|
Misc/NEWS.d/next/Library/2023-10-20-15-28-08.gh-issue-102988.dStNO7.rst | 8
|
||||||
4 files changed, 344 insertions(+), 21 deletions(-)
|
5 files changed, 393 insertions(+), 31 deletions(-)
|
||||||
|
|
||||||
Index: Python-2.7.18/Doc/library/email.utils.rst
|
--- a/Doc/library/email.utils.rst
|
||||||
===================================================================
|
+++ b/Doc/library/email.utils.rst
|
||||||
--- Python-2.7.18.orig/Doc/library/email.utils.rst
|
|
||||||
+++ Python-2.7.18/Doc/library/email.utils.rst
|
|
||||||
@@ -21,13 +21,18 @@ There are several useful utilities provi
|
@@ -21,13 +21,18 @@ There are several useful utilities provi
|
||||||
begins with angle brackets, they are stripped off.
|
begins with angle brackets, they are stripped off.
|
||||||
|
|
||||||
@@ -58,10 +57,284 @@ Index: Python-2.7.18/Doc/library/email.utils.rst
|
|||||||
|
|
||||||
.. function:: parsedate(date)
|
.. function:: parsedate(date)
|
||||||
|
|
||||||
Index: Python-2.7.18/Lib/email/utils.py
|
--- a/Lib/email/test/test_email.py
|
||||||
===================================================================
|
+++ b/Lib/email/test/test_email.py
|
||||||
--- Python-2.7.18.orig/Lib/email/utils.py
|
@@ -1,3 +1,4 @@
|
||||||
+++ Python-2.7.18/Lib/email/utils.py
|
+# -*- coding: utf-8 -*-
|
||||||
|
# Copyright (C) 2001-2010 Python Software Foundation
|
||||||
|
# Contact: email-sig@python.org
|
||||||
|
# email package unit tests
|
||||||
|
@@ -2414,15 +2415,142 @@ Foo
|
||||||
|
[('Al Person', 'aperson@dom.ain'),
|
||||||
|
('Bud Person', 'bperson@dom.ain')])
|
||||||
|
|
||||||
|
+ def test_parsing_errors(self):
|
||||||
|
+ """Test for parsing errors from CVE-2023-27043 and CVE-2019-16056"""
|
||||||
|
+ alice = 'alice@example.org'
|
||||||
|
+ bob = 'bob@example.com'
|
||||||
|
+ empty = ('', '')
|
||||||
|
+
|
||||||
|
+ # Test Utils.getaddresses() and Utils.parseaddr() on malformed email
|
||||||
|
+ # addresses: default behavior (strict=True) rejects malformed address,
|
||||||
|
+ # and strict=False which tolerates malformed address.
|
||||||
|
+ for invalid_separator, expected_non_strict in (
|
||||||
|
+ ('(', [('<%s>' % bob, alice)]),
|
||||||
|
+ (')', [('', alice), empty, ('', bob)]),
|
||||||
|
+ ('<', [('', alice), empty, ('', bob), empty]),
|
||||||
|
+ ('>', [('', alice), empty, ('', bob)]),
|
||||||
|
+ ('[', [('', '%s[<%s>]' % (alice, bob))]),
|
||||||
|
+ (']', [('', alice), empty, ('', bob)]),
|
||||||
|
+ ('@', [empty, empty, ('', bob)]),
|
||||||
|
+ (';', [('', alice), empty, ('', bob)]),
|
||||||
|
+ (':', [('', alice), ('', bob)]),
|
||||||
|
+ ('.', [('', alice + '.'), ('', bob)]),
|
||||||
|
+ ('"', [('', alice), ('', '<%s>' % bob)]),
|
||||||
|
+ ):
|
||||||
|
+ address = '%s%s<%s>' % (alice, invalid_separator, bob)
|
||||||
|
+ self.assertEqual(Utils.getaddresses([address]),
|
||||||
|
+ [empty])
|
||||||
|
+ self.assertEqual(Utils.getaddresses([address], strict=False),
|
||||||
|
+ expected_non_strict)
|
||||||
|
+
|
||||||
|
+ self.assertEqual(Utils.parseaddr([address]),
|
||||||
|
+ empty)
|
||||||
|
+ self.assertEqual(Utils.parseaddr([address], strict=False),
|
||||||
|
+ ('', address))
|
||||||
|
+
|
||||||
|
+ # Comma (',') is treated differently depending on strict parameter.
|
||||||
|
+ # Comma without quotes.
|
||||||
|
+ address = '%s,<%s>' % (alice, bob)
|
||||||
|
+ self.assertEqual(Utils.getaddresses([address]),
|
||||||
|
+ [('', alice), ('', bob)])
|
||||||
|
+ self.assertEqual(Utils.getaddresses([address], strict=False),
|
||||||
|
+ [('', alice), ('', bob)])
|
||||||
|
+ self.assertEqual(Utils.parseaddr([address]),
|
||||||
|
+ empty)
|
||||||
|
+ self.assertEqual(Utils.parseaddr([address], strict=False),
|
||||||
|
+ ('', address))
|
||||||
|
+
|
||||||
|
+ # Real name between quotes containing comma.
|
||||||
|
+ address = '"Alice, alice@example.org" <bob@example.com>'
|
||||||
|
+ expected_strict = ('Alice, alice@example.org', 'bob@example.com')
|
||||||
|
+ self.assertEqual(Utils.getaddresses([address]), [expected_strict])
|
||||||
|
+ self.assertEqual(Utils.getaddresses([address], strict=False), [expected_strict])
|
||||||
|
+ self.assertEqual(Utils.parseaddr([address]), expected_strict)
|
||||||
|
+ self.assertEqual(Utils.parseaddr([address], strict=False),
|
||||||
|
+ ('', address))
|
||||||
|
+
|
||||||
|
+ # Valid parenthesis in comments.
|
||||||
|
+ address = 'alice@example.org (Alice)'
|
||||||
|
+ expected_strict = ('Alice', 'alice@example.org')
|
||||||
|
+ self.assertEqual(Utils.getaddresses([address]), [expected_strict])
|
||||||
|
+ self.assertEqual(Utils.getaddresses([address], strict=False), [expected_strict])
|
||||||
|
+ self.assertEqual(Utils.parseaddr([address]), expected_strict)
|
||||||
|
+ self.assertEqual(Utils.parseaddr([address], strict=False),
|
||||||
|
+ ('', address))
|
||||||
|
+
|
||||||
|
+ # Invalid parenthesis in comments.
|
||||||
|
+ address = 'alice@example.org )Alice('
|
||||||
|
+ self.assertEqual(Utils.getaddresses([address]), [empty])
|
||||||
|
+ self.assertEqual(Utils.getaddresses([address], strict=False),
|
||||||
|
+ [('', 'alice@example.org'), ('', ''), ('', 'Alice')])
|
||||||
|
+ self.assertEqual(Utils.parseaddr([address]), empty)
|
||||||
|
+ self.assertEqual(Utils.parseaddr([address], strict=False),
|
||||||
|
+ ('', address))
|
||||||
|
+
|
||||||
|
+ # Two addresses with quotes separated by comma.
|
||||||
|
+ address = '"Jane Doe" <jane@example.net>, "John Doe" <john@example.net>'
|
||||||
|
+ self.assertEqual(Utils.getaddresses([address]),
|
||||||
|
+ [('Jane Doe', 'jane@example.net'),
|
||||||
|
+ ('John Doe', 'john@example.net')])
|
||||||
|
+ self.assertEqual(Utils.getaddresses([address], strict=False),
|
||||||
|
+ [('Jane Doe', 'jane@example.net'),
|
||||||
|
+ ('John Doe', 'john@example.net')])
|
||||||
|
+ self.assertEqual(Utils.parseaddr([address]), empty)
|
||||||
|
+ self.assertEqual(Utils.parseaddr([address], strict=False),
|
||||||
|
+ ('', address))
|
||||||
|
+
|
||||||
|
+ # Test Utils.supports_strict_parsing attribute
|
||||||
|
+ self.assertEqual(Utils.supports_strict_parsing, True)
|
||||||
|
+
|
||||||
|
+ def test_parsing_unicode_str(self):
|
||||||
|
+ email_in = "Honza Novák <honza@example.com>"
|
||||||
|
+ self.assertEqual(Utils.parseaddr("Honza str Novák <honza@example.com>"),
|
||||||
|
+ ('Honza str Nov\xc3\xa1k', 'honza@example.com'))
|
||||||
|
+ self.assertEqual(Utils.parseaddr(u"Honza unicode Novák <honza@example.com>"),
|
||||||
|
+ (u'Honza unicode Nov\xe1k', u'honza@example.com'))
|
||||||
|
+
|
||||||
|
def test_getaddresses_nasty(self):
|
||||||
|
- eq = self.assertEqual
|
||||||
|
- eq(Utils.getaddresses(['foo: ;']), [('', '')])
|
||||||
|
- eq(Utils.getaddresses(
|
||||||
|
- ['[]*-- =~$']),
|
||||||
|
- [('', ''), ('', ''), ('', '*--')])
|
||||||
|
- eq(Utils.getaddresses(
|
||||||
|
- ['foo: ;', '"Jason R. Mastaler" <jason@dom.ain>']),
|
||||||
|
- [('', ''), ('Jason R. Mastaler', 'jason@dom.ain')])
|
||||||
|
+ for addresses, expected in (
|
||||||
|
+ ([u'"Sürname, Firstname" <to@example.com>'],
|
||||||
|
+ [(u'Sürname, Firstname', 'to@example.com')]),
|
||||||
|
+
|
||||||
|
+ (['foo: ;'],
|
||||||
|
+ [('', '')]),
|
||||||
|
+
|
||||||
|
+ (['foo: ;', '"Jason R. Mastaler" <jason@dom.ain>'],
|
||||||
|
+ [('', ''), ('Jason R. Mastaler', 'jason@dom.ain')]),
|
||||||
|
+
|
||||||
|
+ ([r'Pete(A nice \) chap) <pete(his account)@silly.test(his host)>'],
|
||||||
|
+ [('Pete (A nice ) chap his account his host)', 'pete@silly.test')]),
|
||||||
|
+
|
||||||
|
+ (['(Empty list)(start)Undisclosed recipients :(nobody(I know))'],
|
||||||
|
+ [('', '')]),
|
||||||
|
+
|
||||||
|
+ (['Mary <@machine.tld:mary@example.net>, , jdoe@test . example'],
|
||||||
|
+ [('Mary', 'mary@example.net'), ('', ''), ('', 'jdoe@test.example')]),
|
||||||
|
+
|
||||||
|
+ (['John Doe <jdoe@machine(comment). example>'],
|
||||||
|
+ [('John Doe (comment)', 'jdoe@machine.example')]),
|
||||||
|
+
|
||||||
|
+ (['"Mary Smith: Personal Account" <smith@home.example>'],
|
||||||
|
+ [('Mary Smith: Personal Account', 'smith@home.example')]),
|
||||||
|
+
|
||||||
|
+ (['Undisclosed recipients:;'],
|
||||||
|
+ [('', '')]),
|
||||||
|
+
|
||||||
|
+ ([r'<boss@nil.test>, "Giant; \"Big\" Box" <bob@example.net>'],
|
||||||
|
+ [('', 'boss@nil.test'), ('Giant; "Big" Box', 'bob@example.net')]),
|
||||||
|
+ ):
|
||||||
|
+ self.assertEqual(Utils.getaddresses(addresses),
|
||||||
|
+ expected)
|
||||||
|
+ self.assertEqual(Utils.getaddresses(addresses, strict=False),
|
||||||
|
+ expected)
|
||||||
|
+
|
||||||
|
+ addresses = ['[]*-- =~$']
|
||||||
|
+ self.assertEqual(Utils.getaddresses(addresses),
|
||||||
|
+ [('', '')])
|
||||||
|
+ self.assertEqual(Utils.getaddresses(addresses, strict=False),
|
||||||
|
+ [('', ''), ('', ''), ('', '*--')])
|
||||||
|
|
||||||
|
def test_getaddresses_embedded_comment(self):
|
||||||
|
"""Test proper handling of a nested comment"""
|
||||||
|
@@ -2430,6 +2558,54 @@ Foo
|
||||||
|
addrs = Utils.getaddresses(['User ((nested comment)) <foo@bar.com>'])
|
||||||
|
eq(addrs[0][1], 'foo@bar.com')
|
||||||
|
|
||||||
|
+ def test_iter_escaped_chars(self):
|
||||||
|
+ self.assertEqual(list(Utils._iter_escaped_chars(r'a\\b\"c\\"d')),
|
||||||
|
+ [(0, 'a'),
|
||||||
|
+ (2, '\\\\'),
|
||||||
|
+ (3, 'b'),
|
||||||
|
+ (5, '\\"'),
|
||||||
|
+ (6, 'c'),
|
||||||
|
+ (8, '\\\\'),
|
||||||
|
+ (9, '"'),
|
||||||
|
+ (10, 'd')])
|
||||||
|
+ self.assertEqual(list(Utils._iter_escaped_chars('a\\')),
|
||||||
|
+ [(0, 'a'), (1, '\\')])
|
||||||
|
+
|
||||||
|
+ def test_strip_quoted_realnames(self):
|
||||||
|
+ def check(addr, expected):
|
||||||
|
+ self.assertEqual(Utils._strip_quoted_realnames(addr), expected)
|
||||||
|
+
|
||||||
|
+ check('"Jane Doe" <jane@example.net>, "John Doe" <john@example.net>',
|
||||||
|
+ ' <jane@example.net>, <john@example.net>')
|
||||||
|
+ check(r'"Jane \"Doe\"." <jane@example.net>',
|
||||||
|
+ ' <jane@example.net>')
|
||||||
|
+
|
||||||
|
+ # special cases
|
||||||
|
+ check(r'before"name"after', 'beforeafter')
|
||||||
|
+ check(r'before"name"', 'before')
|
||||||
|
+ check(r'b"name"', 'b') # single char
|
||||||
|
+ check(r'"name"after', 'after')
|
||||||
|
+ check(r'"name"a', 'a') # single char
|
||||||
|
+ check(r'"name"', '')
|
||||||
|
+
|
||||||
|
+ # no change
|
||||||
|
+ for addr in (
|
||||||
|
+ 'Jane Doe <jane@example.net>, John Doe <john@example.net>',
|
||||||
|
+ 'lone " quote',
|
||||||
|
+ ):
|
||||||
|
+ self.assertEqual(Utils._strip_quoted_realnames(addr), addr)
|
||||||
|
+
|
||||||
|
+ def test_check_parenthesis(self):
|
||||||
|
+ addr = 'alice@example.net'
|
||||||
|
+ self.assertTrue(Utils._check_parenthesis('%s (Alice)' % addr))
|
||||||
|
+ self.assertFalse(Utils._check_parenthesis('%s )Alice(' % addr))
|
||||||
|
+ self.assertFalse(Utils._check_parenthesis('%s (Alice))' % addr))
|
||||||
|
+ self.assertFalse(Utils._check_parenthesis('%s ((Alice)' % addr))
|
||||||
|
+
|
||||||
|
+ # Ignore real name between quotes
|
||||||
|
+ self.assertTrue(Utils._check_parenthesis('")Alice((" %s' % addr))
|
||||||
|
+
|
||||||
|
+
|
||||||
|
def test_make_msgid_collisions(self):
|
||||||
|
# Test make_msgid uniqueness, even with multiple threads
|
||||||
|
class MsgidsThread(Thread):
|
||||||
|
--- a/Lib/email/test/test_email_renamed.py
|
||||||
|
+++ b/Lib/email/test/test_email_renamed.py
|
||||||
|
@@ -1,3 +1,4 @@
|
||||||
|
+# -*- coding: utf-8 -*-
|
||||||
|
# Copyright (C) 2001-2007 Python Software Foundation
|
||||||
|
# Contact: email-sig@python.org
|
||||||
|
# email package unit tests
|
||||||
|
@@ -2276,14 +2277,47 @@ Foo
|
||||||
|
('Bud Person', 'bperson@dom.ain')])
|
||||||
|
|
||||||
|
def test_getaddresses_nasty(self):
|
||||||
|
- eq = self.assertEqual
|
||||||
|
- eq(utils.getaddresses(['foo: ;']), [('', '')])
|
||||||
|
- eq(utils.getaddresses(
|
||||||
|
- ['[]*-- =~$']),
|
||||||
|
- [('', ''), ('', ''), ('', '*--')])
|
||||||
|
- eq(utils.getaddresses(
|
||||||
|
- ['foo: ;', '"Jason R. Mastaler" <jason@dom.ain>']),
|
||||||
|
- [('', ''), ('Jason R. Mastaler', 'jason@dom.ain')])
|
||||||
|
+ for addresses, expected in (
|
||||||
|
+ ([u'"Sürname, Firstname" <to@example.com>'],
|
||||||
|
+ [(u'Sürname, Firstname', 'to@example.com')]),
|
||||||
|
+
|
||||||
|
+ (['foo: ;'],
|
||||||
|
+ [('', '')]),
|
||||||
|
+
|
||||||
|
+ (['foo: ;', '"Jason R. Mastaler" <jason@dom.ain>'],
|
||||||
|
+ [('', ''), ('Jason R. Mastaler', 'jason@dom.ain')]),
|
||||||
|
+
|
||||||
|
+ ([r'Pete(A nice \) chap) <pete(his account)@silly.test(his host)>'],
|
||||||
|
+ [('Pete (A nice ) chap his account his host)', 'pete@silly.test')]),
|
||||||
|
+
|
||||||
|
+ (['(Empty list)(start)Undisclosed recipients :(nobody(I know))'],
|
||||||
|
+ [('', '')]),
|
||||||
|
+
|
||||||
|
+ (['Mary <@machine.tld:mary@example.net>, , jdoe@test . example'],
|
||||||
|
+ [('Mary', 'mary@example.net'), ('', ''), ('', 'jdoe@test.example')]),
|
||||||
|
+
|
||||||
|
+ (['John Doe <jdoe@machine(comment). example>'],
|
||||||
|
+ [('John Doe (comment)', 'jdoe@machine.example')]),
|
||||||
|
+
|
||||||
|
+ (['"Mary Smith: Personal Account" <smith@home.example>'],
|
||||||
|
+ [('Mary Smith: Personal Account', 'smith@home.example')]),
|
||||||
|
+
|
||||||
|
+ (['Undisclosed recipients:;'],
|
||||||
|
+ [('', '')]),
|
||||||
|
+
|
||||||
|
+ ([r'<boss@nil.test>, "Giant; \"Big\" Box" <bob@example.net>'],
|
||||||
|
+ [('', 'boss@nil.test'), ('Giant; "Big" Box', 'bob@example.net')]),
|
||||||
|
+ ):
|
||||||
|
+ self.assertEqual(utils.getaddresses(addresses),
|
||||||
|
+ expected)
|
||||||
|
+ self.assertEqual(utils.getaddresses(addresses, strict=False),
|
||||||
|
+ expected)
|
||||||
|
+
|
||||||
|
+ addresses = ['[]*-- =~$']
|
||||||
|
+ self.assertEqual(utils.getaddresses(addresses),
|
||||||
|
+ [('', '')])
|
||||||
|
+ self.assertEqual(utils.getaddresses(addresses, strict=False),
|
||||||
|
+ [('', ''), ('', ''), ('', '*--')])
|
||||||
|
|
||||||
|
def test_getaddresses_embedded_comment(self):
|
||||||
|
"""Test proper handling of a nested comment"""
|
||||||
|
--- a/Lib/email/utils.py
|
||||||
|
+++ b/Lib/email/utils.py
|
||||||
@@ -100,15 +100,93 @@ def formataddr(pair):
|
@@ -100,15 +100,93 @@ def formataddr(pair):
|
||||||
return address
|
return address
|
||||||
|
|
||||||
@@ -190,7 +463,7 @@ Index: Python-2.7.18/Lib/email/utils.py
|
|||||||
+ if isinstance(addr, list):
|
+ if isinstance(addr, list):
|
||||||
+ addr = addr[0]
|
+ addr = addr[0]
|
||||||
+
|
+
|
||||||
+ if not isinstance(addr, str):
|
+ if not isinstance(addr, basestring):
|
||||||
+ return ('', '')
|
+ return ('', '')
|
||||||
+
|
+
|
||||||
+ addr = _pre_parse_validation([addr])[0]
|
+ addr = _pre_parse_validation([addr])[0]
|
||||||
@@ -242,10 +515,8 @@ Index: Python-2.7.18/Lib/email/utils.py
|
|||||||
# rfc822.unquote() doesn't properly de-backslash-ify in Python pre-2.3.
|
# rfc822.unquote() doesn't properly de-backslash-ify in Python pre-2.3.
|
||||||
def unquote(str):
|
def unquote(str):
|
||||||
"""Remove quotes from a string."""
|
"""Remove quotes from a string."""
|
||||||
Index: Python-2.7.18/Misc/NEWS.d/next/Library/2023-10-20-15-28-08.gh-issue-102988.dStNO7.rst
|
|
||||||
===================================================================
|
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ Python-2.7.18/Misc/NEWS.d/next/Library/2023-10-20-15-28-08.gh-issue-102988.dStNO7.rst
|
+++ b/Misc/NEWS.d/next/Library/2023-10-20-15-28-08.gh-issue-102988.dStNO7.rst
|
||||||
@@ -0,0 +1,8 @@
|
@@ -0,0 +1,8 @@
|
||||||
+:func:`email.utils.getaddresses` and :func:`email.utils.parseaddr` now
|
+:func:`email.utils.getaddresses` and :func:`email.utils.parseaddr` now
|
||||||
+return ``('', '')`` 2-tuples in more situations where invalid email
|
+return ``('', '')`` 2-tuples in more situations where invalid email
|
||||||
@@ -255,276 +526,3 @@ Index: Python-2.7.18/Misc/NEWS.d/next/Library/2023-10-20-15-28-08.gh-issue-10298
|
|||||||
+``getattr(email.utils, 'supports_strict_parsing', False)`` can be use to check
|
+``getattr(email.utils, 'supports_strict_parsing', False)`` can be use to check
|
||||||
+if the *strict* paramater is available. Patch by Thomas Dwyer and Victor
|
+if the *strict* paramater is available. Patch by Thomas Dwyer and Victor
|
||||||
+Stinner to improve the CVE-2023-27043 fix.
|
+Stinner to improve the CVE-2023-27043 fix.
|
||||||
Index: Python-2.7.18/Lib/email/test/test_email.py
|
|
||||||
===================================================================
|
|
||||||
--- Python-2.7.18.orig/Lib/email/test/test_email.py
|
|
||||||
+++ Python-2.7.18/Lib/email/test/test_email.py
|
|
||||||
@@ -1,3 +1,4 @@
|
|
||||||
+# -*- coding: utf-8 -*-
|
|
||||||
# Copyright (C) 2001-2010 Python Software Foundation
|
|
||||||
# Contact: email-sig@python.org
|
|
||||||
# email package unit tests
|
|
||||||
@@ -2414,15 +2415,135 @@ Foo
|
|
||||||
[('Al Person', 'aperson@dom.ain'),
|
|
||||||
('Bud Person', 'bperson@dom.ain')])
|
|
||||||
|
|
||||||
+ def test_parsing_errors(self):
|
|
||||||
+ """Test for parsing errors from CVE-2023-27043 and CVE-2019-16056"""
|
|
||||||
+ alice = 'alice@example.org'
|
|
||||||
+ bob = 'bob@example.com'
|
|
||||||
+ empty = ('', '')
|
|
||||||
+
|
|
||||||
+ # Test Utils.getaddresses() and Utils.parseaddr() on malformed email
|
|
||||||
+ # addresses: default behavior (strict=True) rejects malformed address,
|
|
||||||
+ # and strict=False which tolerates malformed address.
|
|
||||||
+ for invalid_separator, expected_non_strict in (
|
|
||||||
+ ('(', [('<%s>' % bob, alice)]),
|
|
||||||
+ (')', [('', alice), empty, ('', bob)]),
|
|
||||||
+ ('<', [('', alice), empty, ('', bob), empty]),
|
|
||||||
+ ('>', [('', alice), empty, ('', bob)]),
|
|
||||||
+ ('[', [('', '%s[<%s>]' % (alice, bob))]),
|
|
||||||
+ (']', [('', alice), empty, ('', bob)]),
|
|
||||||
+ ('@', [empty, empty, ('', bob)]),
|
|
||||||
+ (';', [('', alice), empty, ('', bob)]),
|
|
||||||
+ (':', [('', alice), ('', bob)]),
|
|
||||||
+ ('.', [('', alice + '.'), ('', bob)]),
|
|
||||||
+ ('"', [('', alice), ('', '<%s>' % bob)]),
|
|
||||||
+ ):
|
|
||||||
+ address = '%s%s<%s>' % (alice, invalid_separator, bob)
|
|
||||||
+ self.assertEqual(Utils.getaddresses([address]),
|
|
||||||
+ [empty])
|
|
||||||
+ self.assertEqual(Utils.getaddresses([address], strict=False),
|
|
||||||
+ expected_non_strict)
|
|
||||||
+
|
|
||||||
+ self.assertEqual(Utils.parseaddr([address]),
|
|
||||||
+ empty)
|
|
||||||
+ self.assertEqual(Utils.parseaddr([address], strict=False),
|
|
||||||
+ ('', address))
|
|
||||||
+
|
|
||||||
+ # Comma (',') is treated differently depending on strict parameter.
|
|
||||||
+ # Comma without quotes.
|
|
||||||
+ address = '%s,<%s>' % (alice, bob)
|
|
||||||
+ self.assertEqual(Utils.getaddresses([address]),
|
|
||||||
+ [('', alice), ('', bob)])
|
|
||||||
+ self.assertEqual(Utils.getaddresses([address], strict=False),
|
|
||||||
+ [('', alice), ('', bob)])
|
|
||||||
+ self.assertEqual(Utils.parseaddr([address]),
|
|
||||||
+ empty)
|
|
||||||
+ self.assertEqual(Utils.parseaddr([address], strict=False),
|
|
||||||
+ ('', address))
|
|
||||||
+
|
|
||||||
+ # Real name between quotes containing comma.
|
|
||||||
+ address = '"Alice, alice@example.org" <bob@example.com>'
|
|
||||||
+ expected_strict = ('Alice, alice@example.org', 'bob@example.com')
|
|
||||||
+ self.assertEqual(Utils.getaddresses([address]), [expected_strict])
|
|
||||||
+ self.assertEqual(Utils.getaddresses([address], strict=False), [expected_strict])
|
|
||||||
+ self.assertEqual(Utils.parseaddr([address]), expected_strict)
|
|
||||||
+ self.assertEqual(Utils.parseaddr([address], strict=False),
|
|
||||||
+ ('', address))
|
|
||||||
+
|
|
||||||
+ # Valid parenthesis in comments.
|
|
||||||
+ address = 'alice@example.org (Alice)'
|
|
||||||
+ expected_strict = ('Alice', 'alice@example.org')
|
|
||||||
+ self.assertEqual(Utils.getaddresses([address]), [expected_strict])
|
|
||||||
+ self.assertEqual(Utils.getaddresses([address], strict=False), [expected_strict])
|
|
||||||
+ self.assertEqual(Utils.parseaddr([address]), expected_strict)
|
|
||||||
+ self.assertEqual(Utils.parseaddr([address], strict=False),
|
|
||||||
+ ('', address))
|
|
||||||
+
|
|
||||||
+ # Invalid parenthesis in comments.
|
|
||||||
+ address = 'alice@example.org )Alice('
|
|
||||||
+ self.assertEqual(Utils.getaddresses([address]), [empty])
|
|
||||||
+ self.assertEqual(Utils.getaddresses([address], strict=False),
|
|
||||||
+ [('', 'alice@example.org'), ('', ''), ('', 'Alice')])
|
|
||||||
+ self.assertEqual(Utils.parseaddr([address]), empty)
|
|
||||||
+ self.assertEqual(Utils.parseaddr([address], strict=False),
|
|
||||||
+ ('', address))
|
|
||||||
+
|
|
||||||
+ # Two addresses with quotes separated by comma.
|
|
||||||
+ address = '"Jane Doe" <jane@example.net>, "John Doe" <john@example.net>'
|
|
||||||
+ self.assertEqual(Utils.getaddresses([address]),
|
|
||||||
+ [('Jane Doe', 'jane@example.net'),
|
|
||||||
+ ('John Doe', 'john@example.net')])
|
|
||||||
+ self.assertEqual(Utils.getaddresses([address], strict=False),
|
|
||||||
+ [('Jane Doe', 'jane@example.net'),
|
|
||||||
+ ('John Doe', 'john@example.net')])
|
|
||||||
+ self.assertEqual(Utils.parseaddr([address]), empty)
|
|
||||||
+ self.assertEqual(Utils.parseaddr([address], strict=False),
|
|
||||||
+ ('', address))
|
|
||||||
+
|
|
||||||
+ # Test Utils.supports_strict_parsing attribute
|
|
||||||
+ self.assertEqual(Utils.supports_strict_parsing, True)
|
|
||||||
+
|
|
||||||
def test_getaddresses_nasty(self):
|
|
||||||
- eq = self.assertEqual
|
|
||||||
- eq(Utils.getaddresses(['foo: ;']), [('', '')])
|
|
||||||
- eq(Utils.getaddresses(
|
|
||||||
- ['[]*-- =~$']),
|
|
||||||
- [('', ''), ('', ''), ('', '*--')])
|
|
||||||
- eq(Utils.getaddresses(
|
|
||||||
- ['foo: ;', '"Jason R. Mastaler" <jason@dom.ain>']),
|
|
||||||
- [('', ''), ('Jason R. Mastaler', 'jason@dom.ain')])
|
|
||||||
+ for addresses, expected in (
|
|
||||||
+ ([u'"Sürname, Firstname" <to@example.com>'],
|
|
||||||
+ [(u'Sürname, Firstname', 'to@example.com')]),
|
|
||||||
+
|
|
||||||
+ (['foo: ;'],
|
|
||||||
+ [('', '')]),
|
|
||||||
+
|
|
||||||
+ (['foo: ;', '"Jason R. Mastaler" <jason@dom.ain>'],
|
|
||||||
+ [('', ''), ('Jason R. Mastaler', 'jason@dom.ain')]),
|
|
||||||
+
|
|
||||||
+ ([r'Pete(A nice \) chap) <pete(his account)@silly.test(his host)>'],
|
|
||||||
+ [('Pete (A nice ) chap his account his host)', 'pete@silly.test')]),
|
|
||||||
+
|
|
||||||
+ (['(Empty list)(start)Undisclosed recipients :(nobody(I know))'],
|
|
||||||
+ [('', '')]),
|
|
||||||
+
|
|
||||||
+ (['Mary <@machine.tld:mary@example.net>, , jdoe@test . example'],
|
|
||||||
+ [('Mary', 'mary@example.net'), ('', ''), ('', 'jdoe@test.example')]),
|
|
||||||
+
|
|
||||||
+ (['John Doe <jdoe@machine(comment). example>'],
|
|
||||||
+ [('John Doe (comment)', 'jdoe@machine.example')]),
|
|
||||||
+
|
|
||||||
+ (['"Mary Smith: Personal Account" <smith@home.example>'],
|
|
||||||
+ [('Mary Smith: Personal Account', 'smith@home.example')]),
|
|
||||||
+
|
|
||||||
+ (['Undisclosed recipients:;'],
|
|
||||||
+ [('', '')]),
|
|
||||||
+
|
|
||||||
+ ([r'<boss@nil.test>, "Giant; \"Big\" Box" <bob@example.net>'],
|
|
||||||
+ [('', 'boss@nil.test'), ('Giant; "Big" Box', 'bob@example.net')]),
|
|
||||||
+ ):
|
|
||||||
+ self.assertEqual(Utils.getaddresses(addresses),
|
|
||||||
+ expected)
|
|
||||||
+ self.assertEqual(Utils.getaddresses(addresses, strict=False),
|
|
||||||
+ expected)
|
|
||||||
+
|
|
||||||
+ addresses = ['[]*-- =~$']
|
|
||||||
+ self.assertEqual(Utils.getaddresses(addresses),
|
|
||||||
+ [('', '')])
|
|
||||||
+ self.assertEqual(Utils.getaddresses(addresses, strict=False),
|
|
||||||
+ [('', ''), ('', ''), ('', '*--')])
|
|
||||||
|
|
||||||
def test_getaddresses_embedded_comment(self):
|
|
||||||
"""Test proper handling of a nested comment"""
|
|
||||||
@@ -2430,6 +2551,54 @@ Foo
|
|
||||||
addrs = Utils.getaddresses(['User ((nested comment)) <foo@bar.com>'])
|
|
||||||
eq(addrs[0][1], 'foo@bar.com')
|
|
||||||
|
|
||||||
+ def test_iter_escaped_chars(self):
|
|
||||||
+ self.assertEqual(list(Utils._iter_escaped_chars(r'a\\b\"c\\"d')),
|
|
||||||
+ [(0, 'a'),
|
|
||||||
+ (2, '\\\\'),
|
|
||||||
+ (3, 'b'),
|
|
||||||
+ (5, '\\"'),
|
|
||||||
+ (6, 'c'),
|
|
||||||
+ (8, '\\\\'),
|
|
||||||
+ (9, '"'),
|
|
||||||
+ (10, 'd')])
|
|
||||||
+ self.assertEqual(list(Utils._iter_escaped_chars('a\\')),
|
|
||||||
+ [(0, 'a'), (1, '\\')])
|
|
||||||
+
|
|
||||||
+ def test_strip_quoted_realnames(self):
|
|
||||||
+ def check(addr, expected):
|
|
||||||
+ self.assertEqual(Utils._strip_quoted_realnames(addr), expected)
|
|
||||||
+
|
|
||||||
+ check('"Jane Doe" <jane@example.net>, "John Doe" <john@example.net>',
|
|
||||||
+ ' <jane@example.net>, <john@example.net>')
|
|
||||||
+ check(r'"Jane \"Doe\"." <jane@example.net>',
|
|
||||||
+ ' <jane@example.net>')
|
|
||||||
+
|
|
||||||
+ # special cases
|
|
||||||
+ check(r'before"name"after', 'beforeafter')
|
|
||||||
+ check(r'before"name"', 'before')
|
|
||||||
+ check(r'b"name"', 'b') # single char
|
|
||||||
+ check(r'"name"after', 'after')
|
|
||||||
+ check(r'"name"a', 'a') # single char
|
|
||||||
+ check(r'"name"', '')
|
|
||||||
+
|
|
||||||
+ # no change
|
|
||||||
+ for addr in (
|
|
||||||
+ 'Jane Doe <jane@example.net>, John Doe <john@example.net>',
|
|
||||||
+ 'lone " quote',
|
|
||||||
+ ):
|
|
||||||
+ self.assertEqual(Utils._strip_quoted_realnames(addr), addr)
|
|
||||||
+
|
|
||||||
+ def test_check_parenthesis(self):
|
|
||||||
+ addr = 'alice@example.net'
|
|
||||||
+ self.assertTrue(Utils._check_parenthesis('%s (Alice)' % addr))
|
|
||||||
+ self.assertFalse(Utils._check_parenthesis('%s )Alice(' % addr))
|
|
||||||
+ self.assertFalse(Utils._check_parenthesis('%s (Alice))' % addr))
|
|
||||||
+ self.assertFalse(Utils._check_parenthesis('%s ((Alice)' % addr))
|
|
||||||
+
|
|
||||||
+ # Ignore real name between quotes
|
|
||||||
+ self.assertTrue(Utils._check_parenthesis('")Alice((" %s' % addr))
|
|
||||||
+
|
|
||||||
+
|
|
||||||
def test_make_msgid_collisions(self):
|
|
||||||
# Test make_msgid uniqueness, even with multiple threads
|
|
||||||
class MsgidsThread(Thread):
|
|
||||||
Index: Python-2.7.18/Lib/email/test/test_email_renamed.py
|
|
||||||
===================================================================
|
|
||||||
--- Python-2.7.18.orig/Lib/email/test/test_email_renamed.py
|
|
||||||
+++ Python-2.7.18/Lib/email/test/test_email_renamed.py
|
|
||||||
@@ -1,3 +1,4 @@
|
|
||||||
+# -*- coding: utf-8 -*-
|
|
||||||
# Copyright (C) 2001-2007 Python Software Foundation
|
|
||||||
# Contact: email-sig@python.org
|
|
||||||
# email package unit tests
|
|
||||||
@@ -2276,14 +2277,47 @@ Foo
|
|
||||||
('Bud Person', 'bperson@dom.ain')])
|
|
||||||
|
|
||||||
def test_getaddresses_nasty(self):
|
|
||||||
- eq = self.assertEqual
|
|
||||||
- eq(utils.getaddresses(['foo: ;']), [('', '')])
|
|
||||||
- eq(utils.getaddresses(
|
|
||||||
- ['[]*-- =~$']),
|
|
||||||
- [('', ''), ('', ''), ('', '*--')])
|
|
||||||
- eq(utils.getaddresses(
|
|
||||||
- ['foo: ;', '"Jason R. Mastaler" <jason@dom.ain>']),
|
|
||||||
- [('', ''), ('Jason R. Mastaler', 'jason@dom.ain')])
|
|
||||||
+ for addresses, expected in (
|
|
||||||
+ ([u'"Sürname, Firstname" <to@example.com>'],
|
|
||||||
+ [(u'Sürname, Firstname', 'to@example.com')]),
|
|
||||||
+
|
|
||||||
+ (['foo: ;'],
|
|
||||||
+ [('', '')]),
|
|
||||||
+
|
|
||||||
+ (['foo: ;', '"Jason R. Mastaler" <jason@dom.ain>'],
|
|
||||||
+ [('', ''), ('Jason R. Mastaler', 'jason@dom.ain')]),
|
|
||||||
+
|
|
||||||
+ ([r'Pete(A nice \) chap) <pete(his account)@silly.test(his host)>'],
|
|
||||||
+ [('Pete (A nice ) chap his account his host)', 'pete@silly.test')]),
|
|
||||||
+
|
|
||||||
+ (['(Empty list)(start)Undisclosed recipients :(nobody(I know))'],
|
|
||||||
+ [('', '')]),
|
|
||||||
+
|
|
||||||
+ (['Mary <@machine.tld:mary@example.net>, , jdoe@test . example'],
|
|
||||||
+ [('Mary', 'mary@example.net'), ('', ''), ('', 'jdoe@test.example')]),
|
|
||||||
+
|
|
||||||
+ (['John Doe <jdoe@machine(comment). example>'],
|
|
||||||
+ [('John Doe (comment)', 'jdoe@machine.example')]),
|
|
||||||
+
|
|
||||||
+ (['"Mary Smith: Personal Account" <smith@home.example>'],
|
|
||||||
+ [('Mary Smith: Personal Account', 'smith@home.example')]),
|
|
||||||
+
|
|
||||||
+ (['Undisclosed recipients:;'],
|
|
||||||
+ [('', '')]),
|
|
||||||
+
|
|
||||||
+ ([r'<boss@nil.test>, "Giant; \"Big\" Box" <bob@example.net>'],
|
|
||||||
+ [('', 'boss@nil.test'), ('Giant; "Big" Box', 'bob@example.net')]),
|
|
||||||
+ ):
|
|
||||||
+ self.assertEqual(utils.getaddresses(addresses),
|
|
||||||
+ expected)
|
|
||||||
+ self.assertEqual(utils.getaddresses(addresses, strict=False),
|
|
||||||
+ expected)
|
|
||||||
+
|
|
||||||
+ addresses = ['[]*-- =~$']
|
|
||||||
+ self.assertEqual(utils.getaddresses(addresses),
|
|
||||||
+ [('', '')])
|
|
||||||
+ self.assertEqual(utils.getaddresses(addresses, strict=False),
|
|
||||||
+ [('', ''), ('', ''), ('', '*--')])
|
|
||||||
|
|
||||||
def test_getaddresses_embedded_comment(self):
|
|
||||||
"""Test proper handling of a nested comment"""
|
|
||||||
|
@@ -1,3 +1,12 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Tue Apr 16 15:39:24 UTC 2024 - Matej Cepl <mcepl@cepl.eu>
|
||||||
|
|
||||||
|
- Modify CVE-2023-27043-email-parsing-errors.patch to fix the
|
||||||
|
unicode string handling in email.utils.parseaddr()
|
||||||
|
(bsc#1222537).
|
||||||
|
- Revert CVE-2022-48560-after-free-heappushpop.patch, the fix was
|
||||||
|
unneeded.
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Mon Mar 18 09:54:20 UTC 2024 - Matej Cepl <mcepl@cepl.eu>
|
Mon Mar 18 09:54:20 UTC 2024 - Matej Cepl <mcepl@cepl.eu>
|
||||||
|
|
||||||
|
@@ -19,7 +19,7 @@
|
|||||||
%define so_version 2_7-1_0
|
%define so_version 2_7-1_0
|
||||||
# We really don't care about quality of this package anymore, it
|
# We really don't care about quality of this package anymore, it
|
||||||
# will be soon gone (bsc#1219306).
|
# will be soon gone (bsc#1219306).
|
||||||
%bcond_with tests
|
%bcond_with test
|
||||||
|
|
||||||
Name: python-base
|
Name: python-base
|
||||||
Version: 2.7.18
|
Version: 2.7.18
|
||||||
@@ -154,7 +154,8 @@ Patch75: CVE-2023-24329-blank-URL-bypass.patch
|
|||||||
Patch76: PygmentsBridge-trime_doctest_flags.patch
|
Patch76: PygmentsBridge-trime_doctest_flags.patch
|
||||||
# PATCH-FIX-UPSTREAM CVE-2023-27043-email-parsing-errors.patch bsc#1210638 mcepl@suse.com
|
# PATCH-FIX-UPSTREAM CVE-2023-27043-email-parsing-errors.patch bsc#1210638 mcepl@suse.com
|
||||||
# Detect email address parsing errors and return empty tuple to
|
# Detect email address parsing errors and return empty tuple to
|
||||||
# indicate the parsing error (old API)
|
# indicate the parsing error (old API), modified for fixing bsc#1222537,
|
||||||
|
# so that email.utils.parseaddr accepts unicode string
|
||||||
Patch77: CVE-2023-27043-email-parsing-errors.patch
|
Patch77: CVE-2023-27043-email-parsing-errors.patch
|
||||||
# PATCH-FIX-UPSTREAM CVE-2022-48565-plistlib-XML-vulns.patch bsc#1214685 mcepl@suse.com
|
# PATCH-FIX-UPSTREAM CVE-2022-48565-plistlib-XML-vulns.patch bsc#1214685 mcepl@suse.com
|
||||||
# Reject entity declarations in plists
|
# Reject entity declarations in plists
|
||||||
@@ -164,9 +165,6 @@ Patch79: CVE-2023-40217-avoid-ssl-pre-close.patch
|
|||||||
# PATCH-FIX-UPSTREAM CVE-2022-48566-compare_digest-more-constant.patch bsc#1214691 mcepl@suse.com
|
# PATCH-FIX-UPSTREAM CVE-2022-48566-compare_digest-more-constant.patch bsc#1214691 mcepl@suse.com
|
||||||
# Make compare_digest more constant-time
|
# Make compare_digest more constant-time
|
||||||
Patch80: CVE-2022-48566-compare_digest-more-constant.patch
|
Patch80: CVE-2022-48566-compare_digest-more-constant.patch
|
||||||
# PATCH-FIX-UPSTREAM CVE-2022-48560-after-free-heappushpop.patch bsc#1214675 mcepl@suse.com
|
|
||||||
# fix use after free in heapq.heappushpop()
|
|
||||||
Patch81: CVE-2022-48560-after-free-heappushpop.patch
|
|
||||||
# COMMON-PATCH-END
|
# COMMON-PATCH-END
|
||||||
%define python_version %(echo %{tarversion} | head -c 3)
|
%define python_version %(echo %{tarversion} | head -c 3)
|
||||||
BuildRequires: automake
|
BuildRequires: automake
|
||||||
@@ -323,7 +321,6 @@ other applications.
|
|||||||
%patch -P 78 -p1
|
%patch -P 78 -p1
|
||||||
%patch -P 79 -p1
|
%patch -P 79 -p1
|
||||||
%patch -P 80 -p1
|
%patch -P 80 -p1
|
||||||
%patch -P 81 -p1
|
|
||||||
|
|
||||||
# For patch 66
|
# For patch 66
|
||||||
cp -v %{SOURCE66} Lib/test/recursion.tar
|
cp -v %{SOURCE66} Lib/test/recursion.tar
|
||||||
@@ -431,8 +428,8 @@ make test TESTOPTS="-l -w -x $EXCLUDE" TESTPYTHONOPTS="-R"
|
|||||||
# use network, be verbose:
|
# use network, be verbose:
|
||||||
#make test TESTOPTS="-l -u network -v"
|
#make test TESTOPTS="-l -u network -v"
|
||||||
%endif
|
%endif
|
||||||
# END OF CHECK SECTION
|
|
||||||
%endif
|
%endif
|
||||||
|
# END OF CHECK SECTION
|
||||||
|
|
||||||
%install
|
%install
|
||||||
# replace rest of /usr/local/bin/python or /usr/bin/python2.5 with /usr/bin/python
|
# replace rest of /usr/local/bin/python or /usr/bin/python2.5 with /usr/bin/python
|
||||||
|
@@ -1,3 +1,12 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Tue Apr 16 15:39:24 UTC 2024 - Matej Cepl <mcepl@cepl.eu>
|
||||||
|
|
||||||
|
- Modify CVE-2023-27043-email-parsing-errors.patch to fix the
|
||||||
|
unicode string handling in email.utils.parseaddr()
|
||||||
|
(bsc#1222537).
|
||||||
|
- Revert CVE-2022-48560-after-free-heappushpop.patch, the fix was
|
||||||
|
unneeded.
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Mon Mar 18 09:54:20 UTC 2024 - Matej Cepl <mcepl@cepl.eu>
|
Mon Mar 18 09:54:20 UTC 2024 - Matej Cepl <mcepl@cepl.eu>
|
||||||
|
|
||||||
|
@@ -150,7 +150,8 @@ Patch75: CVE-2023-24329-blank-URL-bypass.patch
|
|||||||
Patch76: PygmentsBridge-trime_doctest_flags.patch
|
Patch76: PygmentsBridge-trime_doctest_flags.patch
|
||||||
# PATCH-FIX-UPSTREAM CVE-2023-27043-email-parsing-errors.patch bsc#1210638 mcepl@suse.com
|
# PATCH-FIX-UPSTREAM CVE-2023-27043-email-parsing-errors.patch bsc#1210638 mcepl@suse.com
|
||||||
# Detect email address parsing errors and return empty tuple to
|
# Detect email address parsing errors and return empty tuple to
|
||||||
# indicate the parsing error (old API)
|
# indicate the parsing error (old API), modified for fixing bsc#1222537,
|
||||||
|
# so that email.utils.parseaddr accepts unicode string
|
||||||
Patch77: CVE-2023-27043-email-parsing-errors.patch
|
Patch77: CVE-2023-27043-email-parsing-errors.patch
|
||||||
# PATCH-FIX-UPSTREAM CVE-2022-48565-plistlib-XML-vulns.patch bsc#1214685 mcepl@suse.com
|
# PATCH-FIX-UPSTREAM CVE-2022-48565-plistlib-XML-vulns.patch bsc#1214685 mcepl@suse.com
|
||||||
# Reject entity declarations in plists
|
# Reject entity declarations in plists
|
||||||
@@ -160,9 +161,6 @@ Patch79: CVE-2023-40217-avoid-ssl-pre-close.patch
|
|||||||
# PATCH-FIX-UPSTREAM CVE-2022-48566-compare_digest-more-constant.patch bsc#1214691 mcepl@suse.com
|
# PATCH-FIX-UPSTREAM CVE-2022-48566-compare_digest-more-constant.patch bsc#1214691 mcepl@suse.com
|
||||||
# Make compare_digest more constant-time
|
# Make compare_digest more constant-time
|
||||||
Patch80: CVE-2022-48566-compare_digest-more-constant.patch
|
Patch80: CVE-2022-48566-compare_digest-more-constant.patch
|
||||||
# PATCH-FIX-UPSTREAM CVE-2022-48560-after-free-heappushpop.patch bsc#1214675 mcepl@suse.com
|
|
||||||
# fix use after free in heapq.heappushpop()
|
|
||||||
Patch81: CVE-2022-48560-after-free-heappushpop.patch
|
|
||||||
# COMMON-PATCH-END
|
# COMMON-PATCH-END
|
||||||
Provides: pyth_doc = %{version}
|
Provides: pyth_doc = %{version}
|
||||||
Provides: pyth_ps = %{version}
|
Provides: pyth_ps = %{version}
|
||||||
@@ -254,7 +252,6 @@ Python, and Macintosh Module Reference in PDF format.
|
|||||||
%patch -P 78 -p1
|
%patch -P 78 -p1
|
||||||
%patch -P 79 -p1
|
%patch -P 79 -p1
|
||||||
%patch -P 80 -p1
|
%patch -P 80 -p1
|
||||||
%patch -P 81 -p1
|
|
||||||
|
|
||||||
# For patch 66
|
# For patch 66
|
||||||
cp -v %{SOURCE66} Lib/test/recursion.tar
|
cp -v %{SOURCE66} Lib/test/recursion.tar
|
||||||
|
@@ -1,3 +1,12 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Tue Apr 16 15:39:24 UTC 2024 - Matej Cepl <mcepl@cepl.eu>
|
||||||
|
|
||||||
|
- Modify CVE-2023-27043-email-parsing-errors.patch to fix the
|
||||||
|
unicode string handling in email.utils.parseaddr()
|
||||||
|
(bsc#1222537).
|
||||||
|
- Revert CVE-2022-48560-after-free-heappushpop.patch, the fix was
|
||||||
|
unneeded.
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Mon Mar 18 09:54:20 UTC 2024 - Matej Cepl <mcepl@cepl.eu>
|
Mon Mar 18 09:54:20 UTC 2024 - Matej Cepl <mcepl@cepl.eu>
|
||||||
|
|
||||||
|
@@ -150,7 +150,8 @@ Patch75: CVE-2023-24329-blank-URL-bypass.patch
|
|||||||
Patch76: PygmentsBridge-trime_doctest_flags.patch
|
Patch76: PygmentsBridge-trime_doctest_flags.patch
|
||||||
# PATCH-FIX-UPSTREAM CVE-2023-27043-email-parsing-errors.patch bsc#1210638 mcepl@suse.com
|
# PATCH-FIX-UPSTREAM CVE-2023-27043-email-parsing-errors.patch bsc#1210638 mcepl@suse.com
|
||||||
# Detect email address parsing errors and return empty tuple to
|
# Detect email address parsing errors and return empty tuple to
|
||||||
# indicate the parsing error (old API)
|
# indicate the parsing error (old API), modified for fixing bsc#1222537,
|
||||||
|
# so that email.utils.parseaddr accepts unicode string
|
||||||
Patch77: CVE-2023-27043-email-parsing-errors.patch
|
Patch77: CVE-2023-27043-email-parsing-errors.patch
|
||||||
# PATCH-FIX-UPSTREAM CVE-2022-48565-plistlib-XML-vulns.patch bsc#1214685 mcepl@suse.com
|
# PATCH-FIX-UPSTREAM CVE-2022-48565-plistlib-XML-vulns.patch bsc#1214685 mcepl@suse.com
|
||||||
# Reject entity declarations in plists
|
# Reject entity declarations in plists
|
||||||
@@ -160,9 +161,6 @@ Patch79: CVE-2023-40217-avoid-ssl-pre-close.patch
|
|||||||
# PATCH-FIX-UPSTREAM CVE-2022-48566-compare_digest-more-constant.patch bsc#1214691 mcepl@suse.com
|
# PATCH-FIX-UPSTREAM CVE-2022-48566-compare_digest-more-constant.patch bsc#1214691 mcepl@suse.com
|
||||||
# Make compare_digest more constant-time
|
# Make compare_digest more constant-time
|
||||||
Patch80: CVE-2022-48566-compare_digest-more-constant.patch
|
Patch80: CVE-2022-48566-compare_digest-more-constant.patch
|
||||||
# PATCH-FIX-UPSTREAM CVE-2022-48560-after-free-heappushpop.patch bsc#1214675 mcepl@suse.com
|
|
||||||
# fix use after free in heapq.heappushpop()
|
|
||||||
Patch81: CVE-2022-48560-after-free-heappushpop.patch
|
|
||||||
# COMMON-PATCH-END
|
# COMMON-PATCH-END
|
||||||
BuildRequires: automake
|
BuildRequires: automake
|
||||||
BuildRequires: db-devel
|
BuildRequires: db-devel
|
||||||
@@ -374,7 +372,6 @@ that rely on earlier non-verification behavior.
|
|||||||
%patch -P 78 -p1
|
%patch -P 78 -p1
|
||||||
%patch -P 79 -p1
|
%patch -P 79 -p1
|
||||||
%patch -P 80 -p1
|
%patch -P 80 -p1
|
||||||
%patch -P 81 -p1
|
|
||||||
|
|
||||||
# For patch 66
|
# For patch 66
|
||||||
cp -v %{SOURCE66} Lib/test/recursion.tar
|
cp -v %{SOURCE66} Lib/test/recursion.tar
|
||||||
|
Reference in New Issue
Block a user