]> granicus.if.org Git - strace/blobdiff - tests/ipc_sem.c
Fix crash in ipc_sem test
[strace] / tests / ipc_sem.c
index eddddd4577e711efecd6f64f2366fdde0edb0a38..9373482af0f4877545d018e6175ae618f9e24dd8 100644 (file)
@@ -2,10 +2,19 @@
 #include <errno.h>
 #include <sys/sem.h>
 
+union semun {
+       int              val;    /* Value for SETVAL */
+       struct semid_ds *buf;    /* Buffer for IPC_STAT, IPC_SET */
+       unsigned short  *array;  /* Array for GETALL, SETALL */
+       struct seminfo  *__buf;  /* Buffer for IPC_INFO
+                                   (Linux-specific) */
+};
+
 int
 main(void)
 {
        int rc, id;
+       union semun un;
        struct semid_ds ds;
        struct seminfo info;
 
@@ -14,16 +23,19 @@ main(void)
                return 77;
        printf("semget\\(IPC_PRIVATE, 1, 0600\\) += %d\n", id);
 
-       if (semctl(id, 0, IPC_STAT, &ds))
+       un.buf = &ds;
+       if (semctl(id, 0, IPC_STAT, un))
                goto fail;
        printf("semctl\\(%d, 0, IPC_STAT, %p\\) += 0\n", id, &ds);
 
-       int max = semctl(0, 0, SEM_INFO, &info);
+       un.__buf = &info;
+       int max = semctl(0, 0, SEM_INFO, un);
        if (max < 0)
                goto fail;
        printf("semctl\\(0, 0, SEM_INFO, %p\\) += %d\n", &info, max);
 
-       rc = semctl(id, 0, SEM_STAT, &ds);
+       un.buf = &ds;
+       rc = semctl(id, 0, SEM_STAT, un);
        if (rc != id) {
                /*
                 * In linux < v2.6.24-rc1 the first argument must be
@@ -44,10 +56,6 @@ done:
        return rc;
 
 fail:
-       /*
-        * If the kernel failed, SKIP the test.  We want to ignore
-        * such failures as they're out of scope for this project.
-        */
-       rc = errno == EFAULT ? 77 : 1;
+       rc = 1;
        goto done;
 }