Commit e94ef682053a6eeca91aefdaecf8efe7fd7e33a5

Authored by Thomas Graf
Committed by David S. Miller
1 parent cdbc6dae5c

[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