OSDN Git Service

net: tipc: allocate attrs locally instead of using genl_family_attrbuf in compat_dumpit()
authorJiri Pirko <jiri@mellanox.com>
Sat, 5 Oct 2019 18:04:40 +0000 (20:04 +0200)
committerDavid S. Miller <davem@davemloft.net>
Sun, 6 Oct 2019 13:44:47 +0000 (15:44 +0200)
As this is the last user of genl_family_attrbuf, convert to allocate
attrs locally and do it in a similar way this is done in compat_doit().

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/tipc/netlink.c
net/tipc/netlink.h
net/tipc/netlink_compat.c

index 5f5df23..d32bbd0 100644 (file)
@@ -271,18 +271,6 @@ struct genl_family tipc_genl_family __ro_after_init = {
        .n_ops          = ARRAY_SIZE(tipc_genl_v2_ops),
 };
 
-int tipc_nlmsg_parse(const struct nlmsghdr *nlh, struct nlattr ***attr)
-{
-       u32 maxattr = tipc_genl_family.maxattr;
-
-       *attr = genl_family_attrbuf(&tipc_genl_family);
-       if (!*attr)
-               return -EOPNOTSUPP;
-
-       return nlmsg_parse_deprecated(nlh, GENL_HDRLEN, *attr, maxattr,
-                                     tipc_nl_policy, NULL);
-}
-
 int __init tipc_netlink_start(void)
 {
        int res;
index 4ba0ad4..7cf7777 100644 (file)
@@ -38,7 +38,6 @@
 #include <net/netlink.h>
 
 extern struct genl_family tipc_genl_family;
-int tipc_nlmsg_parse(const struct nlmsghdr *nlh, struct nlattr ***buf);
 
 struct tipc_nl_msg {
        struct sk_buff *skb;
index e135d4e..4950b75 100644 (file)
@@ -186,6 +186,7 @@ static int __tipc_nl_compat_dumpit(struct tipc_nl_compat_cmd_dump *cmd,
        struct sk_buff *buf;
        struct nlmsghdr *nlmsg;
        struct netlink_callback cb;
+       struct nlattr **attrbuf;
 
        memset(&cb, 0, sizeof(cb));
        cb.nlh = (struct nlmsghdr *)arg->data;
@@ -201,19 +202,28 @@ static int __tipc_nl_compat_dumpit(struct tipc_nl_compat_cmd_dump *cmd,
                return -ENOMEM;
        }
 
+       attrbuf = kmalloc_array(tipc_genl_family.maxattr + 1,
+                               sizeof(struct nlattr *), GFP_KERNEL);
+       if (!attrbuf) {
+               err = -ENOMEM;
+               goto err_out;
+       }
+
        do {
                int rem;
 
                len = (*cmd->dumpit)(buf, &cb);
 
                nlmsg_for_each_msg(nlmsg, nlmsg_hdr(buf), len, rem) {
-                       struct nlattr **attrs;
-
-                       err = tipc_nlmsg_parse(nlmsg, &attrs);
+                       err = nlmsg_parse_deprecated(nlmsg, GENL_HDRLEN,
+                                                    attrbuf,
+                                                    tipc_genl_family.maxattr,
+                                                    tipc_genl_family.policy,
+                                                    NULL);
                        if (err)
                                goto err_out;
 
-                       err = (*cmd->format)(msg, attrs);
+                       err = (*cmd->format)(msg, attrbuf);
                        if (err)
                                goto err_out;
 
@@ -231,6 +241,7 @@ static int __tipc_nl_compat_dumpit(struct tipc_nl_compat_cmd_dump *cmd,
        err = 0;
 
 err_out:
+       kfree(attrbuf);
        tipc_dump_done(&cb);
        kfree_skb(buf);