aboutsummaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorMark Johnston <markjdb@gmail.com>2021-05-15 13:20:50 -0400
committerGitHub <noreply@github.com>2021-05-15 19:20:50 +0200
commitf54a5c0916af7d798b204eb70c484f154d69e0a3 (patch)
tree384a352cf53d4feb3ec1168f88766ca20b6b0128 /sys
parent93f844de48fff3f13271ec9e3fc2f5abf7692424 (diff)
sys/freebsd: fix some problems with SysV semaphore definitions (#2588)
- There is no __semctl(SEM_INFO). - The fields in semid_ds and ipc_perm were wrong. - The last parameter for many of the operations was specified incorrectly. The last problem resulted in occasional SYZFAILs when IPC_STAT is used since the output region doesn't get set up properly and in some cases can cause kcov data to be overwritten.
Diffstat (limited to 'sys')
-rw-r--r--sys/freebsd/ipc.txt43
-rw-r--r--sys/freebsd/ipc.txt.const1
2 files changed, 20 insertions, 24 deletions
diff --git a/sys/freebsd/ipc.txt b/sys/freebsd/ipc.txt
index fc6876bfd..5d7f8fadc 100644
--- a/sys/freebsd/ipc.txt
+++ b/sys/freebsd/ipc.txt
@@ -36,19 +36,17 @@ semop(semid ipc_sem, ops ptr[in, array[sembuf]], nops len[ops])
# Since we don't have strict const enforcement, we need to apply it to all variants.
# When/if we have stricter enforcement of arguments for syscall variants, we may remove some of the attributes.
-__semctl$IPC_STAT(semid ipc_sem, semnum const[0], cmd const[IPC_STAT], arg buffer[out]) (ignore_return)
-__semctl$IPC_SET(semid ipc_sem, semnum const[0], cmd const[IPC_SET], arg ptr[in, semid_ds]) (ignore_return)
+__semctl$IPC_STAT(semid ipc_sem, semnum const[0], cmd const[IPC_STAT], arg ptr[in, ptr[out, semid_ds]]) (ignore_return)
+__semctl$IPC_SET(semid ipc_sem, semnum const[0], cmd const[IPC_SET], arg ptr[in, ptr[in, semid_ds]]) (ignore_return)
__semctl$IPC_RMID(semid ipc_sem, semnum const[0], cmd const[IPC_RMID]) (ignore_return)
-__semctl$IPC_INFO(semid ipc_sem, semnum flags[sem_sem_id], cmd const[IPC_INFO], buf buffer[out]) (ignore_return)
-__semctl$SEM_INFO(semid ipc_sem, semnum flags[sem_sem_id], cmd const[SEM_INFO], arg buffer[out]) (ignore_return)
-__semctl$SEM_STAT(semid ipc_sem, semnum flags[sem_sem_id], cmd const[SEM_STAT], arg buffer[out]) (ignore_return)
-__semctl$GETALL(semid ipc_sem, semnum const[0], cmd const[GETALL], arg buffer[out]) (ignore_return)
-__semctl$GETNCNT(semid ipc_sem, semnum flags[sem_sem_id], cmd const[GETNCNT], arg buffer[out]) (ignore_return)
-__semctl$GETPID(semid ipc_sem, semnum flags[sem_sem_id], cmd const[GETPID], arg buffer[out]) (ignore_return)
-__semctl$GETVAL(semid ipc_sem, semnum flags[sem_sem_id], cmd const[GETVAL], arg buffer[out]) (ignore_return)
-__semctl$GETZCNT(semid ipc_sem, semnum flags[sem_sem_id], cmd const[GETZCNT], arg buffer[out]) (ignore_return)
+__semctl$SEM_STAT(semid ipc_sem, semnum flags[sem_sem_id], cmd const[SEM_STAT], arg ptr[in, ptr[out, semid_ds]]) (ignore_return)
+__semctl$GETALL(semid ipc_sem, semnum const[0], cmd const[GETALL], arg ptr[in, array[int16]]) (ignore_return)
+__semctl$GETNCNT(semid ipc_sem, semnum flags[sem_sem_id], cmd const[GETNCNT]) (ignore_return)
+__semctl$GETZCNT(semid ipc_sem, semnum flags[sem_sem_id], cmd const[GETZCNT]) (ignore_return)
+__semctl$GETPID(semid ipc_sem, semnum flags[sem_sem_id], cmd const[GETPID]) (ignore_return)
+__semctl$GETVAL(semid ipc_sem, semnum flags[sem_sem_id], cmd const[GETVAL]) (ignore_return)
__semctl$SETALL(semid ipc_sem, semnum const[0], cmd const[SETALL], arg ptr[in, array[int16]]) (ignore_return)
-__semctl$SETVAL(semid ipc_sem, semnum flags[sem_sem_id], cmd const[SETVAL], arg ptr[in, int32]) (ignore_return)
+__semctl$SETVAL(semid ipc_sem, semnum flags[sem_sem_id], cmd const[SETVAL], arg ptr[in, ptr[in, int32]]) (ignore_return)
resource ipc_shm[ipc]
resource shmaddr[intptr]: 0
@@ -97,16 +95,14 @@ shm_open2_flags = SHM_ALLOW_SEALING, SHM_GROW_ON_WRITE, SHM_LARGEPAGE
shm_rename_flags = SHM_RENAME_EXCHANGE, SHM_RENAME_NOREPLACE
ipc_perm {
- key int32
- uid uid
- gid gid
cuid uid
cgid gid
- mode flags[open_mode, int32]
+ uid uid
+ gid gid
+ mode flags[open_mode, int16]
seq int16
- pad0 const[0, int16]
- pad1 const[0, intptr]
- pad2 const[0, intptr]
+ pad0 const[0, int32]
+ key intptr
}
msqid_ds {
@@ -139,11 +135,12 @@ shmid_ds {
semid_ds {
perm ipc_perm
- otime intptr
- ctime intptr
- nsems intptr
- pad0 const[0, intptr]
- pad1 const[0, intptr]
+ base intptr
+ nsems int16
+ pad0 const[0, int16]
+ pad1 const[0, int32]
+ otime int64
+ ctime int64
}
sembuf {
diff --git a/sys/freebsd/ipc.txt.const b/sys/freebsd/ipc.txt.const
index 57386860e..14bc65137 100644
--- a/sys/freebsd/ipc.txt.const
+++ b/sys/freebsd/ipc.txt.const
@@ -21,7 +21,6 @@ O_EXCL = 2048
O_RDONLY = 0
O_RDWR = 2
O_TRUNC = 1024
-SEM_INFO = 11
SEM_STAT = 10
SEM_UNDO = 4096
SETALL = 9