mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 19:08:57 +09:00
inet: frag: enforce memory limits earlier
[ Upstream commit56e2c94f05] We currently check current frags memory usage only when a new frag queue is created. This allows attackers to first consume the memory budget (default : 4 MB) creating thousands of frag queues, then sending tiny skbs to exceed high_thresh limit by 2 to 3 order of magnitude. Note that before commit648700f76b("inet: frags: use rhashtables for reassembly units"), work queue could be starved under DOS, getting no cpu cycles. After commit648700f76b, only the per frag queue timer can eventually remove an incomplete frag queue and its skbs. Fixes:b13d3cbfb8("inet: frag: move eviction of queues to work queue") Signed-off-by: Eric Dumazet <edumazet@google.com> Reported-by: Jann Horn <jannh@google.com> Cc: Florian Westphal <fw@strlen.de> Cc: Peter Oskolkov <posk@google.com> Cc: Paolo Abeni <pabeni@redhat.com> Acked-by: Florian Westphal <fw@strlen.de> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
27a0762cb5
commit
df30bfccc4
@@ -364,11 +364,6 @@ static struct inet_frag_queue *inet_frag_alloc(struct netns_frags *nf,
|
||||
{
|
||||
struct inet_frag_queue *q;
|
||||
|
||||
if (frag_mem_limit(nf) > nf->high_thresh) {
|
||||
inet_frag_schedule_worker(f);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
q = kmem_cache_zalloc(f->frags_cachep, GFP_ATOMIC);
|
||||
if (!q)
|
||||
return NULL;
|
||||
@@ -405,6 +400,11 @@ struct inet_frag_queue *inet_frag_find(struct netns_frags *nf,
|
||||
struct inet_frag_queue *q;
|
||||
int depth = 0;
|
||||
|
||||
if (!nf->high_thresh || frag_mem_limit(nf) > nf->high_thresh) {
|
||||
inet_frag_schedule_worker(f);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (frag_mem_limit(nf) > nf->low_thresh)
|
||||
inet_frag_schedule_worker(f);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user