diff options
Diffstat (limited to 'net/phonet/pn_netlink.c')
| -rw-r--r-- | net/phonet/pn_netlink.c | 20 | 
1 files changed, 9 insertions, 11 deletions
| diff --git a/net/phonet/pn_netlink.c b/net/phonet/pn_netlink.c index b64151ade6b3..bc5ee5fbe6ae 100644 --- a/net/phonet/pn_netlink.c +++ b/net/phonet/pn_netlink.c @@ -121,7 +121,8 @@ static int fill_addr(struct sk_buff *skb, struct net_device *dev, u8 addr,  	ifm->ifa_index = dev->ifindex;  	if (nla_put_u8(skb, IFA_LOCAL, addr))  		goto nla_put_failure; -	return nlmsg_end(skb, nlh); +	nlmsg_end(skb, nlh); +	return 0;  nla_put_failure:  	nlmsg_cancel(skb, nlh); @@ -190,7 +191,8 @@ static int fill_route(struct sk_buff *skb, struct net_device *dev, u8 dst,  	if (nla_put_u8(skb, RTA_DST, dst) ||  	    nla_put_u32(skb, RTA_OIF, dev->ifindex))  		goto nla_put_failure; -	return nlmsg_end(skb, nlh); +	nlmsg_end(skb, nlh); +	return 0;  nla_put_failure:  	nlmsg_cancel(skb, nlh); @@ -270,27 +272,23 @@ static int route_doit(struct sk_buff *skb, struct nlmsghdr *nlh)  static int route_dumpit(struct sk_buff *skb, struct netlink_callback *cb)  {  	struct net *net = sock_net(skb->sk); -	u8 addr, addr_idx = 0, addr_start_idx = cb->args[0]; +	u8 addr;  	rcu_read_lock(); -	for (addr = 0; addr < 64; addr++) { -		struct net_device *dev; +	for (addr = cb->args[0]; addr < 64; addr++) { +		struct net_device *dev = phonet_route_get_rcu(net, addr << 2); -		dev = phonet_route_get_rcu(net, addr << 2);  		if (!dev)  			continue; -		if (addr_idx++ < addr_start_idx) -			continue;  		if (fill_route(skb, dev, addr << 2, NETLINK_CB(cb->skb).portid, -				cb->nlh->nlmsg_seq, RTM_NEWROUTE)) +			       cb->nlh->nlmsg_seq, RTM_NEWROUTE) < 0)  			goto out;  	}  out:  	rcu_read_unlock(); -	cb->args[0] = addr_idx; -	cb->args[1] = 0; +	cb->args[0] = addr;  	return skb->len;  } |