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 <cstddef>
17 #include <cstdint>
18 #include <parcel.h>
19 #include <securec.h>
20 
21 #include <iremote_stub.h>
22 #include "message_option.h"
23 #include "message_parcel.h"
24 #include "marshalling_helper.h"
25 #include "session/host/include/zidl/session_ipc_interface_code.h"
26 #include "session/host/include/zidl/session_stub.h"
27 #include "session/host/include/session.h"
28 #include "sessionstubscene_fuzzer.h"
29 
30 using namespace OHOS::Rosen;
31 
32 namespace OHOS {
33 namespace {
34 constexpr size_t DATA_MIN_SIZE = 2;
35 }
36 
SessionStubTestUpdateCode(sptr<Session> sessionStub,MessageParcel & parcel)37 void SessionStubTestUpdateCode(sptr<Session> sessionStub, MessageParcel& parcel)
38 {
39     MessageParcel reply;
40     MessageOption option;
41     parcel.RewindRead(0);
42     sessionStub->OnRemoteRequest(static_cast<uint32_t>(Rosen::SessionInterfaceCode::TRANS_ID_UPDATE_CUSTOM_ANIMATION),
43         parcel, reply, option);
44     parcel.RewindRead(0);
45     sessionStub->OnRemoteRequest(
46         static_cast<uint32_t>(Rosen::SessionInterfaceCode::TRANS_ID_UPDATE_WINDOW_ANIMATION_FLAG),
47         parcel, reply, option);
48     parcel.RewindRead(0);
49     sessionStub->OnRemoteRequest(
50         static_cast<uint32_t>(Rosen::SessionInterfaceCode::TRANS_ID_UPDATE_RECTCHANGE_LISTENER_REGISTERED),
51         parcel, reply, option);
52     parcel.RewindRead(0);
53     sessionStub->OnRemoteRequest(
54         static_cast<uint32_t>(Rosen::SessionInterfaceCode::TRANS_ID_UPDATE_SESSION_RECT),
55         parcel, reply, option);
56     parcel.RewindRead(0);
57     sessionStub->OnRemoteRequest(
58         static_cast<uint32_t>(Rosen::SessionInterfaceCode::TRANS_ID_UPDATE_CUSTOM_ANIMATION),
59         parcel, reply, option);
60     parcel.RewindRead(0);
61     sessionStub->OnRemoteRequest(
62         static_cast<uint32_t>(Rosen::SessionInterfaceCode::TRANS_ID_UPDATE_SESSION_PROPERTY),
63         parcel, reply, option);
64     parcel.RewindRead(0);
65     sessionStub->OnRemoteRequest(
66         static_cast<uint32_t>(Rosen::SessionInterfaceCode::TRANS_ID_SEND_POINTEREVENT_FOR_MOVE_DRAG),
67         parcel, reply, option);
68     parcel.RewindRead(0);
69     sessionStub->OnRemoteRequest(static_cast<uint32_t>(Rosen::SessionInterfaceCode::TRANS_ID_RAISE_TO_APP_TOP),
70         parcel, reply, option);
71     parcel.RewindRead(0);
72     sessionStub->OnRemoteRequest(static_cast<uint32_t>(Rosen::SessionInterfaceCode::TRANS_ID_RAISE_ABOVE_TARGET),
73         parcel, reply, option);
74     parcel.RewindRead(0);
75     sessionStub->OnRemoteRequest(static_cast<uint32_t>(Rosen::SessionInterfaceCode::TRANS_ID_RAISE_APP_MAIN_WINDOW),
76         parcel, reply, option);
77     parcel.RewindRead(0);
78     sessionStub->OnRemoteRequest(static_cast<uint32_t>(Rosen::SessionInterfaceCode::TRANS_ID_NEED_AVOID),
79         parcel, reply, option);
80     parcel.RewindRead(0);
81     sessionStub->OnRemoteRequest(
82         static_cast<uint32_t>(Rosen::SessionInterfaceCode::TRANS_ID_ADJUST_KEYBOARD_LAYOUT),
83         parcel, reply, option);
84     return;
85 }
86 
SessionStubTestSetCode(sptr<Session> sessionStub,MessageParcel & parcel)87 void SessionStubTestSetCode(sptr<Session> sessionStub, MessageParcel& parcel)
88 {
89     MessageParcel reply;
90     MessageOption option;
91     parcel.RewindRead(0);
92     sessionStub->OnRemoteRequest(static_cast<uint32_t>(Rosen::SessionInterfaceCode::TRANS_ID_SET_MAXIMIZE_MODE),
93         parcel, reply, option);
94     parcel.RewindRead(0);
95     sessionStub->OnRemoteRequest(
96         static_cast<uint32_t>(Rosen::SessionInterfaceCode::TRANS_ID_SET_LANDSCAPE_MULTI_WINDOW),
97         parcel, reply, option);
98     parcel.RewindRead(0);
99     sessionStub->OnRemoteRequest(static_cast<uint32_t>(Rosen::SessionInterfaceCode::TRANS_ID_SET_CALLING_SESSION_ID),
100         parcel, reply, option);
101     parcel.RewindRead(0);
102     sessionStub->OnRemoteRequest(
103         static_cast<uint32_t>(Rosen::SessionInterfaceCode::TRANS_ID_SET_CUSTOM_DECOR_HEIGHT),
104         parcel, reply, option);
105     parcel.RewindRead(0);
106     sessionStub->OnRemoteRequest(static_cast<uint32_t>(Rosen::SessionInterfaceCode::TRANS_ID_MARK_PROCESSED),
107         parcel, reply, option);
108     parcel.RewindRead(0);
109     sessionStub->OnRemoteRequest(static_cast<uint32_t>(Rosen::SessionInterfaceCode::TRANS_ID_SESSION_EVENT),
110         parcel, reply, option);
111     parcel.RewindRead(0);
112     sessionStub->OnRemoteRequest(static_cast<uint32_t>(Rosen::SessionInterfaceCode::TRANS_ID_SYNC_SESSION_EVENT),
113         parcel, reply, option);
114     parcel.RewindRead(0);
115     sessionStub->OnRemoteRequest(static_cast<uint32_t>(Rosen::SessionInterfaceCode::TRANS_ID_BACKPRESSED),
116         parcel, reply, option);
117     parcel.RewindRead(0);
118     sessionStub->OnRemoteRequest(static_cast<uint32_t>(Rosen::SessionInterfaceCode::TRANS_ID_GET_AVOID_AREA),
119         parcel, reply, option);
120     parcel.RewindRead(0);
121     sessionStub->OnRemoteRequest(static_cast<uint32_t>(Rosen::SessionInterfaceCode::TRANS_ID_GET_MAXIMIZE_MODE),
122         parcel, reply, option);
123     parcel.RewindRead(0);
124     sessionStub->OnRemoteRequest(
125         static_cast<uint32_t>(Rosen::SessionInterfaceCode::TRANS_ID_PROCESS_POINT_DOWN_SESSION),
126         parcel, reply, option);
127     return;
128 }
129 
DoSomethingInterestingWithMyAPI(const uint8_t * data,size_t size)130 bool DoSomethingInterestingWithMyAPI(const uint8_t* data, size_t size)
131 {
132     if (data == nullptr || size < DATA_MIN_SIZE) {
133         return false;
134     }
135 
136     MessageParcel parcel;
137 
138     parcel.WriteInterfaceToken(SessionStub::GetDescriptor());
139     parcel.WriteBuffer(data, size);
140 
141     SessionInfo info;
142     info.abilityName_ = "stubConnectFuzzTest";
143     info.bundleName_ = "stubConnectFuzzTest";
144     sptr<Session> sessionStub = new (std::nothrow) Session(info);
145     if (sessionStub == nullptr) {
146         return false;
147     }
148 
149     SessionStubTestUpdateCode(sessionStub, parcel);
150     SessionStubTestSetCode(sessionStub, parcel);
151     return true;
152 }
153 } // namespace.OHOS
154 
155 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)156 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
157 {
158     /* Run your code on data */
159     OHOS::DoSomethingInterestingWithMyAPI(data, size);
160     return 0;
161 }