chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
cgroup: never migrate kernel threads out of the root cgroup
[elogind.git]
/
src
/
shared
/
acl-util.c
diff --git
a/src/shared/acl-util.c
b/src/shared/acl-util.c
index 36dc824128b3b4275da94c9bbcd2683df64f119e..ad0e481b9fcd82c7f3a1f510e880b0586383195d 100644
(file)
--- a/
src/shared/acl-util.c
+++ b/
src/shared/acl-util.c
@@
-81,19
+81,22
@@
int calc_acl_mask_if_needed(acl_t *acl_p) {
if (tag == ACL_MASK)
return 0;
if (tag == ACL_MASK)
return 0;
- if (IN_SET(tag, ACL_USER, ACL_GROUP))
- goto calc;
+
+ if (IN_SET(tag, ACL_USER, ACL_GROUP)) {
+ if (acl_calc_mask(acl_p) < 0)
+ return -errno;
+
+ return 1;
+ }
}
if (r < 0)
return -errno;
}
if (r < 0)
return -errno;
- return 0;
-calc:
- if (acl_calc_mask(acl_p) < 0)
- return -errno;
- return 1;
+ return 0;
}
}
+/// UNNEEDED by elogind
+#if 0
int add_base_acls_if_needed(acl_t *acl_p, const char *path) {
acl_entry_t i;
int r;
int add_base_acls_if_needed(acl_t *acl_p, const char *path) {
acl_entry_t i;
int r;
@@
-158,62
+161,71
@@
int add_base_acls_if_needed(acl_t *acl_p, const char *path) {
return 0;
}
return 0;
}
-int search_acl_groups(char*** dst, const char* path, bool* belong) {
- acl_t acl;
+int acl_search_groups(const char *path, char ***ret_groups) {
+ _cleanup_strv_free_ char **g = NULL;
+ _cleanup_(acl_free) acl_t acl = NULL;
+ bool ret = false;
+ acl_entry_t entry;
+ int r;
assert(path);
assert(path);
- assert(belong);
acl = acl_get_file(path, ACL_TYPE_DEFAULT);
acl = acl_get_file(path, ACL_TYPE_DEFAULT);
- if (acl) {
- acl_entry_t entry;
- int r;
-
- r = acl_get_entry(acl, ACL_FIRST_ENTRY, &entry);
- while (r > 0) {
- acl_tag_t tag;
- gid_t *gid;
- char *name;
+ if (!acl)
+ return -errno;
- r = acl_get_tag_type(entry, &tag);
- if (r < 0)
- break;
+ r = acl_get_entry(acl, ACL_FIRST_ENTRY, &entry);
+ for (;;) {
+ _cleanup_(acl_free_gid_tpp) gid_t *gid = NULL;
+ acl_tag_t tag;
+
+ if (r < 0)
+ return -errno;
+ if (r == 0)
+ break;
+
+ if (acl_get_tag_type(entry, &tag) < 0)
+ return -errno;
-
if (tag != ACL_GROUP)
-
goto next;
+ if (tag != ACL_GROUP)
+ goto next;
-
gid = acl_get_qualifier(entry);
-
if (!gid)
-
break
;
+ gid = acl_get_qualifier(entry);
+ if (!gid)
+
return -errno
;
- if (in_gid(*gid) > 0) {
- *belong = true;
- break;
- }
+ if (in_gid(*gid) > 0) {
+ if (!ret_groups)
+ return true;
+
+ ret = true;
+ }
+
+ if (ret_groups) {
+ char *name;
name = gid_to_name(*gid);
name = gid_to_name(*gid);
- if (!name) {
- acl_free(acl);
- return log_oom();
- }
-
- r = strv_consume(dst, name);
- if (r < 0) {
- acl_free(acl);
- return log_oom();
- }
-
- next:
- r = acl_get_entry(acl, ACL_NEXT_ENTRY, &entry);
+ if (!name)
+ return -ENOMEM;
+
+ r = strv_consume(&g, name);
+ if (r < 0)
+ return r;
}
}
- acl_free(acl);
+ next:
+ r = acl_get_entry(acl, ACL_NEXT_ENTRY, &entry);
}
}
- return 0;
+ if (ret_groups) {
+ *ret_groups = g;
+ g = NULL;
+ }
+
+ return ret;
}
}
-int parse_acl(char *text, acl_t *acl_access, acl_t *acl_default, bool want_mask) {
+int parse_acl(c
onst c
har *text, acl_t *acl_access, acl_t *acl_default, bool want_mask) {
_cleanup_free_ char **a = NULL, **d = NULL; /* strings are not be freed */
_cleanup_strv_free_ char **split;
char **entry;
_cleanup_free_ char **a = NULL, **d = NULL; /* strings are not be freed */
_cleanup_strv_free_ char **split;
char **entry;
@@
-222,7
+234,7
@@
int parse_acl(char *text, acl_t *acl_access, acl_t *acl_default, bool want_mask)
split = strv_split(text, ",");
if (!split)
split = strv_split(text, ",");
if (!split)
- return
log_oom()
;
+ return
-ENOMEM
;
STRV_FOREACH(entry, split) {
char *p;
STRV_FOREACH(entry, split) {
char *p;
@@
-235,9
+247,9
@@
int parse_acl(char *text, acl_t *acl_access, acl_t *acl_default, bool want_mask)
r = strv_push(&d, p);
else
r = strv_push(&a, *entry);
r = strv_push(&d, p);
else
r = strv_push(&a, *entry);
+ if (r < 0)
+ return r;
}
}
- if (r < 0)
- return r;
if (!strv_isempty(a)) {
_cleanup_free_ char *join;
if (!strv_isempty(a)) {
_cleanup_free_ char *join;
@@
-248,7
+260,7
@@
int parse_acl(char *text, acl_t *acl_access, acl_t *acl_default, bool want_mask)
a_acl = acl_from_text(join);
if (!a_acl)
a_acl = acl_from_text(join);
if (!a_acl)
- return -
EINVAL
;
+ return -
errno
;
if (want_mask) {
r = calc_acl_mask_if_needed(&a_acl);
if (want_mask) {
r = calc_acl_mask_if_needed(&a_acl);
@@
-266,7
+278,7
@@
int parse_acl(char *text, acl_t *acl_access, acl_t *acl_default, bool want_mask)
d_acl = acl_from_text(join);
if (!d_acl)
d_acl = acl_from_text(join);
if (!d_acl)
- return -
EINVAL
;
+ return -
errno
;
if (want_mask) {
r = calc_acl_mask_if_needed(&d_acl);
if (want_mask) {
r = calc_acl_mask_if_needed(&d_acl);
@@
-278,6
+290,7
@@
int parse_acl(char *text, acl_t *acl_access, acl_t *acl_default, bool want_mask)
*acl_access = a_acl;
*acl_default = d_acl;
a_acl = d_acl = NULL;
*acl_access = a_acl;
*acl_default = d_acl;
a_acl = d_acl = NULL;
+
return 0;
}
return 0;
}
@@
-301,7
+314,7
@@
static int acl_entry_equal(acl_entry_t a, acl_entry_t b) {
/* can have only one of those */
return true;
case ACL_USER: {
/* can have only one of those */
return true;
case ACL_USER: {
- _cleanup_(acl_free_uid_tpp) uid_t *uid_a
, *uid_b
;
+ _cleanup_(acl_free_uid_tpp) uid_t *uid_a
= NULL, *uid_b = NULL
;
uid_a = acl_get_qualifier(a);
if (!uid_a)
uid_a = acl_get_qualifier(a);
if (!uid_a)
@@
-314,7
+327,7
@@
static int acl_entry_equal(acl_entry_t a, acl_entry_t b) {
return *uid_a == *uid_b;
}
case ACL_GROUP: {
return *uid_a == *uid_b;
}
case ACL_GROUP: {
- _cleanup_(acl_free_gid_tpp) gid_t *gid_a
, *gid_b
;
+ _cleanup_(acl_free_gid_tpp) gid_t *gid_a
= NULL, *gid_b = NULL
;
gid_a = acl_get_qualifier(a);
if (!gid_a)
gid_a = acl_get_qualifier(a);
if (!gid_a)
@@
-384,3
+397,4
@@
int acls_for_file(const char *path, acl_type_t type, acl_t new, acl_t *acl) {
old = NULL;
return 0;
}
old = NULL;
return 0;
}
+#endif // 0