Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1288215 > unrolled thread

[PATCH 1/2] perf tests: Fix incorrect free and false TEST_OK result

Started byWang Nan <wangnan0@huawei.com>
First post2015-12-10 07:00 +0100
Last post2015-12-10 10:30 +0100
Articles 5 — 3 participants

Back to article view | Back to linux.kernel


Contents

  [PATCH 1/2] perf tests: Fix incorrect free and false TEST_OK result Wang Nan <wangnan0@huawei.com> - 2015-12-10 07:00 +0100
    [PATCH 2/2] perf tools: Prevent calling machine__delete() on non-allocated machine Wang Nan <wangnan0@huawei.com> - 2015-12-10 07:00 +0100
      [PATCH 2/2 (v2)] perf tools: Prevent calling machine__delete() on non-allocated machine Wang Nan <wangnan0@huawei.com> - 2015-12-10 10:30 +0100
        RE: [PATCH 2/2 (v2)] perf tools: Prevent calling machine__delete()  on non-allocated machine 平松雅巳 / HIRAMATU,MASAMI   <masami.hiramatsu.pt@hitachi.com> - 2015-12-10 11:20 +0100
      Re: [PATCH 2/2] perf tools: Prevent calling machine__delete() on  non-allocated machine "Wangnan (F)" <wangnan0@huawei.com> - 2015-12-10 10:30 +0100

#1288215 — [PATCH 1/2] perf tests: Fix incorrect free and false TEST_OK result

