Fix: string comparison on incorrect length in context provider
[lttng-ust.git] / liblttng-ust / lttng-context-provider.c
index e7462cdabec945522c697576c632511f97043567..5557b137cdc24f4ed68077c7bc72d23f94e7e779 100644 (file)
@@ -20,6 +20,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#define _LGPL_SOURCE
 #include <sys/types.h>
 #include <unistd.h>
 #include <lttng/ust-context-provider.h>
@@ -67,8 +68,10 @@ int lttng_ust_context_provider_register(struct lttng_ust_context_provider *provi
        uint32_t hash;
        int ret = 0;
 
+       lttng_ust_fixup_tls();
+
        /* Provider name starts with "$app.". */
-       if (strncmp("$app.", provider->name, strlen("$app.") != 0))
+       if (strncmp("$app.", provider->name, strlen("$app.")) != 0)
                return -EINVAL;
        /* Provider name cannot contain a column character. */
        if (strchr(provider->name, ':'))
@@ -92,40 +95,15 @@ end:
        return ret;
 }
 
-static
-size_t dummy_get_size(struct lttng_ctx_field *field, size_t offset)
-{
-       size_t size = 0;
-
-       size += lib_ring_buffer_align(offset, lttng_alignof(char));
-       size += sizeof(char);           /* tag */
-       return size;
-}
-
-static
-void dummy_record(struct lttng_ctx_field *field,
-                struct lttng_ust_lib_ring_buffer_ctx *ctx,
-                struct lttng_channel *chan)
-{
-       char sel_char = (char) LTTNG_UST_DYNAMIC_TYPE_NONE;
-
-       lib_ring_buffer_align_ctx(ctx, lttng_alignof(sel_char));
-       chan->ops->event_write(ctx, &sel_char, sizeof(sel_char));
-}
-
-static
-void dummy_get_value(struct lttng_ctx_field *field,
-               struct lttng_ctx_value *value)
-{
-       value->sel = LTTNG_UST_DYNAMIC_TYPE_NONE;
-}
-
 void lttng_ust_context_provider_unregister(struct lttng_ust_context_provider *provider)
 {
+       lttng_ust_fixup_tls();
+
        if (ust_lock())
                goto end;
        lttng_ust_context_set_session_provider(provider->name,
-               dummy_get_size, dummy_record, dummy_get_value);
+               lttng_ust_dummy_get_size, lttng_ust_dummy_record,
+               lttng_ust_dummy_get_value);
        cds_hlist_del(&provider->node);
 end:
        ust_unlock();
@@ -168,9 +146,9 @@ int lttng_ust_add_app_context_to_ctx_rcu(const char *name,
                new_field.record = provider->record;
                new_field.get_value = provider->get_value;
        } else {
-               new_field.get_size = dummy_get_size;
-               new_field.record = dummy_record;
-               new_field.get_value = dummy_get_value;
+               new_field.get_size = lttng_ust_dummy_get_size;
+               new_field.record = lttng_ust_dummy_record;
+               new_field.get_value = lttng_ust_dummy_get_value;
        }
        ret = lttng_context_add_rcu(ctx, &new_field);
        if (ret) {
This page took 0.024713 seconds and 4 git commands to generate.