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

Only AttributeError should be silenced.
This commit is contained in:
Serhiy Storchaka 2019-09-01 12:03:39 +03:00 committed by GitHub
parent f02ea6225b
commit 41c57b3353
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
14 changed files with 134 additions and 127 deletions

View file

@ -224,16 +224,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(ts) &&
_PyErr_ExceptionMatches(ts, PyExc_AttributeError)) {
_PyErr_Clear(ts);
canTrace = 0;
}
if (canTrace < 0) {
break;
@ -579,7 +575,10 @@ sys_displayhook_unencodable(PyThreadState *tstate, 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_CallMethodIdOneArg(buffer, &PyId_write, encoded);
Py_DECREF(buffer);
@ -589,7 +588,6 @@ sys_displayhook_unencodable(PyThreadState *tstate, PyObject *outf, PyObject *o)
Py_DECREF(result);
}
else {
_PyErr_Clear(tstate);
escaped_str = PyUnicode_FromEncodedObject(encoded,
stdout_encoding_str,
"strict");