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 */
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,
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);
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);
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 */
* 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",
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);