From bd2ecd8e6dbcc03c7664a3f07d3297509fc0b162 Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Mon, 17 Apr 2017 14:45:16 -0600 Subject: [PATCH] Allocate a GID range for external cache files. We can't reuse the GID range for internal cache files, otherwise we don't have a way to tease apart the difference when deciding if it's safe to move apps. Test: builds, boots Bug: 37193650 Change-Id: I22c4e575cd557636e74c5c73035adb1d4dcbb7f7 --- libcutils/include/cutils/multiuser.h | 1 + libcutils/include/private/android_filesystem_config.h | 3 +++ libcutils/multiuser.c | 8 ++++++++ libcutils/tests/multiuser_test.cpp | 8 ++++++++ 4 files changed, 20 insertions(+) diff --git a/libcutils/include/cutils/multiuser.h b/libcutils/include/cutils/multiuser.h index 5bd9c7b82..9a2305c98 100644 --- a/libcutils/include/cutils/multiuser.h +++ b/libcutils/include/cutils/multiuser.h @@ -33,6 +33,7 @@ extern uid_t multiuser_get_uid(userid_t user_id, appid_t app_id); extern gid_t multiuser_get_cache_gid(userid_t user_id, appid_t app_id); extern gid_t multiuser_get_ext_gid(userid_t user_id, appid_t app_id); +extern gid_t multiuser_get_ext_cache_gid(userid_t user_id, appid_t app_id); extern gid_t multiuser_get_shared_gid(userid_t user_id, appid_t app_id); /* TODO: switch callers over to multiuser_get_shared_gid() */ diff --git a/libcutils/include/private/android_filesystem_config.h b/libcutils/include/private/android_filesystem_config.h index 0037f1519..bbba8536e 100644 --- a/libcutils/include/private/android_filesystem_config.h +++ b/libcutils/include/private/android_filesystem_config.h @@ -171,6 +171,9 @@ #define AID_EXT_GID_START 30000 /* start of gids for apps to mark external data */ #define AID_EXT_GID_END 39999 /* end of gids for apps to mark external data */ +#define AID_EXT_CACHE_GID_START 40000 /* start of gids for apps to mark external cached data */ +#define AID_EXT_CACHE_GID_END 49999 /* end of gids for apps to mark external cached data */ + #define AID_SHARED_GID_START 50000 /* start of gids for apps in each user to share */ #define AID_SHARED_GID_END 59999 /* end of gids for apps in each user to share */ diff --git a/libcutils/multiuser.c b/libcutils/multiuser.c index 08d4d6c2e..61403f4f1 100644 --- a/libcutils/multiuser.c +++ b/libcutils/multiuser.c @@ -45,6 +45,14 @@ gid_t multiuser_get_ext_gid(userid_t user_id, appid_t app_id) { } } +gid_t multiuser_get_ext_cache_gid(userid_t user_id, appid_t app_id) { + if (app_id >= AID_APP_START && app_id <= AID_APP_END) { + return multiuser_get_uid(user_id, (app_id - AID_APP_START) + AID_EXT_CACHE_GID_START); + } else { + return -1; + } +} + gid_t multiuser_get_shared_gid(userid_t user_id, appid_t app_id) { if (app_id >= AID_APP_START && app_id <= AID_APP_END) { return multiuser_get_uid(user_id, (app_id - AID_APP_START) + AID_SHARED_GID_START); diff --git a/libcutils/tests/multiuser_test.cpp b/libcutils/tests/multiuser_test.cpp index ae5c4169c..2f9d854b3 100644 --- a/libcutils/tests/multiuser_test.cpp +++ b/libcutils/tests/multiuser_test.cpp @@ -68,6 +68,14 @@ TEST(MultiuserTest, TestExt) { EXPECT_EQ(1030000U, multiuser_get_ext_gid(10, 10000)); } +TEST(MultiuserTest, TestExtCache) { + EXPECT_EQ(ERR_GID, multiuser_get_ext_cache_gid(0, 0)); + EXPECT_EQ(ERR_GID, multiuser_get_ext_cache_gid(0, 1000)); + EXPECT_EQ(40000U, multiuser_get_ext_cache_gid(0, 10000)); + EXPECT_EQ(ERR_GID, multiuser_get_ext_cache_gid(0, 50000)); + EXPECT_EQ(1040000U, multiuser_get_ext_cache_gid(10, 10000)); +} + TEST(MultiuserTest, TestShared) { EXPECT_EQ(ERR_GID, multiuser_get_shared_gid(0, 0)); EXPECT_EQ(ERR_GID, multiuser_get_shared_gid(0, 1000));