summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2015-11-28 22:22:21 +0000
committerVsevolod Stakhov <vsevolod@highsecure.ru>2015-11-28 22:22:21 +0000
commit9a7f6f24d0cb6e5713360c09b801576f74bf04c5 (patch)
treea30600b1cc1c89a290ed935e405acf3c6f8836fa
parent660fa482d1447b59f24d994521e5049828fa41dd (diff)
downloadrspamd-9a7f6f24d0cb6e5713360c09b801576f74bf04c5.tar.gz
rspamd-9a7f6f24d0cb6e5713360c09b801576f74bf04c5.zip
Add missing components normalization
-rw-r--r--src/libserver/url.c22
1 files changed, 17 insertions, 5 deletions
diff --git a/src/libserver/url.c b/src/libserver/url.c
index a7275c337..29082d338 100644
--- a/src/libserver/url.c
+++ b/src/libserver/url.c
@@ -1166,20 +1166,24 @@ rspamd_url_is_ip (struct rspamd_url *uri, rspamd_mempool_t *pool)
*/
switch (i) {
case 4:
- n |= GUINT32_TO_BE (t) << shift;
+ t = GUINT32_TO_BE (t);
break;
case 3:
- n |= (GUINT32_TO_BE (t & 0xFFFFFFU) >> 8) << shift;
+ t = (GUINT32_TO_BE (t & 0xFFFFFFU) >> 8);
break;
case 2:
- n |= GUINT16_TO_BE (t & 0xFFFFU) << shift;
+ t = GUINT16_TO_BE (t & 0xFFFFU);
break;
default:
- n |= (t & 0xFF) << shift;
+ t = t & 0xFF;
break;
}
- shift = nshift;
+ if (p != end) {
+ n |= t << shift;
+
+ shift = nshift;
+ }
}
else {
check_num = FALSE;
@@ -1189,6 +1193,14 @@ rspamd_url_is_ip (struct rspamd_url *uri, rspamd_mempool_t *pool)
p++;
}
+ /* The last component should be last according to url normalization:
+ * 192.168.1 -> 192.168.0.1
+ * 192 -> 0.0.0.192
+ * 192.168 -> 192.0.0.168
+ */
+ shift = 8 * (4 - i);
+ n |= t << shift;
+
if (check_num && dots <= 4) {
memcpy (&in4, &n, sizeof (in4));
uri->host = rspamd_mempool_alloc (pool, INET_ADDRSTRLEN + 1);