summaryrefslogtreecommitdiffstats
path: root/src/spf.c
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@rambler-co.ru>2009-12-15 17:38:11 +0300
committerVsevolod Stakhov <vsevolod@rambler-co.ru>2009-12-15 17:38:11 +0300
commitb7046a0e6667e9c840b83acaf08f9ac117508eaa (patch)
tree0e0ffa0df321bae6b72c68fd4e7792a439af6189 /src/spf.c
parent1cf238549b8a2626f537f00b215e75eb19621570 (diff)
downloadrspamd-b7046a0e6667e9c840b83acaf08f9ac117508eaa.tar.gz
rspamd-b7046a0e6667e9c840b83acaf08f9ac117508eaa.zip
* Fix inserting one list to another in spf parser (include border elements)
Diffstat (limited to 'src/spf.c')
-rw-r--r--src/spf.c29
1 files changed, 20 insertions, 9 deletions
diff --git a/src/spf.c b/src/spf.c
index 662ae285b..49ef39891 100644
--- a/src/spf.c
+++ b/src/spf.c
@@ -285,18 +285,29 @@ spf_record_dns_callback (int result, char type, int count, int ttl, void *addres
/* Insert new list in place of include element */
last = g_list_last (cb->rec->addrs);
- if (elt->prev) {
- elt->prev->next = cb->rec->addrs;
- }
- if (elt->next) {
- elt->next->prev = last;
+ if (elt->prev == NULL && elt->next == NULL) {
+ g_list_free1 (elt);
}
- cb->rec->addrs->prev = elt->prev;
- last->next = elt->next;
+ else {
+
+ if (elt->prev) {
+ elt->prev->next = cb->rec->addrs;
+ }
+ else {
+ /* Elt is the first element, so we need to shift temporary list */
+ tmp = elt->next;
+ }
+ if (elt->next) {
+ elt->next->prev = last;
+ last->next = elt->next;
+ }
- cb->rec->addrs = tmp;
- g_list_free1 (elt);
+ cb->rec->addrs->prev = elt->prev;
+
+ cb->rec->addrs = tmp;
+ g_list_free1 (elt);
+ }
}
}
}