From cfc3b83b0b7009528f543253e5250502e8e7610b Mon Sep 17 00:00:00 2001 From: sinkuu Date: Sat, 23 Jan 2016 11:04:42 +0900 Subject: Fix symlink invocation for programs placing symlinks in $PATH --- src/firejail/run_symlink.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/firejail/run_symlink.c b/src/firejail/run_symlink.c index 1157cdab4..bc1bb3011 100644 --- a/src/firejail/run_symlink.c +++ b/src/firejail/run_symlink.c @@ -42,7 +42,11 @@ void run_symlink(int argc, char **argv) { char *path = strdup(p); if (!path) errExit("strdup"); - + + char *selfpath = realpath("/proc/self/exe", NULL); + if (!selfpath) + errExit("realpath"); + // look in path for our program char *tok = strtok(path, ":"); int found = 0; @@ -53,21 +57,30 @@ void run_symlink(int argc, char **argv) { struct stat s; if (stat(name, &s) == 0) { - if (!is_link(name)) { + char* rp = realpath(name, NULL); + if (!rp) + errExit("realpath"); + + if (strcmp(selfpath, rp) != 0) { program = strdup(name); found = 1; + free(rp); break; } + + free(rp); } - + free(name); tok = strtok(NULL, ":"); - } + } if (!found) { fprintf(stderr, "Error: cannot find the program in the path\n"); exit(1); } - + + free(selfpath); + // start the argv[0] program in a new sandbox char *firejail; -- cgit v1.2.3-54-g00ecf