From: Martin R. <mr...@us...> - 2005-03-22 19:13:58
|
Update of /cvsroot/ltp/ltp/testcases/misc/selinux-testsuite/tests/sem In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27130/tests/sem Added Files: Makefile selinux_getinfo.c selinux_sem.sh selinux_semctl.c selinux_semget.c selinux_semop.c Log Message: Initial release --- NEW FILE: selinux_semget.c --- #include <sys/types.h> #include <stdio.h> #include <stdlib.h> #include <getopt.h> #include <sys/sem.h> int main(int argc, char **argv) { char ch; int num = 1; int key = 0x8888; int id; while ((ch = getopt(argc, argv, "k:-n:")) != EOF) { switch (ch) { case 'k': key = atoi(optarg); break; case 'n': num = atoi(optarg); break; } } id = semget(key, num, IPC_CREAT|0777); if (id == -1) return 1; printf("semget succeeded: key = %d, id = %d\n", key, id); return 0; } --- NEW FILE: selinux_semctl.c --- #include <sys/types.h> #include <stdio.h> #include <stdlib.h> #include <getopt.h> #include <sys/sem.h> #if defined(__GNU_LIBRARY__) && !defined(_SEM_SEMUN_UNDEFINED) /* union semun is defined by including <sys/sem.h> */ #else /* according to X/OPEN we have to define it ourselves */ union semun { int val; /* value for SETVAL */ struct semid_ds *buf; /* buffer for IPC_STAT, IPC_SET */ unsigned short int *array; /* array for GETALL, SETALL */ struct seminfo *__buf; /* buffer for IPC_INFO */ }; #endif int main(int argc, char **argv) { char ch; int num = 1; int key = 0x8888; int id; int error; union semun arg; struct semid_ds semid_buf; while ((ch = getopt(argc, argv, "k:-n:")) != EOF) { switch (ch) { case 'k': key = atoi(optarg); break; case 'n': num = atoi(optarg); break; } } id = semget(key, num, IPC_CREAT|0777); if (id == -1) return 1; /* * Equivalent: IPC_STAT, SEM_STAT * Tests: SEM__GETATTR | SEM__ASSOCIATE */ arg.buf = &semid_buf; error = semctl(id, 0, IPC_STAT, arg); printf ("%d", error); /* * Equivalent: GETPID, GETNCNT, GETZCNT * Tests: SEM__GETATTR */ error = semctl(id, 0, GETPID, NULL); printf (" %d", error); /* * Equivalent: GETVAL, GETALL * Tests: SEM__READ */ error = semctl(id, 0, GETVAL, NULL); printf (" %d", error); /* * Equivalent: SETVAL, SETALL * Tests: SEM__WRITE */ arg.val = 1; error = semctl(id, 0, SETVAL, arg); printf (" %d", error); /* * Equivalent: IPC_SET * Tests: SEM__SETATTR */ arg.buf = &semid_buf; error = semctl(id, 0, IPC_SET, arg); printf (" %d", error); /* * Equivalent: IPC_RMID * Tests: SEM__DESTROY */ error = semctl(id, 0, IPC_RMID, NULL); printf (" %d", error); printf("\n"); return 0; } --- NEW FILE: selinux_semop.c --- #include <sys/types.h> #include <stdio.h> #include <stdlib.h> #include <getopt.h> #include <sys/sem.h> int main(int argc, char **argv) { char ch; int num = 1; int key = 0x8888; int id; int error; struct sembuf buf; while ((ch = getopt(argc, argv, "k:-n:")) != EOF) { switch (ch) { case 'k': key = atoi(optarg); break; case 'n': num = atoi(optarg); break; } } id = semget(key, num, IPC_CREAT|0777); if (id == -1) return 1; buf.sem_num = 0; buf.sem_op = 1; buf.sem_flg = IPC_NOWAIT; error = semop(id, &buf, 1); printf("semop: returned %d\n", error); return error; } --- NEW FILE: selinux_sem.sh --- #!/bin/sh # ================================================================= # # Basic Semaphore Test Cases # # ================================================================= # test01() { TCID="test01" TST_COUNT=1 RC=0 # First time should just get the resource output=`runcon -t test_ipc_base_t selinux_semget` RC=$? if [ $RC -eq 0 ] then echo "Test #1: sem passed." else echo "Test #1: sem failed." return $RC fi ipcid=`echo $output | grep -o id\ =\ [0-9]*$ | awk '{ print $NF }'` if [ ! $ipcid ] then echo "Test #1: Invalid output from selinux_semget." fi return $RC } test02() { TCID="test02" TST_COUNT=2 RC=0 # Test ipc_info permission runcon -t test_ipc_base_t -- selinux_getinfo RC=$? if [ $RC -eq 0 ] then echo "Test #2: sem passed." else echo "Test #2: sem failed." fi return $RC } test03() { TCID="test03" TST_COUNT=3 RC=0 runcon -t test_ipc_none_t -- selinux_getinfo RC=$? if [ $RC -ne 0 ] then echo "Test #3: sem passed." return 0 else echo "Test #3: sem failed." return 1 fi } test04() { TCID="test04" TST_COUNT=4 RC=0 # Delete the resource runcon -t test_ipc_base_t ipcrm sem $ipcid RC=$? if [ $RC -eq 0 ] then echo "Test #4: sem passed." else echo "Test #4: sem failed." fi return $RC } test05() { TCID="test05" TST_COUNT=5 RC=0 # Create it again output=`runcon -t test_ipc_base_t selinux_semget` RC=$? if [ $RC -eq 0 ] then echo "Test #5: sem passed." else echo "Test #5: sem failed." return $RC fi ipcid=`echo $output | grep -o id\ =\ [0-9]*$ | awk '{ print $NF }'` if [ ! $ipcid ] then echo "Test #5: Invalid output from selinux_semget." fi return $RC } test06() { TCID="test06" TST_COUNT=6 RC=0 # Create it one more time to check associate permission output=`runcon -t test_ipc_base_t selinux_semget` RC=$? if [ $RC -eq 0 ] then echo "Test #6: sem passed." else echo "Test #6: sem failed." return $RC fi ipcid2=`echo $output | grep -o id\ =\ [0-9]*$ | awk '{ print $NF }'` if [ ! $ipcid2 ] then echo "Test #6: Invalid output from selinux_semget." fi return $RC } test07() { TCID="test07" TST_COUNT=7 RC=0 # Make sure they match if [ $ipcid = $ipcid2 ] then echo "Test #7: sem passed." return 0 else echo "Test #7: sem failed." return 1 fi } test08() { TCID="test08" TST_COUNT=8 RC=0 # Try to associate with it from the read-only domain output=`runcon -t test_ipc_read_t selinux_semget` RC=$? if [ $RC -eq 0 ] then echo "Test #8: sem passed." else echo "Test #8: sem failed." return $RC fi ipcid=`echo $output | grep -o id\ =\ [0-9]*$ | awk '{ print $NF }'` if [ ! $ipcid ] then echo "Test #8: Invalid output from selinux_semget." fi return $RC } test09() { TCID="test09" TST_COUNT=9 RC=0 # Try to associate with it from the unprivileged domain output=`runcon -t test_ipc_none_t selinux_semget` RC=$? if [ $RC -ne 0 ] then echo "Test #9: sem passed." return 0 else echo "Test #9: sem failed." return 1 fi } # ================================================================= # # Semaphore Control Tests (semctl syscall) # # ================================================================= # test10() { TCID="test10" TST_COUNT=10 RC=0 # run semaphore control tests, we expect all to fail output=`runcon -t test_ipc_associate_t selinux_semctl` number=`echo $output | awk '{ print NF }'` result=`echo $output | awk '{s = 0; n=split($0,a," "); for (i=1; i <= NF; i++) s += a[i]; print s }'` # The results should be a row of -1's. The only way # I know to check this is to add up results and see if they # are equal to -<number of fields>. # Change this if there is a better way to do this check in shell. if [ $result = "-$number" ] then echo "Test #10: sem passed." return 0 else echo "Test #10: sem failed." return 1 fi } test11() { TCID="test11" TST_COUNT=11 RC=0 # run semaphore control tests, we expect all to succeed # last test should delete the semaphore output=`runcon -t test_ipc_base_t selinux_semctl` result=`echo $output | awk '{s = 0; n=split($0,a," "); for (i=1; i <= NF; i++) s += a[i]; print s }'` # The results should be a row of 0's. The only way # I know to check this is to add up results and see if they # are equal to zero. # Change this if there is a better way to do this check in shell. if [ $result = 0 ] then echo "Test #11: sem passed." return 0 else echo "Test #11: sem failed." return 1 fi } # ================================================================= # # Semaphore Operation Tests (semop) # # ================================================================= # test12() { TCID="test12" TST_COUNT=12 RC=0 runcon -t test_ipc_base_t selinux_semop RC=$? if [ $RC -eq 0 ] then echo "Test #12: sem passed." else echo "Test #12: sem failed." fi return $RC } test13() { TCID="test13" TST_COUNT=13 RC=0 runcon -t test_ipc_associate_t selinux_semop RC=$? if [ $RC -ne 0 ] then echo "Test #13: sem passed." return 0 else echo "Test #13: sem failed." return 1 fi } cleanup() { # Cleanup output=`runcon -t test_ipc_base_t selinux_semget` ipcid=`echo $output | grep -o id\ =\ [0-9]*$ | awk '{ print $NF }'` if [ ! $ipcid ] then echo "cleanup: Invalid output from selinux_semget." fi runcon -t test_ipc_base_t ipcrm sem $ipcid } # Function: main # # Description: - Execute all tests, exit with test status. # # Exit: - zero on success # - non-zero on failure. # RC=0 # Return value from setup, and test functions. test01 || exit $RC test02 || exit $RC test03 || exit $RC test04 || exit $RC test05 || exit $RC test06 || exit $RC test07 || exit $RC test08 || exit $RC test09 || exit $RC test10 || exit $RC test11 || exit $RC test12 || exit $RC test13 || exit $RC cleanup exit 0 --- NEW FILE: Makefile --- TARGETS=$(patsubst %.c,%,$(wildcard *.c)) all: $(TARGETS) install: @set -e; for i in $(TARGETS); do ln -f $$i ../../../../bin/$$i ; done ln -f selinux_sem.sh ../../../../bin/ clean: rm -f $(TARGETS) --- NEW FILE: selinux_getinfo.c --- #include <sys/types.h> #include <stdio.h> #include <stdlib.h> #include <getopt.h> #include <sys/sem.h> #if defined(__GNU_LIBRARY__) && !defined(_SEM_SEMUN_UNDEFINED) /* union semun is defined by including <sys/sem.h> */ #else /* according to X/OPEN we have to define it ourselves */ union semun { int val; /* value for SETVAL */ struct semid_ds *buf; /* buffer for IPC_STAT, IPC_SET */ unsigned short int *array; /* array for GETALL, SETALL */ struct seminfo *__buf; /* buffer for IPC_INFO */ }; #endif int main(int argc, char **argv) { char ch; int num = 1; int key = 0x8888; int id; int error; union semun arg; struct seminfo seminfo; arg.array = (ushort *) &seminfo; error = semctl(0, 0, SEM_INFO, arg); printf ("semctl: SEM_INFO result = %d\n", error); return (error < 0); } |