Loading cmds/installd/commands.c +8 −15 Original line number Diff line number Diff line Loading @@ -184,6 +184,7 @@ int free_cache(int64_t free_size) DIR *d; struct dirent *de; int64_t avail; char datadir[PKG_PATH_MAX]; avail = disk_free(); if (avail < 0) return -1; Loading @@ -191,9 +192,14 @@ int free_cache(int64_t free_size) LOGI("free_cache(%" PRId64 ") avail %" PRId64 "\n", free_size, avail); if (avail >= free_size) return 0; d = opendir(android_data_dir.path); if (create_persona_path(datadir, 0)) { LOGE("couldn't get directory for persona 0"); return -1; } d = opendir(datadir); if (d == NULL) { LOGE("cannot open %s: %s\n", android_data_dir.path, strerror(errno)); LOGE("cannot open %s: %s\n", datadir, strerror(errno)); return -1; } dfd = dirfd(d); Loading Loading @@ -578,19 +584,6 @@ fail: return -1; } int create_move_path(char path[PKG_PATH_MAX], const char* pkgname, const char* leaf, uid_t persona) { if ((android_data_dir.len + strlen(pkgname) + strlen(leaf) + 1) >= PKG_PATH_MAX) { return -1; } sprintf(path, "%s%s%s/%s", android_data_dir.path, PRIMARY_USER_PREFIX, pkgname, leaf); return 0; } void mkinnerdirs(char* path, int basepos, mode_t mode, int uid, int gid, struct stat* statbuf) { Loading cmds/installd/installd.h +5 −0 Original line number Diff line number Diff line Loading @@ -105,6 +105,11 @@ int create_pkg_path(char path[PKG_PATH_MAX], int create_persona_path(char path[PKG_PATH_MAX], uid_t persona); int create_move_path(char path[PKG_PATH_MAX], const char* pkgname, const char* leaf, uid_t persona); int is_valid_package_name(const char* pkgname); int create_cache_path(char path[PKG_PATH_MAX], const char *src); Loading cmds/installd/tests/installd_utils_test.cpp +55 −1 Original line number Diff line number Diff line Loading @@ -34,6 +34,16 @@ extern "C" { #define TEST_SYSTEM_DIR1 "/system/app/" #define TEST_SYSTEM_DIR2 "/vendor/app/" #define REALLY_LONG_APP_NAME "com.example." \ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa." \ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa." \ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" #define REALLY_LONG_LEAF_NAME "shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_" \ "shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_" \ "shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_" \ "shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_" namespace android { class UtilsTest : public testing::Test { Loading Loading @@ -210,7 +220,7 @@ TEST_F(UtilsTest, CheckSystemApp_BadPathEscapeFail) { TEST_F(UtilsTest, GetPathFromString_NullPathFail) { dir_rec_t test1; EXPECT_EQ(-1, get_path_from_string(&test1, NULL)) EXPECT_EQ(-1, get_path_from_string(&test1, (const char *) NULL)) << "Should not allow NULL as a path."; } Loading Loading @@ -327,6 +337,50 @@ TEST_F(UtilsTest, CreatePkgPathInDir_ProtectedDir) { << "Package path should be in /data/app-private/"; } TEST_F(UtilsTest, CreatePersonaPath_Primary) { char path[PKG_PATH_MAX]; EXPECT_EQ(0, create_persona_path(path, 0)) << "Should successfully build primary user path."; EXPECT_STREQ("/data/data/", path) << "Primary user should have correct path"; } TEST_F(UtilsTest, CreatePersonaPath_Secondary) { char path[PKG_PATH_MAX]; EXPECT_EQ(0, create_persona_path(path, 1)) << "Should successfully build primary user path."; EXPECT_STREQ("/data/user/1/", path) << "Primary user should have correct path"; } TEST_F(UtilsTest, CreateMovePath_Primary) { char path[PKG_PATH_MAX]; EXPECT_EQ(0, create_move_path(path, "com.android.test", "shared_prefs", 0)) << "Should be able to create move path for primary user"; EXPECT_STREQ("/data/data/com.android.test/shared_prefs", path) << "Primary user package directory should be created correctly"; } TEST_F(UtilsTest, CreateMovePath_Fail_AppTooLong) { char path[PKG_PATH_MAX]; EXPECT_EQ(-1, create_move_path(path, REALLY_LONG_APP_NAME, "shared_prefs", 0)) << "Should fail to create move path for primary user"; } TEST_F(UtilsTest, CreateMovePath_Fail_LeafTooLong) { char path[PKG_PATH_MAX]; EXPECT_EQ(-1, create_move_path(path, "com.android.test", REALLY_LONG_LEAF_NAME, 0)) << "Should fail to create move path for primary user"; } TEST_F(UtilsTest, CopyAndAppend_Normal) { //int copy_and_append(dir_rec_t* dst, dir_rec_t* src, char* suffix) dir_rec_t dst; Loading cmds/installd/utils.c +16 −2 Original line number Diff line number Diff line Loading @@ -109,7 +109,7 @@ int create_persona_path(char path[PKG_PATH_MAX], uid_len = 0; } else { persona_prefix = SECONDARY_USER_PREFIX; uid_len = snprintf(NULL, 0, "%d", persona); uid_len = snprintf(NULL, 0, "%d/", persona); } char *dst = path; Loading @@ -126,7 +126,7 @@ int create_persona_path(char path[PKG_PATH_MAX], LOGE("Error building user path"); return -1; } int ret = snprintf(dst, dst_size, "%d", persona); int ret = snprintf(dst, dst_size, "%d/", persona); if (ret < 0 || (size_t) ret != uid_len) { LOGE("Error appending persona id to path"); return -1; Loading @@ -135,6 +135,20 @@ int create_persona_path(char path[PKG_PATH_MAX], return 0; } int create_move_path(char path[PKG_PATH_MAX], const char* pkgname, const char* leaf, uid_t persona) { if ((android_data_dir.len + strlen(PRIMARY_USER_PREFIX) + strlen(pkgname) + strlen(leaf) + 1) >= PKG_PATH_MAX) { return -1; } sprintf(path, "%s%s%s/%s", android_data_dir.path, PRIMARY_USER_PREFIX, pkgname, leaf); return 0; } /** * Checks whether the package name is valid. Returns -1 on error and * 0 on success. Loading services/java/com/android/server/DeviceStorageMonitorService.java +0 −1 Original line number Diff line number Diff line Loading @@ -163,7 +163,6 @@ public class DeviceStorageMonitorService extends Binder { } catch (IllegalArgumentException e) { // ignore; report -1 } mCacheFileStats.restat(CACHE_PATH); EventLog.writeEvent(EventLogTags.FREE_STORAGE_LEFT, mFreeMem, mFreeSystem, mFreeCache); } Loading Loading
cmds/installd/commands.c +8 −15 Original line number Diff line number Diff line Loading @@ -184,6 +184,7 @@ int free_cache(int64_t free_size) DIR *d; struct dirent *de; int64_t avail; char datadir[PKG_PATH_MAX]; avail = disk_free(); if (avail < 0) return -1; Loading @@ -191,9 +192,14 @@ int free_cache(int64_t free_size) LOGI("free_cache(%" PRId64 ") avail %" PRId64 "\n", free_size, avail); if (avail >= free_size) return 0; d = opendir(android_data_dir.path); if (create_persona_path(datadir, 0)) { LOGE("couldn't get directory for persona 0"); return -1; } d = opendir(datadir); if (d == NULL) { LOGE("cannot open %s: %s\n", android_data_dir.path, strerror(errno)); LOGE("cannot open %s: %s\n", datadir, strerror(errno)); return -1; } dfd = dirfd(d); Loading Loading @@ -578,19 +584,6 @@ fail: return -1; } int create_move_path(char path[PKG_PATH_MAX], const char* pkgname, const char* leaf, uid_t persona) { if ((android_data_dir.len + strlen(pkgname) + strlen(leaf) + 1) >= PKG_PATH_MAX) { return -1; } sprintf(path, "%s%s%s/%s", android_data_dir.path, PRIMARY_USER_PREFIX, pkgname, leaf); return 0; } void mkinnerdirs(char* path, int basepos, mode_t mode, int uid, int gid, struct stat* statbuf) { Loading
cmds/installd/installd.h +5 −0 Original line number Diff line number Diff line Loading @@ -105,6 +105,11 @@ int create_pkg_path(char path[PKG_PATH_MAX], int create_persona_path(char path[PKG_PATH_MAX], uid_t persona); int create_move_path(char path[PKG_PATH_MAX], const char* pkgname, const char* leaf, uid_t persona); int is_valid_package_name(const char* pkgname); int create_cache_path(char path[PKG_PATH_MAX], const char *src); Loading
cmds/installd/tests/installd_utils_test.cpp +55 −1 Original line number Diff line number Diff line Loading @@ -34,6 +34,16 @@ extern "C" { #define TEST_SYSTEM_DIR1 "/system/app/" #define TEST_SYSTEM_DIR2 "/vendor/app/" #define REALLY_LONG_APP_NAME "com.example." \ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa." \ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa." \ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" #define REALLY_LONG_LEAF_NAME "shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_" \ "shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_" \ "shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_" \ "shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_" namespace android { class UtilsTest : public testing::Test { Loading Loading @@ -210,7 +220,7 @@ TEST_F(UtilsTest, CheckSystemApp_BadPathEscapeFail) { TEST_F(UtilsTest, GetPathFromString_NullPathFail) { dir_rec_t test1; EXPECT_EQ(-1, get_path_from_string(&test1, NULL)) EXPECT_EQ(-1, get_path_from_string(&test1, (const char *) NULL)) << "Should not allow NULL as a path."; } Loading Loading @@ -327,6 +337,50 @@ TEST_F(UtilsTest, CreatePkgPathInDir_ProtectedDir) { << "Package path should be in /data/app-private/"; } TEST_F(UtilsTest, CreatePersonaPath_Primary) { char path[PKG_PATH_MAX]; EXPECT_EQ(0, create_persona_path(path, 0)) << "Should successfully build primary user path."; EXPECT_STREQ("/data/data/", path) << "Primary user should have correct path"; } TEST_F(UtilsTest, CreatePersonaPath_Secondary) { char path[PKG_PATH_MAX]; EXPECT_EQ(0, create_persona_path(path, 1)) << "Should successfully build primary user path."; EXPECT_STREQ("/data/user/1/", path) << "Primary user should have correct path"; } TEST_F(UtilsTest, CreateMovePath_Primary) { char path[PKG_PATH_MAX]; EXPECT_EQ(0, create_move_path(path, "com.android.test", "shared_prefs", 0)) << "Should be able to create move path for primary user"; EXPECT_STREQ("/data/data/com.android.test/shared_prefs", path) << "Primary user package directory should be created correctly"; } TEST_F(UtilsTest, CreateMovePath_Fail_AppTooLong) { char path[PKG_PATH_MAX]; EXPECT_EQ(-1, create_move_path(path, REALLY_LONG_APP_NAME, "shared_prefs", 0)) << "Should fail to create move path for primary user"; } TEST_F(UtilsTest, CreateMovePath_Fail_LeafTooLong) { char path[PKG_PATH_MAX]; EXPECT_EQ(-1, create_move_path(path, "com.android.test", REALLY_LONG_LEAF_NAME, 0)) << "Should fail to create move path for primary user"; } TEST_F(UtilsTest, CopyAndAppend_Normal) { //int copy_and_append(dir_rec_t* dst, dir_rec_t* src, char* suffix) dir_rec_t dst; Loading
cmds/installd/utils.c +16 −2 Original line number Diff line number Diff line Loading @@ -109,7 +109,7 @@ int create_persona_path(char path[PKG_PATH_MAX], uid_len = 0; } else { persona_prefix = SECONDARY_USER_PREFIX; uid_len = snprintf(NULL, 0, "%d", persona); uid_len = snprintf(NULL, 0, "%d/", persona); } char *dst = path; Loading @@ -126,7 +126,7 @@ int create_persona_path(char path[PKG_PATH_MAX], LOGE("Error building user path"); return -1; } int ret = snprintf(dst, dst_size, "%d", persona); int ret = snprintf(dst, dst_size, "%d/", persona); if (ret < 0 || (size_t) ret != uid_len) { LOGE("Error appending persona id to path"); return -1; Loading @@ -135,6 +135,20 @@ int create_persona_path(char path[PKG_PATH_MAX], return 0; } int create_move_path(char path[PKG_PATH_MAX], const char* pkgname, const char* leaf, uid_t persona) { if ((android_data_dir.len + strlen(PRIMARY_USER_PREFIX) + strlen(pkgname) + strlen(leaf) + 1) >= PKG_PATH_MAX) { return -1; } sprintf(path, "%s%s%s/%s", android_data_dir.path, PRIMARY_USER_PREFIX, pkgname, leaf); return 0; } /** * Checks whether the package name is valid. Returns -1 on error and * 0 on success. Loading
services/java/com/android/server/DeviceStorageMonitorService.java +0 −1 Original line number Diff line number Diff line Loading @@ -163,7 +163,6 @@ public class DeviceStorageMonitorService extends Binder { } catch (IllegalArgumentException e) { // ignore; report -1 } mCacheFileStats.restat(CACHE_PATH); EventLog.writeEvent(EventLogTags.FREE_STORAGE_LEFT, mFreeMem, mFreeSystem, mFreeCache); } Loading