diff options
author | Luca Boccassi <bluca@debian.org> | 2022-04-30 00:50:11 +0200 |
---|---|---|
committer | Yu Watanabe <watanabe.yu+github@gmail.com> | 2022-05-01 04:47:44 +0200 |
commit | 444d9abd06478525fc5da3b03c512f6a1f0ef12b (patch) | |
tree | 1db0f3733569d7ae1fb07885fbd0c863839c40fd /src/analyze/analyze-security.c | |
parent | stat-util: ignore hidden_or_backup_file when checking if dir is empty (diff) | |
download | systemd-444d9abd06478525fc5da3b03c512f6a1f0ef12b.tar.xz systemd-444d9abd06478525fc5da3b03c512f6a1f0ef12b.zip |
analyze: fix crash with online security check
1449b0f8a96b27 fixed seccomp arch check for the offline case,
but broke it for the normal case, as when coming from D-Bus the
list of seccomp architectures is already converted to string.
Fixes https://github.com/systemd/systemd/issues/23224
Diffstat (limited to 'src/analyze/analyze-security.c')
-rw-r--r-- | src/analyze/analyze-security.c | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/src/analyze/analyze-security.c b/src/analyze/analyze-security.c index cfda6580a7..102722bbc0 100644 --- a/src/analyze/analyze-security.c +++ b/src/analyze/analyze-security.c @@ -539,19 +539,16 @@ static int assess_system_call_architectures( uint64_t *ret_badness, char **ret_description) { - uint32_t native = 0; char *d; uint64_t b; assert(ret_badness); assert(ret_description); - assert_se(seccomp_arch_from_string("native", &native) >= 0); - if (set_isempty(info->system_call_architectures)) { b = 10; d = strdup("Service may execute system calls with all ABIs"); - } else if (set_contains(info->system_call_architectures, UINT32_TO_PTR(native + 1)) && + } else if (set_contains(info->system_call_architectures, "native") && set_size(info->system_call_architectures) == 1) { b = 0; d = strdup("Service may execute system calls only with native ABI"); @@ -2574,11 +2571,20 @@ static int get_security_info(Unit *u, ExecContext *c, CGroupContext *g, Security return log_oom(); } info->_umask = c->umask; - if (c->syscall_archs) { - info->system_call_architectures = set_copy(c->syscall_archs); - if (!info->system_call_architectures) + +#if HAVE_SECCOMP + SET_FOREACH(key, c->syscall_archs) { + const char *name; + + name = seccomp_arch_to_string(PTR_TO_UINT32(key) - 1); + if (!name) + continue; + + if (set_put_strdup(&info->system_call_architectures, name) < 0) return log_oom(); } +#endif + info->system_call_filter_allow_list = c->syscall_allow_list; if (c->syscall_filter) { info->system_call_filter = hashmap_copy(c->syscall_filter); |