Skip to content

Commit c66551d

Browse files
authored
[mypyc] Fix reference leaks on vecs module initialization failure (#22246)
Add decrefs for temporaries that would leak on initialization failure. Remove decref of `VecType` after it's been successfully added to the module because that steals it.
1 parent 972be3a commit c66551d

1 file changed

Lines changed: 64 additions & 51 deletions

File tree

‎mypyc/lib-rt/vecs/librt_vecs.c‎

Lines changed: 64 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -996,113 +996,126 @@ librt_vecs_module_exec(PyObject *m)
996996
return -1;
997997
}
998998

999-
LibRTVecs_I64TypeObj = (PyTypeObject *)PyObject_GetAttrString(ext, "i64");
1000-
if (LibRTVecs_I64TypeObj == NULL) {
1001-
return -1;
999+
PyTypeObject *i64 = NULL, *i32 = NULL, *i16 = NULL, *u8 = NULL;
1000+
1001+
i64 = (PyTypeObject *)PyObject_GetAttrString(ext, "i64");
1002+
if (i64 == NULL) {
1003+
goto error;
10021004
}
1003-
if (!PyType_Check(LibRTVecs_I64TypeObj)) {
1005+
if (!PyType_Check(i64)) {
10041006
PyErr_SetString(PyExc_TypeError, "mypy_extensions.i64 is not a type");
1005-
return -1;
1007+
goto error;
10061008
}
1007-
LibRTVecs_I32TypeObj = (PyTypeObject *)PyObject_GetAttrString(ext, "i32");
1008-
if (LibRTVecs_I32TypeObj == NULL) {
1009-
return -1;
1009+
i32 = (PyTypeObject *)PyObject_GetAttrString(ext, "i32");
1010+
if (i32 == NULL) {
1011+
goto error;
10101012
}
1011-
if (!PyType_Check(LibRTVecs_I32TypeObj)) {
1013+
if (!PyType_Check(i32)) {
10121014
PyErr_SetString(PyExc_TypeError, "mypy_extensions.i32 is not a type");
1013-
return -1;
1015+
goto error;
10141016
}
1015-
LibRTVecs_I16TypeObj = (PyTypeObject *)PyObject_GetAttrString(ext, "i16");
1016-
if (LibRTVecs_I16TypeObj == NULL) {
1017-
return -1;
1017+
i16 = (PyTypeObject *)PyObject_GetAttrString(ext, "i16");
1018+
if (i16 == NULL) {
1019+
goto error;
10181020
}
1019-
if (!PyType_Check(LibRTVecs_I16TypeObj)) {
1021+
if (!PyType_Check(i16)) {
10201022
PyErr_SetString(PyExc_TypeError, "mypy_extensions.i16 is not a type");
1021-
return -1;
1023+
goto error;
10221024
}
1023-
LibRTVecs_U8TypeObj = (PyTypeObject *)PyObject_GetAttrString(ext, "u8");
1024-
if (LibRTVecs_U8TypeObj == NULL) {
1025-
return -1;
1025+
u8 = (PyTypeObject *)PyObject_GetAttrString(ext, "u8");
1026+
if (u8 == NULL) {
1027+
goto error;
10261028
}
1027-
if (!PyType_Check(LibRTVecs_U8TypeObj)) {
1029+
if (!PyType_Check(u8)) {
10281030
PyErr_SetString(PyExc_TypeError, "mypy_extensions.u8 is not a type");
1029-
return -1;
1031+
goto error;
10301032
}
10311033

10321034
if (PyType_Ready(&VecType) < 0)
1033-
return -1;
1035+
goto error;
10341036
if (PyType_Ready(&VecGenericAliasType) < 0)
1035-
return -1;
1037+
goto error;
10361038

10371039
if (PyType_Ready(&VecTType) < 0)
1038-
return -1;
1040+
goto error;
10391041
if (PyType_Ready(&VecTBufType) < 0)
1040-
return -1;
1042+
goto error;
10411043
if (PyType_Ready(&VecTIterType) < 0)
1042-
return -1;
1044+
goto error;
10431045

10441046
if (PyType_Ready(&VecNestedType) < 0)
1045-
return -1;
1047+
goto error;
10461048
if (PyType_Ready(&VecNestedBufType) < 0)
1047-
return -1;
1049+
goto error;
10481050
if (PyType_Ready(&VecNestedIterType) < 0)
1049-
return -1;
1051+
goto error;
10501052

10511053
if (PyType_Ready(&VecI64Type) < 0)
1052-
return -1;
1054+
goto error;
10531055
if (PyType_Ready(&VecI64BufType) < 0)
1054-
return -1;
1056+
goto error;
10551057
if (PyType_Ready(&VecI64IterType) < 0)
1056-
return -1;
1058+
goto error;
10571059
if (PyType_Ready(&VecI32Type) < 0)
1058-
return -1;
1060+
goto error;
10591061
if (PyType_Ready(&VecI32BufType) < 0)
1060-
return -1;
1062+
goto error;
10611063
if (PyType_Ready(&VecI32IterType) < 0)
1062-
return -1;
1064+
goto error;
10631065
if (PyType_Ready(&VecI16Type) < 0)
1064-
return -1;
1066+
goto error;
10651067
if (PyType_Ready(&VecI16BufType) < 0)
1066-
return -1;
1068+
goto error;
10671069
if (PyType_Ready(&VecI16IterType) < 0)
1068-
return -1;
1070+
goto error;
10691071
if (PyType_Ready(&VecU8Type) < 0)
1070-
return -1;
1072+
goto error;
10711073
if (PyType_Ready(&VecU8BufType) < 0)
1072-
return -1;
1074+
goto error;
10731075
if (PyType_Ready(&VecU8IterType) < 0)
1074-
return -1;
1076+
goto error;
10751077
if (PyType_Ready(&VecFloatType) < 0)
1076-
return -1;
1078+
goto error;
10771079
if (PyType_Ready(&VecFloatBufType) < 0)
1078-
return -1;
1080+
goto error;
10791081
if (PyType_Ready(&VecFloatIterType) < 0)
1080-
return -1;
1082+
goto error;
10811083
if (PyType_Ready(&VecBoolType) < 0)
1082-
return -1;
1084+
goto error;
10831085
if (PyType_Ready(&VecBoolBufType) < 0)
1084-
return -1;
1086+
goto error;
10851087
if (PyType_Ready(&VecBoolIterType) < 0)
1086-
return -1;
1088+
goto error;
10871089

10881090
Py_INCREF(&VecType);
10891091
if (PyModule_AddObject(m, "vec", (PyObject *)&VecType) < 0) {
10901092
Py_DECREF(&VecType);
1091-
return -1;
1093+
goto error;
10921094
}
10931095

10941096
PyObject *c_api = PyCapsule_New(&Capsule, "librt.vecs._C_API", NULL);
10951097
if (c_api == NULL)
1096-
return -1;
1098+
goto error;
10971099

10981100
if (PyModule_AddObject(m, "_C_API", c_api) < 0) {
1099-
Py_XDECREF(c_api);
1100-
Py_DECREF(&VecType);
1101-
return -1;
1101+
Py_DECREF(c_api);
1102+
goto error;
11021103
}
11031104

1105+
Py_XSETREF(LibRTVecs_I64TypeObj, i64);
1106+
Py_XSETREF(LibRTVecs_I32TypeObj, i32);
1107+
Py_XSETREF(LibRTVecs_I16TypeObj, i16);
1108+
Py_XSETREF(LibRTVecs_U8TypeObj, u8);
11041109
Py_DECREF(ext);
11051110
return 0;
1111+
1112+
error:
1113+
Py_XDECREF(i64);
1114+
Py_XDECREF(i32);
1115+
Py_XDECREF(i16);
1116+
Py_XDECREF(u8);
1117+
Py_DECREF(ext);
1118+
return -1;
11061119
}
11071120

11081121
static PyModuleDef_Slot librt_vecs_module_slots[] = {

0 commit comments

Comments
 (0)