/// Use kstrdup rather than duplicating its implementation /// // Confidence: High // Copyright: (C) 2010-2012 Nicolas Palix. GPLv2. // Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6. GPLv2. // Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6. GPLv2. // URL: http://coccinelle.lip6.fr/ // Comments: // Options: --no-includes --include-headers virtual patch virtual context virtual org virtual report @depends on patch@ expression from,to; expression flag,E1,E2; statement S; @@ - to = kmalloc(strlen(from) + 1,flag); + to = kstrdup(from, flag); ... when != \(from = E1 \| to = E1 \) if (to==NULL || ...) S ... when != \(from = E2 \| to = E2 \) - strcpy(to, from); @depends on patch@ expression x,from,to; expression flag,E1,E2,E3; statement S; @@ - x = strlen(from) + 1; ... when != \( x = E1 \| from = E1 \) - to = \(kmalloc\|kzalloc\)(x,flag); + to = kstrdup(from, flag); ... when != \(x = E2 \| from = E2 \| to = E2 \) if (to==NULL || ...) S ... when != \(x = E3 \| from = E3 \| to = E3 \) - memcpy(to, from, x); // --------------------------------------------------------------------- @r1 depends on !patch exists@ expression from,to; expression flag,E1,E2; statement S; position p1,p2; @@ * to = kmalloc@p1(strlen(from) + 1,flag); ... when != \(from = E1 \| to = E1 \) if (to==NULL || ...) S ... when != \(from = E2 \| to = E2 \) * strcpy@p2(to, from); @r2 depends on !patch exists@ expression x,from,to; expression flag,E1,E2,E3; statement S; position p1,p2; @@ * x = strlen(from) + 1; ... when != \( x = E1 \| from = E1 \) * to = \(kmalloc@p1\|kzalloc@p2\)(x,flag); ... when != \(x = E2 \| from = E2 \| to = E2 \) if (to==NULL || ...) S ... when != \(x = E3 \| from = E3 \| to = E3 \) * memcpy@p2(to, from, x); @script:python depends on org@ p1 << r1.p1; p2 << r1.p2; @@ cocci.print_main("WARNING opportunity for kstrdep",p1) cocci.print_secs("strcpy",p2) @script:python depends on org@ p1 << r2.p1; p2 << r2.p2; @@ cocci.print_main("WARNING opportunity for kstrdep",p1) cocci.print_secs("memcpy",p2) @script:python depends on report@ p1 << r1.p1; p2 << r1.p2; @@ msg = "WARNING opportunity for kstrdep (strcpy on line %s)" % (p2[0].line) coccilib.report.print_report(p1[0], msg) @script:python depends on report@ p1 << r2.p1; p2 << r2.p2; @@ msg = "WARNING opportunity for kstrdep (memcpy on line %s)" % (p2[0].line) coccilib.report.print_report(p1[0], msg) r
path: root/tools/perf/util/cloexec.h
diff options
context:
space:
mode:
authorPeter Zijlstra <peterz@infradead.org>2017-01-26 16:39:55 +0100
committerIngo Molnar <mingo@kernel.org>2017-01-30 11:41:25 +0100
commita76a82a3e38c8d3fb6499e3dfaeb0949241ab588 (patch)
treeb5bc906278fe1ac66d75de984d26bf59b43b3ed8 /tools/perf/util/cloexec.h
parent566cf877a1fcb6d6dc0126b076aad062054c2637 (diff)
perf/core: Fix use-after-free bug
Dmitry reported a KASAN use-after-free on event->group_leader. It turns out there's a hole in perf_remove_from_context() due to event_function_call() not calling its function when the task associated with the event is already dead. In this case the event will have been detached from the task, but the grouping will have been retained, such that group operations might still work properly while there are live child events etc. This does however mean that we can miss a perf_group_detach() call when the group decomposes, this in turn can then lead to use-after-free. Fix it by explicitly doing the group detach if its still required. Reported-by: Dmitry Vyukov <dvyukov@google.com> Tested-by: Dmitry Vyukov <dvyukov@google.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Arnaldo Carvalho de Melo <acme@kernel.org> Cc: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: stable@vger.kernel.org # v4.5+ Cc: syzkaller <syzkaller@googlegroups.com> Fixes: 63b6da39bb38 ("perf: Fix perf_event_exit_task() race") Link: http://lkml.kernel.org/r/20170126153955.GD6515@twins.programming.kicks-ass.net Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'tools/perf/util/cloexec.h')