|
@@ -850,6 +850,7 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev,
|
|
|
struct nlattr *attr, *af_spec;
|
|
|
struct rtnl_af_ops *af_ops;
|
|
|
|
|
|
+ ASSERT_RTNL();
|
|
|
nlh = nlmsg_put(skb, pid, seq, type, sizeof(*ifm), flags);
|
|
|
if (nlh == NULL)
|
|
|
return -EMSGSIZE;
|
|
@@ -1876,6 +1877,7 @@ static int rtnetlink_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
|
|
|
int min_len;
|
|
|
int family;
|
|
|
int type;
|
|
|
+ int err;
|
|
|
|
|
|
type = nlh->nlmsg_type;
|
|
|
if (type > RTM_MAX)
|
|
@@ -1902,8 +1904,11 @@ static int rtnetlink_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
|
|
|
if (dumpit == NULL)
|
|
|
return -EOPNOTSUPP;
|
|
|
|
|
|
+ __rtnl_unlock();
|
|
|
rtnl = net->rtnl;
|
|
|
- return netlink_dump_start(rtnl, skb, nlh, dumpit, NULL);
|
|
|
+ err = netlink_dump_start(rtnl, skb, nlh, dumpit, NULL);
|
|
|
+ rtnl_lock();
|
|
|
+ return err;
|
|
|
}
|
|
|
|
|
|
memset(rta_buf, 0, (rtattr_max * sizeof(struct rtattr *)));
|
|
@@ -1975,7 +1980,7 @@ static int __net_init rtnetlink_net_init(struct net *net)
|
|
|
{
|
|
|
struct sock *sk;
|
|
|
sk = netlink_kernel_create(net, NETLINK_ROUTE, RTNLGRP_MAX,
|
|
|
- rtnetlink_rcv, NULL, THIS_MODULE);
|
|
|
+ rtnetlink_rcv, &rtnl_mutex, THIS_MODULE);
|
|
|
if (!sk)
|
|
|
return -ENOMEM;
|
|
|
net->rtnl = sk;
|