From: Ilya Leoshkevich <i...@linux.ibm.com> If one thread modifies the mappings and another thread prints them, a situation may occur that the printer thread sees a guest mapping without a corresponding host mapping, leading to a crash in open_self_maps_2().
Cc: qemu-sta...@nongnu.org Fixes: 7b7a3366e142 ("linux-user: Use walk_memory_regions for open_self_maps") Signed-off-by: Ilya Leoshkevich <i...@linux.ibm.com> Reviewed-by: Laurent Vivier <laur...@vivier.eu> Reviewed-by: Richard Henderson <richard.hender...@linaro.org> Message-ID: <20241014203441.387560-1-...@linux.ibm.com> Signed-off-by: Richard Henderson <richard.hender...@linaro.org> (cherry picked from commit bbd5630a75e70a0f1bcf04de74c94aa94a145628) Signed-off-by: Michael Tokarev <m...@tls.msk.ru> diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 9d5415674d..6d9ed59594 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -8122,17 +8122,19 @@ static int open_self_maps_1(CPUArchState *env, int fd, bool smaps) { struct open_self_maps_data d = { .ts = get_task_state(env_cpu(env)), - .host_maps = read_self_maps(), .fd = fd, .smaps = smaps }; + mmap_lock(); + d.host_maps = read_self_maps(); if (d.host_maps) { walk_memory_regions(&d, open_self_maps_2); free_self_maps(d.host_maps); } else { walk_memory_regions(&d, open_self_maps_3); } + mmap_unlock(); return 0; } -- 2.39.5