diff options
author | Antoine Pitrou <solipsis@pitrou.net> | 2012-08-15 23:16:51 +0200 |
---|---|---|
committer | Antoine Pitrou <solipsis@pitrou.net> | 2012-08-15 23:16:51 +0200 |
commit | 24c6c8ee2fb34f7c327c34db152855db4c927c63 (patch) | |
tree | 38b18b090b2e3ca07d74b166c28b9456f2bb9930 /Python | |
parent | 6d8279be22560ba6ae4fc0a347b1a5fc723ba56e (diff) | |
download | cpython-24c6c8ee2fb34f7c327c34db152855db4c927c63.tar.gz |
Issue #15604: Update uses of PyObject_IsTrue() to check for and handle errors correctly.
Patch by Serhiy Storchaka.
Diffstat (limited to 'Python')
-rw-r--r-- | Python/bltinmodule.c | 22 | ||||
-rw-r--r-- | Python/import.c | 13 |
2 files changed, 27 insertions, 8 deletions
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 3def0800aa..a07b78c8d9 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -313,7 +313,7 @@ builtin_filter(PyObject *self, PyObject *args) ok = PyObject_IsTrue(good); Py_DECREF(good); } - if (ok) { + if (ok > 0) { if (j < len) PyList_SET_ITEM(result, j, item); else { @@ -324,8 +324,11 @@ builtin_filter(PyObject *self, PyObject *args) } ++j; } - else + else { Py_DECREF(item); + if (ok < 0) + goto Fail_result_it; + } } @@ -2784,12 +2787,15 @@ filtertuple(PyObject *func, PyObject *tuple) } ok = PyObject_IsTrue(good); Py_DECREF(good); - if (ok) { + if (ok > 0) { if (PyTuple_SetItem(result, j++, item) < 0) goto Fail_1; } - else + else { Py_DECREF(item); + if (ok < 0) + goto Fail_1; + } } if (_PyTuple_Resize(&result, j) < 0) @@ -2851,7 +2857,7 @@ filterstring(PyObject *func, PyObject *strobj) ok = PyObject_IsTrue(good); Py_DECREF(good); } - if (ok) { + if (ok > 0) { Py_ssize_t reslen; if (!PyString_Check(item)) { PyErr_SetString(PyExc_TypeError, "can't filter str to str:" @@ -2917,6 +2923,8 @@ filterstring(PyObject *func, PyObject *strobj) } } Py_DECREF(item); + if (ok < 0) + goto Fail_1; } if (j < outlen) @@ -2977,7 +2985,7 @@ filterunicode(PyObject *func, PyObject *strobj) ok = PyObject_IsTrue(good); Py_DECREF(good); } - if (ok) { + if (ok > 0) { Py_ssize_t reslen; if (!PyUnicode_Check(item)) { PyErr_SetString(PyExc_TypeError, @@ -3032,6 +3040,8 @@ filterunicode(PyObject *func, PyObject *strobj) } } Py_DECREF(item); + if (ok < 0) + goto Fail_1; } if (j < outlen) diff --git a/Python/import.c b/Python/import.c index e95b7c0e6f..53c9b293e9 100644 --- a/Python/import.c +++ b/Python/import.c @@ -1043,7 +1043,10 @@ load_source_module(char *name, char *pathname, FILE *fp) name, pathname); if (cpathname) { PyObject *ro = PySys_GetObject("dont_write_bytecode"); - if (ro == NULL || !PyObject_IsTrue(ro)) + int b = (ro == NULL) ? 0 : PyObject_IsTrue(ro); + if (b < 0) + goto error_exit; + if (!b) write_compiled_module(co, cpathname, &st); } } @@ -2200,7 +2203,13 @@ import_module_level(char *name, PyObject *globals, PyObject *locals, } if (fromlist != NULL) { - if (fromlist == Py_None || !PyObject_IsTrue(fromlist)) + int b = (fromlist == Py_None) ? 0 : PyObject_IsTrue(fromlist); + if (b < 0) { + Py_DECREF(tail); + Py_DECREF(head); + goto error_exit; + } + if (!b) fromlist = NULL; } |