diff options
author | Ben Hutchings | 2015-07-26 18:31:08 -0500 |
---|---|---|
committer | Ingo Molnar | 2015-08-12 04:37:21 -0500 |
commit | ee9397a6fb9bc4e52677f5e33eed4abee0f515e6 (patch) | |
tree | e651e0dadf1362f500177552d6e99707ff441959 | |
parent | fed66e2cdd4f127a43fd11b8d92a99bdd429528c (diff) | |
download | afd-analog-ee9397a6fb9bc4e52677f5e33eed4abee0f515e6.tar.gz afd-analog-ee9397a6fb9bc4e52677f5e33eed4abee0f515e6.tar.xz afd-analog-ee9397a6fb9bc4e52677f5e33eed4abee0f515e6.zip |
perf: Fix double-free of the AUX buffer
If rb->aux_refcount is decremented to zero before rb->refcount,
__rb_free_aux() may be called twice resulting in a double free of
rb->aux_pages. Fix this by adding a check to __rb_free_aux().
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
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: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: stable@vger.kernel.org
Fixes: 57ffc5ca679f ("perf: Fix AUX buffer refcounting")
Link: http://lkml.kernel.org/r/1437953468.12842.17.camel@decadent.org.uk
Signed-off-by: Ingo Molnar <mingo@kernel.org>
-rw-r--r-- | kernel/events/ring_buffer.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/kernel/events/ring_buffer.c b/kernel/events/ring_buffer.c index b2be01b1aa9d..c8aa3f75bc4d 100644 --- a/kernel/events/ring_buffer.c +++ b/kernel/events/ring_buffer.c | |||
@@ -559,11 +559,13 @@ static void __rb_free_aux(struct ring_buffer *rb) | |||
559 | rb->aux_priv = NULL; | 559 | rb->aux_priv = NULL; |
560 | } | 560 | } |
561 | 561 | ||
562 | for (pg = 0; pg < rb->aux_nr_pages; pg++) | 562 | if (rb->aux_nr_pages) { |
563 | rb_free_aux_page(rb, pg); | 563 | for (pg = 0; pg < rb->aux_nr_pages; pg++) |
564 | rb_free_aux_page(rb, pg); | ||
564 | 565 | ||
565 | kfree(rb->aux_pages); | 566 | kfree(rb->aux_pages); |
566 | rb->aux_nr_pages = 0; | 567 | rb->aux_nr_pages = 0; |
568 | } | ||
567 | } | 569 | } |
568 | 570 | ||
569 | void rb_free_aux(struct ring_buffer *rb) | 571 | void rb_free_aux(struct ring_buffer *rb) |