]> granicus.if.org Git - strace/commitdiff
Fix crash in ipc_sem test
authorAndreas Schwab <schwab@suse.de>
Wed, 11 Mar 2015 11:33:30 +0000 (12:33 +0100)
committerAndreas Schwab <schwab@suse.de>
Mon, 16 Mar 2015 11:18:36 +0000 (12:18 +0100)
Properly use union semun as argument of semctl.

* tests/ipc_sem.c (main): Properly use union semun as argument of
semctl.  Don't handle EFAULT specially.
* tests/ipc_sem.test: Revert last change.

tests/ipc_sem.c
tests/ipc_sem.test

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;
 }
index f448b66e6c8257a96be9936cb84177a06c04936d..b8fa545f5f94abd3a9703300f6872521a4411141 100755 (executable)
@@ -8,23 +8,12 @@ check_prog grep
 
 OUT="$LOG.out"
 
-./ipc_sem > "$OUT" || {
-       case $? in
-       77)
-               rm -f "$OUT"
+./ipc_sem > /dev/null || {
+       if [ $? -eq 77 ]; then
                framework_skip_ 'ipc semget/semctl syscalls do not behave as expected'
-               ;;
-       99)
-               cat "$OUT"
-               rm -f "$OUT"
-               framework_failure_ 'broken kernel detected'
-               ;;
-       *)
-               cat "$OUT"
-               rm -f "$OUT"
+       else
                fail_ 'ipc_sem failed'
-               ;;
-       esac
+       fi
 }
 
 args='-eipc ./ipc_sem'