|
@@ -2388,8 +2388,12 @@ int __tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb)
|
|
|
*/
|
|
|
TCP_SKB_CB(skb)->when = tcp_time_stamp;
|
|
|
|
|
|
- /* make sure skb->data is aligned on arches that require it */
|
|
|
- if (unlikely(NET_IP_ALIGN && ((unsigned long)skb->data & 3))) {
|
|
|
+ /* make sure skb->data is aligned on arches that require it
|
|
|
+ * and check if ack-trimming & collapsing extended the headroom
|
|
|
+ * beyond what csum_start can cover.
|
|
|
+ */
|
|
|
+ if (unlikely((NET_IP_ALIGN && ((unsigned long)skb->data & 3)) ||
|
|
|
+ skb_headroom(skb) >= 0xFFFF)) {
|
|
|
struct sk_buff *nskb = __pskb_copy(skb, MAX_TCP_HEADER,
|
|
|
GFP_ATOMIC);
|
|
|
return nskb ? tcp_transmit_skb(sk, nskb, 0, GFP_ATOMIC) :
|