linux-user: Emulate /proc/self/maps under mmap_lock
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-stable@nongnu.org Fixes: 7b7a3366e142 ("linux-user: Use walk_memory_regions for open_self_maps") Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> Reviewed-by: Laurent Vivier <laurent@vivier.eu> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-ID: <20241014203441.387560-1-iii@linux.ibm.com> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
e46fbc7d50
commit
bbd5630a75
@ -8151,17 +8151,19 @@ static int open_self_maps_1(CPUArchState *env, int fd, bool smaps)
|
|||||||
{
|
{
|
||||||
struct open_self_maps_data d = {
|
struct open_self_maps_data d = {
|
||||||
.ts = get_task_state(env_cpu(env)),
|
.ts = get_task_state(env_cpu(env)),
|
||||||
.host_maps = read_self_maps(),
|
|
||||||
.fd = fd,
|
.fd = fd,
|
||||||
.smaps = smaps
|
.smaps = smaps
|
||||||
};
|
};
|
||||||
|
|
||||||
|
mmap_lock();
|
||||||
|
d.host_maps = read_self_maps();
|
||||||
if (d.host_maps) {
|
if (d.host_maps) {
|
||||||
walk_memory_regions(&d, open_self_maps_2);
|
walk_memory_regions(&d, open_self_maps_2);
|
||||||
free_self_maps(d.host_maps);
|
free_self_maps(d.host_maps);
|
||||||
} else {
|
} else {
|
||||||
walk_memory_regions(&d, open_self_maps_3);
|
walk_memory_regions(&d, open_self_maps_3);
|
||||||
}
|
}
|
||||||
|
mmap_unlock();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user