diff options
-rw-r--r-- | net/ipv4/ip_fragment.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/net/ipv4/ip_fragment.c b/net/ipv4/ip_fragment.c index 8e9528ebaa8e..d14d741fb05e 100644 --- a/net/ipv4/ip_fragment.c +++ b/net/ipv4/ip_fragment.c | |||
@@ -383,11 +383,16 @@ found: | |||
383 | int i = end - next->ip_defrag_offset; /* overlap is 'i' bytes */ | 383 | int i = end - next->ip_defrag_offset; /* overlap is 'i' bytes */ |
384 | 384 | ||
385 | if (i < next->len) { | 385 | if (i < next->len) { |
386 | int delta = -next->truesize; | ||
387 | |||
386 | /* Eat head of the next overlapped fragment | 388 | /* Eat head of the next overlapped fragment |
387 | * and leave the loop. The next ones cannot overlap. | 389 | * and leave the loop. The next ones cannot overlap. |
388 | */ | 390 | */ |
389 | if (!pskb_pull(next, i)) | 391 | if (!pskb_pull(next, i)) |
390 | goto err; | 392 | goto err; |
393 | delta += next->truesize; | ||
394 | if (delta) | ||
395 | add_frag_mem_limit(qp->q.net, delta); | ||
391 | next->ip_defrag_offset += i; | 396 | next->ip_defrag_offset += i; |
392 | qp->q.meat -= i; | 397 | qp->q.meat -= i; |
393 | if (next->ip_summed != CHECKSUM_UNNECESSARY) | 398 | if (next->ip_summed != CHECKSUM_UNNECESSARY) |