]> source.dussan.org Git - rspamd.git/commitdiff
[Fix] Fix shared memory proxying when compression is set 4903/head
authorVsevolod Stakhov <vsevolod@rspamd.com>
Wed, 3 Apr 2024 14:47:50 +0000 (15:47 +0100)
committerVsevolod Stakhov <vsevolod@rspamd.com>
Wed, 3 Apr 2024 14:47:50 +0000 (15:47 +0100)
src/libserver/task.c

index 13f4fa1e62cfdb91fdec587ecf1b74dc45055444..f81f34e47c88b2b5dfe367f07716974437ed4aad 100644 (file)
@@ -436,86 +436,89 @@ rspamd_task_load_message(struct rspamd_task *task,
                                          fp, shmem_size, offset, fd);
 
                rspamd_mempool_add_destructor(task->task_pool, rspamd_task_unmapper, m);
-
-               return TRUE;
        }
+       else {
+               /* Try file */
+               tok = rspamd_task_get_request_header(task, "file");
 
-       tok = rspamd_task_get_request_header(task, "file");
+               if (tok == NULL) {
+                       tok = rspamd_task_get_request_header(task, "path");
+               }
 
-       if (tok == NULL) {
-               tok = rspamd_task_get_request_header(task, "path");
-       }
+               if (tok) {
+                       debug_task("want to scan file %T", tok);
 
-       if (tok) {
-               debug_task("want to scan file %T", tok);
+                       r = rspamd_strlcpy(filepath, tok->begin,
+                                                          MIN(sizeof(filepath), tok->len + 1));
 
-               r = rspamd_strlcpy(filepath, tok->begin,
-                                                  MIN(sizeof(filepath), tok->len + 1));
-
-               rspamd_url_decode(filepath, filepath, r + 1);
-               flen = strlen(filepath);
+                       rspamd_url_decode(filepath, filepath, r + 1);
+                       flen = strlen(filepath);
 
-               if (filepath[0] == '"' && flen > 2) {
-                       /* We need to unquote filepath */
-                       fp = &filepath[1];
-                       fp[flen - 2] = '\0';
-               }
-               else {
-                       fp = &filepath[0];
-               }
-
-               if (stat(fp, &st) == -1) {
-                       g_set_error(&task->err, rspamd_task_quark(), RSPAMD_PROTOCOL_ERROR,
-                                               "Invalid file (%s): %s", fp, strerror(errno));
-                       return FALSE;
-               }
-
-               if (G_UNLIKELY(st.st_size == 0)) {
-                       /* Empty file */
-                       task->flags |= RSPAMD_TASK_FLAG_EMPTY;
-                       task->msg.begin = rspamd_mempool_strdup(task->task_pool, "");
-                       task->msg.len = 0;
-               }
-               else {
-                       fd = open(fp, O_RDONLY);
+                       if (filepath[0] == '"' && flen > 2) {
+                               /* We need to unquote filepath */
+                               fp = &filepath[1];
+                               fp[flen - 2] = '\0';
+                       }
+                       else {
+                               fp = &filepath[0];
+                       }
 
-                       if (fd == -1) {
-                               g_set_error(&task->err, rspamd_task_quark(),
-                                                       RSPAMD_PROTOCOL_ERROR,
-                                                       "Cannot open file (%s): %s", fp, strerror(errno));
+                       if (stat(fp, &st) == -1) {
+                               g_set_error(&task->err, rspamd_task_quark(), RSPAMD_PROTOCOL_ERROR,
+                                                       "Invalid file (%s): %s", fp, strerror(errno));
                                return FALSE;
                        }
 
-                       map = mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, fd, 0);
+                       if (G_UNLIKELY(st.st_size == 0)) {
+                               /* Empty file */
+                               task->flags |= RSPAMD_TASK_FLAG_EMPTY;
+                               task->msg.begin = rspamd_mempool_strdup(task->task_pool, "");
+                               task->msg.len = 0;
+                       }
+                       else {
+                               fd = open(fp, O_RDONLY);
 
+                               if (fd == -1) {
+                                       g_set_error(&task->err, rspamd_task_quark(),
+                                                               RSPAMD_PROTOCOL_ERROR,
+                                                               "Cannot open file (%s): %s", fp, strerror(errno));
+                                       return FALSE;
+                               }
 
-                       if (map == MAP_FAILED) {
-                               close(fd);
-                               g_set_error(&task->err, rspamd_task_quark(),
-                                                       RSPAMD_PROTOCOL_ERROR,
-                                                       "Cannot mmap file (%s): %s", fp, strerror(errno));
-                               return FALSE;
-                       }
+                               map = mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, fd, 0);
 
-                       task->msg.begin = map;
-                       task->msg.len = st.st_size;
-                       m = rspamd_mempool_alloc(task->task_pool, sizeof(*m));
-                       m->begin = map;
-                       m->len = st.st_size;
-                       m->fd = fd;
 
-                       rspamd_mempool_add_destructor(task->task_pool, rspamd_task_unmapper, m);
-               }
+                               if (map == MAP_FAILED) {
+                                       close(fd);
+                                       g_set_error(&task->err, rspamd_task_quark(),
+                                                               RSPAMD_PROTOCOL_ERROR,
+                                                               "Cannot mmap file (%s): %s", fp, strerror(errno));
+                                       return FALSE;
+                               }
 
-               task->msg.fpath = rspamd_mempool_strdup(task->task_pool, fp);
-               task->flags |= RSPAMD_TASK_FLAG_FILE;
+                               task->msg.begin = map;
+                               task->msg.len = st.st_size;
+                               m = rspamd_mempool_alloc(task->task_pool, sizeof(*m));
+                               m->begin = map;
+                               m->len = st.st_size;
+                               m->fd = fd;
 
-               msg_info_task("loaded message from file %s", fp);
+                               rspamd_mempool_add_destructor(task->task_pool, rspamd_task_unmapper, m);
+                       }
 
-               return TRUE;
+                       task->msg.fpath = rspamd_mempool_strdup(task->task_pool, fp);
+                       task->flags |= RSPAMD_TASK_FLAG_FILE;
+
+                       msg_info_task("loaded message from file %s", fp);
+               }
+               else {
+                       /* Plain data */
+                       task->msg.begin = start;
+                       task->msg.len = len;
+               }
        }
 
-       /* Plain data */
+
        debug_task("got input of length %z", task->msg.len);
 
        /* Check compression */
@@ -573,10 +576,10 @@ rspamd_task_load_message(struct rspamd_task *task,
                        zstream = task->cfg->libs_ctx->in_zstream;
 
                        zin.pos = 0;
-                       zin.src = start;
-                       zin.size = len;
+                       zin.src = task->msg.begin;
+                       zin.size = task->msg.len;
 
-                       if ((outlen = ZSTD_getDecompressedSize(start, len)) == 0) {
+                       if ((outlen = ZSTD_getDecompressedSize(task->msg.begin, task->msg.len)) == 0) {
                                outlen = ZSTD_DStreamOutSize();
                        }
 
@@ -618,10 +621,6 @@ rspamd_task_load_message(struct rspamd_task *task,
                        return FALSE;
                }
        }
-       else {
-               task->msg.begin = start;
-               task->msg.len = len;
-       }
 
        if (task->msg.len == 0) {
                task->flags |= RSPAMD_TASK_FLAG_EMPTY;