diff options
| author | Dave Hansen <haveblue@us.ibm.com> | 2008-02-15 17:37:39 -0500 |
|---|---|---|
| committer | Al Viro <viro@zeniv.linux.org.uk> | 2008-04-19 00:29:23 -0400 |
| commit | a761a1c03a739f04afd6c8d37fd16405bbe754da (patch) | |
| tree | 004d789354828b582654369a55e480fea46369af /fs/ncpfs | |
| parent | 18f335aff86913de3c76f88d32c8135c1da62ce6 (diff) | |
[PATCH] r/o bind mounts: elevate write count for ncp_ioctl()
Acked-by: Al Viro <viro@ZenIV.linux.org.uk>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Dave Hansen <haveblue@us.ibm.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/ncpfs')
| -rw-r--r-- | fs/ncpfs/ioctl.c | 54 |
1 files changed, 53 insertions, 1 deletions
diff --git a/fs/ncpfs/ioctl.c b/fs/ncpfs/ioctl.c index c67b4bdcf719..ad8f167e54bc 100644 --- a/fs/ncpfs/ioctl.c +++ b/fs/ncpfs/ioctl.c | |||
| @@ -14,6 +14,7 @@ | |||
| 14 | #include <linux/ioctl.h> | 14 | #include <linux/ioctl.h> |
| 15 | #include <linux/time.h> | 15 | #include <linux/time.h> |
| 16 | #include <linux/mm.h> | 16 | #include <linux/mm.h> |
| 17 | #include <linux/mount.h> | ||
| 17 | #include <linux/highuid.h> | 18 | #include <linux/highuid.h> |
| 18 | #include <linux/smp_lock.h> | 19 | #include <linux/smp_lock.h> |
| 19 | #include <linux/vmalloc.h> | 20 | #include <linux/vmalloc.h> |
| @@ -261,7 +262,7 @@ ncp_get_charsets(struct ncp_server* server, struct ncp_nls_ioctl __user *arg) | |||
| 261 | } | 262 | } |
| 262 | #endif /* CONFIG_NCPFS_NLS */ | 263 | #endif /* CONFIG_NCPFS_NLS */ |
| 263 | 264 | ||
| 264 | int ncp_ioctl(struct inode *inode, struct file *filp, | 265 | static int __ncp_ioctl(struct inode *inode, struct file *filp, |
| 265 | unsigned int cmd, unsigned long arg) | 266 | unsigned int cmd, unsigned long arg) |
| 266 | { | 267 | { |
| 267 | struct ncp_server *server = NCP_SERVER(inode); | 268 | struct ncp_server *server = NCP_SERVER(inode); |
| @@ -822,6 +823,57 @@ outrel: | |||
| 822 | return -EINVAL; | 823 | return -EINVAL; |
| 823 | } | 824 | } |
| 824 | 825 | ||
| 826 | static int ncp_ioctl_need_write(unsigned int cmd) | ||
| 827 | { | ||
| 828 | switch (cmd) { | ||
| 829 | case NCP_IOC_GET_FS_INFO: | ||
| 830 | case NCP_IOC_GET_FS_INFO_V2: | ||
| 831 | case NCP_IOC_NCPREQUEST: | ||
| 832 | case NCP_IOC_SETDENTRYTTL: | ||
| 833 | case NCP_IOC_SIGN_INIT: | ||
| 834 | case NCP_IOC_LOCKUNLOCK: | ||
| 835 | case NCP_IOC_SET_SIGN_WANTED: | ||
| 836 | return 1; | ||
| 837 | case NCP_IOC_GETOBJECTNAME: | ||
| 838 | case NCP_IOC_SETOBJECTNAME: | ||
| 839 | case NCP_IOC_GETPRIVATEDATA: | ||
| 840 | case NCP_IOC_SETPRIVATEDATA: | ||
| 841 | case NCP_IOC_SETCHARSETS: | ||
| 842 | case NCP_IOC_GETCHARSETS: | ||
| 843 | case NCP_IOC_CONN_LOGGED_IN: | ||
| 844 | case NCP_IOC_GETDENTRYTTL: | ||
| 845 | case NCP_IOC_GETMOUNTUID2: | ||
| 846 | case NCP_IOC_SIGN_WANTED: | ||
| 847 | case NCP_IOC_GETROOT: | ||
| 848 | case NCP_IOC_SETROOT: | ||
| 849 | return 0; | ||
| 850 | default: | ||
| 851 | /* unkown IOCTL command, assume write */ | ||
| 852 | return 1; | ||
| 853 | } | ||
| 854 | } | ||
| 855 | |||
| 856 | int ncp_ioctl(struct inode *inode, struct file *filp, | ||
| 857 | unsigned int cmd, unsigned long arg) | ||
| 858 | { | ||
| 859 | int ret; | ||
| 860 | |||
| 861 | if (ncp_ioctl_need_write(cmd)) { | ||
| 862 | /* | ||
| 863 | * inside the ioctl(), any failures which | ||
| 864 | * are because of file_permission() are | ||
| 865 | * -EACCESS, so it seems consistent to keep | ||
| 866 | * that here. | ||
| 867 | */ | ||
| 868 | if (mnt_want_write(filp->f_path.mnt)) | ||
| 869 | return -EACCES; | ||
| 870 | } | ||
| 871 | ret = __ncp_ioctl(inode, filp, cmd, arg); | ||
| 872 | if (ncp_ioctl_need_write(cmd)) | ||
| 873 | mnt_drop_write(filp->f_path.mnt); | ||
| 874 | return ret; | ||
| 875 | } | ||
| 876 | |||
| 825 | #ifdef CONFIG_COMPAT | 877 | #ifdef CONFIG_COMPAT |
| 826 | long ncp_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | 878 | long ncp_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg) |
| 827 | { | 879 | { |
