aboutsummaryrefslogtreecommitdiffstats
path: root/fs/open.c
diff options
context:
space:
mode:
authorTetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>2009-10-04 08:49:47 -0400
committerJames Morris <jmorris@namei.org>2009-10-11 19:56:00 -0400
commit89eda06837094ce9f34fae269b8773fcfd70f046 (patch)
treedc11701c68ebcc8346d7567cfb53b9c7327ef445 /fs/open.c
parent941fc5b2bf8f7dd1d0a9c502e152fa719ff6578e (diff)
LSM: Add security_path_chmod() and security_path_chown().
This patch allows pathname based LSM modules to check chmod()/chown() operations. Since notify_change() does not receive "struct vfsmount *", we add security_path_chmod() and security_path_chown() to the caller of notify_change(). These hooks are used by TOMOYO. Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp> Signed-off-by: James Morris <jmorris@namei.org>
Diffstat (limited to 'fs/open.c')
-rw-r--r--fs/open.c24
1 files changed, 20 insertions, 4 deletions
diff --git a/fs/open.c b/fs/open.c
index 4f01e06227c6..b5c294d35bd1 100644
--- a/fs/open.c
+++ b/fs/open.c
@@ -616,6 +616,9 @@ SYSCALL_DEFINE2(fchmod, unsigned int, fd, mode_t, mode)
616 err = mnt_want_write_file(file); 616 err = mnt_want_write_file(file);
617 if (err) 617 if (err)
618 goto out_putf; 618 goto out_putf;
619 err = security_path_chmod(dentry, file->f_vfsmnt, mode);
620 if (err)
621 goto out_drop_write;
619 mutex_lock(&inode->i_mutex); 622 mutex_lock(&inode->i_mutex);
620 if (mode == (mode_t) -1) 623 if (mode == (mode_t) -1)
621 mode = inode->i_mode; 624 mode = inode->i_mode;
@@ -623,6 +626,7 @@ SYSCALL_DEFINE2(fchmod, unsigned int, fd, mode_t, mode)
623 newattrs.ia_valid = ATTR_MODE | ATTR_CTIME; 626 newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
624 err = notify_change(dentry, &newattrs); 627 err = notify_change(dentry, &newattrs);
625 mutex_unlock(&inode->i_mutex); 628 mutex_unlock(&inode->i_mutex);
629out_drop_write:
626 mnt_drop_write(file->f_path.mnt); 630 mnt_drop_write(file->f_path.mnt);
627out_putf: 631out_putf:
628 fput(file); 632 fput(file);
@@ -645,6 +649,9 @@ SYSCALL_DEFINE3(fchmodat, int, dfd, const char __user *, filename, mode_t, mode)
645 error = mnt_want_write(path.mnt); 649 error = mnt_want_write(path.mnt);
646 if (error) 650 if (error)
647 goto dput_and_out; 651 goto dput_and_out;
652 error = security_path_chmod(path.dentry, path.mnt, mode);
653 if (error)
654 goto out_drop_write;
648 mutex_lock(&inode->i_mutex); 655 mutex_lock(&inode->i_mutex);
649 if (mode == (mode_t) -1) 656 if (mode == (mode_t) -1)
650 mode = inode->i_mode; 657 mode = inode->i_mode;
@@ -652,6 +659,7 @@ SYSCALL_DEFINE3(fchmodat, int, dfd, const char __user *, filename, mode_t, mode)
652 newattrs.ia_valid = ATTR_MODE | ATTR_CTIME; 659 newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
653 error = notify_change(path.dentry, &newattrs); 660 error = notify_change(path.dentry, &newattrs);
654 mutex_unlock(&inode->i_mutex); 661 mutex_unlock(&inode->i_mutex);
662out_drop_write:
655 mnt_drop_write(path.mnt); 663 mnt_drop_write(path.mnt);
656dput_and_out: 664dput_and_out:
657 path_put(&path); 665 path_put(&path);
@@ -700,7 +708,9 @@ SYSCALL_DEFINE3(chown, const char __user *, filename, uid_t, user, gid_t, group)
700 error = mnt_want_write(path.mnt); 708 error = mnt_want_write(path.mnt);
701 if (error) 709 if (error)
702 goto out_release; 710 goto out_release;
703 error = chown_common(path.dentry, user, group); 711 error = security_path_chown(&path, user, group);
712 if (!error)
713 error = chown_common(path.dentry, user, group);
704 mnt_drop_write(path.mnt); 714 mnt_drop_write(path.mnt);
705out_release: 715out_release:
706 path_put(&path); 716 path_put(&path);
@@ -725,7 +735,9 @@ SYSCALL_DEFINE5(fchownat, int, dfd, const char __user *, filename, uid_t, user,
725 error = mnt_want_write(path.mnt); 735 error = mnt_want_write(path.mnt);
726 if (error) 736 if (error)
727 goto out_release; 737 goto out_release;
728 error = chown_common(path.dentry, user, group); 738 error = security_path_chown(&path, user, group);
739 if (!error)
740 error = chown_common(path.dentry, user, group);
729 mnt_drop_write(path.mnt); 741 mnt_drop_write(path.mnt);
730out_release: 742out_release:
731 path_put(&path); 743 path_put(&path);
@@ -744,7 +756,9 @@ SYSCALL_DEFINE3(lchown, const char __user *, filename, uid_t, user, gid_t, group
744 error = mnt_want_write(path.mnt); 756 error = mnt_want_write(path.mnt);
745 if (error) 757 if (error)
746 goto out_release; 758 goto out_release;
747 error = chown_common(path.dentry, user, group); 759 error = security_path_chown(&path, user, group);
760 if (!error)
761 error = chown_common(path.dentry, user, group);
748 mnt_drop_write(path.mnt); 762 mnt_drop_write(path.mnt);
749out_release: 763out_release:
750 path_put(&path); 764 path_put(&path);
@@ -767,7 +781,9 @@ SYSCALL_DEFINE3(fchown, unsigned int, fd, uid_t, user, gid_t, group)
767 goto out_fput; 781 goto out_fput;
768 dentry = file->f_path.dentry; 782 dentry = file->f_path.dentry;
769 audit_inode(NULL, dentry); 783 audit_inode(NULL, dentry);
770 error = chown_common(dentry, user, group); 784 error = security_path_chown(&file->f_path, user, group);
785 if (!error)
786 error = chown_common(dentry, user, group);
771 mnt_drop_write(file->f_path.mnt); 787 mnt_drop_write(file->f_path.mnt);
772out_fput: 788out_fput:
773 fput(file); 789 fput(file);