summaryrefslogtreecommitdiffstats
path: root/cmds
diff options
context:
space:
mode:
authorNick Kralevich <nnk@google.com>2012-12-12 16:26:55 -0800
committerNick Kralevich <nnk@google.com>2012-12-14 11:53:14 -0800
commit7f5c84a0b25706746a92ad1233cbbb8923eda54d (patch)
tree424ba30ba9c63230c903eab815374cfb9bcdbeb3 /cmds
parent1aa652807b5135d7cf9c5f6eed2268c9aa4984e0 (diff)
downloadframeworks_native-7f5c84a0b25706746a92ad1233cbbb8923eda54d.zip
frameworks_native-7f5c84a0b25706746a92ad1233cbbb8923eda54d.tar.gz
frameworks_native-7f5c84a0b25706746a92ad1233cbbb8923eda54d.tar.bz2
App home directories are now 0700 for targetSdkVersion > 17
Have installd set an app's home directory permissions to 0700 if the app has targetSdkVersion > 17. Bug: 7208882 Change-Id: Iaa4fc42fec69bc1abdfae53704d6264dd6fa965f
Diffstat (limited to 'cmds')
-rw-r--r--cmds/installd/Android.mk5
-rw-r--r--cmds/installd/commands.c16
-rw-r--r--cmds/installd/installd.c16
-rw-r--r--cmds/installd/installd.h7
4 files changed, 29 insertions, 15 deletions
diff --git a/cmds/installd/Android.mk b/cmds/installd/Android.mk
index 1dd4ee5..6eecb20 100644
--- a/cmds/installd/Android.mk
+++ b/cmds/installd/Android.mk
@@ -11,9 +11,8 @@ include $(CLEAR_VARS)
LOCAL_SRC_FILES := \
$(common_src_files)
-
+LOCAL_CFLAGS := -std=gnu99
LOCAL_MODULE := libinstalld
-
LOCAL_MODULE_TAGS := eng tests
include $(BUILD_STATIC_LIBRARY)
@@ -36,7 +35,7 @@ LOCAL_STATIC_LIBRARIES := \
libdiskusage
LOCAL_MODULE := installd
-
+LOCAL_CFLAGS := -std=gnu99
LOCAL_MODULE_TAGS := optional
include $(BUILD_EXECUTABLE)
diff --git a/cmds/installd/commands.c b/cmds/installd/commands.c
index c272e47..e22fa6a 100644
--- a/cmds/installd/commands.c
+++ b/cmds/installd/commands.c
@@ -28,13 +28,15 @@ dir_rec_t android_app_lib_dir;
dir_rec_t android_media_dir;
dir_rec_array_t android_system_dirs;
-int install(const char *pkgname, uid_t uid, gid_t gid)
+int install(const char *pkgname, uid_t uid, gid_t gid, bool restrictHomeDir)
{
char pkgdir[PKG_PATH_MAX];
char libsymlink[PKG_PATH_MAX];
char applibdir[PKG_PATH_MAX];
struct stat libStat;
+ mode_t defaultMode = restrictHomeDir ? 0700 : 0751;
+
if ((uid < AID_SYSTEM) || (gid < AID_SYSTEM)) {
ALOGE("invalid uid/gid: %d %d\n", uid, gid);
return -1;
@@ -55,11 +57,11 @@ int install(const char *pkgname, uid_t uid, gid_t gid)
return -1;
}
- if (mkdir(pkgdir, 0751) < 0) {
+ if (mkdir(pkgdir, defaultMode) < 0) {
ALOGE("cannot create dir '%s': %s\n", pkgdir, strerror(errno));
return -1;
}
- if (chmod(pkgdir, 0751) < 0) {
+ if (chmod(pkgdir, defaultMode) < 0) {
ALOGE("cannot chmod dir '%s': %s\n", pkgdir, strerror(errno));
unlink(pkgdir);
return -1;
@@ -184,13 +186,15 @@ int delete_user_data(const char *pkgname, uid_t persona)
return delete_dir_contents(pkgdir, 0, "lib");
}
-int make_user_data(const char *pkgname, uid_t uid, uid_t persona)
+int make_user_data(const char *pkgname, uid_t uid, uid_t persona, bool restrictHomeDir)
{
char pkgdir[PKG_PATH_MAX];
char applibdir[PKG_PATH_MAX];
char libsymlink[PKG_PATH_MAX];
struct stat libStat;
+ mode_t defaultMode = restrictHomeDir ? 0700 : 0751;
+
// Create the data dir for the package
if (create_pkg_path(pkgdir, pkgname, PKG_DIR_POSTFIX, persona)) {
return -1;
@@ -204,11 +208,11 @@ int make_user_data(const char *pkgname, uid_t uid, uid_t persona)
return -1;
}
- if (mkdir(pkgdir, 0751) < 0) {
+ if (mkdir(pkgdir, defaultMode) < 0) {
ALOGE("cannot create dir '%s': %s\n", pkgdir, strerror(errno));
return -errno;
}
- if (chmod(pkgdir, 0751) < 0) {
+ if (chmod(pkgdir, defaultMode) < 0) {
ALOGE("cannot chmod dir '%s': %s\n", pkgdir, strerror(errno));
unlink(pkgdir);
return -errno;
diff --git a/cmds/installd/installd.c b/cmds/installd/installd.c
index 2285e79..bf21102 100644
--- a/cmds/installd/installd.c
+++ b/cmds/installd/installd.c
@@ -31,7 +31,11 @@ static int do_ping(char **arg, char reply[REPLY_MAX])
static int do_install(char **arg, char reply[REPLY_MAX])
{
- return install(arg[0], atoi(arg[1]), atoi(arg[2])); /* pkgname, uid, gid */
+ bool restrictHomeDir = (strncmp(arg[3], "false", 6) != 0);
+ return install(arg[0], /* pkgname */
+ atoi(arg[1]), /* uid */
+ atoi(arg[2]), /* gid */
+ restrictHomeDir); /* restrictHomeDir */
}
static int do_dexopt(char **arg, char reply[REPLY_MAX])
@@ -103,7 +107,11 @@ static int do_rm_user_data(char **arg, char reply[REPLY_MAX])
static int do_mk_user_data(char **arg, char reply[REPLY_MAX])
{
- return make_user_data(arg[0], atoi(arg[1]), atoi(arg[2])); /* pkgname, uid, userid */
+ bool restrictHomeDir = (strncmp(arg[3], "false", 6) != 0);
+ return make_user_data(arg[0], /* pkgname */
+ atoi(arg[1]), /* uid */
+ atoi(arg[2]), /* userid */
+ restrictHomeDir); /* restrictHomeDir */
}
static int do_rm_user(char **arg, char reply[REPLY_MAX])
@@ -129,7 +137,7 @@ struct cmdinfo {
struct cmdinfo cmds[] = {
{ "ping", 0, do_ping },
- { "install", 3, do_install },
+ { "install", 4, do_install },
{ "dexopt", 3, do_dexopt },
{ "movedex", 2, do_move_dex },
{ "rmdex", 1, do_rm_dex },
@@ -142,7 +150,7 @@ struct cmdinfo cmds[] = {
{ "rmuserdata", 2, do_rm_user_data },
{ "movefiles", 0, do_movefiles },
{ "linklib", 3, do_linklib },
- { "mkuserdata", 3, do_mk_user_data },
+ { "mkuserdata", 4, do_mk_user_data },
{ "rmuser", 1, do_rm_user },
};
diff --git a/cmds/installd/installd.h b/cmds/installd/installd.h
index efd3aa7..cf2bed6 100644
--- a/cmds/installd/installd.h
+++ b/cmds/installd/installd.h
@@ -20,6 +20,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
+#include <stdbool.h>
#include <inttypes.h>
#include <sys/stat.h>
#include <dirent.h>
@@ -192,12 +193,14 @@ int ensure_media_user_dirs(userid_t userid);
/* commands.c */
-int install(const char *pkgname, uid_t uid, gid_t gid);
+int install(const char *pkgname, uid_t uid, gid_t gid,
+ bool restrictHomeDirectory);
int uninstall(const char *pkgname, uid_t persona);
int renamepkg(const char *oldpkgname, const char *newpkgname);
int fix_uid(const char *pkgname, uid_t uid, gid_t gid);
int delete_user_data(const char *pkgname, uid_t persona);
-int make_user_data(const char *pkgname, uid_t uid, uid_t persona);
+int make_user_data(const char *pkgname, uid_t uid, uid_t persona,
+ bool restrictHomeDirectory);
int delete_persona(uid_t persona);
int delete_cache(const char *pkgname, uid_t persona);
int move_dex(const char *src, const char *dst);