Commit e94ef682053a6eeca91aefdaecf8efe7fd7e33a5
Committed by
David S. Miller
1 parent
cdbc6dae5c
Exists in
master
and in
4 other branches
[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>
Showing 1 changed file with 25 additions and 22 deletions Side-by-side Diff
net/netlink/genetlink.c
... | ... | @@ -394,10 +394,7 @@ |
394 | 394 | static int ctrl_fill_info(struct genl_family *family, u32 pid, u32 seq, |
395 | 395 | u32 flags, struct sk_buff *skb, u8 cmd) |
396 | 396 | { |
397 | - struct nlattr *nla_ops; | |
398 | - struct genl_ops *ops; | |
399 | 397 | void *hdr; |
400 | - int idx = 1; | |
401 | 398 | |
402 | 399 | hdr = genlmsg_put(skb, pid, seq, &genl_ctrl, flags, cmd); |
403 | 400 | if (hdr == NULL) |
404 | 401 | |
405 | 402 | |
406 | 403 | |
407 | 404 | |
408 | 405 | |
409 | 406 | |
410 | 407 | |
... | ... | @@ -409,33 +406,39 @@ |
409 | 406 | NLA_PUT_U32(skb, CTRL_ATTR_HDRSIZE, family->hdrsize); |
410 | 407 | NLA_PUT_U32(skb, CTRL_ATTR_MAXATTR, family->maxattr); |
411 | 408 | |
412 | - nla_ops = nla_nest_start(skb, CTRL_ATTR_OPS); | |
413 | - if (nla_ops == NULL) | |
414 | - goto nla_put_failure; | |
409 | + if (!list_empty(&family->ops_list)) { | |
410 | + struct nlattr *nla_ops; | |
411 | + struct genl_ops *ops; | |
412 | + int idx = 1; | |
415 | 413 | |
416 | - list_for_each_entry(ops, &family->ops_list, ops_list) { | |
417 | - struct nlattr *nest; | |
418 | - | |
419 | - nest = nla_nest_start(skb, idx++); | |
420 | - if (nest == NULL) | |
414 | + nla_ops = nla_nest_start(skb, CTRL_ATTR_OPS); | |
415 | + if (nla_ops == NULL) | |
421 | 416 | goto nla_put_failure; |
422 | 417 | |
423 | - NLA_PUT_U32(skb, CTRL_ATTR_OP_ID, ops->cmd); | |
424 | - NLA_PUT_U32(skb, CTRL_ATTR_OP_FLAGS, ops->flags); | |
418 | + list_for_each_entry(ops, &family->ops_list, ops_list) { | |
419 | + struct nlattr *nest; | |
425 | 420 | |
426 | - if (ops->policy) | |
427 | - NLA_PUT_FLAG(skb, CTRL_ATTR_OP_POLICY); | |
421 | + nest = nla_nest_start(skb, idx++); | |
422 | + if (nest == NULL) | |
423 | + goto nla_put_failure; | |
428 | 424 | |
429 | - if (ops->doit) | |
430 | - NLA_PUT_FLAG(skb, CTRL_ATTR_OP_DOIT); | |
425 | + NLA_PUT_U32(skb, CTRL_ATTR_OP_ID, ops->cmd); | |
426 | + NLA_PUT_U32(skb, CTRL_ATTR_OP_FLAGS, ops->flags); | |
431 | 427 | |
432 | - if (ops->dumpit) | |
433 | - NLA_PUT_FLAG(skb, CTRL_ATTR_OP_DUMPIT); | |
428 | + if (ops->policy) | |
429 | + NLA_PUT_FLAG(skb, CTRL_ATTR_OP_POLICY); | |
434 | 430 | |
435 | - nla_nest_end(skb, nest); | |
436 | - } | |
431 | + if (ops->doit) | |
432 | + NLA_PUT_FLAG(skb, CTRL_ATTR_OP_DOIT); | |
437 | 433 | |
438 | - nla_nest_end(skb, nla_ops); | |
434 | + if (ops->dumpit) | |
435 | + NLA_PUT_FLAG(skb, CTRL_ATTR_OP_DUMPIT); | |
436 | + | |
437 | + nla_nest_end(skb, nest); | |
438 | + } | |
439 | + | |
440 | + nla_nest_end(skb, nla_ops); | |
441 | + } | |
439 | 442 | |
440 | 443 | return genlmsg_end(skb, hdr); |
441 | 444 |