Module Name: src
Committed By: martin
Date: Thu Oct 10 07:45:02 UTC 2024
Modified Files:
src/tests/kernel: t_semtimedop.c
Log Message:
Fix semctl(..., SETVAL, value) calls: you can not pass an integer 0
to a variadic function expecting a union with all ABIs, as they may not
promote to the same type.
For example on powerpc this caused the test program to crash with a NULL
deref when evaluating the va_arg().
To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 src/tests/kernel/t_semtimedop.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/tests/kernel/t_semtimedop.c
diff -u src/tests/kernel/t_semtimedop.c:1.1 src/tests/kernel/t_semtimedop.c:1.2
--- src/tests/kernel/t_semtimedop.c:1.1 Thu Oct 3 17:11:14 2024
+++ src/tests/kernel/t_semtimedop.c Thu Oct 10 07:45:02 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: t_semtimedop.c,v 1.1 2024/10/03 17:11:14 christos Exp $ */
+/* $NetBSD: t_semtimedop.c,v 1.2 2024/10/10 07:45:02 martin Exp $ */
/*-
* Copyright (c) 2024 The NetBSD Foundation, Inc.
@@ -26,7 +26,7 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_semtimedop.c,v 1.1 2024/10/03 17:11:14 christos Exp $");
+__RCSID("$NetBSD: t_semtimedop.c,v 1.2 2024/10/10 07:45:02 martin Exp $");
#include <sys/types.h>
#include <sys/ipc.h>
@@ -40,6 +40,12 @@ __RCSID("$NetBSD: t_semtimedop.c,v 1.1 2
#include <atf-c.h>
#include <sys/wait.h>
+union semun {
+ int val; /* value for SETVAL */
+ struct semid_ds *buf; /* buffer for IPC_{STAT,SET} */
+ u_short *array; /* array for GETALL & SETALL */
+};
+
ATF_TC(semtimedop_basic);
ATF_TC_HEAD(semtimedop_basic, tc)
{
@@ -51,6 +57,7 @@ ATF_TC_BODY(semtimedop_basic, tc)
key_t key = IPC_PRIVATE;
int semid;
struct sembuf sops;
+ union semun sun;
struct timespec timeout;
/* Create semaphore set with 1 semaphore */
@@ -58,7 +65,8 @@ ATF_TC_BODY(semtimedop_basic, tc)
ATF_REQUIRE_MSG(semid != -1, "semget failed: %s", strerror(errno));
/* Initialize semaphore to 0 */
- if (semctl(semid, 0, SETVAL, 0) == -1) {
+ sun.val = 0;
+ if (semctl(semid, 0, SETVAL, sun) == -1) {
ATF_REQUIRE_MSG(0, "semctl SETVAL failed: %s",
strerror(errno));
}
@@ -100,6 +108,7 @@ ATF_TC_BODY(semtimedop_timeout, tc)
key_t key = IPC_PRIVATE;
int semid;
struct sembuf sops;
+ union semun sun;
struct timespec timeout;
pid_t pid;
int status;
@@ -109,7 +118,8 @@ ATF_TC_BODY(semtimedop_timeout, tc)
ATF_REQUIRE_MSG(semid != -1, "semget failed: %s", strerror(errno));
/* Initialize semaphore to 0 */
- if (semctl(semid, 0, SETVAL, 0) == -1) {
+ sun.val = 0;
+ if (semctl(semid, 0, SETVAL, sun) == -1) {
ATF_REQUIRE_MSG(0, "semctl SETVAL failed: %s", strerror(errno));
}
@@ -159,6 +169,7 @@ ATF_TC_BODY(semtimedop_semundo, tc)
key_t key = IPC_PRIVATE;
int semid;
struct sembuf sops;
+ union semun sun;
struct timespec timeout;
pid_t pid;
int val;
@@ -168,7 +179,8 @@ ATF_TC_BODY(semtimedop_semundo, tc)
ATF_REQUIRE_MSG(semid != -1, "semget failed: %s", strerror(errno));
/* Initialize semaphore to 0 */
- if (semctl(semid, 0, SETVAL, 0) == -1) {
+ sun.val = 0;
+ if (semctl(semid, 0, SETVAL, sun) == -1) {
ATF_REQUIRE_MSG(0, "semctl SETVAL failed: %s", strerror(errno));
}
@@ -216,6 +228,7 @@ ATF_TC_HEAD(semtimedop_invalid, tc)
ATF_TC_BODY(semtimedop_invalid, tc)
{
struct sembuf sops;
+ union semun sun;
struct timespec timeout;
/* Invalid semaphore id */
@@ -236,7 +249,8 @@ ATF_TC_BODY(semtimedop_invalid, tc)
ATF_REQUIRE_MSG(semid != -1, "semget failed: %s", strerror(errno));
/* Initialize semaphore to 0 */
- if (semctl(semid, 0, SETVAL, 0) == -1) {
+ sun.val = 0;
+ if (semctl(semid, 0, SETVAL, sun) == -1) {
ATF_REQUIRE_MSG(0, "semctl SETVAL failed: %s", strerror(errno));
}