From: Calin Juravle Date: Mon, 28 Mar 2016 14:11:01 +0000 (+0100) Subject: Don't report errors when trying to delete a non-existing profile dir X-Git-Tag: android-x86-7.1-r1~381 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=b06f98aabc5381fd6366526d9b31b5d0345481b6;p=android-x86%2Fframeworks-native.git Don't report errors when trying to delete a non-existing profile dir Also, put destroy_app_current_profiles behind FLAG_STORAGE_DE flag. Bug: 27081617 Change-Id: Ib8b9ff292784c659259ceb4339b803e3580da7ed --- diff --git a/cmds/installd/commands.cpp b/cmds/installd/commands.cpp index 8350da76a7..ff5a3b879c 100644 --- a/cmds/installd/commands.cpp +++ b/cmds/installd/commands.cpp @@ -235,7 +235,9 @@ int clear_app_data(const char *uuid, const char *pkgname, userid_t userid, int f } static int destroy_app_current_profiles(const char *pkgname, userid_t userid) { - return delete_dir_contents_and_dir(create_data_user_profile_package_path(userid, pkgname)); + return delete_dir_contents_and_dir( + create_data_user_profile_package_path(userid, pkgname), + /*ignore_if_missing*/ true); } int destroy_app_profiles(const char *pkgname) { @@ -244,7 +246,9 @@ int destroy_app_profiles(const char *pkgname) { for (auto user : users) { result |= destroy_app_current_profiles(pkgname, user); } - result |= delete_dir_contents_and_dir(create_data_ref_profile_package_path(pkgname)); + result |= delete_dir_contents_and_dir( + create_data_ref_profile_package_path(pkgname), + /*ignore_if_missing*/ true); return result; } @@ -257,8 +261,8 @@ int destroy_app_data(const char *uuid, const char *pkgname, userid_t userid, int 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); } - destroy_app_current_profiles(pkgname, userid); return res; } diff --git a/cmds/installd/utils.cpp b/cmds/installd/utils.cpp index 74f4264f80..d84d9f6106 100644 --- a/cmds/installd/utils.cpp +++ b/cmds/installd/utils.cpp @@ -341,23 +341,27 @@ static int _delete_dir_contents(DIR *d, return result; } -int delete_dir_contents(const std::string& pathname) { - return delete_dir_contents(pathname.c_str(), 0, NULL); +int delete_dir_contents(const std::string& pathname, bool ignore_if_missing) { + return delete_dir_contents(pathname.c_str(), 0, NULL, ignore_if_missing); } -int delete_dir_contents_and_dir(const std::string& pathname) { - return delete_dir_contents(pathname.c_str(), 1, NULL); +int delete_dir_contents_and_dir(const std::string& pathname, bool ignore_if_missing) { + return delete_dir_contents(pathname.c_str(), 1, NULL, ignore_if_missing); } int delete_dir_contents(const char *pathname, int also_delete_dir, - int (*exclusion_predicate)(const char*, const int)) + int (*exclusion_predicate)(const char*, const int), + bool ignore_if_missing) { int res = 0; DIR *d; d = opendir(pathname); if (d == NULL) { + if (ignore_if_missing && (errno == ENOENT)) { + return 0; + } ALOGE("Couldn't opendir %s: %s\n", pathname, strerror(errno)); return -errno; } diff --git a/cmds/installd/utils.h b/cmds/installd/utils.h index 9bbddcaec9..416a72679b 100644 --- a/cmds/installd/utils.h +++ b/cmds/installd/utils.h @@ -99,12 +99,13 @@ int create_move_path(char path[PKG_PATH_MAX], int is_valid_package_name(const char* pkgname); -int delete_dir_contents(const std::string& pathname); -int delete_dir_contents_and_dir(const std::string& pathname); +int delete_dir_contents(const std::string& pathname, bool ignore_if_missing = false); +int delete_dir_contents_and_dir(const std::string& pathname, bool ignore_if_missing = false); int delete_dir_contents(const char *pathname, int also_delete_dir, - int (*exclusion_predicate)(const char *name, const int is_dir)); + int (*exclusion_predicate)(const char *name, const int is_dir), + bool ignore_if_missing = false); int delete_dir_contents_fd(int dfd, const char *name);