diff mbox

[v2] perf probe: Verify parameters for two functions

Message ID 1446803415-83382-1-git-send-email-wangnan0@huawei.com
State New
Headers show

Commit Message

Wang Nan Nov. 6, 2015, 9:50 a.m. UTC
On kernel with only one of CONFIG_KPROBE_EVENTS and
CONFIG_UPROBE_EVENTS enabled, 'perf probe -d' causes segfault because
perf_del_probe_events() calls probe_file__get_events() with a negative
fd.

This patch fixes it by add parameter validation at the entry of
probe_file__get_events() and probe_file__get_rawlist(). Since they are
both non-static public functions (in .h file), parameter verifying
is required.

v1 -> v2: Verify fd at the head of probe_file__get_rawlist() instead of
          checking at call site (suggested by Masami and Arnaldo at [1,2]).

[1] http://lkml.kernel.org/r/50399556C9727B4D88A595C8584AAB37526048E3@GSjpTKYDCembx32.service.hitachi.net
[2] http://lkml.kernel.org/r/20151105155830.GV13236@kernel.org

Signed-off-by: Wang Nan <wangnan0@huawei.com>

Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Namhyung Kim <namhyung@kernel.org>
---
 tools/perf/util/probe-file.c | 6 ++++++
 1 file changed, 6 insertions(+)

-- 
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/

Comments

Wang Nan Nov. 11, 2015, 7 a.m. UTC | #1
Hi Arnaldo,

Could you please collect this patch to your tree? It fixes a segfault
when only one of kprobe and uprobe is enabled.

Thank you.

On 2015/11/6 17:50, Wang Nan wrote:
> On kernel with only one of CONFIG_KPROBE_EVENTS and

> CONFIG_UPROBE_EVENTS enabled, 'perf probe -d' causes segfault because

> perf_del_probe_events() calls probe_file__get_events() with a negative

> fd.

>

> This patch fixes it by add parameter validation at the entry of

> probe_file__get_events() and probe_file__get_rawlist(). Since they are

> both non-static public functions (in .h file), parameter verifying

> is required.

>

> v1 -> v2: Verify fd at the head of probe_file__get_rawlist() instead of

>            checking at call site (suggested by Masami and Arnaldo at [1,2]).

>

> [1] http://lkml.kernel.org/r/50399556C9727B4D88A595C8584AAB37526048E3@GSjpTKYDCembx32.service.hitachi.net

> [2] http://lkml.kernel.org/r/20151105155830.GV13236@kernel.org

>

> Signed-off-by: Wang Nan <wangnan0@huawei.com>

> Cc: Arnaldo Carvalho de Melo <acme@redhat.com>

> Cc: Jiri Olsa <jolsa@kernel.org>

> Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>

> Cc: Namhyung Kim <namhyung@kernel.org>

> ---

>   tools/perf/util/probe-file.c | 6 ++++++

>   1 file changed, 6 insertions(+)

>

> diff --git a/tools/perf/util/probe-file.c b/tools/perf/util/probe-file.c

> index 89dbeb9..e3b3b92 100644

> --- a/tools/perf/util/probe-file.c

> +++ b/tools/perf/util/probe-file.c

> @@ -138,6 +138,9 @@ struct strlist *probe_file__get_rawlist(int fd)

>   	char *p;

>   	struct strlist *sl;

>   

> +	if (fd < 0)

> +		return NULL;

> +

>   	sl = strlist__new(NULL, NULL);

>   

>   	fp = fdopen(dup(fd), "r");

> @@ -271,6 +274,9 @@ int probe_file__get_events(int fd, struct strfilter *filter,

>   	const char *p;

>   	int ret = -ENOENT;

>   

> +	if (!plist)

> +		return -EINVAL;

> +

>   	namelist = __probe_file__get_namelist(fd, true);

>   	if (!namelist)

>   		return -ENOENT;



--
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/
diff mbox

Patch

diff --git a/tools/perf/util/probe-file.c b/tools/perf/util/probe-file.c
index 89dbeb9..e3b3b92 100644
--- a/tools/perf/util/probe-file.c
+++ b/tools/perf/util/probe-file.c
@@ -138,6 +138,9 @@  struct strlist *probe_file__get_rawlist(int fd)
 	char *p;
 	struct strlist *sl;
 
+	if (fd < 0)
+		return NULL;
+
 	sl = strlist__new(NULL, NULL);
 
 	fp = fdopen(dup(fd), "r");
@@ -271,6 +274,9 @@  int probe_file__get_events(int fd, struct strfilter *filter,
 	const char *p;
 	int ret = -ENOENT;
 
+	if (!plist)
+		return -EINVAL;
+
 	namelist = __probe_file__get_namelist(fd, true);
 	if (!namelist)
 		return -ENOENT;