} \
} while (0) \
-static gboolean parse_spf_record (struct spf_record *rec, const gchar *elt);
static gboolean start_spf_parse (struct spf_record *rec, gchar *begin);
/* Determine spf mech */
CHECK_REC (rec);
- domain = strchr (addr->spf_string, ':');
+ domain = strchr (addr->spf_string, '=');
if (domain == NULL) {
return FALSE;
/* Read current element and try to parse record */
static gboolean
-parse_spf_record (struct spf_record *rec, const gchar *elt)
+parse_spf_record (struct spf_record *rec, struct spf_resolved_element *resolved,
+ const gchar *elt)
{
struct spf_addr *addr = NULL;
gboolean res = FALSE;
const gchar *begin;
struct rspamd_task *task;
- struct spf_resolved_element *resolved;
gchar t;
- resolved = &g_array_index (rec->resolved, struct spf_resolved_element,
- rec->resolved->len - 1);
-
g_assert (elt != NULL);
g_assert (rec != NULL);
}
if (res) {
- addr->flags |= RSPAMD_SPF_FLAG_VALID;
+ addr->flags |= RSPAMD_SPF_FLAG_PARSED;
}
return res;
start_spf_parse (struct spf_record *rec, gchar *begin)
{
gchar **elts, **cur_elt;
+ struct spf_resolved_element *resolved;
/* Skip spaces */
while (g_ascii_isspace (*begin)) {
begin++;
}
+ resolved = &g_array_index (rec->resolved, struct spf_resolved_element,
+ rec->resolved->len - 1);
elts = g_strsplit_set (begin, " ", 0);
if (elts) {
cur_elt = elts;
while (*cur_elt) {
- parse_spf_record (rec, *cur_elt);
+ parse_spf_record (rec, resolved, *cur_elt);
cur_elt ++;
}
rec->task = task;
rec->callback = callback;
+ rec->resolved = g_array_sized_new (FALSE, FALSE,
+ sizeof (struct spf_resolved_element), 8);
+
rspamd_spf_new_addr_list (rec, rec->sender_domain);
/* Add destructor */
rspamd_lru_hash_lookup (spf_module_ctx->spf_hash,
record->domain, task->tv.tv_sec)) == NULL) {
+ l = spf_record_ref (record);
rspamd_lru_hash_insert (spf_module_ctx->spf_hash,
- record->domain, spf_record_ref (record),
+ record->domain, l,
task->tv.tv_sec, record->ttl);
+
}
spf_record_ref (l);
spf_check_list (l, task);