diff --git a/src/libcrun/linux.c b/src/libcrun/linux.c index 09f94227d5..8195a87f25 100644 --- a/src/libcrun/linux.c +++ b/src/libcrun/linux.c @@ -4296,7 +4296,7 @@ set_required_caps (struct all_caps_s *caps, uid_t uid, gid_t gid, int no_new_pri } static int -read_caps (unsigned long caps[2], char **values, size_t len) +read_caps (unsigned long caps[2], char **values, size_t len, libcrun_error_t *err) { #ifdef HAVE_CAP size_t i; @@ -4304,10 +4304,8 @@ read_caps (unsigned long caps[2], char **values, size_t len) { cap_value_t cap; if (cap_from_name (values[i], &cap) < 0) - { - libcrun_warning ("unknown cap: `%s`", values[i]); - continue; - } + return crun_make_error (err, 0, "unknown capability `%s`", values[i]); + if (cap < 32) caps[0] |= CAP_TO_MASK_0 (cap); else @@ -4342,14 +4340,29 @@ libcrun_set_caps (runtime_spec_schema_config_schema_process_capabilities *capabi int no_new_privileges, libcrun_error_t *err) { struct all_caps_s caps = {}; + int ret; if (capabilities) { - read_caps (caps.effective, capabilities->effective, capabilities->effective_len); - read_caps (caps.inheritable, capabilities->inheritable, capabilities->inheritable_len); - read_caps (caps.ambient, capabilities->ambient, capabilities->ambient_len); - read_caps (caps.bounding, capabilities->bounding, capabilities->bounding_len); - read_caps (caps.permitted, capabilities->permitted, capabilities->permitted_len); + ret = read_caps (caps.effective, capabilities->effective, capabilities->effective_len, err); + if (UNLIKELY (ret < 0)) + return ret; + + ret = read_caps (caps.inheritable, capabilities->inheritable, capabilities->inheritable_len, err); + if (UNLIKELY (ret < 0)) + return ret; + + ret = read_caps (caps.ambient, capabilities->ambient, capabilities->ambient_len, err); + if (UNLIKELY (ret < 0)) + return ret; + + ret = read_caps (caps.bounding, capabilities->bounding, capabilities->bounding_len, err); + if (UNLIKELY (ret < 0)) + return ret; + + ret = read_caps (caps.permitted, capabilities->permitted, capabilities->permitted_len, err); + if (UNLIKELY (ret < 0)) + return ret; } return set_required_caps (&caps, uid, gid, no_new_privileges, err); }