1
0
mirror of https://gitlab.com/libvirt/libvirt-python.git synced 2025-08-08 01:49:27 +03:00

improve usage of cleanup paths

This removes several code duplicates and also some unusual code structures.

Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
This commit is contained in:
Pavel Hrdina
2015-10-05 09:40:42 +02:00
parent 3995ec8eda
commit 706c9dbefe

View File

@ -440,13 +440,13 @@ libvirt_virDomainGetSchedulerType(PyObject *self ATTRIBUTE_UNUSED,
return VIR_PY_NONE; return VIR_PY_NONE;
/* convert to a Python tuple of long objects */ /* convert to a Python tuple of long objects */
if ((info = PyTuple_New(2)) == NULL) { if ((info = PyTuple_New(2)) == NULL)
VIR_FREE(c_retval); goto cleanup;
return NULL;
}
PyTuple_SetItem(info, 0, libvirt_constcharPtrWrap(c_retval)); PyTuple_SetItem(info, 0, libvirt_constcharPtrWrap(c_retval));
PyTuple_SetItem(info, 1, libvirt_intWrap((long)nparams)); PyTuple_SetItem(info, 1, libvirt_intWrap((long)nparams));
cleanup:
VIR_FREE(c_retval); VIR_FREE(c_retval);
return info; return info;
} }
@ -2240,8 +2240,8 @@ libvirt_virConnectListDomainsID(PyObject *self ATTRIBUTE_UNUSED,
c_retval = virConnectListDomains(conn, ids, c_retval); c_retval = virConnectListDomains(conn, ids, c_retval);
LIBVIRT_END_ALLOW_THREADS; LIBVIRT_END_ALLOW_THREADS;
if (c_retval < 0) { if (c_retval < 0) {
VIR_FREE(ids); py_retval = VIR_PY_NONE;
return VIR_PY_NONE; goto cleanup;
} }
} }
@ -2335,8 +2335,8 @@ libvirt_virConnectListDefinedDomains(PyObject *self ATTRIBUTE_UNUSED,
c_retval = virConnectListDefinedDomains(conn, names, c_retval); c_retval = virConnectListDefinedDomains(conn, names, c_retval);
LIBVIRT_END_ALLOW_THREADS; LIBVIRT_END_ALLOW_THREADS;
if (c_retval < 0) { if (c_retval < 0) {
VIR_FREE(names); py_retval = VIR_PY_NONE;
return VIR_PY_NONE; goto cleanup;
} }
} }
@ -2349,8 +2349,9 @@ libvirt_virConnectListDefinedDomains(PyObject *self ATTRIBUTE_UNUSED,
} }
cleanup: cleanup:
for (i = 0; i < c_retval; i++) if (c_retval > 0)
VIR_FREE(names[i]); for (i = 0; i < c_retval; i++)
VIR_FREE(names[i]);
VIR_FREE(names); VIR_FREE(names);
return py_retval; return py_retval;
} }
@ -2386,8 +2387,8 @@ libvirt_virDomainSnapshotListNames(PyObject *self ATTRIBUTE_UNUSED,
c_retval = virDomainSnapshotListNames(dom, names, c_retval, flags); c_retval = virDomainSnapshotListNames(dom, names, c_retval, flags);
LIBVIRT_END_ALLOW_THREADS; LIBVIRT_END_ALLOW_THREADS;
if (c_retval < 0) { if (c_retval < 0) {
VIR_FREE(names); py_retval = VIR_PY_NONE;
return VIR_PY_NONE; goto cleanup;
} }
} }
py_retval = PyList_New(c_retval); py_retval = PyList_New(c_retval);
@ -2401,12 +2402,12 @@ libvirt_virDomainSnapshotListNames(PyObject *self ATTRIBUTE_UNUSED,
Py_CLEAR(py_retval); Py_CLEAR(py_retval);
goto cleanup; goto cleanup;
} }
VIR_FREE(names[i]);
} }
cleanup: cleanup:
for (i = 0; i < c_retval; i++) if (c_retval > 0)
VIR_FREE(names[i]); for (i = 0; i < c_retval; i++)
VIR_FREE(names[i]);
VIR_FREE(names); VIR_FREE(names);
return py_retval; return py_retval;
} }
@ -2489,8 +2490,8 @@ libvirt_virDomainSnapshotListChildrenNames(PyObject *self ATTRIBUTE_UNUSED,
flags); flags);
LIBVIRT_END_ALLOW_THREADS; LIBVIRT_END_ALLOW_THREADS;
if (c_retval < 0) { if (c_retval < 0) {
VIR_FREE(names); py_retval = VIR_PY_NONE;
return VIR_PY_NONE; goto cleanup;
} }
} }
@ -2508,8 +2509,9 @@ libvirt_virDomainSnapshotListChildrenNames(PyObject *self ATTRIBUTE_UNUSED,
} }
cleanup: cleanup:
for (i = 0; i < c_retval; i++) if (c_retval > 0)
VIR_FREE(names[i]); for (i = 0; i < c_retval; i++)
VIR_FREE(names[i]);
VIR_FREE(names); VIR_FREE(names);
return py_retval; return py_retval;
} }
@ -2972,8 +2974,8 @@ libvirt_virConnectListNetworks(PyObject *self ATTRIBUTE_UNUSED,
c_retval = virConnectListNetworks(conn, names, c_retval); c_retval = virConnectListNetworks(conn, names, c_retval);
LIBVIRT_END_ALLOW_THREADS; LIBVIRT_END_ALLOW_THREADS;
if (c_retval < 0) { if (c_retval < 0) {
VIR_FREE(names); py_retval = VIR_PY_NONE;
return VIR_PY_NONE; goto cleanup;
} }
} }
@ -2986,8 +2988,9 @@ libvirt_virConnectListNetworks(PyObject *self ATTRIBUTE_UNUSED,
} }
cleanup: cleanup:
for (i = 0; i < c_retval; i++) if (c_retval > 0)
VIR_FREE(names[i]); for (i = 0; i < c_retval; i++)
VIR_FREE(names[i]);
VIR_FREE(names); VIR_FREE(names);
return py_retval; return py_retval;
} }
@ -3023,8 +3026,8 @@ libvirt_virConnectListDefinedNetworks(PyObject *self ATTRIBUTE_UNUSED,
c_retval = virConnectListDefinedNetworks(conn, names, c_retval); c_retval = virConnectListDefinedNetworks(conn, names, c_retval);
LIBVIRT_END_ALLOW_THREADS; LIBVIRT_END_ALLOW_THREADS;
if (c_retval < 0) { if (c_retval < 0) {
VIR_FREE(names); py_retval = VIR_PY_NONE;
return VIR_PY_NONE; goto cleanup;
} }
} }
@ -3037,8 +3040,9 @@ libvirt_virConnectListDefinedNetworks(PyObject *self ATTRIBUTE_UNUSED,
} }
cleanup: cleanup:
for (i = 0; i < c_retval; i++) if (c_retval > 0)
VIR_FREE(names[i]); for (i = 0; i < c_retval; i++)
VIR_FREE(names[i]);
VIR_FREE(names); VIR_FREE(names);
return py_retval; return py_retval;
} }
@ -3245,8 +3249,8 @@ libvirt_virNodeGetCellsFreeMemory(PyObject *self ATTRIBUTE_UNUSED,
LIBVIRT_END_ALLOW_THREADS; LIBVIRT_END_ALLOW_THREADS;
if (c_retval < 0) { if (c_retval < 0) {
VIR_FREE(freeMems); py_retval = VIR_PY_NONE;
return VIR_PY_NONE; goto cleanup;
} }
if ((py_retval = PyList_New(c_retval)) == NULL) if ((py_retval = PyList_New(c_retval)) == NULL)
@ -3421,28 +3425,24 @@ libvirt_virConnectListStoragePools(PyObject *self ATTRIBUTE_UNUSED,
c_retval = virConnectListStoragePools(conn, names, c_retval); c_retval = virConnectListStoragePools(conn, names, c_retval);
LIBVIRT_END_ALLOW_THREADS; LIBVIRT_END_ALLOW_THREADS;
if (c_retval < 0) { if (c_retval < 0) {
VIR_FREE(names); py_retval = VIR_PY_NONE;
return VIR_PY_NONE; goto cleanup;
} }
} }
py_retval = PyList_New(c_retval);
if (py_retval == NULL) { if ((py_retval = PyList_New(c_retval)) == NULL)
if (names) { goto cleanup;
for (i = 0; i < c_retval; i++)
VIR_FREE(names[i]);
VIR_FREE(names);
}
return NULL;
}
if (names) { 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])); PyList_SetItem(py_retval, i, libvirt_constcharPtrWrap(names[i]));
VIR_FREE(names[i]);
}
VIR_FREE(names);
} }
cleanup:
if (c_retval > 0)
for (i = 0; i < c_retval; i++)
VIR_FREE(names[i]);
VIR_FREE(names);
return py_retval; return py_retval;
} }
@ -3476,28 +3476,24 @@ libvirt_virConnectListDefinedStoragePools(PyObject *self ATTRIBUTE_UNUSED,
c_retval = virConnectListDefinedStoragePools(conn, names, c_retval); c_retval = virConnectListDefinedStoragePools(conn, names, c_retval);
LIBVIRT_END_ALLOW_THREADS; LIBVIRT_END_ALLOW_THREADS;
if (c_retval < 0) { if (c_retval < 0) {
VIR_FREE(names); py_retval = VIR_PY_NONE;
return VIR_PY_NONE; goto cleanup;
} }
} }
py_retval = PyList_New(c_retval);
if (py_retval == NULL) { if ((py_retval = PyList_New(c_retval)) == NULL)
if (names) { goto cleanup;
for (i = 0; i < c_retval; i++)
VIR_FREE(names[i]);
VIR_FREE(names);
}
return NULL;
}
if (names) { 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])); PyList_SetItem(py_retval, i, libvirt_constcharPtrWrap(names[i]));
VIR_FREE(names[i]);
}
VIR_FREE(names);
} }
cleanup:
if (c_retval > 0)
for (i = 0; i < c_retval; i++)
VIR_FREE(names[i]);
VIR_FREE(names);
return py_retval; return py_retval;
} }
@ -3579,28 +3575,24 @@ libvirt_virStoragePoolListVolumes(PyObject *self ATTRIBUTE_UNUSED,
c_retval = virStoragePoolListVolumes(pool, names, c_retval); c_retval = virStoragePoolListVolumes(pool, names, c_retval);
LIBVIRT_END_ALLOW_THREADS; LIBVIRT_END_ALLOW_THREADS;
if (c_retval < 0) { if (c_retval < 0) {
VIR_FREE(names); py_retval = VIR_PY_NONE;
return VIR_PY_NONE; goto cleanup;
} }
} }
py_retval = PyList_New(c_retval);
if (py_retval == NULL) { if ((py_retval = PyList_New(c_retval)) == NULL)
if (names) { goto cleanup;
for (i = 0; i < c_retval; i++)
VIR_FREE(names[i]);
VIR_FREE(names);
}
return NULL;
}
if (names) { 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])); PyList_SetItem(py_retval, i, libvirt_constcharPtrWrap(names[i]));
VIR_FREE(names[i]);
}
VIR_FREE(names);
} }
cleanup:
if (c_retval > 0)
for (i = 0; i < c_retval; i++)
VIR_FREE(names[i]);
VIR_FREE(names);
return py_retval; return py_retval;
} }
@ -3850,9 +3842,10 @@ libvirt_virNodeListDevices(PyObject *self ATTRIBUTE_UNUSED,
LIBVIRT_BEGIN_ALLOW_THREADS; LIBVIRT_BEGIN_ALLOW_THREADS;
c_retval = virNodeListDevices(conn, cap, names, c_retval, flags); c_retval = virNodeListDevices(conn, cap, names, c_retval, flags);
LIBVIRT_END_ALLOW_THREADS; LIBVIRT_END_ALLOW_THREADS;
if (c_retval < 0) { if (c_retval < 0) {
VIR_FREE(names); py_retval = VIR_PY_NONE;
return VIR_PY_NONE; goto cleanup;
} }
} }
@ -3865,8 +3858,9 @@ libvirt_virNodeListDevices(PyObject *self ATTRIBUTE_UNUSED,
} }
cleanup: cleanup:
for (i = 0; i < c_retval; i++) if (c_retval > 0)
VIR_FREE(names[i]); for (i = 0; i < c_retval; i++)
VIR_FREE(names[i]);
VIR_FREE(names); VIR_FREE(names);
return py_retval; return py_retval;
} }
@ -3947,8 +3941,8 @@ libvirt_virNodeDeviceListCaps(PyObject *self ATTRIBUTE_UNUSED,
c_retval = virNodeDeviceListCaps(dev, names, c_retval); c_retval = virNodeDeviceListCaps(dev, names, c_retval);
LIBVIRT_END_ALLOW_THREADS; LIBVIRT_END_ALLOW_THREADS;
if (c_retval < 0) { if (c_retval < 0) {
VIR_FREE(names); py_retval = VIR_PY_NONE;
return VIR_PY_NONE; goto cleanup;
} }
} }
@ -3961,8 +3955,9 @@ libvirt_virNodeDeviceListCaps(PyObject *self ATTRIBUTE_UNUSED,
} }
cleanup: cleanup:
for (i = 0; i < c_retval; i++) if (c_retval > 0)
VIR_FREE(names[i]); for (i = 0; i < c_retval; i++)
VIR_FREE(names[i]);
VIR_FREE(names); VIR_FREE(names);
return py_retval; return py_retval;
} }
@ -4072,8 +4067,8 @@ libvirt_virConnectListSecrets(PyObject *self ATTRIBUTE_UNUSED,
c_retval = virConnectListSecrets(conn, uuids, c_retval); c_retval = virConnectListSecrets(conn, uuids, c_retval);
LIBVIRT_END_ALLOW_THREADS; LIBVIRT_END_ALLOW_THREADS;
if (c_retval < 0) { if (c_retval < 0) {
VIR_FREE(uuids); py_retval = VIR_PY_NONE;
return VIR_PY_NONE; goto cleanup;
} }
} }
@ -4086,8 +4081,9 @@ libvirt_virConnectListSecrets(PyObject *self ATTRIBUTE_UNUSED,
} }
cleanup: cleanup:
for (i = 0; i < c_retval; i++) if (c_retval > 0)
VIR_FREE(uuids[i]); for (i = 0; i < c_retval; i++)
VIR_FREE(uuids[i]);
VIR_FREE(uuids); VIR_FREE(uuids);
return py_retval; return py_retval;
} }
@ -4301,8 +4297,8 @@ libvirt_virConnectListNWFilters(PyObject *self ATTRIBUTE_UNUSED,
c_retval = virConnectListNWFilters(conn, uuids, c_retval); c_retval = virConnectListNWFilters(conn, uuids, c_retval);
LIBVIRT_END_ALLOW_THREADS; LIBVIRT_END_ALLOW_THREADS;
if (c_retval < 0) { if (c_retval < 0) {
VIR_FREE(uuids); py_retval = VIR_PY_NONE;
return VIR_PY_NONE; goto cleanup;
} }
} }
@ -4315,8 +4311,9 @@ libvirt_virConnectListNWFilters(PyObject *self ATTRIBUTE_UNUSED,
} }
cleanup: cleanup:
for (i = 0; i < c_retval; i++) if (c_retval > 0)
VIR_FREE(uuids[i]); for (i = 0; i < c_retval; i++)
VIR_FREE(uuids[i]);
VIR_FREE(uuids); VIR_FREE(uuids);
return py_retval; return py_retval;
} }
@ -4400,28 +4397,24 @@ libvirt_virConnectListInterfaces(PyObject *self ATTRIBUTE_UNUSED,
c_retval = virConnectListInterfaces(conn, names, c_retval); c_retval = virConnectListInterfaces(conn, names, c_retval);
LIBVIRT_END_ALLOW_THREADS; LIBVIRT_END_ALLOW_THREADS;
if (c_retval < 0) { if (c_retval < 0) {
VIR_FREE(names); py_retval = VIR_PY_NONE;
return VIR_PY_NONE; goto cleanup;
} }
} }
py_retval = PyList_New(c_retval);
if (py_retval == NULL) { if ((py_retval = PyList_New(c_retval)) == NULL)
if (names) { goto cleanup;
for (i = 0; i < c_retval; i++)
VIR_FREE(names[i]);
VIR_FREE(names);
}
return NULL;
}
if (names) { 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])); PyList_SetItem(py_retval, i, libvirt_constcharPtrWrap(names[i]));
VIR_FREE(names[i]);
}
VIR_FREE(names);
} }
cleanup:
if (c_retval > 0)
for (i = 0; i < c_retval; i++)
VIR_FREE(names[i]);
VIR_FREE(names);
return py_retval; return py_retval;
} }
@ -4457,28 +4450,24 @@ libvirt_virConnectListDefinedInterfaces(PyObject *self ATTRIBUTE_UNUSED,
c_retval = virConnectListDefinedInterfaces(conn, names, c_retval); c_retval = virConnectListDefinedInterfaces(conn, names, c_retval);
LIBVIRT_END_ALLOW_THREADS; LIBVIRT_END_ALLOW_THREADS;
if (c_retval < 0) { if (c_retval < 0) {
VIR_FREE(names); py_retval = VIR_PY_NONE;
return VIR_PY_NONE; goto cleanup;
} }
} }
py_retval = PyList_New(c_retval);
if (py_retval == NULL) { if ((py_retval = PyList_New(c_retval)) == NULL)
if (names) { goto cleanup;
for (i = 0; i < c_retval; i++)
VIR_FREE(names[i]);
VIR_FREE(names);
}
return NULL;
}
if (names) { 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])); PyList_SetItem(py_retval, i, libvirt_constcharPtrWrap(names[i]));
VIR_FREE(names[i]);
}
VIR_FREE(names);
} }
cleanup:
if (c_retval > 0)
for (i = 0; i < c_retval; i++)
VIR_FREE(names[i]);
VIR_FREE(names);
return py_retval; return py_retval;
} }
@ -4894,11 +4883,10 @@ libvirt_virDomainGetDiskErrors(PyObject *self ATTRIBUTE_UNUSED,
} }
cleanup: cleanup:
if (disks) { if (count > 0)
for (i = 0; i < count; i++) for (i = 0; i < count; i++)
VIR_FREE(disks[i].disk); VIR_FREE(disks[i].disk);
VIR_FREE(disks); VIR_FREE(disks);
}
return py_retval; return py_retval;
} }
@ -8186,10 +8174,9 @@ libvirt_virNetworkGetDHCPLeases(PyObject *self ATTRIBUTE_UNUSED,
} }
cleanup: cleanup:
if (leases) { if (leases_count > 0)
for (i = 0; i < leases_count; i++) for (i = 0; i < leases_count; i++)
virNetworkDHCPLeaseFree(leases[i]); virNetworkDHCPLeaseFree(leases[i]);
}
VIR_FREE(leases); VIR_FREE(leases);
return py_retval; return py_retval;
@ -8458,17 +8445,19 @@ libvirt_virDomainGetFSInfo(PyObject *self ATTRIBUTE_UNUSED,
/* convert to a Python list */ /* convert to a Python list */
if ((py_retval = PyList_New(c_retval)) == NULL) if ((py_retval = PyList_New(c_retval)) == NULL)
goto cleanup; goto error;
for (i = 0; i < c_retval; i++) { for (i = 0; i < c_retval; i++) {
virDomainFSInfoPtr fs = fsinfo[i]; virDomainFSInfoPtr fs = fsinfo[i];
PyObject *info, *alias; PyObject *info, *alias;
if (fs == NULL) if (fs == NULL)
goto cleanup; goto error;
info = PyTuple_New(4); info = PyTuple_New(4);
if (info == NULL) if (info == NULL)
goto cleanup; goto error;
PyList_SetItem(py_retval, i, info); PyList_SetItem(py_retval, i, info);
PyTuple_SetItem(info, 0, libvirt_constcharPtrWrap(fs->mountpoint)); PyTuple_SetItem(info, 0, libvirt_constcharPtrWrap(fs->mountpoint));
@ -8477,27 +8466,26 @@ libvirt_virDomainGetFSInfo(PyObject *self ATTRIBUTE_UNUSED,
alias = PyList_New(0); alias = PyList_New(0);
if (alias == NULL) if (alias == NULL)
goto cleanup; goto error;
PyTuple_SetItem(info, 3, alias); PyTuple_SetItem(info, 3, alias);
for (j = 0; j < fs->ndevAlias; j++) for (j = 0; j < fs->ndevAlias; j++)
if (PyList_Append(alias, if (PyList_Append(alias,
libvirt_constcharPtrWrap(fs->devAlias[j])) < 0) libvirt_constcharPtrWrap(fs->devAlias[j])) < 0)
goto cleanup; goto error;
} }
for (i = 0; i < c_retval; i++) cleanup:
virDomainFSInfoFree(fsinfo[i]); if (c_retval > 0)
for (i = 0; i < c_retval; i++)
virDomainFSInfoFree(fsinfo[i]);
VIR_FREE(fsinfo); VIR_FREE(fsinfo);
return py_retval; return py_retval;
cleanup: error:
for (i = 0; i < c_retval; i++) Py_CLEAR(py_retval);
virDomainFSInfoFree(fsinfo[i]); goto cleanup;
VIR_FREE(fsinfo);
Py_XDECREF(py_retval);
return NULL;
} }
#endif /* LIBVIR_CHECK_VERSION(1, 2, 11) */ #endif /* LIBVIR_CHECK_VERSION(1, 2, 11) */