Skip to content

bytes_to_read() raises SystemError: buffer overflow on Python 3.14 (FIONREAD undersized buffer) #1070

Description

@RemiDesgrange

Hi,

Same root cause as #1038 (fixed for _pty_size) but in terminals.bytes_to_read(), which was not touched by that fix.

On Python 3.14, fcntl.ioctl rejects undersized mutable buffers (cpython#144206). bytes_to_read passes a 2-byte buffer to FIONREAD, which writes a C int (4 bytes):

fionread = fcntl.ioctl(input_, termios.FIONREAD, b"  ")
return int(struct.unpack("h", fionread)[0])

which worked by accident on ≤3.13 thanks to the 1024-byte static copy buffer

Repro: any Connection.run() from a TTY-attached process on 3.14 crashes the handle_stdin thread

Do you want me to make a PR a fix with something like fionread = fcntl.ioctl(input_, termios.FIONREAD, b"\x00\x00\x00\x00") in https://github.com/pyinvoke/invoke/blob/main/invoke/terminals.py#L246-L247

Thx.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions