diff options
author | Vsevolod Stakhov <vsevolod@rambler-co.ru> | 2011-02-25 17:14:56 +0300 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@rambler-co.ru> | 2011-02-25 17:14:56 +0300 |
commit | 572462a0e27ae1880e1620b0f7427b3712e230df (patch) | |
tree | 072e4f1e31cdc9502dcec164921c0b0585cde269 /src/spf.c | |
parent | 6f122c26db02d065b16521c7498e8ad8f776f56e (diff) | |
download | rspamd-572462a0e27ae1880e1620b0f7427b3712e230df.tar.gz rspamd-572462a0e27ae1880e1620b0f7427b3712e230df.zip |
Fix parsing of DNS records :(
Fix parsing several mx addrs in spf parser [1]
Reported by: Victor Ustugov
Diffstat (limited to 'src/spf.c')
-rw-r--r-- | src/spf.c | 30 |
1 files changed, 24 insertions, 6 deletions
@@ -265,11 +265,13 @@ parse_spf_hostmask (struct worker_task *task, const gchar *begin, struct spf_add static void spf_record_dns_callback (struct rspamd_dns_reply *reply, gpointer arg) { - struct spf_dns_cb *cb = arg; + struct spf_dns_cb *cb = arg; gchar *begin; - union rspamd_reply_element *elt_data; - GList *tmp = NULL, *tmp1, *elt, *last; - struct worker_task *task; + union rspamd_reply_element *elt_data; + GList *tmp = NULL, *tmp1, + *elt, *last; + struct worker_task *task; + struct spf_addr *new_addr; task = cb->rec->task; @@ -288,8 +290,23 @@ spf_record_dns_callback (struct rspamd_dns_reply *reply, gpointer arg) } } else if (reply->type == DNS_REQUEST_A) { - /* XXX: process only one record */ - cb->addr->addr = ntohl (elt_data->a.addr[0].s_addr); + if (cb->addr->addr == 0) { + cb->addr->addr = ntohl (elt_data->a.addr[0].s_addr); + } + else { + /* Insert one more address */ + tmp = g_list_find (cb->rec->addrs, cb->addr); + if (tmp) { + new_addr = memory_pool_alloc (task->task_pool, sizeof (struct spf_addr)); + memcpy (new_addr, cb->addr, sizeof (struct spf_addr)); + new_addr->addr = ntohl (elt_data->a.addr[0].s_addr); + cb->rec->addrs = g_list_insert_before (cb->rec->addrs, tmp, new_addr); + } + else { + msg_info ("wrong address list"); + } + } + } break; case SPF_RESOLVE_A: @@ -496,6 +513,7 @@ parse_spf_mx (struct worker_task *task, const gchar *begin, struct spf_record *r cb = memory_pool_alloc (task->task_pool, sizeof (struct spf_dns_cb)); cb->rec = rec; cb->addr = addr; + addr->addr = 0; cb->cur_action = SPF_RESOLVE_MX; cb->in_include = rec->in_include; if (make_dns_request (task->resolver, task->s, task->task_pool, spf_record_dns_callback, (void *)cb, DNS_REQUEST_MX, host)) { |