Fix: lttng: poptGetArg doesn't provide string ownership
[lttng-tools.git] / src / bin / lttng / commands / enable_events.c
index 0704b14756f78ef860b7e283c4e084a4b6f6a40a..ebc46d87f5dd38bf6bdb63bb29b8e021af471a96 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011 David Goulet <david.goulet@polymtl.ca>
+ * Copyright (C) 2011 EfficiOS Inc.
  *
  * SPDX-License-Identifier: GPL-2.0-only
  *
@@ -25,6 +25,7 @@
 /* Mi dependancy */
 #include <common/mi-lttng.h>
 
+#include <lttng/domain-internal.h>
 #include <lttng/event-internal.h>
 
 #include "../command.h"
@@ -35,7 +36,6 @@
 #define LTTNG_SYMBOL_NAME_LEN_SCANF_IS_A_BROKEN_API    "255"
 #endif
 
-static char *opt_event_list;
 static int opt_event_type;
 static const char *opt_loglevel;
 static int opt_loglevel_type;
@@ -129,7 +129,7 @@ static int parse_probe_opts(struct lttng_event *ev, char *opt)
                        ret = CMD_ERROR;
                        goto end;
                }
-               ev->attr.probe.offset = strtoul(s_hex, NULL, 0);
+               ev->attr.probe.offset = strtoull(s_hex, NULL, 0);
                DBG("probe offset %" PRIu64, ev->attr.probe.offset);
                ev->attr.probe.addr = 0;
                goto end;
@@ -163,7 +163,7 @@ static int parse_probe_opts(struct lttng_event *ev, char *opt)
                        ret = CMD_ERROR;
                        goto end;
                }
-               ev->attr.probe.addr = strtoul(s_hex, NULL, 0);
+               ev->attr.probe.addr = strtoull(s_hex, NULL, 0);
                DBG("probe addr %" PRIu64, ev->attr.probe.addr);
                ev->attr.probe.offset = 0;
                memset(ev->attr.probe.symbol_name, 0, LTTNG_SYMBOL_NAME_LEN);
@@ -430,7 +430,7 @@ static void warn_on_truncated_exclusion_names(const struct lttng_dynamic_pointer
  * Enabling event using the lttng API.
  * Note: in case of error only the last error code will be return.
  */
-static int enable_events(char *session_name)
+static int enable_events(char *session_name, char *event_list)
 {
        int ret = CMD_SUCCESS, command_ret = CMD_SUCCESS;
        int error_holder = CMD_SUCCESS, warn = 0, error = 0, success = 1;
@@ -486,7 +486,7 @@ static int enable_events(char *session_name)
                case LTTNG_DOMAIN_LOG4J:
                case LTTNG_DOMAIN_PYTHON:
                        ERR("Event name exclusions are not yet implemented for %s events",
-                                       get_domain_str(dom.type));
+                                       lttng_domain_type_str(dom.type));
                        ret = CMD_ERROR;
                        goto error;
                case LTTNG_DOMAIN_UST:
@@ -656,7 +656,7 @@ static int enable_events(char *session_name)
                                                goto end;
                                        }
                                        MSG("All %s tracepoints%s are enabled in channel %s for loglevel %s",
-                                                       get_domain_str(dom.type),
+                                                       lttng_domain_type_str(dom.type),
                                                        exclusion_string,
                                                        print_channel_name(channel_name),
                                                        opt_loglevel);
@@ -670,7 +670,7 @@ static int enable_events(char *session_name)
                                                goto end;
                                        }
                                        MSG("All %s tracepoints%s are enabled in channel %s",
-                                                       get_domain_str(dom.type),
+                                                       lttng_domain_type_str(dom.type),
                                                        exclusion_string,
                                                        print_channel_name(channel_name));
                                        free(exclusion_string);
