diff options
author | yupeng <yupeng0921@gmail.com> | 2018-12-05 18:56:28 -0800 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2019-01-26 09:44:28 +0100 |
commit | 5a571a9e9d117a6466480bead1ce5ae956f5e828 (patch) | |
tree | 72830dba33a2772fafcbe946c21a023a3eb09686 /net | |
parent | 90463551f5c293d7653063bcf210b2641f49ff82 (diff) | |
download | linux-stable-5a571a9e9d117a6466480bead1ce5ae956f5e828.tar.gz linux-stable-5a571a9e9d117a6466480bead1ce5ae956f5e828.tar.bz2 linux-stable-5a571a9e9d117a6466480bead1ce5ae956f5e828.zip |
net: call sk_dst_reset when set SO_DONTROUTE
[ 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>
Diffstat (limited to 'net')
-rw-r--r-- | net/core/sock.c | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/net/core/sock.c b/net/core/sock.c index 91ee0eb70fcf..039f101e7807 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -720,6 +720,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); |