• 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 
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