Message ID | 20210225232628.4033281-1-arjunroy.kdev@gmail.com |
---|---|
State | New |
Headers | show |
Series | [net] tcp: Fix sign comparison bug in getsockopt(TCP_ZEROCOPY_RECEIVE) | expand |
Hello: This patch was applied to netdev/net.git (refs/heads/master): On Thu, 25 Feb 2021 15:26:28 -0800 you wrote: > From: Arjun Roy <arjunroy@google.com> > > getsockopt(TCP_ZEROCOPY_RECEIVE) has a bug where we read a > user-provided "len" field of type signed int, and then compare the > value to the result of an "offsetofend" operation, which is unsigned. > > Negative values provided by the user will be promoted to large > positive numbers; thus checking that len < offsetofend() will return > false when the intention was that it return true. > > [...] Here is the summary with links: - [net] tcp: Fix sign comparison bug in getsockopt(TCP_ZEROCOPY_RECEIVE) https://git.kernel.org/netdev/net/c/2107d45f17be You are awesome, thank you! -- Deet-doot-dot, I am a bot. https://korg.docs.kernel.org/patchwork/pwbot.html
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index a3422e42784e..dfb6f286c1de 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c @@ -4143,7 +4143,8 @@ static int do_tcp_getsockopt(struct sock *sk, int level, if (get_user(len, optlen)) return -EFAULT; - if (len < offsetofend(struct tcp_zerocopy_receive, length)) + if (len < 0 || + len < offsetofend(struct tcp_zerocopy_receive, length)) return -EINVAL; if (unlikely(len > sizeof(zc))) { err = check_zeroed_user(optval + sizeof(zc),