Merge "init: rework fixup_sys_perms to use perm_path_matches" am: 0504a94cd9
am: e7028e3d38
* commit 'e7028e3d382ee4099cfc4c1cbfa650fd2f820410':
init: rework fixup_sys_perms to use perm_path_matches
Change-Id: Iaebea1a143b053ee1c41c47cb5eb2329f992330f
This commit is contained in:
commit
7aef62751b
|
@ -130,49 +130,6 @@ int add_dev_perms(const char *name, const char *attr,
|
|||
return 0;
|
||||
}
|
||||
|
||||
void fixup_sys_perms(const char *upath)
|
||||
{
|
||||
char buf[512];
|
||||
struct listnode *node;
|
||||
struct perms_ *dp;
|
||||
|
||||
/* upaths omit the "/sys" that paths in this list
|
||||
* contain, so we add 4 when comparing...
|
||||
*/
|
||||
list_for_each(node, &sys_perms) {
|
||||
dp = &(node_to_item(node, struct perm_node, plist))->dp;
|
||||
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;
|
||||
}
|
||||
|
||||
if ((strlen(upath) + strlen(dp->attr) + 6) > sizeof(buf))
|
||||
break;
|
||||
|
||||
snprintf(buf, sizeof(buf), "/sys%s/%s", upath, dp->attr);
|
||||
INFO("fixup %s %d %d 0%o\n", buf, dp->uid, dp->gid, dp->perm);
|
||||
chown(buf, dp->uid, dp->gid);
|
||||
chmod(buf, dp->perm);
|
||||
}
|
||||
|
||||
// Now fixup SELinux file labels
|
||||
int len = snprintf(buf, sizeof(buf), "/sys%s", upath);
|
||||
if ((len < 0) || ((size_t) len >= sizeof(buf))) {
|
||||
// Overflow
|
||||
return;
|
||||
}
|
||||
if (access(buf, F_OK) == 0) {
|
||||
INFO("restorecon_recursive: %s\n", buf);
|
||||
restorecon_recursive(buf);
|
||||
}
|
||||
}
|
||||
|
||||
static bool perm_path_matches(const char *path, struct perms_ *dp)
|
||||
{
|
||||
if (dp->prefix) {
|
||||
|
@ -189,6 +146,36 @@ static bool perm_path_matches(const char *path, struct perms_ *dp)
|
|||
return false;
|
||||
}
|
||||
|
||||
void fixup_sys_perms(const char *upath)
|
||||
{
|
||||
struct listnode *node;
|
||||
|
||||
/* upaths omit the "/sys" that paths in this list
|
||||
* contain, so we prepend it...
|
||||
*/
|
||||
std::string path = SYSFS_PREFIX;
|
||||
path += upath;
|
||||
|
||||
list_for_each(node, &sys_perms) {
|
||||
perms_ *dp;
|
||||
|
||||
dp = &(node_to_item(node, struct perm_node, plist))->dp;
|
||||
if (!perm_path_matches(path.c_str(), dp)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
std::string attr_file = path + "/" + dp->attr;
|
||||
INFO("fixup %s %d %d 0%o\n", attr_file.c_str(), dp->uid, dp->gid, dp->perm);
|
||||
chown(attr_file.c_str(), dp->uid, dp->gid);
|
||||
chmod(attr_file.c_str(), dp->perm);
|
||||
}
|
||||
|
||||
if (access(path.c_str(), F_OK) == 0) {
|
||||
INFO("restorecon_recursive: %s\n", path.c_str());
|
||||
restorecon_recursive(path.c_str());
|
||||
}
|
||||
}
|
||||
|
||||
static mode_t get_device_perm(const char *path, const char **links,
|
||||
unsigned *uid, unsigned *gid)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue