Loading apex/blobstore/service/java/com/android/server/blob/BlobAccessMode.java +1 −1 Original line number Diff line number Diff line Loading @@ -44,7 +44,7 @@ import java.util.Objects; /** * Class for representing how a blob can be shared. * * Note that this class is not thread-safe, callers need to take of synchronizing access. * Note that this class is not thread-safe, callers need to take care of synchronizing access. */ class BlobAccessMode { @Retention(RetentionPolicy.SOURCE) Loading apex/blobstore/service/java/com/android/server/blob/BlobMetadata.java +8 −4 Original line number Diff line number Diff line Loading @@ -61,6 +61,8 @@ import com.android.internal.util.IndentingPrintWriter; import com.android.internal.util.XmlUtils; import com.android.server.blob.BlobStoreManagerService.DumpArgs; import libcore.io.IoUtils; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlSerializer; Loading Loading @@ -349,14 +351,16 @@ class BlobMetadata { } catch (ErrnoException e) { throw e.rethrowAsIOException(); } synchronized (mMetadataLock) { return createRevocableFdLocked(fd, callingPackage); try { return createRevocableFd(fd, callingPackage); } catch (IOException e) { IoUtils.closeQuietly(fd); throw e; } } @GuardedBy("mMetadataLock") @NonNull private ParcelFileDescriptor createRevocableFdLocked(FileDescriptor fd, private ParcelFileDescriptor createRevocableFd(FileDescriptor fd, String callingPackage) throws IOException { final RevocableFileDescriptor revocableFd = new RevocableFileDescriptor(mContext, fd); Loading apex/blobstore/service/java/com/android/server/blob/BlobStoreSession.java +51 −32 Original line number Diff line number Diff line Loading @@ -59,6 +59,8 @@ import com.android.internal.util.XmlUtils; import com.android.server.blob.BlobStoreManagerService.DumpArgs; import com.android.server.blob.BlobStoreManagerService.SessionStateChangeListener; import libcore.io.IoUtils; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlSerializer; Loading Loading @@ -207,27 +209,37 @@ class BlobStoreSession extends IBlobStoreSession.Stub { throw new IllegalStateException("Not allowed to write in state: " + stateToString(mState)); } } FileDescriptor fd = null; try { return openWriteLocked(offsetBytes, lengthBytes); fd = openWriteInternal(offsetBytes, lengthBytes); final RevocableFileDescriptor revocableFd = new RevocableFileDescriptor(mContext, fd); synchronized (mSessionLock) { if (mState != STATE_OPENED) { IoUtils.closeQuietly(fd); throw new IllegalStateException("Not allowed to write in state: " + stateToString(mState)); } trackRevocableFdLocked(revocableFd); return revocableFd.getRevocableFileDescriptor(); } } catch (IOException e) { IoUtils.closeQuietly(fd); throw ExceptionUtils.wrap(e); } } } @GuardedBy("mSessionLock") @NonNull private ParcelFileDescriptor openWriteLocked(@BytesLong long offsetBytes, private FileDescriptor openWriteInternal(@BytesLong long offsetBytes, @BytesLong long lengthBytes) throws IOException { // TODO: Add limit on active open sessions/writes/reads FileDescriptor fd = null; try { final File sessionFile = getSessionFile(); if (sessionFile == null) { throw new IllegalStateException("Couldn't get the file for this session"); } fd = Os.open(sessionFile.getPath(), O_CREAT | O_RDWR, 0600); final FileDescriptor fd = Os.open(sessionFile.getPath(), O_CREAT | O_RDWR, 0600); if (offsetBytes > 0) { final long curOffset = Os.lseek(fd, offsetBytes, SEEK_SET); if (curOffset != offsetBytes) { Loading @@ -238,10 +250,10 @@ class BlobStoreSession extends IBlobStoreSession.Stub { if (lengthBytes > 0) { mContext.getSystemService(StorageManager.class).allocateBytes(fd, lengthBytes); } return fd; } catch (ErrnoException e) { e.rethrowAsIOException(); throw e.rethrowAsIOException(); } return createRevocableFdLocked(fd); } @Override Loading @@ -253,29 +265,40 @@ class BlobStoreSession extends IBlobStoreSession.Stub { throw new IllegalStateException("Not allowed to read in state: " + stateToString(mState)); } } FileDescriptor fd = null; try { return openReadLocked(); fd = openReadInternal(); final RevocableFileDescriptor revocableFd = new RevocableFileDescriptor(mContext, fd); synchronized (mSessionLock) { if (mState != STATE_OPENED) { IoUtils.closeQuietly(fd); throw new IllegalStateException("Not allowed to read in state: " + stateToString(mState)); } trackRevocableFdLocked(revocableFd); return revocableFd.getRevocableFileDescriptor(); } } catch (IOException e) { IoUtils.closeQuietly(fd); throw ExceptionUtils.wrap(e); } } } @GuardedBy("mSessionLock") @NonNull private ParcelFileDescriptor openReadLocked() throws IOException { FileDescriptor fd = null; private FileDescriptor openReadInternal() throws IOException { try { final File sessionFile = getSessionFile(); if (sessionFile == null) { throw new IllegalStateException("Couldn't get the file for this session"); } fd = Os.open(sessionFile.getPath(), O_RDONLY, 0); final FileDescriptor fd = Os.open(sessionFile.getPath(), O_RDONLY, 0); return fd; } catch (ErrnoException e) { e.rethrowAsIOException(); throw e.rethrowAsIOException(); } return createRevocableFdLocked(fd); } @Override Loading Loading @@ -396,7 +419,7 @@ class BlobStoreSession extends IBlobStoreSession.Stub { } mState = state; revokeAllFdsLocked(); revokeAllFds(); if (sendCallback) { mListener.onStateChanged(this); Loading Loading @@ -433,20 +456,17 @@ class BlobStoreSession extends IBlobStoreSession.Stub { } } @GuardedBy("mSessionLock") private void revokeAllFdsLocked() { private void revokeAllFds() { synchronized (mRevocableFds) { for (int i = mRevocableFds.size() - 1; i >= 0; --i) { mRevocableFds.get(i).revoke(); } mRevocableFds.clear(); } } @GuardedBy("mSessionLock") @NonNull private ParcelFileDescriptor createRevocableFdLocked(FileDescriptor fd) throws IOException { final RevocableFileDescriptor revocableFd = new RevocableFileDescriptor(mContext, fd); private void trackRevocableFdLocked(RevocableFileDescriptor revocableFd) { synchronized (mRevocableFds) { mRevocableFds.add(revocableFd); } Loading @@ -455,7 +475,6 @@ class BlobStoreSession extends IBlobStoreSession.Stub { mRevocableFds.remove(revocableFd); } }); return revocableFd.getRevocableFileDescriptor(); } @Nullable Loading Loading
apex/blobstore/service/java/com/android/server/blob/BlobAccessMode.java +1 −1 Original line number Diff line number Diff line Loading @@ -44,7 +44,7 @@ import java.util.Objects; /** * Class for representing how a blob can be shared. * * Note that this class is not thread-safe, callers need to take of synchronizing access. * Note that this class is not thread-safe, callers need to take care of synchronizing access. */ class BlobAccessMode { @Retention(RetentionPolicy.SOURCE) Loading
apex/blobstore/service/java/com/android/server/blob/BlobMetadata.java +8 −4 Original line number Diff line number Diff line Loading @@ -61,6 +61,8 @@ import com.android.internal.util.IndentingPrintWriter; import com.android.internal.util.XmlUtils; import com.android.server.blob.BlobStoreManagerService.DumpArgs; import libcore.io.IoUtils; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlSerializer; Loading Loading @@ -349,14 +351,16 @@ class BlobMetadata { } catch (ErrnoException e) { throw e.rethrowAsIOException(); } synchronized (mMetadataLock) { return createRevocableFdLocked(fd, callingPackage); try { return createRevocableFd(fd, callingPackage); } catch (IOException e) { IoUtils.closeQuietly(fd); throw e; } } @GuardedBy("mMetadataLock") @NonNull private ParcelFileDescriptor createRevocableFdLocked(FileDescriptor fd, private ParcelFileDescriptor createRevocableFd(FileDescriptor fd, String callingPackage) throws IOException { final RevocableFileDescriptor revocableFd = new RevocableFileDescriptor(mContext, fd); Loading
apex/blobstore/service/java/com/android/server/blob/BlobStoreSession.java +51 −32 Original line number Diff line number Diff line Loading @@ -59,6 +59,8 @@ import com.android.internal.util.XmlUtils; import com.android.server.blob.BlobStoreManagerService.DumpArgs; import com.android.server.blob.BlobStoreManagerService.SessionStateChangeListener; import libcore.io.IoUtils; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlSerializer; Loading Loading @@ -207,27 +209,37 @@ class BlobStoreSession extends IBlobStoreSession.Stub { throw new IllegalStateException("Not allowed to write in state: " + stateToString(mState)); } } FileDescriptor fd = null; try { return openWriteLocked(offsetBytes, lengthBytes); fd = openWriteInternal(offsetBytes, lengthBytes); final RevocableFileDescriptor revocableFd = new RevocableFileDescriptor(mContext, fd); synchronized (mSessionLock) { if (mState != STATE_OPENED) { IoUtils.closeQuietly(fd); throw new IllegalStateException("Not allowed to write in state: " + stateToString(mState)); } trackRevocableFdLocked(revocableFd); return revocableFd.getRevocableFileDescriptor(); } } catch (IOException e) { IoUtils.closeQuietly(fd); throw ExceptionUtils.wrap(e); } } } @GuardedBy("mSessionLock") @NonNull private ParcelFileDescriptor openWriteLocked(@BytesLong long offsetBytes, private FileDescriptor openWriteInternal(@BytesLong long offsetBytes, @BytesLong long lengthBytes) throws IOException { // TODO: Add limit on active open sessions/writes/reads FileDescriptor fd = null; try { final File sessionFile = getSessionFile(); if (sessionFile == null) { throw new IllegalStateException("Couldn't get the file for this session"); } fd = Os.open(sessionFile.getPath(), O_CREAT | O_RDWR, 0600); final FileDescriptor fd = Os.open(sessionFile.getPath(), O_CREAT | O_RDWR, 0600); if (offsetBytes > 0) { final long curOffset = Os.lseek(fd, offsetBytes, SEEK_SET); if (curOffset != offsetBytes) { Loading @@ -238,10 +250,10 @@ class BlobStoreSession extends IBlobStoreSession.Stub { if (lengthBytes > 0) { mContext.getSystemService(StorageManager.class).allocateBytes(fd, lengthBytes); } return fd; } catch (ErrnoException e) { e.rethrowAsIOException(); throw e.rethrowAsIOException(); } return createRevocableFdLocked(fd); } @Override Loading @@ -253,29 +265,40 @@ class BlobStoreSession extends IBlobStoreSession.Stub { throw new IllegalStateException("Not allowed to read in state: " + stateToString(mState)); } } FileDescriptor fd = null; try { return openReadLocked(); fd = openReadInternal(); final RevocableFileDescriptor revocableFd = new RevocableFileDescriptor(mContext, fd); synchronized (mSessionLock) { if (mState != STATE_OPENED) { IoUtils.closeQuietly(fd); throw new IllegalStateException("Not allowed to read in state: " + stateToString(mState)); } trackRevocableFdLocked(revocableFd); return revocableFd.getRevocableFileDescriptor(); } } catch (IOException e) { IoUtils.closeQuietly(fd); throw ExceptionUtils.wrap(e); } } } @GuardedBy("mSessionLock") @NonNull private ParcelFileDescriptor openReadLocked() throws IOException { FileDescriptor fd = null; private FileDescriptor openReadInternal() throws IOException { try { final File sessionFile = getSessionFile(); if (sessionFile == null) { throw new IllegalStateException("Couldn't get the file for this session"); } fd = Os.open(sessionFile.getPath(), O_RDONLY, 0); final FileDescriptor fd = Os.open(sessionFile.getPath(), O_RDONLY, 0); return fd; } catch (ErrnoException e) { e.rethrowAsIOException(); throw e.rethrowAsIOException(); } return createRevocableFdLocked(fd); } @Override Loading Loading @@ -396,7 +419,7 @@ class BlobStoreSession extends IBlobStoreSession.Stub { } mState = state; revokeAllFdsLocked(); revokeAllFds(); if (sendCallback) { mListener.onStateChanged(this); Loading Loading @@ -433,20 +456,17 @@ class BlobStoreSession extends IBlobStoreSession.Stub { } } @GuardedBy("mSessionLock") private void revokeAllFdsLocked() { private void revokeAllFds() { synchronized (mRevocableFds) { for (int i = mRevocableFds.size() - 1; i >= 0; --i) { mRevocableFds.get(i).revoke(); } mRevocableFds.clear(); } } @GuardedBy("mSessionLock") @NonNull private ParcelFileDescriptor createRevocableFdLocked(FileDescriptor fd) throws IOException { final RevocableFileDescriptor revocableFd = new RevocableFileDescriptor(mContext, fd); private void trackRevocableFdLocked(RevocableFileDescriptor revocableFd) { synchronized (mRevocableFds) { mRevocableFds.add(revocableFd); } Loading @@ -455,7 +475,6 @@ class BlobStoreSession extends IBlobStoreSession.Stub { mRevocableFds.remove(revocableFd); } }); return revocableFd.getRevocableFileDescriptor(); } @Nullable Loading