|
@@ -175,18 +175,16 @@ hash_netportnet4_uadt(struct ip_set *set, struct nlattr *tb[],
|
|
|
{
|
|
|
const struct hash_netportnet *h = set->data;
|
|
|
ipset_adtfn adtfn = set->variant->adt[adt];
|
|
|
- struct hash_netportnet4_elem e = { };
|
|
|
+ struct hash_netportnet4_elem e = { .cidr = { HOST_MASK, HOST_MASK, }, };
|
|
|
struct ip_set_ext ext = IP_SET_INIT_UEXT(set);
|
|
|
u32 ip = 0, ip_to = 0, ip_last, p = 0, port, port_to;
|
|
|
u32 ip2_from = 0, ip2_to = 0, ip2_last, ip2;
|
|
|
bool with_ports = false;
|
|
|
- u8 cidr, cidr2;
|
|
|
int ret;
|
|
|
|
|
|
if (tb[IPSET_ATTR_LINENO])
|
|
|
*lineno = nla_get_u32(tb[IPSET_ATTR_LINENO]);
|
|
|
|
|
|
- e.cidr[0] = e.cidr[1] = HOST_MASK;
|
|
|
if (unlikely(!tb[IPSET_ATTR_IP] || !tb[IPSET_ATTR_IP2] ||
|
|
|
!ip_set_attr_netorder(tb, IPSET_ATTR_PORT) ||
|
|
|
!ip_set_optattr_netorder(tb, IPSET_ATTR_PORT_TO) ||
|
|
@@ -206,17 +204,15 @@ hash_netportnet4_uadt(struct ip_set *set, struct nlattr *tb[],
|
|
|
return ret;
|
|
|
|
|
|
if (tb[IPSET_ATTR_CIDR]) {
|
|
|
- cidr = nla_get_u8(tb[IPSET_ATTR_CIDR]);
|
|
|
- if (!cidr || cidr > HOST_MASK)
|
|
|
+ e.cidr[0] = nla_get_u8(tb[IPSET_ATTR_CIDR]);
|
|
|
+ if (!e.cidr[0] || e.cidr[0] > HOST_MASK)
|
|
|
return -IPSET_ERR_INVALID_CIDR;
|
|
|
- e.cidr[0] = cidr;
|
|
|
}
|
|
|
|
|
|
if (tb[IPSET_ATTR_CIDR2]) {
|
|
|
- cidr = nla_get_u8(tb[IPSET_ATTR_CIDR2]);
|
|
|
- if (!cidr || cidr > HOST_MASK)
|
|
|
+ e.cidr[1] = nla_get_u8(tb[IPSET_ATTR_CIDR2]);
|
|
|
+ if (!e.cidr[1] || e.cidr[1] > HOST_MASK)
|
|
|
return -IPSET_ERR_INVALID_CIDR;
|
|
|
- e.cidr[1] = cidr;
|
|
|
}
|
|
|
|
|
|
e.port = nla_get_be16(tb[IPSET_ATTR_PORT]);
|
|
@@ -285,8 +281,7 @@ hash_netportnet4_uadt(struct ip_set *set, struct nlattr *tb[],
|
|
|
|
|
|
while (!after(ip, ip_to)) {
|
|
|
e.ip[0] = htonl(ip);
|
|
|
- ip_last = ip_set_range_to_cidr(ip, ip_to, &cidr);
|
|
|
- e.cidr[0] = cidr;
|
|
|
+ ip_last = ip_set_range_to_cidr(ip, ip_to, &e.cidr[0]);
|
|
|
p = retried && ip == ntohl(h->next.ip[0]) ? ntohs(h->next.port)
|
|
|
: port;
|
|
|
for (; p <= port_to; p++) {
|
|
@@ -297,8 +292,7 @@ hash_netportnet4_uadt(struct ip_set *set, struct nlattr *tb[],
|
|
|
while (!after(ip2, ip2_to)) {
|
|
|
e.ip[1] = htonl(ip2);
|
|
|
ip2_last = ip_set_range_to_cidr(ip2, ip2_to,
|
|
|
- &cidr2);
|
|
|
- e.cidr[1] = cidr2;
|
|
|
+ &e.cidr[1]);
|
|
|
ret = adtfn(set, &e, &ext, &ext, flags);
|
|
|
if (ret && !ip_set_eexist(ret, flags))
|
|
|
return ret;
|
|
@@ -447,7 +441,7 @@ hash_netportnet6_uadt(struct ip_set *set, struct nlattr *tb[],
|
|
|
{
|
|
|
const struct hash_netportnet *h = set->data;
|
|
|
ipset_adtfn adtfn = set->variant->adt[adt];
|
|
|
- struct hash_netportnet6_elem e = { };
|
|
|
+ struct hash_netportnet6_elem e = { .cidr = { HOST_MASK, HOST_MASK, }, };
|
|
|
struct ip_set_ext ext = IP_SET_INIT_UEXT(set);
|
|
|
u32 port, port_to;
|
|
|
bool with_ports = false;
|
|
@@ -456,7 +450,6 @@ hash_netportnet6_uadt(struct ip_set *set, struct nlattr *tb[],
|
|
|
if (tb[IPSET_ATTR_LINENO])
|
|
|
*lineno = nla_get_u32(tb[IPSET_ATTR_LINENO]);
|
|
|
|
|
|
- e.cidr[0] = e.cidr[1] = HOST_MASK;
|
|
|
if (unlikely(!tb[IPSET_ATTR_IP] || !tb[IPSET_ATTR_IP2] ||
|
|
|
!ip_set_attr_netorder(tb, IPSET_ATTR_PORT) ||
|
|
|
!ip_set_optattr_netorder(tb, IPSET_ATTR_PORT_TO) ||
|
|
@@ -477,15 +470,17 @@ hash_netportnet6_uadt(struct ip_set *set, struct nlattr *tb[],
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
|
|
|
- if (tb[IPSET_ATTR_CIDR])
|
|
|
+ if (tb[IPSET_ATTR_CIDR]) {
|
|
|
e.cidr[0] = nla_get_u8(tb[IPSET_ATTR_CIDR]);
|
|
|
+ if (!e.cidr[0] || e.cidr[0] > HOST_MASK)
|
|
|
+ return -IPSET_ERR_INVALID_CIDR;
|
|
|
+ }
|
|
|
|
|
|
- if (tb[IPSET_ATTR_CIDR2])
|
|
|
+ if (tb[IPSET_ATTR_CIDR2]) {
|
|
|
e.cidr[1] = nla_get_u8(tb[IPSET_ATTR_CIDR2]);
|
|
|
-
|
|
|
- if (unlikely(!e.cidr[0] || e.cidr[0] > HOST_MASK || !e.cidr[1] ||
|
|
|
- e.cidr[1] > HOST_MASK))
|
|
|
- return -IPSET_ERR_INVALID_CIDR;
|
|
|
+ if (!e.cidr[1] || e.cidr[1] > HOST_MASK)
|
|
|
+ return -IPSET_ERR_INVALID_CIDR;
|
|
|
+ }
|
|
|
|
|
|
ip6_netmask(&e.ip[0], e.cidr[0]);
|
|
|
ip6_netmask(&e.ip[1], e.cidr[1]);
|