]> source.dussan.org Git - rspamd.git/commitdiff
[Minor] Implement workaround for legacy clients
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Sat, 27 Feb 2016 13:19:03 +0000 (13:19 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Sat, 27 Feb 2016 13:19:03 +0000 (13:19 +0000)
src/libserver/cfg_file.h
src/libserver/cfg_rcl.c
src/libserver/cfg_utils.c
src/libserver/task.c
src/libserver/task.h
src/worker.c

index 88b5b4538ca37a3203af9c71c1d297bd76d24864..17ca4f86397ca368bef31ce05fe260458b875acd 100644 (file)
@@ -245,6 +245,7 @@ struct rspamd_config {
        gboolean check_all_filters;                     /**< check all filters                                                                  */
        gboolean allow_raw_input;                       /**< scan messages with invalid mime                                    */
        gboolean disable_hyperscan;                     /**< disable hyperscan usage                                                    */
+       gboolean enable_shutdown_workaround;            /**< enable workaround for legacy SA clients (exim)             */
 
        gsize max_diff;                                 /**< maximum diff size for text parts                                   */
        gsize max_cores_size;                           /**< maximum size occupied by rspamd core files                 */
index 559d0ee03b62463991b4c09c9ecd8e56099f0b3f..83b3dcadab998627db277a80cf6605147ac2958f 100644 (file)
@@ -1669,6 +1669,12 @@ rspamd_rcl_config_init (struct rspamd_config *cfg)
                        G_STRUCT_OFFSET (struct rspamd_config, trusted_keys),
                        RSPAMD_CL_FLAG_STRING_LIST_HASH,
                        "List of trusted public keys used for signatures in base32 encoding");
+       rspamd_rcl_add_default_handler (sub,
+                       "enable_shutdown_workaround",
+                       rspamd_rcl_parse_struct_boolean,
+                       G_STRUCT_OFFSET (struct rspamd_config, enable_shutdown_workaround),
+                       0,
+                       "Enable workaround for legacy clients");
        /* New DNS configuration */
        ssub = rspamd_rcl_add_section_doc (&sub->subsections, "dns", NULL, NULL,
                        UCL_OBJECT, FALSE, TRUE,
index e87ba2a2504a2f02c2515f870e04335e7d9103ba..ea68942599afb254e731039f2e94b18f9828ad6a 100644 (file)
@@ -156,6 +156,10 @@ rspamd_config_new (void)
        cfg->ups_ctx = rspamd_upstreams_library_init ();
        cfg->re_cache = rspamd_re_cache_new ();
        cfg->doc_strings = ucl_object_typed_new (UCL_OBJECT);
+       /*
+        * Unless exim is fixed
+        */
+       cfg->enable_shutdown_workaround = TRUE;
 
        REF_INIT_RETAIN (cfg, rspamd_config_free);
 
index 1220dc4bc9b3e5a2d6154e3b046f03db4c5f6e98..cd80137d7b1c37a750de9b61563a9aed8189a9b7 100644 (file)
@@ -215,6 +215,10 @@ rspamd_task_free (struct rspamd_task *task)
                        event_del (&task->timeout_ev);
                }
 
+               if (task->guard_ev) {
+                       event_del (task->guard_ev);
+               }
+
                rspamd_re_cache_runtime_destroy (task->re_rt);
                REF_RELEASE (task->cfg);
 
index 44a71b289e759b1e178619f5f65e43e15ed254d7..749f3adc270a59ea702801cf202da0818120d8ec 100644 (file)
@@ -183,6 +183,7 @@ struct rspamd_task {
        struct rspamd_dns_resolver *resolver;                   /**< DNS resolver                                                                       */
        struct event_base *ev_base;                                             /**< Event base                                                                         */
        struct event timeout_ev;                                                /**< Global task timeout                                                        */
+       struct event *guard_ev;                                                 /**< Event for input sanity guard                                       */
 
        gpointer checkpoint;                                                    /**< Opaque checkpoint data                                                     */
 
index 45ac2200e77b4398f1dc61070ab92a10a669576f..bd54368a6bfc5c212b25cd52199c73a13a4acf53 100644 (file)
@@ -146,8 +146,17 @@ rspamd_worker_guard_handler (gint fd, short what, void *data)
                         * reliable way to distinguish between shutdown(SHUT_WR) and
                         * close.
                         */
-                       msg_err_task ("the peer has closed connection unexpectedly");
-                       rspamd_session_destroy (task->s);
+                       if (task->cfg->enable_shutdown_workaround) {
+                               msg_info_task ("workaround for shutdown enabled, please update "
+                                               "your client, this support might be removed in future");
+                               shutdown (fd, SHUT_RD);
+                               event_del (task->guard_ev);
+                               task->guard_ev = NULL;
+                       }
+                       else {
+                               msg_err_task ("the peer has closed connection unexpectedly");
+                               rspamd_session_destroy (task->s);
+                       }
                }
                else if (errno != EAGAIN) {
                        msg_err_task ("the peer has closed connection unexpectedly: %s",
@@ -203,8 +212,7 @@ rspamd_worker_body_handler (struct rspamd_http_connection *conn,
                        rspamd_worker_guard_handler, task);
        event_base_set (task->ev_base, guard_ev);
        event_add (guard_ev, NULL);
-       rspamd_mempool_add_destructor (task->task_pool,
-                       (rspamd_mempool_destruct_t)event_del, guard_ev);
+       task->guard_ev = guard_ev;
 
        rspamd_task_process (task, RSPAMD_TASK_PROCESS_ALL);