Skip to content

Commit dd9082f

Browse files
Alexander Aringdavem330
authored andcommitted
net: sock: fix in-kernel mark setting
This patch fixes the in-kernel mark setting by doing an additional sk_dst_reset() which was introduced by commit 5025425 ("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: 84d1c61 ("net: sock: add sock_set_mark") Reported-by: Marcelo Ricardo Leitner <[email protected]> Signed-off-by: Alexander Aring <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 4ef8d85 commit dd9082f

File tree

1 file changed

+12
-4
lines changed

1 file changed

+12
-4
lines changed

net/core/sock.c

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -815,10 +815,18 @@ void sock_set_rcvbuf(struct sock *sk, int val)
815815
}
816816
EXPORT_SYMBOL(sock_set_rcvbuf);
817817

818+
static void __sock_set_mark(struct sock *sk, u32 val)
819+
{
820+
if (val != sk->sk_mark) {
821+
sk->sk_mark = val;
822+
sk_dst_reset(sk);
823+
}
824+
}
825+
818826
void sock_set_mark(struct sock *sk, u32 val)
819827
{
820828
lock_sock(sk);
821-
sk->sk_mark = val;
829+
__sock_set_mark(sk, val);
822830
release_sock(sk);
823831
}
824832
EXPORT_SYMBOL(sock_set_mark);
@@ -1126,10 +1134,10 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
11261134
case SO_MARK:
11271135
if (!ns_capable(sock_net(sk)->user_ns, CAP_NET_ADMIN)) {
11281136
ret = -EPERM;
1129-
} else if (val != sk->sk_mark) {
1130-
sk->sk_mark = val;
1131-
sk_dst_reset(sk);
1137+
break;
11321138
}
1139+
1140+
__sock_set_mark(sk, val);
11331141
break;
11341142

11351143
case SO_RXQ_OVFL:

0 commit comments

Comments
 (0)