diff --git a/init/init.c b/init/init.c index d75adca5a..b7e34d04c 100644 --- a/init/init.c +++ b/init/init.c @@ -948,6 +948,7 @@ int main(int argc, char **argv) restorecon("/dev"); restorecon("/dev/socket"); restorecon("/dev/__properties__"); + restorecon_recursive("/sys"); is_charger = !strcmp(bootmode, "charger"); diff --git a/init/util.c b/init/util.c old mode 100755 new mode 100644 index 918bc057e..fffc8a478 --- a/init/util.c +++ b/init/util.c @@ -22,6 +22,7 @@ #include #include #include +#include #include @@ -499,3 +500,17 @@ int restorecon(const char *pathname) freecon(secontext); return 0; } + +static int nftw_restorecon(const char* filename, const struct stat* statptr, + int fileflags, struct FTW* pftw) +{ + restorecon(filename); + return 0; +} + +int restorecon_recursive(const char* pathname) +{ + int fd_limit = 20; + int flags = FTW_DEPTH | FTW_MOUNT | FTW_PHYS; + return nftw(pathname, nftw_restorecon, fd_limit, flags); +} diff --git a/init/util.h b/init/util.h index 45905b618..6bca4e689 100644 --- a/init/util.h +++ b/init/util.h @@ -41,4 +41,5 @@ void get_hardware_name(char *hardware, unsigned int *revision); void import_kernel_cmdline(int in_qemu, void (*import_kernel_nv)(char *name, int in_qemu)); int make_dir(const char *path, mode_t mode); int restorecon(const char *pathname); +int restorecon_recursive(const char *pathname); #endif