diff options
author | Nick Kralevich <nnk@google.com> | 2014-06-11 18:23:59 -0700 |
---|---|---|
committer | Nick Kralevich <nnk@google.com> | 2014-06-12 14:54:43 -0700 |
commit | 0db0f97d87bae8118e135d5a30edf7f0146098c0 (patch) | |
tree | b8671de6701d18ec5bd9b6440406f4c5ee754160 | |
parent | 18c9394ce1a4869eb5cf91eece02a4e944e2eebc (diff) | |
download | native-0db0f97d87bae8118e135d5a30edf7f0146098c0.tar.gz |
installd: change profile files to 0660
Profiling information leaks data about how people interact
with apps, so we don't want the data to be available
to other apps. Only the app and system_server need access.
Don't create the /data/dalvik-cache/profiles directory. init.rc
does it for us now.
Change-Id: Ic1b44009faa30d704855e97631006c4b990a4ad3
-rw-r--r-- | cmds/installd/utils.c | 35 |
1 files changed, 6 insertions, 29 deletions
diff --git a/cmds/installd/utils.c b/cmds/installd/utils.c index 420ad5ed3e..120fd62b09 100644 --- a/cmds/installd/utils.c +++ b/cmds/installd/utils.c @@ -1036,50 +1036,27 @@ int ensure_config_user_dirs(userid_t userid) { int create_profile_file(const char *pkgname, gid_t gid) { const char *profile_dir = DALVIK_CACHE_PREFIX "profiles"; - struct stat profileStat; char profile_file[PKG_PATH_MAX]; - // If we don't have a profile directory under dalvik-cache we need to create one. - if (stat(profile_dir, &profileStat) < 0) { - // Create the profile directory under dalvik-cache. - if (mkdir(profile_dir, 0711) < 0) { - ALOGE("cannot make profile dir '%s': %s\n", profile_dir, strerror(errno)); - return -1; - } - - // Make the profile directory write-only for group and other. Owner can rwx it. - if (chmod(profile_dir, 0711) < 0) { - ALOGE("cannot chown profile dir '%s': %s\n", profile_dir, strerror(errno)); - rmdir(profile_dir); - return -1; - } - - if (selinux_android_restorecon(profile_dir, 0) < 0) { - ALOGE("cannot restorecon profile dir '%s': %s\n", profile_dir, strerror(errno)); - rmdir(profile_dir); - return -1; - } - } - snprintf(profile_file, sizeof(profile_file), "%s/%s", profile_dir, pkgname); // The 'system' user needs to be able to read the profile to determine if dex2oat // needs to be run. This is done in dalvik.system.DexFile.isDexOptNeededInternal(). So - // we make it world readable. Not a problem since the dalvik cache is world - // readable anyway. + // we assign ownership to AID_SYSTEM and ensure it's not world-readable. - int fd = open(profile_file, O_WRONLY | O_CREAT | O_EXCL | O_NOFOLLOW, 0664); + int fd = open(profile_file, O_WRONLY | O_CREAT | O_NOFOLLOW | O_CLOEXEC, 0660); - // Open will fail if the file already exists. We want to ignore that. + // Always set the uid/gid/permissions. The file could have been previously created + // with different permissions. if (fd >= 0) { - if (fchown(fd, -1, gid) < 0) { + if (fchown(fd, AID_SYSTEM, gid) < 0) { ALOGE("cannot chown profile file '%s': %s\n", profile_file, strerror(errno)); close(fd); unlink(profile_file); return -1; } - if (fchmod(fd, 0664) < 0) { + if (fchmod(fd, 0660) < 0) { ALOGE("cannot chmod profile file '%s': %s\n", profile_file, strerror(errno)); close(fd); unlink(profile_file); |