memset(key, 0, sizeof(struct hfsplus_attr_key));
        key->attr.cnid = cpu_to_be32(cnid);
        if (name) {
-               len = strlen(name);
-               if (len > HFSPLUS_ATTR_MAX_STRLEN) {
-                       pr_err("invalid xattr name's length\n");
-                       return -EINVAL;
-               }
-               hfsplus_asc2uni(sb,
+               int res = hfsplus_asc2uni(sb,
                                (struct hfsplus_unistr *)&key->attr.key_name,
-                               HFSPLUS_ATTR_MAX_STRLEN, name, len);
+                               HFSPLUS_ATTR_MAX_STRLEN, name, strlen(name));
+               if (res)
+                       return res;
                len = be16_to_cpu(key->attr.key_name.length);
        } else {
                key->attr.key_name.length = 0;
 
 static int hfsplus_osx_getxattr(struct dentry *dentry, const char *name,
                                        void *buffer, size_t size, int type)
 {
-       char xattr_name[HFSPLUS_ATTR_MAX_STRLEN +
-                               XATTR_MAC_OSX_PREFIX_LEN + 1] = {0};
-       size_t len = strlen(name);
+       char *xattr_name;
+       int res;
 
        if (!strcmp(name, ""))
                return -EINVAL;
 
-       if (len > HFSPLUS_ATTR_MAX_STRLEN)
-               return -EOPNOTSUPP;
-
        /*
         * Don't allow retrieving properly prefixed attributes
         * by prepending them with "osx."
         */
        if (is_known_namespace(name))
                return -EOPNOTSUPP;
+       xattr_name = kmalloc(NLS_MAX_CHARSET_SIZE * HFSPLUS_ATTR_MAX_STRLEN
+               + XATTR_MAC_OSX_PREFIX_LEN + 1, GFP_KERNEL);
+       if (!xattr_name)
+               return -ENOMEM;
+       strcpy(xattr_name, XATTR_MAC_OSX_PREFIX);
+       strcpy(xattr_name + XATTR_MAC_OSX_PREFIX_LEN, name);
 
-       return hfsplus_getxattr(dentry, xattr_name, buffer, size);
+       res = hfsplus_getxattr(dentry, xattr_name, buffer, size);
+       kfree(xattr_name);
+       return res;
 }
 
 static int hfsplus_osx_setxattr(struct dentry *dentry, const char *name,
                const void *buffer, size_t size, int flags, int type)
 {
-       char xattr_name[HFSPLUS_ATTR_MAX_STRLEN +
-                               XATTR_MAC_OSX_PREFIX_LEN + 1] = {0};
-       size_t len = strlen(name);
+       char *xattr_name;
+       int res;
 
        if (!strcmp(name, ""))
                return -EINVAL;
 
-       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;
+       xattr_name = kmalloc(NLS_MAX_CHARSET_SIZE * HFSPLUS_ATTR_MAX_STRLEN
+               + XATTR_MAC_OSX_PREFIX_LEN + 1, GFP_KERNEL);
+       if (!xattr_name)
+               return -ENOMEM;
+       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);
+       res = hfsplus_setxattr(dentry, xattr_name, buffer, size, flags);
+       kfree(xattr_name);
+       return res;
 }
 
 static size_t hfsplus_osx_listxattr(struct dentry *dentry, char *list,
 
  */
 
 #include <linux/security.h>
+#include <linux/nls.h>
+
 #include "hfsplus_fs.h"
 #include "xattr.h"
 #include "acl.h"
 static int hfsplus_security_getxattr(struct dentry *dentry, const char *name,
                                        void *buffer, size_t size, int type)
 {
-       char xattr_name[HFSPLUS_ATTR_MAX_STRLEN + 1] = {0};
-       size_t len = strlen(name);
+       char *xattr_name;
+       int res;
 
        if (!strcmp(name, ""))
                return -EINVAL;
 
-       if (len + XATTR_SECURITY_PREFIX_LEN > HFSPLUS_ATTR_MAX_STRLEN)
-               return -EOPNOTSUPP;
-
+       xattr_name = kmalloc(NLS_MAX_CHARSET_SIZE * HFSPLUS_ATTR_MAX_STRLEN + 1,
+               GFP_KERNEL);
+       if (!xattr_name)
+               return -ENOMEM;
        strcpy(xattr_name, XATTR_SECURITY_PREFIX);
        strcpy(xattr_name + XATTR_SECURITY_PREFIX_LEN, name);
 
-       return hfsplus_getxattr(dentry, xattr_name, buffer, size);
+       res = hfsplus_getxattr(dentry, xattr_name, buffer, size);
+       kfree(xattr_name);
+       return res;
 }
 
 static int hfsplus_security_setxattr(struct dentry *dentry, const char *name,
                const void *buffer, size_t size, int flags, int type)
 {
-       char xattr_name[HFSPLUS_ATTR_MAX_STRLEN + 1] = {0};
-       size_t len = strlen(name);
+       char *xattr_name;
+       int res;
 
        if (!strcmp(name, ""))
                return -EINVAL;
 
-       if (len + XATTR_SECURITY_PREFIX_LEN > HFSPLUS_ATTR_MAX_STRLEN)
-               return -EOPNOTSUPP;
-
+       xattr_name = kmalloc(NLS_MAX_CHARSET_SIZE * HFSPLUS_ATTR_MAX_STRLEN + 1,
+               GFP_KERNEL);
+       if (!xattr_name)
+               return -ENOMEM;
        strcpy(xattr_name, XATTR_SECURITY_PREFIX);
        strcpy(xattr_name + XATTR_SECURITY_PREFIX_LEN, name);
 
-       return hfsplus_setxattr(dentry, xattr_name, buffer, size, flags);
+       res = hfsplus_setxattr(dentry, xattr_name, buffer, size, flags);
+       kfree(xattr_name);
+       return res;
 }
 
 static size_t hfsplus_security_listxattr(struct dentry *dentry, char *list,
                                void *fs_info)
 {
        const struct xattr *xattr;
-       char xattr_name[HFSPLUS_ATTR_MAX_STRLEN + 1] = {0};
-       size_t xattr_name_len;
+       char *xattr_name;
        int err = 0;
 
+       xattr_name = kmalloc(NLS_MAX_CHARSET_SIZE * HFSPLUS_ATTR_MAX_STRLEN + 1,
+               GFP_KERNEL);
+       if (!xattr_name)
+               return -ENOMEM;
        for (xattr = xattr_array; xattr->name != NULL; xattr++) {
-               xattr_name_len = strlen(xattr->name);
 
-               if (xattr_name_len == 0)
+               if (!strcmp(xattr->name, ""))
                        continue;
 
-               if (xattr_name_len + XATTR_SECURITY_PREFIX_LEN >
-                               HFSPLUS_ATTR_MAX_STRLEN)
-                       return -EOPNOTSUPP;
-
                strcpy(xattr_name, XATTR_SECURITY_PREFIX);
                strcpy(xattr_name +
                        XATTR_SECURITY_PREFIX_LEN, xattr->name);
                memset(xattr_name +
-                       XATTR_SECURITY_PREFIX_LEN + xattr_name_len, 0, 1);
+                       XATTR_SECURITY_PREFIX_LEN + strlen(xattr->name), 0, 1);
 
                err = __hfsplus_setxattr(inode, xattr_name,
                                        xattr->value, xattr->value_len, 0);
                if (err)
                        break;
        }
+       kfree(xattr_name);
        return err;
 }
 
 
  * Handler for trusted extended attributes.
  */
 
