Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b60b49ea authored by Herbert Xu's avatar Herbert Xu Committed by David S. Miller
Browse files

[TCP]: Account skb overhead in tcp_fragment



Make sure that we get the full sizeof(struct sk_buff)
plus the data size accounted for in skb->truesize.

This will create invariants that will allow adding
assertion checks on skb->truesize.

Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent d47f3640
Loading
Loading
Loading
Loading
+7 −3
Original line number Diff line number Diff line
@@ -533,6 +533,7 @@ int tcp_fragment(struct sock *sk, struct sk_buff *skb, u32 len, unsigned int mss
	struct tcp_sock *tp = tcp_sk(sk);
	struct sk_buff *buff;
	int nsize, old_factor;
	int nlen;
	u16 flags;

	BUG_ON(len > skb->len);
@@ -552,8 +553,10 @@ int tcp_fragment(struct sock *sk, struct sk_buff *skb, u32 len, unsigned int mss
	if (buff == NULL)
		return -ENOMEM; /* We'll just try again later. */

	buff->truesize = skb->len - len;
	skb->truesize -= buff->truesize;
	sk_charge_skb(sk, buff);
	nlen = skb->len - len - nsize;
	buff->truesize += nlen;
	skb->truesize -= nlen;

	/* Correct the sequence numbers. */
	TCP_SKB_CB(buff)->seq = TCP_SKB_CB(skb)->seq + len;
@@ -1039,7 +1042,8 @@ static int tso_fragment(struct sock *sk, struct sk_buff *skb, unsigned int len,
	if (unlikely(buff == NULL))
		return -ENOMEM;

	buff->truesize = nlen;
	sk_charge_skb(sk, buff);
	buff->truesize += nlen;
	skb->truesize -= nlen;

	/* Correct the sequence numbers. */