From 99d76acf6902dde3cb4cbcb89904f0c95970d3c2 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Tue, 20 Jul 2021 03:44:05 -0400 Subject: [PATCH] Fix some very unlikely leaks in extensions. The newly created module may leak if any following initialization fails. Since `import_array` is a macro that hides a `return`-on-failure, that needs to move earlier before the module creation. --- src/_backend_agg_wrapper.cpp | 6 ++++-- src/_contour_wrapper.cpp | 5 +++-- src/_image_wrapper.cpp | 5 +++-- src/_path_wrapper.cpp | 5 +++-- src/ft2font_wrapper.cpp | 11 +++++++++-- src/qhull_wrap.cpp | 4 ++-- src/tri/_tri_wrapper.cpp | 7 +++++-- 7 files changed, 29 insertions(+), 14 deletions(-) diff --git a/src/_backend_agg_wrapper.cpp b/src/_backend_agg_wrapper.cpp index 0c4cefd35e26..246453ad1190 100644 --- a/src/_backend_agg_wrapper.cpp +++ b/src/_backend_agg_wrapper.cpp @@ -656,19 +656,21 @@ PyMODINIT_FUNC PyInit__backend_agg(void) { PyObject *m; + import_array(); + m = PyModule_Create(&moduledef); if (m == NULL) { return NULL; } - import_array(); - if (!PyRendererAgg_init_type(m, &PyRendererAggType)) { + Py_DECREF(m); return NULL; } if (!PyBufferRegion_init_type(m, &PyBufferRegionType)) { + Py_DECREF(m); return NULL; } diff --git a/src/_contour_wrapper.cpp b/src/_contour_wrapper.cpp index da891eb70048..3ebfb5edd440 100644 --- a/src/_contour_wrapper.cpp +++ b/src/_contour_wrapper.cpp @@ -170,6 +170,8 @@ PyMODINIT_FUNC PyInit__contour(void) { PyObject *m; + import_array(); + m = PyModule_Create(&moduledef); if (m == NULL) { @@ -177,11 +179,10 @@ PyMODINIT_FUNC PyInit__contour(void) } if (!PyQuadContourGenerator_init_type(m, &PyQuadContourGeneratorType)) { + Py_DECREF(m); return NULL; } - import_array(); - return m; } diff --git a/src/_image_wrapper.cpp b/src/_image_wrapper.cpp index a15e67c373e8..d786d369a4f1 100644 --- a/src/_image_wrapper.cpp +++ b/src/_image_wrapper.cpp @@ -312,6 +312,8 @@ PyMODINIT_FUNC PyInit__image(void) { PyObject *m; + import_array(); + m = PyModule_Create(&moduledef); if (m == NULL) { @@ -336,11 +338,10 @@ PyMODINIT_FUNC PyInit__image(void) PyModule_AddIntConstant(m, "LANCZOS", LANCZOS) || PyModule_AddIntConstant(m, "BLACKMAN", BLACKMAN) || PyModule_AddIntConstant(m, "_n_interpolation", _n_interpolation)) { + Py_DECREF(m); return NULL; } - import_array(); - return m; } diff --git a/src/_path_wrapper.cpp b/src/_path_wrapper.cpp index 53f4c453df26..3c473519311a 100644 --- a/src/_path_wrapper.cpp +++ b/src/_path_wrapper.cpp @@ -908,14 +908,15 @@ static struct PyModuleDef moduledef = { PyMODINIT_FUNC PyInit__path(void) { PyObject *m; + + import_array(); + m = PyModule_Create(&moduledef); if (m == NULL) { return NULL; } - import_array(); - return m; } diff --git a/src/ft2font_wrapper.cpp b/src/ft2font_wrapper.cpp index 362df3a2d3aa..06cbc22dad9c 100644 --- a/src/ft2font_wrapper.cpp +++ b/src/ft2font_wrapper.cpp @@ -1551,6 +1551,8 @@ PyMODINIT_FUNC PyInit_ft2font(void) { PyObject *m; + import_array(); + m = PyModule_Create(&moduledef); if (m == NULL) { @@ -1558,14 +1560,17 @@ PyMODINIT_FUNC PyInit_ft2font(void) } if (!PyFT2Image_init_type(m, &PyFT2ImageType)) { + Py_DECREF(m); return NULL; } if (!PyGlyph_init_type(m, &PyGlyphType)) { + Py_DECREF(m); return NULL; } if (!PyFT2Font_init_type(m, &PyFT2FontType)) { + Py_DECREF(m); return NULL; } @@ -1607,6 +1612,7 @@ PyMODINIT_FUNC PyInit_ft2font(void) add_dict_int(d, "LOAD_TARGET_MONO", (unsigned long)FT_LOAD_TARGET_MONO) || add_dict_int(d, "LOAD_TARGET_LCD", (unsigned long)FT_LOAD_TARGET_LCD) || add_dict_int(d, "LOAD_TARGET_LCD_V", (unsigned long)FT_LOAD_TARGET_LCD_V)) { + Py_DECREF(m); return NULL; } @@ -1615,6 +1621,7 @@ PyMODINIT_FUNC PyInit_ft2font(void) if (error) { PyErr_SetString(PyExc_RuntimeError, "Could not initialize the freetype2 library"); + Py_DECREF(m); return NULL; } @@ -1625,16 +1632,16 @@ PyMODINIT_FUNC PyInit_ft2font(void) FT_Library_Version(_ft2Library, &major, &minor, &patch); sprintf(version_string, "%d.%d.%d", major, minor, patch); if (PyModule_AddStringConstant(m, "__freetype_version__", version_string)) { + Py_DECREF(m); return NULL; } } if (PyModule_AddStringConstant(m, "__freetype_build_type__", STRINGIFY(FREETYPE_BUILD_TYPE))) { + Py_DECREF(m); return NULL; } - import_array(); - return m; } diff --git a/src/qhull_wrap.cpp b/src/qhull_wrap.cpp index 866a7f947330..45e78380849e 100644 --- a/src/qhull_wrap.cpp +++ b/src/qhull_wrap.cpp @@ -322,14 +322,14 @@ PyInit__qhull(void) { PyObject* m; + import_array(); + m = PyModule_Create(&qhull_module); if (m == NULL) { return NULL; } - import_array(); - return m; } diff --git a/src/tri/_tri_wrapper.cpp b/src/tri/_tri_wrapper.cpp index fcf155721ecc..8b215c2c054b 100644 --- a/src/tri/_tri_wrapper.cpp +++ b/src/tri/_tri_wrapper.cpp @@ -510,6 +510,8 @@ PyMODINIT_FUNC PyInit__tri(void) { PyObject *m; + import_array(); + m = PyModule_Create(&moduledef); if (m == NULL) { @@ -517,17 +519,18 @@ PyMODINIT_FUNC PyInit__tri(void) } if (!PyTriangulation_init_type(m, &PyTriangulationType)) { + Py_DECREF(m); return NULL; } if (!PyTriContourGenerator_init_type(m, &PyTriContourGeneratorType)) { + Py_DECREF(m); return NULL; } if (!PyTrapezoidMapTriFinder_init_type(m, &PyTrapezoidMapTriFinderType)) { + Py_DECREF(m); return NULL; } - import_array(); - return m; }