Skip to content

Commit

Permalink
evm: fix potential race when removing xattrs
Browse files Browse the repository at this point in the history
EVM needs to be atomically updated when removing xattrs.
Otherwise concurrent EVM verification may fail in between.
This patch fixes by moving i_mutex unlocking after calling
EVM hook. fsnotify_xattr() is also now called while locked
the same way as it is done in __vfs_setxattr_noperm.

Changelog:
- remove unused 'inode' variable.

Signed-off-by: Dmitry Kasatkin <d.kasatkin@samsung.com>
Signed-off-by: Mimi Zohar <zohar@linux.vnet.ibm.com>
  • Loading branch information
Dmitry Kasatkin authored and Mimi Zohar committed May 21, 2015
1 parent 5101a18 commit 7c51bb0
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 9 deletions.
10 changes: 5 additions & 5 deletions fs/xattr.c
Original file line number Diff line number Diff line change
Expand Up @@ -298,18 +298,18 @@ vfs_removexattr(struct dentry *dentry, const char *name)

mutex_lock(&inode->i_mutex);
error = security_inode_removexattr(dentry, name);
if (error) {
mutex_unlock(&inode->i_mutex);
return error;
}
if (error)
goto out;

error = inode->i_op->removexattr(dentry, name);
mutex_unlock(&inode->i_mutex);

if (!error) {
fsnotify_xattr(dentry);
evm_inode_post_removexattr(dentry, name);
}

out:
mutex_unlock(&inode->i_mutex);
return error;
}
EXPORT_SYMBOL_GPL(vfs_removexattr);
Expand Down
7 changes: 3 additions & 4 deletions security/integrity/evm/evm_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -387,17 +387,16 @@ void evm_inode_post_setxattr(struct dentry *dentry, const char *xattr_name,
* @xattr_name: pointer to the affected extended attribute name
*
* Update the HMAC stored in 'security.evm' to reflect removal of the xattr.
*
* No need to take the i_mutex lock here, as this function is called from
* vfs_removexattr() which takes the i_mutex.
*/
void evm_inode_post_removexattr(struct dentry *dentry, const char *xattr_name)
{
struct inode *inode = d_backing_inode(dentry);

if (!evm_initialized || !evm_protected_xattr(xattr_name))
return;

mutex_lock(&inode->i_mutex);
evm_update_evmxattr(dentry, xattr_name, NULL, 0);
mutex_unlock(&inode->i_mutex);
}

/**
Expand Down

0 comments on commit 7c51bb0

Please sign in to comment.