From a3d909888d4e3ca8c79920184b252334dc398f00 Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Wed, 14 Nov 2007 16:29:08 +0000 Subject: [PATCH] Handle failed strdup and malloc. * src/remote_internal.c: Don't dereference NULL after failed strdup or malloc in doRemoteOpen. --- ChangeLog | 6 ++++++ src/remote_internal.c | 22 ++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/ChangeLog b/ChangeLog index e2301b14cd..64b5a1e09f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Wed Nov 14 17:28:31 CET 2007 Jim Meyering + + 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 * src/stats_linux.c, src/stats_linux.h, src_xen_internal.c: diff --git a/src/remote_internal.c b/src/remote_internal.c index 0aad72df2e..0b506781f4 100644 --- a/src/remote_internal.c +++ b/src/remote_internal.c @@ -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; }