Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b6e02f7b authored by Alex Buynytskyy's avatar Alex Buynytskyy
Browse files

Removing race condition accessing shared binder object.

Test: incrementally installing two apks at the same time
Bug: b/150411019
Change-Id: I81231edf7a32470542ec529aa305b4f9fb2b80e3
parent 8ad73672
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -29,9 +29,9 @@ oneway interface IDataLoader {
   void create(int id, in DataLoaderParamsParcel params,
           in FileSystemControlParcel control,
           IDataLoaderStatusListener listener);
   void start();
   void stop();
   void destroy();
   void start(int id);
   void stop(int id);
   void destroy(int id);

   void prepareImage(in InstallationFileParcel[] addedFiles, in @utf8InCpp String[] removedFiles);
   void prepareImage(int id, in InstallationFileParcel[] addedFiles, in @utf8InCpp String[] removedFiles);
}
+16 −18
Original line number Diff line number Diff line
@@ -102,21 +102,18 @@ public abstract class DataLoaderService extends Service {
    }

    private class DataLoaderBinderService extends IDataLoader.Stub {
        private int mId;

        @Override
        public void create(int id, @NonNull DataLoaderParamsParcel params,
                @NonNull FileSystemControlParcel control,
                @NonNull IDataLoaderStatusListener listener)
                throws RuntimeException {
            mId = id;
            try {
                if (!nativeCreateDataLoader(id, control, params, listener)) {
                    Slog.e(TAG, "Failed to create native loader for " + mId);
                    Slog.e(TAG, "Failed to create native loader for " + id);
                }
            } catch (Exception ex) {
                Slog.e(TAG, "Failed to create native loader for " + mId, ex);
                destroy();
                Slog.e(TAG, "Failed to create native loader for " + id, ex);
                destroy(id);
                throw new RuntimeException(ex);
            } finally {
                // Closing FDs.
@@ -150,30 +147,31 @@ public abstract class DataLoaderService extends Service {
        }

        @Override
        public void start() {
            if (!nativeStartDataLoader(mId)) {
                Slog.e(TAG, "Failed to start loader: " + mId);
        public void start(int id) {
            if (!nativeStartDataLoader(id)) {
                Slog.e(TAG, "Failed to start loader: " + id);
            }
        }

        @Override
        public void stop() {
            if (!nativeStopDataLoader(mId)) {
                Slog.w(TAG, "Failed to stop loader: " + mId);
        public void stop(int id) {
            if (!nativeStopDataLoader(id)) {
                Slog.w(TAG, "Failed to stop loader: " + id);
            }
        }

        @Override
        public void destroy() {
            if (!nativeDestroyDataLoader(mId)) {
                Slog.w(TAG, "Failed to destroy loader: " + mId);
        public void destroy(int id) {
            if (!nativeDestroyDataLoader(id)) {
                Slog.w(TAG, "Failed to destroy loader: " + id);
            }
        }

        @Override
        public void prepareImage(InstallationFileParcel[] addedFiles, String[] removedFiles) {
            if (!nativePrepareImage(mId, addedFiles, removedFiles)) {
                Slog.w(TAG, "Failed to prepare image for data loader: " + mId);
        public void prepareImage(int id, InstallationFileParcel[] addedFiles,
                String[] removedFiles) {
            if (!nativePrepareImage(id, addedFiles, removedFiles)) {
                Slog.w(TAG, "Failed to prepare image for data loader: " + id);
            }
        }
    }
+1 −1
Original line number Diff line number Diff line
@@ -213,7 +213,7 @@ public class DataLoaderManagerService extends SystemService {

        void destroy() {
            try {
                mDataLoader.destroy();
                mDataLoader.destroy(mId);
            } catch (RemoteException ignored) {
            }
            mContext.unbindService(this);
+4 −3
Original line number Diff line number Diff line
@@ -2582,12 +2582,13 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
                            if (manualStartAndDestroy) {
                                // IncrementalFileStorages will call start after all files are
                                // created in IncFS.
                                dataLoader.start();
                                dataLoader.start(dataLoaderId);
                            }
                            break;
                        }
                        case IDataLoaderStatusListener.DATA_LOADER_STARTED: {
                            dataLoader.prepareImage(
                                    dataLoaderId,
                                    addedFiles.toArray(
                                            new InstallationFileParcel[addedFiles.size()]),
                                    removedFiles.toArray(new String[removedFiles.size()]));
@@ -2602,7 +2603,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
                                dispatchStreamValidateAndCommit();
                            }
                            if (manualStartAndDestroy) {
                                dataLoader.destroy();
                                dataLoader.destroy(dataLoaderId);
                            }
                            break;
                        }
@@ -2612,7 +2613,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
                                    new PackageManagerException(INSTALL_FAILED_MEDIA_UNAVAILABLE,
                                            "Failed to prepare image."));
                            if (manualStartAndDestroy) {
                                dataLoader.destroy();
                                dataLoader.destroy(dataLoaderId);
                            }
                            break;
                        }
+1 −1
Original line number Diff line number Diff line
@@ -941,7 +941,7 @@ bool IncrementalService::startDataLoader(MountId mountId) const {
    if (!dataloader) {
        return false;
    }
    status = dataloader->start();
    status = dataloader->start(mountId);
    if (!status.isOk()) {
        return false;
    }
Loading