- patches.kabi/0001-Revert-tcp-RFC-5961-5.2-Blind-Data-Injection-Attack-.patch:
[opensuse:kernel-source.git] / patches.kabi / 0004-Revert-tcp-implement-RFC-5961-4.2.patch
1 From: Jiri Slaby <jslaby@suse.cz>
2 Subject: Revert "tcp: implement RFC 5961 4.2"
3 Patch-mainline: never, kABI
4
5 This reverts commit ab5c718d0fd643ba6f2112235e12ea5222f4edf3, usptream
6 commit 0c24604b68fc7810d429d6c3657b6f148270e528. We cannot take these
7 patches as they change public SNMP interface indices.
8
9 Signed-off-by: Jiri Slaby <jslaby@suse.cz>
10 ---
11  include/linux/snmp.h |    2 +-
12  net/ipv4/proc.c      |    2 +-
13  net/ipv4/tcp_input.c |   32 +++++++++++++++++---------------
14  3 files changed, 19 insertions(+), 17 deletions(-)
15
16 --- a/include/linux/snmp.h
17 +++ b/include/linux/snmp.h
18 @@ -209,6 +209,7 @@ enum
19         LINUX_MIB_TCPDSACKOFOSENT,              /* TCPDSACKOfoSent */
20         LINUX_MIB_TCPDSACKRECV,                 /* TCPDSACKRecv */
21         LINUX_MIB_TCPDSACKOFORECV,              /* TCPDSACKOfoRecv */
22 +       LINUX_MIB_TCPABORTONSYN,                /* TCPAbortOnSyn */
23         LINUX_MIB_TCPABORTONDATA,               /* TCPAbortOnData */
24         LINUX_MIB_TCPABORTONCLOSE,              /* TCPAbortOnClose */
25         LINUX_MIB_TCPABORTONMEMORY,             /* TCPAbortOnMemory */
26 @@ -231,7 +232,6 @@ enum
27         LINUX_MIB_IPRPFILTER, /* IP Reverse Path Filter (rp_filter) */
28         LINUX_MIB_TCPTIMEWAITOVERFLOW,          /* TCPTimeWaitOverflow */
29         LINUX_MIB_TCPCHALLENGEACK,              /* TCPChallengeACK */
30 -       LINUX_MIB_TCPSYNCHALLENGE,              /* TCPSYNChallenge */
31         __LINUX_MIB_MAX
32  };
33  
34 --- a/net/ipv4/proc.c
35 +++ b/net/ipv4/proc.c
36 @@ -232,6 +232,7 @@ static const struct snmp_mib snmp4_net_l
37         SNMP_MIB_ITEM("TCPDSACKOfoSent", LINUX_MIB_TCPDSACKOFOSENT),
38         SNMP_MIB_ITEM("TCPDSACKRecv", LINUX_MIB_TCPDSACKRECV),
39         SNMP_MIB_ITEM("TCPDSACKOfoRecv", LINUX_MIB_TCPDSACKOFORECV),
40 +       SNMP_MIB_ITEM("TCPAbortOnSyn", LINUX_MIB_TCPABORTONSYN),
41         SNMP_MIB_ITEM("TCPAbortOnData", LINUX_MIB_TCPABORTONDATA),
42         SNMP_MIB_ITEM("TCPAbortOnClose", LINUX_MIB_TCPABORTONCLOSE),
43         SNMP_MIB_ITEM("TCPAbortOnMemory", LINUX_MIB_TCPABORTONMEMORY),
44 @@ -254,7 +255,6 @@ static const struct snmp_mib snmp4_net_l
45         SNMP_MIB_ITEM("IPReversePathFilter", LINUX_MIB_IPRPFILTER),
46         SNMP_MIB_ITEM("TCPTimeWaitOverflow", LINUX_MIB_TCPTIMEWAITOVERFLOW),
47         SNMP_MIB_ITEM("TCPChallengeACK", LINUX_MIB_TCPCHALLENGEACK),
48 -       SNMP_MIB_ITEM("TCPSYNChallenge", LINUX_MIB_TCPSYNCHALLENGE),
49         SNMP_MIB_SENTINEL
50  };
51  
52 --- a/net/ipv4/tcp_input.c
53 +++ b/net/ipv4/tcp_input.c
54 @@ -5197,8 +5197,8 @@ static void tcp_send_challenge_ack(struc
55  /* Does PAWS and seqno based validation of an incoming segment, flags will
56   * play significant role here.
57   */
58 -static bool tcp_validate_incoming(struct sock *sk, struct sk_buff *skb,
59 -                                 struct tcphdr *th, int syn_inerr)
60 +static int tcp_validate_incoming(struct sock *sk, struct sk_buff *skb,
61 +                             struct tcphdr *th, int syn_inerr)
62  {
63         u8 *hash_location;
64         struct tcp_sock *tp = tcp_sk(sk);
65 @@ -5245,22 +5245,20 @@ static bool tcp_validate_incoming(struct
66  
67         /* step 3: check security and precedence [ignored] */
68  
69 -       /* step 4: Check for a SYN
70 -        * RFC 5691 4.2 : Send a challenge ack
71 -        */
72 -       if (th->syn) {
73 +       /* step 4: Check for a SYN in window. */
74 +       if (th->syn && !before(TCP_SKB_CB(skb)->seq, tp->rcv_nxt)) {
75                 if (syn_inerr)
76                         TCP_INC_STATS_BH(sock_net(sk), TCP_MIB_INERRS);
77 -               NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPSYNCHALLENGE);
78 -               tcp_send_challenge_ack(sk);
79 -               goto discard;
80 +               NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPABORTONSYN);
81 +               tcp_reset(sk);
82 +               return -1;
83         }
84  
85 -       return true;
86 +       return 1;
87  
88  discard:
89         __kfree_skb(skb);
90 -       return false;
91 +       return 0;
92  }
93  
94  /*
95 @@ -5290,6 +5288,7 @@ int tcp_rcv_established(struct sock *sk,
96                         struct tcphdr *th, unsigned len)
97  {
98         struct tcp_sock *tp = tcp_sk(sk);
99 +       int res;
100  
101         /*
102          *      Header prediction.
103 @@ -5469,8 +5468,9 @@ slow_path:
104          *      Standard slow path.
105          */
106  
107 -       if (!tcp_validate_incoming(sk, skb, th, 1))
108 -               return 0;
109 +       res = tcp_validate_incoming(sk, skb, th, 1);
110 +       if (res <= 0)
111 +               return -res;
112  
113  step5:
114         if (th->ack &&
115 @@ -5781,6 +5781,7 @@ int tcp_rcv_state_process(struct sock *s
116         struct tcp_sock *tp = tcp_sk(sk);
117         struct inet_connection_sock *icsk = inet_csk(sk);
118         int queued = 0;
119 +       int res;
120  
121         tp->rx_opt.saw_tstamp = 0;
122  
123 @@ -5835,8 +5836,9 @@ int tcp_rcv_state_process(struct sock *s
124                 return 0;
125         }
126  
127 -       if (!tcp_validate_incoming(sk, skb, th, 0))
128 -               return 0;
129 +       res = tcp_validate_incoming(sk, skb, th, 0);
130 +       if (res <= 0)
131 +               return -res;
132  
133         /* step 5: check the ACK field */
134         if (th->ack) {