Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[NETLINK] genetlink: Fix bugs spotted by Andrew Morton.

- panic() doesn't return.

- Don't forget to unlock on genl_register_family() error path

- genl_rcv_msg() is called via pointer so there's no point in declaring it
`inline'.

Notes:

genl_ctrl_event() ignores the genlmsg_multicast() return value.

lots of things ignore the genl_ctrl_event() return value.

Signed-off-by: Jamal Hadi Salim <hadi@cyberus.ca>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Jamal Hadi Salim and committed by
David S. Miller
e200bd80 178a3259

+4 -7
+4 -7
net/netlink/genetlink.c
··· 238 238 sizeof(struct nlattr *), GFP_KERNEL); 239 239 if (family->attrbuf == NULL) { 240 240 err = -ENOMEM; 241 - goto errout; 241 + goto errout_locked; 242 242 } 243 243 } else 244 244 family->attrbuf = NULL; ··· 288 288 return -ENOENT; 289 289 } 290 290 291 - static inline int genl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, 291 + static int genl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, 292 292 int *errp) 293 293 { 294 294 struct genl_ops *ops; ··· 375 375 do { 376 376 if (genl_trylock()) 377 377 return; 378 - netlink_run_queue(sk, &qlen, &genl_rcv_msg); 378 + netlink_run_queue(sk, &qlen, genl_rcv_msg); 379 379 genl_unlock(); 380 380 } while (qlen && genl_sock && genl_sock->sk_receive_queue.qlen); 381 381 } ··· 549 549 netlink_set_nonroot(NETLINK_GENERIC, NL_NONROOT_RECV); 550 550 genl_sock = netlink_kernel_create(NETLINK_GENERIC, GENL_MAX_ID, 551 551 genl_rcv, THIS_MODULE); 552 - if (genl_sock == NULL) { 552 + if (genl_sock == NULL) 553 553 panic("GENL: Cannot initialize generic netlink\n"); 554 - return -ENOMEM; 555 - } 556 554 557 555 return 0; 558 556 ··· 558 560 genl_unregister_family(&genl_ctrl); 559 561 errout: 560 562 panic("GENL: Cannot register controller: %d\n", err); 561 - return err; 562 563 } 563 564 564 565 subsys_initcall(genl_init);