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