Skip to content

Commit 0de9976

Browse files
cataphractclaude
andcommitted
Simplify owned_object construction for invalid objects
- Add default constructor that creates an invalid object with the null resource allocator - Remove make_invalid() factory method (replaced by default constructor) - Remove single-argument owned_object(alloc) constructor (no longer needed since invalid objects don't require a specific allocator) - Remove make_uninit() from test helper ddwaf_object_da All call sites now use the simpler `owned_object{}` syntax. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent 561e8d9 commit 0de9976

23 files changed

+270
-292
lines changed

src/interface.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -784,7 +784,7 @@ ddwaf_object *ddwaf_object_insert(ddwaf_object *array, ddwaf_allocator alloc)
784784
try {
785785
auto *alloc_ptr = to_alloc_ptr(alloc);
786786
borrowed_object container = to_borrowed(array, alloc_ptr);
787-
owned_object new_element = owned_object{alloc_ptr};
787+
owned_object new_element = owned_object{};
788788
borrowed_object inserted = container.emplace_back(std::move(new_element));
789789

790790
// NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
@@ -802,7 +802,7 @@ ddwaf_object *ddwaf_object_insert_key(
802802
try {
803803
auto *alloc_ptr = to_alloc_ptr(alloc);
804804
borrowed_object container = to_borrowed(map, alloc_ptr);
805-
owned_object new_value = owned_object{alloc_ptr};
805+
owned_object new_value = owned_object{};
806806
borrowed_object inserted =
807807
container.emplace(std::string_view{key, length}, std::move(new_value));
808808

@@ -822,7 +822,7 @@ ddwaf_object *ddwaf_object_insert_key_nocopy(
822822
try {
823823
auto *alloc_ptr = to_alloc_ptr(alloc);
824824
auto key_obj = owned_object::make_string_nocopy(key, length, alloc_ptr);
825-
auto value_obj = owned_object{alloc_ptr};
825+
auto value_obj = owned_object{};
826826

827827
// NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
828828
return reinterpret_cast<ddwaf_object *>(
@@ -845,7 +845,7 @@ ddwaf_object *ddwaf_object_insert_literal_key(
845845
try {
846846
auto *alloc_ptr = to_alloc_ptr(alloc);
847847
auto key_obj = owned_object::make_string_literal(key, length);
848-
auto value_obj = owned_object{alloc_ptr};
848+
auto value_obj = owned_object{};
849849

850850
// NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
851851
return reinterpret_cast<ddwaf_object *>(

src/json_utils.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,7 @@ struct string_view_stream {
6565
class object_reader_handler
6666
: public rapidjson::BaseReaderHandler<rapidjson::UTF8<>, object_reader_handler> {
6767
public:
68-
explicit object_reader_handler(nonnull_ptr<memory::memory_resource> alloc)
69-
: alloc_(alloc), root_(alloc), key_(alloc)
68+
explicit object_reader_handler(nonnull_ptr<memory::memory_resource> alloc) : alloc_(alloc)
7069
{
7170
stack_.reserve(max_depth + 1);
7271
}
@@ -240,7 +239,7 @@ class object_reader_handler
240239
return true;
241240
}
242241

243-
nonnull_ptr<memory::memory_resource> alloc_{memory::get_default_resource()};
242+
nonnull_ptr<memory::memory_resource> alloc_;
244243
owned_object root_;
245244
std::vector<borrowed_object> stack_;
246245

@@ -260,7 +259,7 @@ owned_object json_to_object(std::string_view json, nonnull_ptr<memory::memory_re
260259
const rapidjson::ParseResult res = reader.Parse(ss, handler);
261260
if (res.IsError()) {
262261
// Not interested in partial JSON for now
263-
return owned_object{alloc};
262+
return owned_object{};
264263
}
265264

266265
return handler.finalize();

src/object.hpp

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -824,8 +824,8 @@ class borrowed_object final : public readable_object<borrowed_object>,
824824
class owned_object final : public readable_object<owned_object>,
825825
public writable_object<owned_object> {
826826
public:
827-
explicit owned_object(nonnull_ptr<memory::memory_resource> alloc)
828-
: obj_({.type = object_type::invalid}), alloc_(alloc)
827+
owned_object()
828+
: obj_({.type = object_type::invalid}), alloc_(memory::get_default_null_resource())
829829
{}
830830

831831
// UNSAFE: Caller must ensure the object's memory is compatible with the
@@ -864,11 +864,6 @@ class owned_object final : public readable_object<owned_object>,
864864
[[nodiscard]] const detail::object *ptr() const noexcept { return &obj_; }
865865
[[nodiscard]] nonnull_ptr<memory::memory_resource> alloc() const noexcept { return alloc_; }
866866

867-
static owned_object make_invalid()
868-
{
869-
return owned_object({.type = object_type::invalid}, memory::get_default_null_resource());
870-
}
871-
872867
// the variants that don't take a memory resource can't be written to
873868
// (have their value replaced)
874869

@@ -1085,7 +1080,7 @@ template <typename Derived>
10851080
default:
10861081
break;
10871082
}
1088-
return owned_object{alloc};
1083+
return owned_object{};
10891084
};
10901085

10911086
std::deque<std::pair<object_view, borrowed_object>> queue;

src/processor/extract_schema.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,7 @@ owned_object extract_schema::eval_impl(const unary_argument<object_view> &input,
342342
ddwaf::timer &deadline) const
343343
{
344344
if (!input.value.has_value()) {
345-
return owned_object{alloc};
345+
return owned_object{};
346346
}
347347

348348
return {schema::generate(input.value, scanners_, alloc, deadline)};

src/processor/fingerprint.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -528,7 +528,7 @@ owned_object http_endpoint_fingerprint::eval_impl(const unary_argument<std::stri
528528
optional_generator<key_hash_field>{query}, optional_generator<key_hash_field>{body});
529529
} catch (const std::out_of_range &e) {
530530
DDWAF_WARN("Failed to generate http endpoint fingerprint: {}", e.what());
531-
return owned_object{alloc};
531+
return owned_object{};
532532
}
533533
}
534534

@@ -569,7 +569,7 @@ owned_object http_header_fingerprint::eval_impl(const unary_argument<map_view> &
569569
vector_hash_field{std::move(unknown_headers)});
570570
} catch (const std::out_of_range &e) {
571571
DDWAF_WARN("Failed to generate http header fingerprint: {}", e.what());
572-
return owned_object{alloc};
572+
return owned_object{};
573573
}
574574
}
575575

@@ -619,7 +619,7 @@ owned_object http_network_fingerprint::eval_impl(const unary_argument<map_view>
619619
"net", alloc, unsigned_field{ip_count}, string_field{ip_origin_bitset});
620620
} catch (const std::out_of_range &e) {
621621
DDWAF_WARN("Failed to generate http network fingerprint: {}", e.what());
622-
return owned_object{alloc};
622+
return owned_object{};
623623
}
624624
}
625625

@@ -641,7 +641,7 @@ owned_object session_fingerprint::eval_impl(const optional_argument<map_view> &c
641641
optional_generator<string_hash_field>{session_id});
642642
} catch (const std::out_of_range &e) {
643643
DDWAF_WARN("Failed to generate session fingerprint: {}", e.what());
644-
return owned_object{alloc};
644+
return owned_object{};
645645
}
646646
}
647647

src/processor/jwt_decode.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ owned_object decode_and_parse(std::string_view source, nonnull_ptr<memory::memor
7272
{
7373
cow_string cstr{source};
7474
if (!transformer::base64url_decode::transform(cstr)) {
75-
return owned_object{alloc};
75+
return owned_object{};
7676
}
7777

7878
return json_to_object(static_cast<std::string_view>(cstr), alloc);
@@ -112,13 +112,13 @@ owned_object jwt_decode::eval_impl(const unary_argument<object_view> &input,
112112
{
113113
std::string_view token = find_token(input.value, input.key_path);
114114
if (token.empty()) {
115-
return owned_object{alloc};
115+
return owned_object{};
116116
}
117117

118118
static const std::string_view prefix = "Bearer";
119119
if (!token.starts_with(prefix)) {
120120
// Unlikely to be a JWT
121-
return owned_object{alloc};
121+
return owned_object{};
122122
}
123123

124124
// Remove prefix and spaces
@@ -133,7 +133,7 @@ owned_object jwt_decode::eval_impl(const unary_argument<object_view> &input,
133133
auto [valid, jwt] = split_token(token);
134134
if (!valid) {
135135
// Not a valid JWT
136-
return owned_object{alloc};
136+
return owned_object{};
137137
}
138138

139139
// Decode header and payload and generate output

src/processor/uri_parse.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ owned_object split_query_parameters(
4747
}
4848

4949
std::string_view key;
50-
owned_object value = owned_object{alloc};
50+
owned_object value = owned_object{};
5151

5252
// Check if it's in the key=value format
5353
// - key= is considered an empty string value
@@ -109,7 +109,7 @@ owned_object uri_parse_processor::eval_impl(const unary_argument<std::string_vie
109109
{
110110
auto decomposed = uri_parse(input.value);
111111
if (!decomposed.has_value()) {
112-
return owned_object{alloc};
112+
return owned_object{};
113113
}
114114

115115
auto output = owned_object::make_map(7, alloc);

tests/common/ddwaf_object_da.hpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ namespace ddwaf::test {
1414

1515
class ddwaf_object_da {
1616
public:
17-
static owned_object make_uninit() { return owned_object{memory::get_default_resource()}; }
1817
static owned_object make_null() { return owned_object::make_null(); }
1918

2019
static owned_object make_boolean(bool value) { return owned_object::make_boolean(value); }

tests/common/yaml_utils.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ owned_object node_to_owned_object(const Node &node)
159159
case NodeType::Null:
160160
return owned_object::make_null();
161161
case NodeType::Undefined:
162-
return ddwaf::test::ddwaf_object_da::make_uninit();
162+
return owned_object{};
163163
}
164164

165165
throw parsing_error("Invalid YAML node type");

tests/unit/condition/exists_condition_test.cpp

Lines changed: 11 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,7 @@ TEST(TestExistsCondition, AddressAvailable)
2424
{
2525
exists_condition cond{{gen_variadic_param("server.request.uri_raw")}};
2626

27-
auto root = object_builder_da::map(
28-
{{"server.request.uri_raw", ddwaf::test::ddwaf_object_da::make_uninit()}});
27+
auto root = object_builder_da::map({{"server.request.uri_raw", owned_object{}}});
2928

3029
object_store store;
3130
store.insert(std::move(root));
@@ -44,8 +43,7 @@ TEST(TestExistsCondition, KeyPathAvailable)
4443
auto root = object_builder_da::map({{"server.request.uri_raw",
4544
object_builder_da::map(
4645
{{"path", object_builder_da::map(
47-
{{"to", object_builder_da::map({{"object",
48-
ddwaf::test::ddwaf_object_da::make_uninit()}})}})}})}});
46+
{{"to", object_builder_da::map({{"object", owned_object{}}})}})}})}});
4947

5048
object_store store;
5149
store.insert(std::move(root));
@@ -59,8 +57,7 @@ TEST(TestExistsCondition, AddressNotAvaialble)
5957
{
6058
exists_condition cond{{gen_variadic_param("server.request.uri_raw")}};
6159

62-
auto root = object_builder_da::map(
63-
{{"server.request.query", ddwaf::test::ddwaf_object_da::make_uninit()}});
60+
auto root = object_builder_da::map({{"server.request.query", owned_object{}}});
6461

6562
object_store store;
6663
store.insert(std::move(root));
@@ -77,8 +74,7 @@ TEST(TestExistsCondition, KeyPathNotAvailable)
7774
.key_path = {"path", "to", "object"}}}}}};
7875

7976
auto root = object_builder_da::map({{"server.request.uri_raw",
80-
object_builder_da::map({{"path",
81-
object_builder_da::map({{"to", ddwaf::test::ddwaf_object_da::make_uninit()}})}})}});
77+
object_builder_da::map({{"path", object_builder_da::map({{"to", owned_object{}}})}})}});
8278

