|
@@ -1141,8 +1141,8 @@ static int netlink_create(struct net *net, struct socket *sock, int protocol,
|
|
|
struct module *module = NULL;
|
|
|
struct mutex *cb_mutex;
|
|
|
struct netlink_sock *nlk;
|
|
|
- int (*bind)(int group);
|
|
|
- void (*unbind)(int group);
|
|
|
+ int (*bind)(struct net *net, int group);
|
|
|
+ void (*unbind)(struct net *net, int group);
|
|
|
int err = 0;
|
|
|
|
|
|
sock->state = SS_UNCONNECTED;
|
|
@@ -1251,7 +1251,7 @@ static int netlink_release(struct socket *sock)
|
|
|
|
|
|
for (i = 0; i < nlk->ngroups; i++)
|
|
|
if (test_bit(i, nlk->groups))
|
|
|
- nlk->netlink_unbind(i + 1);
|
|
|
+ nlk->netlink_unbind(sock_net(sk), i + 1);
|
|
|
}
|
|
|
kfree(nlk->groups);
|
|
|
nlk->groups = NULL;
|
|
@@ -1418,8 +1418,9 @@ static int netlink_realloc_groups(struct sock *sk)
|
|
|
}
|
|
|
|
|
|
static void netlink_undo_bind(int group, long unsigned int groups,
|
|
|
- struct netlink_sock *nlk)
|
|
|
+ struct sock *sk)
|
|
|
{
|
|
|
+ struct netlink_sock *nlk = nlk_sk(sk);
|
|
|
int undo;
|
|
|
|
|
|
if (!nlk->netlink_unbind)
|
|
@@ -1427,7 +1428,7 @@ static void netlink_undo_bind(int group, long unsigned int groups,
|
|
|
|
|
|
for (undo = 0; undo < group; undo++)
|
|
|
if (test_bit(undo, &groups))
|
|
|
- nlk->netlink_unbind(undo);
|
|
|
+ nlk->netlink_unbind(sock_net(sk), undo);
|
|
|
}
|
|
|
|
|
|
static int netlink_bind(struct socket *sock, struct sockaddr *addr,
|
|
@@ -1465,10 +1466,10 @@ static int netlink_bind(struct socket *sock, struct sockaddr *addr,
|
|
|
for (group = 0; group < nlk->ngroups; group++) {
|
|
|
if (!test_bit(group, &groups))
|
|
|
continue;
|
|
|
- err = nlk->netlink_bind(group);
|
|
|
+ err = nlk->netlink_bind(net, group);
|
|
|
if (!err)
|
|
|
continue;
|
|
|
- netlink_undo_bind(group, groups, nlk);
|
|
|
+ netlink_undo_bind(group, groups, sk);
|
|
|
return err;
|
|
|
}
|
|
|
}
|
|
@@ -1478,7 +1479,7 @@ static int netlink_bind(struct socket *sock, struct sockaddr *addr,
|
|
|
netlink_insert(sk, net, nladdr->nl_pid) :
|
|
|
netlink_autobind(sock);
|
|
|
if (err) {
|
|
|
- netlink_undo_bind(nlk->ngroups, groups, nlk);
|
|
|
+ netlink_undo_bind(nlk->ngroups, groups, sk);
|
|
|
return err;
|
|
|
}
|
|
|
}
|
|
@@ -2129,7 +2130,7 @@ static int netlink_setsockopt(struct socket *sock, int level, int optname,
|
|
|
if (!val || val - 1 >= nlk->ngroups)
|
|
|
return -EINVAL;
|
|
|
if (optname == NETLINK_ADD_MEMBERSHIP && nlk->netlink_bind) {
|
|
|
- err = nlk->netlink_bind(val);
|
|
|
+ err = nlk->netlink_bind(sock_net(sk), val);
|
|
|
if (err)
|
|
|
return err;
|
|
|
}
|
|
@@ -2138,7 +2139,7 @@ static int netlink_setsockopt(struct socket *sock, int level, int optname,
|
|
|
optname == NETLINK_ADD_MEMBERSHIP);
|
|
|
netlink_table_ungrab();
|
|
|
if (optname == NETLINK_DROP_MEMBERSHIP && nlk->netlink_unbind)
|
|
|
- nlk->netlink_unbind(val);
|
|
|
+ nlk->netlink_unbind(sock_net(sk), val);
|
|
|
|
|
|
err = 0;
|
|
|
break;
|