diff options
Diffstat (limited to 'net/netlink/af_netlink.c')
| -rw-r--r-- | net/netlink/af_netlink.c | 9 | 
1 files changed, 8 insertions, 1 deletions
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index 1189b84413d5..56704d95f82d 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c @@ -63,6 +63,7 @@  #include <linux/hash.h>  #include <linux/genetlink.h>  #include <linux/net_namespace.h> +#include <linux/nospec.h>  #include <net/net_namespace.h>  #include <net/netns/generic.h> @@ -679,6 +680,7 @@ static int netlink_create(struct net *net, struct socket *sock, int protocol,  	if (protocol < 0 || protocol >= MAX_LINKS)  		return -EPROTONOSUPPORT; +	protocol = array_index_nospec(protocol, MAX_LINKS);  	netlink_lock_table();  #ifdef CONFIG_MODULES @@ -1009,6 +1011,11 @@ static int netlink_bind(struct socket *sock, struct sockaddr *addr,  			return err;  	} +	if (nlk->ngroups == 0) +		groups = 0; +	else if (nlk->ngroups < 8*sizeof(groups)) +		groups &= (1UL << nlk->ngroups) - 1; +  	bound = nlk->bound;  	if (bound) {  		/* Ensure nlk->portid is up-to-date. */ @@ -2658,7 +2665,7 @@ static const struct proto_ops netlink_ops = {  	.socketpair =	sock_no_socketpair,  	.accept =	sock_no_accept,  	.getname =	netlink_getname, -	.poll_mask =	datagram_poll_mask, +	.poll =		datagram_poll,  	.ioctl =	netlink_ioctl,  	.listen =	sock_no_listen,  	.shutdown =	sock_no_shutdown,  | 
