Thread (15 messages) 15 messages, 8 authors, 2014-01-11

Re: [PATCH] vfs: Fix possible NULL pointer dereference in inode_permission()

From: Paul E. McKenney <hidden>
Date: 2014-01-10 00:44:11
Also in: linux-fsdevel, lkml

On Thu, Jan 09, 2014 at 06:59:07PM -0500, Steven Rostedt wrote:
On Thu, 9 Jan 2014 15:45:37 -0800
"Paul E. McKenney" [off-list ref] wrote:
quoted
quoted
 static void inode_free_security(struct inode *inode)
 {
 	struct inode_security_struct *isec = inode->i_security;
@@ -244,8 +252,7 @@ static void inode_free_security(struct i
 		list_del_init(&isec->list);
 	spin_unlock(&sbsec->isec_lock);

-	inode->i_security = NULL;
-	kmem_cache_free(sel_inode_cache, isec);
+	call_rcu(&isec->rcu, inode_free_rcu);
Does not clearing ->i_security mean that RCU readers can traverse
this pointer after the invocation of call_rcu()?  If so, this is
problematic.  (If something else already prevents readers from getting
here, no problem.)
This is called when we are about to free the inode. Look at
destroy_inode(). Basically, this is the same as doing:

	call_rcu(&isec->rcu, inode_free_rcu);
	call_rcu(&inode->i_rcu, i_callback);

Where i_callback() does the free of the inode.

If you can access inode->i_security, after a call_rcu, then you can
also access the inode itself that has just been freed.

Yes, technically, having two separate call_rcu(), the first grace
period can end before the second, but everything to remove the inode
from sight has already been set up before that first call_rcu() is
made. That means when the first call_rcu() is executed, the inode
should already be invisible to the readers.
Got it, should be fine then, sorry for the noise.

							Thanx, Paul
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help