diff options
Diffstat (limited to 'src/firejail/fs_bin.c')
-rw-r--r-- | src/firejail/fs_bin.c | 21 |
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 | ||
151 | static void duplicate(char *fname) { | 151 | static 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 | } |