Skip to content

Commit 8855d93

Browse files
[3.6] bpo-35454: Fix miscellaneous minor issues in error handling. (GH-11077) (GH-11106)
(cherry picked from commit 8905fcc)
1 parent 37607f2 commit 8855d93

File tree

9 files changed

+41
-23
lines changed

9 files changed

+41
-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
@@ -785,9 +785,11 @@ local_clear(localobject *self)
785785
for(tstate = PyInterpreterState_ThreadHead(tstate->interp);
786786
tstate;
787787
tstate = PyThreadState_Next(tstate))
788-
if (tstate->dict &&
789-
PyDict_GetItem(tstate->dict, self->key))
790-
PyDict_DelItem(tstate->dict, self->key);
788+
if (tstate->dict && PyDict_GetItem(tstate->dict, self->key)) {
789+
if (PyDict_DelItem(tstate->dict, self->key)) {
790+
PyErr_Clear();
791+
}
792+
}
791793
}
792794
return 0;
793795
}

Modules/socketmodule.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -367,10 +367,14 @@ remove_unusable_flags(PyObject *m)
367367
else {
368368
if (PyDict_GetItemString(
369369
dict,
370-
win_runtime_flags[i].flag_name) != NULL) {
371-
PyDict_DelItemString(
372-
dict,
373-
win_runtime_flags[i].flag_name);
370+
win_runtime_flags[i].flag_name) != NULL)
371+
{
372+
if (PyDict_DelItemString(
373+
dict,
374+
win_runtime_flags[i].flag_name))
375+
{
376+
PyErr_Clear();
377+
}
374378
}
375379
}
376380
}

Objects/namespaceobject.c

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

111111
value = PyDict_GetItem(d, key);
112-
assert(value != NULL);
113-
114-
item = PyUnicode_FromFormat("%S=%R", key, value);
115-
if (item == NULL) {
116-
loop_error = 1;
117-
}
118-
else {
119-
loop_error = PyList_Append(pairs, item);
120-
Py_DECREF(item);
112+
if (value != NULL) {
113+
item = PyUnicode_FromFormat("%S=%R", key, value);
114+
if (item == NULL) {
115+
loop_error = 1;
116+
}
117+
else {
118+
loop_error = PyList_Append(pairs, item);
119+
Py_DECREF(item);
120+
}
121121
}
122122
}
123123

Python/_warnings.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,11 @@ already_warned(PyObject *registry, PyObject *key, int should_set)
248248
version_obj = _PyDict_GetItemId(registry, &PyId_version);
249249
if (version_obj == NULL
250250
|| !PyLong_CheckExact(version_obj)
251-
|| PyLong_AsLong(version_obj) != _filters_version) {
251+
|| PyLong_AsLong(version_obj) != _filters_version)
252+
{
253+
if (PyErr_Occurred()) {
254+
return -1;
255+
}
252256
PyDict_Clear(registry);
253257
version_obj = PyLong_FromLong(_filters_version);
254258
if (version_obj == NULL)

Python/ceval.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5471,7 +5471,7 @@ unicode_concatenate(PyObject *v, PyObject *w,
54715471
PyObject *names = f->f_code->co_names;
54725472
PyObject *name = GETITEM(names, oparg);
54735473
PyObject *locals = f->f_locals;
5474-
if (PyDict_CheckExact(locals) &&
5474+
if (locals && PyDict_CheckExact(locals) &&
54755475
PyDict_GetItem(locals, name) == v) {
54765476
if (PyDict_DelItem(locals, name) != 0) {
54775477
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
@@ -1973,10 +1973,10 @@ _imp_create_dynamic_impl(PyObject *module, PyObject *spec, PyObject *file)
19731973
}
19741974

19751975
mod = _PyImport_FindExtensionObject(name, path);
1976-
if (mod != NULL) {
1976+
if (mod != NULL || PyErr_Occurred()) {
19771977
Py_DECREF(name);
19781978
Py_DECREF(path);
1979-
Py_INCREF(mod);
1979+
Py_XINCREF(mod);
19801980
return mod;
19811981
}
19821982

Python/pylifecycle.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -797,6 +797,9 @@ Py_NewInterpreter(void)
797797
goto handle_error;
798798
Py_INCREF(interp->builtins);
799799
}
800+
else if (PyErr_Occurred()) {
801+
goto handle_error;
802+
}
800803

801804
/* initialize builtin exceptions */
802805
_PyExc_Init(bimod);

0 commit comments

Comments
 (0)