tests: Move setregid test to own executable
authorAndreas Schneider <asn@samba.org>
Fri, 9 Oct 2015 11:10:23 +0000 (13:10 +0200)
committerAndreas Schneider <asn@samba.org>
Tue, 27 Oct 2015 13:56:06 +0000 (14:56 +0100)
Signed-off-by: Andreas Schneider <asn@samba.org>
Reviewed-by: Stefan Metzmacher <metze@samba.org>
tests/CMakeLists.txt
tests/test_gid.c
tests/test_setregid.c [new file with mode: 0644]

index dd8f480a3260a9e96295cc7184b9c82fbf1d9054..85b68442d40fe8377a5324873264e8db7e3744ec 100644 (file)
@@ -41,6 +41,10 @@ set(UWRAP_GID_TESTS
     test_setgid
     test_setegid)
 
+if (HAVE_SETREGID)
+    list(APPEND UWRAP_GID_TESTS test_setregid)
+endif (HAVE_SETREGID)
+
 set(UWRAP_TESTS
     ${UWRAP_UID_TESTS}
     ${UWRAP_GID_TESTS}
index 0ada6b7b6ab239ba07403ddcd60b68728c1bcd14..222eadf43901d954113387701fd185436b0cd981 100644 (file)
 
 #define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0]))
 
-#ifdef HAVE_SETREGID
-static void test_uwrap_setregid(void **state)
-{
-       int rc;
-       uid_t u;
-
-       (void) state; /* unused */
-
-       rc = setregid(1, 2);
-       assert_int_equal(rc, 0);
-
-       u = getgid();
-       assert_int_equal(u, 1);
-
-       u = getegid();
-       assert_int_equal(u, 2);
-}
-#endif
-
 #ifdef HAVE_SETRESGID
 static void test_uwrap_setresgid(void **state)
 {
@@ -101,9 +82,6 @@ int main(void) {
        const struct CMUnitTest uwrap_tests[] = {
                cmocka_unit_test(test_uwrap_getgroups),
 
-#ifdef HAVE_SETREGID
-               cmocka_unit_test(test_uwrap_setregid),
-#endif
 #ifdef HAVE_SETRESGID
                cmocka_unit_test(test_uwrap_setresgid),
 #endif
diff --git a/tests/test_setregid.c b/tests/test_setregid.c
new file mode 100644 (file)
index 0000000..f4844f8
--- /dev/null
@@ -0,0 +1,190 @@
+#include "config.h"
+
+#include <stdarg.h>
+#include <stddef.h>
+#include <setjmp.h>
+#include <cmocka.h>
+
+#include <errno.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#include <pwd.h>
+
+static void test_uwrap_setregid_root(void **state)
+{
+       int rc;
+       uid_t u;
+       gid_t g;
+#ifdef HAVE_GETRESGID
+       gid_t cp_rgid, cp_egid, cp_sgid;
+#endif
+
+       (void) state; /* unused */
+
+       u = getuid();
+       assert_int_equal(u, 0x0);
+       u = geteuid();
+       assert_int_equal(u, 0x0);
+
+#ifdef HAVE_GETRESGID
+       cp_rgid = cp_egid = cp_sgid = -1;
+       rc = getresgid(&cp_rgid, &cp_egid, &cp_sgid);
+       assert_return_code(rc, errno);
+       assert_int_equal(cp_rgid, 0);
+       assert_int_equal(cp_egid, 0);
+       assert_int_equal(cp_sgid, 0);
+#endif
+
+       g = getgid();
+       assert_int_equal(g, 0x0);
+
+       g = getegid();
+       assert_int_equal(g, 0x0);
+
+       rc = setregid(-1, -1);
+       assert_int_equal(rc, 0);
+
+       rc = setregid(0x4444, 0x5555);
+       assert_int_equal(rc, 0);
+
+#ifdef HAVE_GETRESGID
+       cp_rgid = cp_egid = cp_sgid = -1;
+       rc = getresgid(&cp_rgid, &cp_egid, &cp_sgid);
+       assert_return_code(rc, errno);
+       assert_int_equal(cp_rgid, 0x4444);
+       assert_int_equal(cp_egid, 0x5555);
+       assert_int_equal(cp_sgid, 0x5555);
+#endif
+
+       g = getgid();
+       assert_int_equal(g, 0x4444);
+
+       g = getegid();
+       assert_int_equal(g, 0x5555);
+
+       rc = setregid(0, -1);
+       assert_return_code(rc, errno);
+
+#ifdef HAVE_GETRESGID
+       cp_rgid = cp_egid = cp_sgid = -1;
+       rc = getresgid(&cp_rgid, &cp_egid, &cp_sgid);
+       assert_return_code(rc, errno);
+       assert_int_equal(cp_rgid, 0);
+       assert_int_equal(cp_egid, 0x5555);
+       assert_int_equal(cp_sgid, 0x5555);
+#endif
+
+       rc = setregid(-1, 0);
+       assert_return_code(rc, errno);
+
+#ifdef HAVE_GETRESGID
+       cp_rgid = cp_egid = cp_sgid = -1;
+       rc = getresgid(&cp_rgid, &cp_egid, &cp_sgid);
+       assert_return_code(rc, errno);
+       assert_int_equal(cp_rgid, 0);
+       assert_int_equal(cp_egid, 0);
+       assert_int_equal(cp_sgid, 0x5555);
+#endif
+
+       rc = setgid(0);
+       assert_return_code(rc, errno);
+       rc = setegid(0);
+       assert_return_code(rc, errno);
+#ifdef HAVE_SETRESGID
+       rc = setresgid(0, 0, 0);
+       assert_return_code(rc, errno);
+#endif
+}
+
+static void test_uwrap_setregid_user(void **state)
+{
+       int rc;
+       uid_t u;
+#ifdef HAVE_GETRESGID
+       gid_t cp_rgid, cp_egid, cp_sgid;
+#endif
+
+       (void) state; /* unused */
+
+       u = getuid();
+       assert_int_equal(u, 0x0);
+       u = geteuid();
+       assert_int_equal(u, 0x0);
+
+#ifdef HAVE_GETRESGID
+       cp_rgid = cp_egid = cp_sgid = -1;
+       rc = getresgid(&cp_rgid, &cp_egid, &cp_sgid);
+       assert_return_code(rc, errno);
+       assert_int_equal(cp_rgid, 0);
+       assert_int_equal(cp_egid, 0);
+       assert_int_equal(cp_sgid, 0);
+#endif
+
+       rc = setuid(0x5555);
+       assert_return_code(rc, errno);
+
+       u = getuid();
+       assert_int_equal(u, 0x5555);
+       u = geteuid();
+       assert_int_equal(u, 0x5555);
+
+#ifdef HAVE_GETRESGID
+       cp_rgid = cp_egid = cp_sgid = -1;
+       rc = getresgid(&cp_rgid, &cp_egid, &cp_sgid);
+       assert_return_code(rc, errno);
+       assert_int_equal(cp_rgid, 0);
+       assert_int_equal(cp_egid, 0);
+       assert_int_equal(cp_sgid, 0);
+#endif
+
+       rc = setregid(0x4444, 0x5555);
+       assert_int_equal(rc, -1);
+       assert_int_equal(errno, EPERM);
+
+#ifdef HAVE_GETRESGID
+       cp_rgid = cp_egid = cp_sgid = -1;
+       rc = getresgid(&cp_rgid, &cp_egid, &cp_sgid);
+       assert_return_code(rc, errno);
+       assert_int_equal(cp_rgid, 0);
+       assert_int_equal(cp_egid, 0);
+       assert_int_equal(cp_sgid, 0);
+#endif
+
+       rc = setregid(0, -1);
+       assert_return_code(rc, errno);
+
+#ifdef HAVE_GETRESGID
+       cp_rgid = cp_egid = cp_sgid = -1;
+       rc = getresgid(&cp_rgid, &cp_egid, &cp_sgid);
+       assert_return_code(rc, errno);
+       assert_int_equal(cp_rgid, 0);
+       assert_int_equal(cp_egid, 0);
+       assert_int_equal(cp_sgid, 0);
+#endif
+
+       rc = setregid(-1, 0);
+       assert_return_code(rc, errno);
+
+#ifdef HAVE_GETRESGID
+       cp_rgid = cp_egid = cp_sgid = -1;
+       rc = getresgid(&cp_rgid, &cp_egid, &cp_sgid);
+       assert_return_code(rc, errno);
+       assert_int_equal(cp_rgid, 0);
+       assert_int_equal(cp_egid, 0);
+       assert_int_equal(cp_sgid, 0);
+#endif
+}
+
+int main(void) {
+       int rc;
+
+       const struct CMUnitTest uwrap_tests[] = {
+               cmocka_unit_test(test_uwrap_setregid_root),
+               cmocka_unit_test(test_uwrap_setregid_user),
+       };
+
+       rc = cmocka_run_group_tests(uwrap_tests, NULL, NULL);
+
+       return rc;
+}