Commit 6cb4aff0a77cc0e6bae9475d62205319e3ebbf3f

Authored by Jeff Mahoney
Committed by Linus Torvalds
1 parent 298359c5bf

reiserfs: fix oops while creating privroot with selinux enabled

Commit 57fe60df ("reiserfs: add atomic addition of selinux attributes
during inode creation") contains a bug that will cause it to oops when
mounting a file system that didn't previously contain extended attributes
on a system using security.* xattrs.

The issue is that while creating the privroot during mount
reiserfs_security_init calls reiserfs_xattr_jcreate_nblocks which
dereferences the xattr root.  The xattr root doesn't exist, so we get an
oops.

Addresses http://bugzilla.kernel.org/show_bug.cgi?id=15309

Signed-off-by: Jeff Mahoney <jeffm@suse.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

Showing 2 changed files with 6 additions and 1 deletions Side-by-side Diff

fs/reiserfs/xattr_security.c
... ... @@ -76,7 +76,7 @@
76 76 return error;
77 77 }
78 78  
79   - if (sec->length) {
  79 + if (sec->length && reiserfs_xattrs_initialized(inode->i_sb)) {
80 80 blocks = reiserfs_xattr_jcreate_nblocks(inode) +
81 81 reiserfs_xattr_nblocks(inode, sec->length);
82 82 /* We don't want to count the directories twice if we have
include/linux/reiserfs_xattr.h
... ... @@ -70,6 +70,11 @@
70 70 void reiserfs_security_free(struct reiserfs_security_handle *sec);
71 71 #endif
72 72  
  73 +static inline int reiserfs_xattrs_initialized(struct super_block *sb)
  74 +{
  75 + return REISERFS_SB(sb)->priv_root != NULL;
  76 +}
  77 +
73 78 #define xattr_size(size) ((size) + sizeof(struct reiserfs_xattr_header))
74 79 static inline loff_t reiserfs_xattr_nblocks(struct inode *inode, loff_t size)
75 80 {