Fix: sessiond: ODR violation results in memory corruption
[lttng-tools.git] / src / bin / lttng-sessiond / ust-registry.cpp
index 7de5336754c8adc02a71b1ba180168b72164319b..b327fdf32c449dfc082af8a55eebd9dd8b99c145 100644 (file)
@@ -8,16 +8,16 @@
 #define _LGPL_SOURCE
 #include <inttypes.h>
 
-#include <common/common.h>
-#include <common/hashtable/utils.h>
+#include <common/common.hpp>
+#include <common/hashtable/utils.hpp>
 #include <lttng/lttng.h>
 
-#include "ust-registry.h"
-#include "ust-app.h"
-#include "ust-field-utils.h"
-#include "utils.h"
-#include "lttng-sessiond.h"
-#include "notification-thread-commands.h"
+#include "ust-registry.hpp"
+#include "ust-app.hpp"
+#include "ust-field-utils.hpp"
+#include "utils.hpp"
+#include "lttng-sessiond.hpp"
+#include "notification-thread-commands.hpp"
 
 /*
  * Hash table match function for event in the registry.
@@ -288,7 +288,7 @@ static struct ust_registry_event *alloc_event(int session_objd,
                return NULL;
        }
 
-       event = (ust_registry_event *) zmalloc(sizeof(*event));
+       event = zmalloc<ust_registry_event>();
        if (!event) {
                PERROR("zmalloc ust registry event");
                goto error;
@@ -368,8 +368,8 @@ struct ust_registry_event *ust_registry_find_event(
        key.name[sizeof(key.name) - 1] = '\0';
        key.signature = sig;
 
-       cds_lfht_lookup(chan->ht->ht, chan->ht->hash_fct(&key, lttng_ht_seed),
-                       chan->ht->match_fct, &key, &iter.iter);
+       cds_lfht_lookup(chan->events->ht, chan->events->hash_fct(&key, lttng_ht_seed),
+                       chan->events->match_fct, &key, &iter.iter);
        node = lttng_ht_iter_get_node_u64(&iter);
        if (!node) {
                goto end;
@@ -446,8 +446,8 @@ int ust_registry_create_event(struct ust_registry_session *session,
         * This is an add unique with a custom match function for event. The node
         * are matched using the event name and signature.
         */
-       nptr = cds_lfht_add_unique(chan->ht->ht, chan->ht->hash_fct(event,
-                               lttng_ht_seed), chan->ht->match_fct, event, &event->node.node);
+       nptr = cds_lfht_add_unique(chan->events->ht, chan->events->hash_fct(event,
+                               lttng_ht_seed), chan->events->match_fct, event, &event->node.node);
        if (nptr != &event->node.node) {
                if (buffer_type == LTTNG_BUFFER_PER_UID) {
                        /*
@@ -514,7 +514,7 @@ void ust_registry_destroy_event(struct ust_registry_channel *chan,
 
        /* Delete the node first. */
        iter.iter.node = &event->node.node;
-       ret = lttng_ht_del(chan->ht, &iter);
+       ret = lttng_ht_del(chan->events, &iter);
        LTTNG_ASSERT(!ret);
 
        call_rcu(&event->node.head, destroy_event_rcu);
@@ -630,7 +630,7 @@ int ust_registry_create_or_find_enum(struct ust_registry_session *session,
        }
 
        /* Check if the enumeration was already dumped */
-       reg_enum = (ust_registry_enum *) zmalloc(sizeof(*reg_enum));
+       reg_enum = zmalloc<ust_registry_enum>();
        if (!reg_enum) {
                PERROR("zmalloc ust registry enumeration");
                ret = -ENOMEM;
@@ -702,9 +702,10 @@ void destroy_channel_rcu(struct rcu_head *head)
        struct ust_registry_channel *chan =
                caa_container_of(head, struct ust_registry_channel, rcu_head);
 
-       if (chan->ht) {
-               lttng_ht_destroy(chan->ht);
+       if (chan->events) {
+               lttng_ht_destroy(chan->events);
        }
+
        free(chan->ctx_fields);
        free(chan);
 }
@@ -731,11 +732,11 @@ static void destroy_channel(struct ust_registry_channel *chan, bool notif)
                }
        }
 
-       if (chan->ht) {
+       if (chan->events) {
                rcu_read_lock();
                /* Destroy all event associated with this registry. */
                cds_lfht_for_each_entry(
-                               chan->ht->ht, &iter.iter, event, node.node) {
+                               chan->events->ht, &iter.iter, event, node.node) {
                        /* Delete the node from the ht and free it. */
                        ust_registry_destroy_event(chan, event);
                }
@@ -755,22 +756,22 @@ int ust_registry_channel_add(struct ust_registry_session *session,
 
        LTTNG_ASSERT(session);
 
-       chan = (ust_registry_channel *) zmalloc(sizeof(*chan));
+       chan = zmalloc<ust_registry_channel>();
        if (!chan) {
                PERROR("zmalloc ust registry channel");
                ret = -ENOMEM;
                goto error_alloc;
        }
 
-       chan->ht = lttng_ht_new(0, LTTNG_HT_TYPE_STRING);
-       if (!chan->ht) {
+       chan->events = lttng_ht_new(0, LTTNG_HT_TYPE_STRING);
+       if (!chan->events) {
                ret = -ENOMEM;
                goto error;
        }
 
        /* Set custom match function. */
-       chan->ht->match_fct = ht_match_event;
-       chan->ht->hash_fct = ht_hash_event;
+       chan->events->match_fct = ht_match_event;
+       chan->events->hash_fct = ht_hash_event;
 
        /*
         * Assign a channel ID right now since the event notification comes
@@ -886,7 +887,7 @@ int ust_registry_session_init(struct ust_registry_session **sessionp,
 
        LTTNG_ASSERT(sessionp);
 
-       session = (ust_registry_session *) zmalloc(sizeof(*session));
+       session = zmalloc<ust_registry_session>();
        if (!session) {
                PERROR("zmalloc ust registry session");
                goto error_alloc;
This page took 0.026201 seconds and 4 git commands to generate.