aboutsummaryrefslogtreecommitdiffstats
path: root/fs/jfs/xattr.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/jfs/xattr.c')
-rw-r--r--fs/jfs/xattr.c67
1 files changed, 10 insertions, 57 deletions
diff --git a/fs/jfs/xattr.c b/fs/jfs/xattr.c
index 23aa5066b5a4..f23048f9471f 100644
--- a/fs/jfs/xattr.c
+++ b/fs/jfs/xattr.c
@@ -17,6 +17,7 @@
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 */ 18 */
19 19
20#include <linux/capability.h>
20#include <linux/fs.h> 21#include <linux/fs.h>
21#include <linux/xattr.h> 22#include <linux/xattr.h>
22#include <linux/posix_acl_xattr.h> 23#include <linux/posix_acl_xattr.h>
@@ -83,21 +84,6 @@ struct ea_buffer {
83#define EA_NEW 0x0004 84#define EA_NEW 0x0004
84#define EA_MALLOC 0x0008 85#define EA_MALLOC 0x0008
85 86
86/* Namespaces */
87#define XATTR_SYSTEM_PREFIX "system."
88#define XATTR_SYSTEM_PREFIX_LEN (sizeof (XATTR_SYSTEM_PREFIX) - 1)
89
90#define XATTR_USER_PREFIX "user."
91#define XATTR_USER_PREFIX_LEN (sizeof (XATTR_USER_PREFIX) - 1)
92
93#define XATTR_OS2_PREFIX "os2."
94#define XATTR_OS2_PREFIX_LEN (sizeof (XATTR_OS2_PREFIX) - 1)
95
96/* XATTR_SECURITY_PREFIX is defined in include/linux/xattr.h */
97#define XATTR_SECURITY_PREFIX_LEN (sizeof (XATTR_SECURITY_PREFIX) - 1)
98
99#define XATTR_TRUSTED_PREFIX "trusted."
100#define XATTR_TRUSTED_PREFIX_LEN (sizeof (XATTR_TRUSTED_PREFIX) - 1)
101 87
102/* 88/*
103 * These three routines are used to recognize on-disk extended attributes 89 * These three routines are used to recognize on-disk extended attributes
@@ -773,36 +759,23 @@ static int can_set_system_xattr(struct inode *inode, const char *name,
773static int can_set_xattr(struct inode *inode, const char *name, 759static int can_set_xattr(struct inode *inode, const char *name,
774 const void *value, size_t value_len) 760 const void *value, size_t value_len)
775{ 761{
776 if (IS_RDONLY(inode)) 762 if (!strncmp(name, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN))
777 return -EROFS;
778
779 if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
780 return -EPERM;
781
782 if(strncmp(name, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN) == 0)
783 /*
784 * "system.*"
785 */
786 return can_set_system_xattr(inode, name, value, value_len); 763 return can_set_system_xattr(inode, name, value, value_len);
787 764
788 if(strncmp(name, XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN) == 0) 765 /*
789 return (capable(CAP_SYS_ADMIN) ? 0 : -EPERM); 766 * Don't allow setting an attribute in an unknown namespace.
790 767 */
791#ifdef CONFIG_JFS_SECURITY 768 if (strncmp(name, XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN) &&
792 if (strncmp(name, XATTR_SECURITY_PREFIX, XATTR_SECURITY_PREFIX_LEN) 769 strncmp(name, XATTR_SECURITY_PREFIX, XATTR_SECURITY_PREFIX_LEN) &&
793 == 0) 770 strncmp(name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN) &&
794 return 0; /* Leave it to the security module */ 771 strncmp(name, XATTR_OS2_PREFIX, XATTR_OS2_PREFIX_LEN))
795#endif
796
797 if((strncmp(name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN) != 0) &&
798 (strncmp(name, XATTR_OS2_PREFIX, XATTR_OS2_PREFIX_LEN) != 0))
799 return -EOPNOTSUPP; 772 return -EOPNOTSUPP;
800 773
801 if (!S_ISREG(inode->i_mode) && 774 if (!S_ISREG(inode->i_mode) &&
802 (!S_ISDIR(inode->i_mode) || inode->i_mode &S_ISVTX)) 775 (!S_ISDIR(inode->i_mode) || inode->i_mode &S_ISVTX))
803 return -EPERM; 776 return -EPERM;
804 777
805 return permission(inode, MAY_WRITE, NULL); 778 return 0;
806} 779}
807 780
808int __jfs_setxattr(tid_t tid, struct inode *inode, const char *name, 781int __jfs_setxattr(tid_t tid, struct inode *inode, const char *name,
@@ -972,22 +945,6 @@ int jfs_setxattr(struct dentry *dentry, const char *name, const void *value,
972 return rc; 945 return rc;
973} 946}
974 947
975static int can_get_xattr(struct inode *inode, const char *name)
976{
977#ifdef CONFIG_JFS_SECURITY
978 if(strncmp(name, XATTR_SECURITY_PREFIX, XATTR_SECURITY_PREFIX_LEN) == 0)
979 return 0;
980#endif
981
982 if(strncmp(name, XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN) == 0)
983 return (capable(CAP_SYS_ADMIN) ? 0 : -EPERM);
984
985 if(strncmp(name, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN) == 0)
986 return 0;
987
988 return permission(inode, MAY_READ, NULL);
989}
990
991ssize_t __jfs_getxattr(struct inode *inode, const char *name, void *data, 948ssize_t __jfs_getxattr(struct inode *inode, const char *name, void *data,
992 size_t buf_size) 949 size_t buf_size)
993{ 950{
@@ -998,12 +955,8 @@ ssize_t __jfs_getxattr(struct inode *inode, const char *name, void *data,
998 ssize_t size; 955 ssize_t size;
999 int namelen = strlen(name); 956 int namelen = strlen(name);
1000 char *os2name = NULL; 957 char *os2name = NULL;
1001 int rc;
1002 char *value; 958 char *value;
1003 959
1004 if ((rc = can_get_xattr(inode, name)))
1005 return rc;
1006
1007 if (strncmp(name, XATTR_OS2_PREFIX, XATTR_OS2_PREFIX_LEN) == 0) { 960 if (strncmp(name, XATTR_OS2_PREFIX, XATTR_OS2_PREFIX_LEN) == 0) {
1008 os2name = kmalloc(namelen - XATTR_OS2_PREFIX_LEN + 1, 961 os2name = kmalloc(namelen - XATTR_OS2_PREFIX_LEN + 1,
1009 GFP_KERNEL); 962 GFP_KERNEL);