Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 92736294 authored by Taesoo Kim's avatar Taesoo Kim Committed by Matt Wagantall
Browse files

UBIFS: fix incorrect unlocking handling



When ubifs_init_security() fails, 'ui_mutex' is incorrectly
unlocked and incorrectly restores 'i_size'. Fix this.

Change-Id: I955737002aa4e8e544b4d8a67f7f8cd31e28acb1
Signed-off-by: default avatarTaesoo Kim <tsgatesv@gmail.com>
Fixes: d7f0b70d30ff ("UBIFS: Add security.* XATTR support for the UBIFS")
Reviewed-by: default avatarBen Shelton <ben.shelton@ni.com>
Signed-off-by: default avatarUwe Kleine-König <u.kleine-koenig@pengutronix.de>
Signed-off-by: default avatarArtem Bityutskiy <artem.bityutskiy@linux.intel.com>
Git-commit: 9401a795c6478953e10226471ba5990db5000e05
Git-repo: git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git


Signed-off-by: default avatarNikhilesh Reddy <reddyn@codeaurora.org>
parent 13b99a87
Loading
Loading
Loading
Loading
+7 −4
Original line number Diff line number Diff line
@@ -274,7 +274,7 @@ static int ubifs_create(struct inode *dir, struct dentry *dentry, umode_t mode,

	err = ubifs_init_security(dir, inode, &dentry->d_name);
	if (err)
		goto out_cancel;
		goto out_inode;

	mutex_lock(&dir_ui->ui_mutex);
	dir->i_size += sz_change;
@@ -294,6 +294,7 @@ out_cancel:
	dir->i_size -= sz_change;
	dir_ui->ui_size = dir->i_size;
	mutex_unlock(&dir_ui->ui_mutex);
out_inode:
	make_bad_inode(inode);
	iput(inode);
out_budg:
@@ -734,7 +735,7 @@ static int ubifs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)

	err = ubifs_init_security(dir, inode, &dentry->d_name);
	if (err)
		goto out_cancel;
		goto out_inode;

	mutex_lock(&dir_ui->ui_mutex);
	insert_inode_hash(inode);
@@ -759,6 +760,7 @@ out_cancel:
	dir_ui->ui_size = dir->i_size;
	drop_nlink(dir);
	mutex_unlock(&dir_ui->ui_mutex);
out_inode:
	make_bad_inode(inode);
	iput(inode);
out_budg:
@@ -818,7 +820,7 @@ static int ubifs_mknod(struct inode *dir, struct dentry *dentry,

	err = ubifs_init_security(dir, inode, &dentry->d_name);
	if (err)
		goto out_cancel;
		goto out_inode;

	mutex_lock(&dir_ui->ui_mutex);
	dir->i_size += sz_change;
@@ -838,6 +840,7 @@ out_cancel:
	dir->i_size -= sz_change;
	dir_ui->ui_size = dir->i_size;
	mutex_unlock(&dir_ui->ui_mutex);
out_inode:
	make_bad_inode(inode);
	iput(inode);
out_budg:
@@ -898,7 +901,7 @@ static int ubifs_symlink(struct inode *dir, struct dentry *dentry,

	err = ubifs_init_security(dir, inode, &dentry->d_name);
	if (err)
		goto out_cancel;
		goto out_inode;

	mutex_lock(&dir_ui->ui_mutex);
	dir->i_size += sz_change;