Skip to content

Commit 8905fcc

Browse files
bpo-35454: Fix miscellaneous minor issues in error handling. (#11077)
* bpo-35454: Fix miscellaneous minor issues in error handling. * Fix a null pointer dereference.
1 parent bb86bf4 commit 8905fcc

File tree

9 files changed

+44
-23
lines changed

9 files changed

+44
-23
lines changed

Modules/_elementtree.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -352,7 +352,10 @@ get_attrib_from_keywords(PyObject *kwds)
352352
return NULL;
353353
}
354354
attrib = PyDict_Copy(attrib);
355-
PyDict_DelItem(kwds, attrib_str);
355+
if (attrib && PyDict_DelItem(kwds, attrib_str) < 0) {
356+
Py_DECREF(attrib);
357+
attrib = NULL;
358+
}
356359
} else {
357360
attrib = PyDict_New();
358361
}

Modules/_threadmodule.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -777,9 +777,11 @@ local_clear(localobject *self)
777777
for(tstate = PyInterpreterState_ThreadHead(tstate->interp);
778778
tstate;
779779
tstate = PyThreadState_Next(tstate))
780-
if (tstate->dict &&
781-
PyDict_GetItem(tstate->dict, self->key))
782-
PyDict_DelItem(tstate->dict, self->key);
780+
if (tstate->dict && PyDict_GetItem(tstate->dict, self->key)) {
781+
if (PyDict_DelItem(tstate->dict, self->key)) {
782+
PyErr_Clear();
783+
}
784+
}
783785
}
784786
return 0;
785787
}

Modules/socketmodule.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -362,10 +362,14 @@ remove_unusable_flags(PyObject *m)
362362
else {
363363
if (PyDict_GetItemString(
364364
dict,
365-
win_runtime_flags[i].flag_name) != NULL) {
366-
PyDict_DelItemString(
367-
dict,
368-
win_runtime_flags[i].flag_name);
365+
win_runtime_flags[i].flag_name) != NULL)
366+
{
367+
if (PyDict_DelItemString(
368+
dict,
369+
win_runtime_flags[i].flag_name))
370+
{
371+
PyErr_Clear();
372+
}
369373
}
370374
}
371375
}

Objects/namespaceobject.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -103,15 +103,15 @@ namespace_repr(PyObject *ns)
103103
PyObject *value, *item;
104104

105105
value = PyDict_GetItem(d, key);
106-
assert(value != NULL);
107-
108-
item = PyUnicode_FromFormat("%S=%R", key, value);
109-
if (item == NULL) {
110-
loop_error = 1;
111-
}
112-
else {
113-
loop_error = PyList_Append(pairs, item);
114-
Py_DECREF(item);
106+
if (value != NULL) {
107+
item = PyUnicode_FromFormat("%S=%R", key, value);
108+
if (item == NULL) {
109+
loop_error = 1;
110+
}
111+
else {
112+
loop_error = PyList_Append(pairs, item);
113+
Py_DECREF(item);
114+
}
115115
}
116116
}
117117

Python/_warnings.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,11 @@ already_warned(PyObject *registry, PyObject *key, int should_set)
255255
version_obj = _PyDict_GetItemId(registry, &PyId_version);
256256
if (version_obj == NULL
257257
|| !PyLong_CheckExact(version_obj)
258-
|| PyLong_AsLong(version_obj) != _PyRuntime.warnings.filters_version) {
258+
|| PyLong_AsLong(version_obj) != _PyRuntime.warnings.filters_version)
259+
{
260+
if (PyErr_Occurred()) {
261+
return -1;
262+
}
259263
PyDict_Clear(registry);
260264
version_obj = PyLong_FromLong(_PyRuntime.warnings.filters_version);
261265
if (version_obj == NULL)

Python/ceval.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5109,7 +5109,7 @@ unicode_concatenate(PyObject *v, PyObject *w,
51095109
PyObject *names = f->f_code->co_names;
51105110
PyObject *name = GETITEM(names, oparg);
51115111
PyObject *locals = f->f_locals;
5112-
if (PyDict_CheckExact(locals) &&
5112+
if (locals && PyDict_CheckExact(locals) &&
51135113
PyDict_GetItem(locals, name) == v) {
51145114
if (PyDict_DelItem(locals, name) != 0) {
51155115
PyErr_Clear();

Python/codecs.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,8 +129,10 @@ PyObject *_PyCodec_Lookup(const char *encoding)
129129

130130
/* Next, scan the search functions in order of registration */
131131
args = PyTuple_New(1);
132-
if (args == NULL)
133-
goto onError;
132+
if (args == NULL) {
133+
Py_DECREF(v);
134+
return NULL;
135+
}
134136
PyTuple_SET_ITEM(args,0,v);
135137

136138
len = PyList_Size(interp->codec_search_path);

Python/import.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2143,10 +2143,10 @@ _imp_create_dynamic_impl(PyObject *module, PyObject *spec, PyObject *file)
21432143
}
21442144

21452145
mod = _PyImport_FindExtensionObject(name, path);
2146-
if (mod != NULL) {
2146+
if (mod != NULL || PyErr_Occurred()) {
21472147
Py_DECREF(name);
21482148
Py_DECREF(path);
2149-
Py_INCREF(mod);
2149+
Py_XINCREF(mod);
21502150
return mod;
21512151
}
21522152

Python/pylifecycle.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1286,6 +1286,9 @@ new_interpreter(PyThreadState **tstate_p)
12861286
PyDict_SetItemString(interp->sysdict, "modules", modules);
12871287
_PySys_EndInit(interp->sysdict, interp);
12881288
}
1289+
else if (PyErr_Occurred()) {
1290+
goto handle_error;
1291+
}
12891292

12901293
bimod = _PyImport_FindBuiltin("builtins", modules);
12911294
if (bimod != NULL) {
@@ -1294,6 +1297,9 @@ new_interpreter(PyThreadState **tstate_p)
12941297
goto handle_error;
12951298
Py_INCREF(interp->builtins);
12961299
}
1300+
else if (PyErr_Occurred()) {
1301+
goto handle_error;
1302+
}
12971303

12981304
/* initialize builtin exceptions */
12991305
_PyExc_Init(bimod);

0 commit comments

Comments
 (0)