LKML Archive on lore.kernel.org
help / color / mirror / Atom feed
* [PATCH] perf: fix a segfault problem.
@ 2015-03-13  8:41 Wang Nan
  2015-03-13  9:46 ` Namhyung Kim
  0 siblings, 1 reply; 11+ messages in thread
From: Wang Nan @ 2015-03-13  8:41 UTC (permalink / raw)
  To: acme, namhyung, jolsa; +Cc: linux-kernel, mingo, lizefan, pi3orama

Without this patch, perf report cause segfault if pass "" as '-t':

  $ perf report -t ""

    # To display the perf.data header info, please use --header/--header-only options.
    #
    # Samples: 37  of event 'syscalls:sys_enter_write'
    # Event count (approx.): 37
    #
    # Children    SelfCommand   Shared Object         Symbol
    Segmentation fault

This patch avoid the segfault by checking empty string for
'symbol_conf.field_sep'.

Signed-off-by: Wang Nan <wangnan0@huawei.com>
---
 tools/perf/util/sort.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c
index 4593f36..7f563a0 100644
--- a/tools/perf/util/sort.c
+++ b/tools/perf/util/sort.c
@@ -31,7 +31,8 @@ static int repsep_snprintf(char *bf, size_t size, const char *fmt, ...)
 
 	va_start(ap, fmt);
 	n = vsnprintf(bf, size, fmt, ap);
-	if (symbol_conf.field_sep && n > 0) {
+	if (symbol_conf.field_sep && n > 0 &&
+			(symbol_conf.field_sep[0] != '\0')) {
 		char *sep = bf;
 
 		while (1) {
-- 
1.8.3.4


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] perf: fix a segfault problem.
  2015-03-13  8:41 [PATCH] perf: fix a segfault problem Wang Nan
@ 2015-03-13  9:46 ` Namhyung Kim
  2015-03-13 10:07   ` Wang Nan
  0 siblings, 1 reply; 11+ messages in thread
From: Namhyung Kim @ 2015-03-13  9:46 UTC (permalink / raw)
  To: Wang Nan; +Cc: acme, jolsa, linux-kernel, mingo, lizefan, pi3orama

On Fri, Mar 13, 2015 at 08:41:32AM +0000, Wang Nan wrote:
> Without this patch, perf report cause segfault if pass "" as '-t':
> 
>   $ perf report -t ""
> 
>     # To display the perf.data header info, please use --header/--header-only options.
>     #
>     # Samples: 37  of event 'syscalls:sys_enter_write'
>     # Event count (approx.): 37
>     #
>     # Children    SelfCommand   Shared Object         Symbol
>     Segmentation fault
> 
> This patch avoid the segfault by checking empty string for
> 'symbol_conf.field_sep'.

What about resetting it to NULL if empty string was given?

Thanks,
Namhyung


> 
> Signed-off-by: Wang Nan <wangnan0@huawei.com>
> ---
>  tools/perf/util/sort.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c
> index 4593f36..7f563a0 100644
> --- a/tools/perf/util/sort.c
> +++ b/tools/perf/util/sort.c
> @@ -31,7 +31,8 @@ static int repsep_snprintf(char *bf, size_t size, const char *fmt, ...)
>  
>  	va_start(ap, fmt);
>  	n = vsnprintf(bf, size, fmt, ap);
> -	if (symbol_conf.field_sep && n > 0) {
> +	if (symbol_conf.field_sep && n > 0 &&
> +			(symbol_conf.field_sep[0] != '\0')) {
>  		char *sep = bf;
>  
>  		while (1) {
> -- 
> 1.8.3.4
> 

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] perf: fix a segfault problem.
  2015-03-13  9:46 ` Namhyung Kim
@ 2015-03-13 10:07   ` Wang Nan
  2015-03-13 11:20     ` Namhyung Kim
  0 siblings, 1 reply; 11+ messages in thread
From: Wang Nan @ 2015-03-13 10:07 UTC (permalink / raw)
  To: Namhyung Kim; +Cc: acme, jolsa, linux-kernel, mingo, lizefan, pi3orama

On 2015/3/13 17:46, Namhyung Kim wrote:
> On Fri, Mar 13, 2015 at 08:41:32AM +0000, Wang Nan wrote:
>> Without this patch, perf report cause segfault if pass "" as '-t':
>>
>>   $ perf report -t ""
>>
>>     # To display the perf.data header info, please use --header/--header-only options.
>>     #
>>     # Samples: 37  of event 'syscalls:sys_enter_write'
>>     # Event count (approx.): 37
>>     #
>>     # Children    SelfCommand   Shared Object         Symbol
>>     Segmentation fault
>>
>> This patch avoid the segfault by checking empty string for
>> 'symbol_conf.field_sep'.
> 
> What about resetting it to NULL if empty string was given?
> 

In fact I'm not very clear why we need such 'symbol_conf.field_sep', so I'm
not sure whether '-t ""' is totally meanless or not.

-t option replaces a group of character with '.' and appends them after a field.
With -t 'abc' I get something like:

 #
 # OverheadabcCommand   abcShared Object    abcSymbol
  100.00%abcb.beltr.ceabc[kernel.k.llsyms]abc[k] 0xffffffff810118f0
  ...

Hard to read...

I read docs and your commit messages, but still not understand the option. Could you
please explain the goal and usage of that option again?

