rdns_request_release (reqdata->req);
+ if (reqdata->item) {
+ rspamd_symcache_item_async_dec_check (reqdata->task,
+ reqdata->item);
+ }
+
if (reqdata->pool == NULL) {
g_free (reqdata);
}
* event removing
*/
rdns_request_retain (reply->request);
-
- if (reqdata->item) {
- rspamd_symcache_item_async_dec_check (reqdata->task,
- reqdata->item);
- }
-
rspamd_session_remove_event (reqdata->session, rspamd_dns_fin_cb, reqdata);
}
else {
reqdata->task = task;
reqdata->item = rspamd_symbols_cache_get_cur_item (task);
- rspamd_symcache_item_async_inc (task, reqdata->item);
+
+ if (reqdata->item) {
+ /* We are inside some session */
+ rspamd_symcache_item_async_inc (task, reqdata->item);
+ }
if (!forced && task->dns_requests >= task->cfg->dns_max_requests) {
msg_info_task ("<%s> stop resolving on reaching %ud requests",
task->message_id, task->dns_requests);
}
- return FALSE;
+ return TRUE;
}
- return TRUE;
+ return FALSE;
}
gboolean
/* Sanity checks */
g_assert (checkpoint->items_inflight > 0);
- g_assert (item->async_events == 0);
+
+ if (item->async_events > 0) {
+ /*
+ * XXX: Race condition
+ *
+ * It is possible that some async event is still in flight, but we
+ * already know its result, however, it is the responsibility of that
+ * event to decrease async events count and call this function
+ * one more time
+ */
+ msg_debug_cache_task ("postpone finalisation of %s as there are %d "
+ "async events pendning", item->symbol, item->async_events);
+
+ return;
+ }
msg_debug_cache_task ("process finalize for item %s", item->symbol);
setbit (checkpoint->processed_bits, item->id * 2 + 1);
tracebuf);
}
}
-
- rspamd_symcache_item_async_dec_check (res->task, res->item);
}
}
|| (!dkim_module_ctx->check_local &&
rspamd_inet_address_is_local (task->from_addr, TRUE))) {
msg_info_task ("skip DKIM checks for local networks and authorized users");
+ rspamd_symbols_cache_finalize_item (task, item);
+
return;
}
/* Check whitelist */
if (rspamd_match_radix_map_addr (dkim_module_ctx->whitelist_ip,
task->from_addr) != NULL) {
msg_info_task ("skip DKIM checks for whitelisted address");
+ rspamd_symbols_cache_finalize_item (task, item);
+
return;
}
+ rspamd_symcache_item_async_inc (task, item);
+
/* Now check if a message has its signature */
hlist = rspamd_message_get_header_array (task,
RSPAMD_DKIM_SIGNHEADER,
RSPAMD_DKIM_NORMAL,
&err);
+ if (res == NULL) {
+ res = cur;
+ res->first = res;
+ res->prev = res;
+ }
+ else {
+ DL_APPEND (res, cur);
+ }
+
if (ctx == NULL) {
if (err != NULL) {
msg_info_task ("<%s> cannot parse DKIM context: %e",
}
}
- if (res == NULL) {
- res = cur;
- res->first = res;
- res->prev = res;
- }
- else {
- DL_APPEND (res, cur);
- }
-
checked ++;
if (checked > dkim_module_ctx->max_sigs) {
}
if (res != NULL) {
- rspamd_symcache_item_async_inc (task, item);
dkim_module_check (res);
}
- else {
- rspamd_symbols_cache_finalize_item (task, item);
- }
+
+ rspamd_symcache_item_async_dec_check (task, item);
}
static void