forked from mirrors/linux
		
	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>
This commit is contained in:
		
							parent
							
								
									52358cb5a3
								
							
						
					
					
						commit
						50254256f3
					
				
					 1 changed files with 4 additions and 2 deletions
				
			
		|  | @ -952,10 +952,12 @@ int sock_setsockopt(struct socket *sock, int level, int optname, | ||||||
| 			clear_bit(SOCK_PASSSEC, &sock->flags); | 			clear_bit(SOCK_PASSSEC, &sock->flags); | ||||||
| 		break; | 		break; | ||||||
| 	case SO_MARK: | 	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; | 			ret = -EPERM; | ||||||
| 		else | 		} else if (val != sk->sk_mark) { | ||||||
| 			sk->sk_mark = val; | 			sk->sk_mark = val; | ||||||
|  | 			sk_dst_reset(sk); | ||||||
|  | 		} | ||||||
| 		break; | 		break; | ||||||
| 
 | 
 | ||||||
| 	case SO_RXQ_OVFL: | 	case SO_RXQ_OVFL: | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 David Barmann
						David Barmann