Thank you.

> Thanks,
> Namhyung
> 
> 
>>
>> Signed-off-by: Wang Nan <wangnan0@huawei.com>
>> ---
>>  tools/perf/util/sort.c | 3 ++-
>>  1 file changed, 2 insertions(+), 1 deletion(-)
>>
>> diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c
>> index 4593f36..7f563a0 100644
>> --- a/tools/perf/util/sort.c
>> +++ b/tools/perf/util/sort.c
>> @@ -31,7 +31,8 @@ static int repsep_snprintf(char *bf, size_t size, const char *fmt, ...)
>>  
>>  	va_start(ap, fmt);
>>  	n = vsnprintf(bf, size, fmt, ap);
>> -	if (symbol_conf.field_sep && n > 0) {
>> +	if (symbol_conf.field_sep && n > 0 &&
>> +			(symbol_conf.field_sep[0] != '\0')) {
>>  		char *sep = bf;
>>  
>>  		while (1) {
>> -- 
>> 1.8.3.4
>>



^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] perf: fix a segfault problem.
  2015-03-13 10:07   ` Wang Nan
@ 2015-03-13 11:20     ` Namhyung Kim
  2015-03-13 12:51       ` [PATCH] perf: report: don't allow empty argument for '-t' Wang Nan
  0 siblings, 1 reply; 11+ messages in thread
From: Namhyung Kim @ 2015-03-13 11:20 UTC (permalink / raw)
  To: Wang Nan; +Cc: acme, jolsa, linux-kernel, mingo, lizefan, pi3orama

On Fri, Mar 13, 2015 at 06:07:34PM +0800, Wang Nan wrote:
> On 2015/3/13 17:46, Namhyung Kim wrote:
> > On Fri, Mar 13, 2015 at 08:41:32AM +0000, Wang Nan wrote:
> >> Without this patch, perf report cause segfault if pass "" as '-t':
> >>
> >>   $ perf report -t ""
> >>
> >>     # To display the perf.data header info, please use --header/--header-only options.
> >>     #
> >>     # Samples: 37  of event 'syscalls:sys_enter_write'
> >>     # Event count (approx.): 37
> >>     #
> >>     # Children    SelfCommand   Shared Object         Symbol
> >>     Segmentation fault
> >>
> >> This patch avoid the segfault by checking empty string for
> >> 'symbol_conf.field_sep'.
> > 
> > What about resetting it to NULL if empty string was given?
> > 
> 
> In fact I'm not very clear why we need such 'symbol_conf.field_sep', so I'm
> not sure whether '-t ""' is totally meanless or not.
> 
> -t option replaces a group of character with '.' and appends them after a field.
> With -t 'abc' I get something like:
> 
>  #
>  # OverheadabcCommand   abcShared Object    abcSymbol
>   100.00%abcb.beltr.ceabc[kernel.k.llsyms]abc[k] 0xffffffff810118f0
>   ...
> 
> Hard to read...
> 
> I read docs and your commit messages, but still not understand the option. Could you
> please explain the goal and usage of that option again?

Well, I'm not the person who wrote the doc and introduced this
option. ;-)

Anyway AFAIK it's to generate a CSV file so usual value would be ','.
To reduce possible confusion due to the separation character in the
original output, it replaces the character during the generation.

Thanks,
Namhyung

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH] perf: report: don't allow empty argument for '-t'.
  2015-03-13 11:20     ` Namhyung Kim
@ 2015-03-13 12:51       ` Wang Nan
  2015-03-16  2:20         ` Namhyung Kim
                           ` (2 more replies)
  0 siblings, 3 replies; 11+ messages in thread
From: Wang Nan @ 2015-03-13 12:51 UTC (permalink / raw)
  To: namhyung; +Cc: acme, jolsa, linux-kernel, mingo, lizefan, pi3orama

Without this patch, perf report cause segfault if pass "" as '-t':

  $ perf report -t ""

   # To display the perf.data header info, please use --header/--header-only options.
   #
   # Samples: 37  of event 'syscalls:sys_enter_write'
   # Event count (approx.): 37
   #
   # Children    SelfCommand   Shared Object         Symbol
   Segmentation fault

Since -t is used to add field-separator for generate table, -t "" is
actually meanless. This patch defines a new OPT_STRING_NOEMPTY() option
generator to ensure user never pass empty string to that option.

Signed-off-by: Wang Nan <wangnan0@huawei.com>
---
 tools/perf/builtin-report.c     |  2 +-
 tools/perf/util/parse-options.c | 21 +++++++++++++++++++--
 tools/perf/util/parse-options.h |  2 ++
 3 files changed, 22 insertions(+), 3 deletions(-)

diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
index fb35034..2652e52 100644
--- a/tools/perf/builtin-report.c
+++ b/tools/perf/builtin-report.c
@@ -676,7 +676,7 @@ int cmd_report(int argc, const char **argv, const char *prefix __maybe_unused)
 	OPT_STRING('w', "column-widths", &symbol_conf.col_width_list_str,
 		   "width[,width...]",
 		   "don't try to adjust column width, use these fixed values"),
-	OPT_STRING('t', "field-separator", &symbol_conf.field_sep, "separator",
+	OPT_STRING_NOEMPTY('t', "field-separator", &symbol_conf.field_sep, "separator",
 		   "separator for columns, no spaces will be added between "
 		   "columns '.' is reserved."),
 	OPT_BOOLEAN('U', "hide-unresolved", &report.hide_unresolved,
diff --git a/tools/perf/util/parse-options.c b/tools/perf/util/parse-options.c
index 1457d66..01626be 100644
--- a/tools/perf/util/parse-options.c
+++ b/tools/perf/util/parse-options.c
@@ -37,6 +37,7 @@ static int get_value(struct parse_opt_ctx_t *p,
 {
 	const char *s, *arg = NULL;
 	const int unset = flags & OPT_UNSET;
+	int err;
 
 	if (unset && p->opt)
 		return opterror(opt, "takes no value", flags);
@@ -114,13 +115,29 @@ static int get_value(struct parse_opt_ctx_t *p,
 		return 0;
 
 	case OPTION_STRING:
+		err = 0;
 		if (unset)
 			*(const char **)opt->value = NULL;
 		else if (opt->flags & PARSE_OPT_OPTARG && !p->opt)
 			*(const char **)opt->value = (const char *)opt->defval;
 		else
-			return get_arg(p, opt, flags, (const char **)opt->value);
-		return 0;
+			err = get_arg(p, opt, flags, (const char **)opt->value);
+
+		/* PARSE_OPT_NOEMPTY: Allow NULL but disallow empty string. */
+		if (opt->flags & PARSE_OPT_NOEMPTY) {
+			const char *val = *(const char **)opt->value;
+
+			if (!val)
+				return err;
+
+			/* Similar to unset if we are given an empty string. */
+			if (val[0] == '\0') {
+				*(const char **)opt->value = NULL;
+				return 0;
+			}
+		}
+
+		return err;
 
 	case OPTION_CALLBACK:
 		if (unset)
diff --git a/tools/perf/util/parse-options.h b/tools/perf/util/parse-options.h
index 97b153f..59561fd 100644
--- a/tools/perf/util/parse-options.h
+++ b/tools/perf/util/parse-options.h
@@ -40,6 +40,7 @@ enum parse_opt_option_flags {
 	PARSE_OPT_LASTARG_DEFAULT = 16,
 	PARSE_OPT_DISABLED = 32,
 	PARSE_OPT_EXCLUSIVE = 64,
+	PARSE_OPT_NOEMPTY  = 128,
 };
 
 struct option;
@@ -122,6 +123,7 @@ struct option {
 #define OPT_LONG(s, l, v, h)        { .type = OPTION_LONG, .short_name = (s), .long_name = (l), .value = check_vtype(v, long *), .help = (h) }
 #define OPT_U64(s, l, v, h)         { .type = OPTION_U64, .short_name = (s), .long_name = (l), .value = check_vtype(v, u64 *), .help = (h) }
 #define OPT_STRING(s, l, v, a, h)   { .type = OPTION_STRING,  .short_name = (s), .long_name = (l), .value = check_vtype(v, const char **), (a), .help = (h) }
+#define OPT_STRING_NOEMPTY(s, l, v, a, h)   { .type = OPTION_STRING,  .short_name = (s), .long_name = (l), .value = check_vtype(v, const char **), (a), .help = (h), .flags = PARSE_OPT_NOEMPTY}
 #define OPT_DATE(s, l, v, h) \
 	{ .type = OPTION_CALLBACK, .short_name = (s), .long_name = (l), .value = (v), .argh = "time", .help = (h), .callback = parse_opt_approxidate_cb }
 #define OPT_CALLBACK(s, l, v, a, h, f) \
-- 
1.8.3.4


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] perf: report: don't allow empty argument for '-t'.
  2015-03-13 12:51       ` [PATCH] perf: report: don't allow empty argument for '-t' Wang Nan
@ 2015-03-16  2:20         ` Namhyung Kim
  2015-03-19  6:41         ` Wang Nan
  2015-03-22 10:13         ` [tip:perf/core] perf report: Don't " tip-bot for Wang Nan
  2 siblings, 0 replies; 11+ messages in thread
From: Namhyung Kim @ 2015-03-16  2:20 UTC (permalink / raw)
  To: Wang Nan; +Cc: acme, jolsa, linux-kernel, mingo, lizefan, pi3orama

On Fri, Mar 13, 2015 at 12:51:54PM +0000, Wang Nan wrote:
> Without this patch, perf report cause segfault if pass "" as '-t':
> 
>   $ perf report -t ""
> 
>    # To display the perf.data header info, please use --header/--header-only options.
>    #
>    # Samples: 37  of event 'syscalls:sys_enter_write'
>    # Event count (approx.): 37
>    #
>    # Children    SelfCommand   Shared Object         Symbol
>    Segmentation fault
> 
> Since -t is used to add field-separator for generate table, -t "" is
> actually meanless. This patch defines a new OPT_STRING_NOEMPTY() option
> generator to ensure user never pass empty string to that option.
> 
> Signed-off-by: Wang Nan <wangnan0@huawei.com>
> ---
>  tools/perf/builtin-report.c     |  2 +-

I think perf 'diff' and 'mem' commands also have same problem..

Thanks,
Namhyung


>  tools/perf/util/parse-options.c | 21 +++++++++++++++++++--
>  tools/perf/util/parse-options.h |  2 ++
>  3 files changed, 22 insertions(+), 3 deletions(-)
> 
> diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
> index fb35034..2652e52 100644
> --- a/tools/perf/builtin-report.c
> +++ b/tools/perf/builtin-report.c
> @@ -676,7 +676,7 @@ int cmd_report(int argc, const char **argv, const char *prefix __maybe_unused)
>  	OPT_STRING('w', "column-widths", &symbol_conf.col_width_list_str,
>  		   "width[,width...]",
>  		   "don't try to adjust column width, use these fixed values"),
> -	OPT_STRING('t', "field-separator", &symbol_conf.field_sep, "separator",
> +	OPT_STRING_NOEMPTY('t', "field-separator", &symbol_conf.field_sep, "separator",
>  		   "separator for columns, no spaces will be added between "
>  		   "columns '.' is reserved."),
>  	OPT_BOOLEAN('U', "hide-unresolved", &report.hide_unresolved,
> diff --git a/tools/perf/util/parse-options.c b/tools/perf/util/parse-options.c
> index 1457d66..01626be 100644
> --- a/tools/perf/util/parse-options.c
> +++ b/tools/perf/util/parse-options.c
> @@ -37,6 +37,7 @@ static int get_value(struct parse_opt_ctx_t *p,
>  {
>  	const char *s, *arg = NULL;
>  	const int unset = flags & OPT_UNSET;
> +	int err;
>  
>  	if (unset && p->opt)
>  		return opterror(opt, "takes no value", flags);
> @@ -114,13 +115,29 @@ static int get_value(struct parse_opt_ctx_t *p,
>  		return 0;
>  
>  	case OPTION_STRING:
> +		err = 0;
>  		if (unset)
>  			*(const char **)opt->value = NULL;
>  		else if (opt->flags & PARSE_OPT_OPTARG && !p->opt)
>  			*(const char **)opt->value = (const char *)opt->defval;
>  		else
> -			return get_arg(p, opt, flags, (const char **)opt->value);
> -		return 0;
> +			err = get_arg(p, opt, flags, (const char **)opt->value);
> +
> +		/* PARSE_OPT_NOEMPTY: Allow NULL but disallow empty string. */
> +		if (opt->flags & PARSE_OPT_NOEMPTY) {
> +			const char *val = *(const char **)opt->value;
> +
> +			if (!val)
> +				return err;
> +
> +			/* Similar to unset if we are given an empty string. */
> +			if (val[0] == '\0') {
> +				*(const char **)opt->value = NULL;
> +				return 0;
> +			}
> +		}
> +
> +		return err;
>  
>  	case OPTION_CALLBACK:
>  		if (unset)
> diff --git a/tools/perf/util/parse-options.h b/tools/perf/util/parse-options.h
> index 97b153f..59561fd 100644
> --- a/tools/perf/util/parse-options.h
> +++ b/tools/perf/util/parse-options.h
> @@ -40,6 +40,7 @@ enum parse_opt_option_flags {
>  	PARSE_OPT_LASTARG_DEFAULT = 16,
>  	PARSE_OPT_DISABLED = 32,
>  	PARSE_OPT_EXCLUSIVE = 64,
> +	PARSE_OPT_NOEMPTY  = 128,
>  };
>  
>  struct option;
> @@ -122,6 +123,7 @@ struct option {
>  #define OPT_LONG(s, l, v, h)        { .type = OPTION_LONG, .short_name = (s), .long_name = (l), .value = check_vtype(v, long *), .help = (h) }
>  #define OPT_U64(s, l, v, h)         { .type = OPTION_U64, .short_name = (s), .long_name = (l), .value = check_vtype(v, u64 *), .help = (h) }
>  #define OPT_STRING(s, l, v, a, h)   { .type = OPTION_STRING,  .short_name = (s), .long_name = (l), .value = check_vtype(v, const char **), (a), .help = (h) }
> +#define OPT_STRING_NOEMPTY(s, l, v, a, h)   { .type = OPTION_STRING,  .short_name = (s), .long_name = (l), .value = check_vtype(v, const char **), (a), .help = (h), .flags = PARSE_OPT_NOEMPTY}
>  #define OPT_DATE(s, l, v, h) \
>  	{ .type = OPTION_CALLBACK, .short_name = (s), .long_name = (l), .value = (v), .argh = "time", .help = (h), .callback = parse_opt_approxidate_cb }
>  #define OPT_CALLBACK(s, l, v, a, h, f) \
> -- 
> 1.8.3.4
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] perf: report: don't allow empty argument for '-t'.
  2015-03-13 12:51       ` [PATCH] perf: report: don't allow empty argument for '-t' Wang Nan
  2015-03-16  2:20         ` Namhyung Kim
@ 2015-03-19  6:41         ` Wang Nan
  2015-03-19  7:26           ` Namhyung Kim
  2015-03-22 10:13         ` [tip:perf/core] perf report: Don't " tip-bot for Wang Nan
  2 siblings, 1 reply; 11+ messages in thread
From: Wang Nan @ 2015-03-19  6:41 UTC (permalink / raw)
  To: namhyung; +Cc: acme, jolsa, linux-kernel, mingo, lizefan, pi3orama

Hi Namhyung Kim,

Do you have any comment on it?

Thank you.

On 2015/3/13 20:51, Wang Nan wrote:
> Without this patch, perf report cause segfault if pass "" as '-t':
> 
>   $ perf report -t ""
> 
>    # To display the perf.data header info, please use --header/--header-only options.
>    #
>    # Samples: 37  of event 'syscalls:sys_enter_write'
>    # Event count (approx.): 37
>    #
>    # Children    SelfCommand   Shared Object         Symbol
>    Segmentation fault
> 
> Since -t is used to add field-separator for generate table, -t "" is
> actually meanless. This patch defines a new OPT_STRING_NOEMPTY() option
> generator to ensure user never pass empty string to that option.
> 
> Signed-off-by: Wang Nan <wangnan0@huawei.com>
> ---
>  tools/perf/builtin-report.c     |  2 +-
>  tools/perf/util/parse-options.c | 21 +++++++++++++++++++--
>  tools/perf/util/parse-options.h |  2 ++
>  3 files changed, 22 insertions(+), 3 deletions(-)
> 
> diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
> index fb35034..2652e52 100644
> --- a/tools/perf/builtin-report.c
> +++ b/tools/perf/builtin-report.c
> @@ -676,7 +676,7 @@ int cmd_report(int argc, const char **argv, const char *prefix __maybe_unused)
>  	OPT_STRING('w', "column-widths", &symbol_conf.col_width_list_str,
>  		   "width[,width...]",
>  		   "don't try to adjust column width, use these fixed values"),
> -	OPT_STRING('t', "field-separator", &symbol_conf.field_sep, "separator",
> +	OPT_STRING_NOEMPTY('t', "field-separator", &symbol_conf.field_sep, "separator",
>  		   "separator for columns, no spaces will be added between "
>  		   "columns '.' is reserved."),
>  	OPT_BOOLEAN('U', "hide-unresolved", &report.hide_unresolved,
> diff --git a/tools/perf/util/parse-options.c b/tools/perf/util/parse-options.c
> index 1457d66..01626be 100644
> --- a/tools/perf/util/parse-options.c
> +++ b/tools/perf/util/parse-options.c
> @@ -37,6 +37,7 @@ static int get_value(struct parse_opt_ctx_t *p,
>  {
>  	const char *s, *arg = NULL;
>  	const int unset = flags & OPT_UNSET;
> +	int err;
>  
>  	if (unset && p->opt)
>  		return opterror(opt, "takes no value", flags);
> @@ -114,13 +115,29 @@ static int get_value(struct parse_opt_ctx_t *p,
>  		return 0;
>  
>  	case OPTION_STRING:
> +		err = 0;
>  		if (unset)
>  			*(const char **)opt->value = NULL;
>  		else if (opt->flags & PARSE_OPT_OPTARG && !p->opt)
>  			*(const char **)opt->value = (const char *)opt->defval;
>  		else
> -			return get_arg(p, opt, flags, (const char **)opt->value);
> -		return 0;
> +			err = get_arg(p, opt, flags, (const char **)opt->value);
> +
> +		/* PARSE_OPT_NOEMPTY: Allow NULL but disallow empty string. */
> +		if (opt->flags & PARSE_OPT_NOEMPTY) {
> +			const char *val = *(const char **)opt->value;
> +
> +			if (!val)
> +				return err;
> +
> +			/* Similar to unset if we are given an empty string. */
> +			if (val[0] == '\0') {
> +				*(const char **)opt->value = NULL;
> +				return 0;
> +			}
> +		}
> +
> +		return err;
>  
>  	case OPTION_CALLBACK:
>  		if (unset)
> diff --git a/tools/perf/util/parse-options.h b/tools/perf/util/parse-options.h
> index 97b153f..59561fd 100644
> --- a/tools/perf/util/parse-options.h
> +++ b/tools/perf/util/parse-options.h
> @@ -40,6 +40,7 @@ enum parse_opt_option_flags {
>  	PARSE_OPT_LASTARG_DEFAULT = 16,
>  	PARSE_OPT_DISABLED = 32,
>  	PARSE_OPT_EXCLUSIVE = 64,
> +	PARSE_OPT_NOEMPTY  = 128,
>  };
>  
>  struct option;
> @@ -122,6 +123,7 @@ struct option {
>  #define OPT_LONG(s, l, v, h)        { .type = OPTION_LONG, .short_name = (s), .long_name = (l), .value = check_vtype(v, long *), .help = (h) }
>  #define OPT_U64(s, l, v, h)         { .type = OPTION_U64, .short_name = (s), .long_name = (l), .value = check_vtype(v, u64 *), .help = (h) }
>  #define OPT_STRING(s, l, v, a, h)   { .type = OPTION_STRING,  .short_name = (s), .long_name = (l), .value = check_vtype(v, const char **), (a), .help = (h) }
> +#define OPT_STRING_NOEMPTY(s, l, v, a, h)   { .type = OPTION_STRING,  .short_name = (s), .long_name = (l), .value = check_vtype(v, const char **), (a), .help = (h), .flags = PARSE_OPT_NOEMPTY}
>  #define OPT_DATE(s, l, v, h) \
>  	{ .type = OPTION_CALLBACK, .short_name = (s), .long_name = (l), .value = (v), .argh = "time", .help = (h), .callback = parse_opt_approxidate_cb }
>  #define OPT_CALLBACK(s, l, v, a, h, f) \
> 



^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] perf: report: don't allow empty argument for '-t'.
  2015-03-19  6:41         ` Wang Nan
@ 2015-03-19  7:26           ` Namhyung Kim
  2015-03-19 14:00             ` Arnaldo Carvalho de Melo
  0 siblings, 1 reply; 11+ messages in thread
From: Namhyung Kim @ 2015-03-19  7:26 UTC (permalink / raw)
  To: Wang Nan; +Cc: acme, jolsa, linux-kernel, mingo, lizefan, pi3orama

On Thu, Mar 19, 2015 at 02:41:42PM +0800, Wang Nan wrote:
> Hi Namhyung Kim,

Hello,

> 
> Do you have any comment on it?

As I said in previous reply, I think perf 'diff' and 'mem' have same
problem.  So how about fix them altogether?

Thanks,
Namhyung


> 
> Thank you.
> 
> On 2015/3/13 20:51, Wang Nan wrote:
> > Without this patch, perf report cause segfault if pass "" as '-t':
> > 
> >   $ perf report -t ""
> > 
> >    # To display the perf.data header info, please use --header/--header-only options.
> >    #
> >    # Samples: 37  of event 'syscalls:sys_enter_write'
> >    # Event count (approx.): 37
> >    #
> >    # Children    SelfCommand   Shared Object         Symbol
> >    Segmentation fault
> > 
> > Since -t is used to add field-separator for generate table, -t "" is
> > actually meanless. This patch defines a new OPT_STRING_NOEMPTY() option
> > generator to ensure user never pass empty string to that option.
> > 
> > Signed-off-by: Wang Nan <wangnan0@huawei.com>
> > ---
> >  tools/perf/builtin-report.c     |  2 +-
> >  tools/perf/util/parse-options.c | 21 +++++++++++++++++++--
> >  tools/perf/util/parse-options.h |  2 ++
> >  3 files changed, 22 insertions(+), 3 deletions(-)
> > 
> > diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
> > index fb35034..2652e52 100644
> > --- a/tools/perf/builtin-report.c
> > +++ b/tools/perf/builtin-report.c
> > @@ -676,7 +676,7 @@ int cmd_report(int argc, const char **argv, const char *prefix __maybe_unused)
> >  	OPT_STRING('w', "column-widths", &symbol_conf.col_width_list_str,
> >  		   "width[,width...]",
> >  		   "don't try to adjust column width, use these fixed values"),
> > -	OPT_STRING('t', "field-separator", &symbol_conf.field_sep, "separator",
> > +	OPT_STRING_NOEMPTY('t', "field-separator", &symbol_conf.field_sep, "separator",
> >  		   "separator for columns, no spaces will be added between "
> >  		   "columns '.' is reserved."),
> >  	OPT_BOOLEAN('U', "hide-unresolved", &report.hide_unresolved,
> > diff --git a/tools/perf/util/parse-options.c b/tools/perf/util/parse-options.c
> > index 1457d66..01626be 100644
> > --- a/tools/perf/util/parse-options.c
> > +++ b/tools/perf/util/parse-options.c
> > @@ -37,6 +37,7 @@ static int get_value(struct parse_opt_ctx_t *p,
> >  {
> >  	const char *s, *arg = NULL;
> >  	const int unset = flags & OPT_UNSET;
> > +	int err;
> >  
> >  	if (unset && p->opt)
> >  		return opterror(opt, "takes no value", flags);
> > @@ -114,13 +115,29 @@ static int get_value(struct parse_opt_ctx_t *p,
> >  		return 0;
> >  
> >  	case OPTION_STRING:
> > +		err = 0;
> >  		if (unset)
> >  			*(const char **)opt->value = NULL;
> >  		else if (opt->flags & PARSE_OPT_OPTARG && !p->opt)
> >  			*(const char **)opt->value = (const char *)opt->defval;
> >  		else
> > -			return get_arg(p, opt, flags, (const char **)opt->value);
> > -		return 0;
> > +			err = get_arg(p, opt, flags, (const char **)opt->value);
> > +
> > +		/* PARSE_OPT_NOEMPTY: Allow NULL but disallow empty string. */
> > +		if (opt->flags & PARSE_OPT_NOEMPTY) {
> > +			const char *val = *(const char **)opt->value;
> > +
> > +			if (!val)
> > +				return err;
> > +
> > +			/* Similar to unset if we are given an empty string. */
> > +			if (val[0] == '\0') {
> > +				*(const char **)opt->value = NULL;
> > +				return 0;
> > +			}
> > +		}
> > +
> > +		return err;
> >  
> >  	case OPTION_CALLBACK:
> >  		if (unset)
> > diff --git a/tools/perf/util/parse-options.h b/tools/perf/util/parse-options.h
> > index 97b153f..59561fd 100644
> > --- a/tools/perf/util/parse-options.h
> > +++ b/tools/perf/util/parse-options.h
> > @@ -40,6 +40,7 @@ enum parse_opt_option_flags {
> >  	PARSE_OPT_LASTARG_DEFAULT = 16,
> >  	PARSE_OPT_DISABLED = 32,
> >  	PARSE_OPT_EXCLUSIVE = 64,
> > +	PARSE_OPT_NOEMPTY  = 128,
> >  };
> >  
> >  struct option;
> > @@ -122,6 +123,7 @@ struct option {
> >  #define OPT_LONG(s, l, v, h)        { .type = OPTION_LONG, .short_name = (s), .long_name = (l), .value = check_vtype(v, long *), .help = (h) }
> >  #define OPT_U64(s, l, v, h)         { .type = OPTION_U64, .short_name = (s), .long_name = (l), .value = check_vtype(v, u64 *), .help = (h) }
> >  #define OPT_STRING(s, l, v, a, h)   { .type = OPTION_STRING,  .short_name = (s), .long_name = (l), .value = check_vtype(v, const char **), (a), .help = (h) }
> > +#define OPT_STRING_NOEMPTY(s, l, v, a, h)   { .type = OPTION_STRING,  .short_name = (s), .long_name = (l), .value = check_vtype(v, const char **), (a), .help = (h), .flags = PARSE_OPT_NOEMPTY}
> >  #define OPT_DATE(s, l, v, h) \
> >  	{ .type = OPTION_CALLBACK, .short_name = (s), .long_name = (l), .value = (v), .argh = "time", .help = (h), .callback = parse_opt_approxidate_cb }
> >  #define OPT_CALLBACK(s, l, v, a, h, f) \
> > 
> 
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] perf: report: don't allow empty argument for '-t'.
  2015-03-19  7:26           ` Namhyung Kim
@ 2015-03-19 14:00             ` Arnaldo Carvalho de Melo
  2015-03-19 14:19               ` Namhyung Kim
  0 siblings, 1 reply; 11+ messages in thread
From: Arnaldo Carvalho de Melo @ 2015-03-19 14:00 UTC (permalink / raw)
  To: Namhyung Kim; +Cc: Wang Nan, jolsa, linux-kernel, mingo, lizefan, pi3orama

Em Thu, Mar 19, 2015 at 04:26:24PM +0900, Namhyung Kim escreveu:
> On Thu, Mar 19, 2015 at 02:41:42PM +0800, Wang Nan wrote:
> > Hi Namhyung Kim,
> 
> Hello,
> 
> > 
> > Do you have any comment on it?
> 
> As I said in previous reply, I think perf 'diff' and 'mem' have same
> problem.  So how about fix them altogether?

So you are ok with this change, right? Can I cound that as an ack? I.e.
he could send the other fixes as separate patch(es).

- Arnaldo

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] perf: report: don't allow empty argument for '-t'.
  2015-03-19 14:00             ` Arnaldo Carvalho de Melo
@ 2015-03-19 14:19               ` Namhyung Kim
  0 siblings, 0 replies; 11+ messages in thread
From: Namhyung Kim @ 2015-03-19 14:19 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: Wang Nan, Jiri Olsa, linux-kernel, Ingo Molnar, lizefan, pi3orama

Hi Arnaldo,

On Thu, Mar 19, 2015 at 11:00 PM, Arnaldo Carvalho de Melo
<acme@kernel.org> wrote:
> Em Thu, Mar 19, 2015 at 04:26:24PM +0900, Namhyung Kim escreveu:
>> On Thu, Mar 19, 2015 at 02:41:42PM +0800, Wang Nan wrote:
>> > Hi Namhyung Kim,
>>
>> Hello,
>>
>> >
>> > Do you have any comment on it?
>>
>> As I said in previous reply, I think perf 'diff' and 'mem' have same
>> problem.  So how about fix them altogether?
>
> So you are ok with this change, right? Can I cound that as an ack? I.e.
> he could send the other fixes as separate patch(es).

I'm okay with it

Acked-by: Namhyung Kim <namhyung@kernel.org>

Thanks,
Namhyung

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [tip:perf/core] perf report: Don't allow empty argument for '-t'.
  2015-03-13 12:51       ` [PATCH] perf: report: don't allow empty argument for '-t' Wang Nan
  2015-03-16  2:20         ` Namhyung Kim
  2015-03-19  6:41         ` Wang Nan
@ 2015-03-22 10:13         ` tip-bot for Wang Nan
  2 siblings, 0 replies; 11+ messages in thread
From: tip-bot for Wang Nan @ 2015-03-22 10:13 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: tglx, linux-kernel, wangnan0, acme, lizefan, mingo, hpa, jolsa, namhyung

Commit-ID:  0c8c20779c5d56b93b8cb4cd30ba129a927ab437
Gitweb:     http://git.kernel.org/tip/0c8c20779c5d56b93b8cb4cd30ba129a927ab437
Author:     Wang Nan <wangnan0@huawei.com>
AuthorDate: Fri, 13 Mar 2015 12:51:54 +0000
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Thu, 19 Mar 2015 13:53:28 -0300

perf report: Don't allow empty argument for '-t'.

Without this patch, perf report cause segfault if pass "" as '-t':

  $ perf report -t ""

   # To display the perf.data header info, please use --header/--header-only options.
   #
   # Samples: 37  of event 'syscalls:sys_enter_write'
   # Event count (approx.): 37
   #
   # Children    SelfCommand   Shared Object         Symbol
   Segmentation fault

Since -t is used to add field-separator for generate table, -t "" is
actually meanless. This patch defines a new OPT_STRING_NOEMPTY() option
generator to ensure user never pass empty string to that option.

Signed-off-by: Wang Nan <wangnan0@huawei.com>
Acked-by: Namhyung Kim <namhyung@kernel.org>
Cc: pi3orama@163.com
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Zefan Li <lizefan@huawei.com>
Link: http://lkml.kernel.org/r/1426251114-198991-1-git-send-email-wangnan0@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/builtin-report.c     |  2 +-
 tools/perf/util/parse-options.c | 21 +++++++++++++++++++--
 tools/perf/util/parse-options.h |  2 ++
 3 files changed, 22 insertions(+), 3 deletions(-)

diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
index 52f74e1..0ae4826 100644
--- a/tools/perf/builtin-report.c
+++ b/tools/perf/builtin-report.c
@@ -676,7 +676,7 @@ int cmd_report(int argc, const char **argv, const char *prefix __maybe_unused)
 	OPT_STRING('w', "column-widths", &symbol_conf.col_width_list_str,
 		   "width[,width...]",
 		   "don't try to adjust column width, use these fixed values"),
-	OPT_STRING('t', "field-separator", &symbol_conf.field_sep, "separator",
+	OPT_STRING_NOEMPTY('t', "field-separator", &symbol_conf.field_sep, "separator",
 		   "separator for columns, no spaces will be added between "
 		   "columns '.' is reserved."),
 	OPT_BOOLEAN('U', "hide-unresolved", &report.hide_unresolved,
diff --git a/tools/perf/util/parse-options.c b/tools/perf/util/parse-options.c
index 1457d66..01626be 100644
--- a/tools/perf/util/parse-options.c
+++ b/tools/perf/util/parse-options.c
@@ -37,6 +37,7 @@ static int get_value(struct parse_opt_ctx_t *p,
 {
 	const char *s, *arg = NULL;
 	const int unset = flags & OPT_UNSET;
+	int err;
 
 	if (unset && p->opt)
 		return opterror(opt, "takes no value", flags);
@@ -114,13 +115,29 @@ static int get_value(struct parse_opt_ctx_t *p,
 		return 0;
 
 	case OPTION_STRING:
+		err = 0;
 		if (unset)
 			*(const char **)opt->value = NULL;
 		else if (opt->flags & PARSE_OPT_OPTARG && !p->opt)
 			*(const char **)opt->value = (const char *)opt->defval;
 		else
-			return get_arg(p, opt, flags, (const char **)opt->value);
-		return 0;
+			err = get_arg(p, opt, flags, (const char **)opt->value);
+
+		/* PARSE_OPT_NOEMPTY: Allow NULL but disallow empty string. */
+		if (opt->flags & PARSE_OPT_NOEMPTY) {
+			const char *val = *(const char **)opt->value;
+
+			if (!val)
+				return err;
+
+			/* Similar to unset if we are given an empty string. */
+			if (val[0] == '\0') {
+				*(const char **)opt->value = NULL;
+				return 0;
+			}
+		}
+
+		return err;
 
 	case OPTION_CALLBACK:
 		if (unset)
diff --git a/tools/perf/util/parse-options.h b/tools/perf/util/parse-options.h
index 97b153f..59561fd 100644
--- a/tools/perf/util/parse-options.h
+++ b/tools/perf/util/parse-options.h
@@ -40,6 +40,7 @@ enum parse_opt_option_flags {
 	PARSE_OPT_LASTARG_DEFAULT = 16,
 	PARSE_OPT_DISABLED = 32,
 	PARSE_OPT_EXCLUSIVE = 64,
+	PARSE_OPT_NOEMPTY  = 128,
 };
 
 struct option;
@@ -122,6 +123,7 @@ struct option {
 #define OPT_LONG(s, l, v, h)        { .type = OPTION_LONG, .short_name = (s), .long_name = (l), .value = check_vtype(v, long *), .help = (h) }
 #define OPT_U64(s, l, v, h)         { .type = OPTION_U64, .short_name = (s), .long_name = (l), .value = check_vtype(v, u64 *), .help = (h) }
 #define OPT_STRING(s, l, v, a, h)   { .type = OPTION_STRING,  .short_name = (s), .long_name = (l), .value = check_vtype(v, const char **), (a), .help = (h) }
+#define OPT_STRING_NOEMPTY(s, l, v, a, h)   { .type = OPTION_STRING,  .short_name = (s), .long_name = (l), .value = check_vtype(v, const char **), (a), .help = (h), .flags = PARSE_OPT_NOEMPTY}
 #define OPT_DATE(s, l, v, h) \
 	{ .type = OPTION_CALLBACK, .short_name = (s), .long_name = (l), .value = (v), .argh = "time", .help = (h), .callback = parse_opt_approxidate_cb }
 #define OPT_CALLBACK(s, l, v, a, h, f) \

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2015-03-22 10:13 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-03-13  8:41 [PATCH] perf: fix a segfault problem Wang Nan
2015-03-13  9:46 ` Namhyung Kim
2015-03-13 10:07   ` Wang Nan
2015-03-13 11:20     ` Namhyung Kim
2015-03-13 12:51       ` [PATCH] perf: report: don't allow empty argument for '-t' Wang Nan
2015-03-16  2:20         ` Namhyung Kim
2015-03-19  6:41         ` Wang Nan
2015-03-19  7:26           ` Namhyung Kim
2015-03-19 14:00             ` Arnaldo Carvalho de Melo
2015-03-19 14:19               ` Namhyung Kim
2015-03-22 10:13         ` [tip:perf/core] perf report: Don't " tip-bot for Wang Nan

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).