Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 597b389b authored by David Barmann's avatar David Barmann Committed by Greg Kroah-Hartman
Browse files

sock: Reset dst when changing sk_mark via setsockopt



[ Upstream commit 50254256f382c56bde87d970f3d0d02fdb76ec70 ]

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: default avatarDavid Barmann <david.barmann@stackpath.com>
Reviewed-by: default avatarEric Dumazet <edumazet@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent 23fd22e3
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -945,10 +945,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: