]>
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) { |
eb7d7d14 | 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)); | |
bda7e4d2 UU |
23 | assert_se(!uid_range_covers(p, UINT32_MAX, 1)); |
24 | assert_se(!uid_range_covers(p, UINT32_MAX - 10, 11)); | |
8dcc66ce | 25 | |
afdd0efa LP |
26 | assert_se(uid_range_entries(p) == 0); |
27 | assert_se(uid_range_size(p) == 0); | |
28 | assert_se(uid_range_is_empty(p)); | |
29 | ||
8dcc66ce YW |
30 | assert_se(uid_range_add_str(&p, "500-999") >= 0); |
31 | assert_se(p); | |
afdd0efa LP |
32 | assert_se(uid_range_entries(p) == 1); |
33 | assert_se(uid_range_size(p) == 500); | |
34 | assert_se(!uid_range_is_empty(p)); | |
8dcc66ce YW |
35 | assert_se(p->entries[0].start == 500); |
36 | assert_se(p->entries[0].nr == 500); | |
37 | ||
38 | assert_se(!uid_range_contains(p, 499)); | |
39 | assert_se(uid_range_contains(p, 500)); | |
40 | assert_se(uid_range_contains(p, 999)); | |
41 | assert_se(!uid_range_contains(p, 1000)); | |
42 | ||
43 | assert_se(!uid_range_covers(p, 100, 150)); | |
44 | assert_se(!uid_range_covers(p, 400, 200)); | |
45 | assert_se(!uid_range_covers(p, 499, 1)); | |
46 | assert_se(uid_range_covers(p, 500, 1)); | |
47 | assert_se(uid_range_covers(p, 501, 10)); | |
48 | assert_se(uid_range_covers(p, 999, 1)); | |
49 | assert_se(!uid_range_covers(p, 999, 2)); | |
50 | assert_se(!uid_range_covers(p, 1000, 1)); | |
51 | assert_se(!uid_range_covers(p, 1000, 100)); | |
52 | assert_se(!uid_range_covers(p, 1001, 100)); | |
55656049 | 53 | |
fed1e721 | 54 | search = UID_INVALID; |
8dcc66ce | 55 | assert_se(uid_range_next_lower(p, &search)); |
8530dc44 | 56 | assert_se(search == 999); |
8dcc66ce | 57 | assert_se(uid_range_next_lower(p, &search)); |
8530dc44 LP |
58 | assert_se(search == 998); |
59 | search = 501; | |
8dcc66ce | 60 | assert_se(uid_range_next_lower(p, &search)); |
8530dc44 | 61 | assert_se(search == 500); |
8dcc66ce YW |
62 | assert_se(uid_range_next_lower(p, &search) == -EBUSY); |
63 | ||
64 | assert_se(uid_range_add_str(&p, "1000") >= 0); | |
afdd0efa | 65 | assert_se(uid_range_entries(p) == 1); |
8dcc66ce YW |
66 | assert_se(p->entries[0].start == 500); |
67 | assert_se(p->entries[0].nr == 501); | |
68 | ||
69 | assert_se(uid_range_add_str(&p, "30-40") >= 0); | |
afdd0efa LP |
70 | assert_se(uid_range_entries(p) == 2); |
71 | assert_se(uid_range_size(p) == 500 + 1 + 11); | |
72 | assert_se(!uid_range_is_empty(p)); | |
8dcc66ce YW |
73 | assert_se(p->entries[0].start == 30); |
74 | assert_se(p->entries[0].nr == 11); | |
75 | assert_se(p->entries[1].start == 500); | |
76 | assert_se(p->entries[1].nr == 501); | |
77 | ||
78 | assert_se(uid_range_add_str(&p, "60-70") >= 0); | |
afdd0efa LP |
79 | assert_se(uid_range_entries(p) == 3); |
80 | assert_se(uid_range_size(p) == 500 + 1 + 11 + 11); | |
81 | assert_se(!uid_range_is_empty(p)); | |
8dcc66ce YW |
82 | assert_se(p->entries[0].start == 30); |
83 | assert_se(p->entries[0].nr == 11); | |
84 | assert_se(p->entries[1].start == 60); | |
85 | assert_se(p->entries[1].nr == 11); | |
86 | assert_se(p->entries[2].start == 500); | |
87 | assert_se(p->entries[2].nr == 501); | |
88 | ||
89 | assert_se(uid_range_add_str(&p, "20-2000") >= 0); | |
afdd0efa LP |
90 | assert_se(uid_range_entries(p) == 1); |
91 | assert_se(uid_range_size(p) == 1981); | |
8dcc66ce YW |
92 | assert_se(p->entries[0].start == 20); |
93 | assert_se(p->entries[0].nr == 1981); | |
94 | ||
95 | assert_se(uid_range_add_str(&p, "2002") >= 0); | |
afdd0efa LP |
96 | assert_se(uid_range_entries(p) == 2); |
97 | assert_se(uid_range_size(p) == 1982); | |
8dcc66ce YW |
98 | assert_se(p->entries[0].start == 20); |
99 | assert_se(p->entries[0].nr == 1981); | |
100 | assert_se(p->entries[1].start == 2002); | |
101 | assert_se(p->entries[1].nr == 1); | |
102 | ||
afdd0efa LP |
103 | _cleanup_(uid_range_freep) UIDRange *q = NULL; |
104 | assert_se(!uid_range_equal(p, q)); | |
105 | assert_se(uid_range_add_str(&q, "20-2000") >= 0); | |
106 | assert_se(!uid_range_equal(p, q)); | |
107 | assert_se(uid_range_add_str(&q, "2002") >= 0); | |
108 | assert_se(uid_range_equal(p, q)); | |
109 | ||
8dcc66ce | 110 | assert_se(uid_range_add_str(&p, "2001") >= 0); |
afdd0efa LP |
111 | assert_se(uid_range_entries(p) == 1); |
112 | assert_se(uid_range_size(p) == 1983); | |
8dcc66ce YW |
113 | assert_se(p->entries[0].start == 20); |
114 | assert_se(p->entries[0].nr == 1983); | |
afdd0efa LP |
115 | |
116 | assert_se(uid_range_add_str(&q, "2001") >= 0); | |
117 | assert_se(uid_range_equal(p, q)); | |
8530dc44 | 118 | } |
2e37ebda | 119 | |
5674aa7a | 120 | TEST(load_userns) { |
eb7d7d14 | 121 | _cleanup_(uid_range_freep) UIDRange *p = NULL; |
5674aa7a | 122 | _cleanup_(unlink_and_freep) char *fn = NULL; |
5674aa7a | 123 | _cleanup_fclose_ FILE *f = NULL; |
5674aa7a LP |
124 | int r; |
125 | ||
7fe28d83 | 126 | r = uid_range_load_userns(NULL, UID_RANGE_USERNS_INSIDE, &p); |
cd1c510f | 127 | if (ERRNO_IS_NEG_NOT_SUPPORTED(r)) |
5674aa7a LP |
128 | return; |
129 | ||
130 | assert_se(r >= 0); | |
8dcc66ce | 131 | assert_se(uid_range_contains(p, getuid())); |
5674aa7a LP |
132 | |
133 | r = running_in_userns(); | |
134 | if (r == 0) { | |
8dcc66ce YW |
135 | assert_se(p->n_entries == 1); |
136 | assert_se(p->entries[0].start == 0); | |
137 | assert_se(p->entries[0].nr == UINT32_MAX); | |
55656049 | 138 | |
8dcc66ce | 139 | assert_se(uid_range_covers(p, 0, UINT32_MAX)); |
5674aa7a LP |
140 | } |
141 | ||
dd3c8252 | 142 | assert_se(fopen_temporary_child(NULL, &f, &fn) >= 0); |
5674aa7a LP |
143 | fputs("0 0 20\n" |
144 | "100 0 20\n", f); | |
145 | assert_se(fflush_and_check(f) >= 0); | |
146 | ||
8dcc66ce | 147 | p = uid_range_free(p); |
5674aa7a | 148 | |
7fe28d83 | 149 | assert_se(uid_range_load_userns(fn, UID_RANGE_USERNS_INSIDE, &p) >= 0); |
5674aa7a | 150 | |
8dcc66ce YW |
151 | assert_se(uid_range_contains(p, 0)); |
152 | assert_se(uid_range_contains(p, 19)); | |
153 | assert_se(!uid_range_contains(p, 20)); | |
5674aa7a | 154 | |
8dcc66ce YW |
155 | assert_se(!uid_range_contains(p, 99)); |
156 | assert_se(uid_range_contains(p, 100)); | |
157 | assert_se(uid_range_contains(p, 119)); | |
158 | assert_se(!uid_range_contains(p, 120)); | |
5674aa7a LP |
159 | } |
160 | ||
269073fd | 161 | TEST(uid_range_coalesce) { |
eb7d7d14 | 162 | _cleanup_(uid_range_freep) UIDRange *p = NULL; |
269073fd YW |
163 | |
164 | for (size_t i = 0; i < 10; i++) { | |
165 | assert_se(uid_range_add_internal(&p, i * 10, 10, /* coalesce = */ false) >= 0); | |
166 | assert_se(uid_range_add_internal(&p, i * 10 + 5, 10, /* coalesce = */ false) >= 0); | |
167 | } | |
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 == 105); | |
173 | ||
174 | p = uid_range_free(p); | |
175 | ||
176 | for (size_t i = 0; i < 10; i++) { | |
177 | assert_se(uid_range_add_internal(&p, (10 - i) * 10, 10, /* coalesce = */ false) >= 0); | |
178 | assert_se(uid_range_add_internal(&p, (10 - i) * 10 + 5, 10, /* coalesce = */ false) >= 0); | |
179 | } | |
180 | ||
181 | assert_se(uid_range_add_internal(&p, 100, 1, /* coalesce = */ true) >= 0); | |
182 | assert_se(p->n_entries == 1); | |
183 | assert_se(p->entries[0].start == 10); | |
184 | assert_se(p->entries[0].nr == 105); | |
185 | ||
186 | p = uid_range_free(p); | |
187 | ||
188 | for (size_t i = 0; i < 10; i++) { | |
189 | assert_se(uid_range_add_internal(&p, i * 10, 10, /* coalesce = */ false) >= 0); | |
190 | assert_se(uid_range_add_internal(&p, i * 10 + 5, 10, /* coalesce = */ false) >= 0); | |
191 | assert_se(uid_range_add_internal(&p, (10 - i) * 10, 10, /* coalesce = */ false) >= 0); | |
192 | assert_se(uid_range_add_internal(&p, (10 - i) * 10 + 5, 10, /* coalesce = */ false) >= 0); | |
193 | } | |
194 | assert_se(uid_range_add_internal(&p, 100, 1, /* coalesce = */ true) >= 0); | |
195 | assert_se(p->n_entries == 1); | |
196 | assert_se(p->entries[0].start == 0); | |
197 | assert_se(p->entries[0].nr == 115); | |
198 | } | |
199 | ||
2e37ebda | 200 | DEFINE_TEST_MAIN(LOG_DEBUG); |