From b1979d59d6c0783345146847d3753e6125a1c5c7 Mon Sep 17 00:00:00 2001 From: devdanzin <74280297+devdanzin@users.noreply.github.com> Date: Tue, 31 Mar 2026 23:05:36 -0300 Subject: [PATCH] =?UTF-8?q?fix:=20handle=20module=20init=20errors=20?= =?UTF-8?q?=E2=80=94=20decref=20module=20and=20check=20PyModule=5FAddObjec?= =?UTF-8?q?t?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add Py_DECREF(module) before returning NULL when PyErr_NewExceptionWithDoc fails in both block and stream module init — previously leaked the module - Check PyModule_AddObject return value when adding LZ4BlockError and LZ4StreamError — previously ignored failures, leaking the exception ref Found using cext-review-toolkit (https://github.com/devdanzin/cext-review-toolkit). Co-Authored-By: Claude Opus 4.6 (1M context) --- lz4/block/_block.c | 8 +++++++- lz4/stream/_stream.c | 8 +++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/lz4/block/_block.c b/lz4/block/_block.c index 993cc44..121143e 100644 --- a/lz4/block/_block.c +++ b/lz4/block/_block.c @@ -513,10 +513,16 @@ PyInit__block(void) LZ4BlockError = PyErr_NewExceptionWithDoc("_block.LZ4BlockError", "Call to LZ4 library failed.", NULL, NULL); if (LZ4BlockError == NULL) { + Py_DECREF(module); return NULL; } Py_INCREF(LZ4BlockError); - PyModule_AddObject(module, "LZ4BlockError", LZ4BlockError); + if (PyModule_AddObject(module, "LZ4BlockError", LZ4BlockError) < 0) + { + Py_DECREF(LZ4BlockError); + Py_DECREF(module); + return NULL; + } #ifdef Py_GIL_DISABLED PyUnstable_Module_SetGIL(module, Py_MOD_GIL_NOT_USED); diff --git a/lz4/stream/_stream.c b/lz4/stream/_stream.c index 4c51d89..ccb56d1 100644 --- a/lz4/stream/_stream.c +++ b/lz4/stream/_stream.c @@ -1644,10 +1644,16 @@ PyInit__stream(void) NULL, NULL); if (LZ4StreamError == NULL) { + Py_DECREF (module); return NULL; } Py_INCREF (LZ4StreamError); - PyModule_AddObject (module, "LZ4StreamError", LZ4StreamError); + if (PyModule_AddObject (module, "LZ4StreamError", LZ4StreamError) < 0) + { + Py_DECREF (LZ4StreamError); + Py_DECREF (module); + return NULL; + } #ifdef Py_GIL_DISABLED PyUnstable_Module_SetGIL(module, Py_MOD_GIL_NOT_USED);