diff options
Diffstat (limited to 'fs/jfs/xattr.c')
-rw-r--r-- | fs/jfs/xattr.c | 87 |
1 files changed, 38 insertions, 49 deletions
diff --git a/fs/jfs/xattr.c b/fs/jfs/xattr.c index fa96bbb26343..2d7f165d0f1d 100644 --- a/fs/jfs/xattr.c +++ b/fs/jfs/xattr.c | |||
@@ -86,46 +86,25 @@ struct ea_buffer { | |||
86 | #define EA_MALLOC 0x0008 | 86 | #define EA_MALLOC 0x0008 |
87 | 87 | ||
88 | 88 | ||
89 | static int is_known_namespace(const char *name) | ||
90 | { | ||
91 | if (strncmp(name, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN) && | ||
92 | strncmp(name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN) && | ||
93 | strncmp(name, XATTR_SECURITY_PREFIX, XATTR_SECURITY_PREFIX_LEN) && | ||
94 | strncmp(name, XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN)) | ||
95 | return false; | ||
96 | |||
97 | return true; | ||
98 | } | ||
99 | |||
89 | /* | 100 | /* |
90 | * These three routines are used to recognize on-disk extended attributes | 101 | * These three routines are used to recognize on-disk extended attributes |
91 | * that are in a recognized namespace. If the attribute is not recognized, | 102 | * that are in a recognized namespace. If the attribute is not recognized, |
92 | * "os2." is prepended to the name | 103 | * "os2." is prepended to the name |
93 | */ | 104 | */ |
94 | static inline int is_os2_xattr(struct jfs_ea *ea) | 105 | static int is_os2_xattr(struct jfs_ea *ea) |
95 | { | 106 | { |
96 | /* | 107 | return !is_known_namespace(ea->name); |
97 | * Check for "system." | ||
98 | */ | ||
99 | if ((ea->namelen >= XATTR_SYSTEM_PREFIX_LEN) && | ||
100 | !strncmp(ea->name, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN)) | ||
101 | return false; | ||
102 | /* | ||
103 | * Check for "user." | ||
104 | */ | ||
105 | if ((ea->namelen >= XATTR_USER_PREFIX_LEN) && | ||
106 | !strncmp(ea->name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN)) | ||
107 | return false; | ||
108 | /* | ||
109 | * Check for "security." | ||
110 | */ | ||
111 | if ((ea->namelen >= XATTR_SECURITY_PREFIX_LEN) && | ||
112 | !strncmp(ea->name, XATTR_SECURITY_PREFIX, | ||
113 | XATTR_SECURITY_PREFIX_LEN)) | ||
114 | return false; | ||
115 | /* | ||
116 | * Check for "trusted." | ||
117 | */ | ||
118 | if ((ea->namelen >= XATTR_TRUSTED_PREFIX_LEN) && | ||
119 | !strncmp(ea->name, XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN)) | ||
120 | return false; | ||
121 | /* | ||
122 | * Add any other valid namespace prefixes here | ||
123 | */ | ||
124 | |||
125 | /* | ||
126 | * We assume it's OS/2's flat namespace | ||
127 | */ | ||
128 | return true; | ||
129 | } | 108 | } |
130 | 109 | ||
131 | static inline int name_size(struct jfs_ea *ea) | 110 | static inline int name_size(struct jfs_ea *ea) |
@@ -764,13 +743,23 @@ static int can_set_xattr(struct inode *inode, const char *name, | |||
764 | if (!strncmp(name, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN)) | 743 | if (!strncmp(name, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN)) |
765 | return can_set_system_xattr(inode, name, value, value_len); | 744 | return can_set_system_xattr(inode, name, value, value_len); |
766 | 745 | ||
746 | if (!strncmp(name, XATTR_OS2_PREFIX, XATTR_OS2_PREFIX_LEN)) { | ||
747 | /* | ||
748 | * This makes sure that we aren't trying to set an | ||
749 | * attribute in a different namespace by prefixing it | ||
750 | * with "os2." | ||
751 | */ | ||
752 | if (is_known_namespace(name + XATTR_OS2_PREFIX_LEN)) | ||
753 | return -EOPNOTSUPP; | ||
754 | return 0; | ||
755 | } | ||
756 | |||
767 | /* | 757 | /* |
768 | * Don't allow setting an attribute in an unknown namespace. | 758 | * Don't allow setting an attribute in an unknown namespace. |
769 | */ | 759 | */ |
770 | if (strncmp(name, XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN) && | 760 | if (strncmp(name, XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN) && |
771 | strncmp(name, XATTR_SECURITY_PREFIX, XATTR_SECURITY_PREFIX_LEN) && | 761 | strncmp(name, XATTR_SECURITY_PREFIX, XATTR_SECURITY_PREFIX_LEN) && |
772 | strncmp(name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN) && | 762 | strncmp(name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN)) |
773 | strncmp(name, XATTR_OS2_PREFIX, XATTR_OS2_PREFIX_LEN)) | ||
774 | return -EOPNOTSUPP; | 763 | return -EOPNOTSUPP; |
775 | 764 | ||
776 | return 0; | 765 | return 0; |
@@ -952,19 +941,8 @@ ssize_t __jfs_getxattr(struct inode *inode, const char *name, void *data, | |||
952 | int xattr_size; | 941 | int xattr_size; |
953 | ssize_t size; | 942 | ssize_t size; |
954 | int namelen = strlen(name); | 943 | int namelen = strlen(name); |
955 | char *os2name = NULL; | ||
956 | char *value; | 944 | char *value; |
957 | 945 | ||
958 | if (strncmp(name, XATTR_OS2_PREFIX, XATTR_OS2_PREFIX_LEN) == 0) { | ||
959 | os2name = kmalloc(namelen - XATTR_OS2_PREFIX_LEN + 1, | ||
960 | GFP_KERNEL); | ||
961 | if (!os2name) | ||
962 | return -ENOMEM; | ||
963 | strcpy(os2name, name + XATTR_OS2_PREFIX_LEN); | ||
964 | name = os2name; | ||
965 | namelen -= XATTR_OS2_PREFIX_LEN; | ||
966 | } | ||
967 | |||
968 | down_read(&JFS_IP(inode)->xattr_sem); | 946 | down_read(&JFS_IP(inode)->xattr_sem); |
969 | 947 | ||
970 | xattr_size = ea_get(inode, &ea_buf, 0); | 948 | xattr_size = ea_get(inode, &ea_buf, 0); |
@@ -1002,8 +980,6 @@ ssize_t __jfs_getxattr(struct inode *inode, const char *name, void *data, | |||
1002 | out: | 980 | out: |
1003 | up_read(&JFS_IP(inode)->xattr_sem); | 981 | up_read(&JFS_IP(inode)->xattr_sem); |
1004 | 982 | ||
1005 | kfree(os2name); | ||
1006 | |||
1007 | return size; | 983 | return size; |
1008 | } | 984 | } |
1009 | 985 | ||
@@ -1012,6 +988,19 @@ ssize_t jfs_getxattr(struct dentry *dentry, const char *name, void *data, | |||
1012 | { | 988 | { |
1013 | int err; | 989 | int err; |
1014 | 990 | ||
991 | if (strncmp(name, XATTR_OS2_PREFIX, XATTR_OS2_PREFIX_LEN) == 0) { | ||
992 | /* | ||
993 | * skip past "os2." prefix | ||
994 | */ | ||
995 | name += XATTR_OS2_PREFIX_LEN; | ||
996 | /* | ||
997 | * Don't allow retrieving properly prefixed attributes | ||
998 | * by prepending them with "os2." | ||
999 | */ | ||
1000 | if (is_known_namespace(name)) | ||
1001 | return -EOPNOTSUPP; | ||
1002 | } | ||
1003 | |||
1015 | err = __jfs_getxattr(dentry->d_inode, name, data, buf_size); | 1004 | err = __jfs_getxattr(dentry->d_inode, name, data, buf_size); |
1016 | 1005 | ||
1017 | return err; | 1006 | return err; |