firewall3: fix left shift on 64 bit systems in fw3_bitlen2netmask
[project/firewall3.git] / options.c
index 292f5fc..f41153c 100644 (file)
--- a/options.c
+++ b/options.c
@@ -268,12 +268,15 @@ fw3_parse_address(void *ptr, const char *val, bool is_list)
                addr.family = FW3_FAMILY_V6;
                addr.address.v6 = v6;
 
                addr.family = FW3_FAMILY_V6;
                addr.address.v6 = v6;
 
-               if (m && !inet_pton(AF_INET6, m, &addr.mask.v6))
+               if (m)
                {
                {
-                       bits = strtol(m, &e, 10);
+                       if (!inet_pton(AF_INET6, m, &v6))
+                       {
+                               bits = strtol(m, &e, 10);
 
 
-                       if ((*e != 0) || !fw3_bitlen2netmask(addr.family, bits, &v6))
-                               goto fail;
+                               if ((*e != 0) || !fw3_bitlen2netmask(addr.family, bits, &v6))
+                                       goto fail;
+                       }
 
                        addr.mask.v6 = v6;
                }
 
                        addr.mask.v6 = v6;
                }
@@ -294,12 +297,15 @@ fw3_parse_address(void *ptr, const char *val, bool is_list)
                addr.family = FW3_FAMILY_V4;
                addr.address.v4 = v4;
 
                addr.family = FW3_FAMILY_V4;
                addr.address.v4 = v4;
 
-               if (m && !inet_pton(AF_INET, m, &addr.mask.v4))
+               if (m)
                {
                {
-                       bits = strtol(m, &e, 10);
+                       if (!inet_pton(AF_INET, m, &v4))
+                       {
+                               bits = strtol(m, &e, 10);
 
 
-                       if ((*e != 0) || !fw3_bitlen2netmask(addr.family, bits, &v4))
-                               goto fail;
+                               if ((*e != 0) || !fw3_bitlen2netmask(addr.family, bits, &v4))
+                                       goto fail;
+                       }
 
                        addr.mask.v4 = v4;
                }
 
                        addr.mask.v4 = v4;
                }
@@ -436,7 +442,7 @@ fw3_parse_port(void *ptr, const char *val, bool is_list)
 bool
 fw3_parse_family(void *ptr, const char *val, bool is_list)
 {
 bool
 fw3_parse_family(void *ptr, const char *val, bool is_list)
 {
-       if (!strcmp(val, "any"))
+       if (!strcmp(val, "any") || !strcmp(val, "*"))
                *((enum fw3_family *)ptr) = FW3_FAMILY_ANY;
        else if (!strcmp(val, "inet") || strrchr(val, '4'))
                *((enum fw3_family *)ptr) = FW3_FAMILY_V4;
                *((enum fw3_family *)ptr) = FW3_FAMILY_ANY;
        else if (!strcmp(val, "inet") || strrchr(val, '4'))
                *((enum fw3_family *)ptr) = FW3_FAMILY_V4;
@@ -537,7 +543,7 @@ fw3_parse_protocol(void *ptr, const char *val, bool is_list)
                while (isspace(*++val));
        }
 
                while (isspace(*++val));
        }
 
-       if (!strcmp(val, "all"))
+       if (!strcmp(val, "all") || !strcmp(val, "any") || !strcmp(val, "*"))
        {
                proto.any = true;
                put_value(ptr, &proto, sizeof(proto), is_list);
        {
                proto.any = true;
                put_value(ptr, &proto, sizeof(proto), is_list);