From 3e9bdd3ca9383a1b6d3495aed0821d4f881eead3 Mon Sep 17 00:00:00 2001 From: smitsohu Date: Fri, 17 Jan 2020 02:42:08 +0100 Subject: print rejected character in invalid filenames --- src/firejail/macros.c | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/src/firejail/macros.c b/src/firejail/macros.c index 9ed6b9715..874180ad1 100644 --- a/src/firejail/macros.c +++ b/src/firejail/macros.c @@ -275,19 +275,15 @@ void invalid_filename(const char *fname, int globbing) { return; } - int len = strlen(ptr); - - if (globbing) { - // file globbing ('*?[]') is allowed - if (strcspn(ptr, "\\&!\"'<>%^(){};,") != (size_t)len) { - fprintf(stderr, "Error: \"%s\" is an invalid filename\n", ptr); - exit(1); - } - } - else { - if (strcspn(ptr, "\\&!?\"'<>%^(){};,*[]") != (size_t)len) { - fprintf(stderr, "Error: \"%s\" is an invalid filename\n", ptr); - exit(1); - } + char *reject; + if (globbing) + reject = "\\&!\"'<>%^(){};,"; // file globbing ('*?[]') is allowed + else + reject = "\\&!?\"'<>%^(){};,*[]"; + + char *c = strpbrk(ptr, reject); + if (c) { + fprintf(stderr, "Error: \"%s\" is an invalid filename: rejected character: \"%c\"\n", ptr, *c); + exit(1); } } -- cgit v1.2.3-54-g00ecf From db16ce56f8b1c559dfac360600ef69d046682ed1 Mon Sep 17 00:00:00 2001 From: smitsohu Date: Fri, 17 Jan 2020 19:10:40 +0100 Subject: reject control characters in file names --- src/firejail/macros.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/firejail/macros.c b/src/firejail/macros.c index 874180ad1..ccd201956 100644 --- a/src/firejail/macros.c +++ b/src/firejail/macros.c @@ -275,12 +275,19 @@ void invalid_filename(const char *fname, int globbing) { return; } + size_t i; + for (i = 0; ptr[i]; i++) { + if (iscntrl((unsigned char) ptr[i])) { + fprintf(stderr, "Error: invalid filename: contains a control character\n"); + exit(1); + } + } + char *reject; if (globbing) reject = "\\&!\"'<>%^(){};,"; // file globbing ('*?[]') is allowed else reject = "\\&!?\"'<>%^(){};,*[]"; - char *c = strpbrk(ptr, reject); if (c) { fprintf(stderr, "Error: \"%s\" is an invalid filename: rejected character: \"%c\"\n", ptr, *c); -- cgit v1.2.3-54-g00ecf From 9008896047e922ddc146d203138877ebf49b5291 Mon Sep 17 00:00:00 2001 From: smitsohu Date: Wed, 22 Jan 2020 01:40:38 +0100 Subject: replace control characters and print rejected filenames --- src/firejail/macros.c | 32 ++++++++++++++++++++++++++++---- 1 file 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) { return rv; } +// replace control characters with a '?' +static char *fix_control_chars(const char *fname) { + assert(fname); + + size_t len = strlen(fname); + char *rv = malloc(len + 1); + if (!rv) + errExit("malloc"); + + size_t i = 0; + while (fname[i] != '\0') { + if (iscntrl((unsigned char) fname[i])) + rv[i] = '?'; + else + rv[i] = fname[i]; + i++; + } + rv[i] = '\0'; + + return rv; +} + void invalid_filename(const char *fname, int globbing) { // EUID_ASSERT(); assert(fname); @@ -275,12 +297,14 @@ void invalid_filename(const char *fname, int globbing) { return; } - size_t i; - for (i = 0; ptr[i]; i++) { + size_t i = 0; + while (ptr[i] != '\0') { if (iscntrl((unsigned char) ptr[i])) { - fprintf(stderr, "Error: invalid filename: contains a control character\n"); + fprintf(stderr, "Error: \"%s\" is an invalid filename: no control characters allowed\n", + fix_control_chars(fname)); exit(1); } + i++; } char *reject; @@ -290,7 +314,7 @@ void invalid_filename(const char *fname, int globbing) { reject = "\\&!?\"'<>%^(){};,*[]"; char *c = strpbrk(ptr, reject); if (c) { - fprintf(stderr, "Error: \"%s\" is an invalid filename: rejected character: \"%c\"\n", ptr, *c); + fprintf(stderr, "Error: \"%s\" is an invalid filename: rejected character: \"%c\"\n", fname, *c); exit(1); } } -- cgit v1.2.3-54-g00ecf From 8673cab907d3966a85adf25e35af7e5481d9ea32 Mon Sep 17 00:00:00 2001 From: smitsohu Date: Tue, 28 Jan 2020 15:08:20 +0100 Subject: remove parentheses from set of rejected characters issue #3001 --- src/firejail/macros.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/firejail/macros.c b/src/firejail/macros.c index 3dbc910a4..ef64178b5 100644 --- a/src/firejail/macros.c +++ b/src/firejail/macros.c @@ -309,9 +309,9 @@ void invalid_filename(const char *fname, int globbing) { char *reject; if (globbing) - reject = "\\&!\"'<>%^(){};,"; // file globbing ('*?[]') is allowed + reject = "\\&!\"'<>%^{};,"; // file globbing ('*?[]') is allowed else - reject = "\\&!?\"'<>%^(){};,*[]"; + reject = "\\&!?\"'<>%^{};,*[]"; char *c = strpbrk(ptr, reject); if (c) { fprintf(stderr, "Error: \"%s\" is an invalid filename: rejected character: \"%c\"\n", fname, *c); -- cgit v1.2.3-54-g00ecf