1 /*
2  * Copyright (c) 2022 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 "startdtmf_fuzzer.h"
17 
18 #include <cstddef>
19 #include <cstdint>
20 #define private public
21 #include "addcalltoken_fuzzer.h"
22 #include "call_manager_service_stub.h"
23 
24 using namespace OHOS::Telephony;
25 namespace OHOS {
26 constexpr int32_t CALL_ID_NUM = 10;
27 
StartDtmf(const uint8_t * data,size_t size)28 void StartDtmf(const uint8_t *data, size_t size)
29 {
30     if (!IsServiceInited()) {
31         return;
32     }
33 
34     int32_t callId = size % CALL_ID_NUM;
35     char str = *reinterpret_cast<const char *>(data);
36     MessageParcel dataMessageParcel;
37     dataMessageParcel.WriteInt32(callId);
38     dataMessageParcel.WriteInt8(str);
39     dataMessageParcel.RewindRead(0);
40     MessageParcel reply;
41     DelayedSingleton<CallManagerService>::GetInstance()->OnStartDtmf(dataMessageParcel, reply);
42 }
43 
StopRtt(const uint8_t * data,size_t size)44 void StopRtt(const uint8_t *data, size_t size)
45 {
46     if (!IsServiceInited()) {
47         return;
48     }
49 
50     int32_t callId = size % CALL_ID_NUM;
51     MessageParcel dataMessageParcel;
52     dataMessageParcel.WriteInt32(callId);
53     dataMessageParcel.RewindRead(0);
54     MessageParcel reply;
55     DelayedSingleton<CallManagerService>::GetInstance()->OnStopRtt(dataMessageParcel, reply);
56 }
57 
SetMuted(const uint8_t * data,size_t size)58 void SetMuted(const uint8_t *data, size_t size)
59 {
60     if (!IsServiceInited()) {
61         return;
62     }
63 
64     bool isMute = false;
65     MessageParcel dataMessageParcel;
66     dataMessageParcel.WriteBool(isMute);
67     dataMessageParcel.RewindRead(0);
68     MessageParcel reply;
69     DelayedSingleton<CallManagerService>::GetInstance()->OnSetMute(dataMessageParcel, reply);
70 }
71 
MuteRinger(const uint8_t * data,size_t size)72 void MuteRinger(const uint8_t *data, size_t size)
73 {
74     if (!IsServiceInited()) {
75         return;
76     }
77 
78     MessageParcel dataMessageParcel;
79     dataMessageParcel.WriteBuffer(data, size);
80     dataMessageParcel.RewindRead(0);
81     MessageParcel reply;
82     DelayedSingleton<CallManagerService>::GetInstance()->OnSetMute(dataMessageParcel, reply);
83 }
84 
DoSomethingInterestingWithMyAPI(const uint8_t * data,size_t size)85 void DoSomethingInterestingWithMyAPI(const uint8_t *data, size_t size)
86 {
87     if (data == nullptr || size == 0) {
88         return;
89     }
90 
91     StartDtmf(data, size);
92     StopRtt(data, size);
93     SetMuted(data, size);
94     MuteRinger(data, size);
95 }
96 } // namespace OHOS
97 
98 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)99 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
100 {
101     OHOS::AddCallTokenFuzzer token;
102     /* Run your code on data */
103     OHOS::DoSomethingInterestingWithMyAPI(data, size);
104     return 0;
105 }
106