Skip to content

Commit

Permalink
kasan: avoid overflowing quarantine size on low memory systems
Browse files Browse the repository at this point in the history
If the total amount of memory assigned to quarantine is less than the
amount of memory assigned to per-cpu quarantines, |new_quarantine_size|
may overflow.  Instead, set it to zero.

[[email protected]: cleanup: use WARN_ONCE return value]
Link: http://lkml.kernel.org/r/[email protected]
Fixes: 55834c5 ("mm: kasan: initial memory quarantine implementation")
Signed-off-by: Alexander Potapenko <[email protected]>
Reported-by: Dmitry Vyukov <[email protected]>
Cc: Andrey Ryabinin <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
ramosian-glider authored and torvalds committed Aug 2, 2016
1 parent 7e08897 commit c3cee37
Showing 1 changed file with 7 additions and 2 deletions.
9 changes: 7 additions & 2 deletions mm/kasan/quarantine.c
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,7 @@ void quarantine_put(struct kasan_free_meta *info, struct kmem_cache *cache)

void quarantine_reduce(void)
{
size_t new_quarantine_size;
size_t new_quarantine_size, percpu_quarantines;
unsigned long flags;
struct qlist_head to_free = QLIST_INIT;
size_t size_to_free = 0;
Expand All @@ -216,7 +216,12 @@ void quarantine_reduce(void)
*/
new_quarantine_size = (READ_ONCE(totalram_pages) << PAGE_SHIFT) /
QUARANTINE_FRACTION;
new_quarantine_size -= QUARANTINE_PERCPU_SIZE * num_online_cpus();
percpu_quarantines = QUARANTINE_PERCPU_SIZE * num_online_cpus();
if (WARN_ONCE(new_quarantine_size < percpu_quarantines,
"Too little memory, disabling global KASAN quarantine.\n"))
new_quarantine_size = 0;
else
new_quarantine_size -= percpu_quarantines;
WRITE_ONCE(quarantine_size, new_quarantine_size);

last = global_quarantine.head;
Expand Down

0 comments on commit c3cee37

Please sign in to comment.