diff options
author | Peter Oskolkov <posk@google.com> | 2019-01-16 19:47:54 +0300 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2019-02-27 12:08:57 +0300 |
commit | 8b92162f4e8b4d4d1a3ad43659e4bd09b3d0a7fb (patch) | |
tree | 8801526930d69d2dd561d5ffccbd4e0de1216394 /net/core | |
parent | 0761f58c62d70742a20d7a9ee0dfaf8a7eed1e9e (diff) | |
download | linux-8b92162f4e8b4d4d1a3ad43659e4bd09b3d0a7fb.tar.xz |
bpf: bpf_setsockopt: reset sock dst on SO_MARK changes
[ Upstream commit f4924f24da8c7ef64195096817f3cde324091d97 ]
In sock_setsockopt() (net/core/sock.h), when SO_MARK option is used
to change sk_mark, sk_dst_reset(sk) is called. The same should be
done in bpf_setsockopt().
Fixes: 8c4b4c7e9ff0 ("bpf: Add setsockopt helper function to bpf")
Reported-by: Maciej Żenczykowski <maze@google.com>
Signed-off-by: Peter Oskolkov <posk@google.com>
Acked-by: Martin KaFai Lau <kafai@fb.com>
Reviewed-by: Maciej Żenczykowski <maze@google.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
Diffstat (limited to 'net/core')
-rw-r--r-- | net/core/filter.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/net/core/filter.c b/net/core/filter.c index 3400c7abda13..fb0080e84bd4 100644 --- a/net/core/filter.c +++ b/net/core/filter.c @@ -3930,7 +3930,10 @@ BPF_CALL_5(bpf_setsockopt, struct bpf_sock_ops_kern *, bpf_sock, sk->sk_rcvlowat = val ? : 1; break; case SO_MARK: - sk->sk_mark = val; + if (sk->sk_mark != val) { + sk->sk_mark = val; + sk_dst_reset(sk); + } break; default: ret = -EINVAL; |