Re: [PATCH v1] mm: fix unmap_mapping_range high bits shift bug

From: Andrew Morton
Date: Wed Dec 20 2023 - 12:53:50 EST


On Wed, 20 Dec 2023 13:28:39 +0800 "jiajun.xie" <jiajun.xie.sh@xxxxxxxxx> wrote:

> From: Jiajun Xie <jiajun.xie.sh@xxxxxxxxx>
>
> The bug happens when highest bit of holebegin is 1, suppose
> holebign is 0x8000000111111000, after shift, hba would be
> 0xfff8000000111111, then vma_interval_tree_foreach would look
> it up fail or leads to the wrong result.
>
> error call seq e.g.:
> - mmap(..., offset=0x8000000111111000)
> |- syscall(mmap, ... unsigned long, off):
> |- ksys_mmap_pgoff( ... , off >> PAGE_SHIFT);
>
> here pgoff is correctly shifted to 0x8000000111111,
> but pass 0x8000000111111000 as holebegin to unmap
> would then cause terrible result, as shown below:
>
> - unmap_mapping_range(..., loff_t const holebegin)
> |- pgoff_t hba = holebegin >> PAGE_SHIFT;
> /* hba = 0xfff8000000111111 unexpectedly */
>
> turn holebegin to be unsigned first would fix the bug.
>

Thanks. Are you able to describe the runtime effects of this
(obviously bad, but it's good to spell it out) and under what
circumstances it occurs?