diff options
author | 2016-12-05 23:39:32 -0700 | |
---|---|---|
committer | 2016-12-06 18:51:07 -0700 | |
commit | c1e93e7d746e07791b0667c80ad43a407c515fa8 (patch) | |
tree | 0443d0028a5ff6afe9f8c09bfb7e521c1f2b41fd | |
parent | ecea1bfeae1211f9a363925c172c0f23062107fb (diff) |
Move more installd methods to Binder.
Test: builds, boots, apps install fine
Bug: 13758960, 30944031
Change-Id: I1fcaaaaad34c2f9a3d6a15443ef1764186669865
-rw-r--r-- | cmds/installd/binder/android/os/IInstalld.aidl | 14 | ||||
-rw-r--r-- | cmds/installd/commands.cpp | 123 | ||||
-rw-r--r-- | cmds/installd/commands.h | 29 | ||||
-rw-r--r-- | cmds/installd/installd.cpp | 54 |
4 files changed, 107 insertions, 113 deletions
diff --git a/cmds/installd/binder/android/os/IInstalld.aidl b/cmds/installd/binder/android/os/IInstalld.aidl index 924a172203..64ac592ffe 100644 --- a/cmds/installd/binder/android/os/IInstalld.aidl +++ b/cmds/installd/binder/android/os/IInstalld.aidl @@ -17,8 +17,22 @@ package android.os; interface IInstalld { + void createUserData(@nullable @utf8InCpp String uuid, int userId, int userSerial, int flags); + void destroyUserData(@nullable @utf8InCpp String uuid, int userId, int flags); + void createAppData(in @nullable @utf8InCpp String uuid, in @utf8InCpp String packageName, int userId, int flags, int appId, in @utf8InCpp String seInfo, int targetSdkVersion); + void restoreconAppData(@nullable @utf8InCpp String uuid, @utf8InCpp String packageName, + int userId, int flags, int appId, @utf8InCpp String seInfo); + void migrateAppData(@nullable @utf8InCpp String uuid, @utf8InCpp String packageName, + int userId, int flags); + void clearAppData(@nullable @utf8InCpp String uuid, @utf8InCpp String packageName, + int userId, int flags, long ceDataInode); + void destroyAppData(@nullable @utf8InCpp String uuid, @utf8InCpp String packageName, + int userId, int flags, long ceDataInode); + long getAppDataInode(@nullable @utf8InCpp String uuid, @utf8InCpp String packageName, + int userId, int flags); + void moveCompleteApp(@nullable @utf8InCpp String fromUuid, @nullable @utf8InCpp String toUuid, @utf8InCpp String packageName, @utf8InCpp String dataAppName, int appId, @utf8InCpp String seInfo, int targetSdkVersion); diff --git a/cmds/installd/commands.cpp b/cmds/installd/commands.cpp index bbc5160bc5..eb22a072fa 100644 --- a/cmds/installd/commands.cpp +++ b/cmds/installd/commands.cpp @@ -298,21 +298,27 @@ binder::Status InstalldNativeService::createAppData(const std::unique_ptr<std::s return binder::Status::ok(); } -int migrate_app_data(const char *uuid, const char *pkgname, userid_t userid, int flags) { +//int migrate_app_data(const char *uuid, const char *pkgname, userid_t userid, int flags) { +binder::Status InstalldNativeService::migrateAppData(const std::unique_ptr<std::string>& uuid, + const std::string& packageName, int32_t userId, int32_t flags) { + ENFORCE_UID(AID_SYSTEM); + const char* uuid_ = uuid ? uuid->c_str() : nullptr; + const char* pkgname = packageName.c_str(); + // This method only exists to upgrade system apps that have requested // forceDeviceEncrypted, so their default storage always lives in a // consistent location. This only works on non-FBE devices, since we // never want to risk exposing data on a device with real CE/DE storage. - auto ce_path = create_data_user_ce_package_path(uuid, userid, pkgname); - auto de_path = create_data_user_de_package_path(uuid, userid, pkgname); + auto ce_path = create_data_user_ce_package_path(uuid_, userId, pkgname); + auto de_path = create_data_user_de_package_path(uuid_, userId, pkgname); // If neither directory is marked as default, assume CE is default if (getxattr(ce_path.c_str(), kXattrDefault, nullptr, 0) == -1 && getxattr(de_path.c_str(), kXattrDefault, nullptr, 0) == -1) { if (setxattr(ce_path.c_str(), kXattrDefault, nullptr, 0, 0) != 0) { PLOG(ERROR) << "Failed to mark default storage " << ce_path; - return -1; + return binder::Status::fromServiceSpecificError(-1); } } @@ -325,15 +331,15 @@ int migrate_app_data(const char *uuid, const char *pkgname, userid_t userid, int << " is not active; migrating from " << source; if (delete_dir_contents_and_dir(target) != 0) { PLOG(ERROR) << "Failed to delete"; - return -1; + return binder::Status::fromServiceSpecificError(-1); } if (rename(source.c_str(), target.c_str()) != 0) { PLOG(ERROR) << "Failed to rename"; - return -1; + return binder::Status::fromServiceSpecificError(-1); } } - return 0; + return binder::Status::ok(); } static bool clear_profile(const std::string& profile) { @@ -408,11 +414,15 @@ int clear_app_profiles(const char* pkgname) { return success ? 0 : -1; } -int clear_app_data(const char *uuid, const char *pkgname, userid_t userid, int flags, - ino_t ce_data_inode) { +binder::Status InstalldNativeService::clearAppData(const std::unique_ptr<std::string>& uuid, + const std::string& packageName, int32_t userId, int32_t flags, int64_t ceDataInode) { + ENFORCE_UID(AID_SYSTEM); + const char* uuid_ = uuid ? uuid->c_str() : nullptr; + const char* pkgname = packageName.c_str(); + int res = 0; if (flags & FLAG_STORAGE_CE) { - auto path = create_data_user_ce_package_path(uuid, userid, pkgname, ce_data_inode); + auto path = create_data_user_ce_package_path(uuid_, userId, pkgname, ceDataInode); if (flags & FLAG_CLEAR_CACHE_ONLY) { path = read_path_inode(path, "cache", kXattrInodeCache); } else if (flags & FLAG_CLEAR_CODE_CACHE_ONLY) { @@ -433,18 +443,18 @@ int clear_app_data(const char *uuid, const char *pkgname, userid_t userid, int f only_cache = true; } - auto path = create_data_user_de_package_path(uuid, userid, pkgname) + suffix; + auto path = create_data_user_de_package_path(uuid_, userId, pkgname) + suffix; if (access(path.c_str(), F_OK) == 0) { // TODO: include result once 25796509 is fixed delete_dir_contents(path); } if (!only_cache) { - if (!clear_current_profile(pkgname, userid)) { + if (!clear_current_profile(pkgname, userId)) { res |= -1; } } } - return res; + return res ? binder::Status::fromServiceSpecificError(-1) : binder::Status::ok(); } static int destroy_app_reference_profile(const char *pkgname) { @@ -469,23 +479,27 @@ int destroy_app_profiles(const char *pkgname) { return result; } -int destroy_app_data(const char *uuid, const char *pkgname, userid_t userid, int flags, - ino_t ce_data_inode) { +binder::Status InstalldNativeService::destroyAppData(const std::unique_ptr<std::string>& uuid, + const std::string& packageName, int32_t userId, int32_t flags, int64_t ceDataInode) { + ENFORCE_UID(AID_SYSTEM); + const char* uuid_ = uuid ? uuid->c_str() : nullptr; + const char* pkgname = packageName.c_str(); + int res = 0; if (flags & FLAG_STORAGE_CE) { res |= delete_dir_contents_and_dir( - create_data_user_ce_package_path(uuid, userid, pkgname, ce_data_inode)); + create_data_user_ce_package_path(uuid_, userId, pkgname, ceDataInode)); } if (flags & FLAG_STORAGE_DE) { res |= delete_dir_contents_and_dir( - create_data_user_de_package_path(uuid, userid, pkgname)); - destroy_app_current_profiles(pkgname, userid); + create_data_user_de_package_path(uuid_, userId, pkgname)); + destroy_app_current_profiles(pkgname, userId); // TODO(calin): If the package is still installed by other users it's probably // beneficial to keep the reference profile around. // Verify if it's ok to do that. destroy_app_reference_profile(pkgname); } - return res; + return res ? binder::Status::fromServiceSpecificError(-1) : binder::Status::ok(); } binder::Status InstalldNativeService::moveCompleteApp(const std::unique_ptr<std::string>& fromUuid, @@ -497,7 +511,6 @@ binder::Status InstalldNativeService::moveCompleteApp(const std::unique_ptr<std: const char* to_uuid = toUuid ? toUuid->c_str() : nullptr; const char* package_name = packageName.c_str(); const char* data_app_name = dataAppName.c_str(); - const char* seinfo = seInfo.c_str(); std::vector<userid_t> users = get_known_users(from_uuid); @@ -587,8 +600,8 @@ binder::Status InstalldNativeService::moveCompleteApp(const std::unique_ptr<std: } } - if (restorecon_app_data(to_uuid, package_name, user, FLAG_STORAGE_CE | FLAG_STORAGE_DE, - appId, seinfo) != 0) { + if (!restoreconAppData(toUuid, packageName, user, FLAG_STORAGE_CE | FLAG_STORAGE_DE, + appId, seInfo).isOk()) { LOG(ERROR) << "Failed to restorecon"; goto fail; } @@ -624,30 +637,36 @@ fail: return binder::Status::fromServiceSpecificError(-1); } -int create_user_data(const char *uuid, userid_t userid, int user_serial ATTRIBUTE_UNUSED, - int flags) { +binder::Status InstalldNativeService::createUserData(const std::unique_ptr<std::string>& uuid, + int32_t userId, int32_t userSerial ATTRIBUTE_UNUSED, int32_t flags) { + ENFORCE_UID(AID_SYSTEM); + const char* uuid_ = uuid ? uuid->c_str() : nullptr; + int res = 0; if (flags & FLAG_STORAGE_DE) { - if (uuid == nullptr) { - return ensure_config_user_dirs(userid); + if (uuid_ == nullptr) { + res = ensure_config_user_dirs(userId); } } - return 0; + return res ? binder::Status::fromServiceSpecificError(-1) : binder::Status::ok(); } -int destroy_user_data(const char *uuid, userid_t userid, int flags) { +binder::Status InstalldNativeService::destroyUserData(const std::unique_ptr<std::string>& uuid, + int32_t userId, int32_t flags) { + ENFORCE_UID(AID_SYSTEM); + const char* uuid_ = uuid ? uuid->c_str() : nullptr; int res = 0; if (flags & FLAG_STORAGE_DE) { - res |= delete_dir_contents_and_dir(create_data_user_de_path(uuid, userid), true); - if (uuid == nullptr) { - res |= delete_dir_contents_and_dir(create_data_misc_legacy_path(userid), true); - res |= delete_dir_contents_and_dir(create_data_user_profiles_path(userid), true); + res |= delete_dir_contents_and_dir(create_data_user_de_path(uuid_, userId), true); + if (uuid_ == nullptr) { + res |= delete_dir_contents_and_dir(create_data_misc_legacy_path(userId), true); + res |= delete_dir_contents_and_dir(create_data_user_profiles_path(userId), true); } } if (flags & FLAG_STORAGE_CE) { - res |= delete_dir_contents_and_dir(create_data_user_ce_path(uuid, userid), true); - res |= delete_dir_contents_and_dir(create_data_media_path(uuid, userid), true); + res |= delete_dir_contents_and_dir(create_data_user_ce_path(uuid_, userId), true); + res |= delete_dir_contents_and_dir(create_data_media_path(uuid_, userId), true); } - return res; + return res ? binder::Status::fromServiceSpecificError(-1) : binder::Status::ok(); } /* Try to ensure free_size bytes of storage are available. @@ -784,12 +803,18 @@ int get_app_size(const char *uuid, const char *pkgname, int userid, int flags, i return 0; } -int get_app_data_inode(const char *uuid, const char *pkgname, int userid, int flags, ino_t *inode) { +binder::Status InstalldNativeService::getAppDataInode(const std::unique_ptr<std::string>& uuid, + const std::string& packageName, int32_t userId, int32_t flags, int64_t* _aidl_return) { + ENFORCE_UID(AID_SYSTEM); + const char* uuid_ = uuid ? uuid->c_str() : nullptr; + const char* pkgname = packageName.c_str(); + + int res = 0; if (flags & FLAG_STORAGE_CE) { - auto path = create_data_user_ce_package_path(uuid, userid, pkgname); - return get_path_inode(path, inode); + auto path = create_data_user_ce_package_path(uuid_, userId, pkgname); + res = get_path_inode(path, reinterpret_cast<ino_t*>(_aidl_return)); } - return -1; + return res ? binder::Status::fromServiceSpecificError(-1) : binder::Status::ok(); } static int split_count(const char *str) @@ -2218,35 +2243,39 @@ fail: return -1; } -int restorecon_app_data(const char* uuid, const char* pkgName, userid_t userid, int flags, - appid_t appid, const char* seinfo) { +binder::Status InstalldNativeService::restoreconAppData(const std::unique_ptr<std::string>& uuid, + const std::string& packageName, int32_t userId, int32_t flags, int32_t appId, + const std::string& seInfo) { + ENFORCE_UID(AID_SYSTEM); int res = 0; // SELINUX_ANDROID_RESTORECON_DATADATA flag is set by libselinux. Not needed here. unsigned int seflags = SELINUX_ANDROID_RESTORECON_RECURSE; + const char* uuid_ = uuid ? uuid->c_str() : nullptr; + const char* pkgName = packageName.c_str(); + const char* seinfo = seInfo.c_str(); if (!pkgName || !seinfo) { ALOGE("Package name or seinfo tag is null when trying to restorecon."); - return -1; + return binder::Status::fromServiceSpecificError(-1); } - uid_t uid = multiuser_get_uid(userid, appid); + uid_t uid = multiuser_get_uid(userId, appId); if (flags & FLAG_STORAGE_CE) { - auto path = create_data_user_ce_package_path(uuid, userid, pkgName); + auto path = create_data_user_ce_package_path(uuid_, userId, pkgName); if (selinux_android_restorecon_pkgdir(path.c_str(), seinfo, uid, seflags) < 0) { PLOG(ERROR) << "restorecon failed for " << path; res = -1; } } if (flags & FLAG_STORAGE_DE) { - auto path = create_data_user_de_package_path(uuid, userid, pkgName); + auto path = create_data_user_de_package_path(uuid_, userId, pkgName); if (selinux_android_restorecon_pkgdir(path.c_str(), seinfo, uid, seflags) < 0) { PLOG(ERROR) << "restorecon failed for " << path; // TODO: include result once 25796509 is fixed } } - - return res; + return res ? binder::Status::fromServiceSpecificError(-1) : binder::Status::ok(); } int create_oat_dir(const char* oat_dir, const char* instruction_set) diff --git a/cmds/installd/commands.h b/cmds/installd/commands.h index 47c68c8cc2..24d7fc6490 100644 --- a/cmds/installd/commands.h +++ b/cmds/installd/commands.h @@ -38,30 +38,35 @@ public: static char const* getServiceName() { return "installd"; } virtual status_t dump(int fd, const Vector<String16> &args) override; + binder::Status createUserData(const std::unique_ptr<std::string>& uuid, int32_t userId, + int32_t userSerial, int32_t flags); + binder::Status destroyUserData(const std::unique_ptr<std::string>& uuid, int32_t userId, + int32_t flags); + binder::Status createAppData(const std::unique_ptr<std::string>& uuid, const std::string& packageName, int32_t userId, int32_t flags, int32_t appId, const std::string& seInfo, int32_t targetSdkVersion); + binder::Status restoreconAppData(const std::unique_ptr<std::string>& uuid, + const std::string& packageName, int32_t userId, int32_t flags, int32_t appId, + const std::string& seInfo); + binder::Status migrateAppData(const std::unique_ptr<std::string>& uuid, + const std::string& packageName, int32_t userId, int32_t flags); + binder::Status clearAppData(const std::unique_ptr<std::string>& uuid, + const std::string& packageName, int32_t userId, int32_t flags, int64_t ceDataInode); + binder::Status destroyAppData(const std::unique_ptr<std::string>& uuid, + const std::string& packageName, int32_t userId, int32_t flags, int64_t ceDataInode); + binder::Status getAppDataInode(const std::unique_ptr<std::string>& uuid, + const std::string& packageName, int32_t userId, int32_t flags, int64_t* _aidl_return); + binder::Status moveCompleteApp(const std::unique_ptr<std::string>& fromUuid, const std::unique_ptr<std::string>& toUuid, const std::string& packageName, const std::string& dataAppName, int32_t appId, const std::string& seInfo, int32_t targetSdkVersion); }; -int restorecon_app_data(const char* uuid, const char* pkgName, userid_t userid, int flags, - appid_t appid, const char* seinfo); -int migrate_app_data(const char *uuid, const char *pkgname, userid_t userid, int flags); -int clear_app_data(const char *uuid, const char *pkgname, userid_t userid, int flags, - ino_t ce_data_inode); -int destroy_app_data(const char *uuid, const char *pkgname, userid_t userid, int flags, - ino_t ce_data_inode); - int get_app_size(const char *uuid, const char *pkgname, int userid, int flags, ino_t ce_data_inode, const char* code_path, int64_t *codesize, int64_t *datasize, int64_t *cachesize, int64_t *asecsize); -int get_app_data_inode(const char *uuid, const char *pkgname, int userid, int flags, ino_t *inode); - -int create_user_data(const char *uuid, userid_t userid, int user_serial, int flags); -int destroy_user_data(const char *uuid, userid_t userid, int flags); int rm_dex(const char *path, const char *instruction_set); int free_cache(const char *uuid, int64_t free_size); diff --git a/cmds/installd/installd.cpp b/cmds/installd/installd.cpp index f892548d18..123a77218c 100644 --- a/cmds/installd/installd.cpp +++ b/cmds/installd/installd.cpp @@ -188,27 +188,6 @@ static int do_ping(char **arg ATTRIBUTE_UNUSED, char reply[REPLY_MAX] ATTRIBUTE_ return 0; } -static int do_restorecon_app_data(char **arg, char reply[REPLY_MAX] ATTRIBUTE_UNUSED) { - /* const char* uuid, const char* pkgName, userid_t userid, int flags, - appid_t appid, const char* seinfo */ - return restorecon_app_data(parse_null(arg[0]), arg[1], atoi(arg[2]), atoi(arg[3]), atoi(arg[4]), arg[5]); -} - -static int do_migrate_app_data(char **arg, char reply[REPLY_MAX] ATTRIBUTE_UNUSED) { - /* const char *uuid, const char *pkgname, userid_t userid, int flags */ - return migrate_app_data(parse_null(arg[0]), arg[1], atoi(arg[2]), atoi(arg[3])); -} - -static int do_clear_app_data(char **arg, char reply[REPLY_MAX] ATTRIBUTE_UNUSED) { - /* const char *uuid, const char *pkgname, userid_t userid, int flags, ino_t ce_data_inode */ - return clear_app_data(parse_null(arg[0]), arg[1], atoi(arg[2]), atoi(arg[3]), atol(arg[4])); -} - -static int do_destroy_app_data(char **arg, char reply[REPLY_MAX] ATTRIBUTE_UNUSED) { - /* const char *uuid, const char *pkgname, userid_t userid, int flags, ino_t ce_data_inode */ - return destroy_app_data(parse_null(arg[0]), arg[1], atoi(arg[2]), atoi(arg[3]), atol(arg[4])); -} - // We use otapreopt_chroot to get into the chroot. static constexpr const char* kOtaPreopt = "/system/bin/otapreopt_chroot"; @@ -335,29 +314,6 @@ static int do_get_app_size(char **arg, char reply[REPLY_MAX]) { return res; } -static int do_get_app_data_inode(char **arg, char reply[REPLY_MAX]) { - ino_t inode = 0; - int res = 0; - - /* const char *uuid, const char *pkgname, int userid, int flags */ - res = get_app_data_inode(parse_null(arg[0]), arg[1], atoi(arg[2]), atoi(arg[3]), &inode); - - snprintf(reply, REPLY_MAX, "%" PRId64, (int64_t) inode); - return res; -} - -static int do_create_user_data(char **arg, char reply[REPLY_MAX] ATTRIBUTE_UNUSED) -{ - /* const char *uuid, userid_t userid, int user_serial, int flags */ - return create_user_data(parse_null(arg[0]), atoi(arg[1]), atoi(arg[2]), atoi(arg[3])); -} - -static int do_destroy_user_data(char **arg, char reply[REPLY_MAX] ATTRIBUTE_UNUSED) -{ - /* const char *uuid, userid_t userid, int flags */ - return destroy_user_data(parse_null(arg[0]), atoi(arg[1]), atoi(arg[2])); -} - static int do_linklib(char **arg, char reply[REPLY_MAX] ATTRIBUTE_UNUSED) { return linklib(parse_null(arg[0]), arg[1], arg[2], atoi(arg[3])); @@ -416,17 +372,7 @@ struct cmdinfo { struct cmdinfo cmds[] = { { "ping", 0, do_ping }, - - { "restorecon_app_data", 6, do_restorecon_app_data }, - { "migrate_app_data", 4, do_migrate_app_data }, - { "clear_app_data", 5, do_clear_app_data }, - { "destroy_app_data", 5, do_destroy_app_data }, { "get_app_size", 6, do_get_app_size }, - { "get_app_data_inode", 4, do_get_app_data_inode }, - - { "create_user_data", 4, do_create_user_data }, - { "destroy_user_data", 3, do_destroy_user_data }, - { "dexopt", 10, do_dexopt }, { "markbootcomplete", 1, do_mark_boot_complete }, { "rmdex", 2, do_rm_dex }, |