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 commit50254256f3
("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:84d1c61740
("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>
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
09fdb6747b
commit
a5de17bb91
@@ -807,10 +807,18 @@ void sock_set_rcvbuf(struct sock *sk, int val)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(sock_set_rcvbuf);
|
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)
|
void sock_set_mark(struct sock *sk, u32 val)
|
||||||
{
|
{
|
||||||
lock_sock(sk);
|
lock_sock(sk);
|
||||||
sk->sk_mark = val;
|
__sock_set_mark(sk, val);
|
||||||
release_sock(sk);
|
release_sock(sk);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(sock_set_mark);
|
EXPORT_SYMBOL(sock_set_mark);
|
||||||
@@ -1118,10 +1126,10 @@ set_sndbuf:
|
|||||||
case SO_MARK:
|
case SO_MARK:
|
||||||
if (!ns_capable(sock_net(sk)->user_ns, CAP_NET_ADMIN)) {
|
if (!ns_capable(sock_net(sk)->user_ns, CAP_NET_ADMIN)) {
|
||||||
ret = -EPERM;
|
ret = -EPERM;
|
||||||
} else if (val != sk->sk_mark) {
|
break;
|
||||||
sk->sk_mark = val;
|
|
||||||
sk_dst_reset(sk);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__sock_set_mark(sk, val);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SO_RXQ_OVFL:
|
case SO_RXQ_OVFL:
|
||||||
|
Reference in New Issue
Block a user