8379
object_store store;
8480
store.insert(std::move(root));
@@ -128,8 +124,8 @@ TEST(TestExistsCondition, KeyPathIndexOnNonArray)
128124
.index = get_target_index("server.request.uri_raw"),
129125
.key_path = {0}}}}}};
130126

131-
auto root = object_builder_da::map({{"server.request.uri_raw",
132-
object_builder_da::map({{"path", ddwaf::test::ddwaf_object_da::make_uninit()}})}});
127+
auto root = object_builder_da::map(
128+
{{"server.request.uri_raw", object_builder_da::map({{"path", owned_object{}}})}});
133129

134130
object_store store;
135131
store.insert(std::move(root));
@@ -148,8 +144,7 @@ TEST(TestExistsCondition, KeyPathAvailableButExcluded)
148144
auto root = object_builder_da::map({{"server.request.uri_raw",
149145
object_builder_da::map(
150146
{{"path", object_builder_da::map(
151-
{{"to", object_builder_da::map({{"object",
152-
ddwaf::test::ddwaf_object_da::make_uninit()}})}})}})}});
147+
{{"to", object_builder_da::map({{"object", owned_object{}}})}})}})}});
153148

154149
std::unordered_set<object_cache_key> excluded = {root.at(0)};
155150
object_store store;
@@ -170,8 +165,7 @@ TEST(TestExistsCondition, MultipleAddresses)
170165
{gen_variadic_param("server.request.uri_raw", "server.request.body", "usr.id")}};
171166

