From: Naris R Date: Thu, 30 Aug 2018 16:56:14 +0000 (+1000) Subject: bpo-34427: Fix infinite loop when calling MutableSequence.extend() on self (GH-8813) X-Git-Tag: v3.8.0a1~1125 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1b5f9c9653f348b0aa8b7ca39f8a9361150f7dfc;p=python bpo-34427: Fix infinite loop when calling MutableSequence.extend() on self (GH-8813) --- diff --git a/Lib/_collections_abc.py b/Lib/_collections_abc.py index dbe30dff1f..c363987970 100644 --- a/Lib/_collections_abc.py +++ b/Lib/_collections_abc.py @@ -986,6 +986,8 @@ class MutableSequence(Sequence): def extend(self, values): 'S.extend(iterable) -- extend sequence by appending elements from the iterable' + if values is self: + values = list(values) for v in values: self.append(v) diff --git a/Lib/test/test_collections.py b/Lib/test/test_collections.py index 2099d236d0..0b7cb5848b 100644 --- a/Lib/test/test_collections.py +++ b/Lib/test/test_collections.py @@ -1721,6 +1721,18 @@ class TestCollectionABCs(ABCTestCase): mss.clear() self.assertEqual(len(mss), 0) + # issue 34427 + # extending self should not cause infinite loop + items = 'ABCD' + mss2 = MutableSequenceSubclass() + mss2.extend(items + items) + mss.clear() + mss.extend(items) + mss.extend(mss) + self.assertEqual(len(mss), len(mss2)) + self.assertEqual(list(mss), list(mss2)) + + ################################################################################ ### Counter ################################################################################ diff --git a/Misc/NEWS.d/next/Library/2018-08-20-13-53-10.bpo-34427.tMRQjl.rst b/Misc/NEWS.d/next/Library/2018-08-20-13-53-10.bpo-34427.tMRQjl.rst new file mode 100644 index 0000000000..f6e0e030b7 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-08-20-13-53-10.bpo-34427.tMRQjl.rst @@ -0,0 +1 @@ +Fix infinite loop in ``a.extend(a)`` for ``MutableSequence`` subclasses.