public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] lib/idr.c: Zero memory properly in idr_remove_all
@ 2009-01-10  7:04 David Moore
  2009-01-10  9:03 ` Stefan Richter
  0 siblings, 1 reply; 21+ messages in thread
From: David Moore @ 2009-01-10  7:04 UTC (permalink / raw)
  To: linux1394-devel, linux-kernel

From: David Moore <dcm@acm.org>

The idr_remove_all() function returns unused slabs to the kmem cache,
but needs to zero them first or else they will be uninitialized upon
next use.  This fixes crashes which have been observed in the firewire
subsystem.

Signed-off-by: David Moore <dcm@acm.org>
---
 lib/idr.c |   16 +++++++++++++++-
 1 files changed, 15 insertions(+), 1 deletions(-)

diff --git a/lib/idr.c b/lib/idr.c
index 1c4f928..69c3455 100644
--- a/lib/idr.c
+++ b/lib/idr.c
@@ -65,6 +65,20 @@ static inline void free_layer(struct idr_layer *p)
 	call_rcu(&p->rcu_head, idr_layer_rcu_free);
 }
 
+static void idr_layer_rcu_free_zero(struct rcu_head *head)
+{
+	struct idr_layer *layer;
+
+	layer = container_of(head, struct idr_layer, rcu_head);
+	memset(layer, 0, sizeof(struct idr_layer));
+	kmem_cache_free(idr_layer_cache, layer);
+}
+
+static inline void free_layer_zero(struct idr_layer *p)
+{
+	call_rcu(&p->rcu_head, idr_layer_rcu_free_zero);
+}
+
 /* only called when idp->lock is held */
 static void __move_to_free_list(struct idr *idp, struct idr_layer *p)
 {
@@ -462,7 +476,7 @@ void idr_remove_all(struct idr *idp)
 		id += 1 << n;
 		while (n < fls(id)) {
 			if (p)
-				free_layer(p);
+				free_layer_zero(p);
 			n += IDR_BITS;
 			p = *--paa;
 		}
-- 
1.6.0.6




^ permalink raw reply related	[flat|nested] 21+ messages in thread

end of thread, other threads:[~2009-01-14 18:06 UTC | newest]

Thread overview: 21+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-01-10  7:04 [PATCH] lib/idr.c: Zero memory properly in idr_remove_all David Moore
2009-01-10  9:03 ` Stefan Richter
2009-01-10  9:15   ` Andrew Morton
2009-01-10 10:05     ` Stefan Richter
2009-01-12 15:20       ` Kristian Høgsberg
2009-01-12 19:53         ` Manfred Spraul
2009-01-12 20:38           ` Kristian Høgsberg
2009-01-12 20:50             ` Manfred Spraul
2009-01-13 22:48               ` Andrew Morton
2009-01-14  2:51                 ` David Moore
2009-01-14  7:19                 ` Pekka Enberg
2009-01-14  8:17                   ` Andrew Morton
2009-01-14  8:59                     ` Stefan Richter
2009-01-14  9:22                       ` Andrew Morton
2009-01-14  9:48                         ` Stefan Richter
2009-01-14  9:52                           ` Stefan Richter
2009-01-14  9:02                     ` Pekka Enberg
2009-01-14 14:23                 ` Kristian Høgsberg
2009-01-14 16:21                   ` Stefan Richter
2009-01-14 16:33                     ` Kristian Høgsberg
2009-01-14 18:05                       ` Stefan Richter

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox