Author: Ronan Lamy <[email protected]>
Branch:
Changeset: r97353:be2a55c81f26
Date: 2019-08-31 22:05 +0100
http://bitbucket.org/pypy/pypy/changeset/be2a55c81f26/
Log: Prevent segfault when slicing array with a large step size
Note: the segfault is caused by UB in the generated C code for
range(start, stop, step), and thus only appears after translation.
diff --git a/pypy/module/array/interp_array.py
b/pypy/module/array/interp_array.py
--- a/pypy/module/array/interp_array.py
+++ b/pypy/module/array/interp_array.py
@@ -1122,12 +1122,12 @@
w_a = mytype.w_class(self.space)
w_a.setlen(size, overallocate=False)
assert step != 0
- j = 0
buf = w_a.get_buffer()
srcbuf = self.get_buffer()
- for i in range(start, stop, step):
+ i = start
+ for j in range(size):
buf[j] = srcbuf[i]
- j += 1
+ i += step
keepalive_until_here(self)
keepalive_until_here(w_a)
return w_a
@@ -1159,12 +1159,12 @@
self.setlen(0)
self.fromsequence(w_lst)
else:
- j = 0
buf = self.get_buffer()
srcbuf = w_item.get_buffer()
- for i in range(start, stop, step):
+ i = start
+ for j in range(size):
buf[i] = srcbuf[j]
- j += 1
+ i += step
keepalive_until_here(w_item)
keepalive_until_here(self)
diff --git a/pypy/module/array/test/test_array.py
b/pypy/module/array/test/test_array.py
--- a/pypy/module/array/test/test_array.py
+++ b/pypy/module/array/test/test_array.py
@@ -372,6 +372,17 @@
except ValueError:
assert not ok
+ def test_getslice_large_step(self):
+ import sys
+ a = self.array('b', [1, 2, 3])
+ assert list(a[1::sys.maxsize]) == [2]
+
+ def test_setslice_large_step(self):
+ import sys
+ a = self.array('b', [1, 2, 3])
+ a[1::sys.maxsize] = self.array('b', [42])
+ assert a.tolist() == [1, 42, 3]
+
def test_toxxx(self):
a = self.array('i', [1, 2, 3])
l = a.tolist()
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit