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

Commit 7999039b authored by Jeff Brown's avatar Jeff Brown
Browse files

Fix race condition in fallback key processing.

Need to ensure that the channel is still valid before proceeding.

Bug: 3271482
Change-Id: Ia6863cbedd9b53cbc5c9c8815e9ea90bef3d2218
parent 4f9da642
Loading
Loading
Loading
Loading
+12 −4
Original line number Diff line number Diff line
@@ -908,6 +908,7 @@ void InputDispatcher::resumeAfterTargetsNotReadyTimeoutLocked(nsecs_t newTimeout
            ssize_t connectionIndex = getConnectionIndexLocked(inputChannel);
            if (connectionIndex >= 0) {
                sp<Connection> connection = mConnectionsByReceiveFd.valueAt(connectionIndex);
                if (connection->status == Connection::STATUS_NORMAL) {
                    synthesizeCancelationEventsForConnectionLocked(
                            connection, InputState::CANCEL_ALL_EVENTS,
                            "application not responding");
@@ -915,6 +916,7 @@ void InputDispatcher::resumeAfterTargetsNotReadyTimeoutLocked(nsecs_t newTimeout
            }
        }
    }
}

nsecs_t InputDispatcher::getTimeSpentWaitingForApplicationLocked(
        nsecs_t currentTime) {
@@ -3056,7 +3058,7 @@ void InputDispatcher::doDispatchCycleFinishedLockedInterruptible(
                    // the original UP in which case we would not generate the fallback UP.
                    synthesizeCancelationEventsForConnectionLocked(connection,
                            InputState::CANCEL_FALLBACK_EVENTS,
                            "Application handled a non-fallback event.");
                            "application handled a non-fallback event, canceling all fallback events");
                } else {
                    // If the application did not handle a non-fallback key, then ask
                    // the policy what to do with it.  We might generate a fallback key
@@ -3071,6 +3073,12 @@ void InputDispatcher::doDispatchCycleFinishedLockedInterruptible(

                    mLock.lock();

                    if (connection->status != Connection::STATUS_NORMAL) {
                        return;
                    }

                    assert(connection->outboundQueue.headSentinel.next == dispatchEntry);

                    if (fallback) {
                        // Restart the dispatch cycle using the fallback key.
                        keyEntry->eventTime = event.getEventTime();