In data martedì 23 giugno 2015 14:34:18, Richard W.M. Jones ha scritto:
---
daemon/guestfsd.c | 37 +++++++++++++++++++++++--------------
1 file changed, 23 insertions(+), 14 deletions(-)
diff --git a/daemon/guestfsd.c b/daemon/guestfsd.c
index 21b3600..c9cc8c5 100644
--- a/daemon/guestfsd.c
+++ b/daemon/guestfsd.c
@@ -243,9 +243,6 @@ main (int argc, char *argv[])
/* Set up a basic environment. After we are called by /init the
* environment is essentially empty.
*
https://bugzilla.redhat.com/show_bug.cgi?id=502074#c5
- *
- * NOTE: if you change $PATH, you must also change 'prog_exists'
- * function below.
*/
setenv ("PATH", "/sbin:/usr/sbin:/bin:/usr/bin", 1);
setenv ("SHELL", "/bin/sh", 1);
@@ -1440,22 +1437,34 @@ mountable_to_string (const mountable_t *mountable)
}
}
-/* Check program exists and is executable on $PATH. Actually, we
- * just assume PATH contains the default entries (see main() above).
- */
+/* Check program exists and is executable on $PATH. */
int
prog_exists (const char *prog)
{
- static const char * const dirs[] =
- { "/sbin", "/usr/sbin", "/bin", "/usr/bin"
};
- size_t i;
- char buf[1024];
-
- for (i = 0; i < sizeof dirs / sizeof dirs[0]; ++i) {
- snprintf (buf, sizeof buf, "%s/%s", dirs[i], prog);
- if (access (buf, X_OK) == 0)
+ const char *pathc = getenv ("PATH");
+
+ if (!pathc)
+ return 0;
+
+ const char *elem;
+ char *saveptr;
+ size_t len = strlen (pathc) + 1;
+ char path[len];
+ strcpy (path, pathc);
+
+ elem = strtok_r (path, ":", &saveptr);
+ while (elem) {
+ size_t n = strlen (elem) + strlen (prog) + 2;
+ char testprog[n];
+
+ snprintf (testprog, n, "%s/%s", elem, prog);
+ if (access (testprog, X_OK) == 0)
return 1;
+
+ elem = strtok_r (NULL, ":", &saveptr);
}
+
+ /* Not found. */
return 0;
}
LGTM.
The only minor note, "strlen (prog)" could be cached outside the while
loop.
--
Pino Toscano