/* SPDX-License-Identifier: LGPL-2.1-or-later */ #include #include #include "fd-util.h" #include "fileio.h" #include "format-util.h" #include "fs-util.h" #include "tests.h" #include "tmpfile-util.h" #include "uid-alloc-range.h" static void test_read_login_defs_one(const char *path) { log_info("/* %s(\"%s\") */", __func__, path ?: ""); _cleanup_(unlink_tempfilep) char name[] = "/tmp/test-user-record.XXXXXX"; _cleanup_fclose_ FILE *f = NULL; if (!path) { assert_se(fmkostemp_safe(name, "r+", &f) == 0); fprintf(f, "SYS_UID_MIN "UID_FMT"\n" "SYS_UID_MAX "UID_FMT"\n" "SYS_GID_MIN "GID_FMT"\n" "SYS_GID_MAX "GID_FMT"\n", (uid_t) (SYSTEM_ALLOC_UID_MIN + 5), (uid_t) (SYSTEM_UID_MAX + 5), (gid_t) (SYSTEM_ALLOC_GID_MIN + 5), (gid_t) (SYSTEM_GID_MAX + 5)); assert_se(fflush_and_check(f) >= 0); } UGIDAllocationRange defs; assert_se(read_login_defs(&defs, path ?: name, NULL) >= 0); log_info("system_alloc_uid_min="UID_FMT, defs.system_alloc_uid_min); log_info("system_uid_max="UID_FMT, defs.system_uid_max); log_info("system_alloc_gid_min="GID_FMT, defs.system_alloc_gid_min); log_info("system_gid_max="GID_FMT, defs.system_gid_max); if (!path) { uid_t offset = ENABLE_COMPAT_MUTABLE_UID_BOUNDARIES ? 5 : 0; assert_se(defs.system_alloc_uid_min == SYSTEM_ALLOC_UID_MIN + offset); assert_se(defs.system_uid_max == SYSTEM_UID_MAX + offset); assert_se(defs.system_alloc_gid_min == SYSTEM_ALLOC_GID_MIN + offset); assert_se(defs.system_gid_max == SYSTEM_GID_MAX + offset); } else if (streq(path, "/dev/null")) { assert_se(defs.system_alloc_uid_min == SYSTEM_ALLOC_UID_MIN); assert_se(defs.system_uid_max == SYSTEM_UID_MAX); assert_se(defs.system_alloc_gid_min == SYSTEM_ALLOC_GID_MIN); assert_se(defs.system_gid_max == SYSTEM_GID_MAX); } } TEST(read_login_defs) { test_read_login_defs_one("/dev/null"); test_read_login_defs_one("/etc/login.defs"); test_read_login_defs_one(NULL); } TEST(acquire_ugid_allocation_range) { const UGIDAllocationRange *defs; assert_se(defs = acquire_ugid_allocation_range()); log_info("system_alloc_uid_min="UID_FMT, defs->system_alloc_uid_min); log_info("system_uid_max="UID_FMT, defs->system_uid_max); log_info("system_alloc_gid_min="GID_FMT, defs->system_alloc_gid_min); log_info("system_gid_max="GID_FMT, defs->system_gid_max); } TEST(uid_is_system) { uid_t uid = 0; log_info("uid_is_system("UID_FMT") = %s", uid, yes_no(uid_is_system(uid))); uid = 999; log_info("uid_is_system("UID_FMT") = %s", uid, yes_no(uid_is_system(uid))); uid = getuid(); log_info("uid_is_system("UID_FMT") = %s", uid, yes_no(uid_is_system(uid))); } TEST(gid_is_system) { gid_t gid = 0; log_info("gid_is_system("GID_FMT") = %s", gid, yes_no(gid_is_system(gid))); gid = 999; log_info("gid_is_system("GID_FMT") = %s", gid, yes_no(gid_is_system(gid))); gid = getgid(); log_info("gid_is_system("GID_FMT") = %s", gid, yes_no(gid_is_system(gid))); } DEFINE_TEST_MAIN(LOG_DEBUG);