Fix: action error query: leak of action path
[lttng-tools.git] / src / common / error-query.cpp
index 8072b26bdcdcaef9f97c85f5c2b05339f3998736..8c1bb95414feb84e1300a5570c47cd9ce0c83501 100644 (file)
@@ -7,23 +7,34 @@
  *
  */
 
-#include <common/dynamic-array.h>
-#include <common/error.h>
-#include <common/macros.h>
-#include <common/mi-lttng.h>
-#include <common/sessiond-comm/sessiond-comm.h>
-#include <lttng/action/action-internal.h>
-#include <lttng/action/list-internal.h>
-#include <lttng/action/path-internal.h>
-#include <lttng/error-query-internal.h>
+#include <common/dynamic-array.hpp>
+#include <common/error.hpp>
+#include <common/macros.hpp>
+#include <common/mi-lttng.hpp>
+#include <common/sessiond-comm/sessiond-comm.hpp>
+#include <lttng/action/action-internal.hpp>
+#include <lttng/action/list-internal.hpp>
+#include <lttng/action/path-internal.hpp>
+#include <lttng/error-query-internal.hpp>
 #include <lttng/error-query.h>
-#include <lttng/trigger/trigger-internal.h>
+#include <lttng/trigger/trigger-internal.hpp>
 #include <stddef.h>
 
 struct lttng_error_query {
        enum lttng_error_query_target_type target_type;
 };
 
+struct lttng_error_query_result {
+       enum lttng_error_query_result_type type;
+       char *name;
+       char *description;
+};
+
+struct lttng_error_query_results {
+       struct lttng_dynamic_pointer_array results;
+};
+
+namespace {
 struct lttng_error_query_comm {
        /* enum lttng_error_query_target_type */
        int8_t target_type;
@@ -47,13 +58,7 @@ struct lttng_error_query_action {
        struct lttng_error_query parent;
        /* Mutable only because of the reference count. */
        struct lttng_trigger *trigger;
-       struct lttng_action_path action_path;
-};
-
-struct lttng_error_query_result {
-       enum lttng_error_query_result_type type;
-       char *name;
-       char *description;
+       struct lttng_action_path *action_path;
 };
 
 struct lttng_error_query_result_comm {
@@ -81,10 +86,7 @@ struct lttng_error_query_results_comm {
        /* `count` instances of `struct lttng_error_query_result` follow. */
        char payload[];
 } LTTNG_PACKED;
-
-struct lttng_error_query_results {
-       struct lttng_dynamic_pointer_array results;
-};
+} /* namespace */
 
 static
 enum lttng_error_code lttng_error_query_result_mi_serialize(
@@ -111,7 +113,7 @@ struct lttng_error_query *lttng_error_query_trigger_create(
                goto end;
        }
 
-       query = (lttng_error_query_trigger *) zmalloc(sizeof(*query));
+       query = zmalloc<lttng_error_query_trigger>();
        if (!query) {
                PERROR("Failed to allocate trigger error query");
                goto error;
@@ -142,7 +144,7 @@ struct lttng_error_query *lttng_error_query_condition_create(
                goto end;
        }
 
-       query = (lttng_error_query_condition *) zmalloc(sizeof(*query));
+       query = zmalloc<lttng_error_query_condition>();
        if (!query) {
                PERROR("Failed to allocate condition error query");
                goto error;
@@ -221,7 +223,7 @@ struct lttng_error_query *lttng_error_query_action_create(
                goto end;
        }
 
-       query = (lttng_error_query_action *) zmalloc(sizeof(*query));
+       query = zmalloc<lttng_error_query_action>();
        if (!query) {
                PERROR("Failed to allocate action error query");
                goto error;
@@ -246,15 +248,45 @@ end:
 
 void lttng_error_query_destroy(struct lttng_error_query *query)
 {
-       struct lttng_error_query_trigger *trigger_query;
-
        if (!query) {
                return;
        }
 
-       trigger_query = container_of(query, typeof(*trigger_query), parent);
-       lttng_trigger_put(trigger_query->trigger);
-       free(trigger_query);
+       switch (query->target_type) {
+       case LTTNG_ERROR_QUERY_TARGET_TYPE_TRIGGER:
+       {
+               struct lttng_error_query_trigger *trigger_query =
+                               container_of(query, typeof(*trigger_query),
+                                       parent);
+
+               lttng_trigger_put(trigger_query->trigger);
+               free(trigger_query);
+               break;
+       }
+       case LTTNG_ERROR_QUERY_TARGET_TYPE_CONDITION:
+       {
+               struct lttng_error_query_condition *condition_query =
+                               container_of(query, typeof(*condition_query),
+                                       parent);
+
+               lttng_trigger_put(condition_query->trigger);
+               free(condition_query);
+               break;
+       }
+       case LTTNG_ERROR_QUERY_TARGET_TYPE_ACTION:
+       {
+               struct lttng_error_query_action *action_query =
+                               container_of(query, typeof(*action_query),
+                                       parent);
+
+               lttng_trigger_put(action_query->trigger);
+               lttng_action_path_destroy(action_query->action_path);
+               free(action_query);
+               break;
+       }
+       default:
+               abort();
+       }
 }
 
 static
@@ -388,7 +420,7 @@ lttng_error_query_result_counter_create(
        int init_ret;
        struct lttng_error_query_result_counter *counter;
 
-       counter = (lttng_error_query_result_counter *) zmalloc(sizeof(*counter));
+       counter = zmalloc<lttng_error_query_result_counter>();
        if (!counter) {
                PERROR("Failed to allocate error query counter result");
                goto end;
@@ -419,7 +451,7 @@ void destroy_result(void *ptr)
 
 struct lttng_error_query_results *lttng_error_query_results_create(void)
 {
-       struct lttng_error_query_results *set = (lttng_error_query_results *) zmalloc(sizeof(*set));
+       struct lttng_error_query_results *set = zmalloc<lttng_error_query_results>();
 
        if (!set) {
                PERROR("Failed to allocate an error query result set");
@@ -686,7 +718,7 @@ int lttng_error_query_action_serialize(const struct lttng_error_query *query,
                goto end;
        }
 
-       ret = lttng_action_path_serialize(&query_action->action_path, payload);
+       ret = lttng_action_path_serialize(query_action->action_path, payload);
        if (ret) {
                goto end;
        }
@@ -736,7 +768,7 @@ struct lttng_action *lttng_error_query_action_borrow_action_target(
                        container_of(query, typeof(*query_action), parent);
 
        return get_trigger_action_from_path(
-                       trigger, &query_action->action_path);
+                       trigger, query_action->action_path);
 }
 
 int lttng_error_query_serialize(const struct lttng_error_query *query,
This page took 0.02506 seconds and 4 git commands to generate.