aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/ipv4/tcp.c18
-rw-r--r--net/ipv4/tcp_input.c10
-rw-r--r--net/ipv4/tcp_ipv4.c1
-rw-r--r--net/ipv6/tcp_ipv6.c1
4 files changed, 17 insertions, 13 deletions
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
index 541f26a67ba2..070aeff1b131 100644
--- a/net/ipv4/tcp.c
+++ b/net/ipv4/tcp.c
@@ -1510,9 +1510,9 @@ static struct sk_buff *tcp_recv_skb(struct sock *sk, u32 seq, u32 *off)
1510 1510
1511 while ((skb = skb_peek(&sk->sk_receive_queue)) != NULL) { 1511 while ((skb = skb_peek(&sk->sk_receive_queue)) != NULL) {
1512 offset = seq - TCP_SKB_CB(skb)->seq; 1512 offset = seq - TCP_SKB_CB(skb)->seq;
1513 if (tcp_hdr(skb)->syn) 1513 if (TCP_SKB_CB(skb)->tcp_flags & TCPHDR_SYN)
1514 offset--; 1514 offset--;
1515 if (offset < skb->len || tcp_hdr(skb)->fin) { 1515 if (offset < skb->len || (TCP_SKB_CB(skb)->tcp_flags & TCPHDR_FIN)) {
1516 *off = offset; 1516 *off = offset;
1517 return skb; 1517 return skb;
1518 } 1518 }
@@ -1585,7 +1585,7 @@ int tcp_read_sock(struct sock *sk, read_descriptor_t *desc,
1585 if (offset + 1 != skb->len) 1585 if (offset + 1 != skb->len)
1586 continue; 1586 continue;
1587 } 1587 }
1588 if (tcp_hdr(skb)->fin) { 1588 if (TCP_SKB_CB(skb)->tcp_flags & TCPHDR_FIN) {
1589 sk_eat_skb(sk, skb, false); 1589 sk_eat_skb(sk, skb, false);
1590 ++seq; 1590 ++seq;
1591 break; 1591 break;
@@ -1722,11 +1722,11 @@ int tcp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
1722 break; 1722 break;
1723 1723
1724 offset = *seq - TCP_SKB_CB(skb)->seq; 1724 offset = *seq - TCP_SKB_CB(skb)->seq;
1725 if (tcp_hdr(skb)->syn) 1725 if (TCP_SKB_CB(skb)->tcp_flags & TCPHDR_SYN)
1726 offset--; 1726 offset--;
1727 if (offset < skb->len) 1727 if (offset < skb->len)
1728 goto found_ok_skb; 1728 goto found_ok_skb;
1729 if (tcp_hdr(skb)->fin) 1729 if (TCP_SKB_CB(skb)->tcp_flags & TCPHDR_FIN)
1730 goto found_fin_ok; 1730 goto found_fin_ok;
1731 WARN(!(flags & MSG_PEEK), 1731 WARN(!(flags & MSG_PEEK),
1732 "recvmsg bug 2: copied %X seq %X rcvnxt %X fl %X\n", 1732 "recvmsg bug 2: copied %X seq %X rcvnxt %X fl %X\n",
@@ -1959,7 +1959,7 @@ skip_copy:
1959 if (used + offset < skb->len) 1959 if (used + offset < skb->len)
1960 continue; 1960 continue;
1961 1961
1962 if (tcp_hdr(skb)->fin) 1962 if (TCP_SKB_CB(skb)->tcp_flags & TCPHDR_FIN)
1963 goto found_fin_ok; 1963 goto found_fin_ok;
1964 if (!(flags & MSG_PEEK)) { 1964 if (!(flags & MSG_PEEK)) {
1965 sk_eat_skb(sk, skb, copied_early); 1965 sk_eat_skb(sk, skb, copied_early);
@@ -2160,8 +2160,10 @@ void tcp_close(struct sock *sk, long timeout)
2160 * reader process may not have drained the data yet! 2160 * reader process may not have drained the data yet!
2161 */ 2161 */
2162 while ((skb = __skb_dequeue(&sk->sk_receive_queue)) != NULL) { 2162 while ((skb = __skb_dequeue(&sk->sk_receive_queue)) != NULL) {
2163 u32 len = TCP_SKB_CB(skb)->end_seq - TCP_SKB_CB(skb)->seq - 2163 u32 len = TCP_SKB_CB(skb)->end_seq - TCP_SKB_CB(skb)->seq;
2164 tcp_hdr(skb)->fin; 2164
2165 if (TCP_SKB_CB(skb)->tcp_flags & TCPHDR_FIN)
2166 len--;
2165 data_was_unread += len; 2167 data_was_unread += len;
2166 __kfree_skb(skb); 2168 __kfree_skb(skb);
2167 } 2169 }
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
index f97003ad0af5..8f639a4face9 100644
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@ -4093,7 +4093,7 @@ static void tcp_ofo_queue(struct sock *sk)
4093 __skb_unlink(skb, &tp->out_of_order_queue); 4093 __skb_unlink(skb, &tp->out_of_order_queue);
4094 __skb_queue_tail(&sk->sk_receive_queue, skb); 4094 __skb_queue_tail(&sk->sk_receive_queue, skb);
4095 tp->rcv_nxt = TCP_SKB_CB(skb)->end_seq; 4095 tp->rcv_nxt = TCP_SKB_CB(skb)->end_seq;
4096 if (tcp_hdr(skb)->fin) 4096 if (TCP_SKB_CB(skb)->tcp_flags & TCPHDR_FIN)
4097 tcp_fin(sk); 4097 tcp_fin(sk);
4098 } 4098 }
4099} 4099}
@@ -4513,7 +4513,7 @@ restart:
4513 * - bloated or contains data before "start" or 4513 * - bloated or contains data before "start" or
4514 * overlaps to the next one. 4514 * overlaps to the next one.
4515 */ 4515 */
4516 if (!tcp_hdr(skb)->syn && !tcp_hdr(skb)->fin && 4516 if (!(TCP_SKB_CB(skb)->tcp_flags & (TCPHDR_SYN | TCPHDR_FIN)) &&
4517 (tcp_win_from_space(skb->truesize) > skb->len || 4517 (tcp_win_from_space(skb->truesize) > skb->len ||
4518 before(TCP_SKB_CB(skb)->seq, start))) { 4518 before(TCP_SKB_CB(skb)->seq, start))) {
4519 end_of_skbs = false; 4519 end_of_skbs = false;
@@ -4532,7 +4532,8 @@ restart:
4532 /* Decided to skip this, advance start seq. */ 4532 /* Decided to skip this, advance start seq. */
4533 start = TCP_SKB_CB(skb)->end_seq; 4533 start = TCP_SKB_CB(skb)->end_seq;
4534 } 4534 }
4535 if (end_of_skbs || tcp_hdr(skb)->syn || tcp_hdr(skb)->fin) 4535 if (end_of_skbs ||
4536 (TCP_SKB_CB(skb)->tcp_flags & (TCPHDR_SYN | TCPHDR_FIN)))
4536 return; 4537 return;
4537 4538
4538 while (before(start, end)) { 4539 while (before(start, end)) {
@@ -4579,8 +4580,7 @@ restart:
4579 skb = tcp_collapse_one(sk, skb, list); 4580 skb = tcp_collapse_one(sk, skb, list);
4580 if (!skb || 4581 if (!skb ||
4581 skb == tail || 4582 skb == tail ||
4582 tcp_hdr(skb)->syn || 4583 (TCP_SKB_CB(skb)->tcp_flags & (TCPHDR_SYN | TCPHDR_FIN)))
4583 tcp_hdr(skb)->fin)
4584 return; 4584 return;
4585 } 4585 }
4586 } 4586 }
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
index 7881b96d2b72..006b045716d8 100644
--- a/net/ipv4/tcp_ipv4.c
+++ b/net/ipv4/tcp_ipv4.c
@@ -1638,6 +1638,7 @@ int tcp_v4_rcv(struct sk_buff *skb)
1638 TCP_SKB_CB(skb)->end_seq = (TCP_SKB_CB(skb)->seq + th->syn + th->fin + 1638 TCP_SKB_CB(skb)->end_seq = (TCP_SKB_CB(skb)->seq + th->syn + th->fin +
1639 skb->len - th->doff * 4); 1639 skb->len - th->doff * 4);
1640 TCP_SKB_CB(skb)->ack_seq = ntohl(th->ack_seq); 1640 TCP_SKB_CB(skb)->ack_seq = ntohl(th->ack_seq);
1641 TCP_SKB_CB(skb)->tcp_flags = tcp_flag_byte(th);
1641 TCP_SKB_CB(skb)->tcp_tw_isn = 0; 1642 TCP_SKB_CB(skb)->tcp_tw_isn = 0;
1642 TCP_SKB_CB(skb)->ip_dsfield = ipv4_get_dsfield(iph); 1643 TCP_SKB_CB(skb)->ip_dsfield = ipv4_get_dsfield(iph);
1643 TCP_SKB_CB(skb)->sacked = 0; 1644 TCP_SKB_CB(skb)->sacked = 0;
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c
index 1835480336ac..de51a88bec6f 100644
--- a/net/ipv6/tcp_ipv6.c
+++ b/net/ipv6/tcp_ipv6.c
@@ -1415,6 +1415,7 @@ static int tcp_v6_rcv(struct sk_buff *skb)
1415 TCP_SKB_CB(skb)->end_seq = (TCP_SKB_CB(skb)->seq + th->syn + th->fin + 1415 TCP_SKB_CB(skb)->end_seq = (TCP_SKB_CB(skb)->seq + th->syn + th->fin +
1416 skb->len - th->doff*4); 1416 skb->len - th->doff*4);
1417 TCP_SKB_CB(skb)->ack_seq = ntohl(th->ack_seq); 1417 TCP_SKB_CB(skb)->ack_seq = ntohl(th->ack_seq);
1418 TCP_SKB_CB(skb)->tcp_flags = tcp_flag_byte(th);
1418 TCP_SKB_CB(skb)->tcp_tw_isn = 0; 1419 TCP_SKB_CB(skb)->tcp_tw_isn = 0;
1419 TCP_SKB_CB(skb)->ip_dsfield = ipv6_get_dsfield(hdr); 1420 TCP_SKB_CB(skb)->ip_dsfield = ipv6_get_dsfield(hdr);
1420 TCP_SKB_CB(skb)->sacked = 0; 1421 TCP_SKB_CB(skb)->sacked = 0;