[PATCH] Fix crash in ipc_sem test
Andreas Schwab
schwab at suse.de
Wed Mar 11 12:08:58 UTC 2015
Properly use union semun as argument of semctl.
* ipc_sem.c (main): Properly use union semun as argument of
semctl. Don't handle EFAULT specially.
* ipc_sem.test: Revert last change.
---
tests/ipc_sem.c | 24 ++++++++++++++++--------
tests/ipc_sem.test | 19 ++++---------------
2 files changed, 20 insertions(+), 23 deletions(-)
diff --git a/tests/ipc_sem.c b/tests/ipc_sem.c
index e8662c4..f3ebfa9 100644
--- a/tests/ipc_sem.c
+++ b/tests/ipc_sem.c
@@ -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, .*\\) += 0\n", id);
- 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, .*\\) += %d\n", 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;
}
diff --git a/tests/ipc_sem.test b/tests/ipc_sem.test
index f448b66..b8fa545 100755
--- a/tests/ipc_sem.test
+++ b/tests/ipc_sem.test
@@ -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'
--
2.3.2
--
Andreas Schwab, SUSE Labs, schwab at suse.de
GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE 1748 E4D4 88E3 0EEA B9D7
"And now for something completely different."
More information about the Strace-devel
mailing list