From 60e807dd6d24c55e42bcbb6f14a77219212fafb5 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Tue, 24 Nov 2015 15:12:18 +0000 Subject: [PATCH] Fix parsing of IPv6 received headers. Issue: #434 Reported by: @vixns --- src/libmime/message.c | 38 +++++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/src/libmime/message.c b/src/libmime/message.c index fe97183e4..e1aec3b85 100644 --- a/src/libmime/message.c +++ b/src/libmime/message.c @@ -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)) { -- 2.39.5