Skip to content

Commit 25a07f8

Browse files
pythongh-83004: Harden winreg init
1 parent 3516704 commit 25a07f8

File tree

1 file changed

+29
-18
lines changed

1 file changed

+29
-18
lines changed

PC/winreg.c

Lines changed: 29 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2070,16 +2070,23 @@ insint(PyObject * d, char * name, long value)
20702070

20712071
#define ADD_INT(val) insint(d, #val, val)
20722072

2073-
static void
2074-
inskey(PyObject * d, char * name, HKEY key)
2073+
static int
2074+
inskey(PyObject *mod, char *name, HKEY key)
20752075
{
20762076
PyObject *v = PyLong_FromVoidPtr(key);
2077-
if (!v || PyDict_SetItemString(d, name, v))
2078-
PyErr_Clear();
2079-
Py_XDECREF(v);
2077+
if (v == NULL) {
2078+
return -1;
2079+
}
2080+
int rc = PyModule_AddObjectRef(name, v);
2081+
Py_DECREF(v);
2082+
return rc;
20802083
}
20812084

2082-
#define ADD_KEY(val) inskey(d, #val, val)
2085+
#define ADD_KEY(VAL) do { \
2086+
if (inskey(m, #VAL, VAL) < 0) { \
2087+
goto error; \
2088+
} \
2089+
} while (0)
20832090

20842091

20852092
static struct PyModuleDef winregmodule = {
@@ -2096,20 +2103,20 @@ static struct PyModuleDef winregmodule = {
20962103

20972104
PyMODINIT_FUNC PyInit_winreg(void)
20982105
{
2099-
PyObject *m, *d;
2100-
m = PyModule_Create(&winregmodule);
2101-
if (m == NULL)
2106+
PyObject *m = PyModule_Create(&winregmodule);
2107+
if (m == NULL) {
21022108
return NULL;
2103-
d = PyModule_GetDict(m);
2109+
}
21042110
PyHKEY_Type.tp_doc = PyHKEY_doc;
2105-
if (PyType_Ready(&PyHKEY_Type) < 0)
2106-
return NULL;
2107-
if (PyDict_SetItemString(d, "HKEYType",
2108-
(PyObject *)&PyHKEY_Type) != 0)
2109-
return NULL;
2110-
if (PyDict_SetItemString(d, "error",
2111-
PyExc_OSError) != 0)
2112-
return NULL;
2111+
if (PyType_Ready(&PyHKEY_Type) < 0) {
2112+
goto error;
2113+
}
2114+
if (PyModule_AddObjectRef(m, "HKEYType", (PyObject *)&PyHKEY_Type) < 0) {
2115+
goto error;
2116+
}
2117+
if (PyModule_AddObjectRef(m, "error", PyExc_OSError) < 0) {
2118+
goto error;
2119+
}
21132120

21142121
/* Add the relevant constants */
21152122
ADD_KEY(HKEY_CLASSES_ROOT);
@@ -2171,6 +2178,10 @@ PyMODINIT_FUNC PyInit_winreg(void)
21712178
ADD_INT(REG_FULL_RESOURCE_DESCRIPTOR);
21722179
ADD_INT(REG_RESOURCE_REQUIREMENTS_LIST);
21732180
return m;
2181+
2182+
error:
2183+
Py_DECREF(m);
2184+
return NULL;
21742185
}
21752186

21762187
#endif /* MS_WINDOWS_DESKTOP || MS_WINDOWS_SYSTEM || MS_WINDOWS_GAMES */

0 commit comments

Comments
 (0)