aboutsummaryrefslogtreecommitdiffstats
path: root/src/firejail/fs_bin.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/firejail/fs_bin.c')
-rw-r--r--src/firejail/fs_bin.c21
1 files changed, 14 insertions, 7 deletions
diff --git a/src/firejail/fs_bin.c b/src/firejail/fs_bin.c
index cc2aa8f4d..6bd407346 100644
--- a/src/firejail/fs_bin.c
+++ b/src/firejail/fs_bin.c
@@ -149,7 +149,6 @@ void fs_check_bin_list(void) {
149} 149}
150 150
151static void duplicate(char *fname) { 151static void duplicate(char *fname) {
152 char *cmd;
153 char *path = check_dir_or_file(fname); 152 char *path = check_dir_or_file(fname);
154 if (!path) 153 if (!path)
155 return; 154 return;
@@ -175,13 +174,21 @@ static void duplicate(char *fname) {
175 } 174 }
176 else { 175 else {
177 // copy the file 176 // copy the file
178 if (asprintf(&cmd, "%s -a %s %s/%s", RUN_CP_COMMAND, actual_path, RUN_BIN_DIR, fname) == -1)
179 errExit("asprintf");
180 if (arg_debug) 177 if (arg_debug)
181 printf("%s\n", cmd); 178 printf("running: %s -a %s %s/%s", RUN_CP_COMMAND, actual_path, RUN_BIN_DIR, fname);
182 if (system(cmd)) 179
183 errExit("system cp -a"); 180 pid_t child = fork();
184 free(cmd); 181 if (child < 0)
182 errExit("fork");
183 if (child == 0) {
184 char *f;
185 if (asprintf(&f, "%s/%s", RUN_BIN_DIR, fname) == -1)
186 errExit("asprintf");
187 execlp(RUN_CP_COMMAND, RUN_CP_COMMAND, "-a", actual_path, f, NULL);
188 }
189 // wait for the child to finish
190 waitpid(child, NULL, 0);
191
185 } 192 }
186 free(actual_path); 193 free(actual_path);
187 } 194 }