Re: [libvirt-python PATCH 15/23] all Py*_New function has to be checked for return value

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



$subj:

Must check return value for all Py*_New functions

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@xxxxxxxxxx>
> ---
>  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?

> 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 ((

> +        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 ;-)

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));
> @@ -2329,16 +2343,21 @@ libvirt_virConnectListDefinedDomains(PyObject *self ATTRIBUTE_UNUSED,
>              return VIR_PY_NONE;
>          }
>      }
> -    py_retval = PyList_New(c_retval);
> +
> +    if ((py_retval = PyList_New(c_retval)) == NULL)
> +        goto cleanup;
>  
>      if (names) {
>          for (i = 0; i < c_retval; i++) {
>              PyList_SetItem(py_retval, i, libvirt_constcharPtrWrap(names[i]));
> -            VIR_FREE(names[i]);
>          }
> -        VIR_FREE(names);
>      }
>  
> + cleanup:
> +    for (i = 0; i < c_retval; i++)
> +        VIR_FREE(names[i]);
> +    VIR_FREE(names);
> +
>      return py_retval;
>  }
>  
> @@ -2480,7 +2499,9 @@ libvirt_virDomainSnapshotListChildrenNames(PyObject *self ATTRIBUTE_UNUSED,
>              return VIR_PY_NONE;
>          }
>      }
> -    py_retval = PyList_New(c_retval);
> +
> +    if ((py_retval = PyList_New(c_retval)) == NULL)
> +        goto cleanup;
>  
>      for (i = 0; i < c_retval; i++) {
>          if ((pyobj_snap = libvirt_constcharPtrWrap(names[i])) == NULL ||
> @@ -2589,7 +2610,10 @@ libvirt_virDomainGetInfo(PyObject *self ATTRIBUTE_UNUSED,
>      LIBVIRT_END_ALLOW_THREADS;
>      if (c_retval < 0)
>          return VIR_PY_NONE;
> -    py_retval = PyList_New(5);
> +
> +    if ((py_retval = PyList_New(5)) == NULL)
> +        return NULL;
> +
>      PyList_SetItem(py_retval, 0, libvirt_intWrap((int) info.state));
>      PyList_SetItem(py_retval, 1, libvirt_ulongWrap(info.maxMem));
>      PyList_SetItem(py_retval, 2, libvirt_ulongWrap(info.memory));
> @@ -2623,7 +2647,9 @@ libvirt_virDomainGetState(PyObject *self ATTRIBUTE_UNUSED,
>      if (c_retval < 0)
>          return VIR_PY_NONE;
>  
> -    py_retval = PyList_New(2);
> +    if ((py_retval = PyList_New(2)) == NULL)
> +        return NULL;
> +
>      PyList_SetItem(py_retval, 0, libvirt_intWrap(state));
>      PyList_SetItem(py_retval, 1, libvirt_intWrap(reason));
>      return py_retval;
> @@ -2650,7 +2676,10 @@ libvirt_virDomainGetControlInfo(PyObject *self ATTRIBUTE_UNUSED,
>      LIBVIRT_END_ALLOW_THREADS;
>      if (c_retval < 0)
>          return VIR_PY_NONE;
> -    py_retval = PyList_New(3);
> +
> +    if ((py_retval = PyList_New(3)) == NULL)
> +        return NULL;
> +
>      PyList_SetItem(py_retval, 0, libvirt_intWrap(info.state));
>      PyList_SetItem(py_retval, 1, libvirt_intWrap(info.details));
>      PyList_SetItem(py_retval, 2, libvirt_ulonglongWrap(info.stateTime));
> @@ -2679,7 +2708,10 @@ libvirt_virDomainGetBlockInfo(PyObject *self ATTRIBUTE_UNUSED,
>      LIBVIRT_END_ALLOW_THREADS;
>      if (c_retval < 0)
>          return VIR_PY_NONE;
> -    py_retval = PyList_New(3);
> +
> +    if ((py_retval = PyList_New(3)) == NULL)
> +        return NULL;
> +
>      PyList_SetItem(py_retval, 0, libvirt_ulonglongWrap(info.capacity));
>      PyList_SetItem(py_retval, 1, libvirt_ulonglongWrap(info.allocation));
>      PyList_SetItem(py_retval, 2, libvirt_ulonglongWrap(info.physical));
> @@ -2705,7 +2737,10 @@ libvirt_virNodeGetInfo(PyObject *self ATTRIBUTE_UNUSED,
>      LIBVIRT_END_ALLOW_THREADS;
>      if (c_retval < 0)
>          return VIR_PY_NONE;
> -    py_retval = PyList_New(8);
> +
> +    if ((py_retval = PyList_New(8)) == NULL)
> +        return NULL;
> +
>      PyList_SetItem(py_retval, 0, libvirt_constcharPtrWrap(&info.model[0]));
>      PyList_SetItem(py_retval, 1, libvirt_longWrap((long) info.memory >> 10));
>      PyList_SetItem(py_retval, 2, libvirt_intWrap((int) info.cpus));
> @@ -2737,7 +2772,10 @@ libvirt_virNodeGetSecurityModel(PyObject *self ATTRIBUTE_UNUSED,
>      LIBVIRT_END_ALLOW_THREADS;
>      if (c_retval < 0)
>          return VIR_PY_NONE;
> -    py_retval = PyList_New(2);
> +
> +    if ((py_retval = PyList_New(2)) == NULL)
> +        return NULL;
> +
>      PyList_SetItem(py_retval, 0, libvirt_constcharPtrWrap(&model.model[0]));
>      PyList_SetItem(py_retval, 1, libvirt_constcharPtrWrap(&model.doi[0]));
>      return py_retval;
> @@ -2763,7 +2801,10 @@ libvirt_virDomainGetSecurityLabel(PyObject *self ATTRIBUTE_UNUSED,
>      LIBVIRT_END_ALLOW_THREADS;
>      if (c_retval < 0)
>          return VIR_PY_NONE;
> -    py_retval = PyList_New(2);
> +
> +    if ((py_retval = PyList_New(2)) == NULL)
> +        return NULL;
> +
>      PyList_SetItem(py_retval, 0, libvirt_constcharPtrWrap(&label.label[0]));
>      PyList_SetItem(py_retval, 1, libvirt_boolWrap(label.enforcing));
>      return py_retval;
> @@ -2946,16 +2987,19 @@ libvirt_virConnectListNetworks(PyObject *self ATTRIBUTE_UNUSED,
>              return VIR_PY_NONE;
>          }
>      }
> -    py_retval = PyList_New(c_retval);
> +
> +    if ((py_retval = PyList_New(c_retval)) == NULL)
> +        goto cleanup;
>  
>      if (names) {
> -        for (i = 0; i < c_retval; i++) {
> +        for (i = 0; i < c_retval; i++)
>              PyList_SetItem(py_retval, i, libvirt_constcharPtrWrap(names[i]));
> -            VIR_FREE(names[i]);
> -        }
> -        VIR_FREE(names);
>      }
>  
> + cleanup:
> +    for (i = 0; i < c_retval; i++)
> +        VIR_FREE(names[i]);
> +    VIR_FREE(names);
>      return py_retval;
>  }
>  
> @@ -2994,16 +3038,19 @@ libvirt_virConnectListDefinedNetworks(PyObject *self ATTRIBUTE_UNUSED,
>              return VIR_PY_NONE;
>          }
>      }
> -    py_retval = PyList_New(c_retval);
> +
> +    if ((py_retval = PyList_New(c_retval)) == NULL)
> +        goto cleanup;
>  
>      if (names) {
> -        for (i = 0; i < c_retval; i++) {
> +        for (i = 0; i < c_retval; i++)
>              PyList_SetItem(py_retval, i, libvirt_constcharPtrWrap(names[i]));
> -            VIR_FREE(names[i]);
> -        }
> -        VIR_FREE(names);
>      }
>  
> + cleanup:
> +    for (i = 0; i < c_retval; i++)
> +        VIR_FREE(names[i]);
> +    VIR_FREE(names);
>      return py_retval;
>  }
>  
> @@ -3219,11 +3266,16 @@ libvirt_virNodeGetCellsFreeMemory(PyObject *self ATTRIBUTE_UNUSED,
>          VIR_FREE(freeMems);
>          return VIR_PY_NONE;
>      }
> -    py_retval = PyList_New(c_retval);
> +
> +    if ((py_retval = PyList_New(c_retval)) == NULL)
> +        goto cleanup;
> +
>      for (i = 0; i < c_retval; i++) {
>          PyList_SetItem(py_retval, i,
>                         libvirt_ulonglongWrap(freeMems[i]));
>      }
> +
> + cleanup:
>      VIR_FREE(freeMems);
>      return py_retval;
>  }
> @@ -3829,16 +3881,19 @@ libvirt_virNodeListDevices(PyObject *self ATTRIBUTE_UNUSED,
>              return VIR_PY_NONE;
>          }
>      }
> -    py_retval = PyList_New(c_retval);
> +
> +    if ((py_retval = PyList_New(c_retval)) == NULL)
> +        goto cleanup;
>  
>      if (names) {
> -        for (i = 0; i < c_retval; i++) {
> +        for (i = 0; i < c_retval; i++)
>              PyList_SetItem(py_retval, i, libvirt_constcharPtrWrap(names[i]));
> -            VIR_FREE(names[i]);
> -        }
> -        VIR_FREE(names);
>      }
>  
> + cleanup:
> +    for (i = 0; i < c_retval; i++)
> +        VIR_FREE(names[i]);
> +    VIR_FREE(names);
>      return py_retval;
>  }
>  
> @@ -3922,16 +3977,19 @@ libvirt_virNodeDeviceListCaps(PyObject *self ATTRIBUTE_UNUSED,
>              return VIR_PY_NONE;
>          }
>      }
> -    py_retval = PyList_New(c_retval);
> +
> +    if ((py_retval = PyList_New(c_retval)) == NULL)
> +        goto cleanup;
>  
>      if (names) {
> -        for (i = 0; i < c_retval; i++) {
> +        for (i = 0; i < c_retval; i++)
>              PyList_SetItem(py_retval, i, libvirt_constcharPtrWrap(names[i]));
> -            VIR_FREE(names[i]);
> -        }
> -        VIR_FREE(names);
>      }
>  
> + cleanup:
> +    for (i = 0; i < c_retval; i++)
> +        VIR_FREE(names[i]);
> +    VIR_FREE(names);
>      return py_retval;
>  }
>  
> @@ -4049,16 +4107,19 @@ libvirt_virConnectListSecrets(PyObject *self ATTRIBUTE_UNUSED,
>              return VIR_PY_NONE;
>          }
>      }
> -    py_retval = PyList_New(c_retval);
> +
> +    if ((py_retval = PyList_New(c_retval)) == NULL)
> +        goto cleanup;
>  
>      if (uuids) {
> -        for (i = 0; i < c_retval; i++) {
> +        for (i = 0; i < c_retval; i++)
>              PyList_SetItem(py_retval, i, libvirt_constcharPtrWrap(uuids[i]));
> -            VIR_FREE(uuids[i]);
> -        }
> -        VIR_FREE(uuids);
>      }
>  
> + cleanup:
> +    for (i = 0; i < c_retval; i++)
> +        VIR_FREE(uuids[i]);
> +    VIR_FREE(uuids);
>      return py_retval;
>  }
>  
> @@ -4282,16 +4343,19 @@ libvirt_virConnectListNWFilters(PyObject *self ATTRIBUTE_UNUSED,
>              return VIR_PY_NONE;
>          }
>      }
> -    py_retval = PyList_New(c_retval);
> +
> +    if ((py_retval = PyList_New(c_retval)) == NULL)
> +        goto cleanup;
>  
>      if (uuids) {
> -        for (i = 0; i < c_retval; i++) {
> +        for (i = 0; i < c_retval; i++)
>              PyList_SetItem(py_retval, i, libvirt_constcharPtrWrap(uuids[i]));
> -            VIR_FREE(uuids[i]);
> -        }
> -        VIR_FREE(uuids);
>      }
>  
> + cleanup:
> +    for (i = 0; i < c_retval; i++)
> +        VIR_FREE(uuids[i]);
> +    VIR_FREE(uuids);
>      return py_retval;
>  }
>  
> @@ -4578,7 +4642,10 @@ libvirt_virDomainGetJobInfo(PyObject *self ATTRIBUTE_UNUSED,
>      LIBVIRT_END_ALLOW_THREADS;
>      if (c_retval < 0)
>          return VIR_PY_NONE;
> -    py_retval = PyList_New(12);
> +
> +    if ((py_retval = PyList_New(12)) == NULL)
> +        return NULL;
> +
>      PyList_SetItem(py_retval, 0, libvirt_intWrap((int) info.type));
>      PyList_SetItem(py_retval, 1, libvirt_ulonglongWrap(info.timeElapsed));
>      PyList_SetItem(py_retval, 2, libvirt_ulonglongWrap(info.timeRemaining));
> @@ -5207,8 +5274,8 @@ libvirt_virEventAddHandleFunc(int fd,
>      PyObject *cb_obj;
>      PyObject *ff_obj;
>      PyObject *opaque_obj;
> -    PyObject *cb_args;
> -    PyObject *pyobj_args;
> +    PyObject *cb_args = NULL;
> +    PyObject *pyobj_args = NULL;
>      int retval = -1;
>  
>      LIBVIRT_ENSURE_THREAD_STATE;
> @@ -5225,12 +5292,16 @@ libvirt_virEventAddHandleFunc(int fd,
>      ff_obj = libvirt_virFreeCallbackWrap(ff);
>      opaque_obj = libvirt_virVoidPtrWrap(opaque);
>  
> -    cb_args = PyTuple_New(3);
> +    if ((cb_args = PyTuple_New(3)) == NULL)
> +        goto cleanup;
> +
>      PyTuple_SetItem(cb_args, 0, cb_obj);
>      PyTuple_SetItem(cb_args, 1, opaque_obj);
>      PyTuple_SetItem(cb_args, 2, ff_obj);
>  
> -    pyobj_args = PyTuple_New(4);
> +    if ((pyobj_args = PyTuple_New(4)) == NULL)
> +        goto cleanup;
> +
>      PyTuple_SetItem(pyobj_args, 0, libvirt_intWrap(fd));
>      PyTuple_SetItem(pyobj_args, 1, libvirt_intWrap(event));
>      PyTuple_SetItem(pyobj_args, 2, python_cb);
> @@ -5245,9 +5316,10 @@ libvirt_virEventAddHandleFunc(int fd,
>      }
>  
>      Py_XDECREF(result);
> -    Py_DECREF(pyobj_args);
>  
>   cleanup:
> +    Py_XDECREF(pyobj_args);
> +
>      LIBVIRT_RELEASE_THREAD_STATE;
>  
>      return retval;
> @@ -5257,12 +5329,14 @@ static void
>  libvirt_virEventUpdateHandleFunc(int watch,
>                                   int event)
>  {
> -    PyObject *result;
> +    PyObject *result = NULL;
>      PyObject *pyobj_args;
>  
>      LIBVIRT_ENSURE_THREAD_STATE;
>  
> -    pyobj_args = PyTuple_New(2);
> +    if ((pyobj_args = PyTuple_New(2)) == NULL)
> +        goto cleanup;
> +
>      PyTuple_SetItem(pyobj_args, 0, libvirt_intWrap(watch));
>      PyTuple_SetItem(pyobj_args, 1, libvirt_intWrap(event));
>  
> @@ -5272,8 +5346,9 @@ libvirt_virEventUpdateHandleFunc(int watch,
>          PyErr_Clear();
>      }
>  
> + cleanup:
>      Py_XDECREF(result);
> -    Py_DECREF(pyobj_args);
> +    Py_XDECREF(pyobj_args);
>  
>      LIBVIRT_RELEASE_THREAD_STATE;
>  }
> @@ -5282,7 +5357,7 @@ libvirt_virEventUpdateHandleFunc(int watch,
>  static int
>  libvirt_virEventRemoveHandleFunc(int watch)
>  {
> -    PyObject *result;
> +    PyObject *result = NULL;
>      PyObject *pyobj_args;
>      PyObject *opaque;
>      PyObject *ff;
> @@ -5291,7 +5366,9 @@ libvirt_virEventRemoveHandleFunc(int watch)
>  
>      LIBVIRT_ENSURE_THREAD_STATE;
>  
> -    pyobj_args = PyTuple_New(1);
> +    if ((pyobj_args = PyTuple_New(1)) == NULL)
> +        goto cleanup;
> +
>      PyTuple_SetItem(pyobj_args, 0, libvirt_intWrap(watch));
>  
>      result = PyEval_CallObject(removeHandleObj, pyobj_args);
> @@ -5311,8 +5388,9 @@ libvirt_virEventRemoveHandleFunc(int watch)
>          retval = 0;
>      }
>  
> + cleanup:
>      Py_XDECREF(result);
> -    Py_DECREF(pyobj_args);
> +    Py_XDECREF(pyobj_args);
>  
>      LIBVIRT_RELEASE_THREAD_STATE;
>  
> @@ -5326,15 +5404,13 @@ libvirt_virEventAddTimeoutFunc(int timeout,
>                                 void *opaque,
>                                 virFreeCallback ff)
>  {
> -    PyObject *result;
> -
> -    PyObject *python_cb;
> -
>      PyObject *cb_obj;
>      PyObject *ff_obj;
>      PyObject *opaque_obj;
> -    PyObject *cb_args;
> -    PyObject *pyobj_args;
> +    PyObject *result = NULL;
> +    PyObject *python_cb = NULL;
> +    PyObject *cb_args = NULL;
> +    PyObject *pyobj_args = NULL;
>      int retval = -1;
>  
>      LIBVIRT_ENSURE_THREAD_STATE;
> @@ -5351,12 +5427,16 @@ libvirt_virEventAddTimeoutFunc(int timeout,
>      ff_obj = libvirt_virFreeCallbackWrap(ff);
>      opaque_obj = libvirt_virVoidPtrWrap(opaque);
>  
> -    cb_args = PyTuple_New(3);
> +    if ((cb_args = PyTuple_New(3)) == NULL)
> +        goto cleanup;
> +
>      PyTuple_SetItem(cb_args, 0, cb_obj);
>      PyTuple_SetItem(cb_args, 1, opaque_obj);
>      PyTuple_SetItem(cb_args, 2, ff_obj);
>  
>      pyobj_args = PyTuple_New(3);
> +    if ((pyobj_args = PyTuple_New(3)) == NULL)
> +        goto cleanup;
>  
>      PyTuple_SetItem(pyobj_args, 0, libvirt_intWrap(timeout));
>      PyTuple_SetItem(pyobj_args, 1, python_cb);
> @@ -5370,10 +5450,10 @@ libvirt_virEventAddTimeoutFunc(int timeout,
>          libvirt_intUnwrap(result, &retval);
>      }
>  
> + cleanup:
>      Py_XDECREF(result);
> -    Py_DECREF(pyobj_args);
> +    Py_XDECREF(pyobj_args);
>  
> - cleanup:
>      LIBVIRT_RELEASE_THREAD_STATE;
>      return retval;
>  }
> @@ -5387,7 +5467,9 @@ libvirt_virEventUpdateTimeoutFunc(int timer,
>  
>      LIBVIRT_ENSURE_THREAD_STATE;
>  
> -    pyobj_args = PyTuple_New(2);
> +    if ((pyobj_args = PyTuple_New(2)) == NULL)
> +        goto cleanup;
> +
>      PyTuple_SetItem(pyobj_args, 0, libvirt_intWrap(timer));
>      PyTuple_SetItem(pyobj_args, 1, libvirt_intWrap(timeout));
>  
> @@ -5397,8 +5479,9 @@ libvirt_virEventUpdateTimeoutFunc(int timer,
>          PyErr_Clear();
>      }
>  
> + cleanup:
>      Py_XDECREF(result);
> -    Py_DECREF(pyobj_args);
> +    Py_XDECREF(pyobj_args);
>  
>      LIBVIRT_RELEASE_THREAD_STATE;
>  }
> @@ -5415,7 +5498,9 @@ libvirt_virEventRemoveTimeoutFunc(int timer)
>  
>      LIBVIRT_ENSURE_THREAD_STATE;
>  
> -    pyobj_args = PyTuple_New(1);
> +    if ((pyobj_args = PyTuple_New(1)) == NULL)
> +        goto cleanup;
> +
>      PyTuple_SetItem(pyobj_args, 0, libvirt_intWrap(timer));
>  
>      result = PyEval_CallObject(removeTimeoutObj, pyobj_args);
> @@ -5435,8 +5520,9 @@ libvirt_virEventRemoveTimeoutFunc(int timer)
>          retval = 0;
>      }
>  
> + cleanup:
>      Py_XDECREF(result);
> -    Py_DECREF(pyobj_args);
> +    Py_XDECREF(pyobj_args);
>  
>      LIBVIRT_RELEASE_THREAD_STATE;
>  
> @@ -6026,13 +6112,13 @@ libvirt_virConnectDomainEventGraphicsCallback(virConnectPtr conn ATTRIBUTE_UNUSE
>                                                void *opaque)
>  {
>      PyObject *pyobj_cbData = (PyObject*)opaque;
> -    PyObject *pyobj_dom;
> +    PyObject *pyobj_dom = NULL;
>      PyObject *pyobj_ret = NULL;
>      PyObject *pyobj_conn;
>      PyObject *dictKey;
> -    PyObject *pyobj_local;
> -    PyObject *pyobj_remote;
> -    PyObject *pyobj_subject;
> +    PyObject *pyobj_local = NULL;
> +    PyObject *pyobj_remote = NULL;
> +    PyObject *pyobj_subject = NULL;
>      int ret = -1;
>      size_t i;
>  
> @@ -6051,8 +6137,9 @@ libvirt_virConnectDomainEventGraphicsCallback(virConnectPtr conn ATTRIBUTE_UNUSE
>      }
>      Py_INCREF(pyobj_cbData);
>  
> -    /* FIXME This code should check for errors... */
> -    pyobj_local = PyDict_New();
> +    if ((pyobj_local = PyDict_New()) == NULL)
> +        goto cleanup;
> +
>      PyDict_SetItem(pyobj_local,
>                     libvirt_constcharPtrWrap("family"),
>                     libvirt_intWrap(local->family));
> @@ -6063,7 +6150,9 @@ libvirt_virConnectDomainEventGraphicsCallback(virConnectPtr conn ATTRIBUTE_UNUSE
>                     libvirt_constcharPtrWrap("service"),
>                     libvirt_constcharPtrWrap(local->service));
>  
> -    pyobj_remote = PyDict_New();
> +    if ((pyobj_remote = PyDict_New()) == NULL)
> +        goto cleanup;
> +
>      PyDict_SetItem(pyobj_remote,
>                     libvirt_constcharPtrWrap("family"),
>                     libvirt_intWrap(remote->family));
> @@ -6074,9 +6163,14 @@ libvirt_virConnectDomainEventGraphicsCallback(virConnectPtr conn ATTRIBUTE_UNUSE
>                     libvirt_constcharPtrWrap("service"),
>                     libvirt_constcharPtrWrap(remote->service));
>  
> -    pyobj_subject = PyList_New(subject->nidentity);
> +    if ((pyobj_subject = PyList_New(subject->nidentity)) == NULL)
> +        goto cleanup;
> +
>      for (i = 0; i < subject->nidentity; i++) {
>          PyObject *pair = PyTuple_New(2);
> +        if (pair == NULL)
> +            goto cleanup;
> +
>          PyTuple_SetItem(pair, 0,
>                          libvirt_constcharPtrWrap(subject->identities[i].type));
>          PyTuple_SetItem(pair, 1,
> @@ -6094,11 +6188,14 @@ libvirt_virConnectDomainEventGraphicsCallback(virConnectPtr conn ATTRIBUTE_UNUSE
>                                      authScheme, pyobj_subject,
>                                      pyobj_cbData);
>  
> + cleanup:
>      Py_DECREF(pyobj_cbData);
> -    Py_DECREF(pyobj_dom);
> +    Py_XDECREF(pyobj_dom);
>  
> - cleanup:
>      if (!pyobj_ret) {
> +        Py_XDECREF(pyobj_local);
> +        Py_XDECREF(pyobj_remote);
> +        Py_XDECREF(pyobj_subject);
>          DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
>          PyErr_Print();
>      } else {
> 

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list



[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]