Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c7a99af4 authored by Kuniyuki Iwashima's avatar Kuniyuki Iwashima Committed by Greg Kroah-Hartman
Browse files

bpf: Fix SO_RCVBUF/SO_SNDBUF handling in _bpf_setsockopt().



[ Upstream commit 04c350b1ae6bdb12b84009a4d0bf5ab4e621c47b ]

The commit 4057765f ("sock: consistent handling of extreme
SO_SNDBUF/SO_RCVBUF values") added a change to prevent underflow
in setsockopt() around SO_SNDBUF/SO_RCVBUF.

This patch adds the same change to _bpf_setsockopt().

Fixes: 4057765f ("sock: consistent handling of extreme SO_SNDBUF/SO_RCVBUF values")
Signed-off-by: default avatarKuniyuki Iwashima <kuniyu@amazon.co.jp>
Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
Link: https://lore.kernel.org/bpf/20220104013153.97906-2-kuniyu@amazon.co.jp


Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent 4e830720
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -4248,12 +4248,14 @@ BPF_CALL_5(bpf_setsockopt, struct bpf_sock_ops_kern *, bpf_sock,
		switch (optname) {
		case SO_RCVBUF:
			val = min_t(u32, val, sysctl_rmem_max);
			val = min_t(int, val, INT_MAX / 2);
			sk->sk_userlocks |= SOCK_RCVBUF_LOCK;
			WRITE_ONCE(sk->sk_rcvbuf,
				   max_t(int, val * 2, SOCK_MIN_RCVBUF));
			break;
		case SO_SNDBUF:
			val = min_t(u32, val, sysctl_wmem_max);
			val = min_t(int, val, INT_MAX / 2);
			sk->sk_userlocks |= SOCK_SNDBUF_LOCK;
			WRITE_ONCE(sk->sk_sndbuf,
				   max_t(int, val * 2, SOCK_MIN_SNDBUF));