From e30fc8e06fa110d939fc05db8bcc1617a5f6e58b Mon Sep 17 00:00:00 2001 From: Anton Volkov Date: Mon, 31 Aug 2026 16:11:04 +0200 Subject: [PATCH 1/2] Avoid leaking module object on numpy C-API import failure import_array() and import_umath() are macros that expand to `return NULL;` on failure. When they were called after PyModule_Create(), a failing import would return directly out of PyInit__ufuncs without releasing the module object, leaking the strong reference created by PyModule_Create(). Move the imports before the module is created so there is no owned reference to leak when an import fails. Co-Authored-By: Claude Opus 4.8 (1M context) --- mkl_umath/src/ufuncsmodule.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/mkl_umath/src/ufuncsmodule.c b/mkl_umath/src/ufuncsmodule.c index 5863081d..cd6d447a 100644 --- a/mkl_umath/src/ufuncsmodule.c +++ b/mkl_umath/src/ufuncsmodule.c @@ -40,6 +40,11 @@ PyMODINIT_FUNC PyInit__ufuncs(void) PyObject *m; PyObject *d; + /* NumPy C-API init macros: they `return NULL;` on failure, so call them + * before PyModule_Create() to avoid leaking the module on early return. */ + import_array(); + import_umath(); + m = PyModule_Create(&_ufuncs_module); if (m == NULL) return NULL; @@ -50,9 +55,6 @@ PyMODINIT_FUNC PyInit__ufuncs(void) return NULL; } - import_array(); - import_umath(); - if (InitOperators(d) < 0) { /* d is a borrowed reference from PyModule_GetDict; do not decref it. */ Py_XDECREF(m); From 34f00dbd8614135c2ae7f4f218245ec0cff3157d Mon Sep 17 00:00:00 2001 From: Anton Volkov Date: Tue, 1 Sep 2026 11:29:47 +0200 Subject: [PATCH 2/2] Add changelog entry for module object leak fix --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b9021506..660f5c75 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed * Fixed an over-decref of the borrowed module dictionary reference on the module initialization error path [gh-264](https://github.com/IntelPython/mkl_umath/pull/264) +* Fixed a leak of the module object when the NumPy C-API import fails during module initialization [gh-263](https://github.com/IntelPython/mkl_umath/pull/263) ## [0.5.0] - 2026-08-06