[3.8] bpo-37994: Fix silencing all errors if an attribute lookup fails. (GH-15630) (GH-15635)

Only AttributeError should be silenced.
(cherry picked from commit 41c57b3353)
This commit is contained in:
Serhiy Storchaka 2019-09-01 14:01:05 +03:00 committed by GitHub
parent 6922b9e4fc
commit 353053d9ad
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
14 changed files with 133 additions and 126 deletions

View file

@ -201,16 +201,12 @@ PySys_Audit(const char *event, const char *argFormat, ...)
ts->tracing++;
ts->use_tracing = 0;
while ((hook = PyIter_Next(hooks)) != NULL) {
_Py_IDENTIFIER(__cantrace__);
PyObject *o;
int canTrace = -1;
o = PyObject_GetAttrString(hook, "__cantrace__");
int canTrace = _PyObject_LookupAttrId(hook, &PyId___cantrace__, &o);
if (o) {
canTrace = PyObject_IsTrue(o);
Py_DECREF(o);
} else if (PyErr_Occurred() &&
PyErr_ExceptionMatches(PyExc_AttributeError)) {
PyErr_Clear();
canTrace = 0;
}
if (canTrace < 0) {
break;
@ -538,7 +534,10 @@ sys_displayhook_unencodable(PyObject *outf, PyObject *o)
if (encoded == NULL)
goto error;
buffer = _PyObject_GetAttrId(outf, &PyId_buffer);
if (_PyObject_LookupAttrId(outf, &PyId_buffer, &buffer) < 0) {
Py_DECREF(encoded);
goto error;
}
if (buffer) {
result = _PyObject_CallMethodIdObjArgs(buffer, &PyId_write, encoded, NULL);
Py_DECREF(buffer);
@ -548,7 +547,6 @@ sys_displayhook_unencodable(PyObject *outf, PyObject *o)
Py_DECREF(result);
}
else {
PyErr_Clear();
escaped_str = PyUnicode_FromEncodedObject(encoded,
stdout_encoding_str,
"strict");