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 "oh_predicates_fuzzer.h"
17
18 #include <fuzzer/FuzzedDataProvider.h>
19
20 #include "grd_api_manager.h"
21 #include "oh_data_value.h"
22 #include "oh_data_values.h"
23 #include "oh_data_values_buckets.h"
24 #include "oh_predicates.h"
25 #include "oh_value_object.h"
26 #include "rdb_errno.h"
27 #include "relational_store.h"
28 #include "relational_store_error_code.h"
29 #include "relational_store_impl.h"
30
31 using namespace OHOS;
32 using namespace OHOS::NativeRdb;
33 using namespace OHOS::RdbNdk;
34
35 #define LENGTH_MIN 1
36 #define LENGTH_MAX 10
37
38 #define STRING_LENGTH_MAX 20
39
40 namespace OHOS {
41
ConsumeRandomLengthValueObjectVector(FuzzedDataProvider & provider)42 std::vector<OH_VObject *> ConsumeRandomLengthValueObjectVector(FuzzedDataProvider &provider)
43 {
44 size_t loops = provider.ConsumeIntegralInRange<size_t>(LENGTH_MIN, LENGTH_MAX);
45 std::vector<OH_VObject *> columns;
46 for (size_t i = 0; i < loops; ++i) {
47 OH_VObject *obj = OH_Rdb_CreateValueObject();
48 columns.emplace_back(obj);
49 }
50 return columns;
51 }
52
TestOH_Predicates_equalTo(FuzzedDataProvider & provider)53 void TestOH_Predicates_equalTo(FuzzedDataProvider &provider)
54 {
55 std::string table = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
56 OH_Predicates *predicates = OH_Rdb_CreatePredicates(table.c_str());
57 if (predicates == nullptr) {
58 return;
59 }
60 OH_VObject *obj = OH_Rdb_CreateValueObject();
61 if (obj == nullptr) {
62 predicates->destroy(predicates);
63 return;
64 }
65 std::string value = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
66 obj->putText(obj, value.c_str());
67 std::string field = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
68 predicates->equalTo(predicates, field.c_str(), obj);
69 predicates->destroy(predicates);
70 }
71
TestOH_Predicates_notEqualTo(FuzzedDataProvider & provider)72 void TestOH_Predicates_notEqualTo(FuzzedDataProvider &provider)
73 {
74 std::string table = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
75 OH_Predicates *predicates = OH_Rdb_CreatePredicates(table.c_str());
76 if (predicates == nullptr) {
77 return;
78 }
79 OH_VObject *obj = OH_Rdb_CreateValueObject();
80 if (obj == nullptr) {
81 predicates->destroy(predicates);
82 return;
83 }
84 std::string value = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
85 obj->putText(obj, value.c_str());
86 std::string field = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
87 predicates->notEqualTo(predicates, field.c_str(), obj);
88 predicates->destroy(predicates);
89 }
90
TestOH_Predicates_beginWrap(FuzzedDataProvider & provider)91 void TestOH_Predicates_beginWrap(FuzzedDataProvider &provider)
92 {
93 std::string table = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
94 OH_Predicates *predicates = OH_Rdb_CreatePredicates(table.c_str());
95 if (predicates == nullptr) {
96 return;
97 }
98 predicates->beginWrap(predicates);
99 predicates->destroy(predicates);
100 }
101
TestOH_Predicates_endWrap(FuzzedDataProvider & provider)102 void TestOH_Predicates_endWrap(FuzzedDataProvider &provider)
103 {
104 std::string table = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
105 OH_Predicates *predicates = OH_Rdb_CreatePredicates(table.c_str());
106 if (predicates == nullptr) {
107 return;
108 }
109 predicates->endWrap(predicates);
110 predicates->destroy(predicates);
111 }
112
TestOH_Predicates_orOperate(FuzzedDataProvider & provider)113 void TestOH_Predicates_orOperate(FuzzedDataProvider &provider)
114 {
115 std::string table = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
116 OH_Predicates *predicates = OH_Rdb_CreatePredicates(table.c_str());
117 if (predicates == nullptr) {
118 return;
119 }
120 predicates->orOperate(predicates);
121 predicates->destroy(predicates);
122 }
123
TestOH_Predicates_andOperate(FuzzedDataProvider & provider)124 void TestOH_Predicates_andOperate(FuzzedDataProvider &provider)
125 {
126 std::string table = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
127 OH_Predicates *predicates = OH_Rdb_CreatePredicates(table.c_str());
128 if (predicates == nullptr) {
129 return;
130 }
131 predicates->andOperate(predicates);
132 predicates->destroy(predicates);
133 }
134
TestOH_Predicates_isNull(FuzzedDataProvider & provider)135 void TestOH_Predicates_isNull(FuzzedDataProvider &provider)
136 {
137 std::string table = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
138 OH_Predicates *predicates = OH_Rdb_CreatePredicates(table.c_str());
139 if (predicates == nullptr) {
140 return;
141 }
142 std::string field = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
143 predicates->isNull(predicates, field.c_str());
144 predicates->destroy(predicates);
145 }
146
TestOH_Predicates_isNotNull(FuzzedDataProvider & provider)147 void TestOH_Predicates_isNotNull(FuzzedDataProvider &provider)
148 {
149 std::string table = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
150 OH_Predicates *predicates = OH_Rdb_CreatePredicates(table.c_str());
151 if (predicates == nullptr) {
152 return;
153 }
154 std::string field = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
155 predicates->isNotNull(predicates, field.c_str());
156 predicates->destroy(predicates);
157 }
158
TestOH_Predicates_like(FuzzedDataProvider & provider)159 void TestOH_Predicates_like(FuzzedDataProvider &provider)
160 {
161 std::string table = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
162 OH_Predicates *predicates = OH_Rdb_CreatePredicates(table.c_str());
163 if (predicates == nullptr) {
164 return;
165 }
166 OH_VObject *obj = OH_Rdb_CreateValueObject();
167 if (obj == nullptr) {
168 predicates->destroy(predicates);
169 return;
170 }
171 std::string value = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
172 obj->putText(obj, value.c_str());
173 std::string field = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
174 predicates->like(predicates, field.c_str(), obj);
175 predicates->destroy(predicates);
176 obj->destroy(obj);
177 }
178
TestOH_Predicates_between(FuzzedDataProvider & provider)179 void TestOH_Predicates_between(FuzzedDataProvider &provider)
180 {
181 std::string table = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
182 OH_Predicates *predicates = OH_Rdb_CreatePredicates(table.c_str());
183 if (predicates == nullptr) {
184 return;
185 }
186 OH_VObject *obj = OH_Rdb_CreateValueObject();
187 if (obj == nullptr) {
188 predicates->destroy(predicates);
189 return;
190 }
191 std::string value = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
192 obj->putText(obj, value.c_str());
193 std::string field = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
194 predicates->between(predicates, field.c_str(), obj);
195 predicates->destroy(predicates);
196 obj->destroy(obj);
197 }
198
TestOH_Predicates_notBetween(FuzzedDataProvider & provider)199 void TestOH_Predicates_notBetween(FuzzedDataProvider &provider)
200 {
201 std::string table = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
202 OH_Predicates *predicates = OH_Rdb_CreatePredicates(table.c_str());
203 if (predicates == nullptr) {
204 return;
205 }
206 OH_VObject *obj = OH_Rdb_CreateValueObject();
207 if (obj == nullptr) {
208 predicates->destroy(predicates);
209 return;
210 }
211 std::string value = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
212 obj->putText(obj, value.c_str());
213 std::string field = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
214 predicates->notBetween(predicates, field.c_str(), obj);
215 predicates->destroy(predicates);
216 obj->destroy(obj);
217 }
218
TestOH_Predicates_greaterThan(FuzzedDataProvider & provider)219 void TestOH_Predicates_greaterThan(FuzzedDataProvider &provider)
220 {
221 std::string table = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
222 OH_Predicates *predicates = OH_Rdb_CreatePredicates(table.c_str());
223 if (predicates == nullptr) {
224 return;
225 }
226 OH_VObject *obj = OH_Rdb_CreateValueObject();
227 if (obj == nullptr) {
228 predicates->destroy(predicates);
229 return;
230 }
231 std::string value = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
232 obj->putText(obj, value.c_str());
233 std::string field = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
234 predicates->greaterThan(predicates, field.c_str(), obj);
235 predicates->destroy(predicates);
236 obj->destroy(obj);
237 }
238
TestOH_Predicates_lessThan(FuzzedDataProvider & provider)239 void TestOH_Predicates_lessThan(FuzzedDataProvider &provider)
240 {
241 std::string table = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
242 OH_Predicates *predicates = OH_Rdb_CreatePredicates(table.c_str());
243 if (predicates == nullptr) {
244 return;
245 }
246 OH_VObject *obj = OH_Rdb_CreateValueObject();
247 if (obj == nullptr) {
248 predicates->destroy(predicates);
249 return;
250 }
251 std::string value = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
252 obj->putText(obj, value.c_str());
253 std::string field = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
254 predicates->lessThan(predicates, field.c_str(), obj);
255 predicates->destroy(predicates);
256 obj->destroy(obj);
257 }
258
TestOH_Predicates_greaterThanOrEqualTo(FuzzedDataProvider & provider)259 void TestOH_Predicates_greaterThanOrEqualTo(FuzzedDataProvider &provider)
260 {
261 std::string table = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
262 OH_Predicates *predicates = OH_Rdb_CreatePredicates(table.c_str());
263 if (predicates == nullptr) {
264 return;
265 }
266 OH_VObject *obj = OH_Rdb_CreateValueObject();
267 if (obj == nullptr) {
268 predicates->destroy(predicates);
269 return;
270 }
271 std::string value = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
272 obj->putText(obj, value.c_str());
273 std::string field = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
274 predicates->greaterThanOrEqualTo(predicates, field.c_str(), obj);
275 predicates->destroy(predicates);
276 obj->destroy(obj);
277 }
278
TestOH_Predicates_lessThanOrEqualTo(FuzzedDataProvider & provider)279 void TestOH_Predicates_lessThanOrEqualTo(FuzzedDataProvider &provider)
280 {
281 std::string table = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
282 OH_Predicates *predicates = OH_Rdb_CreatePredicates(table.c_str());
283 if (predicates == nullptr) {
284 return;
285 }
286 OH_VObject *obj = OH_Rdb_CreateValueObject();
287 if (obj == nullptr) {
288 predicates->destroy(predicates);
289 return;
290 }
291 std::string value = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
292 obj->putText(obj, value.c_str());
293 std::string field = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
294 predicates->lessThanOrEqualTo(predicates, field.c_str(), obj);
295 predicates->destroy(predicates);
296 obj->destroy(obj);
297 }
298
TestOH_Predicates_orderBy(FuzzedDataProvider & provider)299 void TestOH_Predicates_orderBy(FuzzedDataProvider &provider)
300 {
301 std::string table = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
302 OH_Predicates *predicates = OH_Rdb_CreatePredicates(table.c_str());
303 if (predicates == nullptr) {
304 return;
305 }
306 OH_VObject *obj = OH_Rdb_CreateValueObject();
307 if (obj == nullptr) {
308 predicates->destroy(predicates);
309 return;
310 }
311 std::string value = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
312 obj->putText(obj, value.c_str());
313 std::string field = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
314 OH_OrderType type = static_cast<OH_OrderType>(provider.ConsumeIntegral<int>());
315 predicates->orderBy(predicates, field.c_str(), type);
316 predicates->destroy(predicates);
317 obj->destroy(obj);
318 }
319
TestOH_Predicates_distinct(FuzzedDataProvider & provider)320 void TestOH_Predicates_distinct(FuzzedDataProvider &provider)
321 {
322 std::string table = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
323 OH_Predicates *predicates = OH_Rdb_CreatePredicates(table.c_str());
324 if (predicates == nullptr) {
325 return;
326 }
327 predicates->distinct(predicates);
328 predicates->destroy(predicates);
329 }
330
TestOH_Predicates_limit(FuzzedDataProvider & provider)331 void TestOH_Predicates_limit(FuzzedDataProvider &provider)
332 {
333 std::string table = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
334 OH_Predicates *predicates = OH_Rdb_CreatePredicates(table.c_str());
335 if (predicates == nullptr) {
336 return;
337 }
338 unsigned int value = provider.ConsumeIntegral<unsigned int>();
339 predicates->limit(predicates, value);
340 predicates->destroy(predicates);
341 }
342
TestOH_Predicates_offset(FuzzedDataProvider & provider)343 void TestOH_Predicates_offset(FuzzedDataProvider &provider)
344 {
345 std::string table = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
346 OH_Predicates *predicates = OH_Rdb_CreatePredicates(table.c_str());
347 if (predicates == nullptr) {
348 return;
349 }
350 unsigned int rowOffset = provider.ConsumeIntegral<unsigned int>();
351 predicates->offset(predicates, rowOffset);
352 predicates->destroy(predicates);
353 }
354
TestOH_Predicates_groupBy(FuzzedDataProvider & provider)355 void TestOH_Predicates_groupBy(FuzzedDataProvider &provider)
356 {
357 std::string table = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
358 OH_Predicates *predicates = OH_Rdb_CreatePredicates(table.c_str());
359 if (predicates == nullptr) {
360 return;
361 }
362 size_t loops = provider.ConsumeIntegralInRange<size_t>(LENGTH_MIN, LENGTH_MAX);
363 const char *fields[loops];
364 for (size_t i = 0; i < loops; ++i) {
365 static std::string fieldsString = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX).c_str();
366 fields[i] = fieldsString.c_str();
367 }
368 predicates->groupBy(predicates, fields, loops);
369 predicates->destroy(predicates);
370 }
371
TestOH_Predicates_in(FuzzedDataProvider & provider)372 void TestOH_Predicates_in(FuzzedDataProvider &provider)
373 {
374 std::string table = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
375 OH_Predicates *predicates = OH_Rdb_CreatePredicates(table.c_str());
376 if (predicates == nullptr) {
377 return;
378 }
379 std::string field = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
380 std::vector<OH_VObject *> values = ConsumeRandomLengthValueObjectVector(provider);
381 for (auto value : values) {
382 predicates->in(predicates, field.c_str(), value);
383 value->destroy(value);
384 }
385 predicates->destroy(predicates);
386 }
387
TestOH_Predicates_notIn(FuzzedDataProvider & provider)388 void TestOH_Predicates_notIn(FuzzedDataProvider &provider)
389 {
390 std::string table = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
391 OH_Predicates *predicates = OH_Rdb_CreatePredicates(table.c_str());
392 if (predicates == nullptr) {
393 return;
394 }
395 std::string field = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
396 std::vector<OH_VObject *> values = ConsumeRandomLengthValueObjectVector(provider);
397 for (auto value : values) {
398 predicates->notIn(predicates, field.c_str(), value);
399 value->destroy(value);
400 }
401 predicates->destroy(predicates);
402 }
403
TestOH_Predicates_Having(FuzzedDataProvider & provider)404 void TestOH_Predicates_Having(FuzzedDataProvider &provider)
405 {
406 std::string table = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
407 OH_Predicates *predicates = OH_Rdb_CreatePredicates(table.c_str());
408 if (predicates == nullptr) {
409 return;
410 }
411 std::string conditions = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
412 OH_Data_Values *values = OH_Values_Create();
413 OH_Predicates_Having(predicates, conditions.c_str(), values);
414 predicates->destroy(predicates);
415 }
416
TestOH_Predicates_NotLike(FuzzedDataProvider & provider)417 void TestOH_Predicates_NotLike(FuzzedDataProvider &provider)
418 {
419 std::string table = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
420 OH_Predicates *predicates = OH_Rdb_CreatePredicates(table.c_str());
421 if (predicates == nullptr) {
422 return;
423 }
424 std::string field = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
425 std::string pattern = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
426 OH_Predicates_NotLike(predicates, field.c_str(), pattern.c_str());
427 predicates->destroy(predicates);
428 }
429
TestOH_Predicates_Glob(FuzzedDataProvider & provider)430 void TestOH_Predicates_Glob(FuzzedDataProvider &provider)
431 {
432 std::string table = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
433 OH_Predicates *predicates = OH_Rdb_CreatePredicates(table.c_str());
434 if (predicates == nullptr) {
435 return;
436 }
437 std::string field = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
438 std::string pattern = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
439 OH_Predicates_Glob(predicates, field.c_str(), pattern.c_str());
440 predicates->destroy(predicates);
441 }
442
TestOH_Predicates_NotGlob(FuzzedDataProvider & provider)443 void TestOH_Predicates_NotGlob(FuzzedDataProvider &provider)
444 {
445 std::string table = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
446 OH_Predicates *predicates = OH_Rdb_CreatePredicates(table.c_str());
447 if (predicates == nullptr) {
448 return;
449 }
450 std::string field = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
451 std::string pattern = provider.ConsumeRandomLengthString(STRING_LENGTH_MAX);
452 OH_Predicates_NotGlob(predicates, field.c_str(), pattern.c_str());
453 predicates->destroy(predicates);
454 }
455 } // namespace OHOS
456
457 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)458 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
459 {
460 // Run your code on data
461 FuzzedDataProvider provider(data, size);
462 OHOS::TestOH_Predicates_equalTo(provider);
463 OHOS::TestOH_Predicates_notEqualTo(provider);
464 OHOS::TestOH_Predicates_beginWrap(provider);
465 OHOS::TestOH_Predicates_endWrap(provider);
466 OHOS::TestOH_Predicates_orOperate(provider);
467 OHOS::TestOH_Predicates_andOperate(provider);
468 OHOS::TestOH_Predicates_isNull(provider);
469 OHOS::TestOH_Predicates_isNotNull(provider);
470 OHOS::TestOH_Predicates_like(provider);
471 OHOS::TestOH_Predicates_between(provider);
472 OHOS::TestOH_Predicates_notBetween(provider);
473 OHOS::TestOH_Predicates_greaterThan(provider);
474 OHOS::TestOH_Predicates_lessThan(provider);
475 OHOS::TestOH_Predicates_greaterThanOrEqualTo(provider);
476 OHOS::TestOH_Predicates_lessThanOrEqualTo(provider);
477 OHOS::TestOH_Predicates_orderBy(provider);
478 OHOS::TestOH_Predicates_distinct(provider);
479 OHOS::TestOH_Predicates_limit(provider);
480 OHOS::TestOH_Predicates_offset(provider);
481 OHOS::TestOH_Predicates_groupBy(provider);
482 OHOS::TestOH_Predicates_in(provider);
483 OHOS::TestOH_Predicates_notIn(provider);
484 OHOS::TestOH_Predicates_Having(provider);
485 OHOS::TestOH_Predicates_NotLike(provider);
486 OHOS::TestOH_Predicates_Glob(provider);
487 OHOS::TestOH_Predicates_NotGlob(provider);
488 return 0;
489 }
490