From 0c8c20779c5d56b93b8cb4cd30ba129a927ab437 Mon Sep 17 00:00:00 2001 From: Wang Nan Date: Fri, 13 Mar 2015 12:51:54 +0000 Subject: 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 Acked-by: Namhyung Kim Cc: pi3orama@163.com Cc: Jiri Olsa Cc: Zefan Li Link: http://lkml.kernel.org/r/1426251114-198991-1-git-send-email-wangnan0@huawei.com Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/util/parse-options.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) (limited to 'tools/perf/util/parse-options.c') diff --git a/tools/perf/util/parse-options.c b/tools/perf/util/parse-options.c index 1457d6639b60..01626be2a8eb 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) -- cgit