Skip to content

Commit b971805

Browse files
committed
Upgrade to libbdwaf pre-v2
1 parent 212de0b commit b971805

File tree

20 files changed

+760
-529
lines changed

20 files changed

+760
-529
lines changed

appsec/src/helper/engine.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,15 +86,16 @@ std::optional<engine::result> engine::context::publish(
8686
{
8787
// Once the parameter reaches this function, it is guaranteed to be
8888
// owned by the engine.
89+
// XXX: this unnecessarily keeps transient data
8990
prev_published_params_.push_back(std::move(param));
9091

91-
parameter_view data(prev_published_params_.back());
92+
parameter_view data{*&prev_published_params_.back()};
9293
if (!data.is_map()) {
9394
throw invalid_object(".", "not a map");
9495
}
9596

96-
for (const auto &entry : data) {
97-
DD_STDLOG(DD_STDLOG_IG_DATA_PUSHED, entry.key());
97+
for (const auto &[key, value] : data.map_iterable()) {
98+
DD_STDLOG(DD_STDLOG_IG_DATA_PUSHED, key);
9899
}
99100

100101
event event;

appsec/src/helper/json_helper.cpp

Lines changed: 33 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -43,25 +43,30 @@ void parameter_to_json_helper(const parameter_view &pv, T &output,
4343
break;
4444
case parameter_type::map:
4545
output.SetObject();
46-
for (const auto &v : pv) {
46+
for (const auto &[k, v] : pv.map_iterable()) {
4747
rapidjson::Value key;
4848
rapidjson::Value value;
4949
parameter_to_json_helper(v, value, alloc);
5050

51-
std::string_view const sv = v.key();
52-
key.SetString(sv.data(), sv.size(), alloc);
51+
key.SetString(k.data(), k.size(), alloc);
5352

5453
output.AddMember(key, value, alloc);
5554
}
5655
break;
5756
case parameter_type::array:
5857
output.SetArray();
59-
for (const auto &v : pv) {
58+
for (const auto &v : pv.array_iterable()) {
6059
rapidjson::Value value;
6160
parameter_to_json_helper(v, value, alloc);
6261
output.PushBack(value, alloc);
6362
}
6463
break;
64+
case parameter_type::float64:
65+
output.SetDouble(double(pv));
66+
break;
67+
case parameter_type::null:
68+
output.SetNull();
69+
break;
6570
case parameter_type::invalid:
6671
throw std::runtime_error("invalid parameter in structure");
6772
};
@@ -97,60 +102,66 @@ template <typename T, typename = std::enable_if_t<std::disjunction_v<
97102
// NOLINTNEXTLINE(misc-no-recursion)
98103
void json_to_object(ddwaf_object *object, T &doc)
99104
{
105+
static constexpr size_t default_capacity = 16;
106+
auto *alloc = ddwaf_get_default_allocator();
107+
100108
switch (doc.GetType()) {
101109
case rapidjson::kFalseType:
102-
ddwaf_object_stringl(object, "false", sizeof("false") - 1);
110+
ddwaf_object_set_bool(object, false);
103111
break;
104112
case rapidjson::kTrueType:
105-
ddwaf_object_stringl(object, "true", sizeof("true") - 1);
113+
ddwaf_object_set_bool(object, true);
106114
break;
107115
case rapidjson::kObjectType: {
108-
ddwaf_object_map(object);
116+
ddwaf_object_set_map(object, default_capacity, alloc);
109117
for (auto &kv : doc.GetObject()) {
110-
ddwaf_object element;
111-
json_to_object(&element, kv.value);
112-
113118
std::string_view const key = kv.name.GetString();
114-
ddwaf_object_map_addl(object, key.data(), key.length(), &element);
119+
ddwaf_object *element = ddwaf_object_insert_key(
120+
object, key.data(), key.length(), alloc);
121+
if (element) {
122+
json_to_object(element, kv.value);
123+
}
115124
}
116125
break;
117126
}
118127
case rapidjson::kArrayType: {
119-
ddwaf_object_array(object);
128+
ddwaf_object_set_array(object, default_capacity, alloc);
120129
for (auto &v : doc.GetArray()) {
121-
ddwaf_object element;
122-
json_to_object(&element, v);
123-
124-
ddwaf_object_array_add(object, &element);
130+
ddwaf_object *element = ddwaf_object_insert(object, alloc);
131+
if (element) {
132+
json_to_object(element, v);
133+
}
125134
}
126135
break;
127136
}
128137
case rapidjson::kStringType: {
129138
std::string_view const str = doc.GetString();
130-
ddwaf_object_stringl(object, str.data(), str.size());
139+
ddwaf_object_set_string(object, str.data(), str.size(), alloc);
131140
break;
132141
}
133142
case rapidjson::kNumberType: {
134143
if (doc.IsInt64()) {
135-
ddwaf_object_signed(object, doc.GetInt64());
144+
ddwaf_object_set_signed(object, doc.GetInt64());
136145
} else if (doc.IsUint64()) {
137-
ddwaf_object_unsigned(object, doc.GetUint64());
146+
ddwaf_object_set_unsigned(object, doc.GetUint64());
138147
} else if (doc.IsDouble()) {
139-
ddwaf_object_float(object, doc.GetDouble());
148+
ddwaf_object_set_float(object, doc.GetDouble());
140149
}
141150
break;
142151
}
143152
case rapidjson::kNullType:
153+
ddwaf_object_set_null(object);
154+
break;
144155
default:
145-
ddwaf_object_invalid(object);
156+
ddwaf_object_set_invalid(object);
146157
break;
147158
}
148159
}
149160

150161
dds::parameter json_to_parameter(const rapidjson::Value &value)
151162
{
152163
dds::parameter obj;
153-
json_to_object(obj, value);
164+
json_to_object(&obj, value);
154165
return obj;
155166
}
156167

appsec/src/helper/json_helper.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
// (https://www.datadoghq.com/). Copyright 2021 Datadog, Inc.
66
#pragma once
77

8+
#include "parameter.hpp"
89
#include "parameter_view.hpp"
910
#include <optional>
1011
#include <rapidjson/document.h>

0 commit comments

Comments
 (0)