[PATCH v2] Fix crash in ipc_sem test

Andreas Schwab schwab at suse.de
Mon Mar 16 11:06:12 UTC 2015


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    | 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 eddddd4..9373482 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, %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;
 }
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.3


-- 
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