Skip to content

Commit

Permalink
ubifs: Massage assert in ubifs_xattr_set() wrt. init_xattrs
Browse files Browse the repository at this point in the history
commit d8db5b1 upstream.

The inode is not locked in init_xattrs when creating a new inode.

Without this patch, there will occurs assert when booting or creating
a new file, if the kernel config CONFIG_SECURITY_SMACK is enabled.

Log likes:

UBIFS assert failed in ubifs_xattr_set at 298 (pid 1156)
CPU: 1 PID: 1156 Comm: ldconfig Tainted: G S 4.12.0-rc1-207440-g1e70b02 open-power-host-os#2
Hardware name: MediaTek MT2712 evaluation board (DT)
Call trace:
[<ffff000008088538>] dump_backtrace+0x0/0x238
[<ffff000008088834>] show_stack+0x14/0x20
[<ffff0000083d98d4>] dump_stack+0x9c/0xc0
[<ffff00000835d524>] ubifs_xattr_set+0x374/0x5e0
[<ffff00000835d7ec>] init_xattrs+0x5c/0xb8
[<ffff000008385788>] security_inode_init_security+0x110/0x190
[<ffff00000835e058>] ubifs_init_security+0x30/0x68
[<ffff00000833ada0>] ubifs_mkdir+0x100/0x200
[<ffff00000820669c>] vfs_mkdir+0x11c/0x1b8
[<ffff00000820b73c>] SyS_mkdirat+0x74/0xd0
[<ffff000008082f8c>] __sys_trace_return+0x0/0x4

Signed-off-by: Xiaolei Li <[email protected]>
Signed-off-by: Richard Weinberger <[email protected]>
Cc: [email protected]
(julia: massaged to apply to 4.9.y, which doesn't contain fscrypto support)
Signed-off-by: Julia Cartwright <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>
  • Loading branch information
xiaoleili authored and gregkh committed Feb 17, 2018
1 parent de14d0c commit 298dc6c
Showing 1 changed file with 8 additions and 4 deletions.
12 changes: 8 additions & 4 deletions fs/ubifs/xattr.c
Original file line number Diff line number Diff line change
Expand Up @@ -270,7 +270,8 @@ static struct inode *iget_xattr(struct ubifs_info *c, ino_t inum)
}

static int __ubifs_setxattr(struct inode *host, const char *name,
const void *value, size_t size, int flags)
const void *value, size_t size, int flags,
bool check_lock)
{
struct inode *inode;
struct ubifs_info *c = host->i_sb->s_fs_info;
Expand All @@ -279,7 +280,8 @@ static int __ubifs_setxattr(struct inode *host, const char *name,
union ubifs_key key;
int err;

ubifs_assert(inode_is_locked(host));
if (check_lock)
ubifs_assert(inode_is_locked(host));

if (size > UBIFS_MAX_INO_DATA)
return -ERANGE;
Expand Down Expand Up @@ -548,7 +550,8 @@ static int init_xattrs(struct inode *inode, const struct xattr *xattr_array,
}
strcpy(name, XATTR_SECURITY_PREFIX);
strcpy(name + XATTR_SECURITY_PREFIX_LEN, xattr->name);
err = __ubifs_setxattr(inode, name, xattr->value, xattr->value_len, 0);
err = __ubifs_setxattr(inode, name, xattr->value,
xattr->value_len, 0, false);
kfree(name);
if (err < 0)
break;
Expand Down Expand Up @@ -594,7 +597,8 @@ static int ubifs_xattr_set(const struct xattr_handler *handler,
name = xattr_full_name(handler, name);

if (value)
return __ubifs_setxattr(inode, name, value, size, flags);
return __ubifs_setxattr(inode, name, value, size, flags,
true);
else
return __ubifs_removexattr(inode, name);
}
Expand Down

0 comments on commit 298dc6c

Please sign in to comment.