Commit e200bd80 authored by Jamal Hadi Salim's avatar Jamal Hadi Salim Committed by David S. Miller

[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: default avatarJamal Hadi Salim <hadi@cyberus.ca>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 178a3259
...@@ -238,7 +238,7 @@ int genl_register_family(struct genl_family *family) ...@@ -238,7 +238,7 @@ int genl_register_family(struct genl_family *family)
sizeof(struct nlattr *), GFP_KERNEL); sizeof(struct nlattr *), GFP_KERNEL);
if (family->attrbuf == NULL) { if (family->attrbuf == NULL) {
err = -ENOMEM; err = -ENOMEM;
goto errout; goto errout_locked;
} }
} else } else
family->attrbuf = NULL; family->attrbuf = NULL;
...@@ -288,7 +288,7 @@ int genl_unregister_family(struct genl_family *family) ...@@ -288,7 +288,7 @@ int genl_unregister_family(struct genl_family *family)
return -ENOENT; return -ENOENT;
} }
static inline int genl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, static int genl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh,
int *errp) int *errp)
{ {
struct genl_ops *ops; struct genl_ops *ops;
...@@ -375,7 +375,7 @@ static void genl_rcv(struct sock *sk, int len) ...@@ -375,7 +375,7 @@ static void genl_rcv(struct sock *sk, int len)
do { do {
if (genl_trylock()) if (genl_trylock())
return; return;
netlink_run_queue(sk, &qlen, &genl_rcv_msg); netlink_run_queue(sk, &qlen, genl_rcv_msg);
genl_unlock(); genl_unlock();
} while (qlen && genl_sock && genl_sock->sk_receive_queue.qlen); } while (qlen && genl_sock && genl_sock->sk_receive_queue.qlen);
} }
...@@ -549,10 +549,8 @@ static int __init genl_init(void) ...@@ -549,10 +549,8 @@ static int __init genl_init(void)
netlink_set_nonroot(NETLINK_GENERIC, NL_NONROOT_RECV); netlink_set_nonroot(NETLINK_GENERIC, NL_NONROOT_RECV);
genl_sock = netlink_kernel_create(NETLINK_GENERIC, GENL_MAX_ID, genl_sock = netlink_kernel_create(NETLINK_GENERIC, GENL_MAX_ID,
genl_rcv, THIS_MODULE); genl_rcv, THIS_MODULE);
if (genl_sock == NULL) { if (genl_sock == NULL)
panic("GENL: Cannot initialize generic netlink\n"); panic("GENL: Cannot initialize generic netlink\n");
return -ENOMEM;
}
return 0; return 0;
...@@ -560,7 +558,6 @@ errout_register: ...@@ -560,7 +558,6 @@ errout_register:
genl_unregister_family(&genl_ctrl); genl_unregister_family(&genl_ctrl);
errout: errout:
panic("GENL: Cannot register controller: %d\n", err); panic("GENL: Cannot register controller: %d\n", err);
return err;
} }
subsys_initcall(genl_init); subsys_initcall(genl_init);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment