diff options
| author | Nick Kralevich <nnk@google.com> | 2014-01-14 00:37:28 +0000 |
|---|---|---|
| committer | Android Git Automerger <android-git-automerger@android.com> | 2014-01-14 00:37:28 +0000 |
| commit | da1f43f0753ef1d3f01e5eaf01280ef611f4abfb (patch) | |
| tree | 14aece86f0a09995099db55d6b162558e6631f58 | |
| parent | ccfa8988bbff5531c6d131ee25ae0881d6e05f2f (diff) | |
| parent | 5b5b1f9b48f966942be3cda8d4ecfb7d910f12a0 (diff) | |
| download | system_core-da1f43f0753ef1d3f01e5eaf01280ef611f4abfb.zip system_core-da1f43f0753ef1d3f01e5eaf01280ef611f4abfb.tar.gz system_core-da1f43f0753ef1d3f01e5eaf01280ef611f4abfb.tar.bz2 | |
am 5b5b1f9b: am d896c195: am 45f3ed05: am 105f6b66: Merge "restorecon_recursive("/sys") speed boot time"
* commit '5b5b1f9b48f966942be3cda8d4ecfb7d910f12a0':
restorecon_recursive("/sys") speed boot time
| -rw-r--r-- | init/util.c | 45 |
1 files changed, 34 insertions, 11 deletions
diff --git a/init/util.c b/init/util.c index 9aaa77d..5efd5be 100644 --- a/init/util.c +++ b/init/util.c @@ -524,31 +524,50 @@ int make_dir(const char *path, mode_t mode) return rc; } -int restorecon(const char *pathname) +static int restorecon_sb(const char *pathname, const struct stat *sb) { char *secontext = NULL; - struct stat sb; + char *oldsecontext = NULL; int i; - if (is_selinux_enabled() <= 0 || !sehandle) - return 0; - - if (lstat(pathname, &sb) < 0) - return -errno; - if (selabel_lookup(sehandle, &secontext, pathname, sb.st_mode) < 0) + if (selabel_lookup(sehandle, &secontext, pathname, sb->st_mode) < 0) return -errno; - if (lsetfilecon(pathname, secontext) < 0) { + + if (lgetfilecon(pathname, &oldsecontext) < 0) { freecon(secontext); return -errno; } + + if (strcmp(oldsecontext, secontext) != 0) { + if (lsetfilecon(pathname, secontext) < 0) { + freecon(oldsecontext); + freecon(secontext); + return -errno; + } + } + freecon(oldsecontext); freecon(secontext); return 0; } +int restorecon(const char *pathname) +{ + struct stat sb; + + if (is_selinux_enabled() <= 0 || !sehandle) + return 0; + + if (lstat(pathname, &sb) < 0) + return -errno; + + return restorecon_sb(pathname, &sb); +} + static int nftw_restorecon(const char* filename, const struct stat* statptr, - int fileflags, struct FTW* pftw) + int fileflags __attribute__((unused)), + struct FTW* pftw __attribute__((unused))) { - restorecon(filename); + restorecon_sb(filename, statptr); return 0; } @@ -556,5 +575,9 @@ int restorecon_recursive(const char* pathname) { int fd_limit = 20; int flags = FTW_DEPTH | FTW_MOUNT | FTW_PHYS; + + if (is_selinux_enabled() <= 0 || !sehandle) + return 0; + return nftw(pathname, nftw_restorecon, fd_limit, flags); } |
