Hi!
Folowing patch fixes/cleanups lchown tests.
lchown01 changes:
* make a better use of ltp test interface
* make error messages consistent
* various coding style issues
lchown02 changes:
* all test setups are now done in setup functions
* eliminated need for external script for preparing tempfile
* make a better use of ltp test interface
* make error messages consistent
* various coding style issues
* fix lchown02 invocation in runtest files
Signed-off-by: Cyril Hrubis [email protected]
--
Cyril Hrubis
[email protected]
diff --git a/runtest/ltplite b/runtest/ltplite
index 516ba7c..0b0368c 100644
--- a/runtest/ltplite
+++ b/runtest/ltplite
@@ -373,7 +373,7 @@ kill11 ulimit -c 1024;kill11
kill12 kill12
lchown01 lchown01
-lchown02 prep_create_link; lchown02
+lchown02 lchown02
link01 symlink01 -T link01
link02 link02
diff --git a/runtest/stress.part3 b/runtest/stress.part3
index c2903f5..55d4fe5 100644
--- a/runtest/stress.part3
+++ b/runtest/stress.part3
@@ -306,7 +306,7 @@ kill11 ulimit -c 1024;kill11
kill12 kill12
lchown01 lchown01
-lchown02 prep_create_link; lchown02
+lchown02 lchown02
link01 symlink01 -T link01
link02 link02
diff --git a/runtest/syscalls b/runtest/syscalls
index b2bf144..e0d1e10 100644
--- a/runtest/syscalls
+++ b/runtest/syscalls
@@ -462,8 +462,8 @@ kill12 kill12
lchown01 lchown01
lchown01_16 lchown01_16
-lchown02 prep_create_link; lchown02
-lchown02_16 prep_create_link; lchown02_16
+lchown02 lchown02
+lchown02_16 lchown02_16
libevent01 export LTPROOT; $LTPROOT/testcases/bin/libevent/run_libevent.sh
diff --git a/testcases/kernel/syscalls/lchown/Makefile b/testcases/kernel/syscalls/lchown/Makefile
index 829746d..fba133f 100644
--- a/testcases/kernel/syscalls/lchown/Makefile
+++ b/testcases/kernel/syscalls/lchown/Makefile
@@ -20,12 +20,10 @@ top_srcdir ?= ../../../..
include $(top_srcdir)/include/mk/testcases.mk
+CFLAGS+=-W -Wall
+
SRCS := $(wildcard $(abs_srcdir)/lchown*.c)
include $(abs_srcdir)/../utils/compat_16.mk
-INSTALL_TARGETS := prep_create_link
-
-MAKE_TARGETS += create_link
-
include $(top_srcdir)/include/mk/generic_leaf_target.mk
diff --git a/testcases/kernel/syscalls/lchown/create_link.c b/testcases/kernel/syscalls/lchown/create_link.c
deleted file mode 100644
index 0cb53ec..0000000
--- a/testcases/kernel/syscalls/lchown/create_link.c
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- *
- * Copyright (c) International Business Machines Corp., 2001
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
- * the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-/*
- * Description: This is a setuid to root program invoked by a non-root
- * process to change the user id/group id bits on the test
- * directory/file created in the setup function.
- * It sets uid to another non-root user and creates a
- * symlink of testfile/directory.
- *
- * This function exit with 0 or 1 depending upon the
- * success/failure each system call.
- */
-
-#include <libgen.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <pwd.h>
-#include <grp.h>
-#include <errno.h>
-#include <string.h>
-
-#define LTPUSER "bin"
-#define LTPGRP "bin"
-#define SFILE1 "sfile_1"
-
-int main(int argc, char **argv)
-{
- int rc = 1; /* Failed until proven passed ;). */
- struct passwd *ltpuser; /* password struct for nobody */
- struct group *ltpgroup; /* group struct for nobody */
- uid_t user_uid; /* user id of nobody */
- gid_t group_gid; /* group id of nobody */
- char *path_name; /* name of test directory/file */
-
- path_name = argv[1];
-
- if (argc != 2) {
- fprintf(stderr, "usage: %s filename\n", basename(*argv));
- exit (1);
- } else if ((ltpuser = getpwnam(LTPUSER)) == NULL)
- /*
- * Get the user id and group id of "ltpuser" user from password
- * and group files.
- */
- fprintf(stderr, "change_owner: %s not found in /etc/passwd",
- LTPUSER);
- else if ((ltpgroup = getgrnam(LTPGRP)) == NULL)
- fprintf(stderr, "change_owner: %s not found in /etc/group",
- LTPGRP);
- else {
-
- user_uid = ltpuser->pw_uid;
- group_gid = ltpgroup->gr_gid;
-
- /*
- * Change the ownership of test directory/file specified by
- * pathname to that of LTPUSER user_uid and group_gid.
- */
- if (chown(path_name, user_uid, group_gid) < 0)
- fprintf(stderr, "change_owner: chown() of %s failed, "
- "error %d\n", path_name, errno);
- else if (setuid(user_uid) < 0)
- fprintf(stderr, "change_owner: setuid() to %s fails, error=%d",
- LTPUSER, errno);
- else if (symlink(path_name, SFILE1) < 0)
- fprintf(stderr, "change_owner: symlink() of %s Failed, "
- "errno=%d : %s", path_name, errno, strerror(errno));
- else
- rc = 0;
-
- }
-
- return rc;
-
-}
diff --git a/testcases/kernel/syscalls/lchown/lchown01.c b/testcases/kernel/syscalls/lchown/lchown01.c
index 8e83a8f..b4a8ec3 100644
--- a/testcases/kernel/syscalls/lchown/lchown01.c
+++ b/testcases/kernel/syscalls/lchown/lchown01.c
@@ -62,6 +62,7 @@
*
* HISTORY
* 07/2001 Ported by Wayne Boyer
+ * 11/2010 Code cleanup by Cyril Hrubis [email protected]
*
* RESTRICTIONS:
* This test should be run by 'super-user' (root) only.
@@ -83,65 +84,57 @@
#define TESTFILE "testfile"
#define SFILE "slink_file"
-char *TCID = "lchown01"; /* Test program identifier. */
-int TST_TOTAL = 5; /* Total number of test conditions */
-extern int Tst_count; /* Test Case counter for tst_* routines */
+char *TCID = "lchown01";
+int TST_TOTAL = 5;
+extern int Tst_count;
-struct test_case_t { /* test case struct. to test different conditions */
+struct test_case_t {
char *desc;
uid_t user_id;
gid_t group_id;
-} Test_cases[] = {
- {
- "Change Owner/Group ids", 700, 701}, {
- "Change Owner id only", 702, -1}, {
- "Change Owner id only", 703, 701}, {
- "Change Group id only", -1, 704}, {
- "Change Group id only", 703, 705}, {
- NULL, 0, 0}
};
-void setup(); /* setup function for the test */
-void cleanup(); /* cleanup function for the test */
+static struct test_case_t test_cases[] = {
+ {"Change Owner/Group ids", 700, 701},
+ {"Change Owner id only", 702, -1},
+ {"Change Owner/Group ids", 703, 701},
+ {"Change Group id only", -1, 704},
+ {"Change Group/Group ids", 703, 705},
+ {NULL, 0, 0}
+};
+
+void setup(void);
+void cleanup(void);
-int main(int ac, char **av)
+int main(int argc, char *argv[])
{
- struct stat stat_buf; /* stat(2) struct contents */
- int lc; /* loop counter */
- char *msg; /* message returned from parse_opts */
- int ind; /* counter variable for chmod(2) tests */
- uid_t User_id; /* user id of the user set for testfile */
- gid_t Group_id; /* group id of the user set for testfile */
- char *test_desc; /* test specific message */
+ struct stat stat_buf;
+ int lc, i;
+ char *msg;
- /* Parse standard options given to run the test. */
- msg = parse_opts(ac, av, (option_t *) NULL, NULL);
- if (msg != (char *)NULL) {
- tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg);
- tst_exit();
- }
+ msg = parse_opts(argc, argv, NULL, NULL);
+
+ if (msg != NULL)
+ tst_brkm(TBROK, tst_exit, "OPTION PARSING ERROR - %s", msg);
- /* Perform global setup for test */
setup();
- /* Check looping state if -i option given */
for (lc = 0; TEST_LOOPING(lc); lc++) {
/* Reset Tst_count in case we are looping. */
Tst_count = 0;
- for (ind = 0; Test_cases[ind].desc != NULL; ind++) {
- test_desc = Test_cases[ind].desc;
- User_id = Test_cases[ind].user_id;
- Group_id = Test_cases[ind].group_id;
+ for (i = 0; test_cases[i].desc != NULL; i++) {
+ uid_t user_id = test_cases[i].user_id;
+ gid_t group_id = test_cases[i].group_id;
+ char *test_desc = test_cases[i].desc;
/*
* Call lchwon(2) with different user id and
* group id (numeric values) to set it on
* symlink of testfile.
*/
- TEST(lchown(SFILE, User_id, Group_id));
+ TEST(lchown(SFILE, user_id, group_id));
- /* check return code of lchown(2) */
if (TEST_RETURN == -1) {
tst_resm(TFAIL,
"lchown() Fails to %s, errno=%d",
@@ -162,23 +155,19 @@ int main(int ac, char **av)
"%s failed, errno:%d",
SFILE, TEST_ERRNO);
}
- if (User_id == -1) {
- User_id = Test_cases[ind - 1].user_id;
- }
- if (Group_id == -1) {
- Group_id = Test_cases[ind - 1].group_id;
- }
- /*
- * Check for expected Ownership ids
- * set on testfile.
- */
- if ((stat_buf.st_uid != User_id) ||
- (stat_buf.st_gid != Group_id)) {
+ if (user_id == (uid_t)-1)
+ user_id = test_cases[i - 1].user_id;
+
+ if (group_id == (gid_t)-1)
+ group_id = test_cases[i - 1].group_id;
+
+ if ((stat_buf.st_uid != user_id) ||
+ (stat_buf.st_gid != group_id)) {
tst_resm(TFAIL,
"%s: Incorrect ownership set, "
"Expected %d %d", SFILE,
- User_id, Group_id);
+ user_id, group_id);
} else {
tst_resm(TPASS, "lchown() succeeds to "
"%s of %s", test_desc, SFILE);
@@ -187,13 +176,12 @@ int main(int ac, char **av)
tst_resm(TPASS, "call succeeded");
}
}
- } /* End for TEST_LOOPING */
+ }
- /* Call cleanup() to undo setup done for the test. */
cleanup();
- /*NOTREACHED*/ return 0;
-} /* End main */
+ return 0;
+}
/*
* setup() - performs all ONE TIME setup for this test.
@@ -201,41 +189,29 @@ int main(int ac, char **av)
* Create a test file under temporary directory and close it
* Create a symlink of testfile under temporary directory.
*/
-void setup()
+void setup(void)
{
int fd;
/* capture signals */
tst_sig(NOFORK, DEF_HANDLER, cleanup);
-
- /* Check that the test process id is super/root */
- if (geteuid() != 0) {
- tst_brkm(TBROK, NULL, "Must be super/root for this test!");
- tst_exit();
- }
-
- /* Pause if that option was specified */
+
+ tst_require_root(tst_exit);
+
TEST_PAUSE;
-
- /* make a temp directory and cd to it */
tst_tmpdir();
if ((fd = open(TESTFILE, O_RDWR | O_CREAT, FILE_MODE)) == -1) {
- tst_brkm(TBROK, cleanup,
- "open(%s, O_RDWR|O_CREAT, %o) Failed, errno=%d : %s",
- TESTFILE, FILE_MODE, errno, strerror(errno));
- }
- if (close(fd) == -1) {
- tst_brkm(TBROK, cleanup,
- "close(%s) Failed, errno=%d : %s",
- TESTFILE, errno, strerror(errno));
+ tst_brkm(TBROK | TERRNO, cleanup, "open(2) %s mode %o failed",
+ TESTFILE, FILE_MODE);
}
+
+ if (close(fd) == -1)
+ tst_brkm(TBROK | TERRNO, cleanup, "close(2) %s", TESTFILE);
- /* Create a symlink for testfile created */
if (symlink(TESTFILE, SFILE) < 0) {
- tst_brkm(TBROK, cleanup,
- "symlink() of %s Failed, errno=%d : %s",
- TESTFILE, errno, strerror(errno));
+ tst_brkm(TBROK | TERRNO, cleanup, "symlink(2) %s to %s failed",
+ TESTFILE, SFILE);
}
}
@@ -244,16 +220,10 @@ void setup()
* completion or premature exit.
* Remove the test directory and testfile created in the setup.
*/
-void cleanup()
+void cleanup(void)
{
- /*
- * print timing stats if that option was specified.
- */
TEST_CLEANUP;
- /* Remove tmp dir and all files in it */
tst_rmdir();
-
- /* exit with return code appropriate for results */
tst_exit();
}
diff --git a/testcases/kernel/syscalls/lchown/lchown02.c b/testcases/kernel/syscalls/lchown/lchown02.c
index 4f519ab..a858f85 100644
--- a/testcases/kernel/syscalls/lchown/lchown02.c
+++ b/testcases/kernel/syscalls/lchown/lchown02.c
@@ -72,6 +72,7 @@
*
* HISTORY
* 07/2001 Ported by Wayne Boyer
+ * 11/2010 Rewritten by Cyril Hrubis [email protected]
*
* RESTRICTIONS:
*
@@ -93,6 +94,7 @@
#include "test.h"
#include "usctest.h"
+#define TEST_USER "nobody"
#define MODE_RWX S_IRWXU | S_IRWXG | S_IRWXO
#define FILE_MODE S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH
#define DIR_TEMP "testdir_1"
@@ -100,105 +102,87 @@
#define SFILE1 "sfile_1"
#define TEST_FILE2 "testdir_1/tfile_2"
#define SFILE2 "testdir_1/sfile_2"
-#define TEST_FILE3 "t_file/tfile_3"
-#define SFILE3 "t_file/sfile_3"
+#define TFILE3 "t_file"
+#define SFILE3 "t_file/sfile"
-int no_setup();
-int setup1(); /* setup function to test lchown for EPERM */
-int setup2(); /* setup function to test lchown for EACCES */
-int setup3(); /* setup function to test lchown for ENOTDIR */
-int longpath_setup(); /* setup function to test chown for ENAMETOOLONG */
+char *TCID = "lchown02";
+int TST_TOTAL = 7;
+extern int Tst_count;
-char Longpathname[PATH_MAX + 2];
-char High_address_node[64];
-char EXEC_DIR[PATH_MAX];
-char main_test_dir[PATH_MAX + 2];
+static void setup_eperm(int pos);
+static void setup_eacces(int pos);
+static void setup_enotdir(int pos);
+static void setup_longpath(int pos);
+static void setup_efault(int pos);
+static void setup_highaddress(int pos);
-struct test_case_t { /* test case struct. to hold ref. test cond's */
+static char path[PATH_MAX + 2];
+
+struct test_case_t {
char *pathname;
char *desc;
int exp_errno;
- int (*setupfunc) ();
-} Test_cases[] = {
- {
- SFILE1, "Process is not owner/root", EPERM, setup1}, {
- SFILE2, "No Search permissions to process", EACCES, setup2}, {
- High_address_node, "Address beyond address space", EFAULT, no_setup},
- {
- (char *)-1, "Negative address", EFAULT, no_setup}, {
- Longpathname, "Pathname too long", ENAMETOOLONG, longpath_setup}, {
- "", "Pathname is empty", ENOENT, no_setup}, {
- SFILE3, "Path contains regular file", ENOTDIR, setup3}, {
- NULL, NULL, 0, no_setup}
+ void (*setup)(int pos);
};
-char *TCID = "lchown02"; /* Test program identifier. */
-int TST_TOTAL = 7; /* Total number of test cases. */
-extern int Tst_count; /* Test Case counter for tst_* routines */
-int exp_enos[] = { EPERM, EACCES, EFAULT, ENAMETOOLONG, ENOENT, ENOTDIR, 0 };
+static struct test_case_t test_cases[] = {
+ {SFILE1, "Process is not owner/root", EPERM, setup_eperm},
+ {SFILE2, "Search permission denied", EACCES, setup_eacces},
+ {NULL, "Address beyond address space", EFAULT, setup_highaddress},
+ {NULL, "Unaccessible address space", EFAULT, setup_efault},
+ {path, "Pathname too long", ENAMETOOLONG, setup_longpath},
+ {SFILE3, "Path contains regular file", ENOTDIR, setup_enotdir},
+ {"", "Pathname is empty", ENOENT, NULL},
+ {NULL, NULL, 0, NULL}
+};
-char nobody_uid[] = "nobody";
-struct passwd *ltpuser;
+static struct passwd *ltpuser;
-char *bad_addr = 0;
+static int exp_enos[] =
+ {EPERM, EACCES, EFAULT, ENAMETOOLONG, ENOENT, ENOTDIR, 0};
-void setup(); /* Main setup function for the tests */
-void cleanup(); /* cleanup function for the test */
+void setup(void);
+void cleanup(void);
-int main(int ac, char **av)
+int main(int argc, char *argv[])
{
- int lc; /* loop counter */
- char *msg; /* message returned from parse_opts */
- char *file_name; /* ptr. for file name whose mode is modified */
- char *test_desc; /* test specific error message */
- int ind; /* counter to test different test conditions */
- uid_t User_id; /* Effective user id of a test process */
- gid_t Group_id; /* Effective group id of a test process */
+ int lc;
+ char *msg;
+ uid_t user_id;
+ gid_t group_id;
+ int i;
/* Parse standard options given to run the test. */
- msg = parse_opts(ac, av, (option_t *) NULL, NULL);
- if (msg != (char *)NULL) {
- tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg);
- tst_exit();
- }
+ msg = parse_opts(argc, argv, NULL, NULL);
+
+ if (msg != NULL)
+ tst_brkm(TBROK, tst_exit, "OPTION PARSING ERROR - %s", msg);
- /*
- * Invoke setup function to call individual test setup functions
- * to simulate test conditions.
- */
setup();
-
/* set the expected errnos... */
TEST_EXP_ENOS(exp_enos);
- /* Set uid/gid values to that of test process */
- User_id = geteuid();
- Group_id = getegid();
+ user_id = geteuid();
+ group_id = getegid();
- /* Check looping state if -i option given */
for (lc = 0; TEST_LOOPING(lc); lc++) {
- /* Reset Tst_count in case we are looping. */
Tst_count = 0;
- for (ind = 0; Test_cases[ind].desc != NULL; ind++) {
- file_name = Test_cases[ind].pathname;
- test_desc = Test_cases[ind].desc;
-
- if (file_name == High_address_node) {
- file_name = get_high_address();
- }
+ for (i = 0; test_cases[i].desc != NULL; i++) {
+ char *file_name = test_cases[i].pathname;
+ char *test_desc = test_cases[i].desc;
/*
* Call lchown(2) to test different test conditions.
* verify that it fails with -1 return value and
* sets appropriate errno.
*/
- TEST(lchown(file_name, User_id, Group_id));
+ TEST(lchown(file_name, user_id, group_id));
/* Check return code from lchown(2) */
if (TEST_RETURN == -1) {
TEST_ERROR_LOG(TEST_ERRNO);
- if (TEST_ERRNO == Test_cases[ind].exp_errno) {
+ if (TEST_ERRNO == test_cases[i].exp_errno) {
tst_resm(TPASS,
"lchown() fails, %s, errno:%d",
test_desc, TEST_ERRNO);
@@ -206,267 +190,233 @@ int main(int ac, char **av)
tst_resm(TFAIL, "lchown() fails, %s, "
"errno:%d, expected errno:%d",
test_desc, TEST_ERRNO,
- Test_cases[ind].exp_errno);
+ test_cases[i].exp_errno);
}
} else {
tst_resm(TFAIL, "lchown() returned %ld, "
"expected -1, errno:%d", TEST_RETURN,
- Test_cases[ind].exp_errno);
+ test_cases[i].exp_errno);
}
- } /* End of TEST CASE LOOPING. */
- } /* End for TEST_LOOPING */
+ }
+ }
- /*
- * Invoke cleanup() to delete the test directory/file(s) created
- * in the setup().
- */
cleanup();
- /*NOTREACHED*/ return 0;
-} /* End main */
+ return 0;
+}
/*
- * setup(void) - performs all ONE TIME setup for this test.
+ * setup() - performs all ONE TIME setup for this test.
+ *
* Exit the test program on receipt of unexpected signals.
* Create a temporary directory and change directory to it.
- * Invoke individual test setup functions according to the order
- * set in struct. definition.
+ * Invoke individual test setup functions.
*/
-void setup()
+void setup(void)
{
- int ind; /* counter for setup functions */
+ int i;
/* Capture unexpected signals */
tst_sig(FORK, DEF_HANDLER, cleanup);
- /* Get the current directory of the test executable */
- if (getcwd(EXEC_DIR, sizeof(EXEC_DIR)) == NULL) {
- tst_brkm(TBROK, cleanup,
- "getcwd(3) fails to get working directory of process");
- }
-
- /* Switch to nobody user for correct error code collection */
- if (geteuid() != 0) {
- tst_brkm(TBROK, tst_exit, "Test must be run as root");
- }
- ltpuser = getpwnam(nobody_uid);
- if (setgid(ltpuser->pw_uid) == -1) {
- tst_resm(TINFO, "setgid failed to "
- "to set the effective gid to %d", ltpuser->pw_uid);
- perror("setgid");
- }
-
- if (seteuid(ltpuser->pw_uid) == -1) {
- tst_resm(TINFO, "setuid failed to "
- "to set the effective uid to %d", ltpuser->pw_uid);
- perror("setuid");
- }
+ tst_require_root(tst_exit);
- /* Pause if that option was specified */
TEST_PAUSE;
+
+ /* change uid and gid to nobody */
+ ltpuser = getpwnam(TEST_USER);
- /* remember current dir, because create_link has been copied here */
- if (getcwd(main_test_dir, sizeof(main_test_dir)) == NULL) {
- tst_brkm(TBROK | TERRNO, cleanup,
- "failed to get the current working directory.");
+ if (ltpuser == NULL) {
+ tst_brkm(TBROK, cleanup, "test need user %s to run",
+ TEST_USER);
}
- /* Make a temp dir and cd to it */
- tst_tmpdir();
-
- /* fix permissions on the tmpdir */
- if (chmod(".", 0711) != 0) {
- tst_brkm(TBROK | TERRNO, cleanup, "chmod() failed");
+ if (setgid(ltpuser->pw_uid) == -1) {
+ tst_resm(TBROK | TERRNO,
+ "setgid(2) failed set the effective gid to %d",
+ ltpuser->pw_uid);
}
- bad_addr = mmap(0, 1, PROT_NONE,
- MAP_PRIVATE_EXCEPT_UCLINUX | MAP_ANONYMOUS, 0, 0);
- if (bad_addr == MAP_FAILED) {
- tst_brkm(TBROK | TERRNO, cleanup, "mmap failed");
+ if (seteuid(ltpuser->pw_uid) == -1) {
+ tst_resm(TBROK | TERRNO,
+ "seteuid(2) failed to set the effective uid to %d",
+ ltpuser->pw_uid);
}
- Test_cases[3].pathname = bad_addr;
+
+ tst_tmpdir();
/* call individual setup functions */
- for (ind = 0; Test_cases[ind].desc != NULL; ind++) {
- Test_cases[ind].setupfunc();
+ for (i = 0; test_cases[i].desc != NULL; i++) {
+ if (test_cases[i].setup != NULL)
+ test_cases[i].setup(i);
}
}
/*
- * no_setup() - Some test conditions for mknod(2) do not any setup.
- * Hence, this function just returns 0.
- * This function simply returns 0.
- */
-int no_setup()
-{
- return 0;
-}
-
-/*
- * setup1() - setup function for a test condition for which chown(2)
- * returns -1 and sets errno to EPERM.
+ * setup_eperm() - setup function for a test condition for which lchown(2)
+ * returns -1 and sets errno to EPERM.
*
- * Create a testfile under temporary directory and invoke setuid to root
- * program to change the ownership of testfile to that of "ltpuser2" user,
- * create a symlink file of it with ownership as ltpuser2.
+ * Create test file and symlink with uid 0.
*/
-int setup1()
+void setup_eperm(int pos LTP_ATTRIBUTE_UNUSED)
{
- int fd; /* file handler for testfile */
- char Path_name[PATH_MAX]; /* Buffer to hold command string */
- char Path2_name[PATH_MAX]; /* Buffer for just the path name */
- char Cmd_buffer[BUFSIZ]; /* Buffer to hold command string */
+ int fd;
- /* Creat a testfile and close it */
+ /* create a testfile */
if ((fd = open(TEST_FILE1, O_RDWR | O_CREAT, 0666)) == -1) {
tst_brkm(TBROK | TERRNO, cleanup,
- "open(%s, O_RDWR|O_CREAT, 0666) failed", TEST_FILE1);
+ "open(2) %s failed", TEST_FILE1);
}
+
if (close(fd) == -1) {
- tst_brkm(TBROK, cleanup, "close(%s) Failed", TEST_FILE1);
+ tst_brkm(TBROK | TERRNO, cleanup, "close(2) %s failed",
+ TEST_FILE1);
}
-
- /* Get the current working directory of the process */
- if (getcwd(Path_name, sizeof(Path_name)) == NULL) {
- tst_brkm(TBROK | TERRNO, cleanup,
- "failed to get the current working directory.");
+
+ /* become root once more */
+ if (seteuid(0) == -1) {
+ tst_resm(TBROK | TERRNO,
+ "seteuid(2) failed to set the effective uid to 0");
}
- /* Provide permissions for temporary directory */
- if (chmod(Path_name, 0777) == -1) {
- tst_brkm(TBROK | TERRNO, cleanup, "chmod(%s, 0777) failed", Path_name);
+ /* create symling to testfile */
+ if (symlink(TEST_FILE1, SFILE1) < 0) {
+ tst_brkm(TBROK, cleanup, "symlink(2) %s to %s failed",
+ TEST_FILE1, SFILE1);
}
- strcpy(Path2_name, Path_name);
-
- /* Get the path of test file created under temporary directory */
- strcat(Path_name, "/" TEST_FILE1);
-
- /* Get the command name to be executed as setuid to root */
- strcat((char *)Cmd_buffer, main_test_dir);
- strcat((char *)Cmd_buffer, (const char *)"/create_link ");
- strcat((char *)Cmd_buffer, Path_name);
-
- if (system((const char *)Cmd_buffer) != 0) {
- tst_brkm(TBROK, cleanup,
- "Fail to modify %s ownership(s)!", TEST_FILE1);
+ /* back to the user nobody */
+ if (seteuid(ltpuser->pw_uid) == -1) {
+ tst_resm(TBROK | TERRNO,
+ "seteuid(2) failed to set the effective uid to %d",
+ ltpuser->pw_uid);
}
- return 0;
}
/*
- * setup2() - setup function for a test condition for which chown(2)
- * returns -1 and sets errno to EACCES.
+ * setup_eaccess() - setup function for a test condition for which lchown(2)
+ * returns -1 and sets errno to EACCES.
+ *
* Create a test directory under temporary directory and create a test file
* under this directory with mode "0666" permissions.
* Modify the mode permissions on test directory such that process will not
* have search permissions on test directory.
- *
- * The function returns 0.
*/
-int setup2()
+void setup_eacces(int pos LTP_ATTRIBUTE_UNUSED)
{
- int fd; /* file handle for testfile */
+ int fd;
- /* Creat a test directory */
+ /* create a test directory */
if (mkdir(DIR_TEMP, MODE_RWX) < 0) {
- tst_brkm(TBROK, cleanup, "mkdir(2) of %s failed", DIR_TEMP);
+ tst_brkm(TBROK | TERRNO, cleanup, "mkdir(2) %s failed",
+ DIR_TEMP);
}
- /* Creat a file under above test directory */
+ /* create a file under test directory */
if ((fd = open(TEST_FILE2, O_RDWR | O_CREAT, 0666)) == -1) {
- tst_brkm(TBROK, cleanup,
- "open(%s, O_RDWR|O_CREAT, 0666) failed, errno=%d : %s",
- TEST_FILE2, errno, strerror(errno));
+ tst_brkm(TBROK | TERRNO, cleanup,
+ "open(2) %s failed", TEST_FILE2);
}
- /* Close the test file created above */
+
if (close(fd) == -1) {
- tst_brkm(TBROK, cleanup,
- "close(%s) Failed, errno=%d : %s",
- TEST_FILE2, errno, strerror(errno));
+ tst_brkm(TBROK | TERRNO, cleanup,
+ "close(2) %s failed", TEST_FILE2);
}
- /* Creat a symlink of testfile */
+ /* create a symlink of testfile */
if (symlink(TEST_FILE2, SFILE2) < 0) {
- tst_brkm(TBROK, cleanup,
- "symlink() of %s Failed, errno=%d : %s",
- TEST_FILE2, errno, strerror(errno));
+ tst_brkm(TBROK | TERRNO, cleanup, "symlink(2) %s to %s failed",
+ TEST_FILE2, SFILE2);
}
- /* Modify mode permissions on test directory */
+ /* modify mode permissions on test directory */
if (chmod(DIR_TEMP, FILE_MODE) < 0) {
- tst_brkm(TBROK, cleanup, "chmod(2) of %s failed", DIR_TEMP);
+ tst_brkm(TBROK | TERRNO, cleanup, "chmod(2) %s failed",
+ DIR_TEMP);
}
- return 0;
}
/*
- * setup3() - setup function for a test condition for which chown(2)
- * returns -1 and sets errno to ENOTDIR.
+ * setup_efault() -- setup for a test condition where lchown(2) returns -1 and
+ * sets errno to EFAULT.
+ *
+ * Create "bad address" by explicitly mmaping anonymous page that may not be
+ * accesed (see PROT_NONE).
+ */
+static void setup_efault(int pos)
+{
+ char *bad_addr = 0;
+
+ bad_addr = mmap(NULL, 1, PROT_NONE,
+ MAP_PRIVATE_EXCEPT_UCLINUX | MAP_ANONYMOUS, -1, 0);
+
+ if (bad_addr == MAP_FAILED)
+ tst_brkm(TBROK | TERRNO, cleanup, "mmap failed");
+
+ test_cases[pos].pathname = bad_addr;
+}
+
+/*
+ * setup_efault() -- setup for a test condition where lchown(2) returns -1 and
+ * sets errno to EFAULT.
+ *
+ * Use ltp function get_high_address() to compute high address.
+ */
+static void setup_highaddress(int pos)
+{
+ test_cases[pos].pathname = get_high_address();
+}
+
+/*
+ * setup_enotdir() - setup function for a test condition for which chown(2)
+ * returns -1 and sets errno to ENOTDIR.
*
- * Create a test file under temporary directory so that test tries to
- * change mode of a testfile "tfile_3" under "t_file" which happens to be
- * another regular file.
+ * Create a regular file "t_file" to call lchown(2) on "t_file/sfile" later.
*/
-int setup3()
+void setup_enotdir(int pos LTP_ATTRIBUTE_UNUSED)
{
int fd;
- /* Creat a testfile under temporary directory */
- if ((fd = open("t_file", O_RDWR | O_CREAT, MODE_RWX)) == -1) {
- tst_brkm(TBROK, cleanup,
- "open(2) on t_file failed, errno=%d : %s",
- errno, strerror(errno));
+ /* create a testfile under temporary directory */
+ if ((fd = open(TFILE3, O_RDWR | O_CREAT, MODE_RWX)) == -1) {
+ tst_brkm(TBROK | TERRNO, cleanup, "open(2) %s failed",
+ TFILE3);
}
- /* close the test file */
+
if (close(fd) == -1) {
- tst_brkm(TBROK, cleanup,
- "close(t_file) Failed, errno=%d : %s",
- errno, strerror(errno));
+ tst_brkm(TBROK | TERRNO, cleanup, "close(2) %s failed",
+ TFILE3);
}
- return 0;
}
/*
* longpath_setup() - setup to create a node with a name length exceeding
- * the MAX. length of PATH_MAX.
- * This function retruns 0.
+ * the length of PATH_MAX.
*/
-int longpath_setup()
+void setup_longpath(int pos)
{
- int ind; /* counter variable */
-
- for (ind = 0; ind <= (PATH_MAX + 1); ind++) {
- Longpathname[ind] = 'a';
- }
- return 0;
+ memset(test_cases[pos].pathname, 'a', PATH_MAX + 1);
+ test_cases[pos].pathname[PATH_MAX + 1] = '\0';
}
/*
* cleanup() - Performs all ONE TIME cleanup for this test at
* completion or premature exit.
- * Print test timing stats and errno log if test executed with options.
- * Restore the mode permissions on test directory.
+ *
* Remove temporary directory and sub-directories/files under it
* created during setup().
* Exit the test program with normal exit code.
*/
-void cleanup()
+void cleanup(void)
{
- /*
- * print timing stats if that option was specified.
- * print errno log if that option was specified.
- */
TEST_CLEANUP;
-
- /* Restore mode permissions on test directory created in setup2() */
- if (chmod(DIR_TEMP, MODE_RWX) < 0) {
- tst_brkm(TBROK, NULL, "chmod(2) of %s failed", DIR_TEMP);
+
+ /* become root again */
+ if (seteuid(0) == -1) {
+ tst_resm(TINFO | TERRNO,
+ "seteuid(0) failed to set the effective uid to 0");
}
- /* Remove files and temporary directory created */
tst_rmdir();
-
- /* exit with return code appropriate for results */
tst_exit();
}
diff --git a/testcases/kernel/syscalls/lchown/prep_create_link b/testcases/kernel/syscalls/lchown/prep_create_link
deleted file mode 100755
index ef3f767..0000000
--- a/testcases/kernel/syscalls/lchown/prep_create_link
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/bin/sh
-
-set -e
-
-TMP=${TMP:-/tmp}
-
-if ! PROGDIR=$(dirname "$0") ; then
-
- if [ -x "$LTPROOT/testcases/bin/create_link" ] ; then
- PROGDIR=$LTPROOT/testcases/bin
- else
- echo "${0%##*/} : ERROR : Couldn't determine directory for \`$0'"
- exit 1
- fi
-
-fi
-
-cp "$PROGDIR/create_link" "$TMP"
-chown root:root "$TMP/create_link"
-chmod 04755 "$TMP/create_link"
------------------------------------------------------------------------------
Increase Visibility of Your 3D Game App & Earn a Chance To Win $500!
Tap into the largest installed PC base & get more eyes on your game by
optimizing for Intel(R) Graphics Technology. Get started today with the
Intel(R) Software Partner Program. Five $500 cash prizes are up for grabs.
http://p.sf.net/sfu/intelisp-dev2dev
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list