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

Commit f7f93f5f authored by Liana Kazanova (xWF)'s avatar Liana Kazanova (xWF) Committed by Android (Google) Code Review
Browse files

Revert "Reject inconsistent globally injected events"

This reverts commit f6abbf4b.

Reason for revert: DroidMonitor: Potential culprit for http://b/372964183 - verifying through ABTD before revert submission. This is part of the standard investigation process, and does not mean your CL will be reverted

Change-Id: I9cdb4dfb4ca14a90d7527e5f546380ea6ec1d62f
parent f6abbf4b
Loading
Loading
Loading
Loading
+0 −3
Original line number Diff line number Diff line
@@ -250,9 +250,6 @@ class MotionEventBuilder {
public:
    MotionEventBuilder(int32_t action, int32_t source) {
        mAction = action;
        if (mAction == AMOTION_EVENT_ACTION_CANCEL) {
            mFlags |= AMOTION_EVENT_FLAG_CANCELED;
        }
        mSource = source;
        mEventTime = systemTime(SYSTEM_TIME_MONOTONIC);
        mDownTime = mEventTime;
+26 −37
Original line number Diff line number Diff line
@@ -4796,39 +4796,6 @@ void InputDispatcher::notifyPointerCaptureChanged(const NotifyPointerCaptureChan
    }
}

bool InputDispatcher::shouldRejectInjectedMotionLocked(const MotionEvent& motionEvent,
                                                       DeviceId deviceId,
                                                       ui::LogicalDisplayId displayId,
                                                       std::optional<gui::Uid> targetUid,
                                                       int32_t flags) {
    // Don't verify targeted injection, since it will only affect the caller's
    // window, and the windows are typically destroyed at the end of the test.
    if (targetUid.has_value()) {
        return false;
    }

    // Verify all other injected streams, whether the injection is coming from apps or from
    // input filter. Print an error if the stream becomes inconsistent with this event.
    // An inconsistent injected event sent could cause a crash in the later stages of
    // dispatching pipeline.
    auto [it, _] = mInputFilterVerifiersByDisplay.try_emplace(displayId,
                                                              std::string("Injection on ") +
                                                                      displayId.toString());
    InputVerifier& verifier = it->second;

    Result<void> result =
            verifier.processMovement(deviceId, motionEvent.getSource(), motionEvent.getAction(),
                                     motionEvent.getPointerCount(),
                                     motionEvent.getPointerProperties(),
                                     motionEvent.getSamplePointerCoords(), flags);
    if (!result.ok()) {
        logDispatchStateLocked();
        LOG(ERROR) << "Inconsistent event: " << motionEvent << ", reason: " << result.error();
        return true;
    }
    return false;
}

InputEventInjectionResult InputDispatcher::injectInputEvent(const InputEvent* event,
                                                            std::optional<gui::Uid> targetUid,
                                                            InputEventInjectionSync syncMode,
@@ -4939,11 +4906,33 @@ InputEventInjectionResult InputDispatcher::injectInputEvent(const InputEvent* ev

            mLock.lock();

            if (shouldRejectInjectedMotionLocked(motionEvent, resolvedDeviceId, displayId,
                                                 targetUid, flags)) {
            {
                // Verify all injected streams, whether the injection is coming from apps or from
                // input filter. Print an error if the stream becomes inconsistent with this event.
                // An inconsistent injected event sent could cause a crash in the later stages of
                // dispatching pipeline.
                auto [it, _] =
                        mInputFilterVerifiersByDisplay.try_emplace(displayId,
                                                                   std::string("Injection on ") +
                                                                           displayId.toString());
                InputVerifier& verifier = it->second;

                Result<void> result =
                        verifier.processMovement(resolvedDeviceId, motionEvent.getSource(),
                                                 motionEvent.getAction(),
                                                 motionEvent.getPointerCount(),
                                                 motionEvent.getPointerProperties(),
                                                 motionEvent.getSamplePointerCoords(), flags);
                if (!result.ok()) {
                    logDispatchStateLocked();
                    LOG(ERROR) << "Inconsistent event: " << motionEvent
                               << ", reason: " << result.error();
                    if (policyFlags & POLICY_FLAG_INJECTED_FROM_ACCESSIBILITY) {
                        mLock.unlock();
                        return InputEventInjectionResult::FAILED;
                    }
                }
            }

            const nsecs_t* sampleEventTimes = motionEvent.getSampleEventTimes();
            const size_t pointerCount = motionEvent.getPointerCount();
+0 −4
Original line number Diff line number Diff line
@@ -299,10 +299,6 @@ private:

    // Event injection and synchronization.
    std::condition_variable mInjectionResultAvailable;
    bool shouldRejectInjectedMotionLocked(const MotionEvent& motion, DeviceId deviceId,
                                          ui::LogicalDisplayId displayId,
                                          std::optional<gui::Uid> targetUid, int32_t flags)
            REQUIRES(mLock);
    void setInjectionResult(const EventEntry& entry,
                            android::os::InputEventInjectionResult injectionResult);
    void transformMotionEntryForInjectionLocked(MotionEntry&,
+0 −16
Original line number Diff line number Diff line
@@ -12889,22 +12889,6 @@ TEST_F(InputDispatcherDragTests, DragAndDropFinishedWhenCancelCurrentTouch) {
    // Remove drag window
    mDispatcher->onWindowInfosChanged({{*mWindow->getInfo(), *mSecondWindow->getInfo()}, {}, 0, 0});
    // Complete the first event stream, even though the injection will fail because there aren't any
    // valid targets to dispatch this event to. This is still needed to make the input stream
    // consistent
    ASSERT_EQ(InputEventInjectionResult::FAILED,
              injectMotionEvent(*mDispatcher,
                                MotionEventBuilder(ACTION_CANCEL, AINPUT_SOURCE_TOUCHSCREEN)
                                        .displayId(ui::LogicalDisplayId::DEFAULT)
                                        .pointer(PointerBuilder(/*id=*/0, ToolType::FINGER)
                                                         .x(150)
                                                         .y(50))
                                        .pointer(PointerBuilder(/*id=*/1, ToolType::FINGER)
                                                         .x(50)
                                                         .y(50))
                                        .build(),
                                INJECT_EVENT_TIMEOUT, InputEventInjectionSync::WAIT_FOR_RESULT));
    // Inject a simple gesture, ensure dispatcher not crashed
    ASSERT_EQ(InputEventInjectionResult::SUCCEEDED,
              injectMotionDown(*mDispatcher, AINPUT_SOURCE_TOUCHSCREEN,