]> xenbits.xensource.com Git - libvirt.git/commitdiff
Handle failed strdup and malloc.
authorJim Meyering <meyering@redhat.com>
Wed, 14 Nov 2007 16:29:08 +0000 (16:29 +0000)
committerJim Meyering <meyering@redhat.com>
Wed, 14 Nov 2007 16:29:08 +0000 (16:29 +0000)
* src/remote_internal.c: Don't dereference NULL after
failed strdup or malloc in doRemoteOpen.

ChangeLog
src/remote_internal.c

index e2301b14cd7129537b126192e356886c678fcb92..64b5a1e09f110a8f758d27a20ed4b8d95f8b8327 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Wed Nov 14 17:28:31 CET 2007 Jim Meyering <meyering@redhat.com>
+
+       Handle failed strdup and malloc.
+       * src/remote_internal.c: Don't dereference NULL after
+       failed strdup or malloc in doRemoteOpen.
+
 Wed Nov 14 11:55:00 UTC 2007 Richard W.M. Jones <rjones@redhat.com>
 
        * src/stats_linux.c, src/stats_linux.h, src_xen_internal.c:
index 0aad72df2e4fde8a849bbb95902152136e3a2df4..0b506781f4648854c761ede2249c0abb3ae30952 100644 (file)
@@ -515,6 +515,10 @@ doRemoteOpen (virConnectPtr conn, struct private_data *priv,
                     sockname = strdup (LIBVIRTD_PRIV_UNIX_SOCKET_RO);
                 else
                     sockname = strdup (LIBVIRTD_PRIV_UNIX_SOCKET);
+                if (sockname == NULL) {
+                    error (NULL, VIR_ERR_SYSTEM_ERROR, strerror (errno));
+                    goto failed;
+                }
             }
         }
 
@@ -569,10 +573,19 @@ doRemoteOpen (virConnectPtr conn, struct private_data *priv,
         if (no_tty) nr_args += 5;   /* For -T -o BatchMode=yes -e none */
 
         command = command ? : strdup ("ssh");
+        if (command == NULL) {
+            error (NULL, VIR_ERR_SYSTEM_ERROR, strerror (errno));
+            goto failed;
+        }
 
         // Generate the final command argv[] array.
         //   ssh -p $port [-l $username] $hostname $netcat -U $sockname [NULL]
         cmd_argv = malloc (nr_args * sizeof (char *));
+        if (cmd_argv == NULL) {
+            error (NULL, VIR_ERR_SYSTEM_ERROR, strerror (errno));
+            goto failed;
+        }
+
         j = 0;
         cmd_argv[j++] = strdup (command);
         cmd_argv[j++] = strdup ("-p");
@@ -594,6 +607,11 @@ doRemoteOpen (virConnectPtr conn, struct private_data *priv,
         cmd_argv[j++] = strdup (sockname ? sockname : LIBVIRTD_PRIV_UNIX_SOCKET);
         cmd_argv[j++] = 0;
         assert (j == nr_args);
+        for (j = 0; j < nr_args; j++)
+            if (cmd_argv[j] == NULL) {
+                error (NULL, VIR_ERR_SYSTEM_ERROR, strerror (ENOMEM));
+                goto failed;
+            }
     }
 
         /*FALLTHROUGH*/
@@ -626,6 +644,10 @@ doRemoteOpen (virConnectPtr conn, struct private_data *priv,
             // Run the external process.
             if (!cmd_argv) {
                 cmd_argv = malloc (2 * sizeof (char *));
+                if (cmd_argv == NULL) {
+                    error (NULL, VIR_ERR_SYSTEM_ERROR, strerror (errno));
+                    goto failed;
+                }
                 cmd_argv[0] = command;
                 cmd_argv[1] = 0;
             }