mirror of
https://github.com/python/cpython.git
synced 2025-09-26 10:19:53 +00:00
gh-112625: Protect bytearray from being freed by misbehaving iterator inside bytearray.join (GH-112626)
This commit is contained in:
parent
23e001fa9f
commit
0e732d0997
3 changed files with 22 additions and 1 deletions
|
@ -2039,6 +2039,23 @@ class BuiltinTest(unittest.TestCase):
|
||||||
bad_iter = map(int, "X")
|
bad_iter = map(int, "X")
|
||||||
self.assertRaises(ValueError, array.extend, bad_iter)
|
self.assertRaises(ValueError, array.extend, bad_iter)
|
||||||
|
|
||||||
|
def test_bytearray_join_with_misbehaving_iterator(self):
|
||||||
|
# Issue #112625
|
||||||
|
array = bytearray(b',')
|
||||||
|
def iterator():
|
||||||
|
array.clear()
|
||||||
|
yield b'A'
|
||||||
|
yield b'B'
|
||||||
|
self.assertRaises(BufferError, array.join, iterator())
|
||||||
|
|
||||||
|
def test_bytearray_join_with_custom_iterator(self):
|
||||||
|
# Issue #112625
|
||||||
|
array = bytearray(b',')
|
||||||
|
def iterator():
|
||||||
|
yield b'A'
|
||||||
|
yield b'B'
|
||||||
|
self.assertEqual(bytearray(b'A,B'), array.join(iterator()))
|
||||||
|
|
||||||
def test_construct_singletons(self):
|
def test_construct_singletons(self):
|
||||||
for const in None, Ellipsis, NotImplemented:
|
for const in None, Ellipsis, NotImplemented:
|
||||||
tp = type(const)
|
tp = type(const)
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Fixes a bug where a bytearray object could be cleared while iterating over an argument in the ``bytearray.join()`` method that could result in reading memory after it was freed.
|
|
@ -2007,7 +2007,10 @@ static PyObject *
|
||||||
bytearray_join(PyByteArrayObject *self, PyObject *iterable_of_bytes)
|
bytearray_join(PyByteArrayObject *self, PyObject *iterable_of_bytes)
|
||||||
/*[clinic end generated code: output=a8516370bf68ae08 input=aba6b1f9b30fcb8e]*/
|
/*[clinic end generated code: output=a8516370bf68ae08 input=aba6b1f9b30fcb8e]*/
|
||||||
{
|
{
|
||||||
return stringlib_bytes_join((PyObject*)self, iterable_of_bytes);
|
self->ob_exports++; // this protects `self` from being cleared/resized if `iterable_of_bytes` is a custom iterator
|
||||||
|
PyObject* ret = stringlib_bytes_join((PyObject*)self, iterable_of_bytes);
|
||||||
|
self->ob_exports--; // unexport `self`
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*[clinic input]
|
/*[clinic input]
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue