The branch, master has been updated via 623bed5 tests: Add test_uwrap_disabled. via 71ef97c testsuite: Add missing include. from cf9d399 cmake: Fix HAVE_SETRESUID and HAVE_SETRESGID.
http://gitweb.samba.org/?p=uid_wrapper.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 623bed5045974272d0c434203ff7f99375171bcc Author: Andreas Schneider <a...@samba.org> Date: Thu Dec 19 09:52:22 2013 +0100 tests: Add test_uwrap_disabled. commit 71ef97c1134539c69df036458a9f24b25f2f7821 Author: Andreas Schneider <a...@samba.org> Date: Thu Dec 19 09:52:05 2013 +0100 testsuite: Add missing include. ----------------------------------------------------------------------- Summary of changes: tests/CMakeLists.txt | 7 + tests/test_uwrap_disabled.c | 261 +++++++++++++++++++++++++++++++++++++++++++ tests/testsuite.c | 1 + 3 files changed, 269 insertions(+), 0 deletions(-) create mode 100644 tests/test_uwrap_disabled.c Changeset truncated at 500 lines: diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 871905b..76fdb6b 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -32,3 +32,10 @@ endif(LINUX) if (LINUX) add_executable(getuids getuids.c) endif (LINUX) + +add_cmocka_test(test_uwrap_disabled test_uwrap_disabled.c ${CMOCKA_LIBRARY}) +set_property( + TEST + test_uwrap_disabled + PROPERTY + ENVIRONMENT LD_PRELOAD=${CMAKE_BINARY_DIR}/src/libuid_wrapper.so) diff --git a/tests/test_uwrap_disabled.c b/tests/test_uwrap_disabled.c new file mode 100644 index 0000000..f2336a4 --- /dev/null +++ b/tests/test_uwrap_disabled.c @@ -0,0 +1,261 @@ +#include "config.h" + +#include <stdarg.h> +#include <stddef.h> +#include <setjmp.h> +#include <cmocka.h> + +#include <sys/types.h> +#include <pwd.h> +#include <grp.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +#define ZERO_STRUCTP(x) do { if ((x) != NULL) memset((char *)(x), 0, sizeof(*(x))); } while(0) +#define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0])) + +struct test_opts { + int root_mode; + uid_t myuid; + gid_t mygid; + uid_t nbuid; + gid_t nbgid; +}; + +static void setup(void **state) +{ + struct test_opts *t; + struct passwd *pwd; + + pwd = getpwnam("nobody"); + assert_non_null(pwd); + + t = malloc(sizeof(struct test_opts)); + assert_non_null(t); + + ZERO_STRUCTP(t); + + t->myuid = getuid(); + t->mygid = getgid(); + + t->nbuid = pwd->pw_uid; + t->nbgid = pwd->pw_gid; + + if (getuid() == (uid_t)0 || geteuid() == (uid_t)0) { + t->root_mode = 1; + } + + *state = t; +} + +static void teardown(void **state) +{ + struct test_opts *t = (struct test_opts *)*state; + + setuid(t->myuid); + seteuid(t->myuid); + setgid(t->mygid); + setegid(t->mygid); + + free(t); +} + +static void test_uwrap_setuid(void **state) +{ + struct test_opts *t = (struct test_opts *)*state; + int rc; + + if (t->root_mode) { + return; + } else { + rc = setuid(t->nbuid); + assert_int_equal(rc, -1); + } +} + +static void test_uwrap_seteuid(void **state) +{ + struct test_opts *t = (struct test_opts *)*state; + uid_t u; + int rc; + + if (t->root_mode) { + rc = seteuid(t->nbuid); + assert_int_equal(rc, 0); + + u = geteuid(); + assert_int_equal(u, t->nbuid); + } else { + rc = seteuid(t->nbuid); + assert_int_equal(rc, -1); + } +} + +#ifdef HAVE_SETREUID +static void test_uwrap_setreuid(void **state) +{ + struct test_opts *t = (struct test_opts *)*state; + uid_t u; + int rc; + + if (t->root_mode) { + rc = setreuid(-1, t->nbuid); + assert_int_equal(rc, 0); + + u = geteuid(); + assert_int_equal(u, t->nbuid); + } else { + rc = setreuid(-1, t->nbuid); + assert_int_equal(rc, -1); + } +} +#endif + +#ifdef HAVE_SETRESUID +static void test_uwrap_setresuid(void **state) +{ + struct test_opts *t = (struct test_opts *)*state; + uid_t u; + int rc; + + if (t->root_mode) { + rc = setresuid(-1, t->nbuid, -1); + assert_int_equal(rc, 0); + + u = geteuid(); + assert_int_equal(u, t->nbuid); + } else { + rc = setresuid(-1, t->nbuid, -1); + assert_int_equal(rc, -1); + } +} +#endif + +static void test_uwrap_setgid(void **state) +{ + struct test_opts *t = (struct test_opts *)*state; + int rc; + + if (t->root_mode) { + return; + } else { + rc = setgid(t->nbgid); + assert_int_equal(rc, -1); + } +} + +static void test_uwrap_setegid(void **state) +{ + struct test_opts *t = (struct test_opts *)*state; + uid_t u; + int rc; + + if (t->root_mode) { + rc = setegid(t->nbgid); + assert_int_equal(rc, 0); + + u = getegid(); + assert_int_equal(u, t->nbgid); + } else { + rc = setegid(t->nbgid); + assert_int_equal(rc, -1); + } +} + +#ifdef HAVE_SETREGID +static void test_uwrap_setregid(void **state) +{ + struct test_opts *t = (struct test_opts *)*state; + uid_t u; + int rc; + + if (t->root_mode) { + rc = setregid(-1, t->nbgid); + assert_int_equal(rc, 0); + + u = getegid(); + assert_int_equal(u, t->nbgid); + } else { + rc = setregid(-1, t->nbgid); + assert_int_equal(rc, -1); + } +} +#endif + +#ifdef HAVE_SETRESGID +static void test_uwrap_setresgid(void **state) +{ + struct test_opts *t = (struct test_opts *)*state; + uid_t u; + int rc; + + if (t->root_mode) { + rc = setresgid(-1, t->nbgid, -1); + assert_int_equal(rc, 0); + + u = getegid(); + assert_int_equal(u, t->nbgid); + } else { + rc = setresgid(-1, t->nbgid, -1); + assert_int_equal(rc, -1); + } +} +#endif + +static void test_uwrap_setgroups(void **state) +{ + struct test_opts *t = (struct test_opts *)*state; + gid_t glist[1]; + gid_t rlist[16]; + int rc; + + glist[0] = t->nbgid; + + (void) state; /* unused */ + + if (t->root_mode) { + rc = setgroups(ARRAY_SIZE(glist), glist); + assert_int_equal(rc, 0); + + rc = getgroups(ARRAY_SIZE(rlist), rlist); + assert_int_equal(rc, 1); + + assert_memory_equal(glist, rlist, sizeof(glist)); + } else { + rc = setgroups(ARRAY_SIZE(glist), glist); + assert_int_equal(rc, -1); + + rc = getgroups(ARRAY_SIZE(rlist), rlist); + assert_int_not_equal(rc, -1); + } +} + +int main(void) +{ + int rc; + + const UnitTest tests[] = { + unit_test_setup_teardown(test_uwrap_setuid, setup, teardown), + unit_test_setup_teardown(test_uwrap_seteuid, setup, teardown), +#ifdef HAVE_SETREUID + unit_test_setup_teardown(test_uwrap_setreuid, setup, teardown), +#endif +#ifdef HAVE_SETRESUID + unit_test_setup_teardown(test_uwrap_setresuid, setup, teardown), +#endif + unit_test_setup_teardown(test_uwrap_setgid, setup, teardown), + unit_test_setup_teardown(test_uwrap_setegid, setup, teardown), +#ifdef HAVE_SETREGID + unit_test_setup_teardown(test_uwrap_setregid, setup, teardown), +#endif +#ifdef HAVE_SETRESGID + unit_test_setup_teardown(test_uwrap_setresgid, setup, teardown), +#endif + unit_test_setup_teardown(test_uwrap_setgroups, setup, teardown), + }; + + rc = run_tests(tests); + + return rc; +} diff --git a/tests/testsuite.c b/tests/testsuite.c index 6fa8d74..beff0fe 100644 --- a/tests/testsuite.c +++ b/tests/testsuite.c @@ -14,6 +14,7 @@ #include <sys/time.h> #include <unistd.h> +#include <pwd.h> #include <grp.h> #ifdef HAVE_SYS_SYSCALL_H -- UID Wrapper Repository