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().
This commit is contained in:
Daniel P. Berrange 2011-03-15 16:58:28 +00:00
parent 2b84e445d5
commit e0d014f237

View File

@ -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 */