Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
linux-user: Fix shmdt
If the shm region is not mapped at shmaddr, EINVAL.
Do not unmap the region until the syscall succeeds.
Use mmap_reserve_or_unmap to preserve reserved_va semantics.

Tested-by: Helge Deller <deller@gmx.de>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
  • Loading branch information
rth7680 committed Sep 1, 2023
1 parent 69fa270 commit ceda568
Showing 1 changed file with 14 additions and 3 deletions.
17 changes: 14 additions & 3 deletions linux-user/mmap.c
Expand Up @@ -1102,14 +1102,25 @@ abi_long target_shmdt(abi_ulong shmaddr)
/* shmdt pointers are always untagged */

WITH_MMAP_LOCK_GUARD() {
for (int i = 0; i < N_SHM_REGIONS; ++i) {
int i;

for (i = 0; i < N_SHM_REGIONS; ++i) {
if (shm_regions[i].in_use && shm_regions[i].start == shmaddr) {
shm_regions[i].in_use = false;
page_set_flags(shmaddr, shmaddr + shm_regions[i].size - 1, 0);
break;
}
}
if (i == N_SHM_REGIONS) {
return -TARGET_EINVAL;
}

rv = get_errno(shmdt(g2h_untagged(shmaddr)));
if (rv == 0) {
abi_ulong size = shm_regions[i].size;

shm_regions[i].in_use = false;
page_set_flags(shmaddr, shmaddr + size - 1, 0);
mmap_reserve_or_unmap(shmaddr, size);
}
}
return rv;
}

0 comments on commit ceda568

Please sign in to comment.