diff options
author | Jean-Baptiste Queru <jbq@google.com> | 2012-08-08 14:04:22 -0700 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2012-08-08 14:04:22 -0700 |
commit | faad67fac68642ca039fe5c29099acebf546f5ee (patch) | |
tree | 33a596cd3e3a8a7aed7cab8d1162299a672b3472 /init/util.c | |
parent | b9994d22274d95a2234cbd8be8338d5e0c16a290 (diff) | |
parent | ef3f7fa32b451bd6f180c4c1586a98cee41aa296 (diff) | |
download | system_core-faad67fac68642ca039fe5c29099acebf546f5ee.zip system_core-faad67fac68642ca039fe5c29099acebf546f5ee.tar.gz system_core-faad67fac68642ca039fe5c29099acebf546f5ee.tar.bz2 |
am ef3f7fa3: Merge "Set the SELinux security label on new directories."
* commit 'ef3f7fa32b451bd6f180c4c1586a98cee41aa296':
Set the SELinux security label on new directories.
Diffstat (limited to 'init/util.c')
-rwxr-xr-x | init/util.c | 53 |
1 files changed, 51 insertions, 2 deletions
diff --git a/init/util.c b/init/util.c index 7d79f39..f994ab9 100755 --- a/init/util.c +++ b/init/util.c @@ -302,12 +302,12 @@ int mkdir_recursive(const char *pathname, mode_t mode) memcpy(buf, pathname, width); buf[width] = 0; if (stat(buf, &info) != 0) { - ret = mkdir(buf, mode); + ret = make_dir(buf, mode); if (ret && errno != EEXIST) return ret; } } - ret = mkdir(pathname, mode); + ret = make_dir(pathname, mode); if (ret && errno != EEXIST) return ret; return 0; @@ -463,3 +463,52 @@ void import_kernel_cmdline(int in_qemu, ptr = x; } } + +int make_dir(const char *path, mode_t mode) +{ + int rc; + +#ifdef HAVE_SELINUX + char *secontext = NULL; + + if (sehandle) { + selabel_lookup(sehandle, &secontext, path, mode); + setfscreatecon(secontext); + } +#endif + + rc = mkdir(path, mode); + +#ifdef HAVE_SELINUX + if (secontext) { + int save_errno = errno; + freecon(secontext); + setfscreatecon(NULL); + errno = save_errno; + } +#endif + return rc; +} + +int restorecon(const char *pathname) +{ +#ifdef HAVE_SELINUX + char *secontext = NULL; + struct stat sb; + 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) + return -errno; + if (lsetfilecon(pathname, secontext) < 0) { + freecon(secontext); + return -errno; + } + freecon(secontext); +#endif + return 0; +} |