Skip to content

Commit d39c192

Browse files
bpo-33817: Fix _PyBytes_Resize() for empty bytes object. (GH-11516)
Add also tests for PyUnicode_FromFormat() and PyBytes_FromFormat() with empty result. (cherry picked from commit 44cc482) Co-authored-by: Serhiy Storchaka <[email protected]>
1 parent 059997d commit d39c192

File tree

4 files changed

+26
-0
lines changed

4 files changed

+26
-0
lines changed

Lib/test/test_bytes.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -999,6 +999,12 @@ def ptr_formatter(ptr):
999999
self.assertRaises(OverflowError,
10001000
PyBytes_FromFormat, b'%c', c_int(256))
10011001

1002+
# Issue #33817: empty strings
1003+
self.assertEqual(PyBytes_FromFormat(b''),
1004+
b'')
1005+
self.assertEqual(PyBytes_FromFormat(b'%s', b''),
1006+
b'')
1007+
10021008
def test_bytes_blocking(self):
10031009
class IterationBlocked(list):
10041010
__bytes__ = None

Lib/test/test_unicode.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2676,6 +2676,12 @@ def check_format(expected, format, *args):
26762676
check_format('%.%s',
26772677
b'%.%s', b'abc')
26782678

2679+
# Issue #33817: empty strings
2680+
check_format('',
2681+
b'')
2682+
check_format('',
2683+
b'%s', b'')
2684+
26792685
# Test PyUnicode_AsWideChar()
26802686
@support.cpython_only
26812687
def test_aswidechar(self):
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fixed :c:func:`_PyBytes_Resize` for empty bytes objects.

Objects/bytesobject.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2990,9 +2990,22 @@ _PyBytes_Resize(PyObject **pv, Py_ssize_t newsize)
29902990
/* return early if newsize equals to v->ob_size */
29912991
return 0;
29922992
}
2993+
if (Py_SIZE(v) == 0) {
2994+
if (newsize == 0) {
2995+
return 0;
2996+
}
2997+
*pv = _PyBytes_FromSize(newsize, 0);
2998+
Py_DECREF(v);
2999+
return (*pv == NULL) ? -1 : 0;
3000+
}
29933001
if (Py_REFCNT(v) != 1) {
29943002
goto error;
29953003
}
3004+
if (newsize == 0) {
3005+
*pv = _PyBytes_FromSize(0, 0);
3006+
Py_DECREF(v);
3007+
return (*pv == NULL) ? -1 : 0;
3008+
}
29963009
/* XXX UNREF/NEWREF interface should be more symmetrical */
29973010
_Py_DEC_REFTOTAL;
29983011
_Py_ForgetReference(v);

0 commit comments

Comments
 (0)