X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Flttng-bytecode.c;h=38c2d18380c3a5e4c510a6123c13b4c8b9262c43;hb=684a1e4d7e9a4cf1070e5202e419e1b9f6e9853c;hp=86ffe94985147aec879dc9e9151d95ade9af83b7;hpb=3ef5cc037506f5bce971bd66ef2f77310eca6650;p=lttng-modules.git diff --git a/src/lttng-bytecode.c b/src/lttng-bytecode.c index 86ffe949..38c2d183 100644 --- a/src/lttng-bytecode.c +++ b/src/lttng-bytecode.c @@ -244,12 +244,29 @@ int apply_field_reloc(const struct lttng_event_desc *event_desc, op->op = BYTECODE_OP_LOAD_FIELD_REF_S64; break; case atype_array_nestable: + { + const struct lttng_type *elem_type = field->type.u.array_nestable.elem_type; + + if (!lttng_is_bytewise_integer(elem_type) || elem_type->u.integer.encoding == lttng_encode_none) + return -EINVAL; + if (field->user) + op->op = BYTECODE_OP_LOAD_FIELD_REF_USER_SEQUENCE; + else + op->op = BYTECODE_OP_LOAD_FIELD_REF_SEQUENCE; + break; + } case atype_sequence_nestable: + { + const struct lttng_type *elem_type = field->type.u.sequence_nestable.elem_type; + + if (!lttng_is_bytewise_integer(elem_type) || elem_type->u.integer.encoding == lttng_encode_none) + return -EINVAL; if (field->user) op->op = BYTECODE_OP_LOAD_FIELD_REF_USER_SEQUENCE; else op->op = BYTECODE_OP_LOAD_FIELD_REF_SEQUENCE; break; + } case atype_string: if (field->user) op->op = BYTECODE_OP_LOAD_FIELD_REF_USER_STRING; @@ -314,17 +331,25 @@ int apply_context_reloc(struct bytecode_runtime *runtime, op->op = BYTECODE_OP_GET_CONTEXT_REF_STRING; break; case atype_array_nestable: - if (!lttng_is_bytewise_integer(ctx_field->event_field.type.u.array_nestable.elem_type)) + { + const struct lttng_type *elem_type = ctx_field->event_field.type.u.array_nestable.elem_type; + + if (!lttng_is_bytewise_integer(elem_type) || elem_type->u.integer.encoding == lttng_encode_none) return -EINVAL; BUG_ON(ctx_field->event_field.user); op->op = BYTECODE_OP_GET_CONTEXT_REF_STRING; break; + } case atype_sequence_nestable: - if (!lttng_is_bytewise_integer(ctx_field->event_field.type.u.sequence_nestable.elem_type)) + { + const struct lttng_type *elem_type = ctx_field->event_field.type.u.sequence_nestable.elem_type; + + if (!lttng_is_bytewise_integer(elem_type) || elem_type->u.integer.encoding == lttng_encode_none) return -EINVAL; BUG_ON(ctx_field->event_field.user); op->op = BYTECODE_OP_GET_CONTEXT_REF_STRING; break; + } case atype_struct_nestable: /* Unsupported. */ case atype_variant_nestable: /* Unsupported. */ default: @@ -398,6 +423,7 @@ static int link_bytecode(const struct lttng_event_desc *event_desc, struct lttng_ctx *ctx, struct lttng_bytecode_node *bytecode, + struct list_head *bytecode_runtime_head, struct list_head *insert_loc) { int ret, offset, next_offset; @@ -407,7 +433,7 @@ int link_bytecode(const struct lttng_event_desc *event_desc, if (!bytecode) return 0; /* Bytecode already linked */ - if (bytecode_is_linked(bytecode, insert_loc)) + if (bytecode_is_linked(bytecode, bytecode_runtime_head)) return 0; dbg_printk("Linking...\n"); @@ -566,7 +592,7 @@ void lttng_enabler_link_bytecode(const struct lttng_event_desc *event_desc, insert_loc = instance_bytecode_head; add_within: dbg_printk("linking bytecode\n"); - ret = link_bytecode(event_desc, ctx, enabler_bc, insert_loc); + ret = link_bytecode(event_desc, ctx, enabler_bc, instance_bytecode_head, insert_loc); if (ret) { dbg_printk("[lttng filter] warning: cannot link event bytecode\n"); }