Fix: don't enable if param overflows when rounded up
[lttng-tools.git] / src / bin / lttng / commands / enable_channels.c
index 4185b19a716cde04b47ba2c47209a54bfb3b0f69..b59c05861beeb021b0c1327def90381fe21378a4 100644 (file)
@@ -89,7 +89,7 @@ static struct poptOption long_options[] = {
  */
 static void usage(FILE *ofp)
 {
-       fprintf(ofp, "usage: lttng enable-channel NAME[,NAME2,...] [-u|-k] [OPTIONS]\n");
+       fprintf(ofp, "usage: lttng enable-channel NAME[,NAME2,...] (-u | -k) [OPTIONS]\n");
        fprintf(ofp, "\n");
        fprintf(ofp, "Options:\n");
        fprintf(ofp, "  -h, --help               Show this help\n");
@@ -130,8 +130,8 @@ 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 only)\n");
-       fprintf(ofp, "      --buffers-pid        Use per PID buffer (-u only)\n");
+       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-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");
@@ -213,7 +213,7 @@ static int enable_channel(char *session_name)
                        dom.buf_type = LTTNG_BUFFER_PER_UID;
                }
        } else {
-               ERR("Please specify a tracer (-k/--kernel or -u/--userspace)");
+               print_missing_domain();
                ret = CMD_ERROR;
                goto error;
        }
@@ -269,6 +269,7 @@ static int enable_channel(char *session_name)
                        switch (-ret) {
                        case LTTNG_ERR_KERN_CHAN_EXIST:
                        case LTTNG_ERR_UST_CHAN_EXIST:
+                       case LTTNG_ERR_CHAN_EXIST:
                                WARN("Channel %s: %s (session %s)", channel_name,
                                                lttng_strerror(ret), session_name);
                                goto error;
@@ -280,8 +281,7 @@ static int enable_channel(char *session_name)
                        warn = 1;
                } else {
                        MSG("%s channel %s enabled for session %s",
-                                       opt_kernel ? "Kernel" : "UST", channel_name,
-                                       session_name);
+                                       get_domain_str(dom.type), channel_name, session_name);
                }
 
                /* Next event */
@@ -356,6 +356,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 +392,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.subbuf_size) {
+                               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);
This page took 0.025103 seconds and 5 git commands to generate.