* Christian Babeux ([email protected]) wrote:
> In order to support the filter bytecode maximum length (65536 bytes),
> the lttng_ust_filter_bytecode len field type must be able to
> hold more than a uint16_t. Change the field type to a uint32_t.
> 
> Also, since the relocation table is located at the end of the actual
> bytecode, the reloc_table_offset (reloc_offset in ust-abi) field must
> support offset values larger than 65535. Change the field type to a
> uint32_t. This change will allow support of relocation table appended
> to larger bytecode without breaking the ABI if the need arise in the
> future.
> 
> Both changes currently breaks the filter ABI, but this should be a
> reasonable compromise since the filtering feature has not been
> released yet.
> 
> Signed-off-by: Christian Babeux <[email protected]>
> ---
>  src/bin/lttng-sessiond/lttng-ust-abi.h                      | 6 +++---
>  src/common/sessiond-comm/sessiond-comm.h                    | 6 +++---
>  src/lib/lttng-ctl/filter/filter-visitor-generate-bytecode.c | 2 +-
>  3 files changed, 7 insertions(+), 7 deletions(-)
> 
> diff --git a/src/bin/lttng-sessiond/lttng-ust-abi.h 
> b/src/bin/lttng-sessiond/lttng-ust-abi.h
> index d8b10c2..504c060 100644
> --- a/src/bin/lttng-sessiond/lttng-ust-abi.h
> +++ b/src/bin/lttng-sessiond/lttng-ust-abi.h
> @@ -168,10 +168,10 @@ struct lttng_ust_calibrate {
>       } u;
>  };
>  
> -#define FILTER_BYTECODE_MAX_LEN              65535
> +#define FILTER_BYTECODE_MAX_LEN              65536
>  struct lttng_ust_filter_bytecode {
> -     uint16_t len;
> -     uint16_t reloc_offset;
> +     uint32_t len;
> +     uint32_t reloc_offset;
>       char data[0];
>  };
>  
> diff --git a/src/common/sessiond-comm/sessiond-comm.h 
> b/src/common/sessiond-comm/sessiond-comm.h
> index ff22875..62205f4 100644
> --- a/src/common/sessiond-comm/sessiond-comm.h
> +++ b/src/common/sessiond-comm/sessiond-comm.h
> @@ -208,7 +208,7 @@ struct lttcomm_session_msg {
>       } u;
>  };
>  
> -#define LTTNG_FILTER_MAX_LEN 65535
> +#define LTTNG_FILTER_MAX_LEN 65536
>  
>  /*
>   * Filter bytecode data. The reloc table is located at the end of the
> @@ -216,8 +216,8 @@ struct lttcomm_session_msg {
>   * starts at reloc_table_offset.
>   */
>  struct lttng_filter_bytecode {
> -     uint16_t len;   /* len of data */
> -     uint16_t reloc_table_offset;
> +     uint32_t len;   /* len of data */
> +     uint32_t reloc_table_offset;

So you might want to add, at:

src/bin/lttng-sessiond/main.c, around line 3965 (under case
LTTNG_SET_FILTER):

                if (cmd_ctx->lsm->u.filter.reloc_table_offset
                                > LTTNG_FILTER_MAX_LEN - 1) {
                        ret = LTTNG_ERR_FILTER_INVAL;
                        goto error;
                }

and change:

                if (cmd_ctx->lsm->u.filter.bytecode_len > 65336) {

for

                if (cmd_ctx->lsm->u.filter.bytecode_len > LTTNG_FILTER_MAX_LEN) 
{

Thanks,

Mathieu


>       char data[0];
>  };
>  
> diff --git a/src/lib/lttng-ctl/filter/filter-visitor-generate-bytecode.c 
> b/src/lib/lttng-ctl/filter/filter-visitor-generate-bytecode.c
> index 98f8375..332a387 100644
> --- a/src/lib/lttng-ctl/filter/filter-visitor-generate-bytecode.c
> +++ b/src/lib/lttng-ctl/filter/filter-visitor-generate-bytecode.c
> @@ -239,7 +239,7 @@ int visit_node_load(struct filter_parser_ctx *ctx, struct 
> ir_op *node)
>               uint32_t insn_len = sizeof(struct load_op)
>                       + sizeof(struct field_ref);
>               struct field_ref ref_offset;
> -             uint16_t reloc_offset;
> +             uint32_t reloc_offset;
>  
>               insn = calloc(insn_len, 1);
>               if (!insn)
> -- 
> 1.7.11.4
> 

-- 
Mathieu Desnoyers
Operating System Efficiency R&D Consultant
EfficiOS Inc.
http://www.efficios.com

_______________________________________________
lttng-dev mailing list
[email protected]
http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev

Reply via email to