Commit b5d6e35f authored by Guido van Rossum's avatar Guido van Rossum

When comparing objects, always check that tp_compare is not NULL

before calling it.  This check was there when the objects were of the
same type *before* coercion, but not if they initially differed but
became the same *after* coercion.
parent 0fa1c5fc
...@@ -312,14 +312,18 @@ PyObject_Compare(v, w) ...@@ -312,14 +312,18 @@ PyObject_Compare(v, w)
if ((vtp = v->ob_type) != (wtp = w->ob_type)) { if ((vtp = v->ob_type) != (wtp = w->ob_type)) {
char *vname = vtp->tp_name; char *vname = vtp->tp_name;
char *wname = wtp->tp_name; char *wname = wtp->tp_name;
if (vtp->tp_as_number != NULL && if (vtp->tp_as_number != NULL && wtp->tp_as_number != NULL) {
wtp->tp_as_number != NULL) {
int err; int err;
err = PyNumber_CoerceEx(&v, &w); err = PyNumber_CoerceEx(&v, &w);
if (err < 0) if (err < 0)
return -1; return -1;
else if (err == 0) { else if (err == 0) {
int cmp = (*v->ob_type->tp_compare)(v, w); int cmp;
vtp = v->ob_type;
if (vtp->tp_compare == NULL)
cmp = (v < w) ? -1 : 1;
else
cmp = (*vtp->tp_compare)(v, w);
Py_DECREF(v); Py_DECREF(v);
Py_DECREF(w); Py_DECREF(w);
return cmp; return cmp;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment