changeset: 105426:2b190bfd9ab4 branch: 2.7 user: Benjamin Peterson date: Sat Dec 03 11:01:50 2016 -0800 files: Objects/longobject.c description: fix refleak in the shift-by-zero case (#27870) diff -r a8a342b3fbc7 -r 2b190bfd9ab4 Objects/longobject.c --- a/Objects/longobject.c Sat Dec 03 02:14:09 2016 -0500 +++ b/Objects/longobject.c Sat Dec 03 11:01:50 2016 -0800 @@ -3710,14 +3710,15 @@ shiftby = PyLong_AsSsize_t((PyObject *)b); if (shiftby == -1L && PyErr_Occurred()) - goto lshift_error; + goto out; if (shiftby < 0) { PyErr_SetString(PyExc_ValueError, "negative shift count"); - goto lshift_error; + goto out; } if (Py_SIZE(a) == 0) { - return PyLong_FromLong(0); + z = (PyLongObject *)PyLong_FromLong(0); + goto out; } /* wordshift, remshift = divmod(shiftby, PyLong_SHIFT) */ @@ -3730,7 +3731,7 @@ ++newsize; z = _PyLong_New(newsize); if (z == NULL) - goto lshift_error; + goto out; if (a->ob_size < 0) z->ob_size = -(z->ob_size); for (i = 0; i < wordshift; i++) @@ -3746,7 +3747,7 @@ else assert(!accum); z = long_normalize(z); - lshift_error: + out: Py_DECREF(a); Py_DECREF(b); return (PyObject *) z;