From e0d014f2379ddde175c0c3126273911221c3e645 Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Tue, 15 Mar 2011 16:58:28 +0000 Subject: [PATCH] Ensure binary is resolved wrt $PATH in virExec virExec would only resolved the binary to $PATH if no env variables were being set. Since there is no execvep() API in POSIX, we use virFindFileInPath to manually resolve the binary and then use execv() instead of execvp(). --- src/util/util.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/util/util.c b/src/util/util.c index e573f4adf9..5b5dd5e208 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -475,6 +475,18 @@ __virExec(const char *const*argv, int childout = -1; int childerr = -1; int tmpfd; + const char *binary = NULL; + + if (argv[0][0] != '/') { + if (!(binary = virFindFileInPath(argv[0]))) { + virReportSystemError(ENOENT, + _("Cannot find '%s' in path"), + argv[0]); + return -1; + } + } else { + binary = argv[0]; + } if ((null = open("/dev/null", O_RDWR)) < 0) { virReportSystemError(errno, @@ -694,9 +706,9 @@ __virExec(const char *const*argv, virLogReset(); if (envp) - execve(argv[0], (char **) argv, (char**)envp); + execve(binary, (char **) argv, (char**)envp); else - execvp(argv[0], (char **) argv); + execv(binary, (char **) argv); virReportSystemError(errno, _("cannot execute binary %s"), @@ -710,6 +722,9 @@ __virExec(const char *const*argv, /* This is cleanup of parent process only - child should never jump here on error */ + if (binary != argv[0]) + VIR_FREE(binary); + /* NB we don't virUtilError() on any failures here because the code which jumped hre already raised an error condition which we must not overwrite */