]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
netfilter: ipset: merge uadd and udel functions
authorFlorent Fourcot <florent.fourcot@wifirst.fr>
Mon, 10 Jun 2019 10:42:56 +0000 (12:42 +0200)
committerJozsef Kadlecsik <kadlec@blackhole.kfki.hu>
Mon, 10 Jun 2019 10:42:56 +0000 (12:42 +0200)
Both functions are using exactly the same code, except the command value
passed to call_ad function.

Signed-off-by: Florent Fourcot <florent.fourcot@wifirst.fr>
Signed-off-by: Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>
net/netfilter/ipset/ip_set_core.c

index faddcf398b73c4bbf2b74bde54b2893b375cdd33..2ad609900b22eee6ffe52fa2b083ff47e17a205f 100644 (file)
@@ -1561,10 +1561,12 @@ call_ad(struct sock *ctnl, struct sk_buff *skb, struct ip_set *set,
        return ret;
 }
 
-static int ip_set_uadd(struct net *net, struct sock *ctnl, struct sk_buff *skb,
-                      const struct nlmsghdr *nlh,
-                      const struct nlattr * const attr[],
-                      struct netlink_ext_ack *extack)
+static int ip_set_ad(struct net *net, struct sock *ctnl,
+                    struct sk_buff *skb,
+                    enum ipset_adt adt,
+                    const struct nlmsghdr *nlh,
+                    const struct nlattr * const attr[],
+                    struct netlink_ext_ack *extack)
 {
        struct ip_set_net *inst = ip_set_pernet(net);
        struct ip_set *set;
@@ -1593,7 +1595,7 @@ static int ip_set_uadd(struct net *net, struct sock *ctnl, struct sk_buff *skb,
        if (attr[IPSET_ATTR_DATA]) {
                if (nla_parse_nested_deprecated(tb, IPSET_ATTR_ADT_MAX, attr[IPSET_ATTR_DATA], set->type->adt_policy, NULL))
                        return -IPSET_ERR_PROTOCOL;
-               ret = call_ad(ctnl, skb, set, tb, IPSET_ADD, flags,
+               ret = call_ad(ctnl, skb, set, tb, adt, flags,
                              use_lineno);
        } else {
                int nla_rem;
@@ -1603,7 +1605,7 @@ static int ip_set_uadd(struct net *net, struct sock *ctnl, struct sk_buff *skb,
                            !flag_nested(nla) ||
                            nla_parse_nested_deprecated(tb, IPSET_ATTR_ADT_MAX, nla, set->type->adt_policy, NULL))
                                return -IPSET_ERR_PROTOCOL;
-                       ret = call_ad(ctnl, skb, set, tb, IPSET_ADD,
+                       ret = call_ad(ctnl, skb, set, tb, adt,
                                      flags, use_lineno);
                        if (ret < 0)
                                return ret;
@@ -1612,55 +1614,22 @@ static int ip_set_uadd(struct net *net, struct sock *ctnl, struct sk_buff *skb,
        return ret;
 }
 
-static int ip_set_udel(struct net *net, struct sock *ctnl, struct sk_buff *skb,
-                      const struct nlmsghdr *nlh,
+static int ip_set_uadd(struct net *net, struct sock *ctnl,
+                      struct sk_buff *skb, const struct nlmsghdr *nlh,
                       const struct nlattr * const attr[],
                       struct netlink_ext_ack *extack)
 {
-       struct ip_set_net *inst = ip_set_pernet(net);
-       struct ip_set *set;
-       struct nlattr *tb[IPSET_ATTR_ADT_MAX + 1] = {};
-       const struct nlattr *nla;
-       u32 flags = flag_exist(nlh);
-       bool use_lineno;
-       int ret = 0;
-
-       if (unlikely(protocol_min_failed(attr) ||
-                    !attr[IPSET_ATTR_SETNAME] ||
-                    !((attr[IPSET_ATTR_DATA] != NULL) ^
-                      (attr[IPSET_ATTR_ADT] != NULL)) ||
-                    (attr[IPSET_ATTR_DATA] &&
-                     !flag_nested(attr[IPSET_ATTR_DATA])) ||
-                    (attr[IPSET_ATTR_ADT] &&
-                     (!flag_nested(attr[IPSET_ATTR_ADT]) ||
-                      !attr[IPSET_ATTR_LINENO]))))
-               return -IPSET_ERR_PROTOCOL;
-
-       set = find_set(inst, nla_data(attr[IPSET_ATTR_SETNAME]));
-       if (!set)
-               return -ENOENT;
-
-       use_lineno = !!attr[IPSET_ATTR_LINENO];
-       if (attr[IPSET_ATTR_DATA]) {
-               if (nla_parse_nested_deprecated(tb, IPSET_ATTR_ADT_MAX, attr[IPSET_ATTR_DATA], set->type->adt_policy, NULL))
-                       return -IPSET_ERR_PROTOCOL;
-               ret = call_ad(ctnl, skb, set, tb, IPSET_DEL, flags,
-                             use_lineno);
-       } else {
-               int nla_rem;
+       return ip_set_ad(net, ctnl, skb,
+                        IPSET_ADD, nlh, attr, extack);
+}
 
-               nla_for_each_nested(nla, attr[IPSET_ATTR_ADT], nla_rem) {
-                       if (nla_type(nla) != IPSET_ATTR_DATA ||
-                           !flag_nested(nla) ||
-                           nla_parse_nested_deprecated(tb, IPSET_ATTR_ADT_MAX, nla, set->type->adt_policy, NULL))
-                               return -IPSET_ERR_PROTOCOL;
-                       ret = call_ad(ctnl, skb, set, tb, IPSET_DEL,
-                                     flags, use_lineno);
-                       if (ret < 0)
-                               return ret;
-               }
-       }
-       return ret;
+static int ip_set_udel(struct net *net, struct sock *ctnl,
+                      struct sk_buff *skb, const struct nlmsghdr *nlh,
+                      const struct nlattr * const attr[],
+                      struct netlink_ext_ack *extack)
+{
+       return ip_set_ad(net, ctnl, skb,
+                        IPSET_DEL, nlh, attr, extack);
 }
 
 static int ip_set_utest(struct net *net, struct sock *ctnl, struct sk_buff *skb,