if (err)
goto end_setxattr;
err = hfsplus_create_attr(inode, name, value, size);
- if (err)
+ if (err) {
+ hfs_dbg("unable to store value: err %d\n", err);
goto end_setxattr;
+ }
} else {
if (flags & XATTR_REPLACE) {
pr_err("cannot replace xattr\n");
goto end_setxattr;
}
err = hfsplus_create_attr(inode, name, value, size);
- if (err)
+ if (err) {
+ hfs_dbg("unable to store value: err %d\n", err);
goto end_setxattr;
+ }
}
cat_entry_type = hfs_bnode_read_u16(cat_fd.bnode, cat_fd.entryoffset);
return err;
}
-static int name_len(const char *xattr_name, int xattr_name_len)
+static size_t name_len(const char *xattr_name, size_t xattr_name_len)
{
- int len = xattr_name_len + 1;
+ size_t len = xattr_name_len + 1;
if (!is_known_namespace(xattr_name))
len += XATTR_MAC_OSX_PREFIX_LEN;
return len;
}
-static ssize_t copy_name(char *buffer, const char *xattr_name, int name_len)
+static ssize_t copy_name(char *buffer, const char *xattr_name, size_t name_len)
{
ssize_t len;
- if (!is_known_namespace(xattr_name))
+ memset(buffer, 0, name_len);
+
+ if (!is_known_namespace(xattr_name)) {
len = scnprintf(buffer, name_len + XATTR_MAC_OSX_PREFIX_LEN,
"%s%s", XATTR_MAC_OSX_PREFIX, xattr_name);
- else
+ } else {
len = strscpy(buffer, xattr_name, name_len + 1);
+ if (len < 0) {
+ pr_err("fail to copy name: err %zd\n", len);
+ len = 0;
+ }
+ }
/* include NUL-byte in length for non-empty name */
if (len >= 0)
const char *prefix, size_t prefixlen)
{
char *xattr_name;
+ size_t xattr_name_len =
+ NLS_MAX_CHARSET_SIZE * HFSPLUS_ATTR_MAX_STRLEN + 1;
int res;
- xattr_name = kmalloc(NLS_MAX_CHARSET_SIZE * HFSPLUS_ATTR_MAX_STRLEN + 1,
- GFP_KERNEL);
+ hfs_dbg("ino %lu, name %s, prefix %s, prefixlen %zu, "
+ "value %p, size %zu\n",
+ inode->i_ino, name ? name : NULL,
+ prefix ? prefix : NULL, prefixlen,
+ value, size);
+
+ xattr_name = kmalloc(xattr_name_len, GFP_KERNEL);
if (!xattr_name)
return -ENOMEM;
strcpy(xattr_name, prefix);
strcpy(xattr_name + prefixlen, name);
res = __hfsplus_setxattr(inode, xattr_name, value, size, flags);
kfree(xattr_name);
+
+ hfs_dbg("finished: res %d\n", res);
+
return res;
}
int res;
char *xattr_name;
+ hfs_dbg("ino %lu, name %s, prefix %s\n",
+ inode->i_ino, name ? name : NULL,
+ prefix ? prefix : NULL);
+
xattr_name = kmalloc(NLS_MAX_CHARSET_SIZE * HFSPLUS_ATTR_MAX_STRLEN + 1,
GFP_KERNEL);
if (!xattr_name)
res = __hfsplus_getxattr(inode, xattr_name, value, size);
kfree(xattr_name);
+
+ hfs_dbg("finished: res %d\n", res);
+
return res;
}
struct hfs_find_data fd;
struct hfsplus_attr_key attr_key;
char *strbuf;
+ size_t strbuf_size;
int xattr_name_len;
+ hfs_dbg("ino %lu\n", inode->i_ino);
+
if ((!S_ISREG(inode->i_mode) &&
!S_ISDIR(inode->i_mode)) ||
HFSPLUS_IS_RSRC(inode))
return err;
}
- strbuf = kzalloc(NLS_MAX_CHARSET_SIZE * HFSPLUS_ATTR_MAX_STRLEN +
- XATTR_MAC_OSX_PREFIX_LEN + 1, GFP_KERNEL);
+ strbuf_size = NLS_MAX_CHARSET_SIZE * HFSPLUS_ATTR_MAX_STRLEN +
+ XATTR_MAC_OSX_PREFIX_LEN + 1;
+ strbuf = kzalloc(strbuf_size, GFP_KERNEL);
if (!strbuf) {
res = -ENOMEM;
goto out;
res += name_len(strbuf, xattr_name_len);
} else if (can_list(strbuf)) {
if (size < (res + name_len(strbuf, xattr_name_len))) {
+ pr_err("size %zu, res %zd, name_len %zu\n",
+ size, res,
+ name_len(strbuf, xattr_name_len));
res = -ERANGE;
goto end_listxattr;
} else
strbuf, xattr_name_len);
}
+ memset(fd.key->attr.key_name.unicode, 0,
+ sizeof(fd.key->attr.key_name.unicode));
+ memset(strbuf, 0, strbuf_size);
+
if (hfs_brec_goto(&fd, 1))
goto end_listxattr;
}
kfree(strbuf);
out:
hfs_find_exit(&fd);
+
+ hfs_dbg("finished: res %zd\n", res);
+
return res;
}
int is_xattr_acl_deleted;
int is_all_xattrs_deleted;
+ hfs_dbg("ino %lu, name %s\n",
+ inode->i_ino, name ? name : NULL);
+
if (!HFSPLUS_SB(inode->i_sb)->attr_tree)
return -EOPNOTSUPP;
end_removexattr:
hfs_find_exit(&cat_fd);
+
+ hfs_dbg("finished: err %d\n", err);
+
return err;
}