summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorColin Cross <ccross@android.com>2014-07-02 21:03:42 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2014-07-02 21:03:42 +0000
commitab7e5752b0f02d8a5b6d70b94c41eed9f4068005 (patch)
tree763ce9ceb0bde53c0575b3a3d8ec38affb12b228
parent3dbd7e10688e29022db7dd0778ec8078c2a7a545 (diff)
parent09117c70f1cc0de77c62d6f7f5bee04e3fc7ef83 (diff)
downloadsystem_core-ab7e5752b0f02d8a5b6d70b94c41eed9f4068005.zip
system_core-ab7e5752b0f02d8a5b6d70b94c41eed9f4068005.tar.gz
system_core-ab7e5752b0f02d8a5b6d70b94c41eed9f4068005.tar.bz2
am 09117c70: Merge "ueventd: allow matching symlink names when setting permissions"
* commit '09117c70f1cc0de77c62d6f7f5bee04e3fc7ef83': ueventd: allow matching symlink names when setting permissions
-rw-r--r--init/devices.c51
1 files changed, 38 insertions, 13 deletions
diff --git a/init/devices.c b/init/devices.c
index ea9a4b2..58b2704 100644
--- a/init/devices.c
+++ b/init/devices.c
@@ -170,7 +170,24 @@ void fixup_sys_perms(const char *upath)
}
}
-static mode_t get_device_perm(const char *path, unsigned *uid, unsigned *gid)
+static bool perm_path_matches(const char *path, struct perms_ *dp)
+{
+ if (dp->prefix) {
+ if (strncmp(path, dp->name, strlen(dp->name)) == 0)
+ return true;
+ } else if (dp->wildcard) {
+ if (fnmatch(dp->name, path, FNM_PATHNAME) == 0)
+ return true;
+ } else {
+ if (strcmp(path, dp->name) == 0)
+ return true;
+ }
+
+ return false;
+}
+
+static mode_t get_device_perm(const char *path, const char **links,
+ unsigned *uid, unsigned *gid)
{
mode_t perm;
struct listnode *node;
@@ -181,22 +198,30 @@ static mode_t get_device_perm(const char *path, unsigned *uid, unsigned *gid)
* override ueventd.rc
*/
list_for_each_reverse(node, &dev_perms) {
+ bool match = false;
+
perm_node = node_to_item(node, struct perm_node, plist);
dp = &perm_node->dp;
- if (dp->prefix) {
- if (strncmp(path, dp->name, strlen(dp->name)))
- continue;
- } else if (dp->wildcard) {
- if (fnmatch(dp->name, path, FNM_PATHNAME) != 0)
- continue;
+ if (perm_path_matches(path, dp)) {
+ match = true;
} else {
- if (strcmp(path, dp->name))
- continue;
+ if (links) {
+ int i;
+ for (i = 0; links[i]; i++) {
+ if (perm_path_matches(links[i], dp)) {
+ match = true;
+ break;
+ }
+ }
+ }
+ }
+
+ if (match) {
+ *uid = dp->uid;
+ *gid = dp->gid;
+ return dp->perm;
}
- *uid = dp->uid;
- *gid = dp->gid;
- return dp->perm;
}
/* Default if nothing found. */
*uid = 0;
@@ -215,7 +240,7 @@ static void make_device(const char *path,
dev_t dev;
char *secontext = NULL;
- mode = get_device_perm(path, &uid, &gid) | (block ? S_IFBLK : S_IFCHR);
+ mode = get_device_perm(path, links, &uid, &gid) | (block ? S_IFBLK : S_IFCHR);
if (sehandle) {
selabel_lookup_best_match(sehandle, &secontext, path, links, mode);