net: tipc: allocate attrs locally instead of using genl_family_attrbuf in compat_dumpit()

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>
This commit is contained in:
Jiri Pirko
2019-10-05 20:04:40 +02:00
committed by David S. Miller
parent 057af70713
commit c6c08614eb
3 changed files with 15 additions and 17 deletions

View 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);