aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Aring <aahringo@redhat.com>2021-05-31 17:00:30 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2021-06-10 13:39:17 +0200
commita5de17bb916a7f5b2e5b35a7c961ebee6d95bb28 (patch)
tree2725fa3863a1a9f3d458450768d52789ebd6f6ce
parent09fdb6747b7ed3bc4da720301de52ac7b159214a (diff)
downloadkernel_replicant_linux-a5de17bb916a7f5b2e5b35a7c961ebee6d95bb28.tar.gz
kernel_replicant_linux-a5de17bb916a7f5b2e5b35a7c961ebee6d95bb28.tar.bz2
kernel_replicant_linux-a5de17bb916a7f5b2e5b35a7c961ebee6d95bb28.zip
net: sock: fix in-kernel mark setting
[ Upstream commit dd9082f4a9f94280fbbece641bf8fc0a25f71f7a ] This patch fixes the in-kernel mark setting by doing an additional sk_dst_reset() which was introduced by commit 50254256f382 ("sock: Reset dst when changing sk_mark via setsockopt"). The code is now shared to avoid any further suprises when changing the socket mark value. Fixes: 84d1c617402e ("net: sock: add sock_set_mark") Reported-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com> Signed-off-by: Alexander Aring <aahringo@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Sasha Levin <sashal@kernel.org>
-rw-r--r--net/core/sock.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/net/core/sock.c b/net/core/sock.c
index dee29f41beaf..7de51ea15cdf 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -807,10 +807,18 @@ void sock_set_rcvbuf(struct sock *sk, int val)
}
EXPORT_SYMBOL(sock_set_rcvbuf);
+static void __sock_set_mark(struct sock *sk, u32 val)
+{
+ if (val != sk->sk_mark) {
+ sk->sk_mark = val;
+ sk_dst_reset(sk);
+ }
+}
+
void sock_set_mark(struct sock *sk, u32 val)
{
lock_sock(sk);
- sk->sk_mark = val;
+ __sock_set_mark(sk, val);
release_sock(sk);
}
EXPORT_SYMBOL(sock_set_mark);
@@ -1118,10 +1126,10 @@ set_sndbuf:
case SO_MARK:
if (!ns_capable(sock_net(sk)->user_ns, CAP_NET_ADMIN)) {
ret = -EPERM;
- } else if (val != sk->sk_mark) {
- sk->sk_mark = val;
- sk_dst_reset(sk);
+ break;
}
+
+ __sock_set_mark(sk, val);
break;
case SO_RXQ_OVFL: