aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar netblue30 <netblue30@yahoo.com>2016-03-20 09:46:19 -0400
committerLibravatar netblue30 <netblue30@yahoo.com>2016-03-20 09:46:19 -0400
commit3ed1a151548c260414f274ae66e7d5a8cfd7a8a4 (patch)
treeac9373835bde6a7b1ccd8ccc450cc0ae7f288958
parentfixed problem with .asoundrc symbolic link (diff)
downloadfirejail-3ed1a151548c260414f274ae66e7d5a8cfd7a8a4.tar.gz
firejail-3ed1a151548c260414f274ae66e7d5a8cfd7a8a4.tar.zst
firejail-3ed1a151548c260414f274ae66e7d5a8cfd7a8a4.zip
fixed symlinks for private-bin
-rw-r--r--src/firejail/fs_bin.c32
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