Skip to content

Commit e453e54

Browse files
committed
fix leak on one of the error branches of _dd_command_exec
1 parent cf7254e commit e453e54

File tree

1 file changed

+15
-10
lines changed

1 file changed

+15
-10
lines changed

appsec/src/extension/commands_helpers.c

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ static dd_result ATTR_WARN_UNUSED _imsg_recv(
4646

4747
static inline ATTR_WARN_UNUSED mpack_error_t _imsg_destroy(
4848
dd_imsg *nonnull imsg);
49+
static void _imsg_cleanup(dd_imsg *nullable *imsg);
4950

5051
static dd_result _dd_command_exec(dd_conn *nonnull conn,
5152
const dd_command_spec *nonnull spec, void *unspecnull ctx)
@@ -98,20 +99,21 @@ static dd_result _dd_command_exec(dd_conn *nonnull conn,
9899
return res;
99100
}
100101

102+
// automatic cleanup of imsg on error branches
103+
// set to NULL before calling _imsg_destroy
104+
__attribute__((cleanup(_imsg_cleanup))) dd_imsg *nullable destroy_imsg =
105+
&imsg;
106+
101107
mpack_node_t first_response = mpack_node_array_at(imsg.root, 0);
102108
mpack_error_t err = mpack_node_error(first_response);
103109
if (err != mpack_ok) {
104110
mlog(dd_log_error, "Array of responses could not be retrieved - %s",
105111
mpack_error_to_string(err));
106-
// NOLINTNEXTLINE(clang-analyzer-deadcode.DeadStores)
107-
err = _imsg_destroy(&imsg);
108112
return dd_error;
109113
}
110114
if (mpack_node_type(first_response) != mpack_type_array) {
111115
mlog(dd_log_error, "Invalid response. Expected array but got %s",
112116
mpack_type_to_string(mpack_node_type(first_response)));
113-
// NOLINTNEXTLINE(clang-analyzer-deadcode.DeadStores)
114-
err = _imsg_destroy(&imsg);
115117
return dd_error;
116118
}
117119
mpack_node_t first_message = mpack_node_array_at(first_response, 1);
@@ -127,16 +129,12 @@ static dd_result _dd_command_exec(dd_conn *nonnull conn,
127129
if (err != mpack_ok) {
128130
mlog(dd_log_error, "Response type could not be retrieved - %s",
129131
mpack_error_to_string(err));
130-
// NOLINTNEXTLINE(clang-analyzer-deadcode.DeadStores)
131-
err = _imsg_destroy(&imsg);
132132
return dd_error;
133133
}
134134
if (mpack_node_type(type) != mpack_type_str) {
135135
mlog(dd_log_error,
136136
"Unexpected type field. Expected string but got %s",
137137
mpack_type_to_string(mpack_node_type(type)));
138-
// NOLINTNEXTLINE(clang-analyzer-deadcode.DeadStores)
139-
err = _imsg_destroy(&imsg);
140138
return dd_error;
141139
}
142140
if (dd_mpack_node_lstr_eq(type, "config_features")) {
@@ -147,8 +145,6 @@ static dd_result _dd_command_exec(dd_conn *nonnull conn,
147145
mlog(dd_log_debug,
148146
"Received message for command %.*s unexpected: %.*s\n", NAME_L,
149147
(int)mpack_node_strlen(type), mpack_node_str(type));
150-
// NOLINTNEXTLINE(clang-analyzer-deadcode.DeadStores)
151-
err = _imsg_destroy(&imsg);
152148
return dd_error;
153149
}
154150

@@ -157,6 +153,7 @@ static dd_result _dd_command_exec(dd_conn *nonnull conn,
157153
err = imsg.root.tree->error;
158154
_dump_in_msg(err == mpack_ok ? dd_log_trace : dd_log_debug, imsg._data,
159155
imsg._size);
156+
destroy_imsg = NULL;
160157
err = _imsg_destroy(&imsg);
161158
if (err != mpack_ok) {
162159
mlog(dd_log_warning,
@@ -281,6 +278,14 @@ static inline ATTR_WARN_UNUSED mpack_error_t _imsg_destroy(
281278
return mpack_tree_destroy(&imsg->_tree);
282279
}
283280

281+
static void _imsg_cleanup(dd_imsg *nullable *imsg)
282+
{
283+
dd_imsg **imsg_c = (dd_imsg * nullable * nonnull) imsg;
284+
if (*imsg_c) {
285+
UNUSED(_imsg_destroy(*imsg_c));
286+
}
287+
}
288+
284289
/* Baked response */
285290

286291
static void _add_appsec_span_data_frag(mpack_node_t node);

0 commit comments

Comments
 (0)