• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "preferences_fuzzer.h"
17 #include <fuzzer/FuzzedDataProvider.h>
18 #include <iostream>
19 
20 #include "preferences.h"
21 #include "preferences_errno.h"
22 #include "preferences_helper.h"
23 
24 using namespace OHOS::NativePreferences;
25 
26 namespace OHOS {
27 constexpr size_t NUM_MIN = 1;
28 constexpr size_t NUM_MAX = 32 * 1024 * 1024;
29 class PreferencesFuzzTest {
30 public:
31     static void SetUpTestCase(void);
32     static void TearDownTestCase(void);
33     void SetUp();
34     void TearDown();
35 
36     static std::shared_ptr<Preferences> Preferences_;
37 
38     static const std::string LONG_KEY;
39 };
40 
41 std::shared_ptr<Preferences> PreferencesFuzzTest::Preferences_ = nullptr;
42 
43 const std::string PreferencesFuzzTest::LONG_KEY = std::string(Preferences::MAX_KEY_LENGTH, std::toupper('a'));
44 
SetUpTestCase(void)45 void PreferencesFuzzTest::SetUpTestCase(void)
46 {
47     int errCode = E_OK;
48     Preferences_ = PreferencesHelper::GetPreferences("/data/test/test", errCode);
49 }
50 
TearDownTestCase(void)51 void PreferencesFuzzTest::TearDownTestCase(void)
52 {
53     Preferences_->Clear();
54     PreferencesHelper::RemovePreferencesFromCache("/data/test/test");
55     Preferences_ = nullptr;
56 }
57 
SetUp(void)58 void PreferencesFuzzTest::SetUp(void)
59 {
60 }
61 
TearDown(void)62 void PreferencesFuzzTest::TearDown(void)
63 {
64 }
65 
PutVectorFuzz(FuzzedDataProvider & provider)66 void PutVectorFuzz(FuzzedDataProvider &provider)
67 {
68     std::string key = provider.ConsumeRandomLengthString();
69     size_t bytesSize = provider.ConsumeIntegralInRange<size_t>(NUM_MIN, NUM_MAX);
70     std::vector<uint8_t> value = provider.ConsumeBytes<uint8_t>(bytesSize);
71     PreferencesFuzzTest::Preferences_->Put(key, value);
72     return;
73 }
74 
GetVectorFuzz(FuzzedDataProvider & provider)75 void GetVectorFuzz(FuzzedDataProvider &provider)
76 {
77     std::string key = provider.ConsumeRandomLengthString();
78     size_t bytesSize = provider.ConsumeIntegralInRange<size_t>(NUM_MIN, NUM_MAX);
79     std::vector<uint8_t> value = provider.ConsumeBytes<uint8_t>(bytesSize);
80     PreferencesFuzzTest::Preferences_->Put(key, value);
81     PreferencesFuzzTest::Preferences_->Get(key, 0);
82     return;
83 }
84 
HasFuzz(FuzzedDataProvider & provider)85 void HasFuzz(FuzzedDataProvider &provider)
86 {
87     std::string key = provider.ConsumeRandomLengthString();
88     auto value = provider.ConsumeIntegral<int32_t>();
89     PreferencesFuzzTest::Preferences_->PutInt(key, value);
90     PreferencesFuzzTest::Preferences_->HasKey(key);
91     return;
92 }
93 
GetValueFuzz(FuzzedDataProvider & provider)94 void GetValueFuzz(FuzzedDataProvider &provider)
95 {
96     std::string key = provider.ConsumeRandomLengthString();
97     auto value = provider.ConsumeIntegral<int32_t>();
98     PreferencesFuzzTest::Preferences_->PutInt(key, value);
99     PreferencesFuzzTest::Preferences_->GetValue(key, 0);
100     return;
101 }
102 
GetAllFuzz(FuzzedDataProvider & provider)103 void GetAllFuzz(FuzzedDataProvider &provider)
104 {
105     std::string key = provider.ConsumeRandomLengthString();
106     auto value = provider.ConsumeIntegral<int32_t>();
107     PreferencesFuzzTest::Preferences_->PutInt(key, value);
108     PreferencesFuzzTest::Preferences_->GetAll();
109     return;
110 }
111 
GetAllDataFuzz(FuzzedDataProvider & provider)112 void GetAllDataFuzz(FuzzedDataProvider &provider)
113 {
114     std::string key = provider.ConsumeRandomLengthString();
115     auto value = provider.ConsumeIntegral<int32_t>();
116     PreferencesFuzzTest::Preferences_->PutInt(key, value);
117     PreferencesFuzzTest::Preferences_->GetAllData();
118     return;
119 }
120 
GetAllDatasFuzz(FuzzedDataProvider & provider)121 void GetAllDatasFuzz(FuzzedDataProvider &provider)
122 {
123     std::string key = provider.ConsumeRandomLengthString();
124     auto value = provider.ConsumeIntegral<int32_t>();
125     PreferencesFuzzTest::Preferences_->PutInt(key, value);
126     PreferencesFuzzTest::Preferences_->GetAllDatas();
127     return;
128 }
129 
PutIntFuzz(FuzzedDataProvider & provider)130 void PutIntFuzz(FuzzedDataProvider &provider)
131 {
132     std::string key = provider.ConsumeRandomLengthString();
133     auto value = provider.ConsumeIntegral<int32_t>();
134     PreferencesFuzzTest::Preferences_->PutInt(key, value);
135     return;
136 }
137 
GetIntFuzz(FuzzedDataProvider & provider)138 void GetIntFuzz(FuzzedDataProvider &provider)
139 {
140     std::string key = provider.ConsumeRandomLengthString();
141     auto value = provider.ConsumeIntegral<int32_t>();
142     PreferencesFuzzTest::Preferences_->PutInt(key, value);
143     PreferencesFuzzTest::Preferences_->GetInt(key);
144     return;
145 }
146 
PutStringFuzz(FuzzedDataProvider & provider)147 void PutStringFuzz(FuzzedDataProvider &provider)
148 {
149     std::string key = provider.ConsumeRandomLengthString();
150     std::string value = provider.ConsumeRandomLengthString();
151     PreferencesFuzzTest::Preferences_->PutString(key, value);
152     return;
153 }
154 
GetStringFuzz(FuzzedDataProvider & provider)155 void GetStringFuzz(FuzzedDataProvider &provider)
156 {
157     std::string key = provider.ConsumeRandomLengthString();
158     std::string value = provider.ConsumeRandomLengthString();
159     PreferencesFuzzTest::Preferences_->PutString(key, value);
160     PreferencesFuzzTest::Preferences_->GetString(key);
161     return;
162 }
163 
PutBoolFuzz(FuzzedDataProvider & provider)164 void PutBoolFuzz(FuzzedDataProvider &provider)
165 {
166     std::string key = provider.ConsumeRandomLengthString();
167     auto value = provider.ConsumeBool();
168     PreferencesFuzzTest::Preferences_->PutBool(key, value);
169     return;
170 }
171 
GetBoolFuzz(FuzzedDataProvider & provider)172 void GetBoolFuzz(FuzzedDataProvider &provider)
173 {
174     std::string key = provider.ConsumeRandomLengthString();
175     auto value = provider.ConsumeBool();
176     PreferencesFuzzTest::Preferences_->PutBool(key, value);
177     PreferencesFuzzTest::Preferences_->GetBool(key);
178     return;
179 }
180 
PutFloatFuzz(FuzzedDataProvider & provider)181 void PutFloatFuzz(FuzzedDataProvider &provider)
182 {
183     std::string key = provider.ConsumeRandomLengthString();
184     auto value = provider.ConsumeFloatingPoint<float>();
185     PreferencesFuzzTest::Preferences_->PutFloat(key, value);
186     return;
187 }
188 
GetFloatFuzz(FuzzedDataProvider & provider)189 void GetFloatFuzz(FuzzedDataProvider &provider)
190 {
191     std::string key = provider.ConsumeRandomLengthString();
192     auto value = provider.ConsumeFloatingPoint<float>();
193     PreferencesFuzzTest::Preferences_->PutFloat(key, value);
194     PreferencesFuzzTest::Preferences_->GetFloat(key);
195     return;
196 }
197 
PutDoubleFuzz(FuzzedDataProvider & provider)198 void PutDoubleFuzz(FuzzedDataProvider &provider)
199 {
200     std::string key = provider.ConsumeRandomLengthString();
201     auto value = provider.ConsumeFloatingPoint<double>();
202     PreferencesFuzzTest::Preferences_->PutDouble(key, value);
203     return;
204 }
205 
GetDoubleFuzz(FuzzedDataProvider & provider)206 void GetDoubleFuzz(FuzzedDataProvider &provider)
207 {
208     std::string key = provider.ConsumeRandomLengthString();
209     auto value = provider.ConsumeFloatingPoint<double>();
210     PreferencesFuzzTest::Preferences_->PutDouble(key, value);
211     PreferencesFuzzTest::Preferences_->GetDouble(key);
212     return;
213 }
214 
PutLongFuzz(FuzzedDataProvider & provider)215 void PutLongFuzz(FuzzedDataProvider &provider)
216 {
217     std::string key = provider.ConsumeRandomLengthString();
218     auto value = provider.ConsumeFloatingPoint<double>();
219     PreferencesFuzzTest::Preferences_->PutLong(key, value);
220     return;
221 }
222 
GetLongFuzz(FuzzedDataProvider & provider)223 void GetLongFuzz(FuzzedDataProvider &provider)
224 {
225     std::string key = provider.ConsumeRandomLengthString();
226     auto value = provider.ConsumeFloatingPoint<double>();
227     PreferencesFuzzTest::Preferences_->PutLong(key, value);
228     PreferencesFuzzTest::Preferences_->GetLong(key);
229     return;
230 }
231 
DeleteFuzz(FuzzedDataProvider & provider)232 void DeleteFuzz(FuzzedDataProvider &provider)
233 {
234     std::string key = provider.ConsumeRandomLengthString();
235     auto value = provider.ConsumeFloatingPoint<double>();
236     PreferencesFuzzTest::Preferences_->PutLong(key, value);
237     PreferencesFuzzTest::Preferences_->Delete(key);
238     return;
239 }
240 
ClearFuzz(FuzzedDataProvider & provider)241 void ClearFuzz(FuzzedDataProvider &provider)
242 {
243     std::string key = provider.ConsumeRandomLengthString();
244     auto value = provider.ConsumeFloatingPoint<double>();
245     PreferencesFuzzTest::Preferences_->PutLong(key, value);
246     PreferencesFuzzTest::Preferences_->Clear();
247     return;
248 }
249 
FlushFuzz(FuzzedDataProvider & provider)250 void FlushFuzz(FuzzedDataProvider &provider)
251 {
252     std::string key = provider.ConsumeRandomLengthString();
253     auto value = provider.ConsumeFloatingPoint<double>();
254     PreferencesFuzzTest::Preferences_->PutLong(key, value);
255     PreferencesFuzzTest::Preferences_->Flush();
256     PreferencesFuzzTest::Preferences_->GetLong(key);
257     PreferencesHelper::DeletePreferences("/data/test/test");
258     return;
259 }
260 
FlushSyncFuzz(FuzzedDataProvider & provider)261 void FlushSyncFuzz(FuzzedDataProvider &provider)
262 {
263     std::string key = provider.ConsumeRandomLengthString();
264     auto value = provider.ConsumeFloatingPoint<double>();
265     PreferencesFuzzTest::Preferences_->PutLong(key, value);
266     PreferencesFuzzTest::Preferences_->FlushSync();
267     PreferencesFuzzTest::Preferences_->GetLong(key);
268     PreferencesHelper::DeletePreferences("/data/test/test");
269     return;
270 }
271 } // namespace OHOS
272 
273 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)274 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
275 {
276     /* Run your code on data */
277     FuzzedDataProvider provider(data, size);
278     OHOS::PreferencesFuzzTest::SetUpTestCase();
279     OHOS::PutVectorFuzz(provider);
280     OHOS::GetVectorFuzz(provider);
281     OHOS::HasFuzz(provider);
282     OHOS::GetValueFuzz(provider);
283     OHOS::GetAllFuzz(provider);
284     OHOS::GetAllDataFuzz(provider);
285     OHOS::GetAllDatasFuzz(provider);
286     OHOS::PutIntFuzz(provider);
287     OHOS::GetIntFuzz(provider);
288     OHOS::PutStringFuzz(provider);
289     OHOS::GetStringFuzz(provider);
290     OHOS::PutBoolFuzz(provider);
291     OHOS::GetBoolFuzz(provider);
292     OHOS::PutFloatFuzz(provider);
293     OHOS::GetFloatFuzz(provider);
294     OHOS::PutDoubleFuzz(provider);
295     OHOS::PutLongFuzz(provider);
296     OHOS::GetDoubleFuzz(provider);
297     OHOS::GetLongFuzz(provider);
298     OHOS::DeleteFuzz(provider);
299     OHOS::ClearFuzz(provider);
300     OHOS::FlushFuzz(provider);
301     OHOS::FlushSyncFuzz(provider);
302     OHOS::PreferencesFuzzTest::TearDownTestCase();
303     return 0;
304 }