Skip to content

Commit 5025425

Browse files
d-chorddavem330
authored andcommitted
sock: Reset dst when changing sk_mark via setsockopt
When setting the SO_MARK socket option, if the mark changes, the dst needs to be reset so that a new route lookup is performed. This fixes the case where an application wants to change routing by setting a new sk_mark. If this is done after some packets have already been sent, the dst is cached and has no effect. Signed-off-by: David Barmann <david.barmann@stackpath.com> Reviewed-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 52358cb commit 5025425

File tree

1 file changed

+4
-2
lines changed

1 file changed

+4
-2
lines changed

net/core/sock.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -952,10 +952,12 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
952952
clear_bit(SOCK_PASSSEC, &sock->flags);
953953
break;
954954
case SO_MARK:
955-
if (!ns_capable(sock_net(sk)->user_ns, CAP_NET_ADMIN))
955+
if (!ns_capable(sock_net(sk)->user_ns, CAP_NET_ADMIN)) {
956956
ret = -EPERM;
957-
else
957+
} else if (val != sk->sk_mark) {
958958
sk->sk_mark = val;
959+
sk_dst_reset(sk);
960+
}
959961
break;
960962

961963
case SO_RXQ_OVFL:

0 commit comments

Comments
 (0)