Skip to content

Commit 70719dc

Browse files
cataphractclaude
andauthored
Remove default allocator arguments (#486)
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
1 parent 3a06266 commit 70719dc

File tree

131 files changed

+1927
-1431
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

131 files changed

+1927
-1431
lines changed

.dockerignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@
44
/Debug
55
/Release
66
/RelWithDebInfo
7+
/build

examples/example.cpp

Lines changed: 69 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -9,37 +9,41 @@ namespace YAML {
99
template <> struct as_if<ddwaf_object, void> {
1010
explicit as_if(const Node &node_) : node(node_) {}
1111

12-
static ddwaf_object yaml_to_object_helper(const Node &node)
12+
static ddwaf_object yaml_to_object_helper(const Node &node, ddwaf_allocator alloc)
1313
{
1414
ddwaf_object arg;
1515
switch (node.Type()) {
1616
case NodeType::Sequence:
17-
ddwaf_object_array(&arg);
17+
ddwaf_object_set_array(&arg, 0, alloc);
1818
break;
1919
case NodeType::Map:
20-
ddwaf_object_map(&arg);
20+
ddwaf_object_set_map(&arg, 0, alloc);
2121
break;
2222
case NodeType::Scalar:
23-
ddwaf_object_string(&arg, node.Scalar().c_str());
23+
{
24+
auto scalar = node.Scalar();
25+
ddwaf_object_set_string(&arg, scalar.c_str(), scalar.size(), alloc);
26+
}
2427
break;
2528
case NodeType::Null:
26-
ddwaf_object_null(&arg);
29+
ddwaf_object_set_null(&arg);
2730
break;
2831
case NodeType::Undefined:
2932
default:
30-
ddwaf_object_invalid(&arg);
33+
ddwaf_object_set_invalid(&arg);
3134
break;
3235
}
3336
return arg;
3437
}
3538

3639
ddwaf_object operator()() const
3740
{
38-
std::list<std::tuple<ddwaf_object &, YAML::Node, YAML::Node::const_iterator>> stack;
41+
auto alloc = ddwaf_get_default_allocator();
42+
std::list<std::tuple<ddwaf_object *, YAML::Node, YAML::Node::const_iterator>> stack;
3943

40-
ddwaf_object root = yaml_to_object_helper(node);
44+
ddwaf_object root = yaml_to_object_helper(node, alloc);
4145
if (root.type == DDWAF_OBJ_MAP || root.type == DDWAF_OBJ_ARRAY) {
42-
stack.emplace_back(root, node, node.begin());
46+
stack.emplace_back(&root, node, node.begin());
4347
}
4448

4549
while (!stack.empty()) {
@@ -48,16 +52,18 @@ template <> struct as_if<ddwaf_object, void> {
4852

4953
for (; it != parent_node.end(); ++it) {
5054
YAML::Node child_node = parent_node.IsMap() ? it->second : *it;
51-
auto child_obj = yaml_to_object_helper(child_node);
52-
if (parent_obj.type == DDWAF_OBJ_MAP) {
55+
auto child_obj = yaml_to_object_helper(child_node, alloc);
56+
ddwaf_object *child_ptr = nullptr;
57+
if (parent_obj->type == DDWAF_OBJ_MAP) {
5358
auto key = it->first.as<std::string>();
54-
ddwaf_object_map_add(&parent_obj, key.c_str(), &child_obj);
55-
} else if (parent_obj.type == DDWAF_OBJ_ARRAY) {
56-
ddwaf_object_array_add(&parent_obj, &child_obj);
59+
child_ptr = ddwaf_object_insert_key(parent_obj, key.c_str(), key.size(), alloc);
60+
*child_ptr = child_obj;
61+
} else if (parent_obj->type == DDWAF_OBJ_ARRAY) {
62+
child_ptr = ddwaf_object_insert(parent_obj, alloc);
63+
*child_ptr = child_obj;
5764
}
5865

5966
if (child_obj.type == DDWAF_OBJ_MAP || child_obj.type == DDWAF_OBJ_ARRAY) {
60-
auto &child_ptr = parent_obj.array[parent_obj.nbEntries - 1];
6167
stack.emplace_back(child_ptr, child_node, child_node.begin());
6268
++it;
6369
break;
@@ -83,19 +89,25 @@ YAML::Node object_to_yaml_helper(const ddwaf_object &obj)
8389
YAML::Node output;
8490
switch (obj.type) {
8591
case DDWAF_OBJ_BOOL:
86-
output = obj.boolean;
92+
output = ddwaf_object_get_bool(&obj);
8793
break;
8894
case DDWAF_OBJ_SIGNED:
89-
output = obj.intValue;
95+
output = ddwaf_object_get_signed(&obj);
9096
break;
9197
case DDWAF_OBJ_UNSIGNED:
92-
output = obj.uintValue;
98+
output = ddwaf_object_get_unsigned(&obj);
9399
break;
94100
case DDWAF_OBJ_FLOAT:
95-
output = obj.f64;
101+
output = ddwaf_object_get_float(&obj);
96102
break;
97103
case DDWAF_OBJ_STRING:
98-
output = std::string{obj.stringValue, obj.nbEntries};
104+
case DDWAF_OBJ_LITERAL_STRING:
105+
case DDWAF_OBJ_SMALL_STRING:
106+
{
107+
size_t length;
108+
const char* str = ddwaf_object_get_string(&obj, &length);
109+
output = std::string{str, length};
110+
}
99111
break;
100112
case DDWAF_OBJ_MAP:
101113
output = YAML::Load("{}");
@@ -126,21 +138,34 @@ YAML::Node object_to_yaml(const ddwaf_object &obj)
126138
auto current_depth = stack.size();
127139
auto &[parent_obj, parent_node, index] = stack.back();
128140

129-
for (; index < parent_obj.nbEntries; ++index) {
130-
auto &child_obj = parent_obj.array[index];
131-
auto child_node = object_to_yaml_helper(child_obj);
132-
141+
size_t size = ddwaf_object_get_size(&parent_obj);
142+
for (; index < size; ++index) {
143+
const ddwaf_object *child_obj = nullptr;
133144
if (parent_obj.type == DDWAF_OBJ_MAP) {
134-
std::string key{child_obj.parameterName, child_obj.parameterNameLength};
145+
child_obj = ddwaf_object_at_value(&parent_obj, index);
146+
auto *key_obj = ddwaf_object_at_key(&parent_obj, index);
147+
size_t key_len;
148+
const char* key_str = ddwaf_object_get_string(key_obj, &key_len);
149+
std::string key{key_str, key_len};
150+
151+
auto child_node = object_to_yaml_helper(*child_obj);
135152
parent_node[key] = child_node;
153+
154+
if (child_obj->type == DDWAF_OBJ_MAP || child_obj->type == DDWAF_OBJ_ARRAY) {
155+
stack.emplace_back(*child_obj, child_node, 0);
156+
++index;
157+
break;
158+
}
136159
} else if (parent_obj.type == DDWAF_OBJ_ARRAY) {
160+
child_obj = ddwaf_object_at_value(&parent_obj, index);
161+
auto child_node = object_to_yaml_helper(*child_obj);
137162
parent_node.push_back(child_node);
138-
}
139163

140-
if (child_obj.type == DDWAF_OBJ_MAP || child_obj.type == DDWAF_OBJ_ARRAY) {
141-
stack.emplace_back(child_obj, child_node, 0);
142-
++index;
143-
break;
164+
if (child_obj->type == DDWAF_OBJ_MAP || child_obj->type == DDWAF_OBJ_ARRAY) {
165+
stack.emplace_back(*child_obj, child_node, 0);
166+
++index;
167+
break;
168+
}
144169
}
145170
}
146171

@@ -175,29 +200,34 @@ version: "2.1"
175200

176201
int main()
177202
{
178-
YAML::Node doc = YAML::Load(waf_rule.data(), waf_rule.size());
203+
auto alloc = ddwaf_get_default_allocator();
179204

180-
auto rule = doc.as<ddwaf_object>(); //= convert_yaml_to_args(doc);
181-
ddwaf_handle handle = ddwaf_init(&rule, nullptr, nullptr);
205+
YAML::Node doc = YAML::Load(waf_rule.data());
206+
207+
auto rule = doc.as<ddwaf_object>();
208+
ddwaf_handle handle = ddwaf_init(&rule, nullptr);
182209
ddwaf_object_destroy(&rule, alloc);
183210
if (handle == nullptr) {
184211
return EXIT_FAILURE;
185212
}
186213

187-
ddwaf_context context = ddwaf_context_init(handle);
214+
ddwaf_context context = ddwaf_context_init(handle, alloc);
188215
if (context == nullptr) {
189216
ddwaf_destroy(handle);
190217
return EXIT_FAILURE;
191218
}
192219

193220
ddwaf_object root;
194-
ddwaf_object tmp;
195-
ddwaf_object_map(&root);
196-
ddwaf_object_map_add(&root, "arg1", ddwaf_object_string(&tmp, "string 1"));
197-
ddwaf_object_map_add(&root, "arg2", ddwaf_object_string(&tmp, "string 2"));
221+
ddwaf_object_set_map(&root, 2, alloc);
222+
223+
ddwaf_object *arg1 = ddwaf_object_insert_literal_key(&root, "arg1", 4, alloc);
224+
ddwaf_object_set_string_literal(arg1, "string 1", 8);
225+
226+
ddwaf_object *arg2 = ddwaf_object_insert_literal_key(&root, "arg2", 4, alloc);
227+
ddwaf_object_set_string_literal(arg2, "string 2", 8);
198228

199229
ddwaf_object ret;
200-
auto code = ddwaf_context_eval(context, &root, nullptr, &ret, LONG_TIME);
230+
auto code = ddwaf_context_eval(context, &root, alloc, &ret, LONG_TIME);
201231
std::cout << "Output second run: " << code << '\n';
202232
if (code == DDWAF_MATCH) {
203233
YAML::Emitter out(std::cout);

fuzzer/cmdi_detector/src/main.cpp

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -188,11 +188,15 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *bytes, size_t size)
188188

189189
auto [resource, param] = deserialize(bytes, size);
190190

191-
auto root = owned_object::make_map();
192-
root.emplace("server.request.query", owned_object::make_string(param));
193-
194-
auto array = root.emplace("server.sys.exec.cmd", owned_object::make_array());
195-
for (auto arg : resource) { array.emplace_back(owned_object::make_string(arg)); }
191+
auto root = owned_object::make_map(0, ddwaf::memory::get_default_resource());
192+
root.emplace("server.request.query",
193+
owned_object::make_string(param, ddwaf::memory::get_default_resource()));
194+
195+
auto array = root.emplace(
196+
"server.sys.exec.cmd", owned_object::make_array(0, ddwaf::memory::get_default_resource()));
197+
for (auto arg : resource) {
198+
array.emplace_back(owned_object::make_string(arg, ddwaf::memory::get_default_resource()));
199+
}
196200

197201
object_store store;
198202
store.insert(std::move(root));

fuzzer/http_endpoint_fingerprint/src/main.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,15 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *bytes, size_t size)
1717
{
1818
random_buffer buffer{bytes, size};
1919

20-
auto query = owned_object::make_map();
20+
auto query = owned_object::make_map(0, ddwaf::memory::get_default_resource());
2121
auto query_size = buffer.get<uint8_t>();
2222
for (uint8_t i = 0; i < query_size; ++i) {
2323
auto key = buffer.get<std::string_view>();
2424
auto value = buffer.get<std::string_view>();
2525
query.emplace(key, value);
2626
}
2727

28-
auto body = owned_object::make_map();
28+
auto body = owned_object::make_map(0, ddwaf::memory::get_default_resource());
2929
auto body_size = buffer.get<uint8_t>();
3030
for (uint8_t i = 0; i < body_size; ++i) {
3131
auto key = buffer.get<std::string_view>();
@@ -41,8 +41,8 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *bytes, size_t size)
4141
gen.eval_impl({.address = {}, .key_path = {}, .value = buffer.get<std::string_view>()},
4242
{.address = {}, .key_path = {}, .value = buffer.get<std::string_view>()},
4343
{{.address = {}, .key_path = {}, .value = query}},
44-
{{.address = {}, .key_path = {}, .value = body}}, cache, memory::get_default_resource(),
45-
deadline);
44+
{{.address = {}, .key_path = {}, .value = body}}, cache,
45+
ddwaf::memory::get_default_resource(), deadline);
4646

4747
return 0;
4848
}

fuzzer/http_header_fingerprint/src/main.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *bytes, size_t size)
2222

2323
random_buffer buffer{bytes, size};
2424

25-
auto header = owned_object::make_map();
25+
auto header = owned_object::make_map(0, ddwaf::memory::get_default_resource());
2626
auto header_size = buffer.get<uint8_t>();
2727
for (uint8_t i = 0; i < header_size; ++i) {
2828
auto value = buffer.get<std::string_view>();
@@ -41,7 +41,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *bytes, size_t size)
4141
processor_cache cache;
4242
ddwaf::timer deadline{2s};
4343
auto output = gen.eval_impl({.address = {}, .key_path = {}, .value = header}, cache,
44-
memory::get_default_resource(), deadline);
44+
ddwaf::memory::get_default_resource(), deadline);
4545

4646
return 0;
4747
}

fuzzer/http_network_fingerprint/src/main.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *bytes, size_t size)
2121

2222
random_buffer buffer{bytes, size};
2323

24-
auto header = owned_object::make_map();
24+
auto header = owned_object::make_map(0, ddwaf::memory::get_default_resource());
2525
auto header_size = buffer.get<uint8_t>();
2626
for (uint8_t i = 0; i < header_size; ++i) {
2727
auto value = buffer.get<std::string_view>();
@@ -40,7 +40,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *bytes, size_t size)
4040
processor_cache cache;
4141
ddwaf::timer deadline{2s};
4242
auto output = gen.eval_impl({.address = {}, .key_path = {}, .value = header}, cache,
43-
memory::get_default_resource(), deadline);
43+
ddwaf::memory::get_default_resource(), deadline);
4444

4545
return 0;
4646
}

fuzzer/jwt_decode/src/main.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,16 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *bytes, size_t size)
1818
// NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
1919
std::string_view value{reinterpret_cast<const char *>(bytes), size};
2020

21-
auto headers = object_builder::map({{"authorization", value}});
21+
auto headers =
22+
object_builder::map({{"authorization", value}}, ddwaf::memory::get_default_resource());
2223

2324
jwt_decode gen{"id", {}, {}, false, true};
2425

2526
processor_cache cache;
2627
ddwaf::timer deadline{2s};
2728
static const std::vector<std::variant<std::string, int64_t>> key_path{"authorization"};
2829
auto output = gen.eval_impl({.address = {}, .key_path = key_path, .value = headers}, cache,
29-
memory::get_default_resource(), deadline);
30+
ddwaf::memory::get_default_resource(), deadline);
3031

3132
return 0;
3233
}

fuzzer/lfi_detector/src/main.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -111,9 +111,11 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *bytes, size_t size)
111111
lfi_detector cond{{gen_param_def("server.io.fs.file", "server.request.query")}};
112112

