forked from mirrors/linux
		
	net: ipv6: addr: perform strict checks also for doit handlers
Make RTM_GETADDR's doit handler use strict checks when NETLINK_F_STRICT_CHK is set. Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									d044002983
								
							
						
					
					
						commit
						4b1373de73
					
				
					 1 changed files with 47 additions and 2 deletions
				
			
		| 
						 | 
				
			
			@ -5179,6 +5179,52 @@ static int inet6_dump_ifacaddr(struct sk_buff *skb, struct netlink_callback *cb)
 | 
			
		|||
	return inet6_dump_addr(skb, cb, type);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int inet6_rtm_valid_getaddr_req(struct sk_buff *skb,
 | 
			
		||||
				       const struct nlmsghdr *nlh,
 | 
			
		||||
				       struct nlattr **tb,
 | 
			
		||||
				       struct netlink_ext_ack *extack)
 | 
			
		||||
{
 | 
			
		||||
	struct ifaddrmsg *ifm;
 | 
			
		||||
	int i, err;
 | 
			
		||||
 | 
			
		||||
	if (nlh->nlmsg_len < nlmsg_msg_size(sizeof(*ifm))) {
 | 
			
		||||
		NL_SET_ERR_MSG_MOD(extack, "Invalid header for get address request");
 | 
			
		||||
		return -EINVAL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ifm = nlmsg_data(nlh);
 | 
			
		||||
	if (ifm->ifa_prefixlen || ifm->ifa_flags || ifm->ifa_scope) {
 | 
			
		||||
		NL_SET_ERR_MSG_MOD(extack, "Invalid values in header for get address request");
 | 
			
		||||
		return -EINVAL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (!netlink_strict_get_check(skb))
 | 
			
		||||
		return nlmsg_parse(nlh, sizeof(*ifm), tb, IFA_MAX,
 | 
			
		||||
				   ifa_ipv6_policy, extack);
 | 
			
		||||
 | 
			
		||||
	err = nlmsg_parse_strict(nlh, sizeof(*ifm), tb, IFA_MAX,
 | 
			
		||||
				 ifa_ipv6_policy, extack);
 | 
			
		||||
	if (err)
 | 
			
		||||
		return err;
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i <= IFA_MAX; i++) {
 | 
			
		||||
		if (!tb[i])
 | 
			
		||||
			continue;
 | 
			
		||||
 | 
			
		||||
		switch (i) {
 | 
			
		||||
		case IFA_TARGET_NETNSID:
 | 
			
		||||
		case IFA_ADDRESS:
 | 
			
		||||
		case IFA_LOCAL:
 | 
			
		||||
			break;
 | 
			
		||||
		default:
 | 
			
		||||
			NL_SET_ERR_MSG_MOD(extack, "Unsupported attribute in get address request");
 | 
			
		||||
			return -EINVAL;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int inet6_rtm_getaddr(struct sk_buff *in_skb, struct nlmsghdr *nlh,
 | 
			
		||||
			     struct netlink_ext_ack *extack)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -5199,8 +5245,7 @@ static int inet6_rtm_getaddr(struct sk_buff *in_skb, struct nlmsghdr *nlh,
 | 
			
		|||
	struct sk_buff *skb;
 | 
			
		||||
	int err;
 | 
			
		||||
 | 
			
		||||
	err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFA_MAX, ifa_ipv6_policy,
 | 
			
		||||
			  extack);
 | 
			
		||||
	err = inet6_rtm_valid_getaddr_req(in_skb, nlh, tb, extack);
 | 
			
		||||
	if (err < 0)
 | 
			
		||||
		return err;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue