aboutsummaryrefslogtreecommitdiffstats
path: root/src/spf.c
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@rambler-co.ru>2011-02-25 17:14:56 +0300
committerVsevolod Stakhov <vsevolod@rambler-co.ru>2011-02-25 17:14:56 +0300
commit572462a0e27ae1880e1620b0f7427b3712e230df (patch)
tree072e4f1e31cdc9502dcec164921c0b0585cde269 /src/spf.c
parent6f122c26db02d065b16521c7498e8ad8f776f56e (diff)
downloadrspamd-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.c30
1 files changed, 24 insertions, 6 deletions
diff --git a/src/spf.c b/src/spf.c
index 8e60604ac..212bd0074 100644
--- a/src/spf.c
+++ b/src/spf.c
@@ -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)) {