1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
3 #include "alloc-util.h"
4 #include "format-util.h"
5 #include "libcrypt-util.h"
8 #include "memory-util.h"
10 #include "string-util.h"
12 #include "user-util.h"
14 static void test_uid_to_name_one(uid_t uid
, const char *name
) {
15 _cleanup_free_
char *t
= NULL
;
17 log_info("/* %s("UID_FMT
", \"%s\") */", __func__
, uid
, name
);
19 assert_se(t
= uid_to_name(uid
));
20 if (!synthesize_nobody() && streq(name
, NOBODY_USER_NAME
)) {
21 log_info("(skipping detailed tests because nobody is not synthesized)");
24 assert_se(streq_ptr(t
, name
));
28 test_uid_to_name_one(0, "root");
29 test_uid_to_name_one(UID_NOBODY
, NOBODY_USER_NAME
);
30 test_uid_to_name_one(0xFFFF, "65535");
31 test_uid_to_name_one(0xFFFFFFFF, "4294967295");
34 static void test_gid_to_name_one(gid_t gid
, const char *name
) {
35 _cleanup_free_
char *t
= NULL
;
37 log_info("/* %s("GID_FMT
", \"%s\") */", __func__
, gid
, name
);
39 assert_se(t
= gid_to_name(gid
));
40 if (!synthesize_nobody() && streq(name
, NOBODY_GROUP_NAME
)) {
41 log_info("(skipping detailed tests because nobody is not synthesized)");
44 assert_se(streq_ptr(t
, name
));
48 test_gid_to_name_one(0, "root");
49 test_gid_to_name_one(GID_NOBODY
, NOBODY_GROUP_NAME
);
50 test_gid_to_name_one(0xFFFF, "65535");
51 test_gid_to_name_one(0xFFFFFFFF, "4294967295");
58 r
= parse_uid("0", &uid
);
62 r
= parse_uid("1", &uid
);
66 r
= parse_uid("01", &uid
);
67 assert_se(r
== -EINVAL
);
70 r
= parse_uid("001", &uid
);
71 assert_se(r
== -EINVAL
);
74 r
= parse_uid("100", &uid
);
76 assert_se(uid
== 100);
78 r
= parse_uid("65535", &uid
);
79 assert_se(r
== -ENXIO
);
80 assert_se(uid
== 100);
82 r
= parse_uid("0x1234", &uid
);
83 assert_se(r
== -EINVAL
);
84 assert_se(uid
== 100);
86 r
= parse_uid("0o1234", &uid
);
87 assert_se(r
== -EINVAL
);
88 assert_se(uid
== 100);
90 r
= parse_uid("0b1234", &uid
);
91 assert_se(r
== -EINVAL
);
92 assert_se(uid
== 100);
94 r
= parse_uid("+1234", &uid
);
95 assert_se(r
== -EINVAL
);
96 assert_se(uid
== 100);
98 r
= parse_uid("-1234", &uid
);
99 assert_se(r
== -EINVAL
);
100 assert_se(uid
== 100);
102 r
= parse_uid(" 1234", &uid
);
103 assert_se(r
== -EINVAL
);
104 assert_se(uid
== 100);
106 r
= parse_uid("01234", &uid
);
107 assert_se(r
== -EINVAL
);
108 assert_se(uid
== 100);
110 r
= parse_uid("001234", &uid
);
111 assert_se(r
== -EINVAL
);
112 assert_se(uid
== 100);
114 r
= parse_uid("0001234", &uid
);
115 assert_se(r
== -EINVAL
);
116 assert_se(uid
== 100);
118 r
= parse_uid("-0", &uid
);
119 assert_se(r
== -EINVAL
);
120 assert_se(uid
== 100);
122 r
= parse_uid("+0", &uid
);
123 assert_se(r
== -EINVAL
);
124 assert_se(uid
== 100);
126 r
= parse_uid("00", &uid
);
127 assert_se(r
== -EINVAL
);
128 assert_se(uid
== 100);
130 r
= parse_uid("000", &uid
);
131 assert_se(r
== -EINVAL
);
132 assert_se(uid
== 100);
134 r
= parse_uid("asdsdas", &uid
);
135 assert_se(r
== -EINVAL
);
136 assert_se(uid
== 100);
140 ASSERT_NOT_NULL(UID_TO_PTR(0));
141 ASSERT_NOT_NULL(UID_TO_PTR(1000));
143 assert_se(PTR_TO_UID(UID_TO_PTR(0)) == 0);
144 assert_se(PTR_TO_UID(UID_TO_PTR(1000)) == 1000);
147 TEST(valid_user_group_name_relaxed
) {
148 assert_se(!valid_user_group_name(NULL
, VALID_USER_RELAX
));
149 assert_se(!valid_user_group_name("", VALID_USER_RELAX
));
150 assert_se(!valid_user_group_name("1", VALID_USER_RELAX
));
151 assert_se(!valid_user_group_name("65535", VALID_USER_RELAX
));
152 assert_se(!valid_user_group_name("-1", VALID_USER_RELAX
));
153 assert_se(!valid_user_group_name("foo\nbar", VALID_USER_RELAX
));
154 assert_se(!valid_user_group_name("0123456789012345678901234567890123456789", VALID_USER_RELAX
));
155 assert_se(!valid_user_group_name("aaa:bbb", VALID_USER_RELAX
|VALID_USER_ALLOW_NUMERIC
));
156 assert_se(!valid_user_group_name(".aaa:bbb", VALID_USER_RELAX
|VALID_USER_ALLOW_NUMERIC
));
157 assert_se(!valid_user_group_name(".", VALID_USER_RELAX
));
158 assert_se(!valid_user_group_name("..", VALID_USER_RELAX
));
160 assert_se(valid_user_group_name("root", VALID_USER_RELAX
));
161 assert_se(valid_user_group_name("lennart", VALID_USER_RELAX
));
162 assert_se(valid_user_group_name("LENNART", VALID_USER_RELAX
));
163 assert_se(valid_user_group_name("_kkk", VALID_USER_RELAX
));
164 assert_se(valid_user_group_name("kkk-", VALID_USER_RELAX
));
165 assert_se(valid_user_group_name("kk-k", VALID_USER_RELAX
));
166 assert_se(valid_user_group_name("eff.eff", VALID_USER_RELAX
));
167 assert_se(valid_user_group_name("eff.", VALID_USER_RELAX
));
168 assert_se(valid_user_group_name("-kkk", VALID_USER_RELAX
));
169 assert_se(valid_user_group_name("rööt", VALID_USER_RELAX
));
170 assert_se(valid_user_group_name(".eff", VALID_USER_RELAX
));
171 assert_se(valid_user_group_name(".1", VALID_USER_RELAX
));
172 assert_se(valid_user_group_name(".65535", VALID_USER_RELAX
));
173 assert_se(valid_user_group_name(".-1", VALID_USER_RELAX
));
174 assert_se(valid_user_group_name(".-kkk", VALID_USER_RELAX
));
175 assert_se(valid_user_group_name(".rööt", VALID_USER_RELAX
));
176 assert_se(valid_user_group_name("...", VALID_USER_RELAX
));
178 assert_se(valid_user_group_name("some5", VALID_USER_RELAX
));
179 assert_se(valid_user_group_name("5some", VALID_USER_RELAX
));
180 assert_se(valid_user_group_name("INNER5NUMBER", VALID_USER_RELAX
));
182 assert_se(valid_user_group_name("piff.paff@ad.domain.example", VALID_USER_RELAX
));
183 assert_se(valid_user_group_name("Dāvis", VALID_USER_RELAX
));
186 TEST(valid_user_group_name
) {
187 assert_se(!valid_user_group_name(NULL
, 0));
188 assert_se(!valid_user_group_name("", 0));
189 assert_se(!valid_user_group_name("1", 0));
190 assert_se(!valid_user_group_name("65535", 0));
191 assert_se(!valid_user_group_name("-1", 0));
192 assert_se(!valid_user_group_name("-kkk", 0));
193 assert_se(!valid_user_group_name("rööt", 0));
194 assert_se(!valid_user_group_name(".", 0));
195 assert_se(!valid_user_group_name(".eff", 0));
196 assert_se(!valid_user_group_name("foo\nbar", 0));
197 assert_se(!valid_user_group_name("0123456789012345678901234567890123456789", 0));
198 assert_se(!valid_user_group_name("aaa:bbb", VALID_USER_ALLOW_NUMERIC
));
199 assert_se(!valid_user_group_name(".", 0));
200 assert_se(!valid_user_group_name("..", 0));
201 assert_se(!valid_user_group_name("...", 0));
202 assert_se(!valid_user_group_name(".1", 0));
203 assert_se(!valid_user_group_name(".65535", 0));
204 assert_se(!valid_user_group_name(".-1", 0));
205 assert_se(!valid_user_group_name(".-kkk", 0));
206 assert_se(!valid_user_group_name(".rööt", 0));
207 assert_se(!valid_user_group_name(".aaa:bbb", VALID_USER_ALLOW_NUMERIC
));
209 assert_se(valid_user_group_name("root", 0));
210 assert_se(valid_user_group_name("lennart", 0));
211 assert_se(valid_user_group_name("LENNART", 0));
212 assert_se(valid_user_group_name("_kkk", 0));
213 assert_se(valid_user_group_name("kkk-", 0));
214 assert_se(valid_user_group_name("kk-k", 0));
215 assert_se(!valid_user_group_name("eff.eff", 0));
216 assert_se(!valid_user_group_name("eff.", 0));
218 assert_se(valid_user_group_name("some5", 0));
219 assert_se(!valid_user_group_name("5some", 0));
220 assert_se(valid_user_group_name("INNER5NUMBER", 0));
222 assert_se(!valid_user_group_name("piff.paff@ad.domain.example", 0));
223 assert_se(!valid_user_group_name("Dāvis", 0));
226 TEST(valid_user_group_name_or_numeric_relaxed
) {
227 assert_se(!valid_user_group_name(NULL
, VALID_USER_ALLOW_NUMERIC
|VALID_USER_RELAX
));
228 assert_se(!valid_user_group_name("", VALID_USER_ALLOW_NUMERIC
|VALID_USER_RELAX
));
229 assert_se(valid_user_group_name("0", VALID_USER_ALLOW_NUMERIC
|VALID_USER_RELAX
));
230 assert_se(valid_user_group_name("1", VALID_USER_ALLOW_NUMERIC
|VALID_USER_RELAX
));
231 assert_se(valid_user_group_name("65534", VALID_USER_ALLOW_NUMERIC
|VALID_USER_RELAX
));
232 assert_se(!valid_user_group_name("65535", VALID_USER_ALLOW_NUMERIC
|VALID_USER_RELAX
));
233 assert_se(valid_user_group_name("65536", VALID_USER_ALLOW_NUMERIC
|VALID_USER_RELAX
));
234 assert_se(!valid_user_group_name("-1", VALID_USER_ALLOW_NUMERIC
|VALID_USER_RELAX
));
235 assert_se(!valid_user_group_name("foo\nbar", VALID_USER_ALLOW_NUMERIC
|VALID_USER_RELAX
));
236 assert_se(!valid_user_group_name("0123456789012345678901234567890123456789", VALID_USER_ALLOW_NUMERIC
|VALID_USER_RELAX
));
237 assert_se(!valid_user_group_name("aaa:bbb", VALID_USER_ALLOW_NUMERIC
|VALID_USER_RELAX
));
238 assert_se(!valid_user_group_name(".", VALID_USER_ALLOW_NUMERIC
|VALID_USER_RELAX
));
239 assert_se(!valid_user_group_name("..", VALID_USER_ALLOW_NUMERIC
|VALID_USER_RELAX
));
241 assert_se(valid_user_group_name("root", VALID_USER_ALLOW_NUMERIC
|VALID_USER_RELAX
));
242 assert_se(valid_user_group_name("lennart", VALID_USER_ALLOW_NUMERIC
|VALID_USER_RELAX
));
243 assert_se(valid_user_group_name("LENNART", VALID_USER_ALLOW_NUMERIC
|VALID_USER_RELAX
));
244 assert_se(valid_user_group_name("_kkk", VALID_USER_ALLOW_NUMERIC
|VALID_USER_RELAX
));
245 assert_se(valid_user_group_name("kkk-", VALID_USER_ALLOW_NUMERIC
|VALID_USER_RELAX
));
246 assert_se(valid_user_group_name("kk-k", VALID_USER_ALLOW_NUMERIC
|VALID_USER_RELAX
));
247 assert_se(valid_user_group_name("-kkk", VALID_USER_ALLOW_NUMERIC
|VALID_USER_RELAX
));
248 assert_se(valid_user_group_name("rööt", VALID_USER_ALLOW_NUMERIC
|VALID_USER_RELAX
));
249 assert_se(valid_user_group_name(".eff", VALID_USER_ALLOW_NUMERIC
|VALID_USER_RELAX
));
250 assert_se(valid_user_group_name("eff.eff", VALID_USER_ALLOW_NUMERIC
|VALID_USER_RELAX
));
251 assert_se(valid_user_group_name("eff.", VALID_USER_ALLOW_NUMERIC
|VALID_USER_RELAX
));
252 assert_se(valid_user_group_name("...", VALID_USER_ALLOW_NUMERIC
|VALID_USER_RELAX
));
254 assert_se(valid_user_group_name("some5", VALID_USER_ALLOW_NUMERIC
|VALID_USER_RELAX
));
255 assert_se(valid_user_group_name("5some", VALID_USER_ALLOW_NUMERIC
|VALID_USER_RELAX
));
256 assert_se(valid_user_group_name("INNER5NUMBER", VALID_USER_ALLOW_NUMERIC
|VALID_USER_RELAX
));
258 assert_se(valid_user_group_name("piff.paff@ad.domain.example", VALID_USER_ALLOW_NUMERIC
|VALID_USER_RELAX
));
259 assert_se(valid_user_group_name("Dāvis", VALID_USER_ALLOW_NUMERIC
|VALID_USER_RELAX
));
262 TEST(valid_user_group_name_or_numeric
) {
263 assert_se(!valid_user_group_name(NULL
, VALID_USER_ALLOW_NUMERIC
));
264 assert_se(!valid_user_group_name("", VALID_USER_ALLOW_NUMERIC
));
265 assert_se(valid_user_group_name("0", VALID_USER_ALLOW_NUMERIC
));
266 assert_se(valid_user_group_name("1", VALID_USER_ALLOW_NUMERIC
));
267 assert_se(valid_user_group_name("65534", VALID_USER_ALLOW_NUMERIC
));
268 assert_se(!valid_user_group_name("65535", VALID_USER_ALLOW_NUMERIC
));
269 assert_se(valid_user_group_name("65536", VALID_USER_ALLOW_NUMERIC
));
270 assert_se(!valid_user_group_name("-1", VALID_USER_ALLOW_NUMERIC
));
271 assert_se(!valid_user_group_name("-kkk", VALID_USER_ALLOW_NUMERIC
));
272 assert_se(!valid_user_group_name("rööt", VALID_USER_ALLOW_NUMERIC
));
273 assert_se(!valid_user_group_name(".", VALID_USER_ALLOW_NUMERIC
));
274 assert_se(!valid_user_group_name("..", VALID_USER_ALLOW_NUMERIC
));
275 assert_se(!valid_user_group_name("...", VALID_USER_ALLOW_NUMERIC
));
276 assert_se(!valid_user_group_name(".eff", VALID_USER_ALLOW_NUMERIC
));
277 assert_se(!valid_user_group_name("eff.eff", VALID_USER_ALLOW_NUMERIC
));
278 assert_se(!valid_user_group_name("eff.", VALID_USER_ALLOW_NUMERIC
));
279 assert_se(!valid_user_group_name("foo\nbar", VALID_USER_ALLOW_NUMERIC
));
280 assert_se(!valid_user_group_name("0123456789012345678901234567890123456789", VALID_USER_ALLOW_NUMERIC
));
281 assert_se(!valid_user_group_name("aaa:bbb", VALID_USER_ALLOW_NUMERIC
));
283 assert_se(valid_user_group_name("root", VALID_USER_ALLOW_NUMERIC
));
284 assert_se(valid_user_group_name("lennart", VALID_USER_ALLOW_NUMERIC
));
285 assert_se(valid_user_group_name("LENNART", VALID_USER_ALLOW_NUMERIC
));
286 assert_se(valid_user_group_name("_kkk", VALID_USER_ALLOW_NUMERIC
));
287 assert_se(valid_user_group_name("kkk-", VALID_USER_ALLOW_NUMERIC
));
288 assert_se(valid_user_group_name("kk-k", VALID_USER_ALLOW_NUMERIC
));
290 assert_se(valid_user_group_name("some5", VALID_USER_ALLOW_NUMERIC
));
291 assert_se(!valid_user_group_name("5some", VALID_USER_ALLOW_NUMERIC
));
292 assert_se(valid_user_group_name("INNER5NUMBER", VALID_USER_ALLOW_NUMERIC
));
294 assert_se(!valid_user_group_name("piff.paff@ad.domain.example", VALID_USER_ALLOW_NUMERIC
));
295 assert_se(!valid_user_group_name("Dāvis", VALID_USER_ALLOW_NUMERIC
));
299 assert_se(!valid_gecos(NULL
));
300 assert_se(valid_gecos(""));
301 assert_se(valid_gecos("test"));
302 assert_se(valid_gecos("Ümläüt"));
303 assert_se(!valid_gecos("In\nvalid"));
304 assert_se(!valid_gecos("In:valid"));
308 assert_se(!valid_home(NULL
));
309 assert_se(!valid_home(""));
310 assert_se(!valid_home("."));
311 assert_se(!valid_home("/home/.."));
312 assert_se(!valid_home("/home/../"));
313 assert_se(!valid_home("/home\n/foo"));
314 assert_se(!valid_home("./piep"));
315 assert_se(!valid_home("piep"));
316 assert_se(!valid_home("/home/user:lennart"));
318 assert_se(valid_home("/"));
319 assert_se(valid_home("/home"));
320 assert_se(valid_home("/home/foo"));
323 static void test_get_user_creds_one(const char *id
, const char *name
, uid_t uid
, gid_t gid
, const char *home
, const char *shell
) {
324 const char *rhome
= NULL
;
325 const char *rshell
= NULL
;
326 uid_t ruid
= UID_INVALID
;
327 gid_t rgid
= GID_INVALID
;
330 log_info("/* %s(\"%s\", \"%s\", "UID_FMT
", "GID_FMT
", \"%s\", \"%s\") */",
331 __func__
, id
, name
, uid
, gid
, home
, shell
);
333 r
= get_user_creds(&id
, &ruid
, &rgid
, &rhome
, &rshell
, 0);
334 log_info_errno(r
, "got \"%s\", "UID_FMT
", "GID_FMT
", \"%s\", \"%s\": %m",
335 id
, ruid
, rgid
, strnull(rhome
), strnull(rshell
));
336 if (!synthesize_nobody() && streq(name
, NOBODY_USER_NAME
)) {
337 log_info("(skipping detailed tests because nobody is not synthesized)");
341 assert_se(streq_ptr(id
, name
));
342 assert_se(ruid
== uid
);
343 assert_se(rgid
== gid
);
344 assert_se(path_equal(rhome
, home
));
347 TEST(get_user_creds
) {
348 test_get_user_creds_one("root", "root", 0, 0, "/root", DEFAULT_USER_SHELL
);
349 test_get_user_creds_one("0", "root", 0, 0, "/root", DEFAULT_USER_SHELL
);
350 test_get_user_creds_one(NOBODY_USER_NAME
, NOBODY_USER_NAME
, UID_NOBODY
, GID_NOBODY
, "/", NOLOGIN
);
351 test_get_user_creds_one("65534", NOBODY_USER_NAME
, UID_NOBODY
, GID_NOBODY
, "/", NOLOGIN
);
354 static void test_get_group_creds_one(const char *id
, const char *name
, gid_t gid
) {
355 gid_t rgid
= GID_INVALID
;
358 log_info("/* %s(\"%s\", \"%s\", "GID_FMT
") */", __func__
, id
, name
, gid
);
360 r
= get_group_creds(&id
, &rgid
, 0);
361 log_info_errno(r
, "got \"%s\", "GID_FMT
": %m", id
, rgid
);
362 if (!synthesize_nobody() && streq(name
, NOBODY_GROUP_NAME
)) {
363 log_info("(skipping detailed tests because nobody is not synthesized)");
367 assert_se(streq_ptr(id
, name
));
368 assert_se(rgid
== gid
);
371 TEST(get_group_creds
) {
372 test_get_group_creds_one("root", "root", 0);
373 test_get_group_creds_one("0", "root", 0);
374 test_get_group_creds_one(NOBODY_GROUP_NAME
, NOBODY_GROUP_NAME
, GID_NOBODY
);
375 test_get_group_creds_one("65534", NOBODY_GROUP_NAME
, GID_NOBODY
);
379 _cleanup_free_
char *s
, *t
;
381 assert_se(make_salt(&s
) == 0);
382 log_info("got %s", s
);
384 assert_se(make_salt(&t
) == 0);
385 log_info("got %s", t
);
387 assert_se(!streq(s
, t
));
391 assert_se(in_gid(getgid()) >= 0);
392 assert_se(in_gid(getegid()) >= 0);
393 assert_se(in_gid(GID_INVALID
) < 0);
394 assert_se(in_gid(TTY_GID
) == 0); /* The TTY gid is for owning ttys, it would be really really weird if we were in it. */
397 TEST(gid_lists_ops
) {
398 static const gid_t l1
[] = { 5, 10, 15, 20, 25};
399 static const gid_t l2
[] = { 1, 2, 3, 15, 20, 25};
400 static const gid_t l3
[] = { 5, 10, 15, 20, 25, 26, 27};
401 static const gid_t l4
[] = { 25, 26, 20, 15, 5, 27, 10};
403 static const gid_t result1
[] = {1, 2, 3, 5, 10, 15, 20, 25, 26, 27};
404 static const gid_t result2
[] = {5, 10, 15, 20, 25, 26, 27};
406 _cleanup_free_ gid_t
*gids
= NULL
;
407 _cleanup_free_ gid_t
*res1
= NULL
;
408 _cleanup_free_ gid_t
*res2
= NULL
;
409 _cleanup_free_ gid_t
*res3
= NULL
;
410 _cleanup_free_ gid_t
*res4
= NULL
;
413 nresult
= merge_gid_lists(l2
, ELEMENTSOF(l2
), l3
, ELEMENTSOF(l3
), &res1
);
414 assert_se(nresult
>= 0);
415 assert_se(memcmp_nn(res1
, nresult
, result1
, ELEMENTSOF(result1
)) == 0);
417 nresult
= merge_gid_lists(NULL
, 0, l2
, ELEMENTSOF(l2
), &res2
);
418 assert_se(nresult
>= 0);
419 assert_se(memcmp_nn(res2
, nresult
, l2
, ELEMENTSOF(l2
)) == 0);
421 nresult
= merge_gid_lists(l1
, ELEMENTSOF(l1
), l1
, ELEMENTSOF(l1
), &res3
);
422 assert_se(nresult
>= 0);
423 assert_se(memcmp_nn(l1
, ELEMENTSOF(l1
), res3
, nresult
) == 0);
425 nresult
= merge_gid_lists(l1
, ELEMENTSOF(l1
), l4
, ELEMENTSOF(l4
), &res4
);
426 assert_se(nresult
>= 0);
427 assert_se(memcmp_nn(result2
, ELEMENTSOF(result2
), res4
, nresult
) == 0);
429 nresult
= getgroups_alloc(&gids
);
430 assert_se(nresult
>= 0 || nresult
== -EINVAL
|| nresult
== -ENOMEM
);
434 TEST(parse_uid_range
) {
435 uid_t a
= 4711, b
= 4711;
437 assert_se(parse_uid_range("", &a
, &b
) == -EINVAL
&& a
== 4711 && b
== 4711);
438 assert_se(parse_uid_range(" ", &a
, &b
) == -EINVAL
&& a
== 4711 && b
== 4711);
439 assert_se(parse_uid_range("x", &a
, &b
) == -EINVAL
&& a
== 4711 && b
== 4711);
441 assert_se(parse_uid_range("0", &a
, &b
) >= 0 && a
== 0 && b
== 0);
442 assert_se(parse_uid_range("1", &a
, &b
) >= 0 && a
== 1 && b
== 1);
443 assert_se(parse_uid_range("2-2", &a
, &b
) >= 0 && a
== 2 && b
== 2);
444 assert_se(parse_uid_range("3-3", &a
, &b
) >= 0 && a
== 3 && b
== 3);
445 assert_se(parse_uid_range("4-5", &a
, &b
) >= 0 && a
== 4 && b
== 5);
447 assert_se(parse_uid_range("7-6", &a
, &b
) == -EINVAL
&& a
== 4 && b
== 5);
448 assert_se(parse_uid_range("-1", &a
, &b
) == -EINVAL
&& a
== 4 && b
== 5);
449 assert_se(parse_uid_range("01", &a
, &b
) == -EINVAL
&& a
== 4 && b
== 5);
450 assert_se(parse_uid_range("001", &a
, &b
) == -EINVAL
&& a
== 4 && b
== 5);
451 assert_se(parse_uid_range("+1", &a
, &b
) == -EINVAL
&& a
== 4 && b
== 5);
452 assert_se(parse_uid_range("1--1", &a
, &b
) == -EINVAL
&& a
== 4 && b
== 5);
453 assert_se(parse_uid_range(" 1", &a
, &b
) == -EINVAL
&& a
== 4 && b
== 5);
454 assert_se(parse_uid_range(" 1-2", &a
, &b
) == -EINVAL
&& a
== 4 && b
== 5);
455 assert_se(parse_uid_range("1 -2", &a
, &b
) == -EINVAL
&& a
== 4 && b
== 5);
456 assert_se(parse_uid_range("1- 2", &a
, &b
) == -EINVAL
&& a
== 4 && b
== 5);
457 assert_se(parse_uid_range("1-2 ", &a
, &b
) == -EINVAL
&& a
== 4 && b
== 5);
458 assert_se(parse_uid_range("01-2", &a
, &b
) == -EINVAL
&& a
== 4 && b
== 5);
459 assert_se(parse_uid_range("1-02", &a
, &b
) == -EINVAL
&& a
== 4 && b
== 5);
460 assert_se(parse_uid_range("001-2", &a
, &b
) == -EINVAL
&& a
== 4 && b
== 5);
461 assert_se(parse_uid_range("1-002", &a
, &b
) == -EINVAL
&& a
== 4 && b
== 5);
462 assert_se(parse_uid_range(" 01", &a
, &b
) == -EINVAL
&& a
== 4 && b
== 5);
465 static void test_mangle_gecos_one(const char *input
, const char *expected
) {
466 _cleanup_free_
char *p
= NULL
;
468 assert_se(p
= mangle_gecos(input
));
469 assert_se(streq(p
, expected
));
470 assert_se(valid_gecos(p
));
474 test_mangle_gecos_one("", "");
475 test_mangle_gecos_one("root", "root");
476 test_mangle_gecos_one("wuff\nwuff", "wuff wuff");
477 test_mangle_gecos_one("wuff:wuff", "wuff wuff");
478 test_mangle_gecos_one("wuff\r\n:wuff", "wuff wuff");
479 test_mangle_gecos_one("\n--wüff-wäff-wöff::", " --wüff-wäff-wöff ");
480 test_mangle_gecos_one("\xc3\x28", " (");
481 test_mangle_gecos_one("\xe2\x28\xa1", " ( ");
484 DEFINE_TEST_MAIN(LOG_INFO
);