X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=src%2Fbin%2Flttng%2Fcommands%2Fenable_channels.c;h=4e5651b28067b4281236ed49c0c33b5badf525c0;hb=38956b501df0cc3f5041c5604039c2ec2d8efa76;hp=18f8d020eef5089ef4309ec9608a3ebd5589fcd7;hpb=b9dfb1671626365019a72318fb131eb321244245;p=lttng-tools.git diff --git a/src/bin/lttng/commands/enable_channels.c b/src/bin/lttng/commands/enable_channels.c index 18f8d020e..4e5651b28 100644 --- a/src/bin/lttng/commands/enable_channels.c +++ b/src/bin/lttng/commands/enable_channels.c @@ -130,12 +130,14 @@ static void usage(FILE *ofp) DEFAULT_UST_PID_CHANNEL_OUTPUT == LTTNG_EVENT_MMAP ? output_mmap : output_splice, DEFAULT_KERNEL_CHANNEL_OUTPUT == LTTNG_EVENT_MMAP ? output_mmap : output_splice, DEFAULT_METADATA_OUTPUT == LTTNG_EVENT_MMAP ? output_mmap : output_splice); - fprintf(ofp, " --buffers-uid Use per UID buffer (-u/-j only)\n"); - fprintf(ofp, " --buffers-pid Use per PID buffer (-u/-j only)\n"); + fprintf(ofp, " --buffers-uid Use per UID buffer (-u only)\n"); + fprintf(ofp, " --buffers-pid Use per PID buffer (-u only)\n"); fprintf(ofp, " --buffers-global Use shared buffer for the whole system (-k only)\n"); fprintf(ofp, " -C, --tracefile-size SIZE\n"); fprintf(ofp, " Maximum size of each tracefile within a stream (in bytes). 0 means unlimited.\n"); fprintf(ofp, " (default: %u)\n", DEFAULT_CHANNEL_TRACEFILE_SIZE); + fprintf(ofp, " Note: traces generated with this option may inaccurately report\n"); + fprintf(ofp, " discarded events as per CTF 1.8.\n"); fprintf(ofp, " -W, --tracefile-count COUNT\n"); fprintf(ofp, " Used in conjunction with -C option, this will limit the number\n"); fprintf(ofp, " of files created to the specified count. 0 means unlimited.\n"); @@ -169,7 +171,7 @@ static void set_default_attr(struct lttng_domain *dom) if (chan.attr.read_timer_interval == -1) { chan.attr.read_timer_interval = default_attr.read_timer_interval; } - if (chan.attr.output == -1) { + if ((int) chan.attr.output == -1) { chan.attr.output = default_attr.output; } if (chan.attr.tracefile_count == -1) { @@ -258,9 +260,16 @@ static int enable_channel(char *session_name) /* Strip channel list (format: chan1,chan2,...) */ channel_name = strtok(opt_channels, ","); while (channel_name != NULL) { - /* Copy channel name and normalize it */ - strncpy(chan.name, channel_name, NAME_MAX); - chan.name[NAME_MAX - 1] = '\0'; + /* Validate channel name's length */ + if (strlen(channel_name) >= NAME_MAX) { + ERR("Channel name is too long (max. %zu characters)", + sizeof(chan.name) - 1); + ret = LTTNG_ERR_INVALID_CHANNEL_NAME; + goto error; + } + + /* Copy channel name */ + strcpy(chan.name, channel_name); DBG("Enabling channel %s", channel_name); @@ -273,6 +282,11 @@ static int enable_channel(char *session_name) WARN("Channel %s: %s (session %s)", channel_name, lttng_strerror(ret), session_name); goto error; + case LTTNG_ERR_INVALID_CHANNEL_NAME: + ERR("Invalid channel name: \"%s\". " + "Channel names may not start with '.', and " + "may not contain '/'.", channel_name); + goto error; default: ERR("Channel %s: %s (session %s)", channel_name, lttng_strerror(ret), session_name); @@ -284,7 +298,6 @@ static int enable_channel(char *session_name) get_domain_str(dom.type), channel_name, session_name); } - /* Next event */ channel_name = strtok(NULL, ","); } @@ -356,6 +369,13 @@ int cmd_enable_channels(int argc, const char **argv) order = get_count_order_u64(chan.attr.subbuf_size); assert(order >= 0); rounded_size = 1ULL << order; + if (rounded_size < chan.attr.subbuf_size) { + ERR("The subbuf size (%" PRIu64 ") is rounded and overflows!", + chan.attr.subbuf_size); + ret = CMD_ERROR; + goto end; + } + if (rounded_size != chan.attr.subbuf_size) { WARN("The subbuf size (%" PRIu64 ") is rounded to the next power of 2 (%" PRIu64 ")", chan.attr.subbuf_size, rounded_size); @@ -385,6 +405,13 @@ int cmd_enable_channels(int argc, const char **argv) order = get_count_order_u64(chan.attr.num_subbuf); assert(order >= 0); rounded_size = 1ULL << order; + if (rounded_size < chan.attr.num_subbuf) { + ERR("The number of subbuffers (%" PRIu64 ") is rounded and overflows!", + chan.attr.num_subbuf); + ret = CMD_ERROR; + goto end; + } + if (rounded_size != chan.attr.num_subbuf) { WARN("The number of subbuffers (%" PRIu64 ") is rounded to the next power of 2 (%" PRIu64 ")", chan.attr.num_subbuf, rounded_size);