]>
Commit | Line | Data |
---|---|---|
db9ecf05 | 1 | /* SPDX-License-Identifier: LGPL-2.1-or-later */ |
8530dc44 LP |
2 | |
3 | #include <stddef.h> | |
4 | ||
b5efdb8a | 5 | #include "alloc-util.h" |
5674aa7a LP |
6 | #include "errno-util.h" |
7 | #include "fd-util.h" | |
8 | #include "fileio.h" | |
9 | #include "fs-util.h" | |
2e37ebda | 10 | #include "tests.h" |
5674aa7a | 11 | #include "tmpfile-util.h" |
8530dc44 | 12 | #include "uid-range.h" |
ee104e11 | 13 | #include "user-util.h" |
5674aa7a | 14 | #include "virt.h" |
8530dc44 | 15 | |
2e37ebda | 16 | TEST(uid_range) { |
8dcc66ce | 17 | _cleanup_(uid_range_freep) UidRange *p = NULL; |
8530dc44 LP |
18 | uid_t search; |
19 | ||
8dcc66ce YW |
20 | assert_se(uid_range_covers(p, 0, 0)); |
21 | assert_se(!uid_range_covers(p, 0, 1)); | |
22 | assert_se(!uid_range_covers(p, 100, UINT32_MAX)); | |
23 | ||
24 | assert_se(uid_range_add_str(&p, "500-999") >= 0); | |
25 | assert_se(p); | |
26 | assert_se(p->n_entries == 1); | |
27 | assert_se(p->entries[0].start == 500); | |
28 | assert_se(p->entries[0].nr == 500); | |
29 | ||
30 | assert_se(!uid_range_contains(p, 499)); | |
31 | assert_se(uid_range_contains(p, 500)); | |
32 | assert_se(uid_range_contains(p, 999)); | |
33 | assert_se(!uid_range_contains(p, 1000)); | |
34 | ||
35 | assert_se(!uid_range_covers(p, 100, 150)); | |
36 | assert_se(!uid_range_covers(p, 400, 200)); | |
37 | assert_se(!uid_range_covers(p, 499, 1)); | |
38 | assert_se(uid_range_covers(p, 500, 1)); | |
39 | assert_se(uid_range_covers(p, 501, 10)); | |
40 | assert_se(uid_range_covers(p, 999, 1)); | |
41 | assert_se(!uid_range_covers(p, 999, 2)); | |
42 | assert_se(!uid_range_covers(p, 1000, 1)); | |
43 | assert_se(!uid_range_covers(p, 1000, 100)); | |
44 | assert_se(!uid_range_covers(p, 1001, 100)); | |
55656049 | 45 | |
fed1e721 | 46 | search = UID_INVALID; |
8dcc66ce | 47 | assert_se(uid_range_next_lower(p, &search)); |
8530dc44 | 48 | assert_se(search == 999); |
8dcc66ce | 49 | assert_se(uid_range_next_lower(p, &search)); |
8530dc44 LP |
50 | assert_se(search == 998); |
51 | search = 501; | |
8dcc66ce | 52 | assert_se(uid_range_next_lower(p, &search)); |
8530dc44 | 53 | assert_se(search == 500); |
8dcc66ce YW |
54 | assert_se(uid_range_next_lower(p, &search) == -EBUSY); |
55 | ||
56 | assert_se(uid_range_add_str(&p, "1000") >= 0); | |
57 | assert_se(p->n_entries == 1); | |
58 | assert_se(p->entries[0].start == 500); | |
59 | assert_se(p->entries[0].nr == 501); | |
60 | ||
61 | assert_se(uid_range_add_str(&p, "30-40") >= 0); | |
62 | assert_se(p->n_entries == 2); | |
63 | assert_se(p->entries[0].start == 30); | |
64 | assert_se(p->entries[0].nr == 11); | |
65 | assert_se(p->entries[1].start == 500); | |
66 | assert_se(p->entries[1].nr == 501); | |
67 | ||
68 | assert_se(uid_range_add_str(&p, "60-70") >= 0); | |
69 | assert_se(p->n_entries == 3); | |
70 | assert_se(p->entries[0].start == 30); | |
71 | assert_se(p->entries[0].nr == 11); | |
72 | assert_se(p->entries[1].start == 60); | |
73 | assert_se(p->entries[1].nr == 11); | |
74 | assert_se(p->entries[2].start == 500); | |
75 | assert_se(p->entries[2].nr == 501); | |
76 | ||
77 | assert_se(uid_range_add_str(&p, "20-2000") >= 0); | |
78 | assert_se(p->n_entries == 1); | |
79 | assert_se(p->entries[0].start == 20); | |
80 | assert_se(p->entries[0].nr == 1981); | |
81 | ||
82 | assert_se(uid_range_add_str(&p, "2002") >= 0); | |
83 | assert_se(p->n_entries == 2); | |
84 | assert_se(p->entries[0].start == 20); | |
85 | assert_se(p->entries[0].nr == 1981); | |
86 | assert_se(p->entries[1].start == 2002); | |
87 | assert_se(p->entries[1].nr == 1); | |
88 | ||
89 | assert_se(uid_range_add_str(&p, "2001") >= 0); | |
90 | assert_se(p->n_entries == 1); | |
91 | assert_se(p->entries[0].start == 20); | |
92 | assert_se(p->entries[0].nr == 1983); | |
8530dc44 | 93 | } |
2e37ebda | 94 | |
5674aa7a | 95 | TEST(load_userns) { |
8dcc66ce | 96 | _cleanup_(uid_range_freep) UidRange *p = NULL; |
5674aa7a | 97 | _cleanup_(unlink_and_freep) char *fn = NULL; |
5674aa7a | 98 | _cleanup_fclose_ FILE *f = NULL; |
5674aa7a LP |
99 | int r; |
100 | ||
8dcc66ce | 101 | r = uid_range_load_userns(&p, NULL); |
cd1c510f | 102 | if (ERRNO_IS_NEG_NOT_SUPPORTED(r)) |
5674aa7a LP |
103 | return; |
104 | ||
105 | assert_se(r >= 0); | |
8dcc66ce | 106 | assert_se(uid_range_contains(p, getuid())); |
5674aa7a LP |
107 | |
108 | r = running_in_userns(); | |
109 | if (r == 0) { | |
8dcc66ce YW |
110 | assert_se(p->n_entries == 1); |
111 | assert_se(p->entries[0].start == 0); | |
112 | assert_se(p->entries[0].nr == UINT32_MAX); | |
55656049 | 113 | |
8dcc66ce | 114 | assert_se(uid_range_covers(p, 0, UINT32_MAX)); |
5674aa7a LP |
115 | } |
116 | ||
dd3c8252 | 117 | assert_se(fopen_temporary_child(NULL, &f, &fn) >= 0); |
5674aa7a LP |
118 | fputs("0 0 20\n" |
119 | "100 0 20\n", f); | |
120 | assert_se(fflush_and_check(f) >= 0); | |
121 | ||
8dcc66ce | 122 | p = uid_range_free(p); |
5674aa7a | 123 | |
8dcc66ce | 124 | assert_se(uid_range_load_userns(&p, fn) >= 0); |
5674aa7a | 125 | |
8dcc66ce YW |
126 | assert_se(uid_range_contains(p, 0)); |
127 | assert_se(uid_range_contains(p, 19)); | |
128 | assert_se(!uid_range_contains(p, 20)); | |
5674aa7a | 129 | |
8dcc66ce YW |
130 | assert_se(!uid_range_contains(p, 99)); |
131 | assert_se(uid_range_contains(p, 100)); | |
132 | assert_se(uid_range_contains(p, 119)); | |
133 | assert_se(!uid_range_contains(p, 120)); | |
5674aa7a LP |
134 | } |
135 | ||
269073fd YW |
136 | TEST(uid_range_coalesce) { |
137 | _cleanup_(uid_range_freep) UidRange *p = NULL; | |
138 | ||
139 | for (size_t i = 0; i < 10; i++) { | |
140 | assert_se(uid_range_add_internal(&p, i * 10, 10, /* coalesce = */ false) >= 0); | |
141 | assert_se(uid_range_add_internal(&p, i * 10 + 5, 10, /* coalesce = */ false) >= 0); | |
142 | } | |
143 | ||
144 | assert_se(uid_range_add_internal(&p, 100, 1, /* coalesce = */ true) >= 0); | |
145 | assert_se(p->n_entries == 1); | |
146 | assert_se(p->entries[0].start == 0); | |
147 | assert_se(p->entries[0].nr == 105); | |
148 | ||
149 | p = uid_range_free(p); | |
150 | ||
151 | for (size_t i = 0; i < 10; i++) { | |
152 | assert_se(uid_range_add_internal(&p, (10 - i) * 10, 10, /* coalesce = */ false) >= 0); | |
153 | assert_se(uid_range_add_internal(&p, (10 - i) * 10 + 5, 10, /* coalesce = */ false) >= 0); | |
154 | } | |
155 | ||
156 | assert_se(uid_range_add_internal(&p, 100, 1, /* coalesce = */ true) >= 0); | |
157 | assert_se(p->n_entries == 1); | |
158 | assert_se(p->entries[0].start == 10); | |
159 | assert_se(p->entries[0].nr == 105); | |
160 | ||
161 | p = uid_range_free(p); | |
162 | ||
163 | for (size_t i = 0; i < 10; i++) { | |
164 | assert_se(uid_range_add_internal(&p, i * 10, 10, /* coalesce = */ false) >= 0); | |
165 | assert_se(uid_range_add_internal(&p, i * 10 + 5, 10, /* coalesce = */ false) >= 0); | |
166 | assert_se(uid_range_add_internal(&p, (10 - i) * 10, 10, /* coalesce = */ false) >= 0); | |
167 | assert_se(uid_range_add_internal(&p, (10 - i) * 10 + 5, 10, /* coalesce = */ false) >= 0); | |
168 | } | |
169 | assert_se(uid_range_add_internal(&p, 100, 1, /* coalesce = */ true) >= 0); | |
170 | assert_se(p->n_entries == 1); | |
171 | assert_se(p->entries[0].start == 0); | |
172 | assert_se(p->entries[0].nr == 115); | |
173 | } | |
174 | ||
2e37ebda | 175 | DEFINE_TEST_MAIN(LOG_DEBUG); |