diff options
author | JW Wang <wangchun@google.com> | 2020-10-06 13:42:41 +0800 |
---|---|---|
committer | JW Wang <wangchun@google.com> | 2020-11-04 12:17:26 +0800 |
commit | 995b24692cd557b71b46be0a402ad8b0ee5c1a09 (patch) | |
tree | 57fbc04a745e46f2f6456c7d9c68dca8f6bf064b | |
parent | 3d8f2d71fdaa7f7c4cd5726371d91bef7d6e760c (diff) | |
download | native-995b24692cd557b71b46be0a402ad8b0ee5c1a09.tar.gz |
Fixes De data is not backed up correctly when user locked (1/n)
https://android.googlesource.com/platform/frameworks/native/+/fda19ecdd6df8f43d3368781a633792723fb9965/cmds/installd/InstalldNativeService.cpp#933
When an APK is stage installed, snapshotAppData(..., FLAG_STORAGE_DE)
is called before user unlocked. The function bails out early at #937
because the folder is still encrypted.
We should move the if block at #958 above so we can back up De data
correctly even when Ce directories not ready.
Note we have to check if the De folder exists before making a copy.
(Cherry-picked from 1d643c77d3fcb7dfe0bf4dabed2964bbfca04c6f)
Bug: 169594054
Test: atest StagedRollbackTest
Merged-In: I2ca810bd9495de3bed58378a41b47863c6e8f8dd
Change-Id: I2ca810bd9495de3bed58378a41b47863c6e8f8dd
-rw-r--r-- | cmds/installd/InstalldNativeService.cpp | 51 |
1 files changed, 27 insertions, 24 deletions
diff --git a/cmds/installd/InstalldNativeService.cpp b/cmds/installd/InstalldNativeService.cpp index 34727270e4..856b545c7c 100644 --- a/cmds/installd/InstalldNativeService.cpp +++ b/cmds/installd/InstalldNativeService.cpp @@ -876,6 +876,33 @@ binder::Status InstalldNativeService::snapshotAppData( auto scope_guard = android::base::make_scope_guard(deleter); + if (storageFlags & FLAG_STORAGE_DE) { + auto from = create_data_user_de_package_path(volume_uuid, user, package_name); + auto to = create_data_misc_de_rollback_path(volume_uuid, user, snapshotId); + auto rollback_package_path = create_data_misc_de_rollback_package_path(volume_uuid, user, + snapshotId, package_name); + + int rc = create_dir_if_needed(to.c_str(), kRollbackFolderMode); + if (rc != 0) { + return error(rc, "Failed to create folder " + to); + } + + rc = delete_dir_contents(rollback_package_path, true /* ignore_if_missing */); + if (rc != 0) { + return error(rc, "Failed clearing existing snapshot " + rollback_package_path); + } + + // Check if we have data to copy. + if (access(from.c_str(), F_OK) == 0) { + rc = copy_directory_recursive(from.c_str(), to.c_str()); + } + if (rc != 0) { + res = error(rc, "Failed copying " + from + " to " + to); + clear_de_on_exit = true; + return res; + } + } + // The app may not have any data at all, in which case it's OK to skip here. auto from_ce = create_data_user_ce_package_path(volume_uuid, user, package_name); if (access(from_ce.c_str(), F_OK) != 0) { @@ -901,30 +928,6 @@ binder::Status InstalldNativeService::snapshotAppData( LOG(WARNING) << "Failed to clear code_cache of app " << packageName; } - if (storageFlags & FLAG_STORAGE_DE) { - auto from = create_data_user_de_package_path(volume_uuid, user, package_name); - auto to = create_data_misc_de_rollback_path(volume_uuid, user, snapshotId); - auto rollback_package_path = create_data_misc_de_rollback_package_path(volume_uuid, user, - snapshotId, package_name); - - int rc = create_dir_if_needed(to.c_str(), kRollbackFolderMode); - if (rc != 0) { - return error(rc, "Failed to create folder " + to); - } - - rc = delete_dir_contents(rollback_package_path, true /* ignore_if_missing */); - if (rc != 0) { - return error(rc, "Failed clearing existing snapshot " + rollback_package_path); - } - - rc = copy_directory_recursive(from.c_str(), to.c_str()); - if (rc != 0) { - res = error(rc, "Failed copying " + from + " to " + to); - clear_de_on_exit = true; - return res; - } - } - if (storageFlags & FLAG_STORAGE_CE) { auto from = create_data_user_ce_package_path(volume_uuid, user, package_name); auto to = create_data_misc_ce_rollback_path(volume_uuid, user, snapshotId); |