X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fcommon%2Fevent-rule%2Fsyscall.c;h=51f22fcc0ff85602d680f5216d790dc48f1c38a8;hp=ef7ccd0f9a038505c4cec79fea5b0f6c7fb4428e;hb=959e3c66727698e58a8788aceeda5820b3c938ba;hpb=e6a39346997db7e1d40026b2cc10be5893723eb3 diff --git a/src/common/event-rule/syscall.c b/src/common/event-rule/syscall.c index ef7ccd0f9..51f22fcc0 100644 --- a/src/common/event-rule/syscall.c +++ b/src/common/event-rule/syscall.c @@ -6,11 +6,14 @@ */ #include +#include #include #include #include #include #include +#include +#include #include #include @@ -137,7 +140,8 @@ end: } static enum lttng_error_code lttng_event_rule_syscall_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 = LTTNG_OK; @@ -177,7 +181,7 @@ static enum lttng_error_code lttng_event_rule_syscall_generate_filter_bytecode( } ret = run_as_generate_filter_bytecode( - syscall->internal_filter.filter, uid, gid, &bytecode); + syscall->internal_filter.filter, creds, &bytecode); if (ret) { ret_code = LTTNG_ERR_FILTER_INVAL; } @@ -221,6 +225,25 @@ lttng_event_rule_syscall_generate_exclusions( return NULL; } +static unsigned long +lttng_event_rule_syscall_hash( + const struct lttng_event_rule *rule) +{ + unsigned long hash; + struct lttng_event_rule_syscall *syscall_rule = + container_of(rule, typeof(*syscall_rule), parent); + + hash = hash_key_ulong((void *) LTTNG_EVENT_RULE_TYPE_SYSCALL, + lttng_ht_seed); + hash ^= hash_key_str(syscall_rule->pattern, lttng_ht_seed); + if (syscall_rule->filter_expression) { + hash ^= hash_key_str(syscall_rule->filter_expression, + lttng_ht_seed); + } + + return hash; +} + struct lttng_event_rule *lttng_event_rule_syscall_create() { struct lttng_event_rule *rule = NULL; @@ -246,6 +269,7 @@ struct lttng_event_rule *lttng_event_rule_syscall_create() lttng_event_rule_syscall_get_internal_filter_bytecode; syscall_rule->parent.generate_exclusions = lttng_event_rule_syscall_generate_exclusions; + syscall_rule->parent.hash = lttng_event_rule_syscall_hash; end: return rule; } @@ -276,13 +300,12 @@ ssize_t lttng_event_rule_syscall_create_from_payload( current_buffer_view = lttng_buffer_view_from_view( &view->buffer, offset, sizeof(*syscall_comm)); - syscall_comm = (typeof(syscall_comm)) current_buffer_view.data; - - if (!syscall_comm) { + if (!lttng_buffer_view_is_valid(¤t_buffer_view)) { ret = -1; goto end; } + syscall_comm = (typeof(syscall_comm)) current_buffer_view.data; rule = lttng_event_rule_syscall_create(); if (!rule) { ERR("Failed to create event rule syscall"); @@ -296,12 +319,12 @@ ssize_t lttng_event_rule_syscall_create_from_payload( /* Map the pattern. */ current_buffer_view = lttng_buffer_view_from_view( &view->buffer, offset, syscall_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, syscall_comm->pattern_len)) { ret = -1; @@ -318,12 +341,12 @@ ssize_t lttng_event_rule_syscall_create_from_payload( /* Map the filter_expression. */ current_buffer_view = lttng_buffer_view_from_view(&view->buffer, offset, syscall_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, syscall_comm->filter_expression_len)) {