[libvirt] [libvirt-python PATCH 15/23] all Py*_New function has to be checked for return value
Pavel Hrdina
phrdina at redhat.com
Tue Sep 29 15:00:39 UTC 2015
On Sat, Sep 26, 2015 at 09:37:23AM -0400, John Ferlan wrote:
>
> $subj:
>
> Must check return value for all Py*_New functions
Thanks, I'll update it.
>
> On 09/24/2015 10:01 AM, Pavel Hrdina wrote:
> > If the function fails, we need to cleanup memory and return NULL.
> >
> > Signed-off-by: Pavel Hrdina <phrdina at redhat.com>
> > ---
> > libvirt-lxc-override.c | 10 +-
> > libvirt-override.c | 269 +++++++++++++++++++++++++++++++++----------------
> > 2 files changed, 190 insertions(+), 89 deletions(-)
> >
>
> General comment... 4 patches ago we were returning PyErr_NoMemory on
> allocation failures - that would seem to be the case for these too,
> right? Or is this "just different" enough that it would be necessary?
No, because all python APIs sets an exception in case of error.
>
> > diff --git a/libvirt-lxc-override.c b/libvirt-lxc-override.c
> > index 20d1cf4..b0550c7 100644
> > --- a/libvirt-lxc-override.c
> > +++ b/libvirt-lxc-override.c
> > @@ -79,7 +79,9 @@ libvirt_lxc_virDomainLxcOpenNamespace(PyObject *self ATTRIBUTE_UNUSED,
> > if (c_retval < 0)
> > return VIR_PY_NONE;
> >
> > - py_retval = PyList_New(0);
> > + if ((py_retval = PyList_New(0)) == NULL)
> > + goto error;
> > +
> > for (i = 0; i < c_retval; i++) {
> > PyObject *item = NULL;
> >
> > @@ -91,6 +93,8 @@ libvirt_lxc_virDomainLxcOpenNamespace(PyObject *self ATTRIBUTE_UNUSED,
> > goto error;
> > }
> > }
> > +
> > + cleanup:
> > VIR_FREE(fdlist);
> > return py_retval;
> >
> > @@ -98,8 +102,8 @@ libvirt_lxc_virDomainLxcOpenNamespace(PyObject *self ATTRIBUTE_UNUSED,
> > for (i = 0; i < c_retval; i++) {
> > VIR_FORCE_CLOSE(fdlist[i]);
> > }
> > - VIR_FREE(fdlist);
> > - return NULL;
> > + Py_CLEAR(py_retval);
> > + goto cleanup;
> > }
> > /************************************************************************
> > * *
> > diff --git a/libvirt-override.c b/libvirt-override.c
> > index 0df6844..92c31b8 100644
> > --- a/libvirt-override.c
> > +++ b/libvirt-override.c
> > @@ -1859,7 +1859,7 @@ static void
> > libvirt_virErrorFuncHandler(ATTRIBUTE_UNUSED void *ctx,
> > virErrorPtr err)
> > {
> > - PyObject *list, *info;
> > + PyObject *list = NULL, *info = NULL;
> > PyObject *result;
> >
> > DEBUG("libvirt_virErrorFuncHandler(%p, %s, ...) called\n", ctx,
> > @@ -1874,8 +1874,12 @@ libvirt_virErrorFuncHandler(ATTRIBUTE_UNUSED void *ctx,
> > (libvirt_virPythonErrorFuncHandler == Py_None)) {
> > virDefaultErrorFunc(err);
> > } else {
> > - list = PyTuple_New(2);
> > - info = PyTuple_New(9);
> > + if ((list = PyTuple_New(2)) == NULL)
> > + goto cleanup;
> > +
> > + if ((info = PyTuple_New(9)) == NULL)
> > + goto cleanup;
> > +
> > PyTuple_SetItem(list, 0, libvirt_virPythonErrorFuncCtxt);
> > PyTuple_SetItem(list, 1, info);
> > Py_XINCREF(libvirt_virPythonErrorFuncCtxt);
> > @@ -1894,6 +1898,10 @@ libvirt_virErrorFuncHandler(ATTRIBUTE_UNUSED void *ctx,
> > Py_XDECREF(result);
> > }
> >
> > + cleanup:
> > + Py_XDECREF(list);
> > + Py_XDECREF(info);
> > +
> > LIBVIRT_RELEASE_THREAD_STATE;
> > }
> >
> > @@ -1938,12 +1946,12 @@ virConnectCredCallbackWrapper(virConnectCredentialPtr cred,
> > unsigned int ncred,
> > void *cbdata)
> > {
> > - PyObject *list;
> > + PyObject *list = NULL;
> > PyObject *pycred;
> > PyObject *pyauth = (PyObject *)cbdata;
> > PyObject *pycbdata;
> > PyObject *pycb;
> > - PyObject *pyret;
> > + PyObject *pyret = NULL;
> > int ret = -1;
> > size_t i;
> >
> > @@ -1952,11 +1960,17 @@ virConnectCredCallbackWrapper(virConnectCredentialPtr cred,
> > pycb = PyList_GetItem(pyauth, 1);
> > pycbdata = PyList_GetItem(pyauth, 2);
> >
> > - list = PyTuple_New(2);
> > - pycred = PyTuple_New(ncred);
> > + if((list = PyTuple_New(2)) == NULL)
>
> if ((
Nice catch, thanks.
>
> > + goto cleanup;
> > +
> > + if ((pycred = PyTuple_New(ncred)) == NULL)
> > + goto cleanup;
> > +
> > for (i = 0; i < ncred; i++) {
> > - PyObject *pycreditem;
> > - pycreditem = PyList_New(5);
> > + PyObject *pycreditem = PyList_New(5);
> > + if (pycreditem == NULL)
> > + goto cleanup;
> > +
>
> nit: could all be one line (any typos are mine ;-))
>
> if ((pycreditem = PyList_New(5)) == NULL)
>
> Nothing jumped out at me in the rest - although I admit my eyes & brain
> are starting to tire ;-)
It's a lot of almost same changes, easy to miss something. I'll update that,
thanks.
Pavel
>
> John
> > PyTuple_SetItem(pycred, i, pycreditem);
> > PyList_SetItem(pycreditem, 0, libvirt_intWrap((long) cred[i].type));
> > PyList_SetItem(pycreditem, 1, libvirt_constcharPtrWrap(cred[i].prompt));
[...]
More information about the libvir-list
mailing list