From: David Goulet Date: Thu, 14 Nov 2013 19:50:26 +0000 (-0500) Subject: Remove ENABLE_EVENT_* values and fix enable filtering X-Git-Url: http://git.efficios.com/?p=lttng-tools.git;a=commitdiff_plain;h=67676bd8b522e83c6d45c7f6a205ab7a30001c9d Remove ENABLE_EVENT_* values and fix enable filtering Since every enable event values are now mapped to the same code path, only use one for the three of them. This commit also fixes the check for the maximum bytecode length. Signed-off-by: David Goulet --- diff --git a/src/bin/lttng-sessiond/main.c b/src/bin/lttng-sessiond/main.c index bbbc75588..8aea0e77c 100644 --- a/src/bin/lttng-sessiond/main.c +++ b/src/bin/lttng-sessiond/main.c @@ -2936,74 +2936,75 @@ skip_domain: break; } case LTTNG_ENABLE_EVENT: - case LTTNG_ENABLE_EVENT_WITH_EXCLUSION: - case LTTNG_ENABLE_EVENT_WITH_FILTER: { struct lttng_event_exclusion *exclusion = NULL; struct lttng_filter_bytecode *bytecode = NULL; - if (cmd_ctx->lsm->cmd_type == LTTNG_ENABLE_EVENT || - (cmd_ctx->lsm->u.enable.exclusion_count == 0 && cmd_ctx->lsm->u.enable.bytecode_len == 0)) { - ret = cmd_enable_event(cmd_ctx->session, &cmd_ctx->lsm->domain, - cmd_ctx->lsm->u.enable.channel_name, - &cmd_ctx->lsm->u.enable.event, NULL, NULL, kernel_poll_pipe[1]); - } else { - if (cmd_ctx->lsm->u.enable.exclusion_count != 0) { - exclusion = zmalloc(sizeof(struct lttng_event_exclusion) + - cmd_ctx->lsm->u.enable.exclusion_count * LTTNG_SYMBOL_NAME_LEN); - if (!exclusion) { - ret = LTTNG_ERR_EXCLUSION_NOMEM; - goto error; - } - DBG("Receiving var len data from client ..."); - exclusion->count = cmd_ctx->lsm->u.enable.exclusion_count; - ret = lttcomm_recv_unix_sock(sock, exclusion->names, - cmd_ctx->lsm->u.enable.exclusion_count * LTTNG_SYMBOL_NAME_LEN); - if (ret <= 0) { - DBG("Nothing recv() from client var len data... continuing"); - *sock_error = 1; - ret = LTTNG_ERR_EXCLUSION_INVAL; - goto error; - } + /* Handle exclusion events and receive it from the client. */ + if (cmd_ctx->lsm->u.enable.exclusion_count > 0) { + size_t count = cmd_ctx->lsm->u.enable.exclusion_count; + + exclusion = zmalloc(sizeof(struct lttng_event_exclusion) + + (count * LTTNG_SYMBOL_NAME_LEN)); + if (!exclusion) { + ret = LTTNG_ERR_EXCLUSION_NOMEM; + goto error; } - if (cmd_ctx->lsm->u.enable.bytecode_len != 0) { - bytecode = zmalloc(cmd_ctx->lsm->u.enable.bytecode_len); - if (!bytecode) { - if (!exclusion) - free(exclusion); - ret = LTTNG_ERR_FILTER_NOMEM; - goto error; - } - /* Receive var. len. data */ - DBG("Receiving var len data from client ..."); - ret = lttcomm_recv_unix_sock(sock, bytecode, - cmd_ctx->lsm->u.enable.bytecode_len); - if (ret <= 0) { - DBG("Nothing recv() from client car len data... continuing"); - *sock_error = 1; - if (!exclusion) - free(exclusion); - ret = LTTNG_ERR_FILTER_INVAL; - goto error; - } - if (bytecode->len + sizeof(*bytecode) - != cmd_ctx->lsm->u.enable.bytecode_len) { - free(bytecode); - if (!exclusion) - free(exclusion); - ret = LTTNG_ERR_FILTER_INVAL; - goto error; - } + DBG("Receiving var len exclusion event list from client ..."); + exclusion->count = count; + ret = lttcomm_recv_unix_sock(sock, exclusion->names, + count * LTTNG_SYMBOL_NAME_LEN); + if (ret <= 0) { + DBG("Nothing recv() from client var len data... continuing"); + *sock_error = 1; + free(exclusion); + ret = LTTNG_ERR_EXCLUSION_INVAL; + goto error; + } + } + + /* Handle filter and get bytecode from client. */ + if (cmd_ctx->lsm->u.enable.bytecode_len > 0) { + size_t bytecode_len = cmd_ctx->lsm->u.enable.bytecode_len; + + if (bytecode_len > LTTNG_FILTER_MAX_LEN) { + ret = LTTNG_ERR_FILTER_INVAL; + free(exclusion); + goto error; } - ret = cmd_enable_event(cmd_ctx->session, - &cmd_ctx->lsm->domain, - cmd_ctx->lsm->u.enable.channel_name, - &cmd_ctx->lsm->u.enable.event, bytecode, - exclusion, - kernel_poll_pipe[1]); + bytecode = zmalloc(bytecode_len); + if (!bytecode) { + free(exclusion); + ret = LTTNG_ERR_FILTER_NOMEM; + goto error; + } + + /* Receive var. len. data */ + DBG("Receiving var len filter's bytecode from client ..."); + ret = lttcomm_recv_unix_sock(sock, bytecode, bytecode_len); + if (ret <= 0) { + DBG("Nothing recv() from client car len data... continuing"); + *sock_error = 1; + free(bytecode); + free(exclusion); + ret = LTTNG_ERR_FILTER_INVAL; + goto error; + } + + if ((bytecode->len + sizeof(*bytecode)) != bytecode_len) { + free(bytecode); + free(exclusion); + ret = LTTNG_ERR_FILTER_INVAL; + goto error; + } } + + ret = cmd_enable_event(cmd_ctx->session, &cmd_ctx->lsm->domain, + cmd_ctx->lsm->u.enable.channel_name, + &cmd_ctx->lsm->u.enable.event, bytecode, exclusion, + kernel_poll_pipe[1]); break; } case LTTNG_ENABLE_ALL_EVENT: diff --git a/src/common/sessiond-comm/sessiond-comm.h b/src/common/sessiond-comm/sessiond-comm.h index 9a33479f3..2246477f3 100644 --- a/src/common/sessiond-comm/sessiond-comm.h +++ b/src/common/sessiond-comm/sessiond-comm.h @@ -80,8 +80,8 @@ enum lttcomm_sessiond_command { LTTNG_DISABLE_CONSUMER = 19, LTTNG_ENABLE_CONSUMER = 20, LTTNG_SET_CONSUMER_URI = 21, - LTTNG_ENABLE_EVENT_WITH_FILTER = 22, - LTTNG_ENABLE_EVENT_WITH_EXCLUSION = 23, + /* 22 */ + /* 23 */ LTTNG_DATA_PENDING = 24, LTTNG_SNAPSHOT_ADD_OUTPUT = 25, LTTNG_SNAPSHOT_DEL_OUTPUT = 26, diff --git a/src/lib/lttng-ctl/lttng-ctl.c b/src/lib/lttng-ctl/lttng-ctl.c index 9a2160533..222d719f8 100644 --- a/src/lib/lttng-ctl/lttng-ctl.c +++ b/src/lib/lttng-ctl/lttng-ctl.c @@ -734,21 +734,7 @@ int lttng_enable_event_with_exclusions(struct lttng_handle *handle, } lttng_ctl_copy_lttng_domain(&lsm.domain, &handle->domain); - - /* figure out correct command type, based on if we have a filter or exclusions */ - if (exclusion_count == 0) { - if (filter_expression == NULL) { - if (ev->name[0] != '\0') { - lsm.cmd_type = LTTNG_ENABLE_EVENT; - } else { - lsm.cmd_type = LTTNG_ENABLE_ALL_EVENT; - } - } else { - lsm.cmd_type = LTTNG_ENABLE_EVENT_WITH_FILTER; - } - } else { - lsm.cmd_type = LTTNG_ENABLE_EVENT_WITH_EXCLUSION; - } + lsm.cmd_type = LTTNG_ENABLE_EVENT; memcpy(&lsm.u.enable.event, ev, sizeof(lsm.u.enable.event)); @@ -869,9 +855,8 @@ int lttng_enable_event_with_exclusions(struct lttng_handle *handle, } ret = lttng_ctl_ask_sessiond_varlen(&lsm, varlen_data, - LTTNG_SYMBOL_NAME_LEN * lsm.u.enable.exclusion_count - + lsm.u.enable.bytecode_len, - NULL); + (LTTNG_SYMBOL_NAME_LEN * lsm.u.enable.exclusion_count) + + lsm.u.enable.bytecode_len, NULL); if (lsm.u.enable.exclusion_count != 0) { free(varlen_data);