[lttng-dev] [PATCH lttng-ust] Fix: reloc offset validation error out on filters with no reloc table
Mathieu Desnoyers
mathieu.desnoyers at efficios.com
Sat Sep 29 13:38:52 EDT 2012
* Christian Babeux (christian.babeux at efficios.com) wrote:
> The reloc table is currently appended at the end of the bytecode data.
> With this scheme, the reloc table offset will be equal to the length
> of the bytecode data.
merged, thanks!
Mathieu
>
> <- length ->
> +----------+-------------+
> | BYTECODE | RELOC TABLE |
> +----------+-------------+
> |
> +--> Reloc table offset
>
> A special case arise with filters with no reloc table.
>
> Example:
>
> Filter: "myString" == "yourString"
> ./filter-grammar-test -p -B -i -b < bogus
> <root>
> <op type="==">
> <expression>
> <string value="myString"/>
> </expression>
> <expression>
> <string value="yourString"/>
> </expression>
> </op>
> </root>
> Generating IR... done
> Validating IR... done
> Generating bytecode... done
> Size of bytecode generated: 24 bytes.
> Bytecode:
>
> Val. Operator
> ---- --------
> 0x40 (FILTER_OP_LOAD_STRING)
> 0x6D m
> 0x79 y
> 0x53 S
> 0x74 t
> 0x72 r
> 0x69 i
> 0x6E n
> 0x67 g
> 0x00 \0
> 0x40 (FILTER_OP_LOAD_STRING)
> 0x79 y
> 0x6F o
> 0x75 u
> 0x72 r
> 0x53 S
> 0x74 t
> 0x72 r
> 0x69 i
> 0x6E n
> 0x67 g
> 0x00 \0
> 0x0C (FILTER_OP_EQ)
> 0x01 (FILTER_OP_RETURN)
>
> Reloc table (offset: 24):
> Empty
>
> <- 24 ->
> +----------+
> | BYTECODE | <- No reloc table
> +----------+
> |
> +--> Reloc table offset
>
> In this case, we see that the reloc table offset (24) is indeed equal to
> the length of the bytecode (24), but the reloc table is _empty_. Thus,
> the reloc_offset received in handle_message() will be equal to the
> data_size and will be wrongly flagged as not within the data even thought
> the filter is entirely valid.
>
> The fix is to simply allow a reloc_offset to be equal to the data_size.
>
> Fixes #342
>
> Signed-off-by: Christian Babeux <christian.babeux at efficios.com>
> ---
> liblttng-ust/lttng-ust-comm.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/liblttng-ust/lttng-ust-comm.c b/liblttng-ust/lttng-ust-comm.c
> index a464e88..efc6724 100644
> --- a/liblttng-ust/lttng-ust-comm.c
> +++ b/liblttng-ust/lttng-ust-comm.c
> @@ -294,7 +294,7 @@ int handle_message(struct sock_info *sock_info,
> goto error;
> }
>
> - if (lum->u.filter.reloc_offset > lum->u.filter.data_size - 1) {
> + if (lum->u.filter.reloc_offset > lum->u.filter.data_size) {
> ERR("Filter reloc offset %u is not within data\n",
> lum->u.filter.reloc_offset);
> ret = -EINVAL;
> --
> 1.7.12
>
--
Mathieu Desnoyers
Operating System Efficiency R&D Consultant
EfficiOS Inc.
http://www.efficios.com
More information about the lttng-dev
mailing list