Le 07/03/2018 à 22:50, Max Filippov a écrit : > In linux-user QEMU that runs for a target with TARGET_ABI_BITS bigger > than L1_MAP_ADDR_SPACE_BITS an assertion in page_set_flags fires when > mmap, munmap, mprotect, mremap or shmat is called for an address outside > the guest address space. mmap and mprotect should return ENOMEM in such > case. > > Change definition of GUEST_ADDR_MAX to always be the last valid guest > address. Account for this change in open_self_maps. > Add macro guest_addr_valid that verifies if the guest address is valid. > Add function guest_range_valid that verifies if address range is within > guest address space and does not wrap around. Use that macro in > mmap/munmap/mprotect/mremap/shmat for error checking. > > Cc: qemu-sta...@nongnu.org > Cc: Riku Voipio <riku.voi...@iki.fi> > Cc: Laurent Vivier <laur...@vivier.eu> > Signed-off-by: Max Filippov <jcmvb...@gmail.com> > --- > Changes v5->v6: > - drop 'if (len)' clause from guest_range_valid and explicitly compare > len with GUEST_ADDR_MAX. > > Changes v4->v5: > - change definition of GUEST_ADDR_MAX to always be the last valid guest > address. Account for this change in guest_addr_valid and open_self_maps. > - turn guest_range_valid into a function. > > Changes v3->v4: > - change GUEST_ADDR_MAX and h2g_valid definitions as suggested by Laurent > Vivier. > > Changes v2->v3: > - fix comparison in guest_valid: it must be 'less' to preserve the existing > functionality, not 'less or equal'. > - fix guest_range_valid: it may not use guest_valid, because single range > that occupies all of the guest address space is valid. > > include/exec/cpu-all.h | 6 +++++- > include/exec/cpu_ldst.h | 16 +++++++--------- > linux-user/mmap.c | 20 +++++++++++++++----- > linux-user/syscall.c | 5 ++++- > 4 files changed, 31 insertions(+), 16 deletions(-) >
Reviewed-by: Laurent Vivier <laur...@vivier.eu>