tests: Move setegid test to own executable
authorAndreas Schneider <asn@samba.org>
Fri, 9 Oct 2015 07:40:14 +0000 (09:40 +0200)
committerAndreas Schneider <asn@samba.org>
Tue, 27 Oct 2015 13:56:02 +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_setegid.c [new file with mode: 0644]

index 58c78cbe17032ccd2e108b42416e510968b9ce36..dd8f480a3260a9e96295cc7184b9c82fbf1d9054 100644 (file)
@@ -38,7 +38,8 @@ set(UWRAP_SYSCALL_UID_TESTS
     test_syscall_setresuid)
 
 set(UWRAP_GID_TESTS
-    test_setgid)
+    test_setgid
+    test_setegid)
 
 set(UWRAP_TESTS
     ${UWRAP_UID_TESTS}
index 259201a1ff5c1666d3083fd9d350608903cc902d..0ada6b7b6ab239ba07403ddcd60b68728c1bcd14 100644 (file)
 
 #define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0]))
 
-static void test_uwrap_setegid(void **state)
-{
-       int rc;
-       uid_t u;
-
-       (void) state; /* unused */
-
-       rc = setegid(0);
-       assert_int_equal(rc, 0);
-
-       u = getegid();
-#ifdef SYS_getegid /* Not available on Solaris */
-       assert_int_equal(u, syscall(SYS_getegid));
-#endif
-
-       rc = setegid(42);
-       assert_int_equal(rc, 0);
-
-       u = getegid();
-       assert_int_equal(u, 42);
-}
-
 #ifdef HAVE_SETREGID
 static void test_uwrap_setregid(void **state)
 {
@@ -123,7 +101,6 @@ int main(void) {
        const struct CMUnitTest uwrap_tests[] = {
                cmocka_unit_test(test_uwrap_getgroups),
 
-               cmocka_unit_test(test_uwrap_setegid),
 #ifdef HAVE_SETREGID
                cmocka_unit_test(test_uwrap_setregid),
 #endif
diff --git a/tests/test_setegid.c b/tests/test_setegid.c
new file mode 100644 (file)
index 0000000..51ef54a
--- /dev/null
@@ -0,0 +1,167 @@
+#include "config.h"
+
+#include <stdarg.h>
+#include <stddef.h>
+#include <setjmp.h>
+#include <cmocka.h>
+
+#include <sys/types.h>
+#include <unistd.h>
+#include <errno.h>
+
+#include <pwd.h>
+
+static void test_uwrap_setegid_root(void **state)
+{
+       int rc;
+       gid_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 = setegid(-1);
+       assert_int_equal(rc, -1);
+       assert_int_equal(errno, EINVAL);
+
+       rc = setegid(0x4444);
+       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, 0x4444);
+       assert_int_equal(cp_sgid, 0);
+#endif
+
+       g = getegid();
+       assert_int_equal(g, 0x4444);
+
+       rc = setegid(0);
+       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, 0);
+       assert_int_equal(cp_egid, 0);
+       assert_int_equal(cp_sgid, 0);
+#endif
+
+       g = getegid();
+       assert_int_equal(g, 0);
+
+       rc = setegid(0x5555);
+       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, 0);
+#endif
+
+       g = getegid();
+       assert_int_equal(g, 0x5555);
+
+       rc = setegid(0);
+       assert_return_code(rc, errno);
+}
+
+static void test_uwrap_setegid_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 = setegid(0x4444);
+       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 = setegid(0);
+       assert_return_code(rc, errno);
+}
+
+int main(void) {
+       int rc;
+
+       const struct CMUnitTest uwrap_tests[] = {
+               cmocka_unit_test(test_uwrap_setegid_root),
+               cmocka_unit_test(test_uwrap_setegid_user),
+       };
+
+       rc = cmocka_run_group_tests(uwrap_tests, NULL, NULL);
+
+       return rc;
+}