inet: frag: enforce memory limits earlier
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>
This commit is contained in:
parent
e39eb59999
commit
56e2c94f05
|
@ -157,9 +157,6 @@ static struct inet_frag_queue *inet_frag_alloc(struct netns_frags *nf,
|
|||
{
|
||||
struct inet_frag_queue *q;
|
||||
|
||||
if (!nf->high_thresh || frag_mem_limit(nf) > nf->high_thresh)
|
||||
return NULL;
|
||||
|
||||
q = kmem_cache_zalloc(f->frags_cachep, GFP_ATOMIC);
|
||||
if (!q)
|
||||
return NULL;
|
||||
|
@ -204,6 +201,9 @@ struct inet_frag_queue *inet_frag_find(struct netns_frags *nf, void *key)
|
|||
{
|
||||
struct inet_frag_queue *fq;
|
||||
|
||||
if (!nf->high_thresh || frag_mem_limit(nf) > nf->high_thresh)
|
||||
return NULL;
|
||||
|
||||
rcu_read_lock();
|
||||
|
||||
fq = rhashtable_lookup(&nf->rhashtable, key, nf->f->rhash_params);
|
||||
|
|
Loading…
Reference in New Issue