blob: 5442a65f2f429a0675099f8abcb7ee791571c2dd [file] [log] [blame]
Michael Ensing0f0ca6e2021-01-12 16:13:20 -08001/*
2 * Copyright 2022 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <InputReader.h>
18#include <MapperHelpers.h>
19#include <fuzzer/FuzzedDataProvider.h>
20#include <input/InputDevice.h>
21#include <chrono>
22#include <thread>
23
24namespace android {
25
26constexpr InputDeviceSensorType kInputDeviceSensorType[] = {
27 InputDeviceSensorType::ACCELEROMETER,
28 InputDeviceSensorType::MAGNETIC_FIELD,
29 InputDeviceSensorType::ORIENTATION,
30 InputDeviceSensorType::GYROSCOPE,
31 InputDeviceSensorType::LIGHT,
32 InputDeviceSensorType::PRESSURE,
33 InputDeviceSensorType::TEMPERATURE,
34 InputDeviceSensorType::PROXIMITY,
35 InputDeviceSensorType::GRAVITY,
36 InputDeviceSensorType::LINEAR_ACCELERATION,
37 InputDeviceSensorType::ROTATION_VECTOR,
38 InputDeviceSensorType::RELATIVE_HUMIDITY,
39 InputDeviceSensorType::AMBIENT_TEMPERATURE,
40 InputDeviceSensorType::MAGNETIC_FIELD_UNCALIBRATED,
41 InputDeviceSensorType::GAME_ROTATION_VECTOR,
42 InputDeviceSensorType::GYROSCOPE_UNCALIBRATED,
43 InputDeviceSensorType::SIGNIFICANT_MOTION,
44};
45
46class FuzzInputReader : public InputReaderInterface {
47public:
48 FuzzInputReader(std::shared_ptr<EventHubInterface> fuzzEventHub,
49 const sp<InputReaderPolicyInterface>& fuzzPolicy,
50 InputListenerInterface& fuzzListener) {
51 reader = std::make_unique<InputReader>(fuzzEventHub, fuzzPolicy, fuzzListener);
52 }
53
54 void dump(std::string& dump) { reader->dump(dump); }
55
56 void monitor() { reader->monitor(); }
57
Michael Ensing0f0ca6e2021-01-12 16:13:20 -080058 status_t start() { return reader->start(); }
59
60 status_t stop() { return reader->stop(); }
61
62 std::vector<InputDeviceInfo> getInputDevices() const { return reader->getInputDevices(); }
63
64 int32_t getScanCodeState(int32_t deviceId, uint32_t sourceMask, int32_t scanCode) {
65 return reader->getScanCodeState(deviceId, sourceMask, scanCode);
66 }
67
68 int32_t getKeyCodeState(int32_t deviceId, uint32_t sourceMask, int32_t keyCode) {
69 return reader->getKeyCodeState(deviceId, sourceMask, keyCode);
70 }
71
72 int32_t getSwitchState(int32_t deviceId, uint32_t sourceMask, int32_t sw) {
73 return reader->getSwitchState(deviceId, sourceMask, sw);
74 }
75
76 void toggleCapsLockState(int32_t deviceId) { reader->toggleCapsLockState(deviceId); }
77
78 bool hasKeys(int32_t deviceId, uint32_t sourceMask, const std::vector<int32_t>& keyCodes,
79 uint8_t* outFlags) {
80 return reader->hasKeys(deviceId, sourceMask, keyCodes, outFlags);
81 }
82
Prabir Pradhan4bf6d452023-04-18 21:26:56 +000083 void requestRefreshConfiguration(ConfigurationChanges changes) {
Michael Ensing0f0ca6e2021-01-12 16:13:20 -080084 reader->requestRefreshConfiguration(changes);
85 }
86
87 void vibrate(int32_t deviceId, const VibrationSequence& sequence, ssize_t repeat,
88 int32_t token) {
89 reader->vibrate(deviceId, sequence, repeat, token);
90 }
91
92 void cancelVibrate(int32_t deviceId, int32_t token) { reader->cancelVibrate(deviceId, token); }
93
94 bool isVibrating(int32_t deviceId) { return reader->isVibrating(deviceId); }
95
96 std::vector<int32_t> getVibratorIds(int32_t deviceId) {
97 return reader->getVibratorIds(deviceId);
98 }
99
100 std::optional<int32_t> getBatteryCapacity(int32_t deviceId) {
101 return reader->getBatteryCapacity(deviceId);
102 }
103
104 std::optional<int32_t> getBatteryStatus(int32_t deviceId) {
105 return reader->getBatteryStatus(deviceId);
106 }
107
Prabir Pradhane287ecd2022-09-07 21:18:05 +0000108 std::optional<std::string> getBatteryDevicePath(int32_t deviceId) {
109 return reader->getBatteryDevicePath(deviceId);
110 }
111
Michael Ensing0f0ca6e2021-01-12 16:13:20 -0800112 std::vector<InputDeviceLightInfo> getLights(int32_t deviceId) {
113 return reader->getLights(deviceId);
114 }
115
116 std::vector<InputDeviceSensorInfo> getSensors(int32_t deviceId) {
117 return reader->getSensors(deviceId);
118 }
119
Omar Abdelmonem5e70e962024-08-06 09:38:42 +0000120 std::optional<HardwareProperties> getTouchpadHardwareProperties(int32_t deviceId) {
121 return reader->getTouchpadHardwareProperties(deviceId);
122 }
123
Linnan Li13bf76a2024-05-05 19:18:02 +0800124 bool canDispatchToDisplay(int32_t deviceId, ui::LogicalDisplayId displayId) {
Michael Ensing0f0ca6e2021-01-12 16:13:20 -0800125 return reader->canDispatchToDisplay(deviceId, displayId);
126 }
127
128 bool enableSensor(int32_t deviceId, InputDeviceSensorType sensorType,
129 std::chrono::microseconds samplingPeriod,
130 std::chrono::microseconds maxBatchReportLatency) {
131 return reader->enableSensor(deviceId, sensorType, samplingPeriod, maxBatchReportLatency);
132 }
133
134 void disableSensor(int32_t deviceId, InputDeviceSensorType sensorType) {
135 return reader->disableSensor(deviceId, sensorType);
136 }
137
138 void flushSensor(int32_t deviceId, InputDeviceSensorType sensorType) {
139 return reader->flushSensor(deviceId, sensorType);
140 }
141
142 bool setLightColor(int32_t deviceId, int32_t lightId, int32_t color) {
143 return reader->setLightColor(deviceId, lightId, color);
144 }
145
146 bool setLightPlayerId(int32_t deviceId, int32_t lightId, int32_t playerId) {
147 return reader->setLightPlayerId(deviceId, lightId, playerId);
148 }
149
150 std::optional<int32_t> getLightColor(int32_t deviceId, int32_t lightId) {
151 return reader->getLightColor(deviceId, lightId);
152 }
153
154 std::optional<int32_t> getLightPlayerId(int32_t deviceId, int32_t lightId) {
155 return reader->getLightPlayerId(deviceId, lightId);
156 }
157
158 int32_t getKeyCodeForKeyLocation(int32_t deviceId, int32_t locationKeyCode) const {
159 return reader->getKeyCodeForKeyLocation(deviceId, locationKeyCode);
160 }
161
Prabir Pradhanb54ffb22022-10-27 18:03:34 +0000162 std::optional<std::string> getBluetoothAddress(int32_t deviceId) const {
163 return reader->getBluetoothAddress(deviceId);
164 }
165
Vaibhav Devmurari5fc7d852023-03-17 18:43:33 +0000166 void sysfsNodeChanged(const std::string& sysfsNodePath) {
167 reader->sysfsNodeChanged(sysfsNodePath);
168 }
169
Prabir Pradhan018faea2024-05-08 21:52:54 +0000170 DeviceId getLastUsedInputDeviceId() override { return reader->getLastUsedInputDeviceId(); }
171
Arpit Singh849beb42024-06-06 07:14:17 +0000172 void notifyMouseCursorFadedOnTyping() override { reader->notifyMouseCursorFadedOnTyping(); }
173
Michael Ensing0f0ca6e2021-01-12 16:13:20 -0800174private:
175 std::unique_ptr<InputReaderInterface> reader;
176};
177
178extern "C" int LLVMFuzzerTestOneInput(uint8_t* data, size_t size) {
Aditya Wazireea5be02022-10-31 12:40:10 +0530179 std::shared_ptr<ThreadSafeFuzzedDataProvider> fdp =
180 std::make_shared<ThreadSafeFuzzedDataProvider>(data, size);
Michael Ensing0f0ca6e2021-01-12 16:13:20 -0800181
182 FuzzInputListener fuzzListener;
183 sp<FuzzInputReaderPolicy> fuzzPolicy = sp<FuzzInputReaderPolicy>::make(fdp);
184 std::shared_ptr<FuzzEventHub> fuzzEventHub = std::make_shared<FuzzEventHub>(fdp);
185 std::unique_ptr<FuzzInputReader> reader =
186 std::make_unique<FuzzInputReader>(fuzzEventHub, fuzzPolicy, fuzzListener);
Michael Ensing0f0ca6e2021-01-12 16:13:20 -0800187 size_t patternCount = fdp->ConsumeIntegralInRange<size_t>(1, 260);
188 VibrationSequence pattern(patternCount);
189 for (size_t i = 0; i < patternCount; ++i) {
190 VibrationElement element(i);
Harry Cutts33476232023-01-30 19:57:29 +0000191 element.addChannel(/*vibratorId=*/fdp->ConsumeIntegral<int32_t>(),
192 /*amplitude=*/fdp->ConsumeIntegral<uint8_t>());
Michael Ensing0f0ca6e2021-01-12 16:13:20 -0800193 pattern.addElement(element);
194 }
195 reader->vibrate(fdp->ConsumeIntegral<int32_t>(), pattern,
Harry Cutts33476232023-01-30 19:57:29 +0000196 /*repeat=*/fdp->ConsumeIntegral<ssize_t>(),
197 /*token=*/fdp->ConsumeIntegral<int32_t>());
Michael Ensing0f0ca6e2021-01-12 16:13:20 -0800198 reader->start();
199
200 // Loop through mapper operations until randomness is exhausted.
201 while (fdp->remaining_bytes() > 0) {
202 fdp->PickValueInArray<std::function<void()>>({
203 [&]() -> void {
204 std::string dump;
205 reader->dump(dump);
206 },
207 [&]() -> void { reader->monitor(); },
208 [&]() -> void { reader->getInputDevices(); },
Michael Ensing0f0ca6e2021-01-12 16:13:20 -0800209 [&]() -> void {
210 reader->getScanCodeState(fdp->ConsumeIntegral<int32_t>(),
211 fdp->ConsumeIntegral<uint32_t>(),
212 fdp->ConsumeIntegral<int32_t>());
213 },
214 [&]() -> void {
215 reader->getKeyCodeState(fdp->ConsumeIntegral<int32_t>(),
216 fdp->ConsumeIntegral<uint32_t>(),
217 fdp->ConsumeIntegral<int32_t>());
218 },
219 [&]() -> void {
220 reader->getSwitchState(fdp->ConsumeIntegral<int32_t>(),
221 fdp->ConsumeIntegral<uint32_t>(),
222 fdp->ConsumeIntegral<int32_t>());
223 },
224 [&]() -> void { reader->toggleCapsLockState(fdp->ConsumeIntegral<int32_t>()); },
225 [&]() -> void {
226 size_t count = fdp->ConsumeIntegralInRange<size_t>(1, 1024);
227 std::vector<uint8_t> outFlags(count);
228 std::vector<int32_t> keyCodes;
229 for (size_t i = 0; i < count; ++i) {
230 keyCodes.push_back(fdp->ConsumeIntegral<int32_t>());
231 }
232 reader->hasKeys(fdp->ConsumeIntegral<int32_t>(),
233 fdp->ConsumeIntegral<uint32_t>(), keyCodes, outFlags.data());
234 },
235 [&]() -> void {
Prabir Pradhan4bf6d452023-04-18 21:26:56 +0000236 reader->requestRefreshConfiguration(
237 InputReaderConfiguration::Change(fdp->ConsumeIntegral<uint32_t>()));
Michael Ensing0f0ca6e2021-01-12 16:13:20 -0800238 },
239 [&]() -> void {
240 reader->cancelVibrate(fdp->ConsumeIntegral<int32_t>(),
241 fdp->ConsumeIntegral<int32_t>());
242 },
243 [&]() -> void {
244 reader->canDispatchToDisplay(fdp->ConsumeIntegral<int32_t>(),
Linnan Li13bf76a2024-05-05 19:18:02 +0800245 ui::LogicalDisplayId{
246 fdp->ConsumeIntegral<int32_t>()});
Michael Ensing0f0ca6e2021-01-12 16:13:20 -0800247 },
248 [&]() -> void {
249 reader->getKeyCodeForKeyLocation(fdp->ConsumeIntegral<int32_t>(),
250 fdp->ConsumeIntegral<int32_t>());
251 },
252 [&]() -> void { reader->getBatteryCapacity(fdp->ConsumeIntegral<int32_t>()); },
253 [&]() -> void { reader->getBatteryStatus(fdp->ConsumeIntegral<int32_t>()); },
Prabir Pradhane287ecd2022-09-07 21:18:05 +0000254 [&]() -> void { reader->getBatteryDevicePath(fdp->ConsumeIntegral<int32_t>()); },
Michael Ensing0f0ca6e2021-01-12 16:13:20 -0800255 [&]() -> void { reader->getLights(fdp->ConsumeIntegral<int32_t>()); },
256 [&]() -> void { reader->getSensors(fdp->ConsumeIntegral<int32_t>()); },
257 [&]() -> void {
258 reader->getLightPlayerId(fdp->ConsumeIntegral<int32_t>(),
259 fdp->ConsumeIntegral<int32_t>());
260 },
261 [&]() -> void {
262 reader->getLightColor(fdp->ConsumeIntegral<int32_t>(),
263 fdp->ConsumeIntegral<int32_t>());
264 },
265 [&]() -> void {
266 reader->setLightPlayerId(fdp->ConsumeIntegral<int32_t>(),
267 fdp->ConsumeIntegral<int32_t>(),
268 fdp->ConsumeIntegral<int32_t>());
269 },
270 [&]() -> void {
271 reader->setLightColor(fdp->ConsumeIntegral<int32_t>(),
272 fdp->ConsumeIntegral<int32_t>(),
273 fdp->ConsumeIntegral<int32_t>());
274 },
275 [&]() -> void {
276 reader->flushSensor(fdp->ConsumeIntegral<int32_t>(),
277 fdp->PickValueInArray<InputDeviceSensorType>(
278 kInputDeviceSensorType));
279 },
280 [&]() -> void {
281 reader->disableSensor(fdp->ConsumeIntegral<int32_t>(),
282 fdp->PickValueInArray<InputDeviceSensorType>(
283 kInputDeviceSensorType));
284 },
285 [&]() -> void {
286 reader->enableSensor(fdp->ConsumeIntegral<int32_t>(),
287 fdp->PickValueInArray<InputDeviceSensorType>(
288 kInputDeviceSensorType),
289 std::chrono::microseconds(fdp->ConsumeIntegral<size_t>()),
290 std::chrono::microseconds(fdp->ConsumeIntegral<size_t>()));
291 },
Prabir Pradhanb54ffb22022-10-27 18:03:34 +0000292 [&]() -> void { reader->getBluetoothAddress(fdp->ConsumeIntegral<int32_t>()); },
Michael Ensing0f0ca6e2021-01-12 16:13:20 -0800293 })();
294 }
295
296 reader->stop();
297 return 0;
298}
299
300} // namespace android