From fbf82783e85d8529d5e0da63606b5bb1aae0fd79 Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Tue, 24 Sep 2013 16:27:32 +0100 Subject: [PATCH] Fix leak in qemuParseCommandLineDisk on OOM If OOM occurs in qemuParseCommandLineDisk some intermediate variables will be leaked when parsing Sheepdog or RBD disks. Signed-off-by: Daniel P. Berrange --- src/qemu/qemu_command.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index caabf81d6e..eef1541561 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -10030,8 +10030,10 @@ qemuParseCommandLineDisk(virDomainXMLOptionPtr xmlopt, if (VIR_STRDUP(def->src, p + strlen("rbd:")) < 0) goto error; /* old-style CEPH_ARGS env variable is parsed later */ - if (!old_style_ceph_args && qemuParseRBDString(def) < 0) - goto cleanup; + if (!old_style_ceph_args && qemuParseRBDString(def) < 0) { + VIR_FREE(p); + goto error; + } VIR_FREE(p); } else if (STRPREFIX(def->src, "gluster:") || @@ -10055,17 +10057,20 @@ qemuParseCommandLineDisk(virDomainXMLOptionPtr xmlopt, def->protocol = VIR_DOMAIN_DISK_PROTOCOL_SHEEPDOG; if (VIR_STRDUP(def->src, p + strlen("sheepdog:")) < 0) goto error; + VIR_FREE(p); /* def->src must be [vdiname] or [host]:[port]:[vdiname] */ port = strchr(def->src, ':'); if (port) { - *port++ = '\0'; - vdi = strchr(port, ':'); + *port = '\0'; + vdi = strchr(port + 1, ':'); if (!vdi) { + *port = ':'; virReportError(VIR_ERR_INTERNAL_ERROR, - _("cannot parse sheepdog filename '%s'"), p); + _("cannot parse sheepdog filename '%s'"), def->src); goto error; } + port++; *vdi++ = '\0'; if (VIR_ALLOC(def->hosts) < 0) goto error; @@ -10078,8 +10083,6 @@ qemuParseCommandLineDisk(virDomainXMLOptionPtr xmlopt, if (VIR_STRDUP(def->src, vdi) < 0) goto error; } - - VIR_FREE(p); } else def->type = VIR_DOMAIN_DISK_TYPE_FILE; } else { -- GitLab