for (i = 0; i < elt->elts->len; i++) {
cur = g_ptr_array_index (elt->elts, i);
- if (!(cur->flags & RSPAMD_SPF_FLAG_PARSED)) {
+ if (cur->flags & RSPAMD_SPF_FLAG_TEMPFAIL) {
+ target->failed = TRUE;
+ continue;
+ }
+ else if (!(cur->flags & RSPAMD_SPF_FLAG_PARSED)) {
/* Ignore unparsed addrs */
continue;
}
g_assert (rec != NULL);
- res = g_slice_alloc (sizeof (*res));
+ res = g_slice_alloc0 (sizeof (*res));
res->elts = g_array_sized_new (FALSE, FALSE, sizeof (struct spf_addr),
rec->resolved->len);
res->domain = g_strdup (rec->sender_domain);
break;
}
}
+ else {
+ cb->addr->flags |= RSPAMD_SPF_FLAG_TEMPFAIL;
+ msg_info_spf (
+ "<%s>: spf error for domain %s: cannot resolve DNS record for"
+ " %s: %s",
+ task->message_id,
+ cb->rec->sender_domain,
+ cb->resolved->cur_domain,
+ rdns_strerror (reply->code));
+ }
rspamd_spf_maybe_return (cb->rec);
}
#define RSPAMD_SPF_FLAG_VALID (1 << 5)
#define RSPAMD_SPF_FLAG_REFRENCE (1 << 6)
#define RSPAMD_SPF_FLAG_REDIRECT (1 << 7)
+#define RSPAMD_SPF_FLAG_TEMPFAIL (1 << 8)
struct spf_addr {
guchar addr6[sizeof (struct in6_addr)];
struct spf_resolved {
gchar *domain;
guint ttl;
+ gboolean failed;
GArray *elts; /* Flat list of struct spf_addr */
ref_entry_t ref; /* Refcounting */
};
guint i;
struct spf_addr *addr;
- for (i = 0; i < rec->elts->len; i ++) {
- addr = &g_array_index (rec->elts, struct spf_addr, i);
- if (spf_check_element (addr, task)) {
- break;
+ if (!rec->failed) {
+ for (i = 0; i < rec->elts->len; i ++) {
+ addr = &g_array_index (rec->elts, struct spf_addr, i);
+ if (spf_check_element (addr, task)) {
+ break;
+ }
}
}
+ else {
+ msg_info_task ("<%s>: ignore spf results due to DNS failure",
+ task->message_id);
+ }
}
static void