Skip to content

Commit

Permalink
sock: Reset dst when changing sk_mark via setsockopt
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
d-chord authored and davem330 committed Nov 9, 2018
1 parent 52358cb commit 5025425
Showing 1 changed file with 4 additions and 2 deletions.
6 changes: 4 additions & 2 deletions net/core/sock.c
Original file line number Diff line number Diff line change
Expand Up @@ -952,10 +952,12 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
clear_bit(SOCK_PASSSEC, &sock->flags);
break;
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;
else
} else if (val != sk->sk_mark) {
sk->sk_mark = val;
sk_dst_reset(sk);
}
break;

case SO_RXQ_OVFL:
Expand Down

0 comments on commit 5025425

Please sign in to comment.