Re: [PATCH] SELinux: requesting no permissions in avc_has_perm_noaudit is a BUG()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, 2008-03-12 at 09:26 +1100, James Morris wrote:
> On Wed, 12 Mar 2008, James Morris wrote:
> 
> > Applied to 
> > git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/selinux-2.6.git#for-akpm
> 
> Just saw this during boot.
> 
> [    8.238863] ------------[ cut here ]------------
> [    8.239762] kernel BUG at security/selinux/avc.c:874!

> [    8.239762]  [<ffffffff802a7e65>] ? link_path_walk+0xbd/0xcd
> [    8.239762]  [<ffffffff8031ab34>] avc_has_perm+0x2e/0x5e
> [    8.239762]  [<ffffffff8031b9ca>] inode_has_perm+0x6b/0x7a
> [    8.239762]  [<ffffffff8031f242>] selinux_dentry_open+0x6a/0x73
> [    8.239762]  [<ffffffff8031742e>] security_dentry_open+0x11/0x13
> [    8.239762]  [<ffffffff8029c69a>] __dentry_open+0xce/0x1d3
> [    8.239762]  [<ffffffff8029c838>] nameidata_to_filp+0x2e/0x40
> [    8.239762]  [<ffffffff8029c880>] do_filp_open+0x36/0x46
> [    8.239762]  [<ffffffff804a9da3>] ? _spin_unlock+0x26/0x2a
> [    8.239762]  [<ffffffff8029c5b1>] ? get_unused_fd_flags+0x113/0x121
> [    8.239762]  [<ffffffff8029c8e1>] do_sys_open+0x51/0xd2
> [    8.239762]  [<ffffffff8029c98b>] sys_open+0x1b/0x1d
> [    8.239762]  [<ffffffff8020bf7b>] system_call_after_swapgs+0x7b/0x80

Admittedly I don't understand all the code, but James, can you let me
know if this solves the problem?  I don't see this issue on my machine
and I don't know what opening a file with 'special' means.

/*
 * Note that while the flag value (low two bits) for sys_open means:
 *      00 - read-only
 *      01 - write-only
 *      10 - read-write
 *      11 - special
 * it is changed into
 *      00 - no permissions needed
 *      01 - read-permission
 *      10 - write-permission
 *      11 - read-write
 * for the internal routines (ie open_namei()/follow_link() etc). 00 is
 * used by symlinks.
 */

I noticed that the conversion of flags to f_mode in __dentry_open()
handles things a bit differently than do_filp_open().  This makes the
__dentry_open() handling like do_filp_open() so that 'special' gets
turned into RW instead of no permissions.

Time to go figure out what the heck 'special' means....

-Eric

---

diff --git a/fs/open.c b/fs/open.c
index 5419853..04a8efa 100644
--- a/fs/open.c
+++ b/fs/open.c
@@ -736,10 +736,15 @@ static struct file *__dentry_open(struct dentry *dentry, struct vfsmount *mnt,
 {
 	struct inode *inode;
 	int error;
+	mode_t f_mode;
+
+	if ((flags+1) & O_ACCMODE)
+		f_mode = (flags+1) & O_ACCMODE;
+	else
+		f_mode = flags & O_ACCMODE;
 
 	f->f_flags = flags;
-	f->f_mode = ((flags+1) & O_ACCMODE) | FMODE_LSEEK |
-				FMODE_PREAD | FMODE_PWRITE;
+	f->f_mode = f_mode | FMODE_LSEEK | FMODE_PREAD | FMODE_PWRITE;
 	inode = dentry->d_inode;
 	if (f->f_mode & FMODE_WRITE) {
 		error = get_write_access(inode);



--
This message was distributed to subscribers of the selinux mailing list.
If you no longer wish to subscribe, send mail to majordomo@xxxxxxxxxxxxx with
the words "unsubscribe selinux" without quotes as the message.

[Index of Archives]     [Selinux Refpolicy]     [Linux SGX]     [Fedora Users]     [Fedora Desktop]     [Yosemite Photos]     [Yosemite Camping]     [Yosemite Campsites]     [KDE Users]     [Gnome Users]

  Powered by Linux