[libvirt] [PATCH 15/20] qemu: Remove PATH_MAX sized stack allocation used in commandline building

Matthias Bolte matthias.bolte at googlemail.com
Sun Apr 3 09:21:28 UTC 2011


---
 src/qemu/qemu_command.c |   43 ++++++++++++++++++++++++++++++-------------
 1 files changed, 30 insertions(+), 13 deletions(-)

diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 3138943..326a6b3 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -3318,7 +3318,8 @@ qemuBuildCommandLine(virConnectPtr conn,
     } else {
         for (i = 0 ; i < def->ndisks ; i++) {
             char dev[NAME_MAX];
-            char file[PATH_MAX];
+            char *file;
+            const char *fmt;
             virDomainDiskDefPtr disk = def->disks[i];
             int j;
 
@@ -3368,9 +3369,13 @@ qemuBuildCommandLine(virConnectPtr conn,
                     goto error;
                 }
                 if (disk->device == VIR_DOMAIN_DISK_DEVICE_FLOPPY)
-                    snprintf(file, PATH_MAX, "fat:floppy:%s", disk->src);
+                    fmt = "fat:floppy:%s";
                 else
-                    snprintf(file, PATH_MAX, "fat:%s", disk->src);
+                    fmt = "fat:%s";
+
+                if (virAsprintf(&file, fmt, disk->src) < 0) {
+                    goto no_memory;
+                }
             } else if (disk->type == VIR_DOMAIN_DISK_TYPE_NETWORK) {
                 switch (disk->protocol) {
                 case VIR_DOMAIN_DISK_PROTOCOL_NBD:
@@ -3379,11 +3384,15 @@ qemuBuildCommandLine(virConnectPtr conn,
                                         _("NBD accepts only one host"));
                         goto error;
                     }
-                    snprintf(file, PATH_MAX, "nbd:%s:%s,",
-                             disk->hosts->name, disk->hosts->port);
+                    if (virAsprintf(&file, "nbd:%s:%s,", disk->hosts->name,
+                                    disk->hosts->port) < 0) {
+                        goto no_memory;
+                    }
                     break;
                 case VIR_DOMAIN_DISK_PROTOCOL_RBD:
-                    snprintf(file, PATH_MAX, "rbd:%s,", disk->src);
+                    if (virAsprintf(&file, "rbd:%s,", disk->src) < 0) {
+                        goto no_memory;
+                    }
                     for (j = 0 ; j < disk->nhosts ; j++) {
                         if (!has_rbd_hosts) {
                             virBufferAddLit(&rbd_hosts, "CEPH_ARGS=-m ");
@@ -3403,20 +3412,28 @@ qemuBuildCommandLine(virConnectPtr conn,
                     }
                     break;
                 case VIR_DOMAIN_DISK_PROTOCOL_SHEEPDOG:
-                    if (disk->nhosts == 0)
-                        snprintf(file, PATH_MAX, "sheepdog:%s,", disk->src);
-                    else
+                    if (disk->nhosts == 0) {
+                        if (virAsprintf(&file, "sheepdog:%s,", disk->src) < 0) {
+                            goto no_memory;
+                        }
+                    } else {
                         /* only one host is supported now */
-                        snprintf(file, PATH_MAX, "sheepdog:%s:%s:%s,",
-                                 disk->hosts->name, disk->hosts->port,
-                                 disk->src);
+                        if (virAsprintf(&file, "sheepdog:%s:%s:%s,",
+                                        disk->hosts->name, disk->hosts->port,
+                                        disk->src) < 0) {
+                            goto no_memory;
+                        }
+                    }
                     break;
                 }
             } else {
-                snprintf(file, PATH_MAX, "%s", disk->src);
+                if (!(file = strdup(disk->src))) {
+                    goto no_memory;
+                }
             }
 
             virCommandAddArgList(cmd, dev, file, NULL);
+            VIR_FREE(file);
         }
     }
 
-- 
1.7.0.4




More information about the libvir-list mailing list