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 }