mirror of
https://github.com/python/cpython.git
synced 2025-09-26 10:19:53 +00:00
Added a new crasher that targets mutating the underlying storage of a buffer. All work done by Armin Rigo.
This commit is contained in:
parent
7ce9bda575
commit
afa2e470db
1 changed files with 30 additions and 0 deletions
30
Lib/test/crashers/buffer_mutate.py
Normal file
30
Lib/test/crashers/buffer_mutate.py
Normal file
|
@ -0,0 +1,30 @@
|
|||
#
|
||||
# The various methods of bufferobject.c (here buffer_subscript()) call
|
||||
# get_buf() before calling potentially more Python code (here via
|
||||
# PySlice_GetIndicesEx()). But get_buf() already returned a void*
|
||||
# pointer. This void* pointer can become invalid if the object
|
||||
# underlying the buffer is mutated (here a bytearray object).
|
||||
#
|
||||
# As usual, please keep in mind that the three "here" in the sentence
|
||||
# above are only examples. Each can be changed easily and lead to
|
||||
# another crasher.
|
||||
#
|
||||
# This crashes for me on Linux 32-bits with CPython 2.6 and 2.7
|
||||
# with a segmentation fault.
|
||||
#
|
||||
|
||||
|
||||
class PseudoIndex(object):
|
||||
def __index__(self):
|
||||
for c in "foobar"*n:
|
||||
a.append(c)
|
||||
return n * 4
|
||||
|
||||
|
||||
for n in range(1, 100000, 100):
|
||||
a = bytearray("test"*n)
|
||||
buf = buffer(a)
|
||||
|
||||
s = buf[:PseudoIndex():1]
|
||||
#print repr(s)
|
||||
#assert s == "test"*n
|
Loading…
Add table
Add a link
Reference in a new issue