mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-26 08:31:13 +00:00
[GENETLINK] ctrl: Avoid empty CTRL_ATTR_OPS attribute when dumping
Based on Jamal's patch but compiled and even tested. :-) Signed-off-by: Thomas Graf <tgraf@suug.ch> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
cdbc6dae5c
commit
e94ef68205
1 changed files with 25 additions and 22 deletions
|
@ -394,10 +394,7 @@ static struct genl_family genl_ctrl = {
|
||||||
static int ctrl_fill_info(struct genl_family *family, u32 pid, u32 seq,
|
static int ctrl_fill_info(struct genl_family *family, u32 pid, u32 seq,
|
||||||
u32 flags, struct sk_buff *skb, u8 cmd)
|
u32 flags, struct sk_buff *skb, u8 cmd)
|
||||||
{
|
{
|
||||||
struct nlattr *nla_ops;
|
|
||||||
struct genl_ops *ops;
|
|
||||||
void *hdr;
|
void *hdr;
|
||||||
int idx = 1;
|
|
||||||
|
|
||||||
hdr = genlmsg_put(skb, pid, seq, &genl_ctrl, flags, cmd);
|
hdr = genlmsg_put(skb, pid, seq, &genl_ctrl, flags, cmd);
|
||||||
if (hdr == NULL)
|
if (hdr == NULL)
|
||||||
|
@ -409,34 +406,40 @@ static int ctrl_fill_info(struct genl_family *family, u32 pid, u32 seq,
|
||||||
NLA_PUT_U32(skb, CTRL_ATTR_HDRSIZE, family->hdrsize);
|
NLA_PUT_U32(skb, CTRL_ATTR_HDRSIZE, family->hdrsize);
|
||||||
NLA_PUT_U32(skb, CTRL_ATTR_MAXATTR, family->maxattr);
|
NLA_PUT_U32(skb, CTRL_ATTR_MAXATTR, family->maxattr);
|
||||||
|
|
||||||
nla_ops = nla_nest_start(skb, CTRL_ATTR_OPS);
|
if (!list_empty(&family->ops_list)) {
|
||||||
if (nla_ops == NULL)
|
struct nlattr *nla_ops;
|
||||||
goto nla_put_failure;
|
struct genl_ops *ops;
|
||||||
|
int idx = 1;
|
||||||
|
|
||||||
list_for_each_entry(ops, &family->ops_list, ops_list) {
|
nla_ops = nla_nest_start(skb, CTRL_ATTR_OPS);
|
||||||
struct nlattr *nest;
|
if (nla_ops == NULL)
|
||||||
|
|
||||||
nest = nla_nest_start(skb, idx++);
|
|
||||||
if (nest == NULL)
|
|
||||||
goto nla_put_failure;
|
goto nla_put_failure;
|
||||||
|
|
||||||
NLA_PUT_U32(skb, CTRL_ATTR_OP_ID, ops->cmd);
|
list_for_each_entry(ops, &family->ops_list, ops_list) {
|
||||||
NLA_PUT_U32(skb, CTRL_ATTR_OP_FLAGS, ops->flags);
|
struct nlattr *nest;
|
||||||
|
|
||||||
if (ops->policy)
|
nest = nla_nest_start(skb, idx++);
|
||||||
NLA_PUT_FLAG(skb, CTRL_ATTR_OP_POLICY);
|
if (nest == NULL)
|
||||||
|
goto nla_put_failure;
|
||||||
|
|
||||||
if (ops->doit)
|
NLA_PUT_U32(skb, CTRL_ATTR_OP_ID, ops->cmd);
|
||||||
NLA_PUT_FLAG(skb, CTRL_ATTR_OP_DOIT);
|
NLA_PUT_U32(skb, CTRL_ATTR_OP_FLAGS, ops->flags);
|
||||||
|
|
||||||
if (ops->dumpit)
|
if (ops->policy)
|
||||||
NLA_PUT_FLAG(skb, CTRL_ATTR_OP_DUMPIT);
|
NLA_PUT_FLAG(skb, CTRL_ATTR_OP_POLICY);
|
||||||
|
|
||||||
nla_nest_end(skb, nest);
|
if (ops->doit)
|
||||||
|
NLA_PUT_FLAG(skb, CTRL_ATTR_OP_DOIT);
|
||||||
|
|
||||||
|
if (ops->dumpit)
|
||||||
|
NLA_PUT_FLAG(skb, CTRL_ATTR_OP_DUMPIT);
|
||||||
|
|
||||||
|
nla_nest_end(skb, nest);
|
||||||
|
}
|
||||||
|
|
||||||
|
nla_nest_end(skb, nla_ops);
|
||||||
}
|
}
|
||||||
|
|
||||||
nla_nest_end(skb, nla_ops);
|
|
||||||
|
|
||||||
return genlmsg_end(skb, hdr);
|
return genlmsg_end(skb, hdr);
|
||||||
|
|
||||||
nla_put_failure:
|
nla_put_failure:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue