From 0bfffa6b25284dd1195ce95d9b35e35546185798 Mon Sep 17 00:00:00 2001 From: Sudheer Shanka Date: Wed, 2 Jun 2021 00:23:09 -0700 Subject: [PATCH] Don't attribute a blob to a user if there are leasees from other users. Bug: 187460239 Test: atest --test-mapping apex/blobstore Change-Id: I5e9c0473e4c058d430ed012a3ca3ee63f3595821 --- .../java/com/android/server/blob/BlobMetadata.java | 13 +++++++++++++ .../server/blob/BlobStoreManagerService.java | 5 +++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/apex/blobstore/service/java/com/android/server/blob/BlobMetadata.java b/apex/blobstore/service/java/com/android/server/blob/BlobMetadata.java index e116c8189f91f..300b50984c6c2 100644 --- a/apex/blobstore/service/java/com/android/server/blob/BlobMetadata.java +++ b/apex/blobstore/service/java/com/android/server/blob/BlobMetadata.java @@ -403,6 +403,19 @@ class BlobMetadata { return null; } + boolean shouldAttributeToUser(int userId) { + synchronized (mMetadataLock) { + for (int i = 0, size = mLeasees.size(); i < size; ++i) { + final Leasee leasee = mLeasees.valueAt(i); + // Don't attribute the blob to userId if there is a lease on it from another user. + if (userId != UserHandle.getUserId(leasee.uid)) { + return false; + } + } + } + return true; + } + boolean shouldAttributeToLeasee(@NonNull String packageName, int userId, boolean callerHasStatsPermission) { if (!isALeaseeInUser(packageName, INVALID_UID, userId)) { diff --git a/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerService.java b/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerService.java index beeffd633a83f..96114dcb66a7d 100644 --- a/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerService.java +++ b/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerService.java @@ -1333,9 +1333,10 @@ public class BlobStoreManagerService extends SystemService { blobsDataSize.getAndAdd(session.getSize()); }, userHandle.getIdentifier()); - // TODO(http://b/187460239): Update this to only include blobs available to userId. forEachBlob(blobMetadata -> { - blobsDataSize.getAndAdd(blobMetadata.getSize()); + if (blobMetadata.shouldAttributeToUser(userHandle.getIdentifier())) { + blobsDataSize.getAndAdd(blobMetadata.getSize()); + } }); stats.dataSize += blobsDataSize.get();