diff options
Diffstat (limited to 'cmds/installd/utils.cpp')
-rw-r--r-- | cmds/installd/utils.cpp | 54 |
1 files changed, 42 insertions, 12 deletions
diff --git a/cmds/installd/utils.cpp b/cmds/installd/utils.cpp index ba411cd..7db3fb9 100644 --- a/cmds/installd/utils.cpp +++ b/cmds/installd/utils.cpp @@ -37,16 +37,31 @@ static bool is_valid_filename(const std::string& name) { } /** + * Create the path name where package app contents should be stored for + * the given volume UUID and package name. An empty UUID is assumed to + * be internal storage. + */ +std::string create_data_app_package_path(const char* volume_uuid, + const char* package_name) { + CHECK(is_valid_filename(package_name)); + CHECK(is_valid_package_name(package_name) == 0); + + return StringPrintf("%s/%s", + create_data_app_path(volume_uuid).c_str(), package_name); +} + +/** * Create the path name where package data should be stored for the given * volume UUID, package name, and user ID. An empty UUID is assumed to be * internal storage. */ -std::string create_package_data_path(const char* volume_uuid, - const char* package_name, userid_t user) { +std::string create_data_user_package_path(const char* volume_uuid, + userid_t user, const char* package_name) { CHECK(is_valid_filename(package_name)); CHECK(is_valid_package_name(package_name) == 0); - return StringPrintf("%s/%s", create_data_user_path(volume_uuid, user).c_str(), package_name); + return StringPrintf("%s/%s", + create_data_user_path(volume_uuid, user).c_str(), package_name); } int create_pkg_path(char path[PKG_PATH_MAX], const char *pkgname, @@ -56,7 +71,7 @@ int create_pkg_path(char path[PKG_PATH_MAX], const char *pkgname, return -1; } - std::string _tmp(create_package_data_path(nullptr, pkgname, userid) + postfix); + std::string _tmp(create_data_user_package_path(nullptr, userid, pkgname) + postfix); const char* tmp = _tmp.c_str(); if (strlen(tmp) >= PKG_PATH_MAX) { path[0] = '\0'; @@ -77,6 +92,13 @@ std::string create_data_path(const char* volume_uuid) { } /** + * Create the path name for app data. + */ +std::string create_data_app_path(const char* volume_uuid) { + return StringPrintf("%s/app", create_data_path(volume_uuid).c_str()); +} + +/** * Create the path name for user data for a certain userid. */ std::string create_data_user_path(const char* volume_uuid, userid_t userid) { @@ -1021,15 +1043,13 @@ int copy_and_append(dir_rec_t* dst, const dir_rec_t* src, const char* suffix) { } /** - * Check whether path points to a valid path for an APK file. Only one level of - * subdirectory names is allowed. Returns -1 when an invalid path is encountered - * and 0 when a valid path is encountered. + * Check whether path points to a valid path for an APK file. The path must + * begin with a whitelisted prefix path and must be no deeper than |maxSubdirs| within + * that path. Returns -1 when an invalid path is encountered and 0 when a valid path + * is encountered. */ -int validate_apk_path(const char *path) -{ +static int validate_apk_path_internal(const char *path, int maxSubdirs) { const dir_rec_t* dir = NULL; - int maxSubdirs = 1; - if (!strncmp(path, android_app_dir.path, android_app_dir.len)) { dir = &android_app_dir; } else if (!strncmp(path, android_app_private_dir.path, android_app_private_dir.len)) { @@ -1038,7 +1058,9 @@ int validate_apk_path(const char *path) dir = &android_asec_dir; } else if (!strncmp(path, android_mnt_expand_dir.path, android_mnt_expand_dir.len)) { dir = &android_mnt_expand_dir; - maxSubdirs = 2; + if (maxSubdirs < 2) { + maxSubdirs = 2; + } } else { return -1; } @@ -1046,6 +1068,14 @@ int validate_apk_path(const char *path) return validate_path(dir, path, maxSubdirs); } +int validate_apk_path(const char* path) { + return validate_apk_path_internal(path, 1 /* maxSubdirs */); +} + +int validate_apk_path_subdirs(const char* path) { + return validate_apk_path_internal(path, 3 /* maxSubdirs */); +} + int append_and_increment(char** dst, const char* src, size_t* dst_size) { ssize_t ret = strlcpy(*dst, src, *dst_size); if (ret < 0 || (size_t) ret >= *dst_size) { |