mirror of https://github.com/python/cpython
Issue #25270: Prevent codecs.escape_encode() from raising SystemError when an empty bytestring is passed
This commit is contained in:
parent
a4961e555b
commit
4a72a7b6c4
|
@ -198,5 +198,5 @@ called with a non-bytes parameter.
|
||||||
desired. On success, *\*bytes* holds the resized bytes object and ``0`` is
|
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
|
returned; the address in *\*bytes* may differ from its input value. If the
|
||||||
reallocation fails, the original bytes object at *\*bytes* is deallocated,
|
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.
|
returned.
|
||||||
|
|
|
@ -2501,6 +2501,26 @@ class RawUnicodeEscapeTest(unittest.TestCase):
|
||||||
self.assertEqual(decode(br"\U00110000", "replace"), ("\ufffd", 10))
|
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):
|
class SurrogateEscapeTest(unittest.TestCase):
|
||||||
|
|
||||||
def test_utf8(self):
|
def test_utf8(self):
|
||||||
|
|
|
@ -71,6 +71,9 @@ Core and Builtins
|
||||||
Library
|
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 #28181: Get antigravity over HTTPS. Patch by Kaartic Sivaraam.
|
||||||
|
|
||||||
- Issue #25895: Enable WebSocket URL schemes in urllib.parse.urljoin.
|
- Issue #25895: Enable WebSocket URL schemes in urllib.parse.urljoin.
|
||||||
|
|
|
@ -3550,11 +3550,15 @@ _PyBytes_Resize(PyObject **pv, Py_ssize_t newsize)
|
||||||
PyObject *v;
|
PyObject *v;
|
||||||
PyBytesObject *sv;
|
PyBytesObject *sv;
|
||||||
v = *pv;
|
v = *pv;
|
||||||
if (!PyBytes_Check(v) || Py_REFCNT(v) != 1 || newsize < 0) {
|
if (!PyBytes_Check(v) || newsize < 0) {
|
||||||
*pv = 0;
|
goto error;
|
||||||
Py_DECREF(v);
|
}
|
||||||
PyErr_BadInternalCall();
|
if (Py_SIZE(v) == newsize) {
|
||||||
return -1;
|
/* 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 */
|
/* XXX UNREF/NEWREF interface should be more symmetrical */
|
||||||
_Py_DEC_REFTOTAL;
|
_Py_DEC_REFTOTAL;
|
||||||
|
@ -3572,6 +3576,11 @@ _PyBytes_Resize(PyObject **pv, Py_ssize_t newsize)
|
||||||
sv->ob_sval[newsize] = '\0';
|
sv->ob_sval[newsize] = '\0';
|
||||||
sv->ob_shash = -1; /* invalidate cached hash value */
|
sv->ob_shash = -1; /* invalidate cached hash value */
|
||||||
return 0;
|
return 0;
|
||||||
|
error:
|
||||||
|
*pv = 0;
|
||||||
|
Py_DECREF(v);
|
||||||
|
PyErr_BadInternalCall();
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
Loading…
Reference in New Issue