[Python-checkins] bpo-35454: Fix miscellaneous minor issues in error handling. (#11077)

Serhiy Storchaka webhook-mailer at python.org
Tue Dec 11 01:38:06 EST 2018


https://github.com/python/cpython/commit/8905fcc85a6fc3ac394bc89b0bbf40897e9497a6
commit: 8905fcc85a6fc3ac394bc89b0bbf40897e9497a6
branch: master
author: Serhiy Storchaka <storchaka at gmail.com>
committer: GitHub <noreply at github.com>
date: 2018年12月11日T08:38:03+02:00
summary:
bpo-35454: Fix miscellaneous minor issues in error handling. (#11077)
* bpo-35454: Fix miscellaneous minor issues in error handling.
* Fix a null pointer dereference.
files:
M Modules/_elementtree.c
M Modules/_threadmodule.c
M Modules/socketmodule.c
M Objects/namespaceobject.c
M Python/_warnings.c
M Python/ceval.c
M Python/codecs.c
M Python/import.c
M Python/pylifecycle.c
diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c
index 62374d887c76..12e418d85ed5 100644
--- a/Modules/_elementtree.c
+++ b/Modules/_elementtree.c
@@ -352,7 +352,10 @@ get_attrib_from_keywords(PyObject *kwds)
 return NULL;
 }
 attrib = PyDict_Copy(attrib);
- PyDict_DelItem(kwds, attrib_str);
+ if (attrib && PyDict_DelItem(kwds, attrib_str) < 0) {
+ Py_DECREF(attrib);
+ attrib = NULL;
+ }
 } else {
 attrib = PyDict_New();
 }
diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c
index d075ef7455db..aacce698e4a4 100644
--- a/Modules/_threadmodule.c
+++ b/Modules/_threadmodule.c
@@ -777,9 +777,11 @@ local_clear(localobject *self)
 for(tstate = PyInterpreterState_ThreadHead(tstate->interp);
 tstate;
 tstate = PyThreadState_Next(tstate))
- if (tstate->dict &&
- PyDict_GetItem(tstate->dict, self->key))
- PyDict_DelItem(tstate->dict, self->key);
+ if (tstate->dict && PyDict_GetItem(tstate->dict, self->key)) {
+ if (PyDict_DelItem(tstate->dict, self->key)) {
+ PyErr_Clear();
+ }
+ }
 }
 return 0;
 }
diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c
index 40f1ca64a4ac..73d3e1add3ef 100644
--- a/Modules/socketmodule.c
+++ b/Modules/socketmodule.c
@@ -362,10 +362,14 @@ remove_unusable_flags(PyObject *m)
 else {
 if (PyDict_GetItemString(
 dict,
- win_runtime_flags[i].flag_name) != NULL) {
- PyDict_DelItemString(
- dict,
- win_runtime_flags[i].flag_name);
+ win_runtime_flags[i].flag_name) != NULL)
+ {
+ if (PyDict_DelItemString(
+ dict,
+ win_runtime_flags[i].flag_name))
+ {
+ PyErr_Clear();
+ }
 }
 }
 }
diff --git a/Objects/namespaceobject.c b/Objects/namespaceobject.c
index 0b902693849d..2acf809959da 100644
--- a/Objects/namespaceobject.c
+++ b/Objects/namespaceobject.c
@@ -103,15 +103,15 @@ namespace_repr(PyObject *ns)
 PyObject *value, *item;
 
 value = PyDict_GetItem(d, key);
- assert(value != NULL);
-
- item = PyUnicode_FromFormat("%S=%R", key, value);
- if (item == NULL) {
- loop_error = 1;
- }
- else {
- loop_error = PyList_Append(pairs, item);
- Py_DECREF(item);
+ if (value != NULL) {
+ item = PyUnicode_FromFormat("%S=%R", key, value);
+ if (item == NULL) {
+ loop_error = 1;
+ }
+ else {
+ loop_error = PyList_Append(pairs, item);
+ Py_DECREF(item);
+ }
 }
 }
 
diff --git a/Python/_warnings.c b/Python/_warnings.c
index ccbc73f54e4f..7eedd1374cba 100644
--- a/Python/_warnings.c
+++ b/Python/_warnings.c
@@ -255,7 +255,11 @@ already_warned(PyObject *registry, PyObject *key, int should_set)
 version_obj = _PyDict_GetItemId(registry, &PyId_version);
 if (version_obj == NULL
 || !PyLong_CheckExact(version_obj)
- || PyLong_AsLong(version_obj) != _PyRuntime.warnings.filters_version) {
+ || PyLong_AsLong(version_obj) != _PyRuntime.warnings.filters_version)
+ {
+ if (PyErr_Occurred()) {
+ return -1;
+ }
 PyDict_Clear(registry);
 version_obj = PyLong_FromLong(_PyRuntime.warnings.filters_version);
 if (version_obj == NULL)
diff --git a/Python/ceval.c b/Python/ceval.c
index ebe1c50e7bad..de6ff2994550 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -5109,7 +5109,7 @@ unicode_concatenate(PyObject *v, PyObject *w,
 PyObject *names = f->f_code->co_names;
 PyObject *name = GETITEM(names, oparg);
 PyObject *locals = f->f_locals;
- if (PyDict_CheckExact(locals) &&
+ if (locals && PyDict_CheckExact(locals) &&
 PyDict_GetItem(locals, name) == v) {
 if (PyDict_DelItem(locals, name) != 0) {
 PyErr_Clear();
diff --git a/Python/codecs.c b/Python/codecs.c
index 002fad308038..ff2142df40cc 100644
--- a/Python/codecs.c
+++ b/Python/codecs.c
@@ -129,8 +129,10 @@ PyObject *_PyCodec_Lookup(const char *encoding)
 
 /* Next, scan the search functions in order of registration */
 args = PyTuple_New(1);
- if (args == NULL)
- goto onError;
+ if (args == NULL) {
+ Py_DECREF(v);
+ return NULL;
+ }
 PyTuple_SET_ITEM(args,0,v);
 
 len = PyList_Size(interp->codec_search_path);
diff --git a/Python/import.c b/Python/import.c
index 15637c6a1f31..c4f087761cd6 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -2143,10 +2143,10 @@ _imp_create_dynamic_impl(PyObject *module, PyObject *spec, PyObject *file)
 }
 
 mod = _PyImport_FindExtensionObject(name, path);
- if (mod != NULL) {
+ if (mod != NULL || PyErr_Occurred()) {
 Py_DECREF(name);
 Py_DECREF(path);
- Py_INCREF(mod);
+ Py_XINCREF(mod);
 return mod;
 }
 
diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c
index 6de32decc5ae..37ecc510c8fb 100644
--- a/Python/pylifecycle.c
+++ b/Python/pylifecycle.c
@@ -1286,6 +1286,9 @@ new_interpreter(PyThreadState **tstate_p)
 PyDict_SetItemString(interp->sysdict, "modules", modules);
 _PySys_EndInit(interp->sysdict, interp);
 }
+ else if (PyErr_Occurred()) {
+ goto handle_error;
+ }
 
 bimod = _PyImport_FindBuiltin("builtins", modules);
 if (bimod != NULL) {
@@ -1294,6 +1297,9 @@ new_interpreter(PyThreadState **tstate_p)
 goto handle_error;
 Py_INCREF(interp->builtins);
 }
+ else if (PyErr_Occurred()) {
+ goto handle_error;
+ }
 
 /* initialize builtin exceptions */
 _PyExc_Init(bimod);


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /