Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mremap: check for overflow using deltas

Using "- 1" relies on the old_end to be page aligned and PAGE_SIZE > 1,
those are reasonable requirements but the check remains obscure and it
looks more like an off by one error than an overflow check. This I feel
will improve readability.

Signed-off-by: Andrea Arcangeli <aarcange@redhat.com>
Acked-by: Johannes Weiner <jweiner@redhat.com>
Acked-by: Mel Gorman <mgorman@suse.de>
Acked-by: Rik van Riel <riel@redhat.com>
Cc: Hugh Dickins <hughd@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Andrea Arcangeli and committed by
Linus Torvalds
ebed4846 66616720

+3 -2
+3 -2
mm/mremap.c
··· 141 141 for (; old_addr < old_end; old_addr += extent, new_addr += extent) { 142 142 cond_resched(); 143 143 next = (old_addr + PMD_SIZE) & PMD_MASK; 144 - if (next - 1 > old_end) 145 - next = old_end; 144 + /* even if next overflowed, extent below will be ok */ 146 145 extent = next - old_addr; 146 + if (extent > old_end - old_addr) 147 + extent = old_end - old_addr; 147 148 old_pmd = get_old_pmd(vma->vm_mm, old_addr); 148 149 if (!old_pmd) 149 150 continue;