diff options
author | smitsohu <smitsohu@gmail.com> | 2020-01-22 01:40:38 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-01-22 01:40:38 +0100 |
commit | 9008896047e922ddc146d203138877ebf49b5291 (patch) | |
tree | 19d390d87e14cd0891cb8d997dbff2ff086cd703 /src | |
parent | reject control characters in file names (diff) | |
download | firejail-9008896047e922ddc146d203138877ebf49b5291.tar.gz firejail-9008896047e922ddc146d203138877ebf49b5291.tar.zst firejail-9008896047e922ddc146d203138877ebf49b5291.zip |
replace control characters and print rejected filenames
Diffstat (limited to 'src')
-rw-r--r-- | src/firejail/macros.c | 32 |
1 files changed, 28 insertions, 4 deletions
diff --git a/src/firejail/macros.c b/src/firejail/macros.c index ccd201956..3dbc910a4 100644 --- a/src/firejail/macros.c +++ b/src/firejail/macros.c | |||
@@ -258,6 +258,28 @@ char *expand_macros(const char *path) { | |||
258 | return rv; | 258 | return rv; |
259 | } | 259 | } |
260 | 260 | ||
261 | // replace control characters with a '?' | ||
262 | static char *fix_control_chars(const char *fname) { | ||
263 | assert(fname); | ||
264 | |||
265 | size_t len = strlen(fname); | ||
266 | char *rv = malloc(len + 1); | ||
267 | if (!rv) | ||
268 | errExit("malloc"); | ||
269 | |||
270 | size_t i = 0; | ||
271 | while (fname[i] != '\0') { | ||
272 | if (iscntrl((unsigned char) fname[i])) | ||
273 | rv[i] = '?'; | ||
274 | else | ||
275 | rv[i] = fname[i]; | ||
276 | i++; | ||
277 | } | ||
278 | rv[i] = '\0'; | ||
279 | |||
280 | return rv; | ||
281 | } | ||
282 | |||
261 | void invalid_filename(const char *fname, int globbing) { | 283 | void invalid_filename(const char *fname, int globbing) { |
262 | // EUID_ASSERT(); | 284 | // EUID_ASSERT(); |
263 | assert(fname); | 285 | assert(fname); |
@@ -275,12 +297,14 @@ void invalid_filename(const char *fname, int globbing) { | |||
275 | return; | 297 | return; |
276 | } | 298 | } |
277 | 299 | ||
278 | size_t i; | 300 | size_t i = 0; |
279 | for (i = 0; ptr[i]; i++) { | 301 | while (ptr[i] != '\0') { |
280 | if (iscntrl((unsigned char) ptr[i])) { | 302 | if (iscntrl((unsigned char) ptr[i])) { |
281 | fprintf(stderr, "Error: invalid filename: contains a control character\n"); | 303 | fprintf(stderr, "Error: \"%s\" is an invalid filename: no control characters allowed\n", |
304 | fix_control_chars(fname)); | ||
282 | exit(1); | 305 | exit(1); |
283 | } | 306 | } |
307 | i++; | ||
284 | } | 308 | } |
285 | 309 | ||
286 | char *reject; | 310 | char *reject; |
@@ -290,7 +314,7 @@ void invalid_filename(const char *fname, int globbing) { | |||
290 | reject = "\\&!?\"'<>%^(){};,*[]"; | 314 | reject = "\\&!?\"'<>%^(){};,*[]"; |
291 | char *c = strpbrk(ptr, reject); | 315 | char *c = strpbrk(ptr, reject); |
292 | if (c) { | 316 | if (c) { |
293 | fprintf(stderr, "Error: \"%s\" is an invalid filename: rejected character: \"%c\"\n", ptr, *c); | 317 | fprintf(stderr, "Error: \"%s\" is an invalid filename: rejected character: \"%c\"\n", fname, *c); |
294 | exit(1); | 318 | exit(1); |
295 | } | 319 | } |
296 | } | 320 | } |