Fix: add_trigger.c: `goto error` with a wrong UID for `--owner-uid`
[lttng-tools.git] / src / bin / lttng / commands / add_trigger.c
index 32aff65d35f7c07dd2ad60982b266c2f8c72c259..ac086891042d41af4c836f62b335e3a39ee78a7c 100644 (file)
@@ -46,7 +46,7 @@ enum {
 
        OPT_NAME,
        OPT_FILTER,
-       OPT_EXCLUDE_NAMES,
+       OPT_EXCLUDE_NAME,
        OPT_EVENT_NAME,
        OPT_LOG_LEVEL,
 
@@ -66,7 +66,7 @@ enum {
 static const struct argpar_opt_descr event_rule_opt_descrs[] = {
        { OPT_FILTER, 'f', "filter", true },
        { OPT_NAME, 'n', "name", true },
-       { OPT_EXCLUDE_NAMES, 'x', "exclude-names", true },
+       { OPT_EXCLUDE_NAME, 'x', "exclude-name", true },
        { OPT_LOG_LEVEL, 'l', "log-level", true },
        { OPT_EVENT_NAME, 'E', "event-name", true },
 
@@ -209,12 +209,6 @@ error:
        return ret;
 }
 
-/* This is defined in enable_events.c. */
-LTTNG_HIDDEN
-int create_exclusion_list_and_validate(const char *event_name,
-               const char *exclusions_arg,
-               char ***exclusion_list);
-
 /*
  * Parse `str` as a log level in domain `domain_type`.
  *
@@ -661,8 +655,8 @@ struct parse_event_rule_res parse_event_rule(int *argc, const char ***argv)
 
        /* Tracepoint and syscall options. */
        char *name = NULL;
-       char *exclude_names = NULL;
-       char **exclusion_list = NULL;
+       /* Array of strings. */
+       struct lttng_dynamic_pointer_array exclude_names;
 
        /* For userspace / kernel probe and function. */
        char *location = NULL;
@@ -676,6 +670,9 @@ struct parse_event_rule_res parse_event_rule(int *argc, const char ***argv)
 
        lttng_dynamic_pointer_array_init(&res.capture_descriptors,
                                destroy_event_expr);
+
+       lttng_dynamic_pointer_array_init(&exclude_names, free);
+
        state = argpar_state_create(*argc, *argv, event_rule_opt_descrs);
        if (!state) {
                ERR("Failed to allocate an argpar state.");
@@ -756,14 +753,20 @@ struct parse_event_rule_res parse_event_rule(int *argc, const char ***argv)
                                }
 
                                break;
-                       case OPT_EXCLUDE_NAMES:
-                               if (!assign_string(&exclude_names,
-                                                   item_opt->arg,
-                                                   "--exclude-names/-x")) {
+                       case OPT_EXCLUDE_NAME:
+                       {
+                               int ret;
+
+                               ret = lttng_dynamic_pointer_array_add_pointer(
+                                               &exclude_names,
+                                               strdup(item_opt->arg));
+                               if (ret != 0) {
+                                       ERR("Failed to add pointer to dynamic pointer array.");
                                        goto error;
                                }
 
                                break;
+                       }
                        case OPT_LOG_LEVEL:
                                if (!assign_string(&log_level_str,
                                                    item_opt->arg, "--log-level/-l")) {
@@ -849,8 +852,8 @@ struct parse_event_rule_res parse_event_rule(int *argc, const char ***argv)
                        goto error;
                }
 
-               if (exclude_names) {
-                       ERR("Can't use --exclude-names/-x with %s event rules.",
+               if (lttng_dynamic_pointer_array_get_count(&exclude_names) > 0) {
+                       ERR("Can't use --exclude-name/-x with %s event rules.",
                                        lttng_event_rule_type_str(
                                                        event_rule_type));
                        goto error;
@@ -945,17 +948,19 @@ struct parse_event_rule_res parse_event_rule(int *argc, const char ***argv)
                }
        }
 
-       /* If --exclude/-x was passed, split it into an exclusion list. */
-       if (exclude_names) {
+       /* If --exclude-name/-x was passed, split it into an exclusion list. */
+       if (lttng_dynamic_pointer_array_get_count(&exclude_names) > 0) {
                if (domain_type != LTTNG_DOMAIN_UST) {
                        ERR("Event name exclusions are not yet implemented for %s event rules.",
                                        get_domain_str(domain_type));
                        goto error;
                }
 
-               if (create_exclusion_list_and_validate(name,
-                                   exclude_names, &exclusion_list) != 0) {
-                       ERR("Failed to create exclusion list.");
+               if (validate_exclusion_list(name, &exclude_names) != 0) {
+                       /*
+                        * Assume validate_exclusion_list already prints an
+                        * error message.
+                        */
                        goto error;
                }
        }
@@ -1005,17 +1010,25 @@ struct parse_event_rule_res parse_event_rule(int *argc, const char ***argv)
                }
 
                /* Set exclusion list. */
-               if (exclusion_list) {
+               if (lttng_dynamic_pointer_array_get_count(&exclude_names) > 0) {
                        int n;
-
-                       for (n = 0; exclusion_list[n]; n++) {
-                               event_rule_status = lttng_event_rule_tracepoint_add_exclusion(
-                                               res.er,
-                                               exclusion_list[n]);
+                       int count = lttng_dynamic_pointer_array_get_count(
+                                       &exclude_names);
+
+                       for (n = 0; n < count; n++) {
+                               const char *exclude_name =
+                                               lttng_dynamic_pointer_array_get_pointer(
+                                                               &exclude_names,
+                                                               n);
+
+                               event_rule_status =
+                                               lttng_event_rule_tracepoint_add_exclusion(
+                                                               res.er,
+                                                               exclude_name);
                                if (event_rule_status !=
                                                LTTNG_EVENT_RULE_STATUS_OK) {
                                        ERR("Failed to set tracepoint exclusion list element '%s'",
-                                                       exclusion_list[n]);
+                                                       exclude_name);
                                        goto error;
                                }
                        }
@@ -1178,13 +1191,12 @@ end:
        argpar_state_destroy(state);
        free(filter);
        free(name);
-       free(exclude_names);
+       lttng_dynamic_pointer_array_reset(&exclude_names);
        free(log_level_str);
        free(location);
        free(event_name);
        free(event_rule_type_str);
 
-       strutils_free_null_terminated_array_of_strings(exclusion_list);
        lttng_kernel_probe_location_destroy(kernel_probe_location);
        lttng_userspace_probe_location_destroy(userspace_probe_location);
        lttng_log_level_rule_destroy(log_level_rule);
@@ -1291,8 +1303,9 @@ end:
 
 static struct lttng_rate_policy *parse_rate_policy(const char *policy_str)
 {
-       int num_token;
-       char **tokens = NULL;
+       int ret;
+       size_t num_token = 0;
+       struct lttng_dynamic_pointer_array tokens;
        struct lttng_rate_policy *policy = NULL;
        enum lttng_rate_policy_type policy_type;
        unsigned long long value;
@@ -1300,12 +1313,13 @@ static struct lttng_rate_policy *parse_rate_policy(const char *policy_str)
        char *policy_value_str;
 
        assert(policy_str);
+       lttng_dynamic_pointer_array_init(&tokens, NULL);
 
-       /*
-        * rate policy fields are separated by ':'.
-        */
-       tokens = strutils_split(policy_str, ':', 1);
-       num_token = strutils_array_of_strings_len(tokens);
+       /* Rate policy fields are separated by ':'. */
+       ret = strutils_split(policy_str, ':', 1, &tokens);
+       if (ret == 0) {
+               num_token = lttng_dynamic_pointer_array_get_count(&tokens);
+       }
 
        /*
         * Early sanity check that the number of parameter is exactly 2.
@@ -1316,8 +1330,8 @@ static struct lttng_rate_policy *parse_rate_policy(const char *policy_str)
                goto end;
        }
 
-       policy_type_str = tokens[0];
-       policy_value_str = tokens[1];
+       policy_type_str = lttng_dynamic_pointer_array_get_pointer(&tokens, 0);
+       policy_value_str = lttng_dynamic_pointer_array_get_pointer(&tokens, 1);
 
        /* Parse the type. */
        if (strcmp(policy_type_str, "once-after") == 0) {
@@ -1357,7 +1371,7 @@ static struct lttng_rate_policy *parse_rate_policy(const char *policy_str)
        }
 
 end:
-       strutils_free_null_terminated_array_of_strings(tokens);
+       lttng_dynamic_pointer_array_reset(&tokens);
        return policy;
 }
 
@@ -1491,7 +1505,7 @@ static struct lttng_action *handle_action_simple_session_with_policy(int *argc,
                { OPT_RATE_POLICY, '\0', "rate-policy", true },
                ARGPAR_OPT_DESCR_SENTINEL
        };
-       
+
        state = argpar_state_create(*argc, *argv, rate_policy_opt_descrs);
        if (!state) {
                ERR("Failed to allocate an argpar state.");
@@ -2019,6 +2033,7 @@ int cmd_add_trigger(int argc, const char **argv)
        char *name = NULL;
        int i;
        char *owner_uid = NULL;
+       enum lttng_error_code ret_code;
 
        lttng_dynamic_pointer_array_init(&actions, lttng_actions_destructor);
 
@@ -2176,16 +2191,6 @@ int cmd_add_trigger(int argc, const char **argv)
                goto error;
        }
 
-       if (name) {
-               enum lttng_trigger_status trigger_status =
-                               lttng_trigger_set_name(trigger, name);
-
-               if (trigger_status != LTTNG_TRIGGER_STATUS_OK) {
-                       ERR("Failed to set trigger name.");
-                       goto error;
-               }
-       }
-
        if (owner_uid) {
                enum lttng_trigger_status trigger_status;
                char *end;
@@ -2195,6 +2200,7 @@ int cmd_add_trigger(int argc, const char **argv)
                uid = strtol(owner_uid, &end, 10);
                if (end == owner_uid || *end != '\0' || errno != 0) {
                        ERR("Failed to parse `%s` as a user id.", owner_uid);
+                       goto error;
                }
 
                trigger_status = lttng_trigger_set_owner_uid(trigger, uid);
@@ -2204,13 +2210,20 @@ int cmd_add_trigger(int argc, const char **argv)
                }
        }
 
-       ret = lttng_register_trigger(trigger);
-       if (ret) {
-               ERR("Failed to register trigger: %s.", lttng_strerror(ret));
+       if (name) {
+               ret_code = lttng_register_trigger_with_name(trigger, name);
+       } else {
+               ret_code = lttng_register_trigger_with_automatic_name(trigger);
+       }
+
+       if (ret_code != LTTNG_OK) {
+               ERR("Failed to register trigger: %s.",
+                               lttng_strerror(-ret_code));
                goto error;
        }
 
        MSG("Trigger registered successfully.");
+       ret = 0;
 
        goto end;
 
This page took 0.026637 seconds and 4 git commands to generate.