aboutsummaryrefslogtreecommitdiffstats
path: root/fs/hfsplus
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@infradead.org>2013-12-20 08:16:56 -0500
committerAl Viro <viro@zeniv.linux.org.uk>2014-01-26 08:26:41 -0500
commit2796e4cec525a2b1cace3b29b2f02735dafea007 (patch)
tree6cc2b0054c4f002798afda4bf48a126bf495a68e /fs/hfsplus
parent4ac7249ea5a0ceef9f8269f63f33cc873c3fac61 (diff)
hfsplus: remove can_set_xattr
When using the per-superblock xattr handlers permission checking is done by the generic code. hfsplus just needs to check for the magic osx attribute not to leak into protected namespaces. Also given that the code was obviously copied from JFS the proper attribution was missing. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/hfsplus')
-rw-r--r--fs/hfsplus/xattr.c87
1 files changed, 3 insertions, 84 deletions
diff --git a/fs/hfsplus/xattr.c b/fs/hfsplus/xattr.c
index bf88baa9bb65..0b4a5c9b93c4 100644
--- a/fs/hfsplus/xattr.c
+++ b/fs/hfsplus/xattr.c
@@ -52,82 +52,6 @@ static inline int is_known_namespace(const char *name)
52 return true; 52 return true;
53} 53}
54 54
55static int can_set_system_xattr(struct inode *inode, const char *name,
56 const void *value, size_t size)
57{
58#ifdef CONFIG_HFSPLUS_FS_POSIX_ACL
59 struct posix_acl *acl;
60 int err;
61
62 if (!inode_owner_or_capable(inode))
63 return -EPERM;
64
65 /*
66 * POSIX_ACL_XATTR_ACCESS is tied to i_mode
67 */
68 if (strcmp(name, POSIX_ACL_XATTR_ACCESS) == 0) {
69 acl = posix_acl_from_xattr(&init_user_ns, value, size);
70 if (IS_ERR(acl))
71 return PTR_ERR(acl);
72 if (acl) {
73 err = posix_acl_equiv_mode(acl, &inode->i_mode);
74 posix_acl_release(acl);
75 if (err < 0)
76 return err;
77 mark_inode_dirty(inode);
78 }
79 /*
80 * We're changing the ACL. Get rid of the cached one
81 */
82 forget_cached_acl(inode, ACL_TYPE_ACCESS);
83
84 return 0;
85 } else if (strcmp(name, POSIX_ACL_XATTR_DEFAULT) == 0) {
86 acl = posix_acl_from_xattr(&init_user_ns, value, size);
87 if (IS_ERR(acl))
88 return PTR_ERR(acl);
89 posix_acl_release(acl);
90
91 /*
92 * We're changing the default ACL. Get rid of the cached one
93 */
94 forget_cached_acl(inode, ACL_TYPE_DEFAULT);
95
96 return 0;
97 }
98#endif /* CONFIG_HFSPLUS_FS_POSIX_ACL */
99 return -EOPNOTSUPP;
100}
101
102static int can_set_xattr(struct inode *inode, const char *name,
103 const void *value, size_t value_len)
104{
105 if (!strncmp(name, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN))
106 return can_set_system_xattr(inode, name, value, value_len);
107
108 if (!strncmp(name, XATTR_MAC_OSX_PREFIX, XATTR_MAC_OSX_PREFIX_LEN)) {
109 /*
110 * This makes sure that we aren't trying to set an
111 * attribute in a different namespace by prefixing it
112 * with "osx."
113 */
114 if (is_known_namespace(name + XATTR_MAC_OSX_PREFIX_LEN))
115 return -EOPNOTSUPP;
116
117 return 0;
118 }
119
120 /*
121 * Don't allow setting an attribute in an unknown namespace.
122 */
123 if (strncmp(name, XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN) &&
124 strncmp(name, XATTR_SECURITY_PREFIX, XATTR_SECURITY_PREFIX_LEN) &&
125 strncmp(name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN))
126 return -EOPNOTSUPP;
127
128 return 0;
129}
130
131static void hfsplus_init_header_node(struct inode *attr_file, 55static void hfsplus_init_header_node(struct inode *attr_file,
132 u32 clump_size, 56 u32 clump_size,
133 char *buf, u16 node_size) 57 char *buf, u16 node_size)
@@ -350,10 +274,6 @@ int __hfsplus_setxattr(struct inode *inode, const char *name,
350 HFSPLUS_IS_RSRC(inode)) 274 HFSPLUS_IS_RSRC(inode))
351 return -EOPNOTSUPP; 275 return -EOPNOTSUPP;
352 276
353 err = can_set_xattr(inode, name, value, size);
354 if (err)
355 return err;
356
357 if (strncmp(name, XATTR_MAC_OSX_PREFIX, 277 if (strncmp(name, XATTR_MAC_OSX_PREFIX,
358 XATTR_MAC_OSX_PREFIX_LEN) == 0) 278 XATTR_MAC_OSX_PREFIX_LEN) == 0)
359 name += XATTR_MAC_OSX_PREFIX_LEN; 279 name += XATTR_MAC_OSX_PREFIX_LEN;
@@ -841,10 +761,6 @@ int hfsplus_removexattr(struct dentry *dentry, const char *name)
841 if (!HFSPLUS_SB(inode->i_sb)->attr_tree) 761 if (!HFSPLUS_SB(inode->i_sb)->attr_tree)
842 return -EOPNOTSUPP; 762 return -EOPNOTSUPP;
843 763
844 err = can_set_xattr(inode, name, NULL, 0);
845 if (err)
846 return err;
847
848 if (strncmp(name, XATTR_MAC_OSX_PREFIX, 764 if (strncmp(name, XATTR_MAC_OSX_PREFIX,
849 XATTR_MAC_OSX_PREFIX_LEN) == 0) 765 XATTR_MAC_OSX_PREFIX_LEN) == 0)
850 name += XATTR_MAC_OSX_PREFIX_LEN; 766 name += XATTR_MAC_OSX_PREFIX_LEN;
@@ -941,6 +857,9 @@ static int hfsplus_osx_setxattr(struct dentry *dentry, const char *name,
941 if (len > HFSPLUS_ATTR_MAX_STRLEN) 857 if (len > HFSPLUS_ATTR_MAX_STRLEN)
942 return -EOPNOTSUPP; 858 return -EOPNOTSUPP;
943 859
860 if (is_known_namespace(name))
861 return -EOPNOTSUPP;
862
944 strcpy(xattr_name, XATTR_MAC_OSX_PREFIX); 863 strcpy(xattr_name, XATTR_MAC_OSX_PREFIX);
945 strcpy(xattr_name + XATTR_MAC_OSX_PREFIX_LEN, name); 864 strcpy(xattr_name + XATTR_MAC_OSX_PREFIX_LEN, name);
946 865