lkml.org 
[lkml]   [2019]   [Jan]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 28/63] net: call sk_dst_reset when set SO_DONTROUTE
    Date
    4.14-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    [ Upstream commit 0fbe82e628c817e292ff588cd5847fc935e025f2 ]

    after set SO_DONTROUTE to 1, the IP layer should not route packets if
    the dest IP address is not in link scope. But if the socket has cached
    the dst_entry, such packets would be routed until the sk_dst_cache
    expires. So we should clean the sk_dst_cache when a user set
    SO_DONTROUTE option. Below are server/client python scripts which
    could reprodue this issue:

    server side code:

    ==========================================================================
    import socket
    import struct
    import time

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind(('0.0.0.0', 9000))
    s.listen(1)
    sock, addr = s.accept()
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_DONTROUTE, struct.pack('i', 1))
    while True:
    sock.send(b'foo')
    time.sleep(1)
    ==========================================================================

    client side code:
    ==========================================================================
    import socket
    import time

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect(('server_address', 9000))
    while True:
    data = s.recv(1024)
    print(data)
    ==========================================================================

    Signed-off-by: yupeng <yupeng0921@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    net/core/sock.c | 1 +
    1 file changed, 1 insertion(+)

    diff --git a/net/core/sock.c b/net/core/sock.c
    index 01cae48d6eef..a88579589946 100644
    --- a/net/core/sock.c
    +++ b/net/core/sock.c
    @@ -735,6 +735,7 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
    break;
    case SO_DONTROUTE:
    sock_valbool_flag(sk, SOCK_LOCALROUTE, valbool);
    + sk_dst_reset(sk);
    break;
    case SO_BROADCAST:
    sock_valbool_flag(sk, SOCK_BROADCAST, valbool);
    --
    2.19.1


    \
     
     \ /
      Last update: 2019-01-24 21:04    [W:4.076 / U:0.068 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site