[libvirt] [PATCH 01/13] conf: Utilize more of VIR_(APPEND|INSERT|DELETE)_ELEMENT
Eric Blake
eblake at redhat.com
Fri Mar 7 19:48:29 UTC 2014
On 03/07/2014 02:45 AM, Michal Privoznik wrote:
> This fixes a possible double free. In virNetworkAssignDef() if
> virBitmapNew() fails, then virNetworkObjFree(network) is called.
> However, with network->def pointing to actual @def. So if caller
> frees @def again, ...
>
> Moreover, this fixes one possible memory leak too. In
> virInterfaceAssignDef() if appending to the list of interfaces
> fails, we ought to call virInterfaceObjFree() instead of bare
> VIR_FREE().
>
> Although, in order to do that some array size variables needs
> to be turned into size_t rather than int.
>
> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> ---
> src/conf/domain_conf.c | 120 +++++++++-----------------------------------
> src/conf/domain_conf.h | 4 +-
> src/conf/interface_conf.c | 26 +++-------
> src/conf/interface_conf.h | 2 +-
> src/conf/network_conf.c | 30 ++++-------
> src/conf/network_conf.h | 4 +-
> src/conf/node_device_conf.c | 16 ++----
> src/conf/node_device_conf.h | 2 +-
> src/conf/nwfilter_conf.c | 33 ++++--------
> src/conf/nwfilter_conf.h | 8 +--
> src/conf/nwfilter_params.c | 12 ++---
> src/conf/nwfilter_params.h | 2 +-
> src/conf/object_event.c | 14 +-----
> src/conf/storage_conf.c | 16 ++----
> src/qemu/qemu_driver.c | 4 +-
> 15 files changed, 76 insertions(+), 217 deletions(-)
>
> @@ -900,14 +887,17 @@ virNetworkDNSHostDefParseXML(const char *networkName,
> if (cur->type == XML_ELEMENT_NODE &&
> xmlStrEqual(cur->name, BAD_CAST "hostname")) {
> if (cur->children != NULL) {
> - if (VIR_REALLOC_N(def->names, def->nnames + 1) < 0)
> - goto error;
> - def->names[def->nnames++] = (char *)xmlNodeGetContent(cur);
> - if (!def->names[def->nnames - 1]) {
> + char *name = (char *) xmlNodeGetContent(cur);
> +
> + if (!name) {
> virReportError(VIR_ERR_XML_DETAIL,
> _("Missing hostname in network '%s' DNS HOST record"),
> networkName);
> }
> + if (VIR_APPEND_ELEMENT(def->names, def->nnames, name) < 0) {
> + VIR_FREE(name);
> + goto error;
> + }
Pre-existing problem - if the xmlNodeGetContent failed, we reported the
error but didn't 'goto error'. Your new code still has the problem; you
need to add a 'goto error' in the 'if (!name)' block.
Amazing how much more compact this is. ACK with the error fix.
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 604 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20140307/5ee3e183/attachment-0001.sig>
More information about the libvir-list
mailing list