Closed
Description
Crash report
What happened?
Using struct
to process zero-width Pascal strings ("0p"
) can lead to an assertion failure or SystemError
.
Specifically:
struct.pack("<0p", b"")
leads to an assertion failure and seg fault on debug builds (tested with currentmain
and 3.13 tip)struct.unpack("<0p", b"")
raises an unexpectedSystemError
(tested with currentmain
, 3.13 tip, non-debug builds of 3.8-3.12)
On current main
(8f82d9aa219
):
$ make clean && ./configure --with-pydebug && make -j
$ ./python -VV
Python 3.14.0a0 (heads/main:8f82d9aa219, Sep 19 2024, 11:08:04) [GCC 11.4.0]
$ ./python -c 'import struct; struct.unpack("<0p", b"")'
Traceback (most recent call last):
File "<string>", line 1, in <module>
import struct; struct.unpack("<0p", b"")
~~~~~~~~~~~~~^^^^^^^^^^^^
SystemError: Negative size passed to PyBytes_FromStringAndSize
$ ./python -c 'import struct; struct.pack("<0p", b"")'
python: ./Modules/_struct.c:1991: s_pack_internal: Assertion `_Py_STATIC_CAST(Py_ssize_t, _Py_STATIC_CAST(unsigned char, (n))) == (n)' failed.
[1] 186971 IOT instruction (core dumped) ./python -c 'import struct; struct.pack("<0p", b"")'
The same behavior is reproducible on the current 3.13 tip (112b1704fa6
), and likely previous versions.
PR forthcoming.
CPython versions tested on:
CPython main branch
Operating systems tested on:
Linux
Output from running 'python -VV' on the command line:
Python 3.14.0a0 (heads/main:8f82d9aa219, Sep 19 2024, 11:08:04) [GCC 11.4.0]