From: Vsevolod Stakhov Date: Wed, 5 Aug 2015 21:38:03 +0000 (+0100) Subject: Allow quoted filenames in scan input. X-Git-Tag: 1.0.0~232 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=082cd207c15205d17ec51dd6ea09f5e83b5ef2f6;p=thirdparty%2Frspamd.git Allow quoted filenames in scan input. --- diff --git a/src/libserver/protocol.c b/src/libserver/protocol.c index 1fedbbb46e..a87d8751e5 100644 --- a/src/libserver/protocol.c +++ b/src/libserver/protocol.c @@ -262,7 +262,6 @@ rspamd_protocol_handle_url (struct rspamd_task *task, (p - task->msg.start)) == 0 || memcmp (task->msg.start, "path", (p - task->msg.start)) == 0)) { - task->flags |= RSPAMD_TASK_FLAG_FILE; task->msg.start = p + 1; task->msg.len -= (p - task->msg.start) + 1; task->flags |= RSPAMD_TASK_FLAG_FILE; diff --git a/src/libserver/task.c b/src/libserver/task.c index ebd78b4a9e..c2d751dfe5 100644 --- a/src/libserver/task.c +++ b/src/libserver/task.c @@ -259,8 +259,8 @@ rspamd_task_load_message (struct rspamd_task *task, guint control_len, r; struct ucl_parser *parser; ucl_object_t *control_obj; - gchar filepath[PATH_MAX]; - gint fd; + gchar filepath[PATH_MAX], *fp; + gint fd, flen; gpointer map; struct stat st; @@ -275,18 +275,28 @@ rspamd_task_load_message (struct rspamd_task *task, MIN (sizeof (filepath), task->msg.len + 1)); rspamd_unescape_uri (filepath, filepath, r + 1); + flen = strlen (filepath); - if (access (filepath, R_OK) == -1 || stat (filepath, &st) == -1) { + if (filepath[0] == '"' && flen > 2) { + /* We need to unquote filepath */ + fp = &filepath[1]; + fp[flen - 2] = '\0'; + } + else { + fp = &filepath[0]; + } + + if (access (fp, R_OK) == -1 || stat (fp, &st) == -1) { g_set_error (&task->err, rspamd_task_quark(), RSPAMD_PROTOCOL_ERROR, - "Invalid file (%s): %s", filepath, strerror (errno)); + "Invalid file (%s): %s", fp, strerror (errno)); return FALSE; } - fd = open (filepath, O_RDONLY); + fd = open (fp, O_RDONLY); if (fd == -1) { g_set_error (&task->err, rspamd_task_quark(), RSPAMD_PROTOCOL_ERROR, - "Cannot open file (%s): %s", filepath, strerror (errno)); + "Cannot open file (%s): %s", fp, strerror (errno)); return FALSE; } @@ -296,7 +306,7 @@ rspamd_task_load_message (struct rspamd_task *task, if (map == MAP_FAILED) { close (fd); g_set_error (&task->err, rspamd_task_quark(), RSPAMD_PROTOCOL_ERROR, - "Cannot mmap file (%s): %s", filepath, strerror (errno)); + "Cannot mmap file (%s): %s", fp, strerror (errno)); return FALSE; } diff --git a/test/functional/cases/scan_file.sh b/test/functional/cases/scan_file.sh index 89a8d176c5..1a06067858 100644 --- a/test/functional/cases/scan_file.sh +++ b/test/functional/cases/scan_file.sh @@ -13,10 +13,17 @@ check_output 'GTUBE' run perl "$TEST_DIRNAME/cases/scan_file.pl" "path=$TEST_DIRNAME/messages/gtube.eml" check_output 'GTUBE' +run perl "$TEST_DIRNAME/cases/scan_file.pl" "path=\"$TEST_DIRNAME/messages/gtube.eml\"" +check_output 'GTUBE' + # Hex encode every character _hex_name=`printf "$TEST_DIRNAME/messages/gtube.eml" | hexdump -v -e '/1 "%02x"' | sed 's/\(..\)/%\1/g'` run perl "$TEST_DIRNAME/cases/scan_file.pl" "${_hex_name}" check_output 'GTUBE' run perl "$TEST_DIRNAME/cases/scan_file.pl" "file=${_hex_name}" -check_output 'GTUBE' \ No newline at end of file +check_output 'GTUBE' + +_hex_name=`printf "\"$TEST_DIRNAME/messages/gtube.eml\"" | hexdump -v -e '/1 "%02x"' | sed 's/\(..\)/%\1/g'` +run perl "$TEST_DIRNAME/cases/scan_file.pl" "path=${_hex_name}" +check_output 'GTUBE'