Skip to content

Commit 1ad48d9

Browse files
committed
Fix: action error query: leak of action path
==1429021==ERROR: LeakSanitizer: detected memory leaks Direct leak of 8 byte(s) in 1 object(s) allocated from: #0 0x7fe305f031b2 in __interceptor_realloc /usr/src/debug/gcc/libsanitizer/asan/asan_malloc_linux.cpp:164 #1 0x559f1b022238 in lttng_dynamic_buffer_set_capacity(lttng_dynamic_buffer*, unsigned long) /home/jgalar/EfficiOS/src/lttng-tools/src/common/dynamic-buffer.cpp:159 #2 0x559f1b021d9f in lttng_dynamic_buffer_append(lttng_dynamic_buffer*, void const*, unsigned long) /home/jgalar/EfficiOS/src/lttng-tools/src/common/dynamic-buffer.cpp:52 #3 0x559f1b02144a in lttng_dynamic_array_add_element(lttng_dynamic_array*, void const*) /home/jgalar/EfficiOS/src/lttng-tools/src/common/dynamic-array.cpp:58 #4 0x559f1b07d07b in lttng_action_path_copy(lttng_action_path const*, lttng_action_path*) actions/path.cpp:116 #5 0x559f1b02383f in lttng_error_query_action_create /home/jgalar/EfficiOS/src/lttng-tools/src/common/error-query.cpp:232 #6 0x559f1b02760e in lttng_error_query_create_from_payload(lttng_payload_view*, lttng_error_query**) /home/jgalar/EfficiOS/src/lttng-tools/src/common/error-query.cpp:911 #7 0x559f1af5c361 in receive_lttng_error_query /home/jgalar/EfficiOS/src/lttng-tools/src/bin/lttng-sessiond/client.cpp:740 #8 0x559f1af64eba in process_client_msg /home/jgalar/EfficiOS/src/lttng-tools/src/bin/lttng-sessiond/client.cpp:2336 lttng#9 0x559f1af67378 in thread_manage_clients /home/jgalar/EfficiOS/src/lttng-tools/src/bin/lttng-sessiond/client.cpp:2624 lttng#10 0x559f1af50642 in launch_thread /home/jgalar/EfficiOS/src/lttng-tools/src/bin/lttng-sessiond/thread.cpp:68 lttng#11 0x7fe3055225c1 in start_thread (/usr/lib/libc.so.6+0x8d5c1) Signed-off-by: Jérémie Galarneau <[email protected]> Change-Id: I7a6f7d2a9746124581eebf30877466f16db67a6b
1 parent aafac6e commit 1ad48d9

File tree

3 files changed

+50
-28
lines changed

3 files changed

+50
-28
lines changed

include/lttng/action/path-internal.hpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,8 @@ struct lttng_action_path {
1919
struct lttng_dynamic_array indexes;
2020
};
2121

22-
/* Assumes that 'dst' is uninitialized. */
2322
int lttng_action_path_copy(const struct lttng_action_path *src,
24-
struct lttng_action_path *dst);
23+
struct lttng_action_path **dst);
2524

2625
ssize_t lttng_action_path_create_from_payload(
2726
struct lttng_payload_view *view,

src/common/actions/path.cpp

+11-18
Original file line numberDiff line numberDiff line change
@@ -98,32 +98,25 @@ void lttng_action_path_destroy(struct lttng_action_path *action_path)
9898
}
9999

100100
int lttng_action_path_copy(const struct lttng_action_path *src,
101-
struct lttng_action_path *dst)
101+
struct lttng_action_path **dst)
102102
{
103103
int ret;
104-
size_t i, src_count;
104+
struct lttng_action_path *new_path;
105105

106106
LTTNG_ASSERT(src);
107107
LTTNG_ASSERT(dst);
108108

109-
lttng_dynamic_array_init(&dst->indexes, sizeof(uint64_t), NULL);
110-
src_count = lttng_dynamic_array_get_count(&src->indexes);
111-
112-
for (i = 0; i < src_count; i++) {
113-
const void *index = lttng_dynamic_array_get_element(
114-
&src->indexes, i);
115-
116-
ret = lttng_dynamic_array_add_element(&dst->indexes, index);
117-
if (ret) {
118-
goto error;
119-
}
109+
new_path = lttng_action_path_create(
110+
(uint64_t *) lttng_dynamic_array_get_element(
111+
&src->indexes, 0),
112+
lttng_dynamic_array_get_count(&src->indexes));
113+
if (!new_path) {
114+
ret = -1;
115+
} else {
116+
ret = 0;
117+
*dst = new_path;
120118
}
121119

122-
ret = 0;
123-
goto end;
124-
error:
125-
lttng_dynamic_array_reset(&dst->indexes);
126-
end:
127120
return ret;
128121
}
129122

src/common/error-query.cpp

+38-8
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ struct lttng_error_query_action {
5858
struct lttng_error_query parent;
5959
/* Mutable only because of the reference count. */
6060
struct lttng_trigger *trigger;
61-
struct lttng_action_path action_path;
61+
struct lttng_action_path *action_path;
6262
};
6363

6464
struct lttng_error_query_result_comm {
@@ -248,15 +248,45 @@ struct lttng_error_query *lttng_error_query_action_create(
248248

249249
void lttng_error_query_destroy(struct lttng_error_query *query)
250250
{
251-
struct lttng_error_query_trigger *trigger_query;
252-
253251
if (!query) {
254252
return;
255253
}
256254

257-
trigger_query = container_of(query, typeof(*trigger_query), parent);
258-
lttng_trigger_put(trigger_query->trigger);
259-
free(trigger_query);
255+
switch (query->target_type) {
256+
case LTTNG_ERROR_QUERY_TARGET_TYPE_TRIGGER:
257+
{
258+
struct lttng_error_query_trigger *trigger_query =
259+
container_of(query, typeof(*trigger_query),
260+
parent);
261+
262+
lttng_trigger_put(trigger_query->trigger);
263+
free(trigger_query);
264+
break;
265+
}
266+
case LTTNG_ERROR_QUERY_TARGET_TYPE_CONDITION:
267+
{
268+
struct lttng_error_query_condition *condition_query =
269+
container_of(query, typeof(*condition_query),
270+
parent);
271+
272+
lttng_trigger_put(condition_query->trigger);
273+
free(condition_query);
274+
break;
275+
}
276+
case LTTNG_ERROR_QUERY_TARGET_TYPE_ACTION:
277+
{
278+
struct lttng_error_query_action *action_query =
279+
container_of(query, typeof(*action_query),
280+
parent);
281+
282+
lttng_trigger_put(action_query->trigger);
283+
lttng_action_path_destroy(action_query->action_path);
284+
free(action_query);
285+
break;
286+
}
287+
default:
288+
abort();
289+
}
260290
}
261291

262292
static
@@ -688,7 +718,7 @@ int lttng_error_query_action_serialize(const struct lttng_error_query *query,
688718
goto end;
689719
}
690720

691-
ret = lttng_action_path_serialize(&query_action->action_path, payload);
721+
ret = lttng_action_path_serialize(query_action->action_path, payload);
692722
if (ret) {
693723
goto end;
694724
}
@@ -738,7 +768,7 @@ struct lttng_action *lttng_error_query_action_borrow_action_target(
738768
container_of(query, typeof(*query_action), parent);
739769

740770
return get_trigger_action_from_path(
741-
trigger, &query_action->action_path);
771+
trigger, query_action->action_path);
742772
}
743773

744774
int lttng_error_query_serialize(const struct lttng_error_query *query,

0 commit comments

Comments
 (0)