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(-) (limited to 'src') 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