Skip to content

Commit

Permalink
linux-user: Fix shmdt
Browse files Browse the repository at this point in the history
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 <[email protected]>
Reviewed-by: Philippe Mathieu-Daudé <[email protected]>
Signed-off-by: Richard Henderson <[email protected]>
  • 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
Original file line number Diff line number Diff line change
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.