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