From 91e0bf4998eb3c0f8d3cd05bd7fe369e19279dbb Mon Sep 17 00:00:00 2001 From: Alex Buynytskyy Date: Tue, 31 Mar 2020 14:46:25 -0700 Subject: [PATCH] Checking LOADER_USAGE_STATS before enabling read logs. Bug: b/152633648 Test: atest PackageManagerShellCommandTest PackageManagerShellCommandIncrementalTest Change-Id: I29bf16d06a013566c8dd08e64be2a23ad805e37d --- VoldNativeService.cpp | 26 +++++++++++++++++++++++++- VoldNativeService.h | 3 +++ binder/android/os/IVold.aidl | 1 + 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/VoldNativeService.cpp b/VoldNativeService.cpp index 1beb29c..d1d7d86 100644 --- a/VoldNativeService.cpp +++ b/VoldNativeService.cpp @@ -53,6 +53,7 @@ namespace vold { namespace { constexpr const char* kDump = "android.permission.DUMP"; +constexpr const char* kDataUsageStats = "android.permission.LOADER_USAGE_STATS"; static binder::Status error(const std::string& msg) { PLOG(ERROR) << msg; @@ -893,7 +894,8 @@ binder::Status VoldNativeService::mountIncFs( auto control = IncFs_Mount(backingPath.c_str(), targetDir.c_str(), {.flags = IncFsMountFlags(flags), .defaultReadTimeoutMs = INCFS_DEFAULT_READ_TIMEOUT_MS, - .readLogBufferPages = 4}); + // Mount with read logs disabled. + .readLogBufferPages = 0}); if (control == nullptr) { return translate(-1); } @@ -915,6 +917,28 @@ binder::Status VoldNativeService::unmountIncFs(const std::string& dir) { return translate(IncFs_Unmount(dir.c_str())); } +binder::Status VoldNativeService::setIncFsMountOptions( + const ::android::os::incremental::IncrementalFileSystemControlParcel& control, + bool enableReadLogs) { + auto status = CheckPermission(kDataUsageStats); + if (!status.isOk()) { + return status; + } + + auto incfsControl = IncFs_CreateControl(dup(control.cmd.get()), dup(control.pendingReads.get()), + dup(control.log.get())); + if (auto error = IncFs_SetOptions( + incfsControl, + {.defaultReadTimeoutMs = INCFS_DEFAULT_READ_TIMEOUT_MS, + .readLogBufferPages = enableReadLogs ? INCFS_DEFAULT_PAGE_READ_BUFFER_PAGES : 0}); + error < 0) { + status = binder::Status::fromServiceSpecificError(error); + } + IncFs_DeleteControl(incfsControl); + + return status; +} + binder::Status VoldNativeService::bindMount(const std::string& sourceDir, const std::string& targetDir) { ENFORCE_SYSTEM_OR_ROOT; diff --git a/VoldNativeService.h b/VoldNativeService.h index 2f4b6eb..060d704 100644 --- a/VoldNativeService.h +++ b/VoldNativeService.h @@ -154,6 +154,9 @@ class VoldNativeService : public BinderService, public os::Bn const std::string& backingPath, const std::string& targetDir, int32_t flags, ::android::os::incremental::IncrementalFileSystemControlParcel* _aidl_return) override; binder::Status unmountIncFs(const std::string& dir) override; + binder::Status setIncFsMountOptions( + const ::android::os::incremental::IncrementalFileSystemControlParcel& control, + bool enableReadLogs) override; binder::Status bindMount(const std::string& sourceDir, const std::string& targetDir) override; }; diff --git a/binder/android/os/IVold.aidl b/binder/android/os/IVold.aidl index 1d5657f..68e2ba9 100644 --- a/binder/android/os/IVold.aidl +++ b/binder/android/os/IVold.aidl @@ -135,6 +135,7 @@ interface IVold { boolean incFsEnabled(); IncrementalFileSystemControlParcel mountIncFs(@utf8InCpp String backingPath, @utf8InCpp String targetDir, int flags); void unmountIncFs(@utf8InCpp String dir); + void setIncFsMountOptions(in IncrementalFileSystemControlParcel control, boolean enableReadLogs); void bindMount(@utf8InCpp String sourceDir, @utf8InCpp String targetDir); const int ENCRYPTION_FLAG_NO_UI = 4;