diff options
author | netblue30 <netblue30@yahoo.com> | 2016-03-20 09:46:19 -0400 |
---|---|---|
committer | netblue30 <netblue30@yahoo.com> | 2016-03-20 09:46:19 -0400 |
commit | 3ed1a151548c260414f274ae66e7d5a8cfd7a8a4 (patch) | |
tree | ac9373835bde6a7b1ccd8ccc450cc0ae7f288958 | |
parent | fixed problem with .asoundrc symbolic link (diff) | |
download | firejail-3ed1a151548c260414f274ae66e7d5a8cfd7a8a4.tar.gz firejail-3ed1a151548c260414f274ae66e7d5a8cfd7a8a4.tar.zst firejail-3ed1a151548c260414f274ae66e7d5a8cfd7a8a4.zip |
fixed symlinks for private-bin
-rw-r--r-- | src/firejail/fs_bin.c | 32 |
1 files changed, 23 insertions, 9 deletions
diff --git a/src/firejail/fs_bin.c b/src/firejail/fs_bin.c index 2ee7f7504..d218f2852 100644 --- a/src/firejail/fs_bin.c +++ b/src/firejail/fs_bin.c | |||
@@ -129,7 +129,7 @@ static void duplicate(char *fname) { | |||
129 | char *path = check_dir_or_file(fname); | 129 | char *path = check_dir_or_file(fname); |
130 | if (!path) | 130 | if (!path) |
131 | return; | 131 | return; |
132 | 132 | ||
133 | // expand path, just in case this is a symbolic link | 133 | // expand path, just in case this is a symbolic link |
134 | char *full_path; | 134 | char *full_path; |
135 | if (asprintf(&full_path, "%s/%s", path, fname) == -1) | 135 | if (asprintf(&full_path, "%s/%s", path, fname) == -1) |
@@ -137,14 +137,28 @@ static void duplicate(char *fname) { | |||
137 | 137 | ||
138 | char *actual_path = realpath(full_path, NULL); | 138 | char *actual_path = realpath(full_path, NULL); |
139 | if (actual_path) { | 139 | if (actual_path) { |
140 | // copy the file | 140 | // if the file is a symbolic link not under path, make a symbolic link |
141 | if (asprintf(&cmd, "%s -a %s %s/%s", RUN_CP_COMMAND, actual_path, RUN_BIN_DIR, fname) == -1) | 141 | if (is_link(full_path) && strncmp(actual_path, path, strlen(path))) { |
142 | errExit("asprintf"); | 142 | char *lnkname; |
143 | if (arg_debug) | 143 | if (asprintf(&lnkname, "%s/%s", RUN_BIN_DIR, fname) == -1) |
144 | printf("%s\n", cmd); | 144 | errExit("asprintf"); |
145 | if (system(cmd)) | 145 | int rv = symlink(actual_path, lnkname); |
146 | errExit("system cp -a"); | 146 | if (rv) |
147 | free(cmd); | 147 | fprintf(stderr, "Warning cannot create symbolic link %s\n", lnkname); |
148 | else if (arg_debug) | ||
149 | printf("Created symbolic link %s -> %s\n", lnkname, actual_path); | ||
150 | free(lnkname); | ||
151 | } | ||
152 | else { | ||
153 | // copy the file | ||
154 | if (asprintf(&cmd, "%s -a %s %s/%s", RUN_CP_COMMAND, actual_path, RUN_BIN_DIR, fname) == -1) | ||
155 | errExit("asprintf"); | ||
156 | if (arg_debug) | ||
157 | printf("%s\n", cmd); | ||
158 | if (system(cmd)) | ||
159 | errExit("system cp -a"); | ||
160 | free(cmd); | ||
161 | } | ||
148 | free(actual_path); | 162 | free(actual_path); |
149 | } | 163 | } |
150 | 164 | ||