]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-148688: Fix _BlocksOutputBuffer_Finish() double free (#148689)
authorVictor Stinner <vstinner@python.org>
Sat, 18 Apr 2026 09:56:56 +0000 (11:56 +0200)
committerGitHub <noreply@github.com>
Sat, 18 Apr 2026 09:56:56 +0000 (09:56 +0000)
If _BlocksOutputBuffer_Finish() fails (memory allocation failure),
PyBytesWriter_Discard() is called on the writer. Then if
_BlocksOutputBuffer_OnError() is called, it calls again
PyBytesWriter_Discard() causing a double free.

Fix _BlocksOutputBuffer_Finish() by setting buffer->writer to NULL,
so _BlocksOutputBuffer_OnError() does nothing instead of calling
PyBytesWriter_Discard() again.

Include/internal/pycore_blocks_output_buffer.h
Misc/NEWS.d/next/Library/2026-04-17-16-31-58.gh-issue-148688.vVugFn.rst [new file with mode: 0644]

index 016e7a18665859f69c68e5a16241a2ed3cc99b63..322c1e93344ba30b89bec4546759a533ab807aaf 100644 (file)
@@ -242,9 +242,12 @@ static inline PyObject *
 _BlocksOutputBuffer_Finish(_BlocksOutputBuffer *buffer,
                            const Py_ssize_t avail_out)
 {
+    PyObject *obj;
     assert(buffer->writer != NULL);
-    return PyBytesWriter_FinishWithSize(buffer->writer,
-                                        buffer->allocated - avail_out);
+    obj = PyBytesWriter_FinishWithSize(buffer->writer,
+                                       buffer->allocated - avail_out);
+    buffer->writer = NULL;
+    return obj;
 }
 
 /* Clean up the buffer when an error occurred. */
diff --git a/Misc/NEWS.d/next/Library/2026-04-17-16-31-58.gh-issue-148688.vVugFn.rst b/Misc/NEWS.d/next/Library/2026-04-17-16-31-58.gh-issue-148688.vVugFn.rst
new file mode 100644 (file)
index 0000000..1e36771
--- /dev/null
@@ -0,0 +1,2 @@
+:mod:`bz2`, :mod:`compression.zstd`, :mod:`lzma`, :mod:`zlib`: Fix a double
+free on memory allocation failure. Patch by Victor Stinner.