FromWang Nan <wangnan0@huawei.com>
Date2015-12-10 07:00 +0100
Subject[PATCH 1/2] perf tests: Fix incorrect free and false TEST_OK result
Message-ID<qE2qK-1W9-7@gated-at.bofh.it>
Commit cc1121ab9687d660cc02f50b1a4974112f87a8e6 ('perf machine: Fix
machine.vmlinux_maps to make sure to clear the old one') reveals a bug
in 'perf test' that in all test cases which use setup_fake_machine()
incorrectly call free() when failure, because all users of
setup_fake_machine() use static allocated 'machines' structure, but
setup_fake_machine() calls machine__delete() which try to free() it.

If a normal user try those test cases this problem can be seen:
 $ cat /proc/sys/kernel/kptr_restrict
 1
 $ ./perf test 'hist'
 15: Test matching and linking multiple hists                 :*** Error in `./perf': munmap_chunk(): invalid pointer: 0x00007ffd6e900090 ***
 ======= Backtrace: =========
 /lib64/libc.so.6(+0x6eeef)[0x7fcec97e1eef]
 /lib64/libc.so.6(+0x78cae)[0x7fcec97ebcae]
 ./perf(setup_fake_machine+0x1cd)[0x4721ad]
 ./perf(test__hists_link+0xbf)[0x472d3f]
 ./perf[0x4648df]
 ./perf(cmd_test+0x589)[0x464ec9]
 ./perf[0x47fd11]
 ./perf(main+0x5f6)[0x432b96]
 /lib64/libc.so.6(__libc_start_main+0xf5)[0x7fcec9794bd5]
 ./perf[0x432cc5]
 ======= Memory map: ========
 ...
 25: Test filtering hist entries                              :*** Error in `./perf': munmap_chunk(): invalid pointer: 0x00007ffd6e900080 ***
 ======= Backtrace: =========
 /lib64/libc.so.6(+0x6eeef)[0x7fcec97e1eef]
 /lib64/libc.so.6(+0x78cae)[0x7fcec97ebcae]
 ./perf(setup_fake_machine+0x1cd)[0x4721ad]
 ./perf(test__hists_filter+0xc6)[0x4730f6]
 ./perf[0x4648df]
 ./perf(cmd_test+0x589)[0x464ec9]
 ./perf[0x47fd11]
 ./perf(main+0x5f6)[0x432b96]
 /lib64/libc.so.6(__libc_start_main+0xf5)[0x7fcec9794bd5]
 ./perf[0x432cc5]
 ======= Memory map: ========
 ...
 ...

Actually, all users of 'machines__init()' should avoid calling
machine__delete(). We can further add a flag in machine structure to
enforce this restriction.

After changing machine__delete() to machine__exit() another problem
arises:

 $ ./perf test 'hist'
 15: Test matching and linking multiple hists                 : Ok
 25: Test filtering hist entries                              : Ok
 28: Test output sorting of hist entries                      : Ok
 29: Test cumulation of child hist entries                    : Ok

The result is not true:

 $ ./perf test -v 'hist'
 15: Test matching and linking multiple hists                 :
 --- start ---
 test child forked, pid 17657
 Not enough memory for machine setup
 Not enough memory for machine setup
 test child finished with 0
 ---- end ----
 Test matching and linking multiple hists: Ok
 25: Test filtering hist entries                              :
 --- start ---
 test child forked, pid 17658
 Not enough memory for machine setup
 Not enough memory for machine setup
 test child finished with 0
 ---- end ----
 Test filtering hist entries: Ok
 28: Test output sorting of hist entries                      :
 --- start ---
 test child forked, pid 17659
 Not enough memory for machine setup
 Not enough memory for machine setup
 test child finished with 0
 ---- end ----
 Test output sorting of hist entries: Ok
 29: Test cumulation of child hist entries                    :
 --- start ---
 test child forked, pid 17660
 Not enough memory for machine setup
 Not enough memory for machine setup
 test child finished with 0
 ---- end ----
 Test cumulation of child hist entries: Ok

Because the test body is not executed at all.

The reason is that *ALL* hists test cases forget to reset err after
using it to hold an error code:

  err = TEST_FAIL;
  ...
  err = parse_events(evlist, "cpu-clock", NULL);
  if (err)
      goto out;
  /* err is already 0 here */
  ...
  machine = setup_fake_machine(&machines);
  if (!machine)
      goto out;
  ...
 out:
  ...
  return err;

This patch ensure err is reset.

In case when kptr_restrict prevent normal user get kernel address, this
test should be skipped, not fail. This patch use linux/err.h to store
error code in return value of setup_fake_machine(), and let 'EACCES' to
indicate this problem.

Also, the debug message 'Not enough memory for machine setup' is not
true and should be fixed.

Here is the final result:
 $ ./perf test 'hist'
 15: Test matching and linking multiple hists                 : Skip
 25: Test filtering hist entries                              : Skip
 28: Test output sorting of hist entries                      : Skip
 29: Test cumulation of child hist entries                    : Skip

 $ ./perf test -v 'hist'
 15: Test matching and linking multiple hists                 :
 --- start ---
 test child forked, pid 20177
 Failed to create kernel maps
 Hint: Check /proc/sys/kernel/kptr_restrict.
 Failed for machine setup
 test child finished with -2
 ---- end ----
 Test matching and linking multiple hists: Skip
 25: Test filtering hist entries
 ...

 $ sudo ./perf test hist
 15: Test matching and linking multiple hists                 : Ok
 25: Test filtering hist entries                              : Ok
 28: Test output sorting of hist entries                      : Ok
 29: Test cumulation of child hist entries                    : Ok

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/tests/hists_common.c   | 15 ++++++++++-----
 tools/perf/tests/hists_common.h   |  1 +
 tools/perf/tests/hists_cumulate.c |  6 +++++-
 tools/perf/tests/hists_filter.c   |  6 +++++-
 tools/perf/tests/hists_link.c     |  6 +++++-
 tools/perf/tests/hists_output.c   |  6 +++++-
 6 files changed, 31 insertions(+), 9 deletions(-)

diff --git a/tools/perf/tests/hists_common.c b/tools/perf/tests/hists_common.c
index 46f453b..4cd8cad 100644
--- a/tools/perf/tests/hists_common.c
+++ b/tools/perf/tests/hists_common.c
@@ -81,14 +81,19 @@ struct machine *setup_fake_machine(struct machines *machines)
 {
 	struct machine *machine = machines__find(machines, HOST_KERNEL_ID);
 	size_t i;
+	int err = -ENOMEM;
 
 	if (machine == NULL) {
 		pr_debug("Not enough memory for machine setup\n");
-		return NULL;
+		return ERR_PTR(-ENOMEM);
 	}
 
 	if (machine__create_kernel_maps(machine)) {
-		pr_debug("Not enough memory for machine setup\n");
+		pr_debug("Failed to create kernel maps\n");
+		if (symbol_conf.kptr_restrict) {
+			pr_debug("Hint: Check /proc/sys/kernel/kptr_restrict.\n");
+			err = -EACCES;
+		}
 		goto out;
 	}
 
@@ -153,10 +158,10 @@ struct machine *setup_fake_machine(struct machines *machines)
 	return machine;
 
 out:
-	pr_debug("Not enough memory for machine setup\n");
+	pr_debug("Failed for machine setup\n");
 	machine__delete_threads(machine);
-	machine__delete(machine);
-	return NULL;
+	machine__exit(machine);
+	return ERR_PTR(err);
 }
 
 void print_hists_in(struct hists *hists)
diff --git a/tools/perf/tests/hists_common.h b/tools/perf/tests/hists_common.h
index 888254e..0252eae 100644
--- a/tools/perf/tests/hists_common.h
+++ b/tools/perf/tests/hists_common.h
@@ -1,5 +1,6 @@
 #ifndef __PERF_TESTS__HISTS_COMMON_H__
 #define __PERF_TESTS__HISTS_COMMON_H__
+#include <linux/err.h>
 
 struct machine;
 struct machines;
diff --git a/tools/perf/tests/hists_cumulate.c b/tools/perf/tests/hists_cumulate.c
index 8292948..c211075 100644
--- a/tools/perf/tests/hists_cumulate.c
+++ b/tools/perf/tests/hists_cumulate.c
@@ -706,13 +706,17 @@ int test__hists_cumulate(int subtest __maybe_unused)
 	err = parse_events(evlist, "cpu-clock", NULL);
 	if (err)
 		goto out;
+	err = TEST_FAIL;
 
 	machines__init(&machines);
 
 	/* setup threads/dso/map/symbols also */
 	machine = setup_fake_machine(&machines);
-	if (!machine)
+	if (IS_ERR(machine)) {
+		if (PTR_ERR(machine) == -EACCES)
+			err = TEST_SKIP;
 		goto out;
+	}
 
 	if (verbose > 1)
 		machine__fprintf(machine, stderr);
diff --git a/tools/perf/tests/hists_filter.c b/tools/perf/tests/hists_filter.c
index ccb5b49..795a04d 100644
--- a/tools/perf/tests/hists_filter.c
+++ b/tools/perf/tests/hists_filter.c
@@ -120,6 +120,7 @@ int test__hists_filter(int subtest __maybe_unused)
 	err = parse_events(evlist, "task-clock", NULL);
 	if (err)
 		goto out;
+	err = TEST_FAIL;
 
 	/* default sort order (comm,dso,sym) will be used */
 	if (setup_sorting() < 0)
@@ -129,8 +130,11 @@ int test__hists_filter(int subtest __maybe_unused)
 
 	/* setup threads/dso/map/symbols also */
 	machine = setup_fake_machine(&machines);
-	if (!machine)
+	if (IS_ERR(machine)) {
+		if (PTR_ERR(machine) == -EACCES)
+			err = TEST_SKIP;
 		goto out;
+	}
 
 	if (verbose > 1)
 		machine__fprintf(machine, stderr);
diff --git a/tools/perf/tests/hists_link.c b/tools/perf/tests/hists_link.c
index 6243e2b..f5f37ef9 100644
--- a/tools/perf/tests/hists_link.c
+++ b/tools/perf/tests/hists_link.c
@@ -293,6 +293,7 @@ int test__hists_link(int subtest __maybe_unused)
 	if (err)
 		goto out;
 
+	err = TEST_FAIL;
 	/* default sort order (comm,dso,sym) will be used */
 	if (setup_sorting() < 0)
 		goto out;
@@ -301,8 +302,11 @@ int test__hists_link(int subtest __maybe_unused)
 
 	/* setup threads/dso/map/symbols also */
 	machine = setup_fake_machine(&machines);
-	if (!machine)
+	if (IS_ERR(machine)) {
+		if (PTR_ERR(machine) == -EACCES)
+			err = TEST_SKIP;
 		goto out;
+	}
 
 	if (verbose > 1)
 		machine__fprintf(machine, stderr);
diff --git a/tools/perf/tests/hists_output.c b/tools/perf/tests/hists_output.c
index 248beec..cc570cf 100644
--- a/tools/perf/tests/hists_output.c
+++ b/tools/perf/tests/hists_output.c
@@ -597,13 +597,17 @@ int test__hists_output(int subtest __maybe_unused)
 	err = parse_events(evlist, "cpu-clock", NULL);
 	if (err)
 		goto out;
+	err = TEST_FAIL;
 
 	machines__init(&machines);
 
 	/* setup threads/dso/map/symbols also */
 	machine = setup_fake_machine(&machines);
-	if (!machine)
+	if (IS_ERR(machine)) {
+		if (PTR_ERR(machine) == -EACCES)
+			err = TEST_SKIP;
 		goto out;
+	}
 
 	if (verbose > 1)
 		machine__fprintf(machine, stderr);
-- 
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/

[toc] | [next] | [standalone]


#1288216 — [PATCH 2/2] perf tools: Prevent calling machine__delete() on non-allocated machine

FromWang Nan <wangnan0@huawei.com>
Date2015-12-10 07:00 +0100
Subject[PATCH 2/2] perf tools: Prevent calling machine__delete() on non-allocated machine
Message-ID<qE2qK-1W9-5@gated-at.bofh.it>
In reply to#1288215
To prevent futher commits calling machine__delete() on non-allocated
'struct machine' (which would cause memory corruption), this patch
enforces machine__init(), record whether a machine structure is
dynamically allocated or not, and warn if machine__delete() is called
on incorrect object.

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/tests/vmlinux-kallsyms.c |  4 ++--
 tools/perf/util/machine.c           | 14 +++++++++-----
 tools/perf/util/machine.h           |  3 ++-
 3 files changed, 13 insertions(+), 8 deletions(-)

diff --git a/tools/perf/tests/vmlinux-kallsyms.c b/tools/perf/tests/vmlinux-kallsyms.c
index f0bfc9e..441e93d 100644
--- a/tools/perf/tests/vmlinux-kallsyms.c
+++ b/tools/perf/tests/vmlinux-kallsyms.c
@@ -35,8 +35,8 @@ int test__vmlinux_matches_kallsyms(int subtest __maybe_unused)
 	 * Init the machines that will hold kernel, modules obtained from
 	 * both vmlinux + .ko files and from /proc/kallsyms split by modules.
 	 */
-	machine__init(&kallsyms, "", HOST_KERNEL_ID);
-	machine__init(&vmlinux, "", HOST_KERNEL_ID);
+	machine__init(&kallsyms, "", HOST_KERNEL_ID, false);
+	machine__init(&vmlinux, "", HOST_KERNEL_ID, false);
 
 	/*
 	 * Step 2:
diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c
index f5882b8..a2b9b47 100644
--- a/tools/perf/util/machine.c
+++ b/tools/perf/util/machine.c
@@ -23,7 +23,7 @@ static void dsos__init(struct dsos *dsos)
 	pthread_rwlock_init(&dsos->lock, NULL);
 }
 
-int machine__init(struct machine *machine, const char *root_dir, pid_t pid)
+int machine__init(struct machine *machine, const char *root_dir, pid_t pid, bool allocated)
 {
 	map_groups__init(&machine->kmaps, machine);
 	RB_CLEAR_NODE(&machine->rb_node);
@@ -64,6 +64,7 @@ int machine__init(struct machine *machine, const char *root_dir, pid_t pid)
 	}
 
 	machine->current_tid = NULL;
+	machine->allocated = allocated;
 
 	return 0;
 }
@@ -73,7 +74,7 @@ struct machine *machine__new_host(void)
 	struct machine *machine = malloc(sizeof(*machine));
 
 	if (machine != NULL) {
-		machine__init(machine, "", HOST_KERNEL_ID);
+		machine__init(machine, "", HOST_KERNEL_ID, true);
 
 		if (machine__create_kernel_maps(machine) < 0)
 			goto out_delete;
@@ -136,12 +137,15 @@ void machine__exit(struct machine *machine)
 void machine__delete(struct machine *machine)
 {
 	machine__exit(machine);
-	free(machine);
+	if (!machine->allocated)
+		free(machine);
+	else
+		pr_warning("WARNING: delete a non-allocated machine. Skip.\n");
 }
 
 void machines__init(struct machines *machines)
 {
-	machine__init(&machines->host, "", HOST_KERNEL_ID);
+	machine__init(&machines->host, "", HOST_KERNEL_ID, false);
 	machines->guests = RB_ROOT;
 	machines->symbol_filter = NULL;
 }
@@ -162,7 +166,7 @@ struct machine *machines__add(struct machines *machines, pid_t pid,
 	if (machine == NULL)
 		return NULL;
 
-	if (machine__init(machine, root_dir, pid) != 0) {
+	if (machine__init(machine, root_dir, pid, true) != 0) {
 		free(machine);
 		return NULL;
 	}
diff --git a/tools/perf/util/machine.h b/tools/perf/util/machine.h
index 2c2b443..24dfd46 100644
--- a/tools/perf/util/machine.h
+++ b/tools/perf/util/machine.h
@@ -28,6 +28,7 @@ struct machine {
 	pid_t		  pid;
 	u16		  id_hdr_size;
 	bool		  comm_exec;
+	bool		  allocated;
 	char		  *root_dir;
 	struct rb_root	  threads;
 	pthread_rwlock_t  threads_lock;
@@ -131,7 +132,7 @@ void machines__set_symbol_filter(struct machines *machines,
 void machines__set_comm_exec(struct machines *machines, bool comm_exec);
 
 struct machine *machine__new_host(void);
-int machine__init(struct machine *machine, const char *root_dir, pid_t pid);
+int machine__init(struct machine *machine, const char *root_dir, pid_t pid, bool allocated);
 void machine__exit(struct machine *machine);
 void machine__delete_threads(struct machine *machine);
 void machine__delete(struct machine *machine);
-- 
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/

[toc] | [prev] | [next] | [standalone]


#1288391 — [PATCH 2/2 (v2)] perf tools: Prevent calling machine__delete() on non-allocated machine

FromWang Nan <wangnan0@huawei.com>
Date2015-12-10 10:30 +0100
Subject[PATCH 2/2 (v2)] perf tools: Prevent calling machine__delete() on non-allocated machine
Message-ID<qE5HY-4fH-19@gated-at.bofh.it>
In reply to#1288216
To prevent futher commits calling machine__delete() on non-allocated
'struct machine' (which would cause memory corruption), this patch
enforces machine__init(), record whether a machine structure is
dynamically allocated or not, and warn if machine__delete() is called
on incorrect object.

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

v1 -> v2: Remove incorrect '!'.

---
 tools/perf/tests/vmlinux-kallsyms.c |  4 ++--
 tools/perf/util/machine.c           | 14 +++++++++-----
 tools/perf/util/machine.h           |  3 ++-
 3 files changed, 13 insertions(+), 8 deletions(-)

diff --git a/tools/perf/tests/vmlinux-kallsyms.c b/tools/perf/tests/vmlinux-kallsyms.c
index f0bfc9e..441e93d 100644
--- a/tools/perf/tests/vmlinux-kallsyms.c
+++ b/tools/perf/tests/vmlinux-kallsyms.c
@@ -35,8 +35,8 @@ int test__vmlinux_matches_kallsyms(int subtest __maybe_unused)
 	 * Init the machines that will hold kernel, modules obtained from
 	 * both vmlinux + .ko files and from /proc/kallsyms split by modules.
 	 */
-	machine__init(&kallsyms, "", HOST_KERNEL_ID);
-	machine__init(&vmlinux, "", HOST_KERNEL_ID);
+	machine__init(&kallsyms, "", HOST_KERNEL_ID, false);
+	machine__init(&vmlinux, "", HOST_KERNEL_ID, false);
 
 	/*
 	 * Step 2:
diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c
index f5882b8..ac64e5a 100644
--- a/tools/perf/util/machine.c
+++ b/tools/perf/util/machine.c
@@ -23,7 +23,7 @@ static void dsos__init(struct dsos *dsos)
 	pthread_rwlock_init(&dsos->lock, NULL);
 }
 
-int machine__init(struct machine *machine, const char *root_dir, pid_t pid)
+int machine__init(struct machine *machine, const char *root_dir, pid_t pid, bool allocated)
 {
 	map_groups__init(&machine->kmaps, machine);
 	RB_CLEAR_NODE(&machine->rb_node);
@@ -64,6 +64,7 @@ int machine__init(struct machine *machine, const char *root_dir, pid_t pid)
 	}
 
 	machine->current_tid = NULL;
+	machine->allocated = allocated;
 
 	return 0;
 }
@@ -73,7 +74,7 @@ struct machine *machine__new_host(void)
 	struct machine *machine = malloc(sizeof(*machine));
 
 	if (machine != NULL) {
-		machine__init(machine, "", HOST_KERNEL_ID);
+		machine__init(machine, "", HOST_KERNEL_ID, true);
 
 		if (machine__create_kernel_maps(machine) < 0)
 			goto out_delete;
@@ -136,12 +137,15 @@ void machine__exit(struct machine *machine)
 void machine__delete(struct machine *machine)
 {
 	machine__exit(machine);
-	free(machine);
+	if (machine->allocated)
+		free(machine);
+	else
+		pr_warning("WARNING: delete a non-allocated machine. Skip.\n");
 }
 
 void machines__init(struct machines *machines)
 {
-	machine__init(&machines->host, "", HOST_KERNEL_ID);
+	machine__init(&machines->host, "", HOST_KERNEL_ID, false);
 	machines->guests = RB_ROOT;
 	machines->symbol_filter = NULL;
 }
@@ -162,7 +166,7 @@ struct machine *machines__add(struct machines *machines, pid_t pid,
 	if (machine == NULL)
 		return NULL;
 
-	if (machine__init(machine, root_dir, pid) != 0) {
+	if (machine__init(machine, root_dir, pid, true) != 0) {
 		free(machine);
 		return NULL;
 	}
diff --git a/tools/perf/util/machine.h b/tools/perf/util/machine.h
index 2c2b443..24dfd46 100644
--- a/tools/perf/util/machine.h
+++ b/tools/perf/util/machine.h
@@ -28,6 +28,7 @@ struct machine {
 	pid_t		  pid;
 	u16		  id_hdr_size;
 	bool		  comm_exec;
+	bool		  allocated;
 	char		  *root_dir;
 	struct rb_root	  threads;
 	pthread_rwlock_t  threads_lock;
@@ -131,7 +132,7 @@ void machines__set_symbol_filter(struct machines *machines,
 void machines__set_comm_exec(struct machines *machines, bool comm_exec);
 
 struct machine *machine__new_host(void);
-int machine__init(struct machine *machine, const char *root_dir, pid_t pid);
+int machine__init(struct machine *machine, const char *root_dir, pid_t pid, bool allocated);
 void machine__exit(struct machine *machine);
 void machine__delete_threads(struct machine *machine);
 void machine__delete(struct machine *machine);
-- 
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/

[toc] | [prev] | [next] | [standalone]


#1288431 — RE: [PATCH 2/2 (v2)] perf tools: Prevent calling machine__delete() on non-allocated machine

From平松雅巳 / HIRAMATU,MASAMI <masami.hiramatsu.pt@hitachi.com>
Date2015-12-10 11:20 +0100
SubjectRE: [PATCH 2/2 (v2)] perf tools: Prevent calling machine__delete() on non-allocated machine
Message-ID<qE6ul-4PD-11@gated-at.bofh.it>
In reply to#1288391
SGkgV2FuZywNCg0KPkZyb206IFdhbmcgTmFuIFttYWlsdG86d2FuZ25hbjBAaHVhd2VpLmNvbV0N
Cj4NCj5UbyBwcmV2ZW50IGZ1dGhlciBjb21taXRzIGNhbGxpbmcgbWFjaGluZV9fZGVsZXRlKCkg
b24gbm9uLWFsbG9jYXRlZA0KPidzdHJ1Y3QgbWFjaGluZScgKHdoaWNoIHdvdWxkIGNhdXNlIG1l
bW9yeSBjb3JydXB0aW9uKSwgdGhpcyBwYXRjaA0KPmVuZm9yY2VzIG1hY2hpbmVfX2luaXQoKSwg
cmVjb3JkIHdoZXRoZXIgYSBtYWNoaW5lIHN0cnVjdHVyZSBpcw0KPmR5bmFtaWNhbGx5IGFsbG9j
YXRlZCBvciBub3QsIGFuZCB3YXJuIGlmIG1hY2hpbmVfX2RlbGV0ZSgpIGlzIGNhbGxlZA0KPm9u
IGluY29ycmVjdCBvYmplY3QuDQoNCkxvb2tzIGdvb2QgdG8gbWUgOkQNCg0KUmV2aWV3ZWQtYnk6
IE1hc2FtaSBIaXJhbWF0c3UgPG1hc2FtaS5oaXJhbWF0c3UucHRAaGl0YWNoaS5jb20+DQoNClRo
YW5rcyENCg0KPg0KPlNpZ25lZC1vZmYtYnk6IFdhbmcgTmFuIDx3YW5nbmFuMEBodWF3ZWkuY29t
Pg0KPkNjOiBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAcmVkaGF0LmNvbT4NCj5DYzog
SmlyaSBPbHNhIDxqb2xzYUBrZXJuZWwub3JnPg0KPkNjOiBNYXNhbWkgSGlyYW1hdHN1IDxtYXNh
bWkuaGlyYW1hdHN1LnB0QGhpdGFjaGkuY29tPg0KPkNjOiBOYW1oeXVuZyBLaW0gPG5hbWh5dW5n
QGtlcm5lbC5vcmc+DQo+LS0tDQo+DQo+djEgLT4gdjI6IFJlbW92ZSBpbmNvcnJlY3QgJyEnLg0K
Pg0KPi0tLQ0KPiB0b29scy9wZXJmL3Rlc3RzL3ZtbGludXgta2FsbHN5bXMuYyB8ICA0ICsrLS0N
Cj4gdG9vbHMvcGVyZi91dGlsL21hY2hpbmUuYyAgICAgICAgICAgfCAxNCArKysrKysrKystLS0t
LQ0KPiB0b29scy9wZXJmL3V0aWwvbWFjaGluZS5oICAgICAgICAgICB8ICAzICsrLQ0KPiAzIGZp
bGVzIGNoYW5nZWQsIDEzIGluc2VydGlvbnMoKyksIDggZGVsZXRpb25zKC0pDQo+DQo+ZGlmZiAt
LWdpdCBhL3Rvb2xzL3BlcmYvdGVzdHMvdm1saW51eC1rYWxsc3ltcy5jIGIvdG9vbHMvcGVyZi90
ZXN0cy92bWxpbnV4LWthbGxzeW1zLmMNCj5pbmRleCBmMGJmYzllLi40NDFlOTNkIDEwMDY0NA0K
Pi0tLSBhL3Rvb2xzL3BlcmYvdGVzdHMvdm1saW51eC1rYWxsc3ltcy5jDQo+KysrIGIvdG9vbHMv
cGVyZi90ZXN0cy92bWxpbnV4LWthbGxzeW1zLmMNCj5AQCAtMzUsOCArMzUsOCBAQCBpbnQgdGVz
dF9fdm1saW51eF9tYXRjaGVzX2thbGxzeW1zKGludCBzdWJ0ZXN0IF9fbWF5YmVfdW51c2VkKQ0K
PiAJICogSW5pdCB0aGUgbWFjaGluZXMgdGhhdCB3aWxsIGhvbGQga2VybmVsLCBtb2R1bGVzIG9i
dGFpbmVkIGZyb20NCj4gCSAqIGJvdGggdm1saW51eCArIC5rbyBmaWxlcyBhbmQgZnJvbSAvcHJv
Yy9rYWxsc3ltcyBzcGxpdCBieSBtb2R1bGVzLg0KPiAJICovDQo+LQltYWNoaW5lX19pbml0KCZr
YWxsc3ltcywgIiIsIEhPU1RfS0VSTkVMX0lEKTsNCj4tCW1hY2hpbmVfX2luaXQoJnZtbGludXgs
ICIiLCBIT1NUX0tFUk5FTF9JRCk7DQo+KwltYWNoaW5lX19pbml0KCZrYWxsc3ltcywgIiIsIEhP
U1RfS0VSTkVMX0lELCBmYWxzZSk7DQo+KwltYWNoaW5lX19pbml0KCZ2bWxpbnV4LCAiIiwgSE9T
VF9LRVJORUxfSUQsIGZhbHNlKTsNCj4NCj4gCS8qDQo+IAkgKiBTdGVwIDI6DQo+ZGlmZiAtLWdp
dCBhL3Rvb2xzL3BlcmYvdXRpbC9tYWNoaW5lLmMgYi90b29scy9wZXJmL3V0aWwvbWFjaGluZS5j
DQo+aW5kZXggZjU4ODJiOC4uYWM2NGU1YSAxMDA2NDQNCj4tLS0gYS90b29scy9wZXJmL3V0aWwv
bWFjaGluZS5jDQo+KysrIGIvdG9vbHMvcGVyZi91dGlsL21hY2hpbmUuYw0KPkBAIC0yMyw3ICsy
Myw3IEBAIHN0YXRpYyB2b2lkIGRzb3NfX2luaXQoc3RydWN0IGRzb3MgKmRzb3MpDQo+IAlwdGhy
ZWFkX3J3bG9ja19pbml0KCZkc29zLT5sb2NrLCBOVUxMKTsNCj4gfQ0KPg0KPi1pbnQgbWFjaGlu
ZV9faW5pdChzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwgY29uc3QgY2hhciAqcm9vdF9kaXIsIHBp
ZF90IHBpZCkNCj4raW50IG1hY2hpbmVfX2luaXQoc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsIGNv
bnN0IGNoYXIgKnJvb3RfZGlyLCBwaWRfdCBwaWQsIGJvb2wgYWxsb2NhdGVkKQ0KPiB7DQo+IAlt
YXBfZ3JvdXBzX19pbml0KCZtYWNoaW5lLT5rbWFwcywgbWFjaGluZSk7DQo+IAlSQl9DTEVBUl9O
T0RFKCZtYWNoaW5lLT5yYl9ub2RlKTsNCj5AQCAtNjQsNiArNjQsNyBAQCBpbnQgbWFjaGluZV9f
aW5pdChzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwgY29uc3QgY2hhciAqcm9vdF9kaXIsIHBpZF90
IHBpZCkNCj4gCX0NCj4NCj4gCW1hY2hpbmUtPmN1cnJlbnRfdGlkID0gTlVMTDsNCj4rCW1hY2hp
bmUtPmFsbG9jYXRlZCA9IGFsbG9jYXRlZDsNCj4NCj4gCXJldHVybiAwOw0KPiB9DQo+QEAgLTcz
LDcgKzc0LDcgQEAgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmVfX25ld19ob3N0KHZvaWQpDQo+IAlz
dHJ1Y3QgbWFjaGluZSAqbWFjaGluZSA9IG1hbGxvYyhzaXplb2YoKm1hY2hpbmUpKTsNCj4NCj4g
CWlmIChtYWNoaW5lICE9IE5VTEwpIHsNCj4tCQltYWNoaW5lX19pbml0KG1hY2hpbmUsICIiLCBI
T1NUX0tFUk5FTF9JRCk7DQo+KwkJbWFjaGluZV9faW5pdChtYWNoaW5lLCAiIiwgSE9TVF9LRVJO
RUxfSUQsIHRydWUpOw0KPg0KPiAJCWlmIChtYWNoaW5lX19jcmVhdGVfa2VybmVsX21hcHMobWFj
aGluZSkgPCAwKQ0KPiAJCQlnb3RvIG91dF9kZWxldGU7DQo+QEAgLTEzNiwxMiArMTM3LDE1IEBA
IHZvaWQgbWFjaGluZV9fZXhpdChzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSkNCj4gdm9pZCBtYWNo
aW5lX19kZWxldGUoc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUpDQo+IHsNCj4gCW1hY2hpbmVfX2V4
aXQobWFjaGluZSk7DQo+LQlmcmVlKG1hY2hpbmUpOw0KPisJaWYgKG1hY2hpbmUtPmFsbG9jYXRl
ZCkNCj4rCQlmcmVlKG1hY2hpbmUpOw0KPisJZWxzZQ0KPisJCXByX3dhcm5pbmcoIldBUk5JTkc6
IGRlbGV0ZSBhIG5vbi1hbGxvY2F0ZWQgbWFjaGluZS4gU2tpcC5cbiIpOw0KPiB9DQo+DQo+IHZv
aWQgbWFjaGluZXNfX2luaXQoc3RydWN0IG1hY2hpbmVzICptYWNoaW5lcykNCj4gew0KPi0JbWFj
aGluZV9faW5pdCgmbWFjaGluZXMtPmhvc3QsICIiLCBIT1NUX0tFUk5FTF9JRCk7DQo+KwltYWNo
aW5lX19pbml0KCZtYWNoaW5lcy0+aG9zdCwgIiIsIEhPU1RfS0VSTkVMX0lELCBmYWxzZSk7DQo+
IAltYWNoaW5lcy0+Z3Vlc3RzID0gUkJfUk9PVDsNCj4gCW1hY2hpbmVzLT5zeW1ib2xfZmlsdGVy
ID0gTlVMTDsNCj4gfQ0KPkBAIC0xNjIsNyArMTY2LDcgQEAgc3RydWN0IG1hY2hpbmUgKm1hY2hp
bmVzX19hZGQoc3RydWN0IG1hY2hpbmVzICptYWNoaW5lcywgcGlkX3QgcGlkLA0KPiAJaWYgKG1h
Y2hpbmUgPT0gTlVMTCkNCj4gCQlyZXR1cm4gTlVMTDsNCj4NCj4tCWlmIChtYWNoaW5lX19pbml0
KG1hY2hpbmUsIHJvb3RfZGlyLCBwaWQpICE9IDApIHsNCj4rCWlmIChtYWNoaW5lX19pbml0KG1h
Y2hpbmUsIHJvb3RfZGlyLCBwaWQsIHRydWUpICE9IDApIHsNCj4gCQlmcmVlKG1hY2hpbmUpOw0K
PiAJCXJldHVybiBOVUxMOw0KPiAJfQ0KPmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvbWFj
aGluZS5oIGIvdG9vbHMvcGVyZi91dGlsL21hY2hpbmUuaA0KPmluZGV4IDJjMmI0NDMuLjI0ZGZk
NDYgMTAwNjQ0DQo+LS0tIGEvdG9vbHMvcGVyZi91dGlsL21hY2hpbmUuaA0KPisrKyBiL3Rvb2xz
L3BlcmYvdXRpbC9tYWNoaW5lLmgNCj5AQCAtMjgsNiArMjgsNyBAQCBzdHJ1Y3QgbWFjaGluZSB7
DQo+IAlwaWRfdAkJICBwaWQ7DQo+IAl1MTYJCSAgaWRfaGRyX3NpemU7DQo+IAlib29sCQkgIGNv
bW1fZXhlYzsNCj4rCWJvb2wJCSAgYWxsb2NhdGVkOw0KPiAJY2hhcgkJICAqcm9vdF9kaXI7DQo+
IAlzdHJ1Y3QgcmJfcm9vdAkgIHRocmVhZHM7DQo+IAlwdGhyZWFkX3J3bG9ja190ICB0aHJlYWRz
X2xvY2s7DQo+QEAgLTEzMSw3ICsxMzIsNyBAQCB2b2lkIG1hY2hpbmVzX19zZXRfc3ltYm9sX2Zp
bHRlcihzdHJ1Y3QgbWFjaGluZXMgKm1hY2hpbmVzLA0KPiB2b2lkIG1hY2hpbmVzX19zZXRfY29t
bV9leGVjKHN0cnVjdCBtYWNoaW5lcyAqbWFjaGluZXMsIGJvb2wgY29tbV9leGVjKTsNCj4NCj4g
c3RydWN0IG1hY2hpbmUgKm1hY2hpbmVfX25ld19ob3N0KHZvaWQpOw0KPi1pbnQgbWFjaGluZV9f
aW5pdChzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwgY29uc3QgY2hhciAqcm9vdF9kaXIsIHBpZF90
IHBpZCk7DQo+K2ludCBtYWNoaW5lX19pbml0KHN0cnVjdCBtYWNoaW5lICptYWNoaW5lLCBjb25z
dCBjaGFyICpyb290X2RpciwgcGlkX3QgcGlkLCBib29sIGFsbG9jYXRlZCk7DQo+IHZvaWQgbWFj
aGluZV9fZXhpdChzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSk7DQo+IHZvaWQgbWFjaGluZV9fZGVs
ZXRlX3RocmVhZHMoc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUpOw0KPiB2b2lkIG1hY2hpbmVfX2Rl
bGV0ZShzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSk7DQo+LS0NCj4xLjguMy40DQoNCg==
--
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/

[toc] | [prev] | [next] | [standalone]


#1288395 — Re: [PATCH 2/2] perf tools: Prevent calling machine__delete() on non-allocated machine

From"Wangnan (F)" <wangnan0@huawei.com>
Date2015-12-10 10:30 +0100
SubjectRe: [PATCH 2/2] perf tools: Prevent calling machine__delete() on non-allocated machine
Message-ID<qE5HZ-4fH-37@gated-at.bofh.it>
In reply to#1288216

On 2015/12/10 13:52, Wang Nan wrote:
> To prevent futher commits calling machine__delete() on non-allocated
> 'struct machine' (which would cause memory corruption), this patch
> enforces machine__init(), record whether a machine structure is
> dynamically allocated or not, and warn if machine__delete() is called
> on incorrect object.
>
> 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/tests/vmlinux-kallsyms.c |  4 ++--
>   tools/perf/util/machine.c           | 14 +++++++++-----
>   tools/perf/util/machine.h           |  3 ++-
>   3 files changed, 13 insertions(+), 8 deletions(-)
>
> diff --git a/tools/perf/tests/vmlinux-kallsyms.c b/tools/perf/tests/vmlinux-kallsyms.c
> index f0bfc9e..441e93d 100644
> --- a/tools/perf/tests/vmlinux-kallsyms.c
> +++ b/tools/perf/tests/vmlinux-kallsyms.c
> @@ -35,8 +35,8 @@ int test__vmlinux_matches_kallsyms(int subtest __maybe_unused)
>   	 * Init the machines that will hold kernel, modules obtained from
>   	 * both vmlinux + .ko files and from /proc/kallsyms split by modules.
>   	 */
> -	machine__init(&kallsyms, "", HOST_KERNEL_ID);
> -	machine__init(&vmlinux, "", HOST_KERNEL_ID);
> +	machine__init(&kallsyms, "", HOST_KERNEL_ID, false);
> +	machine__init(&vmlinux, "", HOST_KERNEL_ID, false);
>   
>   	/*
>   	 * Step 2:
> diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c
> index f5882b8..a2b9b47 100644
> --- a/tools/perf/util/machine.c
> +++ b/tools/perf/util/machine.c
> @@ -23,7 +23,7 @@ static void dsos__init(struct dsos *dsos)
>   	pthread_rwlock_init(&dsos->lock, NULL);
>   }
>   
> -int machine__init(struct machine *machine, const char *root_dir, pid_t pid)
> +int machine__init(struct machine *machine, const char *root_dir, pid_t pid, bool allocated)
>   {
>   	map_groups__init(&machine->kmaps, machine);
>   	RB_CLEAR_NODE(&machine->rb_node);
> @@ -64,6 +64,7 @@ int machine__init(struct machine *machine, const char *root_dir, pid_t pid)
>   	}
>   
>   	machine->current_tid = NULL;
> +	machine->allocated = allocated;
>   
>   	return 0;
>   }
> @@ -73,7 +74,7 @@ struct machine *machine__new_host(void)
>   	struct machine *machine = malloc(sizeof(*machine));
>   
>   	if (machine != NULL) {
> -		machine__init(machine, "", HOST_KERNEL_ID);
> +		machine__init(machine, "", HOST_KERNEL_ID, true);
>   
>   		if (machine__create_kernel_maps(machine) < 0)
>   			goto out_delete;
> @@ -136,12 +137,15 @@ void machine__exit(struct machine *machine)
>   void machine__delete(struct machine *machine)
>   {
>   	machine__exit(machine);
> -	free(machine);
> +	if (!machine->allocated)
Sorry, should be

         if (machine->allocated)

Will send v2.

Thank you.

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

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web