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