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 | 16 ++++++++++++++--
1 files changed, 14 insertions(+), 2 deletions(-)
diff --git a/src/util/util.c b/src/util/util.c
index e573f4a..a30a542 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"),
--
1.7.4