/* * Copyright 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include "FuzzedInputStream.h" #include "InputCommonConverter.h" #include "InputProcessor.h" namespace android { namespace { constexpr int32_t MAX_RANDOM_DISPLAYS = 4; } extern "C" int LLVMFuzzerTestOneInput(uint8_t *data, size_t size) { FuzzedDataProvider fdp(data, size); std::unique_ptr mFuzzListener = std::make_unique(); std::unique_ptr mClassifier = std::make_unique(*mFuzzListener); IdGenerator idGenerator(IdGenerator::Source::OTHER); while (fdp.remaining_bytes() > 0) { fdp.PickValueInArray>({ [&]() -> void { // SendToNextStage_NotifyConfigurationChangedArgs mClassifier->notifyConfigurationChanged( {/*sequenceNum=*/fdp.ConsumeIntegral(), /*eventTime=*/fdp.ConsumeIntegral()}); }, [&]() -> void { // SendToNextStage_NotifyKeyArgs const nsecs_t eventTime = fdp.ConsumeIntegralInRange(0, systemTime(SYSTEM_TIME_MONOTONIC)); const nsecs_t readTime = fdp.ConsumeIntegralInRange< nsecs_t>(eventTime, std::numeric_limits::max()); mClassifier->notifyKey({/*sequenceNum=*/fdp.ConsumeIntegral(), eventTime, readTime, /*deviceId=*/fdp.ConsumeIntegral(), AINPUT_SOURCE_KEYBOARD, ui::LogicalDisplayId::DEFAULT, /*policyFlags=*/fdp.ConsumeIntegral(), AKEY_EVENT_ACTION_DOWN, /*flags=*/fdp.ConsumeIntegral(), AKEYCODE_HOME, /*scanCode=*/fdp.ConsumeIntegral(), AMETA_NONE, /*downTime=*/fdp.ConsumeIntegral()}); }, [&]() -> void { // SendToNextStage_NotifyMotionArgs mClassifier->notifyMotion( generateFuzzedMotionArgs(idGenerator, fdp, MAX_RANDOM_DISPLAYS)); }, [&]() -> void { // SendToNextStage_NotifySwitchArgs mClassifier->notifySwitch({/*sequenceNum=*/fdp.ConsumeIntegral(), /*eventTime=*/fdp.ConsumeIntegral(), /*policyFlags=*/fdp.ConsumeIntegral(), /*switchValues=*/fdp.ConsumeIntegral(), /*switchMask=*/fdp.ConsumeIntegral()}); }, [&]() -> void { // SendToNextStage_NotifyDeviceResetArgs mClassifier->notifyDeviceReset({/*sequenceNum=*/fdp.ConsumeIntegral(), /*eventTime=*/fdp.ConsumeIntegral(), /*deviceId=*/fdp.ConsumeIntegral()}); }, [&]() -> void { // InputClassifierConverterTest const NotifyMotionArgs motionArgs = generateFuzzedMotionArgs(idGenerator, fdp, MAX_RANDOM_DISPLAYS); aidl::android::hardware::input::common::MotionEvent motionEvent = notifyMotionArgsToHalMotionEvent(motionArgs); }, })(); } return 0; } } // namespace android