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 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);