Fix: channel names are not validated
[lttng-tools.git] / src / bin / lttng / commands / enable_channels.c
index c4bbc1170f30b17b5ed0935aa2348db43b8e986c..4e5651b28067b4281236ed49c0c33b5badf525c0 100644 (file)
@@ -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, ",");
        }
 
This page took 0.024841 seconds and 4 git commands to generate.