]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blame - releases/4.4.172/net-call-sk_dst_reset-when-set-so_dontroute.patch
4.14-stable patches
[thirdparty/kernel/stable-queue.git] / releases / 4.4.172 / net-call-sk_dst_reset-when-set-so_dontroute.patch
CommitLineData
d3e91060
SL
1From 257403f2ebbab92d7c57c12e3439c3866a52bd51 Mon Sep 17 00:00:00 2001
2From: yupeng <yupeng0921@gmail.com>
3Date: Wed, 5 Dec 2018 18:56:28 -0800
4Subject: net: call sk_dst_reset when set SO_DONTROUTE
5
6[ Upstream commit 0fbe82e628c817e292ff588cd5847fc935e025f2 ]
7
8after set SO_DONTROUTE to 1, the IP layer should not route packets if
9the dest IP address is not in link scope. But if the socket has cached
10the dst_entry, such packets would be routed until the sk_dst_cache
11expires. So we should clean the sk_dst_cache when a user set
12SO_DONTROUTE option. Below are server/client python scripts which
13could reprodue this issue:
14
15server side code:
16
17==========================================================================
18import socket
19import struct
20import time
21
22s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
23s.bind(('0.0.0.0', 9000))
24s.listen(1)
25sock, addr = s.accept()
26sock.setsockopt(socket.SOL_SOCKET, socket.SO_DONTROUTE, struct.pack('i', 1))
27while True:
28 sock.send(b'foo')
29 time.sleep(1)
30==========================================================================
31
32client side code:
33==========================================================================
34import socket
35import time
36
37s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
38s.connect(('server_address', 9000))
39while True:
40 data = s.recv(1024)
41 print(data)
42==========================================================================
43
44Signed-off-by: yupeng <yupeng0921@gmail.com>
45Signed-off-by: David S. Miller <davem@davemloft.net>
46Signed-off-by: Sasha Levin <sashal@kernel.org>
47---
48 net/core/sock.c | 1 +
49 1 file changed, 1 insertion(+)
50
51diff --git a/net/core/sock.c b/net/core/sock.c
52index 9fb1c073d0c4..8aa4a5f89572 100644
53--- a/net/core/sock.c
54+++ b/net/core/sock.c
55@@ -732,6 +732,7 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
56 break;
57 case SO_DONTROUTE:
58 sock_valbool_flag(sk, SOCK_LOCALROUTE, valbool);
59+ sk_dst_reset(sk);
60 break;
61 case SO_BROADCAST:
62 sock_valbool_flag(sk, SOCK_BROADCAST, valbool);
63--
642.19.1
65