summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNaris R <nariscatboy@gmail.com>2018-08-30 16:56:14 (GMT)
committerRaymond Hettinger <rhettinger@users.noreply.github.com>2018-08-30 16:56:14 (GMT)
commit1b5f9c9653f348b0aa8b7ca39f8a9361150f7dfc (patch)
treedca9f2435a0fdd8a30e1d3ecc1a3d2e3499379da
parente6dac0077996b1e1f886f036d6f2606237fa4c85 (diff)
downloadcpython-1b5f9c9653f348b0aa8b7ca39f8a9361150f7dfc.zip
cpython-1b5f9c9653f348b0aa8b7ca39f8a9361150f7dfc.tar.gz
cpython-1b5f9c9653f348b0aa8b7ca39f8a9361150f7dfc.tar.bz2
bpo-34427: Fix infinite loop when calling MutableSequence.extend() on self (GH-8813)
-rw-r--r--Lib/_collections_abc.py2
-rw-r--r--Lib/test/test_collections.py12
-rw-r--r--Misc/NEWS.d/next/Library/2018-08-20-13-53-10.bpo-34427.tMRQjl.rst1
3 files changed, 15 insertions, 0 deletions
diff --git a/Lib/_collections_abc.py b/Lib/_collections_abc.py
index dbe30df..c363987 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 2099d23..0b7cb58 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 0000000..f6e0e03
--- /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.