Skip to contentSkip to conversation

sock: Reset dst when changing sk_mark via setsockopt

PATCH Applied David Barmann 3 participants 3 messages Nov 8, 2018 – Nov 9, 2018

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

PATCH v3 1/1 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.

---
 net/core/sock.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)
net/core/sock.c +4 -2
index 7b304e454a38..6d7e189e3cd9 100644
@@ -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:
Signature · 1 line
2.14.5
Reviewed-by on v3 1/1
#1 lore raw
Quoted 9 lines · David Barmann

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.

---

Thanks David !

maintainer Applied
#2 lore raw
In reply to David Barmann

From: David Barmann <[email protected]>
Date: Thu, 8 Nov 2018 08:13:35 -0600

Quoted 8 lines

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.

Applied.