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

Commit d59b2d06 authored by Siarhei Vishniakou's avatar Siarhei Vishniakou
Browse files

Initialize PointerCoords in input tests

The struct PointerCoords in VelocityTracker_test is created on the
stack, but never initialized. Later, the coords are used to add an x and
y value to the MotionEvent.

The field "bits" in the struct is therefore initialized to whatever was
previously occupying that stack address.
It is possible that stack contained some non-zero data. This would cause
enough of the bits of the 'bits' variable to be set, but without any of
them being X or Y. As a result, when a new X or Y value is assigned, it
does not fit into the bits (there's a 30-axes limit), and therefore
remains at zero.

Later, when velocity is computed, the coordinates evaluate to zero, and
therefore, zero velocity is produced. The test fails, because a non-zero
velocity is expected.

After an audit of the entire Android codebase for usage of
PointerCoords, found another potential issue in InputClassifier_test.
Likely the code was copied over from VelocityTracker_test. Add a fix for
that as well.

Bug: 126536349
Test: atest -it -a libinput_tests, but only executed after building and
flashing asanified libinput and libinput_tests onto device.

Change-Id: Id8b870b6201d7489284bf9fc646750770bb9321a
Merged-In: Id8b870b6201d7489284bf9fc646750770bb9321a
parent 22a3ef22
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -88,7 +88,9 @@ MotionEvent* createSimpleMotionEvent(const Position* positions, size_t numSample

    MotionEvent* event = new MotionEvent();
    PointerCoords coords;
    PointerProperties properties[1];
    coords.clear();
    constexpr size_t pointerCount = 1;
    PointerProperties properties[pointerCount];

    properties[0].id = DEFAULT_POINTER_ID;
    properties[0].toolType = AMOTION_EVENT_TOOL_TYPE_FINGER;
@@ -97,7 +99,7 @@ MotionEvent* createSimpleMotionEvent(const Position* positions, size_t numSample
    coords.setAxisValue(AMOTION_EVENT_AXIS_X, positions[0].x);
    coords.setAxisValue(AMOTION_EVENT_AXIS_Y, positions[0].y);
    event->initialize(0, AINPUT_SOURCE_TOUCHSCREEN, AMOTION_EVENT_ACTION_MOVE,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, positions[0].time, 1, properties, &coords);
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, positions[0].time, pointerCount, properties, &coords);

    for (size_t i = 1; i < numSamples; i++) {
        coords.setAxisValue(AMOTION_EVENT_AXIS_X, positions[i].x);