Commit c68c7722 authored by Dmitry Safonov's avatar Dmitry Safonov Committed by Greg Kroah-Hartman

netlink: Don't shift on 64 for ngroups

commit 91874ecf upstream.

It's legal to have 64 groups for netlink_sock.

As user-supplied nladdr->nl_groups is __u32, it's possible to subscribe
only to first 32 groups.

The check for correctness of .bind() userspace supplied parameter
is done by applying mask made from ngroups shift. Which broke Android
as they have 64 groups and the shift for mask resulted in an overflow.

Fixes: 61f4b237 ("netlink: Don't shift with UB on nlk->ngroups")
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Herbert Xu <herbert@gondor.apana.org.au>
Cc: Steffen Klassert <steffen.klassert@secunet.com>
Cc: netdev@vger.kernel.org
Cc: stable@vger.kernel.org
Reported-and-Tested-by: default avatarNathan Chancellor <natechancellor@gmail.com>
Signed-off-by: default avatarDmitry Safonov <dima@arista.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 4d502572
...@@ -988,8 +988,8 @@ static int netlink_bind(struct socket *sock, struct sockaddr *addr, ...@@ -988,8 +988,8 @@ static int netlink_bind(struct socket *sock, struct sockaddr *addr,
if (nlk->ngroups == 0) if (nlk->ngroups == 0)
groups = 0; groups = 0;
else else if (nlk->ngroups < 8*sizeof(groups))
groups &= (1ULL << nlk->ngroups) - 1; groups &= (1UL << nlk->ngroups) - 1;
bound = nlk->bound; bound = nlk->bound;
if (bound) { if (bound) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment