]> source.dussan.org Git - rspamd.git/commitdiff
Validate IP addresses before pushing them to lua.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 6 Jan 2014 16:59:33 +0000 (16:59 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 6 Jan 2014 16:59:33 +0000 (16:59 +0000)
src/lua/lua_ip.c
src/util.c
src/util.h

index a040901b84c521cce4e707f47b7967ddd26c3e08..014b354930e1754a1355020c071348daf0d601ce 100644 (file)
@@ -244,18 +244,23 @@ lua_ip_push (lua_State *L, int af, gpointer data)
 {
        struct rspamd_lua_ip *ip, **pip;
 
-       ip = g_slice_alloc (sizeof (struct rspamd_lua_ip));
-
-       ip->af = af;
-       if (af == AF_INET6) {
-               memcpy (&ip->data, data, sizeof (struct in6_addr));
+       if (!rspamd_ip_is_valid (data, af)) {
+               lua_pushnil (L);
        }
        else {
-               memcpy (&ip->data, data, sizeof (struct in_addr));
+               ip = g_slice_alloc (sizeof (struct rspamd_lua_ip));
+
+               ip->af = af;
+               if (af == AF_INET6) {
+                       memcpy (&ip->data, data, sizeof (struct in6_addr));
+               }
+               else {
+                       memcpy (&ip->data, data, sizeof (struct in_addr));
+               }
+               pip = lua_newuserdata (L, sizeof (struct rspamd_lua_ip *));
+               lua_setclass (L, "rspamd{ip}", -1);
+               *pip = ip;
        }
-       pip = lua_newuserdata (L, sizeof (struct rspamd_lua_ip *));
-       lua_setclass (L, "rspamd{ip}", -1);
-       *pip = ip;
 }
 
 void
index 776e807d173eeaf3a771a8e2a3e2ade7f176acb9..14af4b2bd739e196c49888ee97c26aecd1dde9ee 100644 (file)
@@ -2440,6 +2440,29 @@ rspamd_prng_seed (void)
        g_random_set_seed (rand_seed);
 }
 
+gboolean
+rspamd_ip_is_valid (void *ptr, int af)
+{
+       const struct in_addr ip4_any = { INADDR_ANY }, ip4_none = { INADDR_NONE };
+       const struct in6_addr ip6_any = IN6ADDR_ANY_INIT;
+
+       gboolean ret = FALSE;
+
+       if (G_LIKELY (af == AF_INET)) {
+               if (memcmp (ptr, &ip4_any, sizeof (struct in_addr)) != 0 &&
+                               memcmp (ptr, &ip4_none, sizeof (struct in_addr)) != 0) {
+                       ret = TRUE;
+               }
+       }
+       else if (G_UNLIKELY (af == AF_INET6)) {
+               if (memcmp (ptr, &ip6_any, sizeof (struct in6_addr)) != 0) {
+                       ret = TRUE;
+               }
+       }
+
+       return ret;
+}
+
 /*
  * vi:ts=4
  */
index c36587cab94c8868fa713cfd79622cd3521811c8..9109819865c0ea7b6990fa066b4b52f5cf88765a 100644 (file)
@@ -462,4 +462,12 @@ void rspamd_prng_seed (void);
  */
 void rspamd_random_bytes (gchar *buf, gsize buflen);
 
+/**
+ * Check whether specified ip is valid (not INADDR_ANY or INADDR_NONE) for ipv4 or ipv6
+ * @param ptr pointer to struct in_addr or struct in6_addr
+ * @param af address family (AF_INET or AF_INET6)
+ * @return TRUE if the address is valid
+ */
+gboolean rspamd_ip_is_valid (void *ptr, int af);
+
 #endif