aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLibravatar smitsohu <smitsohu@gmail.com>2020-01-22 01:40:38 +0100
committerLibravatar GitHub <noreply@github.com>2020-01-22 01:40:38 +0100
commit9008896047e922ddc146d203138877ebf49b5291 (patch)
tree19d390d87e14cd0891cb8d997dbff2ff086cd703 /src
parentreject control characters in file names (diff)
downloadfirejail-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.c32
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 '?'
262static 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
261void invalid_filename(const char *fname, int globbing) { 283void 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}