OSDN Git Service

DO NOT MERGE ANYWHERE: [AsyncChannel] Fix race in handling of sync result
authorMichael Plass <mplass@google.com>
Thu, 13 Jul 2017 17:09:07 +0000 (10:09 -0700)
committerKamaljeet Maini <kamaljeet@google.com>
Fri, 1 Sep 2017 16:42:27 +0000 (09:42 -0700)
Bug: 62866191
Bug: 63074860
Bug: 65267749
Test: wifi unit tests
Change-Id: I1d59eb8d599de9d9041e0b9b7d731363675a40c9
(cherry picked from commit 56e46134d364f7f293158979765336721a6c752c)
(cherry picked from commit 9c1d56576e01060f40de74a4c0e35e95064351be)

core/java/com/android/internal/util/AsyncChannel.java

index d8be9fd..6fbfff8 100644 (file)
@@ -768,9 +768,10 @@ public class AsyncChannel {
             /** Handle of the reply message */
             @Override
             public void handleMessage(Message msg) {
-                mResultMsg = Message.obtain();
-                mResultMsg.copyFrom(msg);
+                Message msgCopy = Message.obtain();
+                msgCopy.copyFrom(msg);
                 synchronized(mLockObject) {
+                    mResultMsg = msgCopy;
                     mLockObject.notify();
                 }
             }
@@ -812,22 +813,26 @@ public class AsyncChannel {
          */
         private static Message sendMessageSynchronously(Messenger dstMessenger, Message msg) {
             SyncMessenger sm = SyncMessenger.obtain();
+            Message resultMsg = null;
             try {
                 if (dstMessenger != null && msg != null) {
                     msg.replyTo = sm.mMessenger;
                     synchronized (sm.mHandler.mLockObject) {
+                        if (sm.mHandler.mResultMsg != null) {
+                            Slog.wtf(TAG, "mResultMsg should be null here");
+                            sm.mHandler.mResultMsg = null;
+                        }
                         dstMessenger.send(msg);
                         sm.mHandler.mLockObject.wait();
+                        resultMsg = sm.mHandler.mResultMsg;
+                        sm.mHandler.mResultMsg = null;
                     }
-                } else {
-                    sm.mHandler.mResultMsg = null;
                 }
             } catch (InterruptedException e) {
-                sm.mHandler.mResultMsg = null;
+                Slog.e(TAG, "error in sendMessageSynchronously", e);
             } catch (RemoteException e) {
-                sm.mHandler.mResultMsg = null;
+                Slog.e(TAG, "error in sendMessageSynchronously", e);
             }
-            Message resultMsg = sm.mHandler.mResultMsg;
             sm.recycle();
             return resultMsg;
         }