summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeorg Brandl <georg@python.org>2008-12-28 11:55:24 (GMT)
committerGeorg Brandl <georg@python.org>2008-12-28 11:55:24 (GMT)
commitef29f8634ca5415fda7aa75c9c142d3eaf2edebc (patch)
tree83747d92acba51003a7598774a1a71c81408803a
parent828a7066f12e758c30829363c8ec9018c6c2a94f (diff)
downloadcpython-ef29f8634ca5415fda7aa75c9c142d3eaf2edebc.zip
cpython-ef29f8634ca5415fda7aa75c9c142d3eaf2edebc.tar.gz
cpython-ef29f8634ca5415fda7aa75c9c142d3eaf2edebc.tar.bz2
Backport r67975: #4759: fix segfault in bytearray.translate(x, None).
-rw-r--r--Lib/test/test_bytes.py8
-rw-r--r--Misc/NEWS2
-rw-r--r--Objects/bytearrayobject.c1
3 files changed, 11 insertions, 0 deletions
diff --git a/Lib/test/test_bytes.py b/Lib/test/test_bytes.py
index 36defb8..00aee02 100644
--- a/Lib/test/test_bytes.py
+++ b/Lib/test/test_bytes.py
@@ -872,11 +872,19 @@ class AssortedBytesTest(unittest.TestCase):
def test_translate(self):
b = b'hello'
+ ba = bytearray(b)
rosetta = bytearray(range(0, 256))
rosetta[ord('o')] = ord('e')
c = b.translate(rosetta, b'l')
self.assertEqual(b, b'hello')
self.assertEqual(c, b'hee')
+ c = ba.translate(rosetta, b'l')
+ self.assertEqual(ba, b'hello')
+ self.assertEqual(c, b'hee')
+ c = b.translate(None, b'e')
+ self.assertEqual(c, b'hllo')
+ self.assertRaises(TypeError, b.translate, b'a'*256, None)
+ self.assertRaises(TypeError, ba.translate, b'a'*256, None)
def test_split_bytearray(self):
self.assertEqual(b'a b'.split(memoryview(b' ')), [b'a', b'b'])
diff --git a/Misc/NEWS b/Misc/NEWS
index b75ddf9..3bea977 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,8 @@ What's New in Python 2.6.2
Core and Builtins
-----------------
+- Issue #4759: fix a segfault for bytearray.translate(x, None).
+
- Added test case to ensure attempts to read from a file opened for writing
fail.
diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c
index d75eb53..56071a0 100644
--- a/Objects/bytearrayobject.c
+++ b/Objects/bytearrayobject.c
@@ -1465,6 +1465,7 @@ bytes_translate(PyByteArrayObject *self, PyObject *args)
if (delobj != NULL) {
if (_getbuffer(delobj, &vdel) < 0) {
result = NULL;
+ delobj = NULL; /* don't try to release vdel buffer on exit */
goto done;
}
}