X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fcommon%2Fevent-rule%2Ftracepoint.c;h=0d0864719df5425500bb04f11c1665dbeaa1bdc1;hb=58daac01d91347336f24e1fc1cacd4e7a3101e93;hp=14e4c7b01901e9b7706ab5e3b83162ba82764337;hpb=6d420eff669a3de55be3ee348f88a4e244b78ecf;p=lttng-tools.git diff --git a/src/common/event-rule/tracepoint.c b/src/common/event-rule/tracepoint.c index 14e4c7b01..0d0864719 100644 --- a/src/common/event-rule/tracepoint.c +++ b/src/common/event-rule/tracepoint.c @@ -6,6 +6,7 @@ */ #include +#include #include #include #include @@ -357,7 +358,8 @@ end: static enum lttng_error_code lttng_event_rule_tracepoint_generate_filter_bytecode( - struct lttng_event_rule *rule, uid_t uid, gid_t gid) + struct lttng_event_rule *rule, + const struct lttng_credentials *creds) { int ret; enum lttng_error_code ret_code; @@ -429,7 +431,7 @@ lttng_event_rule_tracepoint_generate_filter_bytecode( } ret = run_as_generate_filter_bytecode( - tracepoint->internal_filter.filter, uid, gid, + tracepoint->internal_filter.filter, creds, &bytecode); if (ret) { ret_code = LTTNG_ERR_FILTER_INVAL; @@ -603,21 +605,16 @@ ssize_t lttng_event_rule_tracepoint_create_from_payload( goto end; } - if (view->buffer.size < sizeof(*tracepoint_comm)) { + current_buffer_view = lttng_buffer_view_from_view( + &view->buffer, offset, sizeof(*tracepoint_comm)); + if (!lttng_buffer_view_is_valid(¤t_buffer_view)) { ERR("Failed to initialize from malformed event rule tracepoint: buffer too short to contain header."); ret = -1; goto end; } - current_buffer_view = lttng_buffer_view_from_view( - &view->buffer, offset, sizeof(*tracepoint_comm)); tracepoint_comm = (typeof(tracepoint_comm)) current_buffer_view.data; - if (!tracepoint_comm) { - ret = -1; - goto end; - } - if (tracepoint_comm->domain_type <= LTTNG_DOMAIN_NONE || tracepoint_comm->domain_type > LTTNG_DOMAIN_PYTHON) { /* Invalid domain value. */ @@ -667,12 +664,13 @@ ssize_t lttng_event_rule_tracepoint_create_from_payload( /* Map the pattern. */ current_buffer_view = lttng_buffer_view_from_view( &view->buffer, offset, tracepoint_comm->pattern_len); - pattern = current_buffer_view.data; - if (!pattern) { + + if (!lttng_buffer_view_is_valid(¤t_buffer_view)) { ret = -1; goto end; } + pattern = current_buffer_view.data; if (!lttng_buffer_view_contains_string(¤t_buffer_view, pattern, tracepoint_comm->pattern_len)) { ret = -1; @@ -689,12 +687,12 @@ ssize_t lttng_event_rule_tracepoint_create_from_payload( /* Map the filter_expression. */ current_buffer_view = lttng_buffer_view_from_view(&view->buffer, offset, tracepoint_comm->filter_expression_len); - filter_expression = current_buffer_view.data; - if (!filter_expression) { + if (!lttng_buffer_view_is_valid(¤t_buffer_view)) { ret = -1; goto end; } + filter_expression = current_buffer_view.data; if (!lttng_buffer_view_contains_string(¤t_buffer_view, filter_expression, tracepoint_comm->filter_expression_len)) { @@ -709,15 +707,21 @@ skip_filter_expression: for (i = 0; i < tracepoint_comm->exclusions_count; i++) { current_buffer_view = lttng_buffer_view_from_view( &view->buffer, offset, sizeof(*exclusion_len)); - exclusion_len = (typeof(exclusion_len)) current_buffer_view.data; - if (!exclusion_len) { + if (!lttng_buffer_view_is_valid(¤t_buffer_view)) { ret = -1; goto end; } + exclusion_len = (typeof(exclusion_len)) current_buffer_view.data; offset += sizeof(*exclusion_len); + current_buffer_view = lttng_buffer_view_from_view( &view->buffer, offset, *exclusion_len); + if (!lttng_buffer_view_is_valid(¤t_buffer_view)) { + ret = -1; + goto end; + } + exclusion = current_buffer_view.data; if (!lttng_buffer_view_contains_string(¤t_buffer_view, exclusion, *exclusion_len)) {