Fix: bytecode interpreter context_get_index() leaves byte order uninitialized
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Wed, 30 Mar 2022 16:10:53 +0000 (12:10 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Fri, 1 Apr 2022 17:52:47 +0000 (13:52 -0400)
Observed Issue
==============

When using the event notification capture feature to capture a context
field, e.g. '$ctx.cpu_id', the captured value is often observed in
reverse byte order.

Cause
=====

Within the bytecode interpreter, context_get_index() leaves the "rev_bo"
field uninitialized in the top of stack.

This only affects the event notification capture bytecode because the
BYTECODE_OP_GET_SYMBOL bytecode instruction (as of lttng-tools 2.13)
is only generated for capture bytecode in lttng-tools. Therefore, only
capture bytecode targeting contexts are affected by this issue. The
reason why lttng-tools uses the "legacy" bytecode instruction to get
context (BYTECODE_OP_GET_CONTEXT_REF) for the filter bytecode is to
preserve backward compatibility of filtering when interacting with
applications linked against LTTng-UST 2.12.

Solution
========

Initialize the rev_bo field based on the context field type
reserve_byte_order field.

Known drawbacks
===============

None.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: I74996d501cee3c269658d98dfc0d0050b74c5ddb

src/lib/lttng-ust/lttng-bytecode-interpreter.c

index d677fb990eaa87c2345770def788bd7eca46bc96..7f19e981a2d6373c54ab2df3e06fd3d5a7887e51 100644 (file)
@@ -242,6 +242,7 @@ static int context_get_index(struct lttng_ust_ctx *ctx,
                        ptr->u.u64 = v.u.s64;   /* Cast. */
                        ptr->ptr = &ptr->u.u64;
                }
+               ptr->rev_bo = lttng_ust_get_type_integer(field->type)->reverse_byte_order;
                break;
        case lttng_ust_type_enum:
        {
@@ -258,6 +259,7 @@ static int context_get_index(struct lttng_ust_ctx *ctx,
                        ptr->u.u64 = v.u.s64;   /* Cast. */
                        ptr->ptr = &ptr->u.u64;
                }
+               ptr->rev_bo = itype->reverse_byte_order;
                break;
        }
        case lttng_ust_type_array:
@@ -296,6 +298,7 @@ static int context_get_index(struct lttng_ust_ctx *ctx,
                ctx_field->get_value(ctx_field->priv, probe_ctx, &v);
                ptr->u.d = v.u.d;
                ptr->ptr = &ptr->u.d;
+               ptr->rev_bo = lttng_ust_get_type_float(field->type)->reverse_byte_order;
                break;
        case lttng_ust_type_dynamic:
                ctx_field->get_value(ctx_field->priv, probe_ctx, &v);
@@ -309,6 +312,11 @@ static int context_get_index(struct lttng_ust_ctx *ctx,
                        ptr->object_type = OBJECT_TYPE_U64;
                        ptr->u.u64 = v.u.u64;
                        ptr->ptr = &ptr->u.u64;
+                       /*
+                        * struct lttng_ust_ctx_value does not currently
+                        * feature a byte order field.
+                        */
+                       ptr->rev_bo = false;
                        dbg_printf("context get index dynamic u64 %" PRIi64 "\n", ptr->u.u64);
                        break;
                case LTTNG_UST_DYNAMIC_TYPE_S8:
@@ -318,6 +326,11 @@ static int context_get_index(struct lttng_ust_ctx *ctx,
                        ptr->object_type = OBJECT_TYPE_S64;
                        ptr->u.s64 = v.u.s64;
                        ptr->ptr = &ptr->u.s64;
+                       /*
+                        * struct lttng_ust_ctx_value does not currently
+                        * feature a byte order field.
+                        */
+                       ptr->rev_bo = false;
                        dbg_printf("context get index dynamic s64 %" PRIi64 "\n", ptr->u.s64);
                        break;
                case LTTNG_UST_DYNAMIC_TYPE_FLOAT:
@@ -325,6 +338,11 @@ static int context_get_index(struct lttng_ust_ctx *ctx,
                        ptr->object_type = OBJECT_TYPE_DOUBLE;
                        ptr->u.d = v.u.d;
                        ptr->ptr = &ptr->u.d;
+                       /*
+                        * struct lttng_ust_ctx_value does not currently
+                        * feature a byte order field.
+                        */
+                       ptr->rev_bo = false;
                        dbg_printf("context get index dynamic double %g\n", ptr->u.d);
                        break;
                case LTTNG_UST_DYNAMIC_TYPE_STRING:
This page took 0.027626 seconds and 4 git commands to generate.