diff options
Diffstat (limited to 'apex/blobstore')
3 files changed, 34 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 7e8c90632fd9..31532788291c 100644 --- a/apex/blobstore/service/java/com/android/server/blob/BlobMetadata.java +++ b/apex/blobstore/service/java/com/android/server/blob/BlobMetadata.java @@ -354,7 +354,11 @@ class BlobMetadata { throw e.rethrowAsIOException(); } try { - return createRevocableFd(fd, callingPackage); + if (BlobStoreConfig.shouldUseRevocableFdForReads()) { + return createRevocableFd(fd, callingPackage); + } else { + return new ParcelFileDescriptor(fd); + } } catch (IOException e) { IoUtils.closeQuietly(fd); throw e; diff --git a/apex/blobstore/service/java/com/android/server/blob/BlobStoreConfig.java b/apex/blobstore/service/java/com/android/server/blob/BlobStoreConfig.java index 08ee24460722..d780d5dab14d 100644 --- a/apex/blobstore/service/java/com/android/server/blob/BlobStoreConfig.java +++ b/apex/blobstore/service/java/com/android/server/blob/BlobStoreConfig.java @@ -122,6 +122,15 @@ class BlobStoreConfig { public static long COMMIT_COOL_OFF_DURATION_MS = DEFAULT_COMMIT_COOL_OFF_DURATION_MS; + /** + * Denotes whether to use RevocableFileDescriptor when apps try to read session/blob data. + */ + public static final String KEY_USE_REVOCABLE_FD_FOR_READS = + "use_revocable_fd_for_reads"; + public static final boolean DEFAULT_USE_REVOCABLE_FD_FOR_READS = true; + public static boolean USE_REVOCABLE_FD_FOR_READS = + DEFAULT_USE_REVOCABLE_FD_FOR_READS; + static void refresh(Properties properties) { if (!NAMESPACE_BLOBSTORE.equals(properties.getNamespace())) { return; @@ -151,6 +160,10 @@ class BlobStoreConfig { COMMIT_COOL_OFF_DURATION_MS = properties.getLong(key, DEFAULT_COMMIT_COOL_OFF_DURATION_MS); break; + case KEY_USE_REVOCABLE_FD_FOR_READS: + USE_REVOCABLE_FD_FOR_READS = properties.getBoolean(key, + DEFAULT_USE_REVOCABLE_FD_FOR_READS); + break; default: Slog.wtf(TAG, "Unknown key in device config properties: " + key); } @@ -178,6 +191,8 @@ class BlobStoreConfig { fout.println(String.format(dumpFormat, KEY_COMMIT_COOL_OFF_DURATION_MS, TimeUtils.formatDuration(COMMIT_COOL_OFF_DURATION_MS), TimeUtils.formatDuration(DEFAULT_COMMIT_COOL_OFF_DURATION_MS))); + fout.println(String.format(dumpFormat, KEY_USE_REVOCABLE_FD_FOR_READS, + USE_REVOCABLE_FD_FOR_READS, DEFAULT_USE_REVOCABLE_FD_FOR_READS)); } } @@ -242,6 +257,13 @@ class BlobStoreConfig { < System.currentTimeMillis(); } + /** + * Return whether to use RevocableFileDescriptor when apps try to read session/blob data. + */ + public static boolean shouldUseRevocableFdForReads() { + return DeviceConfigProperties.USE_REVOCABLE_FD_FOR_READS; + } + @Nullable public static File prepareBlobFile(long sessionId) { final File blobsDir = prepareBlobsDir(); diff --git a/apex/blobstore/service/java/com/android/server/blob/BlobStoreSession.java b/apex/blobstore/service/java/com/android/server/blob/BlobStoreSession.java index 77ca4aa7a9e6..28f7e75fd0e8 100644 --- a/apex/blobstore/service/java/com/android/server/blob/BlobStoreSession.java +++ b/apex/blobstore/service/java/com/android/server/blob/BlobStoreSession.java @@ -266,6 +266,13 @@ class BlobStoreSession extends IBlobStoreSession.Stub { throw new IllegalStateException("Not allowed to read in state: " + stateToString(mState)); } + if (!BlobStoreConfig.shouldUseRevocableFdForReads()) { + try { + return new ParcelFileDescriptor(openReadInternal()); + } catch (IOException e) { + throw ExceptionUtils.wrap(e); + } + } } FileDescriptor fd = null; @@ -281,7 +288,6 @@ class BlobStoreSession extends IBlobStoreSession.Stub { trackRevocableFdLocked(revocableFd); return revocableFd.getRevocableFileDescriptor(); } - } catch (IOException e) { IoUtils.closeQuietly(fd); throw ExceptionUtils.wrap(e); |