Move absolute axis validation from EventHub to InputDevice
We recently added a crash when a we receive a misconfigured event froma
device. However, it seems like our critera for determining if an
absolute axis is correctly configured has issues.
In this case, we ignore an axis if its min and max value are equal.
Since the min and max are inclusive, it's perfectly valid for them to be
equal. As long as evdev is reporting valid events, EventHub should
continue to track and report them.
Deeming axes with min and max values that are equal is an artificial
constraint we have placed in InputReader historically. To maintain that
same constraint as before, we move the validation to InputDevice.
Bug: 293156873
Test: Presubmit
Change-Id: Id7c841f2d06668536a1b61c0e9e5250c15aad550
diff --git a/services/inputflinger/reader/EventHub.cpp b/services/inputflinger/reader/EventHub.cpp
index bc4cdd1..e69c99e 100644
--- a/services/inputflinger/reader/EventHub.cpp
+++ b/services/inputflinger/reader/EventHub.cpp
@@ -643,9 +643,6 @@
identifier.name.c_str(), fd, strerror(errno));
continue;
}
- if (info.minimum == info.maximum) {
- continue;
- }
auto& [axisInfo, value] = absState[axis];
axisInfo.valid = true;
axisInfo.minValue = info.minimum;
@@ -778,26 +775,35 @@
LOG_ALWAYS_FATAL_IF(!currentFrameDropped &&
!keyState.set(static_cast<size_t>(event.code),
event.value != 0),
- "%s: received invalid EV_KEY event code: %s", __func__,
+ "%s: device '%s' received invalid EV_KEY event code: %s value: %d",
+ __func__, identifier.name.c_str(),
InputEventLookup::getLinuxEvdevLabel(EV_KEY, event.code, 1)
- .code.c_str());
+ .code.c_str(),
+ event.value);
break;
}
case EV_SW: {
LOG_ALWAYS_FATAL_IF(!currentFrameDropped &&
!swState.set(static_cast<size_t>(event.code),
event.value != 0),
- "%s: received invalid EV_SW event code: %s", __func__,
+ "%s: device '%s' received invalid EV_SW event code: %s value: %d",
+ __func__, identifier.name.c_str(),
InputEventLookup::getLinuxEvdevLabel(EV_SW, event.code, 1)
- .code.c_str());
+ .code.c_str(),
+ event.value);
break;
}
case EV_ABS: {
+ if (currentFrameDropped) {
+ break;
+ }
auto it = absState.find(event.code);
- LOG_ALWAYS_FATAL_IF(!currentFrameDropped && it == absState.end(),
- "%s: received invalid EV_ABS event code: %s", __func__,
+ LOG_ALWAYS_FATAL_IF(it == absState.end(),
+ "%s: device '%s' received invalid EV_ABS event code: %s value: %d",
+ __func__, identifier.name.c_str(),
InputEventLookup::getLinuxEvdevLabel(EV_ABS, event.code, 0)
- .code.c_str());
+ .code.c_str(),
+ event.value);
it->second.value = event.value;
break;
}