
On 03/15/2011 11:14 AM, Daniel P. Berrange wrote:
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().
It might be worth a gnulib module for execvpe (of course, such a module would fail with ENOSYS on mingw, so we'd still have to have a WIN32-specific fallback for virExec). But that can be another day.
+++ 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"),
Memory leak in the parent, and in the child on failure to exec. (The child leak is less important - it's about to _exit anyways). You need this in at least the parent some point after the fork: if (binary != argv[0]) VIR_FREE(binary); ACK with that nit fixed. -- Eric Blake eblake@redhat.com +1-801-349-2682 Libvirt virtualization library http://libvirt.org