Loading cmds/installd/binder/android/os/IInstalld.aidl +14 −0 Original line number Diff line number Diff line Loading @@ -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); Loading cmds/installd/commands.cpp +76 −47 Original line number Diff line number Diff line Loading @@ -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); } } Loading @@ -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) { Loading Loading @@ -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) { Loading @@ -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) { Loading @@ -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, Loading @@ -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); Loading Loading @@ -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; } Loading Loading @@ -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. Loading Loading @@ -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) Loading Loading @@ -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) Loading cmds/installd/commands.h +17 −12 Original line number Diff line number Diff line Loading @@ -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); Loading cmds/installd/installd.cpp +0 −54 Original line number Diff line number Diff line Loading @@ -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"; Loading Loading @@ -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])); Loading Loading @@ -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 }, Loading Loading
cmds/installd/binder/android/os/IInstalld.aidl +14 −0 Original line number Diff line number Diff line Loading @@ -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); Loading
cmds/installd/commands.cpp +76 −47 Original line number Diff line number Diff line Loading @@ -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); } } Loading @@ -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) { Loading Loading @@ -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) { Loading @@ -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) { Loading @@ -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, Loading @@ -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); Loading Loading @@ -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; } Loading Loading @@ -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. Loading Loading @@ -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) Loading Loading @@ -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) Loading
cmds/installd/commands.h +17 −12 Original line number Diff line number Diff line Loading @@ -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); Loading
cmds/installd/installd.cpp +0 −54 Original line number Diff line number Diff line Loading @@ -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"; Loading Loading @@ -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])); Loading Loading @@ -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 }, Loading