summaryrefslogtreecommitdiffstats
path: root/init
diff options
context:
space:
mode:
authorColin Cross <ccross@android.com>2014-06-21 00:28:53 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2014-06-21 00:28:53 +0000
commitc7ee12d7ed313920523c01d74a9adeddc22f5a90 (patch)
treefc12866d7d49f21a61f50c13ca1e5a0d168a93ee /init
parent91cdb4cb9496f370d070c00698936af623458c4c (diff)
parent105ecf71c2a7f683d34995dc290a4bf50413cf15 (diff)
downloadsystem_core-c7ee12d7ed313920523c01d74a9adeddc22f5a90.zip
system_core-c7ee12d7ed313920523c01d74a9adeddc22f5a90.tar.gz
system_core-c7ee12d7ed313920523c01d74a9adeddc22f5a90.tar.bz2
am 105ecf71: am 72d9c0b1: am 56b1d74e: Merge "init/ueventd: adds wildcard matching for ueventd rules"
* commit '105ecf71c2a7f683d34995dc290a4bf50413cf15': init/ueventd: adds wildcard matching for ueventd rules
Diffstat (limited to 'init')
-rw-r--r--init/devices.c12
-rw-r--r--init/devices.h3
-rw-r--r--init/ueventd.c9
3 files changed, 20 insertions, 4 deletions
diff --git a/init/devices.c b/init/devices.c
index 02698ef..ea9a4b2 100644
--- a/init/devices.c
+++ b/init/devices.c
@@ -15,6 +15,7 @@
*/
#include <errno.h>
+#include <fnmatch.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
@@ -77,6 +78,7 @@ struct perms_ {
unsigned int uid;
unsigned int gid;
unsigned short prefix;
+ unsigned short wildcard;
};
struct perm_node {
@@ -97,7 +99,8 @@ static list_declare(platform_names);
int add_dev_perms(const char *name, const char *attr,
mode_t perm, unsigned int uid, unsigned int gid,
- unsigned short prefix) {
+ unsigned short prefix,
+ unsigned short wildcard) {
struct perm_node *node = calloc(1, sizeof(*node));
if (!node)
return -ENOMEM;
@@ -116,6 +119,7 @@ int add_dev_perms(const char *name, const char *attr,
node->dp.uid = uid;
node->dp.gid = gid;
node->dp.prefix = prefix;
+ node->dp.wildcard = wildcard;
if (attr)
list_add_tail(&sys_perms, &node->plist);
@@ -140,6 +144,9 @@ void fixup_sys_perms(const char *upath)
if (dp->prefix) {
if (strncmp(upath, dp->name + 4, strlen(dp->name + 4)))
continue;
+ } else if (dp->wildcard) {
+ if (fnmatch(dp->name + 4, upath, FNM_PATHNAME) != 0)
+ continue;
} else {
if (strcmp(upath, dp->name + 4))
continue;
@@ -180,6 +187,9 @@ static mode_t get_device_perm(const char *path, unsigned *uid, unsigned *gid)
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;
} else {
if (strcmp(path, dp->name))
continue;
diff --git a/init/devices.h b/init/devices.h
index a84fa58..5d0fe88 100644
--- a/init/devices.h
+++ b/init/devices.h
@@ -23,6 +23,7 @@ extern void handle_device_fd();
extern void device_init(void);
extern int add_dev_perms(const char *name, const char *attr,
mode_t perm, unsigned int uid,
- unsigned int gid, unsigned short prefix);
+ unsigned int gid, unsigned short prefix,
+ unsigned short wildcard);
int get_device_fd();
#endif /* _INIT_DEVICES_H */
diff --git a/init/ueventd.c b/init/ueventd.c
index 662196d..4ad0cb9 100644
--- a/init/ueventd.c
+++ b/init/ueventd.c
@@ -122,6 +122,7 @@ void set_device_permission(int nargs, char **args)
uid_t uid;
gid_t gid;
int prefix = 0;
+ int wildcard = 0;
char *endptr;
int ret;
char *tmp = 0;
@@ -154,9 +155,13 @@ void set_device_permission(int nargs, char **args)
name = tmp;
} else {
int len = strlen(name);
- if (name[len - 1] == '*') {
+ char *wildcard_chr = strchr(name, '*');
+ if ((name[len - 1] == '*') &&
+ (wildcard_chr == (name + len - 1))) {
prefix = 1;
name[len - 1] = '\0';
+ } else if (wildcard_chr) {
+ wildcard = 1;
}
}
@@ -183,6 +188,6 @@ void set_device_permission(int nargs, char **args)
}
gid = ret;
- add_dev_perms(name, attr, perm, uid, gid, prefix);
+ add_dev_perms(name, attr, perm, uid, gid, prefix, wildcard);
free(tmp);
}