On 11/07/2018 08:55 PM, David Barmann wrote:
> When setting the SO_MARK socket option, 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.barm...@stackpath.com>
> ---
>  net/core/sock.c | 6 ++++--
>  1 file changed, 4 insertions(+), 2 deletions(-)
> 
> diff --git a/net/core/sock.c b/net/core/sock.c
> index 7b304e454a38..c74b10be86cb 100644
> --- a/net/core/sock.c
> +++ b/net/core/sock.c
> @@ -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 {
>                       sk->sk_mark = val;
> +                     sk_dst_reset(sk);


There is no need to force a sk_dst_reset(sk) if sk_mark was not changed.

I already gave you this feedback, please do not ignore it.

Thanks.

Reply via email to