1 /*
2 * Copyright (c) 2022-2023 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 <map>
19
20 #include "pasteboard_client.h"
21 #include "pasteboard_observer.h"
22
23 using namespace OHOS::MiscServices;
24
25 namespace OHOS {
26 using namespace OHOS::Media;
27 using namespace OHOS::AAFwk;
28 constexpr size_t THRESHOLD = 10;
29 constexpr size_t OFFSET = 4;
30 constexpr size_t RANDNUM_ZERO = 0;
31 constexpr size_t LENGTH = 46;
32
ConvertToUint32(const uint8_t * ptr)33 uint32_t ConvertToUint32(const uint8_t *ptr)
34 {
35 if (ptr == nullptr) {
36 return 0;
37 }
38 uint32_t bigVar = (ptr[0] << 24) | (ptr[1] << 16) | (ptr[2] << 8) | (ptr[3]);
39 return bigVar;
40 }
41
FuzzPasteboardclient(const uint8_t * rawData,size_t size)42 void FuzzPasteboardclient(const uint8_t *rawData, size_t size)
43 {
44 std::shared_ptr<PasteData> pasteData = std::make_shared<PasteData>();
45 std::shared_ptr<PasteDataRecord> pasteDataRecord = std::make_shared<PasteDataRecord>();
46 uint32_t code = ConvertToUint32(rawData);
47 rawData = rawData + OFFSET;
48 size = size - OFFSET;
49 std::string str(reinterpret_cast<const char *>(rawData), size);
50
51 if (code == RANDNUM_ZERO) {
52 pasteData = PasteboardClient::GetInstance()->CreatePlainTextData(str);
53 pasteDataRecord = PasteboardClient::GetInstance()->CreatePlainTextRecord(str);
54 } else {
55 pasteData = PasteboardClient::GetInstance()->CreateUriData(Uri(str));
56 pasteDataRecord = PasteboardClient::GetInstance()->CreateUriRecord(Uri(str));
57 }
58 pasteData->AddRecord(pasteDataRecord);
59 std::vector<uint8_t> buffer;
60 pasteData->Encode(buffer);
61
62 PasteData pasteData2;
63 pasteData2.Decode(buffer);
64 pasteData2.HasMimeType(std::string(reinterpret_cast<const char *>(rawData), size));
65 pasteData2.RemoveRecordAt(code);
66 pasteData2.ReplaceRecordAt(code, pasteDataRecord);
67 }
68
FuzzPasteboard(const uint8_t * rawData,size_t size)69 void FuzzPasteboard(const uint8_t *rawData, size_t size)
70 {
71 std::shared_ptr<PasteData> pasteData = std::make_shared<PasteData>();
72 std::shared_ptr<PasteDataRecord> pasteDataRecord = std::make_shared<PasteDataRecord>();
73 uint32_t code = ConvertToUint32(rawData);
74 rawData = rawData + OFFSET;
75 size = size - OFFSET;
76 std::string str(reinterpret_cast<const char *>(rawData), size);
77
78 uint32_t color[100] = { code };
79 InitializationOptions opts = { { 5, 7}, PixelFormat::ARGB_8888 };
80 std::unique_ptr<PixelMap> pixelMap = PixelMap::Create(color, sizeof(color)/sizeof(color[0]), opts);
81 std::shared_ptr<PixelMap> pixelMapIn = move(pixelMap);
82
83 std::vector<uint8_t> kvData(LENGTH);
84 kvData = { *rawData };
85 std::string mimetype = "image/jpg";
86
87 if (code == RANDNUM_ZERO) {
88 pasteData = PasteboardClient::GetInstance()->CreatePixelMapData(pixelMapIn);
89 pasteDataRecord = PasteboardClient::GetInstance()->CreatePixelMapRecord(pixelMapIn);
90 } else {
91 pasteData = PasteboardClient::GetInstance()->CreateKvData(mimetype, kvData);
92 pasteDataRecord = PasteboardClient::GetInstance()->CreateKvRecord(mimetype, kvData);
93 }
94
95 pasteData->AddRecord(pasteDataRecord);
96 if (PasteboardClient::GetInstance()->HasPasteData()) {
97 PasteboardClient::GetInstance()->RemovePasteboardChangedObserver(nullptr);
98 }
99 }
100
FuzzPastedata(const uint8_t * rawData,size_t size)101 void FuzzPastedata(const uint8_t *rawData, size_t size)
102 {
103 std::string str(reinterpret_cast<const char *>(rawData), size);
104 PasteData pasteData2;
105 pasteData2.SetRemote(static_cast<bool>(*rawData));
106 pasteData2.SetOrginAuthority(str);
107 pasteData2.SetBundleName(str);
108 pasteData2.SetTag(str);
109 pasteData2.SetTime(str);
110 pasteData2.IsValid();
111 pasteData2.IsRemote();
112 pasteData2.IsLocalPaste();
113 pasteData2.GetLocalOnly();
114 pasteData2.IsDraggedData();
115
116 pasteData2.GetOrginAuthority();
117 pasteData2.GetTag();
118 pasteData2.GetTime();
119 PasteboardClient::GetInstance()->SetPasteData(pasteData2);
120 PasteboardClient::GetInstance()->HasDataType(std::string(reinterpret_cast<const char *>(rawData), size));
121 PasteboardClient::GetInstance()->IsRemoteData();
122
123 std::string bundlename = pasteData2.GetBundleName();
124 PasteboardClient::GetInstance()->GetPasteData(pasteData2);
125 PasteboardClient::GetInstance()->GetDataSource(bundlename);
126
127 pasteData2.SetInvalid();
128 sptr<IRemoteObject> remoteObject = nullptr;
129 PasteboardClient::GetInstance()->LoadSystemAbilitySuccess(remoteObject);
130 PasteboardClient::GetInstance()->LoadSystemAbilityFail();
131 const wptr<IRemoteObject> object;
132 PasteboardSaDeathRecipient death;
133 death.OnRemoteDied(object);
134 PasteboardClient::GetInstance()->OnRemoteSaDied(object);
135 PasteboardClient::GetInstance()->Clear();
136 }
137
FuzzPasteboardclientCreateData(const uint8_t * rawData,size_t size)138 void FuzzPasteboardclientCreateData(const uint8_t *rawData, size_t size)
139 {
140 std::shared_ptr<PasteData> pasteData = std::make_shared<PasteData>();
141 std::shared_ptr<PasteDataRecord> pasteDataRecord = std::make_shared<PasteDataRecord>();
142 uint32_t code = ConvertToUint32(rawData);
143 rawData = rawData + OFFSET;
144 size = size - OFFSET;
145 std::string str(reinterpret_cast<const char *>(rawData), size);
146
147 std::shared_ptr<Want> want = std::make_shared<Want>();
148 std::string key = "id";
149 bool id = static_cast<bool>(*rawData);
150 Want wantIn = want->SetParam(key, id);
151
152 if (code == RANDNUM_ZERO) {
153 pasteData = PasteboardClient::GetInstance()->CreateHtmlData(str);
154 pasteDataRecord = PasteboardClient::GetInstance()->CreateHtmlTextRecord(str);
155 } else {
156 pasteData = PasteboardClient::GetInstance()->CreateWantData(std::make_shared<Want>(wantIn));
157 pasteDataRecord = PasteboardClient::GetInstance()->CreateWantRecord(std::make_shared<Want>(wantIn));
158 }
159 }
160 } // namespace OHOS
161 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)162 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
163 {
164 if (size < OHOS::THRESHOLD) {
165 return 0;
166 }
167 /* Run your code on data */
168 OHOS::FuzzPasteboardclient(data, size);
169 OHOS::FuzzPasteboard(data, size);
170 OHOS::FuzzPastedata(data, size);
171 OHOS::FuzzPasteboardclientCreateData(data, size);
172 return 0;
173 }
174