| /* |
| * Copyright (C) 2021 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 <fuzzer/FuzzedDataProvider.h> |
| |
| #include <string> |
| |
| #include "esco_parameters.h" |
| #include "interop.h" |
| |
| using namespace std; |
| constexpr size_t kNumAddressOctets = 6; |
| constexpr size_t kMaxStringLength = 10; |
| constexpr interop_feature_t kInteropFeature[] = { |
| interop_feature_t::INTEROP_DISABLE_LE_SECURE_CONNECTIONS, |
| interop_feature_t::INTEROP_AUTO_RETRY_PAIRING, |
| interop_feature_t::INTEROP_DISABLE_ABSOLUTE_VOLUME, |
| interop_feature_t::INTEROP_DISABLE_AUTO_PAIRING, |
| interop_feature_t::INTEROP_KEYBOARD_REQUIRES_FIXED_PIN, |
| interop_feature_t::INTEROP_2MBPS_LINK_ONLY, |
| interop_feature_t::INTEROP_HID_PREF_CONN_SUP_TIMEOUT_3S, |
| interop_feature_t::INTEROP_GATTC_NO_SERVICE_CHANGED_IND, |
| interop_feature_t::INTEROP_DISABLE_AVDTP_RECONFIGURE, |
| interop_feature_t::INTEROP_DYNAMIC_ROLE_SWITCH, |
| interop_feature_t::INTEROP_DISABLE_ROLE_SWITCH, |
| interop_feature_t::INTEROP_HID_HOST_LIMIT_SNIFF_INTERVAL, |
| interop_feature_t::INTEROP_DISABLE_NAME_REQUEST, |
| interop_feature_t::INTEROP_AVRCP_1_4_ONLY, |
| interop_feature_t::INTEROP_DISABLE_SNIFF, |
| interop_feature_t::INTEROP_DISABLE_AVDTP_SUSPEND, |
| }; |
| constexpr esco_codec_t kEscoCodec[] = { |
| esco_codec_t::SCO_CODEC_CVSD_D1, esco_codec_t::ESCO_CODEC_CVSD_S3, |
| esco_codec_t::ESCO_CODEC_CVSD_S4, esco_codec_t::ESCO_CODEC_MSBC_T1, |
| esco_codec_t::ESCO_CODEC_MSBC_T2, |
| }; |
| |
| extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { |
| FuzzedDataProvider mFuzzedDataProvider = FuzzedDataProvider(data, size); |
| RawAddress fuzzAddress; |
| string addressString; |
| for (size_t i = 0; i < kNumAddressOctets; ++i) { |
| addressString.append( |
| mFuzzedDataProvider.ConsumeBytesAsString(sizeof(uint8_t))); |
| if (i != kNumAddressOctets - 1) { |
| addressString.append(":"); |
| } |
| } |
| RawAddress::FromString(addressString, fuzzAddress); |
| interop_feature_t interopFeature = |
| mFuzzedDataProvider.PickValueInArray(kInteropFeature); |
| interop_match_addr(interopFeature, &fuzzAddress); |
| interop_database_add(interopFeature, &fuzzAddress, |
| mFuzzedDataProvider.ConsumeIntegralInRange<int32_t>( |
| 1, RawAddress::kLength - 1)); |
| interop_database_clear(); |
| interop_match_name( |
| interopFeature, |
| mFuzzedDataProvider.ConsumeRandomLengthString(kMaxStringLength).c_str()); |
| esco_codec_t escoCodec = mFuzzedDataProvider.PickValueInArray(kEscoCodec); |
| esco_parameters_for_codec(escoCodec); |
| return 0; |
| } |