if (!c)
return NULL;
- assert(c->n_data == 0 || c->data);
-
- for (size_t i = 0; i < c->n_data; i++) {
- user_record_unref(c->data[i].host_user);
- group_record_unref(c->data[i].host_group);
- user_record_unref(c->data[i].payload_user);
- group_record_unref(c->data[i].payload_group);
+ FOREACH_ARRAY(d, c->data, c->n_data) {
+ user_record_unref(d->host_user);
+ group_record_unref(d->host_group);
+ user_record_unref(d->payload_user);
+ group_record_unref(d->payload_group);
}
return mfree(c);
if (r < 0)
return log_error_errno(r, "Failed to create /run/host/userdb: %m");
- for (size_t i = 0; i < c->n_data; i++) {
+ FOREACH_ARRAY(d, c->data, c->n_data) {
_cleanup_(group_record_unrefp) GroupRecord *stripped_group = NULL, *shadow_group = NULL;
_cleanup_(user_record_unrefp) UserRecord *stripped_user = NULL, *shadow_user = NULL;
- const BindUserData *d = c->data + i;
/* First, write shadow (i.e. privileged) data for group record */
r = group_record_clone(d->payload_group, shadow_flags, &shadow_group);
}
void custom_mount_free_all(CustomMount *l, size_t n) {
- for (size_t i = 0; i < n; i++) {
- CustomMount *m = l + i;
-
+ FOREACH_ARRAY(m, l, n) {
free(m->source);
free(m->destination);
free(m->options);
assert(dest);
- for (size_t i = 0; i < n; i++) {
- CustomMount *m = mounts + i;
-
+ FOREACH_ARRAY(m, mounts, n) {
if (FLAGS_SET(mount_settings, MOUNT_IN_USERNS) != m->in_userns)
continue;
}
bool has_custom_root_mount(const CustomMount *mounts, size_t n) {
- for (size_t i = 0; i < n; i++)
- if (path_equal(mounts[i].destination, "/"))
+ FOREACH_ARRAY(m, mounts, n)
+ if (path_equal(m->destination, "/"))
return true;
return false;
static int oci_cgroup_device_access(const char *name, sd_json_variant *v, sd_json_dispatch_flags_t flags, void *userdata) {
struct device_data *d = ASSERT_PTR(userdata);
bool r = false, w = false, m = false;
- const char *s;
- size_t i;
-
- assert_se(s = sd_json_variant_string(v));
- for (i = 0; s[i]; i++)
- if (s[i] == 'r')
+ for (const char *s = ASSERT_PTR(sd_json_variant_string(v)); *s; s++)
+ if (*s == 'r')
r = true;
- else if (s[i] == 'w')
+ else if (*s == 'w')
w = true;
- else if (s[i] == 'm')
+ else if (*s == 'm')
m = true;
else
return json_log(v, flags, SYNTHETIC_ERRNO(EINVAL),
- "Unknown device access character '%c'.", s[i]);
+ "Unknown device access character '%c'.", *s);
d->r = r;
d->w = w;
static int oci_cgroup_devices(const char *name, sd_json_variant *v, sd_json_dispatch_flags_t flags, void *userdata) {
_cleanup_free_ struct device_data *list = NULL;
Settings *s = ASSERT_PTR(userdata);
- size_t n_list = 0, i;
+ size_t n_list = 0;
bool noop = false;
sd_json_variant *e;
int r;
if (r < 0)
return bus_log_create_error(r);
- for (i = 0; i < n_list; i++) {
+ FOREACH_ARRAY(d, list, n_list) {
_cleanup_free_ char *pattern = NULL;
char access[4];
size_t n = 0;
- if (list[i].minor == UINT_MAX) {
+ if (d->minor == UINT_MAX) {
const char *t;
- if (list[i].type == S_IFBLK)
+ if (d->type == S_IFBLK)
t = "block";
else {
- assert(list[i].type == S_IFCHR);
+ assert(d->type == S_IFCHR);
t = "char";
}
- if (list[i].major == UINT_MAX) {
+ if (d->major == UINT_MAX) {
pattern = strjoin(t, "-*");
if (!pattern)
return log_oom();
} else {
- if (asprintf(&pattern, "%s-%u", t, list[i].major) < 0)
+ if (asprintf(&pattern, "%s-%u", t, d->major) < 0)
return log_oom();
}
} else {
- assert(list[i].major != UINT_MAX); /* If a minor is specified, then a major also needs to be specified */
+ assert(d->major != UINT_MAX); /* If a minor is specified, then a major also needs to be specified */
- r = device_path_make_major_minor(list[i].type, makedev(list[i].major, list[i].minor), &pattern);
+ r = device_path_make_major_minor(d->type, makedev(d->major, d->minor), &pattern);
if (r < 0)
return log_oom();
}
- if (list[i].r)
+ if (d->r)
access[n++] = 'r';
- if (list[i].w)
+ if (d->w)
access[n++] = 'w';
- if (list[i].m)
+ if (d->m)
access[n++] = 'm';
access[n] = 0;
int kill_signal,
bool coredump_receive) {
- unsigned j;
int r;
assert(m);
return bus_log_create_error(r);
}
- for (j = 0; j < n_mounts; j++) {
- CustomMount *cm = mounts + j;
-
+ FOREACH_ARRAY(cm, mounts, n_mounts) {
if (cm->type != CUSTOM_MOUNT_BIND)
continue;
}
static int custom_mount_check_all(void) {
- size_t i;
-
- for (i = 0; i < arg_n_custom_mounts; i++) {
- CustomMount *m = &arg_custom_mounts[i];
-
+ FOREACH_ARRAY(m, arg_custom_mounts, arg_n_custom_mounts)
if (path_equal(m->destination, "/") && arg_userns_mode != USER_NAMESPACE_NO) {
if (arg_userns_ownership != USER_NAMESPACE_OWNERSHIP_OFF)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"--private-users with automatic UID shift may not be combined with custom root mounts.");
}
- }
return 0;
}
/* Send the user maps we determined to the parent, so that it installs it in our user
* namespace UID map table */
- for (size_t i = 0; i < bind_user_context->n_data; i++) {
+ FOREACH_ARRAY(d, bind_user_context->data, bind_user_context->n_data) {
uid_t map[] = {
- bind_user_context->data[i].payload_user->uid,
- bind_user_context->data[i].host_user->uid,
- (uid_t) bind_user_context->data[i].payload_group->gid,
- (uid_t) bind_user_context->data[i].host_group->gid,
+ d->payload_user->uid,
+ d->host_user->uid,
+ (uid_t) d->payload_group->gid,
+ (uid_t) d->host_group->gid,
};
l = send(fd_outer_socket, map, sizeof(map), MSG_NOSIGNAL);