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>
-#define FILTER_BYTECODE_MAX_LEN 65535
+#define FILTER_BYTECODE_MAX_LEN 65536
struct lttng_ust_filter_bytecode {
struct lttng_ust_filter_bytecode {
- uint16_t len;
- uint16_t reloc_offset;
+ uint32_t len;
+ uint32_t reloc_offset;
{
struct lttng_filter_bytecode *bytecode;
{
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;
}
ret = LTTNG_ERR_FILTER_INVAL;
goto error;
}
-#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
/*
* Filter bytecode data. The reloc table is located at the end of the
* starts at reloc_table_offset.
*/
struct lttng_filter_bytecode {
* 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;
uint32_t insn_len = sizeof(struct load_op)
+ sizeof(struct field_ref);
struct field_ref ref_offset;
uint32_t insn_len = sizeof(struct load_op)
+ sizeof(struct field_ref);
struct field_ref ref_offset;
insn = calloc(insn_len, 1);
if (!insn)
insn = calloc(insn_len, 1);
if (!insn)