@@ -10,6 +10,7 @@
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/sem.h>
+#include "lapi/sem.h"
int safe_msgget(const char *file, const int lineno, key_t key, int msgflg);
#define SAFE_MSGGET(key, msgflg) \
@@ -58,11 +59,14 @@ int safe_semget(const char *file, const int lineno, key_t key, int nsems,
safe_semget(__FILE__, __LINE__, (key), (nsems), (semflg))
int safe_semctl(const char *file, const int lineno, int semid, int semnum,
- int cmd, ...);
-#define SAFE_SEMCTL(semid, semnum, cmd, ...) ({ \
- int tst_ret_ = safe_semctl(__FILE__, __LINE__, (semid), (semnum), \
- (cmd), ##__VA_ARGS__); \
- (semid) = ((cmd) == IPC_RMID ? -1 : (semid)); \
+ int cmd, union semun un);
+#define __SAFE_SEMCTL(semid, semnum, cmd, un, ...) \
+ safe_semctl(__FILE__, __LINE__, (semid), (semnum), (cmd), (un))
+
+#define SAFE_SEMCTL(semid, semnum, cmd, ...) ({ \
+ int tst_ret_ = __SAFE_SEMCTL((semid), (semnum), (cmd), ##__VA_ARGS__, \
+ (union semun){0}); \
+ (semid) = ((cmd) == IPC_RMID ? -1 : (semid)); \
tst_ret_; })
int safe_semop(const char *file, const int lineno, int semid, struct sembuf *sops,
@@ -228,17 +228,9 @@ int safe_semget(const char *file, const int lineno, key_t key, int nsems,
}
int safe_semctl(const char *file, const int lineno, int semid, int semnum,
- int cmd, ...)
+ int cmd, union semun un)
{
int rval;
- va_list va;
- union semun un;
-
- va_start(va, cmd);
-
- un = va_arg(va, union semun);
-
- va_end(va);
rval = semctl(semid, semnum, cmd, un);
Accessing elements in an empty va_list is undefined behaviour. Therefore, remove the variadicness from safe_semctl as it always calls semctl with the union semun argument included. Adapt the SAFE_SEMCTL macro to handle the change by passing a zero-initialised union semun if it's omitted. Signed-off-by: Tudor Cretu <tudor.cretu@arm.com> --- include/tst_safe_sysv_ipc.h | 14 +++++++++----- lib/tst_safe_sysv_ipc.c | 10 +--------- 2 files changed, 10 insertions(+), 14 deletions(-)