On Thu, 27 Jun 2019 10:35:16 -0500
Tom Zanussi <zanu...@kernel.org> wrote:

> In the process of adding better error messages for sorting, I realized
> that strsep was being used incorrectly and some of the error paths I
> was expecting to be hit weren't and just fell through to the common
> invalid key error case.

Would you mean this includes a bugfix too?

> 
> It also became obvious that for keyword assignments, it wasn't
> necessary to save the full assignment and reparse it later, and having
> a common empty-assignment check would also make more sense in terms of
> error processing.
> 
> Change the code to fix these problems and simplify it for new error
> message changes in a subsequent patch.
> 
> Signed-off-by: Tom Zanussi <zanu...@kernel.org>

Anyway looks good to me.

Reviewed-by: Masami Hiramatsu <mhira...@kernel.org>

Thanks,

> ---
>  kernel/trace/trace_events_hist.c | 70 
> ++++++++++++++++------------------------
>  1 file changed, 27 insertions(+), 43 deletions(-)
> 
> diff --git a/kernel/trace/trace_events_hist.c 
> b/kernel/trace/trace_events_hist.c
> index ca6b0dff60c5..964d032f51c6 100644
> --- a/kernel/trace/trace_events_hist.c
> +++ b/kernel/trace/trace_events_hist.c
> @@ -1985,12 +1985,6 @@ static int parse_map_size(char *str)
>       unsigned long size, map_bits;
>       int ret;
>  
> -     strsep(&str, "=");
> -     if (!str) {
> -             ret = -EINVAL;
> -             goto out;
> -     }
> -
>       ret = kstrtoul(str, 0, &size);
>       if (ret)
>               goto out;
> @@ -2050,25 +2044,25 @@ static int parse_action(char *str, struct 
> hist_trigger_attrs *attrs)
>  static int parse_assignment(struct trace_array *tr,
>                           char *str, struct hist_trigger_attrs *attrs)
>  {
> -     int ret = 0;
> +     int len, ret = 0;
>  
> -     if ((str_has_prefix(str, "key=")) ||
> -         (str_has_prefix(str, "keys="))) {
> -             attrs->keys_str = kstrdup(str, GFP_KERNEL);
> +     if ((len = str_has_prefix(str, "key=")) ||
> +         (len = str_has_prefix(str, "keys="))) {
> +             attrs->keys_str = kstrdup(str + len, GFP_KERNEL);
>               if (!attrs->keys_str) {
>                       ret = -ENOMEM;
>                       goto out;
>               }
> -     } else if ((str_has_prefix(str, "val=")) ||
> -                (str_has_prefix(str, "vals=")) ||
> -                (str_has_prefix(str, "values="))) {
> -             attrs->vals_str = kstrdup(str, GFP_KERNEL);
> +     } else if ((len = str_has_prefix(str, "val=")) ||
> +                (len = str_has_prefix(str, "vals=")) ||
> +                (len = str_has_prefix(str, "values="))) {
> +             attrs->vals_str = kstrdup(str + len, GFP_KERNEL);
>               if (!attrs->vals_str) {
>                       ret = -ENOMEM;
>                       goto out;
>               }
> -     } else if (str_has_prefix(str, "sort=")) {
> -             attrs->sort_key_str = kstrdup(str, GFP_KERNEL);
> +     } else if ((len = str_has_prefix(str, "sort="))) {
> +             attrs->sort_key_str = kstrdup(str + len, GFP_KERNEL);
>               if (!attrs->sort_key_str) {
>                       ret = -ENOMEM;
>                       goto out;
> @@ -2079,12 +2073,8 @@ static int parse_assignment(struct trace_array *tr,
>                       ret = -ENOMEM;
>                       goto out;
>               }
> -     } else if (str_has_prefix(str, "clock=")) {
> -             strsep(&str, "=");
> -             if (!str) {
> -                     ret = -EINVAL;
> -                     goto out;
> -             }
> +     } else if ((len = str_has_prefix(str, "clock="))) {
> +             str += len;
>  
>               str = strstrip(str);
>               attrs->clock = kstrdup(str, GFP_KERNEL);
> @@ -2092,8 +2082,8 @@ static int parse_assignment(struct trace_array *tr,
>                       ret = -ENOMEM;
>                       goto out;
>               }
> -     } else if (str_has_prefix(str, "size=")) {
> -             int map_bits = parse_map_size(str);
> +     } else if ((len = str_has_prefix(str, "size="))) {
> +             int map_bits = parse_map_size(str + len);
>  
>               if (map_bits < 0) {
>                       ret = map_bits;
> @@ -2133,8 +2123,14 @@ parse_hist_trigger_attrs(struct trace_array *tr, char 
> *trigger_str)
>  
>       while (trigger_str) {
>               char *str = strsep(&trigger_str, ":");
> +             char *rhs;
>  
> -             if (strchr(str, '=')) {
> +             rhs = strchr(str, '=');
> +             if (rhs) {
> +                     if (!strlen(++rhs)) {
> +                             ret = -EINVAL;
> +                             goto free;
> +                     }
>                       ret = parse_assignment(tr, str, attrs);
>                       if (ret)
>                               goto free;
> @@ -4459,10 +4455,6 @@ static int create_val_fields(struct hist_trigger_data 
> *hist_data,
>       if (!fields_str)
>               goto out;
>  
> -     strsep(&fields_str, "=");
> -     if (!fields_str)
> -             goto out;
> -
>       for (i = 0, j = 1; i < TRACING_MAP_VALS_MAX &&
>                    j < TRACING_MAP_VALS_MAX; i++) {
>               field_str = strsep(&fields_str, ",");
> @@ -4557,10 +4549,6 @@ static int create_key_fields(struct hist_trigger_data 
> *hist_data,
>       if (!fields_str)
>               goto out;
>  
> -     strsep(&fields_str, "=");
> -     if (!fields_str)
> -             goto out;
> -
>       for (i = n_vals; i < n_vals + TRACING_MAP_KEYS_MAX; i++) {
>               field_str = strsep(&fields_str, ",");
>               if (!field_str)
> @@ -4718,12 +4706,6 @@ static int create_sort_keys(struct hist_trigger_data 
> *hist_data)
>       if (!fields_str)
>               goto out;
>  
> -     strsep(&fields_str, "=");
> -     if (!fields_str) {
> -             ret = -EINVAL;
> -             goto out;
> -     }
> -
>       for (i = 0; i < TRACING_MAP_SORT_KEYS_MAX; i++) {
>               struct hist_field *hist_field;
>               char *field_str, *field_name;
> @@ -4732,9 +4714,11 @@ static int create_sort_keys(struct hist_trigger_data 
> *hist_data)
>               sort_key = &hist_data->sort_keys[i];
>  
>               field_str = strsep(&fields_str, ",");
> -             if (!field_str) {
> -                     if (i == 0)
> -                             ret = -EINVAL;
> +             if (!field_str)
> +                     break;
> +
> +             if (!*field_str) {
> +                     ret = -EINVAL;
>                       break;
>               }
>  
> @@ -4744,7 +4728,7 @@ static int create_sort_keys(struct hist_trigger_data 
> *hist_data)
>               }
>  
>               field_name = strsep(&field_str, ".");
> -             if (!field_name) {
> +             if (!field_name || !*field_name) {
>                       ret = -EINVAL;
>                       break;
>               }
> -- 
> 2.14.1
> 


-- 
Masami Hiramatsu <mhira...@kernel.org>

Reply via email to