• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #include "paste_data.h"
23 #include "paste_data_record.h"
24 
25 using namespace OHOS::MiscServices;
26 
27 namespace OHOS {
28 using namespace OHOS::Media;
29 using namespace OHOS::AAFwk;
30 constexpr size_t THRESHOLD = 10;
31 constexpr size_t OFFSET = 4;
32 constexpr size_t RANDNUM_ZERO = 0;
33 constexpr size_t LENGTH = 46;
34 
ConvertToUint32(const uint8_t * ptr)35 uint32_t ConvertToUint32(const uint8_t *ptr)
36 {
37     if (ptr == nullptr) {
38         return 0;
39     }
40     uint32_t bigVar = (ptr[0] << 24) | (ptr[1] << 16) | (ptr[2] << 8) | (ptr[3]);
41     return bigVar;
42 }
43 
FuzzPasteboardclient(const uint8_t * rawData,size_t size)44 void FuzzPasteboardclient(const uint8_t *rawData, size_t size)
45 {
46     std::shared_ptr<PasteData> pasteData = std::make_shared<PasteData>();
47     std::shared_ptr<PasteDataRecord> pasteDataRecord = std::make_shared<PasteDataRecord>();
48     uint32_t code = ConvertToUint32(rawData);
49     rawData = rawData + OFFSET;
50     size = size - OFFSET;
51     std::string str(reinterpret_cast<const char *>(rawData), size);
52 
53     if (code == RANDNUM_ZERO) {
54         pasteData = PasteboardClient::GetInstance()->CreatePlainTextData(str);
55         pasteDataRecord = PasteboardClient::GetInstance()->CreatePlainTextRecord(str);
56     } else {
57         pasteData = PasteboardClient::GetInstance()->CreateUriData(Uri(str));
58         pasteDataRecord = PasteboardClient::GetInstance()->CreateUriRecord(Uri(str));
59     }
60     pasteData->AddRecord(pasteDataRecord);
61     std::vector<uint8_t> buffer;
62     pasteData->Encode(buffer);
63 
64     PasteData pasteData2;
65     pasteData2.Decode(buffer);
66     pasteData2.HasMimeType(std::string(reinterpret_cast<const char *>(rawData), size));
67     pasteData2.RemoveRecordAt(code);
68     pasteData2.ReplaceRecordAt(code, pasteDataRecord);
69 
70     std::shared_ptr<OHOS::AAFwk::Want> want = std::make_shared<OHOS::AAFwk::Want>();
71     std::shared_ptr<PixelMap> pixelMap = std::make_shared<PixelMap>();
72     const std::vector<uint8_t> arrayBuffer = {rawData, rawData + size};
73     const OHOS::Uri uri = Uri(str);
74     PasteboardClient::GetInstance()->CreateHtmlTextRecord(str);
75     PasteboardClient::GetInstance()->CreateWantRecord(want);
76     PasteboardClient::GetInstance()->CreatePlainTextRecord(str);
77     PasteboardClient::GetInstance()->CreateUriRecord(uri);
78     PasteboardClient::GetInstance()->CreateKvRecord(str, arrayBuffer);
79     PasteboardClient::GetInstance()->CreateHtmlData(str);
80     PasteboardClient::GetInstance()->CreateWantData(want);
81     PasteboardClient::GetInstance()->CreatePlainTextData(str);
82     PasteboardClient::GetInstance()->CreatePixelMapData(pixelMap);
83     PasteboardClient::GetInstance()->CreateUriData(uri);
84     PasteboardClient::GetInstance()->CreateKvData(str, arrayBuffer);
85 }
86 
FuzzPasteboardclient002(const uint8_t * rawData,size_t size)87 void FuzzPasteboardclient002(const uint8_t *rawData, size_t size)
88 {
89     PasteData pasteData3;
90     PasteboardClient::GetInstance()->GetPasteData(pasteData3);
91     UDMF::UnifiedData unifiedData;
92     PasteboardClient::GetInstance()->GetUnifiedData(unifiedData);
93     PasteboardClient::GetInstance()->HasPasteData();
94     std::shared_ptr<PasteboardDelayGetter> delayGetter;
95     PasteboardClient::GetInstance()->SetPasteData(pasteData3, delayGetter);
96     PasteboardClient::GetInstance()->SetUnifiedData(unifiedData, delayGetter);
97     PasteboardObserverType type = PasteboardObserverType::OBSERVER_LOCAL;
98     sptr<PasteboardObserver> callback = new PasteboardObserver();
99     PasteboardClient::GetInstance()->Subscribe(type, callback);
100     PasteboardClient::GetInstance()->AddPasteboardChangedObserver(callback);
101     PasteboardClient::GetInstance()->AddPasteboardEventObserver(callback);
102     PasteboardClient::GetInstance()->Unsubscribe(type, callback);
103     PasteboardClient::GetInstance()->RemovePasteboardChangedObserver(callback);
104     PasteboardClient::GetInstance()->RemovePasteboardEventObserver(callback);
105     const std::vector<uint32_t> tokenIds = {1, 2, 3};
106     PasteboardClient::GetInstance()->GetGlobalShareOption(tokenIds);
107     PasteboardClient::GetInstance()->RemoveGlobalShareOption(tokenIds);
108     const ShareOption shareOptions = ShareOption::LocalDevice;
109     PasteboardClient::GetInstance()->SetAppShareOptions(shareOptions);
110     PasteboardClient::GetInstance()->Clear();
111 }
112 
FuzzPasteboard(const uint8_t * rawData,size_t size)113 void FuzzPasteboard(const uint8_t *rawData, size_t size)
114 {
115     std::shared_ptr<PasteData> pasteData = std::make_shared<PasteData>();
116     std::shared_ptr<PasteDataRecord> pasteDataRecord = std::make_shared<PasteDataRecord>();
117     uint32_t code = ConvertToUint32(rawData);
118     rawData = rawData + OFFSET;
119     size = size - OFFSET;
120     std::string str(reinterpret_cast<const char *>(rawData), size);
121     uint32_t color[100] = { code };
122     InitializationOptions opts = { { 5, 7}, PixelFormat::ARGB_8888 };
123     std::unique_ptr<PixelMap> pixelMap = PixelMap::Create(color, sizeof(color)/sizeof(color[0]), opts);
124     std::shared_ptr<PixelMap> pixelMapIn = move(pixelMap);
125 
126     std::vector<uint8_t> kvData(LENGTH);
127     kvData = { *rawData };
128     std::string mimetype = "image/jpg";
129 
130     if (code == RANDNUM_ZERO) {
131         pasteData = PasteboardClient::GetInstance()->CreatePixelMapData(pixelMapIn);
132         pasteDataRecord = PasteboardClient::GetInstance()->CreatePixelMapRecord(pixelMapIn);
133     } else {
134         pasteData = PasteboardClient::GetInstance()->CreateKvData(mimetype, kvData);
135         pasteDataRecord = PasteboardClient::GetInstance()->CreateKvRecord(mimetype, kvData);
136     }
137 
138     pasteData->AddRecord(pasteDataRecord);
139     if (PasteboardClient::GetInstance()->HasPasteData()) {
140         PasteboardClient::GetInstance()->RemovePasteboardChangedObserver(nullptr);
141     }
142     PasteboardClient::GetInstance()->SetPasteData(*pasteData);
143     std::set<Pattern> patternsToCheck = {Pattern::URL, Pattern::EmailAddress, static_cast<Pattern>(code)};
144     PasteboardClient::GetInstance()->DetectPatterns(patternsToCheck);
145 }
146 
FuzzPastedata(const uint8_t * rawData,size_t size)147 void FuzzPastedata(const uint8_t *rawData, size_t size)
148 {
149     std::string str(reinterpret_cast<const char *>(rawData), size);
150     PasteData pasteData2;
151     pasteData2.SetRemote(static_cast<bool>(*rawData));
152     pasteData2.SetLocalPasteFlag(static_cast<bool>(*rawData));
153     pasteData2.SetDraggedDataFlag(static_cast<bool>(*rawData));
154     pasteData2.SetOrginAuthority(str);
155     pasteData2.SetBundleName(str);
156     pasteData2.SetTag(str);
157     pasteData2.SetTime(str);
158     pasteData2.SetDelayData(false);
159     pasteData2.IsDelayData();
160     pasteData2.IsValid();
161     pasteData2.IsRemote();
162     pasteData2.IsLocalPaste();
163     pasteData2.GetLocalOnly();
164     pasteData2.IsDraggedData();
165     pasteData2.GetDeviceId();
166     pasteData2.ReplaceShareUri(1);
167     pasteData2.SetLocalOnly(false);
168     AAFwk::WantParams additions;
169     pasteData2.SetAdditions(additions);
170     pasteData2.GetTag();
171     ScreenEvent screenStatus = ScreenEvent::ScreenLocked;
172     pasteData2.SetScreenStatus(screenStatus);
173     pasteData2.GetScreenStatus();
174     pasteData2.GetTime();
175     pasteData2.SetOrginAuthority(str);
176     pasteData2.GetOrginAuthority();
177     pasteData2.SetBundleName(str);
178     pasteData2.GetBundleName();
179     pasteData2.GetDeviceId();
180     pasteData2.IsDraggedData();
181     pasteData2.GetLocalOnly();
182     pasteData2.AllRecords();
183     pasteData2.SetTokenId(0);
184     pasteData2.GetTokenId();
185     pasteData2.GetRecordAt(0);
186 }
187 
FuzzPasteData002(const uint8_t * rawData,size_t size)188 void FuzzPasteData002(const uint8_t *rawData, size_t size)
189 {
190     std::string str(reinterpret_cast<const char *>(rawData), size);
191     PasteData pasteData2;
192     pasteData2.GetPrimaryText();
193     pasteData2.GetPrimaryWant();
194     pasteData2.GetPrimaryPixelMap();
195     pasteData2.GetPrimaryHtml();
196     std::shared_ptr<OHOS::AAFwk::Want> wantPtr = std::make_shared<OHOS::AAFwk::Want>();
197     pasteData2.AddWantRecord(wantPtr);
198     std::shared_ptr<PixelMap> pixelMap = std::make_shared<PixelMap>();
199     pasteData2.AddPixelMapRecord(pixelMap);
200     pasteData2.AddHtmlRecord(str);
201     PasteDataProperty property;
202     pasteData2.SetProperty(property);
203     pasteData2.GetProperty();
204     std::shared_ptr<PasteDataRecord> pasteDataRecord = std::make_shared<PasteDataRecord>();
205     pasteData2.AddRecord(pasteDataRecord);
206 
207     PasteData pasteData1 = pasteData2;
208     PasteboardClient::GetInstance()->SetPasteData(pasteData2);
209     PasteboardClient::GetInstance()->HasDataType(std::string(reinterpret_cast<const char *>(rawData), size));
210     PasteboardClient::GetInstance()->IsRemoteData();
211     std::string bundlename = pasteData2.GetBundleName();
212     PasteboardClient::GetInstance()->GetPasteData(pasteData2);
213     PasteboardClient::GetInstance()->GetDataSource(bundlename);
214 
215     std::string shareoption1;
216     PasteData::ShareOptionToString(ShareOption::InApp, shareoption1);
217     PasteData::ShareOptionToString(ShareOption::LocalDevice, shareoption1);
218     PasteData::ShareOptionToString(ShareOption::CrossDevice, shareoption1);
219     std::vector<std::uint8_t> buffer = {rawData, rawData + size};
220     pasteData2.Decode(buffer);
221     pasteData2.SetInvalid();
222     sptr<IRemoteObject> remoteObject = nullptr;
223     PasteboardClient::GetInstance()->LoadSystemAbilitySuccess(remoteObject);
224     PasteboardClient::GetInstance()->LoadSystemAbilityFail();
225     const wptr<IRemoteObject> object;
226     PasteboardSaDeathRecipient death;
227     death.OnRemoteDied(object);
228     PasteboardClient::GetInstance()->OnRemoteSaDied(object);
229     PasteboardClient::GetInstance()->Clear();
230 }
231 
FuzzPastedataProperty(const uint8_t * rawData,size_t size)232 void FuzzPastedataProperty(const uint8_t *rawData, size_t size)
233 {
234     std::string str(reinterpret_cast<const char *>(rawData), size);
235     PasteDataProperty property1;
236     property1.tag ="tag1";
237     PasteDataProperty property2(property1);
238 
239     std::vector<std::uint8_t> buffer = {rawData, rawData + size};
240     property1.DecodeTag(buffer);
241     property1.Decode(buffer);
242 }
243 
FuzzPastedataRecord(const uint8_t * rawData,size_t size)244 void FuzzPastedataRecord(const uint8_t *rawData, size_t size)
245 {
246     std::string str(reinterpret_cast<const char *>(rawData), size);
247     std::vector<std::uint8_t> buffer = {rawData, rawData + size};
248     PasteDataRecord pasteDataRecord;
249 
250     std::shared_ptr<std::string> htmlText = std::make_shared<std::string>(str);
251     std::shared_ptr<OHOS::AAFwk::Want> want = std::make_shared<OHOS::AAFwk::Want>();
252     std::shared_ptr<OHOS::Media::PixelMap> pixelMap = std::make_shared<PixelMap>();
253     std::shared_ptr<OHOS::Uri> uri = std::make_shared<Uri>(str);
254     std::shared_ptr<MineCustomData> customData = std::make_shared<MineCustomData>();
255 
256     pasteDataRecord.SetUri(uri);
257     const std::string htmlText2(reinterpret_cast<const char *>(rawData), size);
258     pasteDataRecord.NewHtmlRecord(htmlText2);
259     pasteDataRecord.NewWantRecord(want);
260     pasteDataRecord.NewPlaintTextRecord(str);
261     pasteDataRecord.NewPixelMapRecord(pixelMap);
262     pasteDataRecord.GetHtmlText();
263     pasteDataRecord.GetMimeType();
264     pasteDataRecord.GetPlainText();
265     pasteDataRecord.GetPixelMap();
266     pasteDataRecord.GetOrginUri();
267     pasteDataRecord.GetWant();
268     pasteDataRecord.GetCustomData();
269     pasteDataRecord.GetUri();
270     pasteDataRecord.ClearPixelMap();
271     pasteDataRecord.ConvertToText();
272     pasteDataRecord.Encode(buffer);
273     pasteDataRecord.Decode(buffer);
274     pasteDataRecord.Count();
275     pasteDataRecord.ReplaceShareUri(1);
276     pasteDataRecord.SetConvertUri(str),
277     pasteDataRecord.GetConvertUri();
278     pasteDataRecord.SetGrantUriPermission(false);
279     pasteDataRecord.HasGrantUriPermission();
280     pasteDataRecord.SetTextContent(str);
281     pasteDataRecord.GetTextContent();
282 }
283 
FuzzPastedataRecord002(const uint8_t * rawData,size_t size)284 void FuzzPastedataRecord002(const uint8_t *rawData, size_t size)
285 {
286     std::string str(reinterpret_cast<const char *>(rawData), size);
287     std::vector<std::uint8_t> buffer = {rawData, rawData + size};
288     PasteDataRecord pasteDataRecord;
289 
290     std::shared_ptr<std::string> htmlText = std::make_shared<std::string>(str);
291     std::shared_ptr<OHOS::AAFwk::Want> want = std::make_shared<OHOS::AAFwk::Want>();
292     std::shared_ptr<OHOS::Media::PixelMap> pixelMap = std::make_shared<PixelMap>();
293     std::shared_ptr<OHOS::Uri> uri = std::make_shared<Uri>(str);
294     std::shared_ptr<MineCustomData> customData = std::make_shared<MineCustomData>();
295 
296     Details details;
297     pasteDataRecord.SetDetails(details);
298     pasteDataRecord.GetDetails();
299     pasteDataRecord.SetSystemDefinedContent(details);
300     pasteDataRecord.GetSystemDefinedContent();
301     pasteDataRecord.SetUDType(0);
302     pasteDataRecord.GetUDType();
303 
304     std::vector<std::uint8_t> value = {rawData, rawData + size};
305     std::shared_ptr<PixelMap> pixelMap2 = std::make_shared<PixelMap>();
306     pasteDataRecord.Vector2PixelMap(value);
307     pasteDataRecord.PixelMap2Vector(pixelMap2);
308     std::string mimeType(reinterpret_cast<const char *>(rawData), size);
309     std::vector<uint8_t> arrayBuffer;
310     PasteDataRecord::NewKvRecord(mimeType, arrayBuffer);
311 
312     PasteDataRecord::Builder builder(MIMETYPE_TEXT_HTML);
313     std::shared_ptr<std::string> htmlText3 = std::make_shared<std::string>(str);
314     builder.SetHtmlText(htmlText3);
315     builder.SetMimeType(str);
316     builder.SetPlainText(htmlText3);
317     builder.SetUri(uri);
318     builder.SetPixelMap(pixelMap);
319     builder.SetWant(want);
320     builder.SetCustomData(customData);
321     builder.Build();
322 }
323 
FuzzMinecustomData(const uint8_t * rawData,size_t size)324 void FuzzMinecustomData(const uint8_t *rawData, size_t size)
325 {
326     std::string str(reinterpret_cast<const char *>(rawData), size);
327     std::string mimeType(reinterpret_cast<const char *>(rawData), size);
328     std::vector<uint8_t> arrayBuffer;
329     MineCustomData customData;
330 
331     std::vector<std::uint8_t> buffer = {rawData, rawData + size};
332     customData.Encode(buffer);
333     customData.Decode(buffer);
334     customData.Count();
335     customData.GetItemData();
336     customData.AddItemData(mimeType, arrayBuffer);
337 }
338 
FuzzPasteboardclientcreateData(const uint8_t * rawData,size_t size)339 void FuzzPasteboardclientcreateData(const uint8_t *rawData, size_t size)
340 {
341     std::shared_ptr<PasteData> pasteData = std::make_shared<PasteData>();
342     std::shared_ptr<PasteDataRecord> pasteDataRecord = std::make_shared<PasteDataRecord>();
343     uint32_t code = ConvertToUint32(rawData);
344     rawData = rawData + OFFSET;
345     size = size - OFFSET;
346     std::string str(reinterpret_cast<const char *>(rawData), size);
347 
348     std::shared_ptr<Want> want = std::make_shared<Want>();
349     std::string key = "id";
350     bool id = static_cast<bool>(*rawData);
351     Want wantIn = want->SetParam(key, id);
352 
353     if (code == RANDNUM_ZERO) {
354         pasteData = PasteboardClient::GetInstance()->CreateHtmlData(str);
355         pasteDataRecord = PasteboardClient::GetInstance()->CreateHtmlTextRecord(str);
356     } else {
357         pasteData = PasteboardClient::GetInstance()->CreateWantData(std::make_shared<Want>(wantIn));
358         pasteDataRecord = PasteboardClient::GetInstance()->CreateWantRecord(std::make_shared<Want>(wantIn));
359     }
360     PasteboardClient::GetInstance()->SetPasteData(*pasteData);
361     std::set<Pattern> patternsToCheck = {Pattern::URL, Pattern::Number, static_cast<Pattern>(code)};
362     PasteboardClient::GetInstance()->DetectPatterns(patternsToCheck);
363 }
364 } // namespace OHOS
365 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)366 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
367 {
368     if (size < OHOS::THRESHOLD) {
369         return 0;
370     }
371     /* Run your code on data */
372     OHOS::FuzzPasteboardclient(data, size);
373     OHOS::FuzzPasteboardclient002(data, size);
374     OHOS::FuzzPasteboard(data, size);
375     OHOS::FuzzPastedata(data, size);
376     OHOS::FuzzPasteData002(data, size);
377     OHOS::FuzzMinecustomData(data, size);
378     OHOS::FuzzPastedataProperty(data, size);
379     OHOS::FuzzPastedataRecord(data, size);
380     OHOS::FuzzPastedataRecord002(data, size);
381     OHOS::FuzzPasteboardclientcreateData(data, size);
382     return 0;
383 }
384