172167
auto validate_address = [&](const std::string &address, bool expected = true) {
173-
auto root =
174-
object_builder_da::map({{address, ddwaf::test::ddwaf_object_da::make_uninit()}});
168+
auto root = object_builder_da::map({{address, owned_object{}}});
175169

176170
object_store store;
177171
store.insert(std::move(root));
@@ -236,8 +230,7 @@ TEST(TestNegatedExistsCondition, KeyPathAvailable)
236230
auto root = object_builder_da::map({{"server.request.uri_raw",
237231
object_builder_da::map(
238232
{{"path", object_builder_da::map(
239-
{{"to", object_builder_da::map({{"object",
240-
ddwaf::test::ddwaf_object_da::make_uninit()}})}})}})}});
233+
{{"to", object_builder_da::map({{"object", owned_object{}}})}})}})}});
241234

242235
object_store store;
243236
store.insert(std::move(root));
@@ -322,8 +315,7 @@ TEST(TestNegatedExistsCondition, KeyPathNotAvailable)
322315
.key_path = {"path", "to", "object"}}}}}};
323316

324317
auto root = object_builder_da::map({{"server.request.uri_raw",
325-
object_builder_da::map({{"path",
326-
object_builder_da::map({{"to", ddwaf::test::ddwaf_object_da::make_uninit()}})}})}});
318+
object_builder_da::map({{"path", object_builder_da::map({{"to", owned_object{}}})}})}});
327319
object_store store;
328320
store.insert(std::move(root));
329321

@@ -341,8 +333,7 @@ TEST(TestNegatedExistsCondition, KeyPathAvailableButExcluded)
341333
auto root = object_builder_da::map({{"server.request.uri_raw",
342334
object_builder_da::map(
343335
{{"path", object_builder_da::map(
344-
{{"to", object_builder_da::map({{"object",
345-
ddwaf::test::ddwaf_object_da::make_uninit()}})}})}})}});
336+
{{"to", object_builder_da::map({{"object", owned_object{}}})}})}})}});
346337

347338
std::unordered_set<object_cache_key> excluded = {root.at(0)};
348339

0 commit comments

Comments
 (0)