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

Commit 5265beb6 authored by Conrad Chen's avatar Conrad Chen
Browse files

Media: Eliminate NPE from race conditions

Race conditions may happen between
MediaSessionManager.SessionsChangedWrapper.release() and calling
onActiveSessionsChanged(), which might cause NPE. Copies member
variables as local variables to prevent that.

Test: cts-tradefed run cts -m MediaTest
Bug: 62841633
Change-Id: I69b6d155a1a5c475ab4bb317b60baa6f3a030e5a
parent 7fc2e746
Loading
Loading
Loading
Loading
+11 −6
Original line number Original line Diff line number Diff line
@@ -546,18 +546,23 @@ public final class MediaSessionManager {
        private final IActiveSessionsListener.Stub mStub = new IActiveSessionsListener.Stub() {
        private final IActiveSessionsListener.Stub mStub = new IActiveSessionsListener.Stub() {
            @Override
            @Override
            public void onActiveSessionsChanged(final List<MediaSession.Token> tokens) {
            public void onActiveSessionsChanged(final List<MediaSession.Token> tokens) {
                if (mHandler != null) {
                final Handler handler = mHandler;
                    mHandler.post(new Runnable() {
                if (handler != null) {
                    handler.post(new Runnable() {
                        @Override
                        @Override
                        public void run() {
                        public void run() {
                            if (mListener != null) {
                            final Context context = mContext;
                            if (context != null) {
                                ArrayList<MediaController> controllers
                                ArrayList<MediaController> controllers
                                        = new ArrayList<MediaController>();
                                        = new ArrayList<MediaController>();
                                int size = tokens.size();
                                int size = tokens.size();
                                for (int i = 0; i < size; i++) {
                                for (int i = 0; i < size; i++) {
                                    controllers.add(new MediaController(mContext, tokens.get(i)));
                                    controllers.add(new MediaController(context, tokens.get(i)));
                                }
                                final OnActiveSessionsChangedListener listener = mListener;
                                if (listener != null) {
                                    listener.onActiveSessionsChanged(controllers);
                                }
                                }
                                mListener.onActiveSessionsChanged(controllers);
                            }
                            }
                        }
                        }
                    });
                    });
@@ -566,8 +571,8 @@ public final class MediaSessionManager {
        };
        };


        private void release() {
        private void release() {
            mContext = null;
            mListener = null;
            mListener = null;
            mContext = null;
            mHandler = null;
            mHandler = null;
        }
        }
    }
    }