summaryrefslogtreecommitdiffstats
path: root/tools/perf/util/namespaces.h
diff options
context:
space:
mode:
authorIan Rogers <irogers@google.com>2023-04-17 23:51:57 +0200
committerArnaldo Carvalho de Melo <acme@redhat.com>2023-04-17 23:51:57 +0200
commitc35ce1d918c12900375a60165c908de47856900d (patch)
treee7038ce6e6efeaa5f7cfc5822f013cdb14780bb3 /tools/perf/util/namespaces.h
parentperf dso: Add dso__filename_with_chroot() to reduce number of accesses to dso... (diff)
downloadlinux-c35ce1d918c12900375a60165c908de47856900d.tar.xz
linux-c35ce1d918c12900375a60165c908de47856900d.zip
perf namespaces: Add reference count checking
Add reference count checking controlled by REFCNT_CHECKING ifdef. The reference count checking interposes an allocated pointer between the reference counted struct on a get and frees the pointer on a put. Accesses after a put cause faults and use after free, missed puts are caughts as leaks and double puts are double frees. This checking helped resolve a memory leak and use after free: https://lore.kernel.org/linux-perf-users/CAP-5=fWZH20L4kv-BwVtGLwR=Em3AOOT+Q4QGivvQuYn5AsPRg@mail.gmail.com/ Signed-off-by: Ian Rogers <irogers@google.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Alexey Bayduraev <alexey.v.bayduraev@linux.intel.com> Cc: Dmitriy Vyukov <dvyukov@google.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Riccardo Mancini <rickyman7@gmail.com> Cc: Stephane Eranian <eranian@google.com> Cc: Stephen Brennan <stephen.s.brennan@oracle.com> Link: https://lore.kernel.org/lkml/20230407230405.2931830-4-irogers@google.com [ Extracted from a larger patch ] Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/util/namespaces.h')
-rw-r--r--tools/perf/util/namespaces.h3
1 files changed, 2 insertions, 1 deletions
diff --git a/tools/perf/util/namespaces.h b/tools/perf/util/namespaces.h
index 567829262c42..8c0731c6cbb7 100644
--- a/tools/perf/util/namespaces.h
+++ b/tools/perf/util/namespaces.h
@@ -13,6 +13,7 @@
#include <linux/perf_event.h>
#include <linux/refcount.h>
#include <linux/types.h>
+#include <internal/rc_check.h>
#ifndef HAVE_SETNS_SUPPORT
int setns(int fd, int nstype);
@@ -29,7 +30,7 @@ struct namespaces {
struct namespaces *namespaces__new(struct perf_record_namespaces *event);
void namespaces__free(struct namespaces *namespaces);
-struct nsinfo {
+DECLARE_RC_STRUCT(nsinfo) {
pid_t pid;
pid_t tgid;
pid_t nstgid;