mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-07-29 05:13:54 -06:00
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: 7b7a3366e1
("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
1 changed files with 3 additions and 1 deletions
|
@ -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…
Add table
Add a link
Reference in a new issue