# HG changeset patch # User Augie Fackler # Date 1422046536 18000 # Node ID bd307b462ce2a7d07b2960c6763cb0f3669115f1 # Parent 2cb49fba97364cc6f3df7ba2fce08d82a19419e4 parsers: avoid leaking several PyObjects in index_stats Found with cpychecker. diff -r 2cb49fba9736 -r bd307b462ce2 mercurial/parsers.c --- a/mercurial/parsers.c Fri Jan 23 15:50:40 2015 -0500 +++ b/mercurial/parsers.c Fri Jan 23 15:55:36 2015 -0500 @@ -818,19 +818,27 @@ static PyObject *index_stats(indexObject *self) { PyObject *obj = PyDict_New(); + PyObject *t = NULL; if (obj == NULL) return NULL; #define istat(__n, __d) \ - if (PyDict_SetItemString(obj, __d, PyInt_FromSsize_t(self->__n)) == -1) \ - goto bail; + t = PyInt_FromSsize_t(self->__n); \ + if (!t) \ + goto bail; \ + if (PyDict_SetItemString(obj, __d, t) == -1) \ + goto bail; \ + Py_DECREF(t); if (self->added) { Py_ssize_t len = PyList_GET_SIZE(self->added); - if (PyDict_SetItemString(obj, "index entries added", - PyInt_FromSsize_t(len)) == -1) + t = PyInt_FromSsize_t(len); + if (!t) goto bail; + if (PyDict_SetItemString(obj, "index entries added", t) == -1) + goto bail; + Py_DECREF(t); } if (self->raw_length != self->length - 1) @@ -850,6 +858,7 @@ bail: Py_XDECREF(obj); + Py_XDECREF(t); return NULL; }