/* 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 "tmpfile-util.h" #include "tests.h" #include "user-record.h" static void test_read_login_defs(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", SYSTEM_ALLOC_UID_MIN + 5, SYSTEM_UID_MAX + 5, SYSTEM_ALLOC_GID_MIN + 5, 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); } } static void test_acquire_ugid_allocation_range(void) { log_info("/* %s */", __func__); 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); } static void test_uid_is_system(void) { log_info("/* %s */", __func__); 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))); } static void test_gid_is_system(void) { log_info("/* %s */", __func__); 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))); } int main(int argc, char *argv[]) { test_setup_logging(LOG_DEBUG); test_read_login_defs("/dev/null"); test_read_login_defs("/etc/login.defs"); test_read_login_defs(NULL); test_acquire_ugid_allocation_range(); test_uid_is_system(); test_gid_is_system(); return 0; }