+#include <linux/nls.h>
+
 #include "hfsplus_fs.h"
 #include "xattr.h"
 
 static int hfsplus_trusted_getxattr(struct dentry *dentry, const char *name,
                                        void *buffer, size_t size, int type)
 {
-       char xattr_name[HFSPLUS_ATTR_MAX_STRLEN + 1] = {0};
-       size_t len = strlen(name);
+       char *xattr_name;
+       int res;
 
        if (!strcmp(name, ""))
                return -EINVAL;
 
-       if (len + XATTR_TRUSTED_PREFIX_LEN > HFSPLUS_ATTR_MAX_STRLEN)
-               return -EOPNOTSUPP;
-
+       xattr_name = kmalloc(NLS_MAX_CHARSET_SIZE * HFSPLUS_ATTR_MAX_STRLEN + 1,
+               GFP_KERNEL);
+       if (!xattr_name)
+               return -ENOMEM;
        strcpy(xattr_name, XATTR_TRUSTED_PREFIX);
        strcpy(xattr_name + XATTR_TRUSTED_PREFIX_LEN, name);
 
-       return hfsplus_getxattr(dentry, xattr_name, buffer, size);
+       res = hfsplus_getxattr(dentry, xattr_name, buffer, size);
+       kfree(xattr_name);
+       return res;
 }
 
 static int hfsplus_trusted_setxattr(struct dentry *dentry, const char *name,
                const void *buffer, size_t size, int flags, int type)
 {
-       char xattr_name[HFSPLUS_ATTR_MAX_STRLEN + 1] = {0};
-       size_t len = strlen(name);
+       char *xattr_name;
+       int res;
 
        if (!strcmp(name, ""))
                return -EINVAL;
 
-       if (len + XATTR_TRUSTED_PREFIX_LEN > HFSPLUS_ATTR_MAX_STRLEN)
-               return -EOPNOTSUPP;
-
+       xattr_name = kmalloc(NLS_MAX_CHARSET_SIZE * HFSPLUS_ATTR_MAX_STRLEN + 1,
+               GFP_KERNEL);
+       if (!xattr_name)
+               return -ENOMEM;
        strcpy(xattr_name, XATTR_TRUSTED_PREFIX);
        strcpy(xattr_name + XATTR_TRUSTED_PREFIX_LEN, name);
 
-       return hfsplus_setxattr(dentry, xattr_name, buffer, size, flags);
+       res = hfsplus_setxattr(dentry, xattr_name, buffer, size, flags);
+       kfree(xattr_name);
+       return res;
 }
 
 static size_t hfsplus_trusted_listxattr(struct dentry *dentry, char *list,
 
  * Handler for user extended attributes.
  */
 
+#include <linux/nls.h>
+
 #include "hfsplus_fs.h"
 #include "xattr.h"
 
 static int hfsplus_user_getxattr(struct dentry *dentry, const char *name,
                                        void *buffer, size_t size, int type)
 {
-       char xattr_name[HFSPLUS_ATTR_MAX_STRLEN + 1] = {0};
-       size_t len = strlen(name);
+       char *xattr_name;
+       int res;
 
        if (!strcmp(name, ""))
                return -EINVAL;
 
-       if (len + XATTR_USER_PREFIX_LEN > HFSPLUS_ATTR_MAX_STRLEN)
-               return -EOPNOTSUPP;
-
+       xattr_name = kmalloc(NLS_MAX_CHARSET_SIZE * HFSPLUS_ATTR_MAX_STRLEN + 1,
+               GFP_KERNEL);
+       if (!xattr_name)
+               return -ENOMEM;
        strcpy(xattr_name, XATTR_USER_PREFIX);
        strcpy(xattr_name + XATTR_USER_PREFIX_LEN, name);
 
-       return hfsplus_getxattr(dentry, xattr_name, buffer, size);
+       res = hfsplus_getxattr(dentry, xattr_name, buffer, size);
+       kfree(xattr_name);
+       return res;
 }
 
 static int hfsplus_user_setxattr(struct dentry *dentry, const char *name,
                const void *buffer, size_t size, int flags, int type)
 {
-       char xattr_name[HFSPLUS_ATTR_MAX_STRLEN + 1] = {0};
-       size_t len = strlen(name);
+       char *xattr_name;
+       int res;
 
        if (!strcmp(name, ""))
                return -EINVAL;
 
-       if (len + XATTR_USER_PREFIX_LEN > HFSPLUS_ATTR_MAX_STRLEN)
-               return -EOPNOTSUPP;
-
+       xattr_name = kmalloc(NLS_MAX_CHARSET_SIZE * HFSPLUS_ATTR_MAX_STRLEN + 1,
+               GFP_KERNEL);
+       if (!xattr_name)
+               return -ENOMEM;
        strcpy(xattr_name, XATTR_USER_PREFIX);
        strcpy(xattr_name + XATTR_USER_PREFIX_LEN, name);
 
-       return hfsplus_setxattr(dentry, xattr_name, buffer, size, flags);
+       res = hfsplus_setxattr(dentry, xattr_name, buffer, size, flags);
+       kfree(xattr_name);
+       return res;
 }
 
 static size_t hfsplus_user_listxattr(struct dentry *dentry, char *list,