[libvirt] [PATCH 09/17] Fix leak in qemuParseCommandLineDisk on OOM

Daniel P. Berrange berrange at redhat.com
Tue Sep 24 16:03:59 UTC 2013


From: "Daniel P. Berrange" <berrange at redhat.com>

If OOM occurs in qemuParseCommandLineDisk some intermediate
variables will be leaked when parsing Sheepdog or RBD disks.

Signed-off-by: Daniel P. Berrange <berrange at redhat.com>
---
 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 a82c5dd..f6a3aa2 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -9935,8 +9935,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:") ||
@@ -9960,17 +9962,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;
@@ -9983,8 +9988,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 {
-- 
1.8.3.1




More information about the libvir-list mailing list