Skip to content

Conversation

@przadka
Copy link
Collaborator

@przadka przadka commented Nov 24, 2025

Fixes Backblaze#1119 - B2 CLI crashes with SystemError: buffer overflow on Python 3.14+.

Problem

Python 3.14 enforces stricter buffer validation. The rst2ansi dependency passes a 4-byte buffer to TIOCGWINSZ ioctl, which expects 8 bytes. This crashes the CLI on Python 3.14 (affects macOS Homebrew users).

Solution

  • Added try-except in arg_parser.py to catch SystemError and fall back to plain text
  • Added PTY-based integration test to verify the fix
  • Added Python 3.14 to CI matrix and nox

Testing

  • ✅ Test fails on Python 3.14 without fix
  • ✅ Test passes on Python 3.14 with fix
  • ✅ Backward compatible with Python 3.8-3.13

Upstream issue: Snaipe/python-rst2ansi#18

…upport

This commit addresses issue Backblaze#1119 where B2 CLI crashes with SystemError
on Python 3.14+ due to a buffer overflow bug in the rst2ansi dependency.

Changes:
- Add try-except handler in arg_parser.py to catch SystemError from rst2ansi
- Fall back to plain text formatting when rst2ansi fails
- Add integration test to verify the fix works with real PTY on Python 3.14
- Add dedicated nox session (integration_pty) for PTY tests without xdist
- Add Python 3.14 to noxfile.py, CI matrix, and pyproject.toml

The root cause is in rst2ansi's get_terminal_size() which passes a 4-byte
buffer to TIOCGWINSZ ioctl instead of the required 8 bytes. Python 3.14
enforces stricter buffer validation, triggering the error.

Fixes Backblaze#1119
@przadka
Copy link
Collaborator Author

przadka commented Nov 24, 2025

I've also submitted a PR to fix this at the source in rst2ansi: Snaipe/python-rst2ansi#20

This defensive fix in B2 CLI protects users immediately, while the upstream PR will help the broader ecosystem once merged.

The PTY test doesn't work properly with pytest-xdist parallelization.
Instead of a dedicated nox session, run it directly in CI on Python 3.14
without xdist to properly test the buffer overflow fix.
The condition needs to be wrapped in ${{ }} for proper evaluation.
The test_help_with_tty test works correctly with pytest-xdist in CI,
so we don't need a separate step. Updated docstring to note that
local execution may not trigger the bug due to environment differences.
Copy link

@olzhasar-reef olzhasar-reef left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The PR looks great overall.

However, the Integration tests seem to fail on Python3.14 with an ambiguous error:

FAILED test/integration/test_b2_command_line.py::test_header_arguments - AssertionError: Unexpected stderr line: "/opt/hostedtoolcache/Python/3.14.0/arm64/lib/python3.14/multiprocessing/resource_tracker.py:297: UserWarning: resource_tracker: There appear to be 1 leaked semaphore objects to clean up at shutdown: {'/mp-84uu7hqr'}" 

I re-ran the workflow to see if those are flaky, and it looks like the failure persisted:
https://github.com/reef-technologies/B2_Command_Line_Tool/actions/runs/19671931302/job/56830215284?pr=351

@mprzadka-reef mprzadka-reef force-pushed the fix-buffer-overflow-1119 branch from 27937e7 to dec5582 Compare December 2, 2025 17:59
Move pexpect wrapper with improved error messages from test_autocomplete
to shared helpers module, and use it in test_help PTY test.
Python 3.14+ emits multiprocessing resource_tracker warnings about
leaked semaphores during test subprocess cleanup. These warnings appear
in stderr and cause test assertions to fail. Filter them out the same
way we already filter DeprecationWarnings.

Fixes integration test failures on Python 3.14.
@mprzadka-reef mprzadka-reef force-pushed the fix-buffer-overflow-1119 branch from dec5582 to eb9c619 Compare December 3, 2025 05:21
@przadka przadka merged commit 266c3a9 into master Dec 3, 2025
33 of 45 checks passed
@przadka przadka deleted the fix-buffer-overflow-1119 branch December 3, 2025 05:30
@mprzadka-reef mprzadka-reef restored the fix-buffer-overflow-1119 branch December 3, 2025 17:54
@olzhasar-reef olzhasar-reef deleted the fix-buffer-overflow-1119 branch December 3, 2025 18:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

System buffer overflow on MacOS

3 participants