mirror of https://github.com/python/cpython.git
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.
This commit is contained in:
parent
052969a602
commit
b4db1944c4
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue