]> source.dussan.org Git - rspamd.git/commitdiff
Better support of ipv6 headers.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 23 May 2013 12:14:09 +0000 (13:14 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 23 May 2013 12:14:09 +0000 (13:14 +0100)
src/protocol.c

index ab9836e85415b8298ea5386c721bb6734cc6cd50..151b59a9f975f7130779db6aa2cc7b30e60d7fb9 100644 (file)
@@ -565,20 +565,32 @@ parse_header (struct worker_task *task, f_str_t * line)
                if (g_ascii_strncasecmp (headern, IP_ADDR_HEADER, sizeof (IP_ADDR_HEADER) - 1) == 0) {
                        tmp = memory_pool_fstrdup (task->task_pool, line);
 #ifdef HAVE_INET_PTON
-                       if (inet_pton (AF_INET, tmp, &task->from_addr.d.in4) != 1) {
-                               /* Try ipv6 */
-                               if (inet_pton (AF_INET6, tmp, &task->from_addr.d.in6) == 1) {
+                       if (g_ascii_strncasecmp (tmp, "IPv6:", 5) == 0) {
+                               if (inet_pton (AF_INET6, tmp + 6, &task->from_addr.d.in6) == 1) {
                                        task->from_addr.ipv6 = TRUE;
                                }
                                else {
                                        msg_info ("bad ip header: '%s'", tmp);
                                        return FALSE;
                                }
+                               task->from_addr.has_addr = TRUE;
                        }
                        else {
-                               task->from_addr.ipv6 = FALSE;
+                               if (inet_pton (AF_INET, tmp, &task->from_addr.d.in4) != 1) {
+                                       /* Try ipv6 */
+                                       if (inet_pton (AF_INET6, tmp, &task->from_addr.d.in6) == 1) {
+                                               task->from_addr.ipv6 = TRUE;
+                                       }
+                                       else {
+                                               msg_info ("bad ip header: '%s'", tmp);
+                                               return FALSE;
+                                       }
+                               }
+                               else {
+                                       task->from_addr.ipv6 = FALSE;
+                               }
+                               task->from_addr.has_addr = TRUE;
                        }
-                       task->from_addr.has_addr = TRUE;
 #else
                        if (!inet_aton (tmp, &task->from_addr)) {
                                msg_info ("bad ip header: '%s'", tmp);