OLD | NEW |
---|---|
(Empty) | |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "sandbox/linux/services/namespace_utils.h" | |
6 | |
7 #include <errno.h> | |
8 #include <sched.h> | |
9 #include <sys/types.h> | |
10 #include <sys/wait.h> | |
11 | |
12 #include "base/posix/eintr_wrapper.h" | |
13 #include "base/process/launch.h" | |
14 #include "sandbox/linux/tests/unit_tests.h" | |
15 #include "testing/gtest/include/gtest/gtest.h" | |
16 | |
17 namespace sandbox { | |
18 | |
19 namespace { | |
20 | |
21 SANDBOX_TEST(NamespaceUtils, SupportsUnprivilegedNamespace) { | |
22 bool supports_user_ns = | |
23 NamespaceUtils::SupportsUnprivilegedNamespace(CLONE_NEWUSER); | |
24 errno = 0; | |
25 pid_t pid = base::ForkWithFlags(CLONE_NEWUSER, nullptr, nullptr); | |
26 if (pid == 0) { | |
27 _exit(0); | |
28 } | |
29 | |
30 bool fork_succeeded = pid > 0; | |
31 if (fork_succeeded) { | |
32 int status; | |
33 EXPECT_EQ(pid, HANDLE_EINTR(waitpid(pid, &status, 0))); | |
34 EXPECT_EQ(0, status); | |
35 } else { | |
36 EXPECT_EQ(EINTR, errno); | |
37 } | |
38 | |
39 EXPECT_EQ(supports_user_ns, fork_succeeded); | |
jln (very slow on Chromium)
2015/01/23 02:48:23
This will break from inside a chroot. fork_succeed
rickyz (no longer on Chrome)
2015/01/23 23:59:37
Done.
| |
40 } | |
41 | |
42 SANDBOX_TEST(NamespaceUtils, WriteToIdMapFile) { | |
43 if (!NamespaceUtils::SupportsUnprivilegedNamespace(CLONE_NEWUSER)) { | |
44 return; | |
45 } | |
46 | |
47 pid_t pid = base::ForkWithFlags(CLONE_NEWUSER, nullptr, nullptr); | |
48 ASSERT_NE(-1, pid); | |
jln (very slow on Chromium)
2015/01/23 02:48:23
Same remark, this will fail inside a chroot().
rickyz (no longer on Chrome)
2015/01/23 23:59:37
Done.
| |
49 | |
50 uid_t uid = getuid(); | |
51 gid_t gid = getgid(); | |
52 if (pid == 0) { | |
53 EXPECT_NE(uid, getuid()); | |
54 NamespaceUtils::WriteToIdMapFile("/proc/self/uid_map", uid); | |
55 EXPECT_EQ(uid, getuid()); | |
56 | |
57 EXPECT_NE(gid, getgid()); | |
58 NamespaceUtils::WriteToIdMapFile("/proc/self/gid_map", gid); | |
59 EXPECT_EQ(gid, getgid()); | |
60 | |
61 _exit(0); | |
62 } | |
63 | |
64 int status; | |
65 EXPECT_EQ(pid, HANDLE_EINTR(waitpid(pid, &status, 0))); | |
66 EXPECT_EQ(0, status); | |
67 } | |
68 | |
69 } // namespace. | |
70 | |
71 } // namespace sandbox. | |
OLD | NEW |