diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2018-08-14 12:51:54 +0100 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2018-08-14 12:51:54 +0100 |
commit | 1af89c35663dd364c8d46523f0d71adc64f8bde4 (patch) | |
tree | 1a814dea5f5ce6045bd53f2e802dd3eb87123ca0 /src/plugins/surbl.c | |
parent | 0478b4ee28138a886f9b457bdba7f2897e151093 (diff) | |
download | rspamd-1af89c35663dd364c8d46523f0d71adc64f8bde4.tar.gz rspamd-1af89c35663dd364c8d46523f0d71adc64f8bde4.zip |
[Fix] Add fail-safety for destroying sessions
Diffstat (limited to 'src/plugins/surbl.c')
-rw-r--r-- | src/plugins/surbl.c | 95 |
1 files changed, 49 insertions, 46 deletions
diff --git a/src/plugins/surbl.c b/src/plugins/surbl.c index 81496f0a9..5b2375888 100644 --- a/src/plugins/surbl.c +++ b/src/plugins/surbl.c @@ -1638,55 +1638,58 @@ register_redirector_call (struct rspamd_url *url, struct rspamd_task *task, struct rspamd_http_message *msg; struct surbl_ctx *surbl_module_ctx = surbl_get_context (task->cfg); - selected = rspamd_upstream_get (surbl_module_ctx->redirectors, - RSPAMD_UPSTREAM_ROUND_ROBIN, url->host, url->hostlen); + if (!rspamd_session_is_destroying (task->s)) { - if (selected) { - s = rspamd_inet_address_connect (rspamd_upstream_addr (selected), - SOCK_STREAM, TRUE); - } + selected = rspamd_upstream_get (surbl_module_ctx->redirectors, + RSPAMD_UPSTREAM_ROUND_ROBIN, url->host, url->hostlen); - if (s == -1) { - msg_info_surbl ("<%s> cannot create tcp socket failed: %s", - task->message_id, - strerror (errno)); - return; - } + if (selected) { + s = rspamd_inet_address_connect (rspamd_upstream_addr (selected), + SOCK_STREAM, TRUE); + } - param = - rspamd_mempool_alloc (task->task_pool, - sizeof (struct redirector_param)); - param->url = url; - param->task = task; - param->conn = rspamd_http_connection_new (NULL, - surbl_redirector_error, - surbl_redirector_finish, - RSPAMD_HTTP_CLIENT_SIMPLE, - RSPAMD_HTTP_CLIENT, - NULL, - NULL); - param->ctx = surbl_module_ctx; - msg = rspamd_http_new_message (HTTP_REQUEST); - msg->url = rspamd_fstring_assign (msg->url, url->string, url->urllen); - param->sock = s; - param->redirector = selected; - timeout = rspamd_mempool_alloc (task->task_pool, sizeof (struct timeval)); - double_to_tv (surbl_module_ctx->read_timeout, timeout); - - rspamd_session_add_event (task->s, - free_redirector_session, - param, - g_quark_from_static_string ("surbl")); - - rspamd_http_connection_write_message (param->conn, msg, NULL, - NULL, param, s, timeout, task->ev_base); - - msg_info_surbl ( - "<%s> registered redirector call for %*s to %s, according to rule: %s", - task->message_id, - url->urllen, url->string, - rspamd_upstream_name (param->redirector), - rule); + if (s == -1) { + msg_info_surbl ("<%s> cannot create tcp socket failed: %s", + task->message_id, + strerror (errno)); + return; + } + + param = + rspamd_mempool_alloc (task->task_pool, + sizeof (struct redirector_param)); + param->url = url; + param->task = task; + param->conn = rspamd_http_connection_new (NULL, + surbl_redirector_error, + surbl_redirector_finish, + RSPAMD_HTTP_CLIENT_SIMPLE, + RSPAMD_HTTP_CLIENT, + NULL, + NULL); + param->ctx = surbl_module_ctx; + msg = rspamd_http_new_message (HTTP_REQUEST); + msg->url = rspamd_fstring_assign (msg->url, url->string, url->urllen); + param->sock = s; + param->redirector = selected; + timeout = rspamd_mempool_alloc (task->task_pool, sizeof (struct timeval)); + double_to_tv (surbl_module_ctx->read_timeout, timeout); + + rspamd_session_add_event (task->s, + free_redirector_session, + param, + g_quark_from_static_string ("surbl")); + + rspamd_http_connection_write_message (param->conn, msg, NULL, + NULL, param, s, timeout, task->ev_base); + + msg_info_surbl ( + "<%s> registered redirector call for %*s to %s, according to rule: %s", + task->message_id, + url->urllen, url->string, + rspamd_upstream_name (param->redirector), + rule); + } } static gboolean |