113113
auto [resource, param] = deserialize(bytes, size);
114-
auto root = owned_object::make_map();
115-
root.emplace("server.request.query", owned_object::make_string(param));
116-
root.emplace("server.io.fs.file", owned_object::make_string(resource));
114+
auto root = owned_object::make_map(0, ddwaf::memory::get_default_resource());
115+
root.emplace("server.request.query",
116+
owned_object::make_string(param, ddwaf::memory::get_default_resource()));
117+
root.emplace("server.io.fs.file",
118+
owned_object::make_string(resource, ddwaf::memory::get_default_resource()));
117119

118120
object_store store;
119121
store.insert(std::move(root));

fuzzer/session_fingerprint/src/main.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *bytes, size_t size)
1717
{
1818
random_buffer buffer{bytes, size};
1919

20-
auto cookies = owned_object::make_map();
20+
auto cookies = owned_object::make_map(0, ddwaf::memory::get_default_resource());
2121
auto cookies_size = buffer.get<uint8_t>();
2222
for (uint8_t i = 0; i < cookies_size; ++i) {
2323
auto key = buffer.get<std::string_view>();
@@ -34,7 +34,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *bytes, size_t size)
3434
auto output = gen.eval_impl({{.address = {}, .key_path = {}, .value = cookies}},
3535
{{.address = {}, .key_path = {}, .value = buffer.get<std::string_view>()}},
3636
{{.address = {}, .key_path = {}, .value = buffer.get<std::string_view>()}}, cache,
37-
memory::get_default_resource(), deadline);
37+
ddwaf::memory::get_default_resource(), deadline);
3838

3939
return 0;
4040
}

fuzzer/shi_detector_array/src/main.cpp

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -188,11 +188,15 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *bytes, size_t size)
188188

189189
auto [resource, param] = deserialize(bytes, size);
190190

191-
auto root = owned_object::make_map();
192-
root.emplace("server.request.query", owned_object::make_string(param));
193-
194-
auto array = root.emplace("server.sys.shell.cmd", owned_object::make_array());
195-
for (auto arg : resource) { array.emplace_back(owned_object::make_string(arg)); }
191+
auto root = owned_object::make_map(0, ddwaf::memory::get_default_resource());
192+
root.emplace("server.request.query",
193+
owned_object::make_string(param, ddwaf::memory::get_default_resource()));
194+
195+
auto array = root.emplace(
196+
"server.sys.shell.cmd", owned_object::make_array(0, ddwaf::memory::get_default_resource()));
197+
for (auto arg : resource) {
198+
array.emplace_back(owned_object::make_string(arg, ddwaf::memory::get_default_resource()));
199+
}
196200

197201
object_store store;
198202
store.insert(std::move(root));

0 commit comments

Comments
 (0)