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);
 | 
						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,
 | 
					static int inet6_rtm_getaddr(struct sk_buff *in_skb, struct nlmsghdr *nlh,
 | 
				
			||||||
			     struct netlink_ext_ack *extack)
 | 
								     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;
 | 
						struct sk_buff *skb;
 | 
				
			||||||
	int err;
 | 
						int err;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFA_MAX, ifa_ipv6_policy,
 | 
						err = inet6_rtm_valid_getaddr_req(in_skb, nlh, tb, extack);
 | 
				
			||||||
			  extack);
 | 
					 | 
				
			||||||
	if (err < 0)
 | 
						if (err < 0)
 | 
				
			||||||
		return err;
 | 
							return err;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue