Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1288215 > unrolled thread
| Started by | Wang Nan <wangnan0@huawei.com> |
|---|---|
| First post | 2015-12-10 07:00 +0100 |
| Last post | 2015-12-10 10:30 +0100 |
| Articles | 5 — 3 participants |
Back to article view | Back to linux.kernel
[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
| From | Wang Nan <wangnan0@huawei.com> |
|---|---|
| Date | 2015-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]
| From | Wang Nan <wangnan0@huawei.com> |
|---|---|
| Date | 2015-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]
| From | Wang Nan <wangnan0@huawei.com> |
|---|---|
| Date | 2015-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]
| From | 平松雅巳 / HIRAMATU,MASAMI <masami.hiramatsu.pt@hitachi.com> |
|---|---|
| Date | 2015-12-10 11:20 +0100 |
| Subject | RE: [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]
| From | "Wangnan (F)" <wangnan0@huawei.com> |
|---|---|
| Date | 2015-12-10 10:30 +0100 |
| Subject | Re: [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