summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBerker Peksag <berker.peksag@gmail.com>2016-09-16 14:32:06 (GMT)
committerBerker Peksag <berker.peksag@gmail.com>2016-09-16 14:32:06 (GMT)
commit7b4bcd20041d25d5c5b5f416bc6d1090dd3e374a (patch)
treea840f7f6ce44a552b1e4b066ae79664e6d521e6d
parentde3f48ae9a5c807f1af26f2841a39a3667cc9760 (diff)
parent4a72a7b6c4c95f7613486f0e4e20a3d4815a16c5 (diff)
downloadcpython-7b4bcd20041d25d5c5b5f416bc6d1090dd3e374a.zip
cpython-7b4bcd20041d25d5c5b5f416bc6d1090dd3e374a.tar.gz
cpython-7b4bcd20041d25d5c5b5f416bc6d1090dd3e374a.tar.bz2
Issue #25270: Merge from 3.5
-rw-r--r--Doc/c-api/bytes.rst2
-rw-r--r--Lib/test/test_codecs.py20
-rw-r--r--Misc/NEWS3
-rw-r--r--Objects/bytesobject.c19
4 files changed, 38 insertions, 6 deletions
diff --git a/Doc/c-api/bytes.rst b/Doc/c-api/bytes.rst
index dcd7088..ee42f85 100644
--- a/Doc/c-api/bytes.rst
+++ b/Doc/c-api/bytes.rst
@@ -198,5 +198,5 @@ called with a non-bytes parameter.
desired. On success, *\*bytes* holds the resized bytes object and ``0`` is
returned; the address in *\*bytes* may differ from its input value. If the
reallocation fails, the original bytes object at *\*bytes* is deallocated,
- *\*bytes* is set to *NULL*, a memory exception is set, and ``-1`` is
+ *\*bytes* is set to *NULL*, :exc:`MemoryError` is set, and ``-1`` is
returned.
diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py
index 4d91a07..1e63ed8 100644
--- a/Lib/test/test_codecs.py
+++ b/Lib/test/test_codecs.py
@@ -2542,6 +2542,26 @@ class RawUnicodeEscapeTest(unittest.TestCase):
self.assertEqual(decode(br"\U00110000", "replace"), ("\ufffd", 10))
+class EscapeEncodeTest(unittest.TestCase):
+
+ def test_escape_encode(self):
+ tests = [
+ (b'', (b'', 0)),
+ (b'foobar', (b'foobar', 6)),
+ (b'spam\0eggs', (b'spam\\x00eggs', 9)),
+ (b'a\'b', (b"a\\'b", 3)),
+ (b'b\\c', (b'b\\\\c', 3)),
+ (b'c\nd', (b'c\\nd', 3)),
+ (b'd\re', (b'd\\re', 3)),
+ (b'f\x7fg', (b'f\\x7fg', 3)),
+ ]
+ for data, output in tests:
+ with self.subTest(data=data):
+ self.assertEqual(codecs.escape_encode(data), output)
+ self.assertRaises(TypeError, codecs.escape_encode, 'spam')
+ self.assertRaises(TypeError, codecs.escape_encode, bytearray(b'spam'))
+
+
class SurrogateEscapeTest(unittest.TestCase):
def test_utf8(self):
diff --git a/Misc/NEWS b/Misc/NEWS
index 803a6e3..c765028 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -27,6 +27,9 @@ Core and Builtins
Library
-------
+- Issue #25270: Prevent codecs.escape_encode() from raising SystemError when
+ an empty bytestring is passed.
+
- Issue #28181: Get antigravity over HTTPS. Patch by Kaartic Sivaraam.
- Issue #25895: Enable WebSocket URL schemes in urllib.parse.urljoin.
diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c
index 1550083..598f6a1 100644
--- a/Objects/bytesobject.c
+++ b/Objects/bytesobject.c
@@ -2910,11 +2910,15 @@ _PyBytes_Resize(PyObject **pv, Py_ssize_t newsize)
PyObject *v;
PyBytesObject *sv;
v = *pv;
- if (!PyBytes_Check(v) || Py_REFCNT(v) != 1 || newsize < 0) {
- *pv = 0;
- Py_DECREF(v);
- PyErr_BadInternalCall();
- return -1;
+ if (!PyBytes_Check(v) || newsize < 0) {
+ goto error;
+ }
+ if (Py_SIZE(v) == newsize) {
+ /* return early if newsize equals to v->ob_size */
+ return 0;
+ }
+ if (Py_REFCNT(v) != 1) {
+ goto error;
}
/* XXX UNREF/NEWREF interface should be more symmetrical */
_Py_DEC_REFTOTAL;
@@ -2932,6 +2936,11 @@ _PyBytes_Resize(PyObject **pv, Py_ssize_t newsize)
sv->ob_sval[newsize] = '\0';
sv->ob_shash = -1; /* invalidate cached hash value */
return 0;
+error:
+ *pv = 0;
+ Py_DECREF(v);
+ PyErr_BadInternalCall();
+ return -1;
}
void