[libvirt] [PATCH] Ensure binary is resolved wrt $PATH in virExec

Daniel P. Berrange berrange at redhat.com
Tue Mar 15 17:14:13 UTC 2011


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




More information about the libvir-list mailing list