[libvirt] [PATCH 2/2] Protect against NULL pointer flaws in monitor usage

Daniel P. Berrange berrange at redhat.com
Mon May 17 11:53:08 UTC 2010


History has shown that there are frequent bugs in the QEMU driver
code leading to the monitor being invoked with a NULL pointer.
Although the QEMU driver code should always report an error in
this case before invoking the monitor, as a safety net put in a
generic check in the monitor code entry points.

* src/qemu/qemu_monitor.c: Safety net to check for NULL monitor
  object
---
 src/qemu/qemu_monitor.c |  409 +++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 346 insertions(+), 63 deletions(-)

diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
index 2ce3d56..ec22c20 100644
--- a/src/qemu/qemu_monitor.c
+++ b/src/qemu/qemu_monitor.c
@@ -894,7 +894,13 @@ int qemuMonitorEmitGraphics(qemuMonitorPtr mon,
 int qemuMonitorSetCapabilities(qemuMonitorPtr mon)
 {
     int ret;
-    DEBUG("mon=%p, fd=%d", mon, mon->fd);
+    DEBUG("mon=%p", mon);
+
+    if (!mon) {
+        qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+                        _("monitor must not be NULL"));
+        return -1;
+    }
 
     if (mon->json)
         ret = qemuMonitorJSONSetCapabilities(mon);
@@ -909,7 +915,13 @@ qemuMonitorStartCPUs(qemuMonitorPtr mon,
                      virConnectPtr conn)
 {
     int ret;
-    DEBUG("mon=%p, fd=%d", mon, mon->fd);
+    DEBUG("mon=%p", mon);
+
+    if (!mon) {
+        qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+                        _("monitor must not be NULL"));
+        return -1;
+    }
 
     if (mon->json)
         ret = qemuMonitorJSONStartCPUs(mon, conn);
@@ -923,7 +935,13 @@ int
 qemuMonitorStopCPUs(qemuMonitorPtr mon)
 {
     int ret;
-    DEBUG("mon=%p, fd=%d", mon, mon->fd);
+    DEBUG("mon=%p", mon);
+
+    if (!mon) {
+        qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+                        _("monitor must not be NULL"));
+        return -1;
+    }
 
     if (mon->json)
         ret = qemuMonitorJSONStopCPUs(mon);
@@ -936,7 +954,13 @@ qemuMonitorStopCPUs(qemuMonitorPtr mon)
 int qemuMonitorSystemPowerdown(qemuMonitorPtr mon)
 {
     int ret;
-    DEBUG("mon=%p, fd=%d", mon, mon->fd);
+    DEBUG("mon=%p", mon);
+
+    if (!mon) {
+        qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+                        _("monitor must not be NULL"));
+        return -1;
+    }
 
     if (mon->json)
         ret = qemuMonitorJSONSystemPowerdown(mon);
@@ -950,7 +974,13 @@ int qemuMonitorGetCPUInfo(qemuMonitorPtr mon,
                           int **pids)
 {
     int ret;
-    DEBUG("mon=%p, fd=%d", mon, mon->fd);
+    DEBUG("mon=%p", mon);
+
+    if (!mon) {
+        qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+                        _("monitor must not be NULL"));
+        return -1;
+    }
 
     if (mon->json)
         ret = qemuMonitorJSONGetCPUInfo(mon, pids);
@@ -963,7 +993,13 @@ int qemuMonitorGetBalloonInfo(qemuMonitorPtr mon,
                               unsigned long *currmem)
 {
     int ret;
-    DEBUG("mon=%p, fd=%d", mon, mon->fd);
+    DEBUG("mon=%p", mon);
+
+    if (!mon) {
+        qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+                        _("monitor must not be NULL"));
+        return -1;
+    }
 
     if (mon->json)
         ret = qemuMonitorJSONGetBalloonInfo(mon, currmem);
@@ -978,7 +1014,13 @@ int qemuMonitorGetMemoryStats(qemuMonitorPtr mon,
                               unsigned int nr_stats)
 {
     int ret;
-    DEBUG("mon=%p, fd=%d stats=%p nstats=%u", mon, mon->fd, stats, nr_stats);
+    DEBUG("mon=%p stats=%p nstats=%u", mon, stats, nr_stats);
+
+    if (!mon) {
+        qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+                        _("monitor must not be NULL"));
+        return -1;
+    }
 
     if (mon->json)
         ret = qemuMonitorJSONGetMemoryStats(mon, stats, nr_stats);
@@ -997,7 +1039,13 @@ int qemuMonitorGetBlockStatsInfo(qemuMonitorPtr mon,
                                  long long *errs)
 {
     int ret;
-    DEBUG("mon=%p, fd=%d dev=%s", mon, mon->fd, devname);
+    DEBUG("mon=%p dev=%s", mon, devname);
+
+    if (!mon) {
+        qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+                        _("monitor must not be NULL"));
+        return -1;
+    }
 
     if (mon->json)
         ret = qemuMonitorJSONGetBlockStatsInfo(mon, devname,
@@ -1017,7 +1065,14 @@ int qemuMonitorSetVNCPassword(qemuMonitorPtr mon,
                               const char *password)
 {
     int ret;
-    DEBUG("mon=%p, fd=%d", mon, mon->fd);
+    DEBUG("mon=%p, password=%p",
+          mon, password);
+
+    if (!mon) {
+        qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+                        _("monitor must not be NULL"));
+        return -1;
+    }
 
     if (!password)
         password = "";
@@ -1034,7 +1089,13 @@ int qemuMonitorSetBalloon(qemuMonitorPtr mon,
                           unsigned long newmem)
 {
     int ret;
-    DEBUG("mon=%p, fd=%d newmem=%lu", mon, mon->fd, newmem);
+    DEBUG("mon=%p newmem=%lu", mon, newmem);
+
+    if (!mon) {
+        qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+                        _("monitor must not be NULL"));
+        return -1;
+    }
 
     if (mon->json)
         ret = qemuMonitorJSONSetBalloon(mon, newmem);
@@ -1047,7 +1108,13 @@ int qemuMonitorSetBalloon(qemuMonitorPtr mon,
 int qemuMonitorSetCPU(qemuMonitorPtr mon, int cpu, int online)
 {
     int ret;
-    DEBUG("mon=%p, fd=%d cpu=%d online=%d", mon, mon->fd, cpu, online);
+    DEBUG("mon=%p cpu=%d online=%d", mon, cpu, online);
+
+    if (!mon) {
+        qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+                        _("monitor must not be NULL"));
+        return -1;
+    }
 
     if (mon->json)
         ret = qemuMonitorJSONSetCPU(mon, cpu, online);
@@ -1061,7 +1128,13 @@ int qemuMonitorEjectMedia(qemuMonitorPtr mon,
                           const char *devname)
 {
     int ret;
-    DEBUG("mon=%p, fd=%d devname=%s", mon, mon->fd, devname);
+    DEBUG("mon=%p devname=%s", mon, devname);
+
+    if (!mon) {
+        qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+                        _("monitor must not be NULL"));
+        return -1;
+    }
 
     if (mon->json)
         ret = qemuMonitorJSONEjectMedia(mon, devname);
@@ -1077,8 +1150,14 @@ int qemuMonitorChangeMedia(qemuMonitorPtr mon,
                            const char *format)
 {
     int ret;
-    DEBUG("mon=%p, fd=%d devname=%s newmedia=%s format=%s",
-          mon, mon->fd, devname, newmedia, format);
+    DEBUG("mon=%p devname=%s newmedia=%s format=%s",
+          mon, devname, newmedia, format);
+
+    if (!mon) {
+        qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+                        _("monitor must not be NULL"));
+        return -1;
+    }
 
     if (mon->json)
         ret = qemuMonitorJSONChangeMedia(mon, devname, newmedia, format);
@@ -1094,8 +1173,14 @@ int qemuMonitorSaveVirtualMemory(qemuMonitorPtr mon,
                                  const char *path)
 {
     int ret;
-    DEBUG("mon=%p, fd=%d offset=%llu length=%zu path=%s",
-          mon, mon->fd, offset, length, path);
+    DEBUG("mon=%p offset=%llu length=%zu path=%s",
+          mon, offset, length, path);
+
+    if (!mon) {
+        qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+                        _("monitor must not be NULL"));
+        return -1;
+    }
 
     if (mon->json)
         ret = qemuMonitorJSONSaveVirtualMemory(mon, offset, length, path);
@@ -1110,8 +1195,14 @@ int qemuMonitorSavePhysicalMemory(qemuMonitorPtr mon,
                                   const char *path)
 {
     int ret;
-    DEBUG("mon=%p, fd=%d offset=%llu length=%zu path=%s",
-          mon, mon->fd, offset, length, path);
+    DEBUG("mon=%p offset=%llu length=%zu path=%s",
+          mon, offset, length, path);
+
+    if (!mon) {
+        qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+                        _("monitor must not be NULL"));
+        return -1;
+    }
 
     if (mon->json)
         ret = qemuMonitorJSONSavePhysicalMemory(mon, offset, length, path);
@@ -1125,7 +1216,13 @@ int qemuMonitorSetMigrationSpeed(qemuMonitorPtr mon,
                                  unsigned long bandwidth)
 {
     int ret;
-    DEBUG("mon=%p, fd=%d bandwidth=%lu", mon, mon->fd, bandwidth);
+    DEBUG("mon=%p bandwidth=%lu", mon, bandwidth);
+
+    if (!mon) {
+        qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+                        _("monitor must not be NULL"));
+        return -1;
+    }
 
     if (mon->json)
         ret = qemuMonitorJSONSetMigrationSpeed(mon, bandwidth);
@@ -1139,7 +1236,13 @@ int qemuMonitorSetMigrationDowntime(qemuMonitorPtr mon,
                                     unsigned long long downtime)
 {
     int ret;
-    DEBUG("mon=%p, fd=%d downtime=%llu", mon, mon->fd, downtime);
+    DEBUG("mon=%p downtime=%llu", mon, downtime);
+
+    if (!mon) {
+        qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+                        _("monitor must not be NULL"));
+        return -1;
+    }
 
     if (mon->json)
         ret = qemuMonitorJSONSetMigrationDowntime(mon, downtime);
@@ -1156,7 +1259,13 @@ int qemuMonitorGetMigrationStatus(qemuMonitorPtr mon,
                                   unsigned long long *total)
 {
     int ret;
-    DEBUG("mon=%p, fd=%d", mon, mon->fd);
+    DEBUG("mon=%p", mon);
+
+    if (!mon) {
+        qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+                        _("monitor must not be NULL"));
+        return -1;
+    }
 
     if (mon->json)
         ret = qemuMonitorJSONGetMigrationStatus(mon, status,
@@ -1178,8 +1287,14 @@ int qemuMonitorMigrateToHost(qemuMonitorPtr mon,
                              int port)
 {
     int ret;
-    DEBUG("mon=%p, fd=%d hostname=%s port=%d",
-          mon, mon->fd, hostname, port);
+    DEBUG("mon=%p hostname=%s port=%d",
+          mon, hostname, port);
+
+    if (!mon) {
+        qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+                        _("monitor must not be NULL"));
+        return -1;
+    }
 
     if (mon->json)
         ret = qemuMonitorJSONMigrateToHost(mon, background, hostname, port);
@@ -1194,8 +1309,14 @@ int qemuMonitorMigrateToCommand(qemuMonitorPtr mon,
                                 const char * const *argv)
 {
     int ret;
-    DEBUG("mon=%p, fd=%d argv=%p",
-          mon, mon->fd, argv);
+    DEBUG("mon=%p argv=%p",
+          mon, argv);
+
+    if (!mon) {
+        qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+                        _("monitor must not be NULL"));
+        return -1;
+    }
 
     if (mon->json)
         ret = qemuMonitorJSONMigrateToCommand(mon, background, argv);
@@ -1211,8 +1332,14 @@ int qemuMonitorMigrateToFile(qemuMonitorPtr mon,
                              unsigned long long offset)
 {
     int ret;
-    DEBUG("mon=%p, fd=%d argv=%p target=%s offset=%llu",
-          mon, mon->fd, argv, target, offset);
+    DEBUG("mon=%p argv=%p target=%s offset=%llu",
+          mon, argv, target, offset);
+
+    if (!mon) {
+        qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+                        _("monitor must not be NULL"));
+        return -1;
+    }
 
     if (offset % QEMU_MONITOR_MIGRATE_TO_FILE_BS) {
         qemuReportError(VIR_ERR_INTERNAL_ERROR,
@@ -1233,8 +1360,14 @@ int qemuMonitorMigrateToUnix(qemuMonitorPtr mon,
                              const char *unixfile)
 {
     int ret;
-    DEBUG("mon=%p fd=%d unixfile=%s",
-          mon, mon->fd, unixfile);
+    DEBUG("mon=%p, unixfile=%s",
+          mon, unixfile);
+
+    if (!mon) {
+        qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+                        _("monitor must not be NULL"));
+        return -1;
+    }
 
     if (mon->json)
         ret = qemuMonitorJSONMigrateToUnix(mon, background, unixfile);
@@ -1246,7 +1379,13 @@ int qemuMonitorMigrateToUnix(qemuMonitorPtr mon,
 int qemuMonitorMigrateCancel(qemuMonitorPtr mon)
 {
     int ret;
-    DEBUG("mon=%p fd=%d", mon, mon->fd);
+    DEBUG("mon=%p", mon);
+
+    if (!mon) {
+        qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+                        _("monitor must not be NULL"));
+        return -1;
+    }
 
     if (mon->json)
         ret = qemuMonitorJSONMigrateCancel(mon);
@@ -1259,7 +1398,13 @@ int qemuMonitorAddUSBDisk(qemuMonitorPtr mon,
                           const char *path)
 {
     int ret;
-    DEBUG("mon=%p, fd=%d path=%s", mon, mon->fd, path);
+    DEBUG("mon=%p path=%s", mon, path);
+
+    if (!mon) {
+        qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+                        _("monitor must not be NULL"));
+        return -1;
+    }
 
     if (mon->json)
         ret = qemuMonitorJSONAddUSBDisk(mon, path);
@@ -1274,7 +1419,13 @@ int qemuMonitorAddUSBDeviceExact(qemuMonitorPtr mon,
                                  int dev)
 {
     int ret;
-    DEBUG("mon=%p, fd=%d bus=%d dev=%d", mon, mon->fd, bus, dev);
+    DEBUG("mon=%p bus=%d dev=%d", mon, bus, dev);
+
+    if (!mon) {
+        qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+                        _("monitor must not be NULL"));
+        return -1;
+    }
 
     if (mon->json)
         ret = qemuMonitorJSONAddUSBDeviceExact(mon, bus, dev);
@@ -1288,8 +1439,14 @@ int qemuMonitorAddUSBDeviceMatch(qemuMonitorPtr mon,
                                  int product)
 {
     int ret;
-    DEBUG("mon=%p, fd=%d vendor=%d product=%d",
-          mon, mon->fd, vendor, product);
+    DEBUG("mon=%p vendor=%d product=%d",
+          mon, vendor, product);
+
+    if (!mon) {
+        qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+                        _("monitor must not be NULL"));
+        return -1;
+    }
 
     if (mon->json)
         ret = qemuMonitorJSONAddUSBDeviceMatch(mon, vendor, product);
@@ -1304,10 +1461,16 @@ int qemuMonitorAddPCIHostDevice(qemuMonitorPtr mon,
                                 virDomainDevicePCIAddress *guestAddr)
 {
     int ret;
-    DEBUG("mon=%p, fd=%d domain=%d bus=%d slot=%d function=%d",
-          mon, mon->fd,
+    DEBUG("mon=%p domain=%d bus=%d slot=%d function=%d",
+          mon,
           hostAddr->domain, hostAddr->bus, hostAddr->slot, hostAddr->function);
 
+    if (!mon) {
+        qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+                        _("monitor must not be NULL"));
+        return -1;
+    }
+
     if (mon->json)
         ret = qemuMonitorJSONAddPCIHostDevice(mon, hostAddr, guestAddr);
     else
@@ -1322,8 +1485,14 @@ int qemuMonitorAddPCIDisk(qemuMonitorPtr mon,
                           virDomainDevicePCIAddress *guestAddr)
 {
     int ret;
-    DEBUG("mon=%p, fd=%d path=%s bus=%s",
-          mon, mon->fd, path, bus);
+    DEBUG("mon=%p path=%s bus=%s",
+          mon, path, bus);
+
+    if (!mon) {
+        qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+                        _("monitor must not be NULL"));
+        return -1;
+    }
 
     if (mon->json)
         ret = qemuMonitorJSONAddPCIDisk(mon, path, bus, guestAddr);
@@ -1338,7 +1507,13 @@ int qemuMonitorAddPCINetwork(qemuMonitorPtr mon,
                              virDomainDevicePCIAddress *guestAddr)
 {
     int ret;
-    DEBUG("mon=%p, fd=%d nicstr=%s", mon, mon->fd, nicstr);
+    DEBUG("mon=%p nicstr=%s", mon, nicstr);
+
+    if (!mon) {
+        qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+                        _("monitor must not be NULL"));
+        return -1;
+    }
 
     if (mon->json)
         ret = qemuMonitorJSONAddPCINetwork(mon, nicstr, guestAddr);
@@ -1352,10 +1527,16 @@ int qemuMonitorRemovePCIDevice(qemuMonitorPtr mon,
                                virDomainDevicePCIAddress *guestAddr)
 {
     int ret;
-    DEBUG("mon=%p, fd=%d domain=%d bus=%d slot=%d function=%d",
-          mon, mon->fd, guestAddr->domain, guestAddr->bus,
+    DEBUG("mon=%p domain=%d bus=%d slot=%d function=%d",
+          mon, guestAddr->domain, guestAddr->bus,
           guestAddr->slot, guestAddr->function);
 
+    if (!mon) {
+        qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+                        _("monitor must not be NULL"));
+        return -1;
+    }
+
     if (mon->json)
         ret = qemuMonitorJSONRemovePCIDevice(mon, guestAddr);
     else
@@ -1369,8 +1550,14 @@ int qemuMonitorSendFileHandle(qemuMonitorPtr mon,
                               int fd)
 {
     int ret;
-    DEBUG("mon=%p, fd=%d fdname=%s fd=%d",
-          mon, mon->fd, fdname, fd);
+    DEBUG("mon=%p, fdname=%s fd=%d",
+          mon, fdname, fd);
+
+    if (!mon) {
+        qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+                        _("monitor must not be NULL"));
+        return -1;
+    }
 
     if (mon->json)
         ret = qemuMonitorJSONSendFileHandle(mon, fdname, fd);
@@ -1384,8 +1571,14 @@ int qemuMonitorCloseFileHandle(qemuMonitorPtr mon,
                                const char *fdname)
 {
     int ret;
-    DEBUG("mon=%p, fd=%d fdname=%s",
-          mon, mon->fd, fdname);
+    DEBUG("mon=%p fdname=%s",
+          mon, fdname);
+
+    if (!mon) {
+        qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+                        _("monitor must not be NULL"));
+        return -1;
+    }
 
     if (mon->json)
         ret = qemuMonitorJSONCloseFileHandle(mon, fdname);
@@ -1399,8 +1592,14 @@ int qemuMonitorAddHostNetwork(qemuMonitorPtr mon,
                               const char *netstr)
 {
     int ret;
-    DEBUG("mon=%p, fd=%d netstr=%s",
-          mon, mon->fd, netstr);
+    DEBUG("mon=%p netstr=%s",
+          mon, netstr);
+
+    if (!mon) {
+        qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+                        _("monitor must not be NULL"));
+        return -1;
+    }
 
     if (mon->json)
         ret = qemuMonitorJSONAddHostNetwork(mon, netstr);
@@ -1415,8 +1614,14 @@ int qemuMonitorRemoveHostNetwork(qemuMonitorPtr mon,
                                  const char *netname)
 {
     int ret;
-    DEBUG("mon=%p, fd=%d netname=%s",
-          mon, mon->fd, netname);
+    DEBUG("mon=%p netname=%s",
+          mon, netname);
+
+    if (!mon) {
+        qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+                        _("monitor must not be NULL"));
+        return -1;
+    }
 
     if (mon->json)
         ret = qemuMonitorJSONRemoveHostNetwork(mon, vlan, netname);
@@ -1430,8 +1635,14 @@ int qemuMonitorAddNetdev(qemuMonitorPtr mon,
                          const char *netdevstr)
 {
     int ret;
-    DEBUG("mon=%p, fd=%d netdevstr=%s",
-          mon, mon->fd, netdevstr);
+    DEBUG("mon=%p netdevstr=%s",
+          mon, netdevstr);
+
+    if (!mon) {
+        qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+                        _("monitor must not be NULL"));
+        return -1;
+    }
 
     if (mon->json)
         ret = qemuMonitorJSONAddNetdev(mon, netdevstr);
@@ -1445,8 +1656,14 @@ int qemuMonitorRemoveNetdev(qemuMonitorPtr mon,
                             const char *alias)
 {
     int ret;
-    DEBUG("mon=%p, fd=%d alias=%s",
-          mon, mon->fd, alias);
+    DEBUG("mon=%p alias=%s",
+          mon, alias);
+
+    if (!mon) {
+        qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+                        _("monitor must not be NULL"));
+        return -1;
+    }
 
     if (mon->json)
         ret = qemuMonitorJSONRemoveNetdev(mon, alias);
@@ -1460,8 +1677,14 @@ int qemuMonitorGetPtyPaths(qemuMonitorPtr mon,
                            virHashTablePtr paths)
 {
     int ret;
-    DEBUG("mon=%p, fd=%d",
-          mon, mon->fd);
+    DEBUG("mon=%p",
+          mon);
+
+    if (!mon) {
+        qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+                        _("monitor must not be NULL"));
+        return -1;
+    }
 
     if (mon->json)
         ret = qemuMonitorJSONGetPtyPaths(mon, paths);
@@ -1475,9 +1698,15 @@ int qemuMonitorAttachPCIDiskController(qemuMonitorPtr mon,
                                        const char *bus,
                                        virDomainDevicePCIAddress *guestAddr)
 {
-    DEBUG("mon=%p, fd=%d type=%s", mon, mon->fd, bus);
+    DEBUG("mon=%p type=%s", mon, bus);
     int ret;
 
+    if (!mon) {
+        qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+                        _("monitor must not be NULL"));
+        return -1;
+    }
+
     if (mon->json)
         ret = qemuMonitorJSONAttachPCIDiskController(mon, bus, guestAddr);
     else
@@ -1492,12 +1721,18 @@ int qemuMonitorAttachDrive(qemuMonitorPtr mon,
                            virDomainDevicePCIAddress *controllerAddr,
                            virDomainDeviceDriveAddress *driveAddr)
 {
-    DEBUG("mon=%p, fd=%d drivestr=%s domain=%d bus=%d slot=%d function=%d",
-          mon, mon->fd, drivestr,
+    DEBUG("mon=%p drivestr=%s domain=%d bus=%d slot=%d function=%d",
+          mon, drivestr,
           controllerAddr->domain, controllerAddr->bus,
           controllerAddr->slot, controllerAddr->function);
     int ret;
 
+    if (!mon) {
+        qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+                        _("monitor must not be NULL"));
+        return -1;
+    }
+
     if (mon->json)
         ret = qemuMonitorJSONAttachDrive(mon, drivestr, controllerAddr, driveAddr);
     else
@@ -1509,9 +1744,15 @@ int qemuMonitorAttachDrive(qemuMonitorPtr mon,
 int qemuMonitorGetAllPCIAddresses(qemuMonitorPtr mon,
                                   qemuMonitorPCIAddress **addrs)
 {
-    DEBUG("mon=%p, fd=%d addrs=%p", mon, mon->fd, addrs);
+    DEBUG("mon=%p addrs=%p", mon, addrs);
     int ret;
 
+    if (!mon) {
+        qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+                        _("monitor must not be NULL"));
+        return -1;
+    }
+
     if (mon->json)
         ret = qemuMonitorJSONGetAllPCIAddresses(mon, addrs);
     else
@@ -1522,9 +1763,15 @@ int qemuMonitorGetAllPCIAddresses(qemuMonitorPtr mon,
 int qemuMonitorDelDevice(qemuMonitorPtr mon,
                          const char *devalias)
 {
-    DEBUG("mon=%p, fd=%d devalias=%s", mon, mon->fd, devalias);
+    DEBUG("mon=%p devalias=%s", mon, devalias);
     int ret;
 
+    if (!mon) {
+        qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+                        _("monitor must not be NULL"));
+        return -1;
+    }
+
     if (mon->json)
         ret = qemuMonitorJSONDelDevice(mon, devalias);
     else
@@ -1536,9 +1783,15 @@ int qemuMonitorDelDevice(qemuMonitorPtr mon,
 int qemuMonitorAddDevice(qemuMonitorPtr mon,
                          const char *devicestr)
 {
-    DEBUG("mon=%p, fd=%d device=%s", mon, mon->fd, devicestr);
+    DEBUG("mon=%p device=%s", mon, devicestr);
     int ret;
 
+    if (!mon) {
+        qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+                        _("monitor must not be NULL"));
+        return -1;
+    }
+
     if (mon->json)
         ret = qemuMonitorJSONAddDevice(mon, devicestr);
     else
@@ -1549,9 +1802,15 @@ int qemuMonitorAddDevice(qemuMonitorPtr mon,
 int qemuMonitorAddDrive(qemuMonitorPtr mon,
                         const char *drivestr)
 {
-    DEBUG("mon=%p, fd=%d drive=%s", mon, mon->fd, drivestr);
+    DEBUG("mon=%p drive=%s", mon, drivestr);
     int ret;
 
+    if (!mon) {
+        qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+                        _("monitor must not be NULL"));
+        return -1;
+    }
+
     if (mon->json)
         ret = qemuMonitorJSONAddDrive(mon, drivestr);
     else
@@ -1564,9 +1823,15 @@ int qemuMonitorSetDrivePassphrase(qemuMonitorPtr mon,
                                   const char *alias,
                                   const char *passphrase)
 {
-    DEBUG("mon=%p, fd=%d alias=%s passphrase=%p(value hidden)", mon, mon->fd, alias, passphrase);
+    DEBUG("mon=%p alias=%s passphrase=%p(value hidden)", mon, alias, passphrase);
     int ret;
 
+    if (!mon) {
+        qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+                        _("monitor must not be NULL"));
+        return -1;
+    }
+
     if (mon->json)
         ret = qemuMonitorJSONSetDrivePassphrase(mon, alias, passphrase);
     else
@@ -1580,6 +1845,12 @@ int qemuMonitorCreateSnapshot(qemuMonitorPtr mon, const char *name)
 
     DEBUG("mon=%p, name=%s",mon,name);
 
+    if (!mon) {
+        qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+                        _("monitor must not be NULL"));
+        return -1;
+    }
+
     if (mon->json)
         ret = qemuMonitorJSONCreateSnapshot(mon, name);
     else
@@ -1593,6 +1864,12 @@ int qemuMonitorLoadSnapshot(qemuMonitorPtr mon, const char *name)
 
     DEBUG("mon=%p, name=%s",mon,name);
 
+    if (!mon) {
+        qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+                        _("monitor must not be NULL"));
+        return -1;
+    }
+
     if (mon->json)
         ret = qemuMonitorJSONLoadSnapshot(mon, name);
     else
@@ -1606,6 +1883,12 @@ int qemuMonitorDeleteSnapshot(qemuMonitorPtr mon, const char *name)
 
     DEBUG("mon=%p, name=%s",mon,name);
 
+    if (!mon) {
+        qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+                        _("monitor must not be NULL"));
+        return -1;
+    }
+
     if (mon->json)
         ret = qemuMonitorJSONDeleteSnapshot(mon, name);
     else
-- 
1.6.6.1




More information about the libvir-list mailing list