]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
Fix parsing of IPv6 received headers.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 24 Nov 2015 15:12:18 +0000 (15:12 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 24 Nov 2015 15:12:18 +0000 (15:12 +0000)
Issue: #434
Reported by: @vixns

src/libmime/message.c

index fe97183e4c870bae89f60f26877d6258948b25fb..e1aec3b85b755c667dca8fab1febb16114942ad9 100644 (file)
@@ -116,6 +116,7 @@ parse_recv_header (rspamd_mempool_t * pool,
                RSPAMD_RECV_STATE_BRACES_BLOCK,
                RSPAMD_RECV_STATE_BY_BLOCK,
                RSPAMD_RECV_STATE_PARSE_IP,
+               RSPAMD_RECV_STATE_PARSE_IP6,
                RSPAMD_RECV_STATE_SKIP_SPACES,
                RSPAMD_RECV_STATE_ERROR
        } state = RSPAMD_RECV_STATE_INIT, next_state = RSPAMD_RECV_STATE_INIT;
@@ -337,23 +338,38 @@ parse_recv_header (rspamd_mempool_t * pool,
 
                /* Extract ip */
                case RSPAMD_RECV_STATE_PARSE_IP:
-                       while (g_ascii_isxdigit (*p) || *p == '.' || *p == ':') {
-                               p++;
+                       if (*p == 'I') {
+                               /* IPv6: */
+                               state = RSPAMD_RECV_STATE_PARSE_IP6;
                        }
-                       if (*p != ']') {
-                               /* Not an ip in fact */
-                               state = RSPAMD_RECV_STATE_SKIP_SPACES;
-                               p++;
+                       else {
+                               while (g_ascii_isxdigit (*p) || *p == '.' || *p == ':') {
+                                       p++;
+                               }
+                               if (*p != ']') {
+                                       /* Not an ip in fact */
+                                       state = RSPAMD_RECV_STATE_SKIP_SPACES;
+                                       p++;
+                               }
+                               else {
+                                       *p = '\0';
+                                       *res = rspamd_mempool_strdup (pool, s);
+                                       *p = ']';
+                                       p++;
+                                       state = RSPAMD_RECV_STATE_SKIP_SPACES;
+                               }
+                       }
+                       break;
+               case RSPAMD_RECV_STATE_PARSE_IP6:
+                       if (g_ascii_strncasecmp (p, "IPv6:", sizeof ("IPv6") - 1) == 0) {
+                               p += sizeof ("IPv6") - 1;
+                               s = p;
+                               state = RSPAMD_RECV_STATE_PARSE_IP;
                        }
                        else {
-                               *p = '\0';
-                               *res = rspamd_mempool_strdup (pool, s);
-                               *p = ']';
-                               p++;
                                state = RSPAMD_RECV_STATE_SKIP_SPACES;
                        }
                        break;
-
                /* Skip spaces */
                case RSPAMD_RECV_STATE_SKIP_SPACES:
                        if (!g_ascii_isspace (*p)) {