Fix: Accept bytecode of length 65536 bytes
authorChristian Babeux <christian.babeux@efficios.com>
Thu, 6 Sep 2012 17:40:19 +0000 (13:40 -0400)
committerDavid Goulet <dgoulet@efficios.com>
Fri, 7 Sep 2012 17:35:59 +0000 (13:35 -0400)
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.

Acked-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Signed-off-by: Christian Babeux <christian.babeux@efficios.com>
Signed-off-by: David Goulet <dgoulet@efficios.com>
src/bin/lttng-sessiond/lttng-ust-abi.h
src/bin/lttng-sessiond/main.c
src/common/sessiond-comm/sessiond-comm.h
src/lib/lttng-ctl/filter/filter-visitor-generate-bytecode.c

index d8b10c257039effd035a9c7edc04fd4fba356d6f..504c0607824b4eb392824d9f192e19b033438329 100644 (file)
@@ -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];
 };
 
index 318da741f8cca5060e76f41d87a2a68e121b21d0..730ac656ba199153fd663d825ea4058803b396ea 100644 (file)
@@ -2659,7 +2659,7 @@ skip_domain:
        {
                struct lttng_filter_bytecode *bytecode;
 
-               if (cmd_ctx->lsm->u.filter.bytecode_len > 65336) {
+               if (cmd_ctx->lsm->u.filter.bytecode_len > LTTNG_FILTER_MAX_LEN) {
                        ret = LTTNG_ERR_FILTER_INVAL;
                        goto error;
                }
index 32ce38430af115fbf4303249eaa2684c52654ae3..62205f4c91d0b001ce63bd772707da65135a84f5 100644 (file)
@@ -208,7 +208,7 @@ struct lttcomm_session_msg {
        } u;
 };
 
-#define LTTNG_FILTER_MAX_LEN   65336
+#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;
        char data[0];
 };
 
index 98f837548f97a4afd9e40b3d50723ed27fb91cd5..332a3875a6039e449970bb9ad0b266278b55cb11 100644 (file)
@@ -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)
This page took 0.029958 seconds and 4 git commands to generate.