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