From 4bf22b5e9a3f595a7b5c1bb891078d0907507fb9 Mon Sep 17 00:00:00 2001 From: Neharika Jali Date: Wed, 5 Jan 2022 12:52:14 +0000 Subject: [PATCH] Fix numerical overflow in result in computeStorageCacheBytes Bug: 211756656 Test: atest atest frameworks/base/core/tests/coretests/src/android/os/storage/StorageManagerBaseTest#testGetStorageCacheBytesUnderModerateStorage Change-Id: I89fd358536708389d33e3077dcd0928332f5182f --- core/java/android/os/storage/StorageManager.java | 9 +++++---- .../src/android/os/storage/StorageManagerBaseTest.java | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java index 5e4057bd840db..29accb9b31876 100644 --- a/core/java/android/os/storage/StorageManager.java +++ b/core/java/android/os/storage/StorageManager.java @@ -1525,10 +1525,11 @@ public class StorageManager { result = totalBytes * CACHE_RESERVE_PERCENT_LOW / 100; } else { // Else, linearly interpolate the amount of space to reserve - result = ((CACHE_RESERVE_PERCENT_HIGH - CACHE_RESERVE_PERCENT_LOW) - * (usableBytes - storageThresholdHighBytes) + CACHE_RESERVE_PERCENT_HIGH - * (storageThresholdHighBytes - storageThresholdLowBytes)) * totalBytes - / (100 * (storageThresholdHighBytes - storageThresholdLowBytes)); + double slope = (CACHE_RESERVE_PERCENT_HIGH - CACHE_RESERVE_PERCENT_LOW) * totalBytes + / (100.0 * (storageThresholdHighBytes - storageThresholdLowBytes)); + double intercept = totalBytes * CACHE_RESERVE_PERCENT_LOW / 100.0 + - storageThresholdLowBytes * slope; + result = Math.round(slope * usableBytes + intercept); } return result; } diff --git a/core/tests/coretests/src/android/os/storage/StorageManagerBaseTest.java b/core/tests/coretests/src/android/os/storage/StorageManagerBaseTest.java index 7ccbb0150cb67..e6660f32f8174 100644 --- a/core/tests/coretests/src/android/os/storage/StorageManagerBaseTest.java +++ b/core/tests/coretests/src/android/os/storage/StorageManagerBaseTest.java @@ -170,7 +170,7 @@ public class StorageManagerBaseTest extends InstrumentationTestCase { when(mFile.getUsableSpace()).thenReturn(10000L); when(mFile.getTotalSpace()).thenReturn(100000L); long result = mSm.getStorageCacheBytes(mFile, 0); - assertThat(result).isEqualTo(4666L); + assertThat(result).isEqualTo(4667L); } /**