From: Robert W. <ro...@us...> - 2005-03-21 22:49:05
|
Update of /cvsroot/ltp/ltp/testcases/kernel/syscalls/capset In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv29087/testcases/kernel/syscalls/capset Modified Files: capset02.c Log Message: Applied patch from Gernot Payer: ================================ Hi all, in recent runs I experienced unexpected failures with these testcases and found out that subtestcases in these programs have some bugs. mincore01 --------- One test case tests, whether with parameter length < 0 EINVAL is returned. However this parameter has type size_t, which is unsigned. The kernel only returns EINVAL if start + length < start (overflow). Otherwise this syscall will return ENOMEM (unmapped virtual memory in [start,start+length) ) or might even succeed. Because of this uncertainty, I dropped this subtestcase. shmget02 -------- One sub test case tests what happens, if a nonexisting key is used without flag IPC_CREAT. In this testcase it is assumed that -1 is never used as a key. However -1 is a perfectly legal key, so it might exist. My patch tests for a nonexisting key, which can be used in this test case. capset02 -------- Subtestcase 4 assumes that capset cannot be used at all by a normal process, because capability CAP_SETPCAP is missing. However with current 2.6.x kernels a root process can set all capabilities it already owns to itself (i.e. everything except SET_PCAP). My patch now changes two things: - a child process is created which does nothing else than sleeping - subtestcase 4 uses capset on the child process mfg Gernot Index: capset02.c =================================================================== RCS file: /cvsroot/ltp/ltp/testcases/kernel/syscalls/capset/capset02.c,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** capset02.c 2 Oct 2003 17:38:04 -0000 1.5 --- capset02.c 21 Mar 2005 22:48:56 -0000 1.6 *************** *** 75,79 **** --- 75,83 ---- ****************************************************************/ #include <errno.h> + #include <string.h> #include <pwd.h> + #include <unistd.h> + #include <sys/types.h> + #include <signal.h> #include "test.h" #include "usctest.h" *************** *** 99,102 **** --- 103,108 ---- static void test_setup(int); + static pid_t child_pid = -1; + char *TCID = "capset02"; /* Test program identifier. */ extern int Tst_count; /* Test Case counter for tst_* routines */ *************** *** 202,205 **** --- 208,213 ---- cleanup() { + if(child_pid > 0) + kill(child_pid,SIGTERM); /* * print timing stats if that option was specified. *************** *** 212,219 **** } /* End cleanup() */ void test_setup(int i) { - switch (i) { --- 220,232 ---- } /* End cleanup() */ + void child_func() + { + signal(SIGTERM,SIG_DFL); + for(;;) { sleep(10); } + } + void test_setup(int i) { switch (i) { *************** *** 239,244 **** * a non-zero pid results in capset() failing with * errno EPERM */ ! header.pid = getpid(); break; --- 252,273 ---- * a non-zero pid results in capset() failing with * errno EPERM + * + * Note: this seems to have changed with recent kernels + * => create a child and try to set its capabilities */ ! child_pid = fork(); ! switch(child_pid) { ! case -1: ! tst_resm(TBROK,"fork() failed: %s\n",strerror(errno)); ! cleanup(); ! break; ! case 0: ! child_func(); ! break; ! default: ! signal(SIGCHLD,SIG_IGN); ! header.pid = child_pid; ! break; ! } break; |