You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
86 lines
3.2 KiB
86 lines
3.2 KiB
diff --git a/Lib/difflib.py b/Lib/difflib.py |
|
index 1c6fbdbedcb7..788a92df3f89 100644 |
|
--- a/Lib/difflib.py |
|
+++ b/Lib/difflib.py |
|
@@ -1103,7 +1103,7 @@ def _qformat(self, aline, bline, atags, btags): |
|
|
|
import re |
|
|
|
-def IS_LINE_JUNK(line, pat=re.compile(r"\s*#?\s*$").match): |
|
+def IS_LINE_JUNK(line, pat=re.compile(r"\s*(?:#\s*)?$").match): |
|
r""" |
|
Return 1 for ignorable line: iff `line` is blank or contains a single '#'. |
|
|
|
diff --git a/Lib/poplib.py b/Lib/poplib.py |
|
index b91e5f72d2ca..a238510b38fc 100644 |
|
--- a/Lib/poplib.py |
|
+++ b/Lib/poplib.py |
|
@@ -274,7 +274,7 @@ def rpop(self, user): |
|
return self._shortcmd('RPOP %s' % user) |
|
|
|
|
|
- timestamp = re.compile(r'\+OK.*(<[^>]+>)') |
|
+ timestamp = re.compile(br'\+OK.[^<]*(<.*>)') |
|
|
|
def apop(self, user, secret): |
|
"""Authorisation |
|
diff --git a/Lib/test/test_difflib.py b/Lib/test/test_difflib.py |
|
index 35f2c36ca70a..d8277b79b880 100644 |
|
--- a/Lib/test/test_difflib.py |
|
+++ b/Lib/test/test_difflib.py |
|
@@ -269,13 +269,33 @@ def test_range_format_context(self): |
|
self.assertEqual(fmt(3,6), '4,6') |
|
self.assertEqual(fmt(0,0), '0') |
|
|
|
+class TestJunkAPIs(unittest.TestCase): |
|
+ def test_is_line_junk_true(self): |
|
+ for line in ['#', ' ', ' #', '# ', ' # ', '']: |
|
+ self.assertTrue(difflib.IS_LINE_JUNK(line), repr(line)) |
|
+ |
|
+ def test_is_line_junk_false(self): |
|
+ for line in ['##', ' ##', '## ', 'abc ', 'abc #', 'Mr. Moose is up!']: |
|
+ self.assertFalse(difflib.IS_LINE_JUNK(line), repr(line)) |
|
+ |
|
+ def test_is_line_junk_REDOS(self): |
|
+ evil_input = ('\t' * 1000000) + '##' |
|
+ self.assertFalse(difflib.IS_LINE_JUNK(evil_input)) |
|
+ |
|
+ def test_is_character_junk_true(self): |
|
+ for char in [' ', '\t']: |
|
+ self.assertTrue(difflib.IS_CHARACTER_JUNK(char), repr(char)) |
|
+ |
|
+ def test_is_character_junk_false(self): |
|
+ for char in ['a', '#', '\n', '\f', '\r', '\v']: |
|
+ self.assertFalse(difflib.IS_CHARACTER_JUNK(char), repr(char)) |
|
|
|
def test_main(): |
|
difflib.HtmlDiff._default_prefix = 0 |
|
Doctests = doctest.DocTestSuite(difflib) |
|
run_unittest( |
|
TestWithAscii, TestAutojunk, TestSFpatches, TestSFbugs, |
|
- TestOutputFormat, Doctests) |
|
+ TestOutputFormat, TestJunkAPIs) |
|
|
|
if __name__ == '__main__': |
|
test_main() |
|
diff --git a/Lib/test/test_poplib.py b/Lib/test/test_poplib.py |
|
index 23d688724b95..d2143759ba66 100644 |
|
--- a/Lib/test/test_poplib.py |
|
+++ b/Lib/test/test_poplib.py |
|
@@ -211,6 +211,16 @@ def test_noop(self): |
|
def test_rpop(self): |
|
self.assertOK(self.client.rpop('foo')) |
|
|
|
+ def test_apop_REDOS(self): |
|
+ # Replace welcome with very long evil welcome. |
|
+ # NB The upper bound on welcome length is currently 2048. |
|
+ # At this length, evil input makes each apop call take |
|
+ # on the order of milliseconds instead of microseconds. |
|
+ evil_welcome = b'+OK' + (b'<' * 1000000) |
|
+ with test_support.swap_attr(self.client, 'welcome', evil_welcome): |
|
+ # The evil welcome is invalid, so apop should throw. |
|
+ self.assertRaises(poplib.error_proto, self.client.apop, 'a', 'kb') |
|
+ |
|
def test_top(self): |
|
expected = ('+OK 116 bytes', |
|
['From: postmaster@python.org', 'Content-Type: text/plain',
|
|
|