From c65d0f6703c0596877b5de7072254897362ac04f Mon Sep 17 00:00:00 2001 From: Pablo Galindo Salgado Date: Sat, 27 Dec 2025 01:12:38 +0000 Subject: [PATCH] gh-140739: Fix missing exception on allocation failure in BinaryWriter The binary_writer_create function had several error paths where memory allocation failures would return NULL without setting a Python exception. This violated the C API contract and caused "returning an error without exception set" errors when BinaryWriter initialization failed due to memory pressure. Added PyErr_NoMemory calls before each goto error for PyMem_Malloc and _Py_hashtable_new_full failures. Neither of these functions set exceptions on failure, so callers must do it explicitly. The error label only performs cleanup and returns NULL, relying on exceptions being set beforehand. --- Modules/_remote_debugging/binary_io_writer.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Modules/_remote_debugging/binary_io_writer.c b/Modules/_remote_debugging/binary_io_writer.c index c8857cec6218be..c129c93efe23c5 100644 --- a/Modules/_remote_debugging/binary_io_writer.c +++ b/Modules/_remote_debugging/binary_io_writer.c @@ -741,6 +741,7 @@ binary_writer_create(const char *filename, uint64_t sample_interval_us, int comp writer->write_buffer = PyMem_Malloc(WRITE_BUFFER_SIZE); if (!writer->write_buffer) { + PyErr_NoMemory(); goto error; } writer->buffer_size = WRITE_BUFFER_SIZE; @@ -753,14 +754,17 @@ binary_writer_create(const char *filename, uint64_t sample_interval_us, int comp NULL /* Use default allocator */ ); if (!writer->string_hash) { + PyErr_NoMemory(); goto error; } writer->strings = PyMem_Malloc(INITIAL_STRING_CAPACITY * sizeof(char *)); if (!writer->strings) { + PyErr_NoMemory(); goto error; } writer->string_lengths = PyMem_Malloc(INITIAL_STRING_CAPACITY * sizeof(size_t)); if (!writer->string_lengths) { + PyErr_NoMemory(); goto error; } writer->string_capacity = INITIAL_STRING_CAPACITY; @@ -773,16 +777,19 @@ binary_writer_create(const char *filename, uint64_t sample_interval_us, int comp NULL /* Use default allocator */ ); if (!writer->frame_hash) { + PyErr_NoMemory(); goto error; } writer->frame_entries = PyMem_Malloc(INITIAL_FRAME_CAPACITY * sizeof(FrameEntry)); if (!writer->frame_entries) { + PyErr_NoMemory(); goto error; } writer->frame_capacity = INITIAL_FRAME_CAPACITY; writer->thread_entries = PyMem_Malloc(INITIAL_THREAD_CAPACITY * sizeof(ThreadEntry)); if (!writer->thread_entries) { + PyErr_NoMemory(); goto error; } writer->thread_capacity = INITIAL_THREAD_CAPACITY;