summaryrefslogtreecommitdiffstats
path: root/src/plugins/surbl.c
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2018-08-14 12:51:54 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2018-08-14 12:51:54 +0100
commit1af89c35663dd364c8d46523f0d71adc64f8bde4 (patch)
tree1a814dea5f5ce6045bd53f2e802dd3eb87123ca0 /src/plugins/surbl.c
parent0478b4ee28138a886f9b457bdba7f2897e151093 (diff)
downloadrspamd-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.c95
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