aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2016-12-09 13:02:03 +0000
committerVsevolod Stakhov <vsevolod@highsecure.ru>2016-12-09 13:02:03 +0000
commit666ca13feef73dcf5f8eaf66fe28ce0b8f5334a7 (patch)
treeb3b7457d82674dc9a55618b444c3115dce9c7cf2
parent09c8e56e36b88709152929d9845d6bf8d5d443ab (diff)
downloadrspamd-666ca13feef73dcf5f8eaf66fe28ce0b8f5334a7.tar.gz
rspamd-666ca13feef73dcf5f8eaf66fe28ce0b8f5334a7.zip
[Feature] Skip processing for large images
-rw-r--r--src/libmime/images.c33
-rw-r--r--src/libserver/cfg_file.h1
-rw-r--r--src/libserver/cfg_rcl.c8
-rw-r--r--src/libserver/cfg_utils.c2
4 files changed, 18 insertions, 26 deletions
diff --git a/src/libmime/images.c b/src/libmime/images.c
index 58e288bc5..454c1e5fd 100644
--- a/src/libmime/images.c
+++ b/src/libmime/images.c
@@ -209,28 +209,6 @@ process_bmp_image (struct rspamd_task *task, GByteArray *data)
return img;
}
-#define SET_P(off_i, off_j) do { \
- p[0] = (guint)gdImageGetPixel (dst, i + (off_i), j + (off_j)); \
- p[1] = (guint)gdImageGetPixel (dst, i + (off_i), j + (off_j) + 1); \
- p[2] = (guint)gdImageGetPixel (dst, i + (off_i), j + (off_j) + 2); \
- p[3] = (guint)gdImageGetPixel (dst, i + (off_i), j + (off_j) + 3); \
- p[4] = (guint)gdImageGetPixel (dst, i + (off_i) + 1, j + (off_j)); \
- p[5] = (guint)gdImageGetPixel (dst, i + (off_i) + 1, j + (off_j) + 1); \
- p[6] = (guint)gdImageGetPixel (dst, i + (off_i) + 1, j + (off_j) + 2); \
- p[7] = (guint)gdImageGetPixel (dst, i + (off_i) + 1, j + (off_j) + 3); \
-} while (0)
-
-#define SET_N() do { \
- n += (guint) ((gint)p[0] - navg); \
- n += (guint) ((gint)p[1] - navg); \
- n += (guint) ((gint)p[2] - navg); \
- n += (guint) ((gint)p[3] - navg); \
- n += (guint) ((gint)p[4] - navg); \
- n += (guint) ((gint)p[5] - navg); \
- n += (guint) ((gint)p[6] - navg); \
- n += (guint) ((gint)p[7] - navg); \
-} while (0)
-
#ifdef WITH_GD
/*
* DCT from Emil Mikulic.
@@ -475,8 +453,6 @@ rspamd_image_normalize (struct rspamd_task *task, struct rspamd_image *img)
#endif
}
-#undef SET_P
-
static void
process_image (struct rspamd_task *task, struct rspamd_mime_part *part)
{
@@ -516,7 +492,14 @@ process_image (struct rspamd_task *task, struct rspamd_mime_part *part)
task->message_id);
img->filename = part->filename;
img->parent = part;
- rspamd_image_normalize (task, img);
+
+ if (img->data->len <= task->cfg->max_pic_size) {
+ rspamd_image_normalize (task, img);
+ }
+ else {
+ msg_info_task ("skip normalization for image %s: too large: %z",
+ img->filename, img->data->len);
+ }
part->flags |= RSPAMD_MIME_PART_IMAGE;
part->specific_data = img;
diff --git a/src/libserver/cfg_file.h b/src/libserver/cfg_file.h
index ccd1d41ed..2ce4bcb28 100644
--- a/src/libserver/cfg_file.h
+++ b/src/libserver/cfg_file.h
@@ -310,6 +310,7 @@ struct rspamd_config {
gsize max_cores_count; /**< maximum number of core files */
gchar *cores_dir; /**< directory for core files */
gsize max_message; /**< maximum size for messages */
+ gsize max_pic_size; /**< maximum size for a picture to process */
enum rspamd_log_type log_type; /**< log type */
gint log_facility; /**< log facility in case of syslog */
diff --git a/src/libserver/cfg_rcl.c b/src/libserver/cfg_rcl.c
index 282ae7469..42e406231 100644
--- a/src/libserver/cfg_rcl.c
+++ b/src/libserver/cfg_rcl.c
@@ -2015,7 +2015,13 @@ rspamd_rcl_config_init (struct rspamd_config *cfg)
rspamd_rcl_parse_struct_integer,
G_STRUCT_OFFSET (struct rspamd_config, max_message),
RSPAMD_CL_FLAG_INT_SIZE,
- "Maximum size of the message to be scanned");
+ "Maximum size of the message to be scanned (50Mb by default)");
+ rspamd_rcl_add_default_handler (sub,
+ "max_pic",
+ rspamd_rcl_parse_struct_integer,
+ G_STRUCT_OFFSET (struct rspamd_config, max_pic_size),
+ RSPAMD_CL_FLAG_INT_SIZE,
+ "Maximum size of the picture to be normalized (1Mb by default)");
rspamd_rcl_add_default_handler (sub,
"zstd_input_dictionary",
rspamd_rcl_parse_struct_string,
diff --git a/src/libserver/cfg_utils.c b/src/libserver/cfg_utils.c
index a00a1665c..2ead99f32 100644
--- a/src/libserver/cfg_utils.c
+++ b/src/libserver/cfg_utils.c
@@ -40,6 +40,7 @@
#define DEFAULT_MAX_WORD 40
#define DEFAULT_WORDS_DECAY 200
#define DEFAULT_MAX_MESSAGE (50 * 1024 * 1024)
+#define DEFAULT_MAX_PIC (1 * 1024 * 1024)
struct rspamd_ucl_map_cbdata {
struct rspamd_config *cfg;
@@ -171,6 +172,7 @@ rspamd_config_new (void)
cfg->ssl_ciphers = "HIGH:!aNULL:!kRSA:!PSK:!SRP:!MD5:!RC4";
cfg->max_message = DEFAULT_MAX_MESSAGE;
+ cfg->max_pic_size = DEFAULT_MAX_PIC;
cfg->monitored_ctx = rspamd_monitored_ctx_init ();
#ifdef WITH_HIREDIS
cfg->redis_pool = rspamd_redis_pool_init ();