mirror of
https://github.com/systemd/systemd
synced 2024-10-02 22:37:25 +00:00
tmpfiles: remove one more use of goto and modernization
This commit is contained in:
parent
da920fe176
commit
83a5db202d
|
@ -1258,96 +1258,78 @@ static int parse_acls_from_arg(Item *item) {
|
|||
#if HAVE_ACL
|
||||
static int parse_acl_cond_exec(
|
||||
const char *path,
|
||||
acl_t access, /* could be empty (NULL) */
|
||||
acl_t cond_exec,
|
||||
const struct stat *st,
|
||||
acl_t cond_exec,
|
||||
acl_t access, /* could be empty (NULL) */
|
||||
bool append,
|
||||
acl_t *ret) {
|
||||
|
||||
_cleanup_(acl_freep) acl_t parsed = NULL;
|
||||
acl_entry_t entry;
|
||||
acl_permset_t permset;
|
||||
bool has_exec;
|
||||
int r;
|
||||
|
||||
assert(path);
|
||||
assert(ret);
|
||||
assert(st);
|
||||
assert(cond_exec);
|
||||
assert(ret);
|
||||
|
||||
parsed = access ? acl_dup(access) : acl_init(0);
|
||||
if (!S_ISDIR(st->st_mode)) {
|
||||
has_exec = st->st_mode & S_IXUSR;
|
||||
|
||||
if (!has_exec && append) {
|
||||
_cleanup_(acl_freep) acl_t old = NULL;
|
||||
|
||||
old = acl_get_file(path, ACL_TYPE_ACCESS);
|
||||
if (!old)
|
||||
return -errno;
|
||||
|
||||
for (r = acl_get_entry(old, ACL_FIRST_ENTRY, &entry);
|
||||
r > 0;
|
||||
r = acl_get_entry(old, ACL_NEXT_ENTRY, &entry)) {
|
||||
|
||||
if (acl_get_permset(entry, &permset) < 0)
|
||||
return -errno;
|
||||
|
||||
r = acl_get_perm(permset, ACL_EXECUTE);
|
||||
if (r < 0)
|
||||
return -errno;
|
||||
if (r > 0) {
|
||||
has_exec = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (r < 0)
|
||||
return -errno;
|
||||
}
|
||||
|
||||
/* Check if we're about to set the execute bit in acl_access */
|
||||
if (!has_exec && access) {
|
||||
for (r = acl_get_entry(access, ACL_FIRST_ENTRY, &entry);
|
||||
r > 0;
|
||||
r = acl_get_entry(access, ACL_NEXT_ENTRY, &entry)) {
|
||||
|
||||
if (acl_get_permset(entry, &permset) < 0)
|
||||
return -errno;
|
||||
|
||||
r = acl_get_perm(permset, ACL_EXECUTE);
|
||||
if (r < 0)
|
||||
return -errno;
|
||||
if (r > 0) {
|
||||
has_exec = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (r < 0)
|
||||
return -errno;
|
||||
}
|
||||
} else
|
||||
has_exec = true;
|
||||
|
||||
_cleanup_(acl_freep) acl_t parsed = access ? acl_dup(access) : acl_init(0);
|
||||
if (!parsed)
|
||||
return -errno;
|
||||
|
||||
/* Since we substitute 'X' with 'x' in parse_acl(), we just need to copy the entries over
|
||||
* for directories */
|
||||
if (S_ISDIR(st->st_mode)) {
|
||||
for (r = acl_get_entry(cond_exec, ACL_FIRST_ENTRY, &entry);
|
||||
r > 0;
|
||||
r = acl_get_entry(cond_exec, ACL_NEXT_ENTRY, &entry)) {
|
||||
|
||||
acl_entry_t parsed_entry;
|
||||
|
||||
if (acl_create_entry(&parsed, &parsed_entry) < 0)
|
||||
return -errno;
|
||||
|
||||
if (acl_copy_entry(parsed_entry, entry) < 0)
|
||||
return -errno;
|
||||
}
|
||||
if (r < 0)
|
||||
return -errno;
|
||||
|
||||
goto finish;
|
||||
}
|
||||
|
||||
has_exec = st->st_mode & S_IXUSR;
|
||||
|
||||
if (!has_exec && append) {
|
||||
_cleanup_(acl_freep) acl_t old = NULL;
|
||||
|
||||
old = acl_get_file(path, ACL_TYPE_ACCESS);
|
||||
if (!old)
|
||||
return -errno;
|
||||
|
||||
for (r = acl_get_entry(old, ACL_FIRST_ENTRY, &entry);
|
||||
r > 0;
|
||||
r = acl_get_entry(old, ACL_NEXT_ENTRY, &entry)) {
|
||||
|
||||
if (acl_get_permset(entry, &permset) < 0)
|
||||
return -errno;
|
||||
|
||||
r = acl_get_perm(permset, ACL_EXECUTE);
|
||||
if (r < 0)
|
||||
return -errno;
|
||||
if (r > 0) {
|
||||
has_exec = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (r < 0)
|
||||
return -errno;
|
||||
}
|
||||
|
||||
/* Check if we're about to set the execute bit in acl_access */
|
||||
if (!has_exec && access) {
|
||||
for (r = acl_get_entry(access, ACL_FIRST_ENTRY, &entry);
|
||||
r > 0;
|
||||
r = acl_get_entry(access, ACL_NEXT_ENTRY, &entry)) {
|
||||
|
||||
if (acl_get_permset(entry, &permset) < 0)
|
||||
return -errno;
|
||||
|
||||
r = acl_get_perm(permset, ACL_EXECUTE);
|
||||
if (r < 0)
|
||||
return -errno;
|
||||
if (r > 0) {
|
||||
has_exec = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (r < 0)
|
||||
return -errno;
|
||||
}
|
||||
|
||||
for (r = acl_get_entry(cond_exec, ACL_FIRST_ENTRY, &entry);
|
||||
r > 0;
|
||||
r = acl_get_entry(cond_exec, ACL_NEXT_ENTRY, &entry)) {
|
||||
|
@ -1360,6 +1342,7 @@ static int parse_acl_cond_exec(
|
|||
if (acl_copy_entry(parsed_entry, entry) < 0)
|
||||
return -errno;
|
||||
|
||||
/* We substituted 'X' with 'x' in parse_acl(), so drop execute bit here if not applicable. */
|
||||
if (!has_exec) {
|
||||
if (acl_get_permset(parsed_entry, &permset) < 0)
|
||||
return -errno;
|
||||
|
@ -1371,7 +1354,6 @@ static int parse_acl_cond_exec(
|
|||
if (r < 0)
|
||||
return -errno;
|
||||
|
||||
finish:
|
||||
if (!append) { /* want_mask = true */
|
||||
r = calc_acl_mask_if_needed(&parsed);
|
||||
if (r < 0)
|
||||
|
@ -1476,10 +1458,9 @@ static int fd_set_acls(
|
|||
}
|
||||
|
||||
if (item->acl_access_exec) {
|
||||
r = parse_acl_cond_exec(FORMAT_PROC_FD_PATH(fd),
|
||||
item->acl_access,
|
||||
r = parse_acl_cond_exec(FORMAT_PROC_FD_PATH(fd), st,
|
||||
item->acl_access_exec,
|
||||
st,
|
||||
item->acl_access,
|
||||
item->append_or_force,
|
||||
&access_with_exec_parsed);
|
||||
if (r < 0)
|
||||
|
|
Loading…
Reference in a new issue