Skip to content

SystemError/Assertion failure when processing struct with '0p' field #124248

Closed
@brianschubert

Description

@brianschubert

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 current main and 3.13 tip)
  • struct.unpack("<0p", b"") raises an unexpected SystemError (tested with current main, 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]

Linked PRs

Metadata

Metadata

Assignees

No one assigned

    Labels

    extension-modulesC modules in the Modules dirtype-crashA hard crash of the interpreter, possibly with a core dump

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions