From baf2d6448e1558f7c453497c85e5845b46f9cbec Mon Sep 17 00:00:00 2001 From: Jing Ji Date: Wed, 4 Mar 2020 10:31:53 -0800 Subject: [PATCH] Check the isInUse with the lock held in MessageQueue Fix a potential race condtion when the same message object is being enqueued by two threads. Bug: 150263007 Bug: 154867444 Test: atest android.os.cts.MessageQueueTest Change-Id: Id79448ba8719479cbdb054f2cdd172fdcbe86d47 (cherry picked from commit 96a6fec4d651607f0f0b659dd2e8dccaa9b1ed43) --- core/java/android/os/MessageQueue.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/core/java/android/os/MessageQueue.java b/core/java/android/os/MessageQueue.java index dfa5b26142f8c..1a3cf2d2c6345 100644 --- a/core/java/android/os/MessageQueue.java +++ b/core/java/android/os/MessageQueue.java @@ -550,11 +550,12 @@ public final class MessageQueue { if (msg.target == null) { throw new IllegalArgumentException("Message must have a target."); } - if (msg.isInUse()) { - throw new IllegalStateException(msg + " This message is already in use."); - } synchronized (this) { + if (msg.isInUse()) { + throw new IllegalStateException(msg + " This message is already in use."); + } + if (mQuitting) { IllegalStateException e = new IllegalStateException( msg.target + " sending message to a Handler on a dead thread");