Fix: incorrect field accounting for dynamic type
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Wed, 22 Apr 2020 16:22:19 +0000 (12:22 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Wed, 22 Apr 2020 16:25:27 +0000 (12:25 -0400)
Two field accounting issues were introduced by
commit 218deb69baab "tracepoint: Refactor representation of nested
types" which affect the dynamic types used by Java application contexts.

The structure types should account 1 for the structure per se, in
addition to the nested fields.

The atype_dynamic includes an implicit enumeration, which now has two
fields instead of 1.

This was causing memory corruption issues in the lttng-ust-java-tests.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
liblttng-ust-comm/lttng-ust-comm.c

index d7991f19b6098b97f1333f013e332df426c3bf0d..f9398e0d9891311ef2cdb3837905a4a67944c9ca 100644 (file)
@@ -779,7 +779,7 @@ ssize_t count_one_type(const struct lttng_type *lt)
                return 1;
        case atype_struct:
                return count_fields_recursive(lt->u.legacy._struct.nr_fields,
-                               lt->u.legacy._struct.fields);
+                               lt->u.legacy._struct.fields) + 1;
        case atype_enum_nestable:
                return count_one_type(lt->u.enum_nestable.container_type) + 1;
        case atype_array_nestable:
@@ -788,7 +788,7 @@ ssize_t count_one_type(const struct lttng_type *lt)
                return count_one_type(lt->u.sequence_nestable.elem_type) + 1;
        case atype_struct_nestable:
                return count_fields_recursive(lt->u.struct_nestable.nr_fields,
-                               lt->u.struct_nestable.fields);
+                               lt->u.struct_nestable.fields) + 1;
 
        case atype_dynamic:
        {
@@ -801,10 +801,10 @@ ssize_t count_one_type(const struct lttng_type *lt)
                if (ret)
                        return ret;
                /*
-                * One field for enum, one field for variant, and
+                * Two fields for enum, one field for variant, and
                 * one field per choice.
                 */
-               return count_fields_recursive(nr_choices, choices) + 2;
+               return count_fields_recursive(nr_choices, choices) + 3;
        }
 
        default:
This page took 0.030785 seconds and 4 git commands to generate.