@@ -679,7 +679,7 @@ static int enable_events(char *session_name)
                        case LTTNG_EVENT_SYSCALL:
                                if (opt_kernel) {
                                        MSG("All %s system calls are enabled in channel %s",
-                                                       get_domain_str(dom.type),
+                                                       lttng_domain_type_str(dom.type),
                                                        print_channel_name(channel_name));
                                }
                                break;
@@ -693,7 +693,7 @@ static int enable_events(char *session_name)
                                                goto end;
                                        }
                                        MSG("All %s events%s are enabled in channel %s for loglevel %s",
-                                                       get_domain_str(dom.type),
+                                                       lttng_domain_type_str(dom.type),
                                                        exclusion_string,
                                                        print_channel_name(channel_name),
                                                        opt_loglevel);
@@ -707,7 +707,7 @@ static int enable_events(char *session_name)
                                                goto end;
                                        }
                                        MSG("All %s events%s are enabled in channel %s",
-                                                       get_domain_str(dom.type),
+                                                       lttng_domain_type_str(dom.type),
                                                        exclusion_string,
                                                        print_channel_name(channel_name));
                                        free(exclusion_string);
@@ -812,7 +812,7 @@ static int enable_events(char *session_name)
        }
 
        /* Strip event list */
-       event_name = strtok(opt_event_list, ",");
+       event_name = strtok(event_list, ",");
        while (event_name != NULL) {
                /* Copy name and type of the event */
                strncpy(ev->name, event_name, LTTNG_SYMBOL_NAME_LEN);
@@ -1059,7 +1059,7 @@ static int enable_events(char *session_name)
                                case LTTNG_DOMAIN_KERNEL:
                                case LTTNG_DOMAIN_UST:
                                        MSG("%s event %s%s created in channel %s",
-                                               get_domain_str(dom.type),
+                                               lttng_domain_type_str(dom.type),
                                                event_name,
                                                exclusion_string,
                                                print_channel_name(channel_name));
@@ -1072,7 +1072,7 @@ static int enable_events(char *session_name)
                                         * name for agent domains.
                                         */
                                        MSG("%s event %s%s enabled",
-                                               get_domain_str(dom.type),
+                                               lttng_domain_type_str(dom.type),
                                                event_name,
                                                exclusion_string);
                                        break;
@@ -1222,6 +1222,8 @@ int cmd_enable_events(int argc, const char **argv)
        int opt, ret = CMD_SUCCESS, command_ret = CMD_SUCCESS, success = 1;
        static poptContext pc;
        char *session_name = NULL;
+       char *event_list = NULL;
+       const char *arg_event_list = NULL;
        const char *leftover = NULL;
        int event_type = -1;
 
@@ -1320,13 +1322,22 @@ int cmd_enable_events(int argc, const char **argv)
                }
        }
 
-       opt_event_list = (char*) poptGetArg(pc);
-       if (opt_event_list == NULL && opt_enable_all == 0) {
-               ERR("Missing event name(s).\n");
+       arg_event_list = poptGetArg(pc);
+       if (arg_event_list == NULL && opt_enable_all == 0) {
+               ERR("Missing event name(s).");
                ret = CMD_ERROR;
                goto end;
        }
 
+       if (opt_enable_all == 0) {
+               event_list = strdup(arg_event_list);
+               if (event_list == NULL) {
+                       PERROR("Failed to copy event name(s)");
+                       ret = CMD_ERROR;
+                       goto end;
+               }
+       }
+
        leftover = poptGetArg(pc);
        if (leftover) {
                ERR("Unknown argument: %s", leftover);
@@ -1345,7 +1356,7 @@ int cmd_enable_events(int argc, const char **argv)
                session_name = opt_session_name;
        }
 
-       command_ret = enable_events(session_name);
+       command_ret = enable_events(session_name, event_list);
        if (command_ret) {
                success = 0;
                goto mi_closing;
@@ -1387,6 +1398,8 @@ end:
                free(session_name);
        }
 
+       free(event_list);
+
        /* Overwrite ret if an error occurred in enable_events */
        ret = command_ret ? command_ret : ret;
 
This page took 0.028215 seconds and 4 git commands to generate.