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 #include "valuesbuckets_fuzzer.h"
16
17 #include <fuzzer/FuzzedDataProvider.h>
18
19 #include "value_object.h"
20 #include "values_bucket.h"
21 #include "values_buckets.h"
22
23 #define LOOPS_MIN 0
24 #define LOOPS_MAX 10
25
26 using namespace OHOS;
27 using namespace OHOS::NativeRdb;
28
29 namespace OHOS {
30
ConsumeRandomLengthValueObjectVector(FuzzedDataProvider & provider)31 std::vector<ValueObject> ConsumeRandomLengthValueObjectVector(FuzzedDataProvider &provider)
32 {
33 size_t loops = provider.ConsumeIntegralInRange<size_t>(LOOPS_MIN, LOOPS_MAX);
34 std::vector<ValueObject> columns;
35 for (size_t i = 0; i < loops; ++i) {
36 int32_t value = provider.ConsumeIntegral<int32_t>();
37 ValueObject obj(value);
38 columns.emplace_back(obj);
39 }
40 return columns;
41 }
42
ConsumeRandomLengthStringVector(FuzzedDataProvider & provider)43 std::vector<std::string> ConsumeRandomLengthStringVector(FuzzedDataProvider &provider)
44 {
45 size_t loops = provider.ConsumeIntegralInRange<size_t>(LOOPS_MIN, LOOPS_MAX);
46 std::vector<std::string> columns;
47 for (size_t i = 0; i < loops; ++i) {
48 int32_t length = provider.ConsumeIntegral<int32_t>();
49 auto bytes = provider.ConsumeBytes<char>(length);
50 columns.emplace_back(bytes.begin(), bytes.end());
51 }
52 return columns;
53 }
54
ValuesBucketsReserveFuzz(FuzzedDataProvider & provider)55 void ValuesBucketsReserveFuzz(FuzzedDataProvider &provider)
56 {
57 ValuesBuckets buckets;
58 int32_t size = provider.ConsumeIntegralInRange<int32_t>(LOOPS_MIN, LOOPS_MAX);
59 buckets.Reserve(size);
60 }
61
ValuesBucketsPutFuzz(FuzzedDataProvider & provider)62 void ValuesBucketsPutFuzz(FuzzedDataProvider &provider)
63 {
64 ValuesBuckets buckets;
65 std::vector<std::string> fields = ConsumeRandomLengthStringVector(provider);
66 std::vector<ValueObject> values = ConsumeRandomLengthValueObjectVector(provider);
67 size_t loopsNum = fields.size();
68 if (loopsNum > values.size()) {
69 loopsNum = values.size();
70 }
71 ValuesBucket bucket;
72 for (size_t i = 0; i < loopsNum; i++) {
73 bucket.Put(fields[i], values[i]);
74 }
75 buckets.Put(bucket);
76 }
77
ValuesBucketsGetFuzz(FuzzedDataProvider & provider)78 void ValuesBucketsGetFuzz(FuzzedDataProvider &provider)
79 {
80 ValuesBuckets buckets;
81 std::vector<std::string> fields = ConsumeRandomLengthStringVector(provider);
82 std::vector<ValueObject> values = ConsumeRandomLengthValueObjectVector(provider);
83 size_t loopsNum = fields.size();
84 if (loopsNum > values.size()) {
85 loopsNum = values.size();
86 }
87 ValuesBucket bucket;
88 for (size_t i = 0; i < loopsNum; ++i) {
89 bucket.Put(fields[i], values[i]);
90 }
91 buckets.Put(bucket);
92 size_t row = provider.ConsumeIntegral<size_t>();
93 std::string field = provider.ConsumeRandomLengthString();
94 buckets.Get(row, field);
95 }
96
97 } // namespace OHOS
98
99 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)100 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
101 {
102 FuzzedDataProvider provider(data, size);
103 OHOS::ValuesBucketsReserveFuzz(provider);
104 OHOS::ValuesBucketsPutFuzz(provider);
105 OHOS::ValuesBucketsGetFuzz(provider);
106 return 0;
107 }
108