From: Daniel P. Berrange Date: Tue, 15 Mar 2011 16:58:28 +0000 (+0000) Subject: Ensure binary is resolved wrt $PATH in virExec X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=e0d014f2379dd;p=libvirt.git 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(). --- 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 */