diff options
Diffstat (limited to 'net/core/rtnetlink.c')
| -rw-r--r-- | net/core/rtnetlink.c | 10 | 
1 files changed, 6 insertions, 4 deletions
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index a585d45cc9d..23854b51a25 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c @@ -496,8 +496,10 @@ static int rtnl_link_fill(struct sk_buff *skb, const struct net_device *dev)  	}  	if (ops->fill_info) {  		data = nla_nest_start(skb, IFLA_INFO_DATA); -		if (data == NULL) +		if (data == NULL) { +			err = -EMSGSIZE;  			goto err_cancel_link; +		}  		err = ops->fill_info(skb, dev);  		if (err < 0)  			goto err_cancel_data; @@ -1070,7 +1072,7 @@ static int rtnl_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb)  	rcu_read_lock();  	cb->seq = net->dev_base_seq; -	if (nlmsg_parse(cb->nlh, sizeof(struct rtgenmsg), tb, IFLA_MAX, +	if (nlmsg_parse(cb->nlh, sizeof(struct ifinfomsg), tb, IFLA_MAX,  			ifla_policy) >= 0) {  		if (tb[IFLA_EXT_MASK]) @@ -1920,7 +1922,7 @@ static u16 rtnl_calcit(struct sk_buff *skb, struct nlmsghdr *nlh)  	u32 ext_filter_mask = 0;  	u16 min_ifinfo_dump_size = 0; -	if (nlmsg_parse(nlh, sizeof(struct rtgenmsg), tb, IFLA_MAX, +	if (nlmsg_parse(nlh, sizeof(struct ifinfomsg), tb, IFLA_MAX,  			ifla_policy) >= 0) {  		if (tb[IFLA_EXT_MASK])  			ext_filter_mask = nla_get_u32(tb[IFLA_EXT_MASK]); @@ -2621,7 +2623,7 @@ static int rtnetlink_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)  		struct rtattr *attr = (void *)nlh + NLMSG_ALIGN(min_len);  		while (RTA_OK(attr, attrlen)) { -			unsigned int flavor = attr->rta_type; +			unsigned int flavor = attr->rta_type & NLA_TYPE_MASK;  			if (flavor) {  				if (flavor > rta_max[sz_idx])  					return -EINVAL;  |