Skip to content

Commit

Permalink
hfsplus: use xattr handlers for removexattr
Browse files Browse the repository at this point in the history
hfsplus was already using the handlers for get and set operations,
and with the removal of can_set_xattr we've now allow operations that
wouldn't otherwise be allowed.

With this we can also centralize the special-casing of the osx.
attrs that don't have prefixes on disk in the osx xattr handlers.

Signed-off-by: Christoph Hellwig <[email protected]>
Signed-off-by: Al Viro <[email protected]>
  • Loading branch information
Christoph Hellwig authored and Al Viro committed Jan 31, 2014
1 parent e5fbf67 commit b168fff
Show file tree
Hide file tree
Showing 4 changed files with 19 additions and 47 deletions.
2 changes: 1 addition & 1 deletion fs/hfsplus/dir.c
Original file line number Diff line number Diff line change
Expand Up @@ -529,7 +529,7 @@ const struct inode_operations hfsplus_dir_inode_operations = {
.setxattr = generic_setxattr,
.getxattr = generic_getxattr,
.listxattr = hfsplus_listxattr,
.removexattr = hfsplus_removexattr,
.removexattr = generic_removexattr,
#ifdef CONFIG_HFSPLUS_FS_POSIX_ACL
.get_acl = hfsplus_get_posix_acl,
.set_acl = hfsplus_set_posix_acl,
Expand Down
2 changes: 1 addition & 1 deletion fs/hfsplus/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -331,7 +331,7 @@ static const struct inode_operations hfsplus_file_inode_operations = {
.setxattr = generic_setxattr,
.getxattr = generic_getxattr,
.listxattr = hfsplus_listxattr,
.removexattr = hfsplus_removexattr,
.removexattr = generic_removexattr,
#ifdef CONFIG_HFSPLUS_FS_POSIX_ACL
.get_acl = hfsplus_get_posix_acl,
.set_acl = hfsplus_set_posix_acl,
Expand Down
60 changes: 17 additions & 43 deletions fs/hfsplus/xattr.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
#include "xattr.h"
#include "acl.h"

static int hfsplus_removexattr(struct inode *inode, const char *name);

const struct xattr_handler *hfsplus_xattr_handlers[] = {
&hfsplus_xattr_osx_handler,
&hfsplus_xattr_user_handler,
Expand Down Expand Up @@ -274,14 +276,8 @@ int __hfsplus_setxattr(struct inode *inode, const char *name,
HFSPLUS_IS_RSRC(inode))
return -EOPNOTSUPP;

if (strncmp(name, XATTR_MAC_OSX_PREFIX,
XATTR_MAC_OSX_PREFIX_LEN) == 0)
name += XATTR_MAC_OSX_PREFIX_LEN;

if (value == NULL) {
value = "";
size = 0;
}
if (value == NULL)
return hfsplus_removexattr(inode, name);

err = hfs_find_init(HFSPLUS_SB(inode->i_sb)->cat_tree, &cat_fd);
if (err) {
Expand Down Expand Up @@ -399,16 +395,11 @@ int __hfsplus_setxattr(struct inode *inode, const char *name,
return err;
}

static inline int is_osx_xattr(const char *xattr_name)
{
return !is_known_namespace(xattr_name);
}

static int name_len(const char *xattr_name, int xattr_name_len)
{
int len = xattr_name_len + 1;

if (is_osx_xattr(xattr_name))
if (!is_known_namespace(xattr_name))
len += XATTR_MAC_OSX_PREFIX_LEN;

return len;
Expand All @@ -419,7 +410,7 @@ static int copy_name(char *buffer, const char *xattr_name, int name_len)
int len = name_len;
int offset = 0;

if (is_osx_xattr(xattr_name)) {
if (!is_known_namespace(xattr_name)) {
strncpy(buffer, XATTR_MAC_OSX_PREFIX, XATTR_MAC_OSX_PREFIX_LEN);
offset += XATTR_MAC_OSX_PREFIX_LEN;
len += XATTR_MAC_OSX_PREFIX_LEN;
Expand Down Expand Up @@ -497,18 +488,6 @@ ssize_t __hfsplus_getxattr(struct inode *inode, const char *name,
HFSPLUS_IS_RSRC(inode))
return -EOPNOTSUPP;

if (strncmp(name, XATTR_MAC_OSX_PREFIX,
XATTR_MAC_OSX_PREFIX_LEN) == 0) {
/* skip "osx." prefix */
name += XATTR_MAC_OSX_PREFIX_LEN;
/*
* Don't allow retrieving properly prefixed attributes
* by prepending them with "osx."
*/
if (is_known_namespace(name))
return -EOPNOTSUPP;
}

if (!strcmp_xattr_finder_info(name))
return hfsplus_getxattr_finder_info(inode, value, size);

Expand Down Expand Up @@ -743,28 +722,18 @@ ssize_t hfsplus_listxattr(struct dentry *dentry, char *buffer, size_t size)
return res;
}

int hfsplus_removexattr(struct dentry *dentry, const char *name)
static int hfsplus_removexattr(struct inode *inode, const char *name)
{
int err = 0;
struct inode *inode = dentry->d_inode;
struct hfs_find_data cat_fd;
u16 flags;
u16 cat_entry_type;
int is_xattr_acl_deleted = 0;
int is_all_xattrs_deleted = 0;

if ((!S_ISREG(inode->i_mode) &&
!S_ISDIR(inode->i_mode)) ||
HFSPLUS_IS_RSRC(inode))
return -EOPNOTSUPP;

if (!HFSPLUS_SB(inode->i_sb)->attr_tree)
return -EOPNOTSUPP;

if (strncmp(name, XATTR_MAC_OSX_PREFIX,
XATTR_MAC_OSX_PREFIX_LEN) == 0)
name += XATTR_MAC_OSX_PREFIX_LEN;

if (!strcmp_xattr_finder_info(name))
return -EOPNOTSUPP;

Expand Down Expand Up @@ -838,8 +807,12 @@ static int hfsplus_osx_getxattr(struct dentry *dentry, const char *name,
if (len > HFSPLUS_ATTR_MAX_STRLEN)
return -EOPNOTSUPP;

strcpy(xattr_name, XATTR_MAC_OSX_PREFIX);
strcpy(xattr_name + XATTR_MAC_OSX_PREFIX_LEN, name);
/*
* Don't allow retrieving properly prefixed attributes
* by prepending them with "osx."
*/
if (is_known_namespace(name))
return -EOPNOTSUPP;

return hfsplus_getxattr(dentry, xattr_name, buffer, size);
}
Expand All @@ -857,12 +830,13 @@ static int hfsplus_osx_setxattr(struct dentry *dentry, const char *name,
if (len > HFSPLUS_ATTR_MAX_STRLEN)
return -EOPNOTSUPP;

/*
* Don't allow setting properly prefixed attributes
* by prepending them with "osx."
*/
if (is_known_namespace(name))
return -EOPNOTSUPP;

strcpy(xattr_name, XATTR_MAC_OSX_PREFIX);
strcpy(xattr_name + XATTR_MAC_OSX_PREFIX_LEN, name);

return hfsplus_setxattr(dentry, xattr_name, buffer, size, flags);
}

Expand Down
2 changes: 0 additions & 2 deletions fs/hfsplus/xattr.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,6 @@ static inline ssize_t hfsplus_getxattr(struct dentry *dentry,

ssize_t hfsplus_listxattr(struct dentry *dentry, char *buffer, size_t size);

int hfsplus_removexattr(struct dentry *dentry, const char *name);

int hfsplus_init_security(struct inode *inode, struct inode *dir,
const struct qstr *qstr);

Expand Down

0 comments on commit b168fff

Please sign in to comment.