diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2019-09-01 09:03:39 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-09-01 09:03:39 (GMT) |
commit | 41c57b335330ff48af098d47e379e0f9ba09d233 (patch) | |
tree | 15cdef099182eddb04b2276dc51375b8faf28278 /Objects | |
parent | f02ea6225bc3b71bd5fe66224d199a6e3e23b14d (diff) | |
download | cpython-41c57b335330ff48af098d47e379e0f9ba09d233.zip cpython-41c57b335330ff48af098d47e379e0f9ba09d233.tar.gz cpython-41c57b335330ff48af098d47e379e0f9ba09d233.tar.bz2 |
bpo-37994: Fix silencing all errors if an attribute lookup fails. (GH-15630)
Only AttributeError should be silenced.
Diffstat (limited to 'Objects')
-rw-r--r-- | Objects/bytearrayobject.c | 5 | ||||
-rw-r--r-- | Objects/descrobject.c | 34 | ||||
-rw-r--r-- | Objects/fileobject.c | 6 | ||||
-rw-r--r-- | Objects/setobject.c | 5 | ||||
-rw-r--r-- | Objects/typeobject.c | 131 | ||||
-rw-r--r-- | Objects/weakrefobject.c | 6 |
6 files changed, 96 insertions, 91 deletions
diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c index 9dd6712..8c16cc6 100644 --- a/Objects/bytearrayobject.c +++ b/Objects/bytearrayobject.c @@ -2061,9 +2061,10 @@ _common_reduce(PyByteArrayObject *self, int proto) _Py_IDENTIFIER(__dict__); char *buf; - dict = _PyObject_GetAttrId((PyObject *)self, &PyId___dict__); + if (_PyObject_LookupAttrId((PyObject *)self, &PyId___dict__, &dict) < 0) { + return NULL; + } if (dict == NULL) { - PyErr_Clear(); dict = Py_None; Py_INCREF(dict); } diff --git a/Objects/descrobject.c b/Objects/descrobject.c index 9e1b281..c50fe00 100644 --- a/Objects/descrobject.c +++ b/Objects/descrobject.c @@ -1616,29 +1616,25 @@ property_init_impl(propertyobject *self, PyObject *fget, PyObject *fset, /* if no docstring given and the getter has one, use that one */ if ((doc == NULL || doc == Py_None) && fget != NULL) { _Py_IDENTIFIER(__doc__); - PyObject *get_doc = _PyObject_GetAttrId(fget, &PyId___doc__); - if (get_doc) { - if (Py_TYPE(self) == &PyProperty_Type) { - Py_XSETREF(self->prop_doc, get_doc); - } - else { - /* If this is a property subclass, put __doc__ - in dict of the subclass instance instead, - otherwise it gets shadowed by __doc__ in the - class's dict. */ - int err = _PyObject_SetAttrId((PyObject *)self, &PyId___doc__, get_doc); - Py_DECREF(get_doc); - if (err < 0) - return -1; - } - self->getter_doc = 1; + PyObject *get_doc; + int rc = _PyObject_LookupAttrId(fget, &PyId___doc__, &get_doc); + if (rc <= 0) { + return rc; } - else if (PyErr_ExceptionMatches(PyExc_Exception)) { - PyErr_Clear(); + if (Py_TYPE(self) == &PyProperty_Type) { + Py_XSETREF(self->prop_doc, get_doc); } else { - return -1; + /* If this is a property subclass, put __doc__ + in dict of the subclass instance instead, + otherwise it gets shadowed by __doc__ in the + class's dict. */ + int err = _PyObject_SetAttrId((PyObject *)self, &PyId___doc__, get_doc); + Py_DECREF(get_doc); + if (err < 0) + return -1; } + self->getter_doc = 1; } return 0; diff --git a/Objects/fileobject.c b/Objects/fileobject.c index 0faf7e7..61c9428 100644 --- a/Objects/fileobject.c +++ b/Objects/fileobject.c @@ -185,8 +185,10 @@ PyObject_AsFileDescriptor(PyObject *o) if (PyLong_Check(o)) { fd = _PyLong_AsInt(o); } - else if ((meth = _PyObject_GetAttrId(o, &PyId_fileno)) != NULL) - { + else if (_PyObject_LookupAttrId(o, &PyId_fileno, &meth) < 0) { + return -1; + } + else if (meth != NULL) { PyObject *fno = _PyObject_CallNoArg(meth); Py_DECREF(meth); if (fno == NULL) diff --git a/Objects/setobject.c b/Objects/setobject.c index fafc2fa..924885d 100644 --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -1970,9 +1970,10 @@ set_reduce(PySetObject *so, PyObject *Py_UNUSED(ignored)) args = PyTuple_Pack(1, keys); if (args == NULL) goto done; - dict = _PyObject_GetAttrId((PyObject *)so, &PyId___dict__); + if (_PyObject_LookupAttrId((PyObject *)so, &PyId___dict__, &dict) < 0) { + goto done; + } if (dict == NULL) { - PyErr_Clear(); dict = Py_None; Py_INCREF(dict); } diff --git a/Objects/typeobject.c b/Objects/typeobject.c index c816c3b..1d8216d 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -1551,17 +1551,10 @@ tail_contains(PyObject *tuple, int whence, PyObject *o) static PyObject * class_name(PyObject *cls) { - PyObject *name = _PyObject_GetAttrId(cls, &PyId___name__); - if (name == NULL) { - PyErr_Clear(); + PyObject *name; + if (_PyObject_LookupAttrId(cls, &PyId___name__, &name) == 0) { name = PyObject_Repr(cls); } - if (name == NULL) - return NULL; - if (!PyUnicode_Check(name)) { - Py_DECREF(name); - return NULL; - } return name; } @@ -1579,13 +1572,15 @@ check_duplicates(PyObject *tuple) if (PyTuple_GET_ITEM(tuple, j) == o) { o = class_name(o); if (o != NULL) { - PyErr_Format(PyExc_TypeError, - "duplicate base class %U", - o); + if (PyUnicode_Check(o)) { + PyErr_Format(PyExc_TypeError, + "duplicate base class %U", o); + } + else { + PyErr_SetString(PyExc_TypeError, + "duplicate base class"); + } Py_DECREF(o); - } else { - PyErr_SetString(PyExc_TypeError, - "duplicate base class"); } return -1; } @@ -1629,13 +1624,20 @@ consistent method resolution\norder (MRO) for bases"); i = 0; while (PyDict_Next(set, &i, &k, &v) && (size_t)off < sizeof(buf)) { PyObject *name = class_name(k); - const char *name_str; + const char *name_str = NULL; if (name != NULL) { - name_str = PyUnicode_AsUTF8(name); - if (name_str == NULL) + if (PyUnicode_Check(name)) { + name_str = PyUnicode_AsUTF8(name); + } + else { name_str = "?"; - } else - name_str = "?"; + } + } + if (name_str == NULL) { + Py_XDECREF(name); + Py_DECREF(set); + return; + } off += PyOS_snprintf(buf + off, sizeof(buf) - off, " %s", name_str); Py_XDECREF(name); if (--n && (size_t)(off+1) < sizeof(buf)) { @@ -3422,10 +3424,10 @@ merge_class_dict(PyObject *dict, PyObject *aclass) assert(aclass); /* Merge in the type's dict (if any). */ - classdict = _PyObject_GetAttrId(aclass, &PyId___dict__); - if (classdict == NULL) - PyErr_Clear(); - else { + if (_PyObject_LookupAttrId(aclass, &PyId___dict__, &classdict) < 0) { + return -1; + } + if (classdict != NULL) { int status = PyDict_Update(dict, classdict); Py_DECREF(classdict); if (status < 0) @@ -3433,15 +3435,17 @@ merge_class_dict(PyObject *dict, PyObject *aclass) } /* Recursively merge in the base types' (if any) dicts. */ - bases = _PyObject_GetAttrId(aclass, &PyId___bases__); - if (bases == NULL) - PyErr_Clear(); - else { + if (_PyObject_LookupAttrId(aclass, &PyId___bases__, &bases) < 0) { + return -1; + } + if (bases != NULL) { /* We have no guarantee that bases is a real tuple */ Py_ssize_t i, n; n = PySequence_Size(bases); /* This better be right */ - if (n < 0) - PyErr_Clear(); + if (n < 0) { + Py_DECREF(bases); + return -1; + } else { for (i = 0; i < n; i++) { int status; @@ -4730,9 +4734,10 @@ object___dir___impl(PyObject *self) PyObject *itsclass = NULL; /* Get __dict__ (which may or may not be a real dict...) */ - dict = _PyObject_GetAttrId(self, &PyId___dict__); + if (_PyObject_LookupAttrId(self, &PyId___dict__, &dict) < 0) { + return NULL; + } if (dict == NULL) { - PyErr_Clear(); dict = PyDict_New(); } else if (!PyDict_Check(dict)) { @@ -4750,12 +4755,12 @@ object___dir___impl(PyObject *self) goto error; /* Merge in attrs reachable from its class. */ - itsclass = _PyObject_GetAttrId(self, &PyId___class__); - if (itsclass == NULL) - /* XXX(tomer): Perhaps fall back to obj->ob_type if no - __class__ exists? */ - PyErr_Clear(); - else if (merge_class_dict(dict, itsclass) != 0) + if (_PyObject_LookupAttrId(self, &PyId___class__, &itsclass) < 0) { + goto error; + } + /* XXX(tomer): Perhaps fall back to obj->ob_type if no + __class__ exists? */ + if (itsclass != NULL && merge_class_dict(dict, itsclass) < 0) goto error; result = PyDict_Keys(dict); @@ -6111,16 +6116,19 @@ method_is_overloaded(PyObject *left, PyObject *right, struct _Py_Identifier *nam PyObject *a, *b; int ok; - b = _PyObject_GetAttrId((PyObject *)(Py_TYPE(right)), name); + if (_PyObject_LookupAttrId((PyObject *)(Py_TYPE(right)), name, &b) < 0) { + return -1; + } if (b == NULL) { - PyErr_Clear(); /* If right doesn't have it, it's not overloaded */ return 0; } - a = _PyObject_GetAttrId((PyObject *)(Py_TYPE(left)), name); + if (_PyObject_LookupAttrId((PyObject *)(Py_TYPE(left)), name, &a) < 0) { + Py_DECREF(b); + return -1; + } if (a == NULL) { - PyErr_Clear(); Py_DECREF(b); /* If right has it but left doesn't, it's overloaded */ return 1; @@ -6129,11 +6137,6 @@ method_is_overloaded(PyObject *left, PyObject *right, struct _Py_Identifier *nam ok = PyObject_RichCompareBool(a, b, Py_NE); Py_DECREF(a); Py_DECREF(b); - if (ok < 0) { - PyErr_Clear(); - return 0; - } - return ok; } @@ -6151,16 +6154,20 @@ FUNCNAME(PyObject *self, PyObject *other) \ if (Py_TYPE(self)->tp_as_number != NULL && \ Py_TYPE(self)->tp_as_number->SLOTNAME == TESTFUNC) { \ PyObject *r; \ - if (do_other && \ - PyType_IsSubtype(Py_TYPE(other), Py_TYPE(self)) && \ - method_is_overloaded(self, other, &rop_id)) { \ - stack[0] = other; \ - stack[1] = self; \ - r = vectorcall_maybe(&rop_id, stack, 2); \ - if (r != Py_NotImplemented) \ - return r; \ - Py_DECREF(r); \ - do_other = 0; \ + if (do_other && PyType_IsSubtype(Py_TYPE(other), Py_TYPE(self))) { \ + int ok = method_is_overloaded(self, other, &rop_id); \ + if (ok < 0) { \ + return NULL; \ + } \ + if (ok) { \ + stack[0] = other; \ + stack[1] = self; \ + r = vectorcall_maybe(&rop_id, stack, 2); \ + if (r != Py_NotImplemented) \ + return r; \ + Py_DECREF(r); \ + do_other = 0; \ + } \ } \ stack[0] = self; \ stack[1] = other; \ @@ -7753,7 +7760,9 @@ supercheck(PyTypeObject *type, PyObject *obj) /* Try the slow way */ PyObject *class_attr; - class_attr = _PyObject_GetAttrId(obj, &PyId___class__); + if (_PyObject_LookupAttrId(obj, &PyId___class__, &class_attr) < 0) { + return NULL; + } if (class_attr != NULL && PyType_Check(class_attr) && (PyTypeObject *)class_attr != Py_TYPE(obj)) @@ -7763,11 +7772,7 @@ supercheck(PyTypeObject *type, PyObject *obj) if (ok) return (PyTypeObject *)class_attr; } - - if (class_attr == NULL) - PyErr_Clear(); - else - Py_DECREF(class_attr); + Py_XDECREF(class_attr); } PyErr_SetString(PyExc_TypeError, diff --git a/Objects/weakrefobject.c b/Objects/weakrefobject.c index e8a429a..daee476 100644 --- a/Objects/weakrefobject.c +++ b/Objects/weakrefobject.c @@ -163,10 +163,10 @@ weakref_repr(PyWeakReference *self) if (PyWeakref_GET_OBJECT(self) == Py_None) return PyUnicode_FromFormat("<weakref at %p; dead>", self); - name = _PyObject_GetAttrId(PyWeakref_GET_OBJECT(self), &PyId___name__); + if (_PyObject_LookupAttrId(PyWeakref_GET_OBJECT(self), &PyId___name__, &name) < 0) { + return NULL; + } if (name == NULL || !PyUnicode_Check(name)) { - if (name == NULL) - PyErr_Clear(); repr = PyUnicode_FromFormat( "<weakref at %p; to '%s' at %p>", self, |