diff options
author | Benjamin Peterson <benjamin@python.org> | 2016-12-03 19:01:50 (GMT) |
---|---|---|
committer | Benjamin Peterson <benjamin@python.org> | 2016-12-03 19:01:50 (GMT) |
commit | 445844993b68f102241a600636b0d69394db1c7b (patch) | |
tree | d94d4fc9c7017fca0ff68a9d1889ccaff5e0801d /Objects/longobject.c | |
parent | 32b37348661b73b1dd6e061ef56679039222f31b (diff) | |
download | cpython-445844993b68f102241a600636b0d69394db1c7b.zip cpython-445844993b68f102241a600636b0d69394db1c7b.tar.gz cpython-445844993b68f102241a600636b0d69394db1c7b.tar.bz2 |
fix refleak in the shift-by-zero case (#27870)
Diffstat (limited to 'Objects/longobject.c')
-rw-r--r-- | Objects/longobject.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/Objects/longobject.c b/Objects/longobject.c index b87546e..768a92a 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -3710,14 +3710,15 @@ long_lshift(PyObject *v, PyObject *w) 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 @@ long_lshift(PyObject *v, PyObject *w) ++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 @@ long_lshift(PyObject *v, PyObject *w) else assert(!accum); z = long_normalize(z); - lshift_error: + out: Py_DECREF(a); Py_DECREF(b); return (PyObject *) z; |