[lttng-dev] [PATCH lttng-tools] Fix: error out on leftover arguments

Jérémie Galarneau jeremie.galarneau at efficios.com
Mon Feb 19 19:51:07 EST 2018


On 14 February 2018 at 11:49, Julien Desfossez <jdesfossez at efficios.com> wrote:
> All the commands currently ignore leftover arguments, this can lead to
> wrong usage of the commands and waste of time debugging. For example,
> this command enables the vpid context on all channels instead of only on
> the "mychan" channel:
> $ lttng add-context -u mychan -t vpid
>
> The correct usage is:
> $ lttng add-context -u -c mychan -t vpid
>
> We now output an error on leftover arguments:
> $ lttng add-context -u bbb -t vpid
> Error: Unknown argument: bbb
> Error: Command error
>
> Some commands accept one leftover argument (create, start, stop,
> destroy), so we check if there are other leftovers:
> $ lttng create mysess allo
> Error: Unknown argument: allo
> Error: Command error
>
> Signed-off-by: Julien Desfossez <jdesfossez at efficios.com>
> ---
>  src/bin/lttng/commands/add_context.c      | 8 ++++++++
>  src/bin/lttng/commands/create.c           | 8 ++++++++
>  src/bin/lttng/commands/destroy.c          | 9 +++++++++
>  src/bin/lttng/commands/disable_channels.c | 8 ++++++++
>  src/bin/lttng/commands/disable_events.c   | 8 ++++++++
>  src/bin/lttng/commands/enable_channels.c  | 9 +++++++++
>  src/bin/lttng/commands/enable_events.c    | 8 ++++++++
>  src/bin/lttng/commands/list.c             | 9 ++++++++-
>  src/bin/lttng/commands/load.c             | 8 ++++++++
>  src/bin/lttng/commands/save.c             | 9 ++++++++-
>  src/bin/lttng/commands/snapshot.c         | 8 ++++++++
>  src/bin/lttng/commands/start.c            | 8 ++++++++
>  src/bin/lttng/commands/stop.c             | 8 ++++++++
>  src/bin/lttng/commands/view.c             | 8 ++++++++
>  14 files changed, 114 insertions(+), 2 deletions(-)
>
> diff --git a/src/bin/lttng/commands/add_context.c b/src/bin/lttng/commands/add_context.c
> index 209a9f4..d9121b0 100644
> --- a/src/bin/lttng/commands/add_context.c
> +++ b/src/bin/lttng/commands/add_context.c
> @@ -898,6 +898,7 @@ int cmd_add_context(int argc, const char **argv)
>         static poptContext pc;
>         struct ctx_type *type, *tmptype;
>         char *session_name = NULL;
> +       const char *leftover = NULL;
>
>         if (argc < 2) {
>                 ret = CMD_ERROR;
> @@ -944,6 +945,13 @@ int cmd_add_context(int argc, const char **argv)
>                 }
>         }
>
> +       leftover = poptGetArg(pc);
> +       if (leftover) {
> +               ERR("Unknown argument: %s", leftover);
> +               ret = CMD_ERROR;
> +               goto end;
> +       }
> +
>         ret = print_missing_or_multiple_domains(opt_kernel + opt_userspace +
>                         opt_jul + opt_log4j);
>         if (ret) {
> diff --git a/src/bin/lttng/commands/create.c b/src/bin/lttng/commands/create.c
> index d075f64..faf9f3e 100644
> --- a/src/bin/lttng/commands/create.c
> +++ b/src/bin/lttng/commands/create.c
> @@ -625,6 +625,7 @@ int cmd_create(int argc, const char **argv)
>  {
>         int opt, ret = CMD_SUCCESS, command_ret = CMD_SUCCESS, success = 1;
>         char *opt_arg = NULL;
> +       const char *leftover = NULL;
>         static poptContext pc;
>
>         pc = poptGetContext(NULL, argc, argv, long_options, 0);
> @@ -719,6 +720,13 @@ int cmd_create(int argc, const char **argv)
>         }
>         opt_session_name = (char*) poptGetArg(pc);
>
> +       leftover = poptGetArg(pc);
> +       if (leftover) {
> +               ERR("Unknown argument: %s", leftover);
> +               ret = CMD_ERROR;
> +               goto end;
> +       }
> +
>         command_ret = create_session();
>         if (command_ret) {
>                 success = 0;
> diff --git a/src/bin/lttng/commands/destroy.c b/src/bin/lttng/commands/destroy.c
> index 02c7139..6878aaa 100644
> --- a/src/bin/lttng/commands/destroy.c
> +++ b/src/bin/lttng/commands/destroy.c
> @@ -174,6 +174,7 @@ int cmd_destroy(int argc, const char **argv)
>         int ret = CMD_SUCCESS , i, command_ret = CMD_SUCCESS, success = 1;
>         static poptContext pc;
>         char *session_name = NULL;
> +       const char *leftover = NULL;
>
>         struct lttng_session *sessions;
>         int count;
> @@ -280,6 +281,14 @@ int cmd_destroy(int argc, const char **argv)
>                 }
>         }
>
> +       leftover = poptGetArg(pc);
> +       if (leftover) {
> +               ERR("Unknown argument: %s", leftover);
> +               ret = CMD_ERROR;
> +               success = 0;
> +               goto mi_closing;
> +       }
> +
>  mi_closing:
>         /* Mi closing */
>         if (lttng_opt_mi) {
> diff --git a/src/bin/lttng/commands/disable_channels.c b/src/bin/lttng/commands/disable_channels.c
> index 775ff89..936884e 100644
> --- a/src/bin/lttng/commands/disable_channels.c
> +++ b/src/bin/lttng/commands/disable_channels.c
> @@ -216,6 +216,7 @@ int cmd_disable_channels(int argc, const char **argv)
>         int opt, ret = CMD_SUCCESS, command_ret = CMD_SUCCESS, success = 1;
>         static poptContext pc;
>         char *session_name = NULL;
> +       const char *leftover = NULL;
>
>         pc = poptGetContext(NULL, argc, argv, long_options, 0);
>         poptReadDefaultConfig(pc, 0);
> @@ -250,6 +251,13 @@ int cmd_disable_channels(int argc, const char **argv)
>                 goto end;
>         }
>
> +       leftover = poptGetArg(pc);
> +       if (leftover) {
> +               ERR("Unknown argument: %s", leftover);
> +               ret = CMD_ERROR;
> +               goto end;
> +       }
> +
>         if (!opt_session_name) {
>                 session_name = get_session_name();
>                 if (session_name == NULL) {
> diff --git a/src/bin/lttng/commands/disable_events.c b/src/bin/lttng/commands/disable_events.c
> index 2696201..290e727 100644
> --- a/src/bin/lttng/commands/disable_events.c
> +++ b/src/bin/lttng/commands/disable_events.c
> @@ -328,6 +328,7 @@ int cmd_disable_events(int argc, const char **argv)
>         int opt, ret = CMD_SUCCESS, command_ret = CMD_SUCCESS, success = 1;
>         static poptContext pc;
>         char *session_name = NULL;
> +       const char *leftover = NULL;
>         int event_type = -1;
>
>         pc = poptGetContext(NULL, argc, argv, long_options, 0);
> @@ -398,6 +399,13 @@ int cmd_disable_events(int argc, const char **argv)
>                 goto end;
>         }
>
> +       leftover = poptGetArg(pc);
> +       if (leftover) {
> +               ERR("Unknown argument: %s", leftover);
> +               ret = CMD_ERROR;
> +               goto end;
> +       }
> +
>         if (!opt_session_name) {
>                 session_name = get_session_name();
>                 if (session_name == NULL) {
> diff --git a/src/bin/lttng/commands/enable_channels.c b/src/bin/lttng/commands/enable_channels.c
> index cb9f44a..9c84d02 100644
> --- a/src/bin/lttng/commands/enable_channels.c
> +++ b/src/bin/lttng/commands/enable_channels.c
> @@ -400,6 +400,7 @@ int cmd_enable_channels(int argc, const char **argv)
>         static poptContext pc;
>         char *session_name = NULL;
>         char *opt_arg = NULL;
> +       const char *leftover = NULL;
>
>         init_channel_config();
>
> @@ -693,6 +694,14 @@ int cmd_enable_channels(int argc, const char **argv)
>                 goto mi_closing;
>         }
>
> +       leftover = poptGetArg(pc);
> +       if (leftover) {
> +               ERR("Unknown argument: %s", leftover);
> +               ret = CMD_ERROR;
> +               success = 0;
> +               goto mi_closing;
> +       }
> +
>         if (!opt_session_name) {
>                 session_name = get_session_name();
>                 if (session_name == NULL) {
> diff --git a/src/bin/lttng/commands/enable_events.c b/src/bin/lttng/commands/enable_events.c
> index 97a36b3..05f20f7 100644
> --- a/src/bin/lttng/commands/enable_events.c
> +++ b/src/bin/lttng/commands/enable_events.c
> @@ -1264,6 +1264,7 @@ 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;
> +       const char *leftover = NULL;
>         int event_type = -1;
>
>         pc = poptGetContext(NULL, argc, argv, long_options, 0);
> @@ -1363,6 +1364,13 @@ int cmd_enable_events(int argc, const char **argv)
>                 goto end;
>         }
>
> +       leftover = poptGetArg(pc);
> +       if (leftover) {
> +               ERR("Unknown argument: %s", leftover);
> +               ret = CMD_ERROR;
> +               goto end;
> +       }
> +
>         if (!opt_session_name) {
>                 session_name = get_session_name();
>                 if (session_name == NULL) {
> diff --git a/src/bin/lttng/commands/list.c b/src/bin/lttng/commands/list.c
> index a166fd2..898c0de 100644
> --- a/src/bin/lttng/commands/list.c
> +++ b/src/bin/lttng/commands/list.c
> @@ -1776,7 +1776,7 @@ end:
>  int cmd_list(int argc, const char **argv)
>  {
>         int opt, ret = CMD_SUCCESS;
> -       const char *session_name;
> +       const char *session_name, *leftover = NULL;
>         static poptContext pc;
>         struct lttng_domain domain;
>         struct lttng_domain *domains = NULL;
> @@ -1837,6 +1837,13 @@ int cmd_list(int argc, const char **argv)
>         session_name = poptGetArg(pc);
>         DBG2("Session name: %s", session_name);
>
> +       leftover = poptGetArg(pc);
> +       if (leftover) {
> +               ERR("Unknown argument: %s", leftover);
> +               ret = CMD_ERROR;
> +               goto end;
> +       }
> +
>         if (opt_kernel) {
>                 domain.type = LTTNG_DOMAIN_KERNEL;
>         } else if (opt_userspace) {
> diff --git a/src/bin/lttng/commands/load.c b/src/bin/lttng/commands/load.c
> index ad61849..07ef121 100644
> --- a/src/bin/lttng/commands/load.c
> +++ b/src/bin/lttng/commands/load.c
> @@ -163,6 +163,7 @@ int cmd_load(int argc, const char **argv)
>         poptContext pc;
>         struct lttng_load_session_attr *session_attr = NULL;
>         char *input_path = NULL;
> +       const char *leftover = NULL;
>
>         pc = poptGetContext(NULL, argc, argv, load_opts, 0);
>         poptReadDefaultConfig(pc, 0);
> @@ -206,6 +207,13 @@ int cmd_load(int argc, const char **argv)
>                 }
>         }
>
> +       leftover = poptGetArg(pc);
> +       if (leftover) {
> +               ERR("Unknown argument: %s", leftover);
> +               ret = CMD_ERROR;
> +               goto end;
> +       }
> +
>         /* Mi check */
>         if (lttng_opt_mi) {
>                 writer = mi_lttng_writer_create(fileno(stdout), lttng_opt_mi);
> diff --git a/src/bin/lttng/commands/save.c b/src/bin/lttng/commands/save.c
> index 4ba9024..924ddcb 100644
> --- a/src/bin/lttng/commands/save.c
> +++ b/src/bin/lttng/commands/save.c
> @@ -127,7 +127,7 @@ int cmd_save(int argc, const char **argv)
>  {
>         int ret = CMD_SUCCESS, command_ret = CMD_SUCCESS, success;
>         int opt;
> -       const char *session_name = NULL;
> +       const char *session_name = NULL, *leftover = NULL;
>         poptContext pc;
>         struct lttng_save_session_attr *attr;
>
> @@ -164,6 +164,13 @@ int cmd_save(int argc, const char **argv)
>                 }
>         }
>
> +       leftover = poptGetArg(pc);
> +       if (leftover) {
> +               ERR("Unknown argument: %s", leftover);
> +               ret = CMD_ERROR;
> +               goto end;
> +       }
> +
>         attr = lttng_save_session_attr_create();
>         if (!attr) {
>                 ret = CMD_FATAL;
> diff --git a/src/bin/lttng/commands/snapshot.c b/src/bin/lttng/commands/snapshot.c
> index d8a6b81..dc51628 100644
> --- a/src/bin/lttng/commands/snapshot.c
> +++ b/src/bin/lttng/commands/snapshot.c
> @@ -510,6 +510,7 @@ int cmd_snapshot(int argc, const char **argv)
>         int opt, ret = CMD_SUCCESS, command_ret = CMD_SUCCESS, success = 1;
>         char *session_name = NULL;
>         static poptContext pc;
> +       const char *leftover = NULL;
>
>         pc = poptGetContext(NULL, argc, argv, snapshot_opts, 0);
>         poptReadDefaultConfig(pc, 0);
> @@ -571,6 +572,13 @@ int cmd_snapshot(int argc, const char **argv)
>                 }
>         }
>
> +       leftover = poptGetArg(pc);
> +       if (leftover) {
> +               ERR("Unknown argument: %s", leftover);
> +               ret = CMD_ERROR;
> +               goto end;
> +       }

This prevents the use of snapshot subcommands such as
lttng snapshot add-output, del-output, and list-output.

Jérémie

> +
>         if (!opt_session_name) {
>                 session_name = get_session_name();
>                 if (session_name == NULL) {
> diff --git a/src/bin/lttng/commands/start.c b/src/bin/lttng/commands/start.c
> index 0287fc7..65b2229 100644
> --- a/src/bin/lttng/commands/start.c
> +++ b/src/bin/lttng/commands/start.c
> @@ -144,6 +144,7 @@ int cmd_start(int argc, const char **argv)
>  {
>         int opt, ret = CMD_SUCCESS, command_ret = CMD_SUCCESS, success = 1;
>         static poptContext pc;
> +       const char *leftover = NULL;
>
>         pc = poptGetContext(NULL, argc, argv, long_options, 0);
>         poptReadDefaultConfig(pc, 0);
> @@ -164,6 +165,13 @@ int cmd_start(int argc, const char **argv)
>
>         opt_session_name = (char*) poptGetArg(pc);
>
> +       leftover = poptGetArg(pc);
> +       if (leftover) {
> +               ERR("Unknown argument: %s", leftover);
> +               ret = CMD_ERROR;
> +               goto end;
> +       }
> +
>         /* Mi check */
>         if (lttng_opt_mi) {
>                 writer = mi_lttng_writer_create(fileno(stdout), lttng_opt_mi);
> diff --git a/src/bin/lttng/commands/stop.c b/src/bin/lttng/commands/stop.c
> index 336d887..9d211d6 100644
> --- a/src/bin/lttng/commands/stop.c
> +++ b/src/bin/lttng/commands/stop.c
> @@ -172,6 +172,7 @@ int cmd_stop(int argc, const char **argv)
>  {
>         int opt, ret = CMD_SUCCESS, command_ret = CMD_SUCCESS, success = 1;
>         static poptContext pc;
> +       const char *leftover = NULL;
>
>         pc = poptGetContext(NULL, argc, argv, long_options, 0);
>         poptReadDefaultConfig(pc, 0);
> @@ -228,6 +229,13 @@ int cmd_stop(int argc, const char **argv)
>
>         opt_session_name = (char*) poptGetArg(pc);
>
> +       leftover = poptGetArg(pc);
> +       if (leftover) {
> +               ERR("Unknown argument: %s", leftover);
> +               ret = CMD_ERROR;
> +               goto end;
> +       }
> +
>         command_ret = stop_tracing();
>         if (command_ret) {
>                 success = 0;
> diff --git a/src/bin/lttng/commands/view.c b/src/bin/lttng/commands/view.c
> index c9a5fdc..faca60d 100644
> --- a/src/bin/lttng/commands/view.c
> +++ b/src/bin/lttng/commands/view.c
> @@ -415,6 +415,7 @@ int cmd_view(int argc, const char **argv)
>  {
>         int opt, ret = CMD_SUCCESS;
>         static poptContext pc;
> +       const char *leftover = NULL;
>
>         pc = poptGetContext(NULL, argc, argv, long_options, 0);
>         poptReadDefaultConfig(pc, 0);
> @@ -439,6 +440,13 @@ int cmd_view(int argc, const char **argv)
>
>         opt_session_name = (char*) poptGetArg(pc);
>
> +       leftover = poptGetArg(pc);
> +       if (leftover) {
> +               ERR("Unknown argument: %s", leftover);
> +               ret = CMD_ERROR;
> +               goto end;
> +       }
> +
>         ret = view_trace();
>
>  end:
> --
> 2.7.4
>



-- 
Jérémie Galarneau
EfficiOS Inc.
http://www.efficios.com


More information about the lttng-dev mailing list