1 /*
2 * Copyright (c) 2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "usbmgrdetachkerneldriver_fuzzer.h"
17
18 #include "usb_errors.h"
19 #include "usb_srv_client.h"
20 #include <cstddef>
21 #include <cstdint>
22 #include "usb_service.h"
23
24 using namespace OHOS::USB;
25
26 namespace OHOS {
27 const uint32_t OFFSET = 4;
28 constexpr size_t THRESHOLD = 10;
29 enum class UsbInterfaceCode {
30 USB_FUN_HAS_RIGHT = 0,
31 USB_FUN_REQUEST_RIGHT,
32 USB_FUN_REMOVE_RIGHT,
33 USB_FUN_OPEN_DEVICE,
34 USB_FUN_RESET_DEVICE,
35 USB_FUN_GET_DEVICE,
36 USB_FUN_GET_DEVICES,
37 USB_FUN_GET_CURRENT_FUNCTIONS,
38 USB_FUN_SET_CURRENT_FUNCTIONS,
39 USB_FUN_USB_FUNCTIONS_FROM_STRING,
40 USB_FUN_USB_FUNCTIONS_TO_STRING,
41 USB_FUN_CLAIM_INTERFACE,
42 USB_FUN_RELEASE_INTERFACE,
43 USB_FUN_BULK_TRANSFER_READ,
44 USB_FUN_BULK_TRANSFER_WRITE,
45 USB_FUN_CONTROL_TRANSFER,
46 USB_FUN_USB_CONTROL_TRANSFER,
47 USB_FUN_SET_ACTIVE_CONFIG,
48 USB_FUN_GET_ACTIVE_CONFIG,
49 USB_FUN_SET_INTERFACE,
50 USB_FUN_GET_PORTS,
51 USB_FUN_GET_SUPPORTED_MODES,
52 USB_FUN_SET_PORT_ROLE,
53 USB_FUN_REQUEST_QUEUE,
54 USB_FUN_REQUEST_WAIT,
55 USB_FUN_REQUEST_CANCEL,
56 USB_FUN_GET_DESCRIPTOR,
57 USB_FUN_GET_FILEDESCRIPTOR,
58 USB_FUN_CLOSE_DEVICE,
59 USB_FUN_BULK_AYSNC_READ,
60 USB_FUN_BULK_AYSNC_WRITE,
61 USB_FUN_BULK_AYSNC_CANCEL,
62 USB_FUN_REG_BULK_CALLBACK,
63 USB_FUN_UNREG_BULK_CALLBACK,
64 USB_FUN_ADD_RIGHT,
65 USB_FUN_DISABLE_GLOBAL_INTERFACE,
66 USB_FUN_DISABLE_DEVICE,
67 USB_FUN_DISABLE_INTERFACE_TYPE,
68 USB_FUN_CLEAR_HALT,
69 USB_FUN_GET_DEVICE_SPEED,
70 USB_FUN_GET_DRIVER_ACTIVE_STATUS,
71 USB_FUN_ADD_ACCESS_RIGHT,
72 USB_FUN_BULK_TRANSFER_READ_WITH_LENGTH,
73 USB_FUN_ATTACH_KERNEL_DRIVER,
74 USB_FUN_DETACH_KERNEL_DRIVER,
75 };
76 const std::u16string USB_INTERFACE_TOKEN = u"ohos.usb.IUsbSrv";
77
DoSomethingInterestingWithMyAPI(const uint8_t *rawData, size_t size)78 bool DoSomethingInterestingWithMyAPI(const uint8_t *rawData, size_t size)
79 {
80 if (rawData == nullptr) {
81 return false;
82 }
83 rawData = rawData + OFFSET;
84 size = size - OFFSET;
85
86 uint32_t code = static_cast<uint32_t>(UsbInterfaceCode::USB_FUN_DETACH_KERNEL_DRIVER);
87 MessageParcel data;
88 data.WriteInterfaceToken(USB_INTERFACE_TOKEN);
89 data.WriteBuffer(rawData, size);
90 data.RewindRead(0);
91 MessageParcel reply;
92 MessageOption option;
93 DelayedSpSingleton<UsbService>::GetInstance()->OnRemoteRequest(code, data, reply, option);
94
95 return true;
96 }
97 } // OHOS
98
99 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)100 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
101 {
102 if (size < OHOS::THRESHOLD) {
103 return 0;
104 }
105 /* Run your code on data */
106 OHOS::DoSomethingInterestingWithMyAPI(data, size);
107 return 0;
108 }
109