#include <linux/fs.h>
 #include <linux/slab.h>
 #include <linux/random.h>
+#include <linux/nls.h>
 
 #include "hfsplus_fs.h"
 #include "hfsplus_raw.h"
        struct inode *inode = file_inode(file);
        struct super_block *sb = inode->i_sb;
        int len, err;
-       char strbuf[HFSPLUS_MAX_STRLEN + 1];
+       char *strbuf;
        hfsplus_cat_entry entry;
        struct hfs_find_data fd;
        struct hfsplus_readdir_data *rd;
        err = hfs_find_init(HFSPLUS_SB(sb)->cat_tree, &fd);
        if (err)
                return err;
+       strbuf = kmalloc(NLS_MAX_CHARSET_SIZE * HFSPLUS_MAX_STRLEN + 1, GFP_KERNEL);
+       if (!strbuf) {
+               err = -ENOMEM;
+               goto out;
+       }
        hfsplus_cat_build_key(sb, fd.search_key, inode->i_ino, NULL);
        err = hfs_brec_find(&fd, hfs_find_rec_by_key);
        if (err)
                hfs_bnode_read(fd.bnode, &entry, fd.entryoffset,
                        fd.entrylength);
                type = be16_to_cpu(entry.type);
-               len = HFSPLUS_MAX_STRLEN;
+               len = NLS_MAX_CHARSET_SIZE * HFSPLUS_MAX_STRLEN;
                err = hfsplus_uni2asc(sb, &fd.key->cat.name, strbuf, &len);
                if (err)
                        goto out;
        }
        memcpy(&rd->key, fd.key, sizeof(struct hfsplus_cat_key));
 out:
+       kfree(strbuf);
        hfs_find_exit(&fd);
        return err;
 }
 
 
 #include "hfsplus_fs.h"
 #include <linux/posix_acl_xattr.h>
+#include <linux/nls.h>
 #include "xattr.h"
 #include "acl.h"
 
        struct hfs_find_data fd;
        u16 key_len = 0;
        struct hfsplus_attr_key attr_key;
-       char strbuf[HFSPLUS_ATTR_MAX_STRLEN +
-                       XATTR_MAC_OSX_PREFIX_LEN + 1] = {0};
+       char *strbuf;
        int xattr_name_len;
 
        if ((!S_ISREG(inode->i_mode) &&
                return err;
        }
 
+       strbuf = kmalloc(NLS_MAX_CHARSET_SIZE * HFSPLUS_ATTR_MAX_STRLEN +
+                       XATTR_MAC_OSX_PREFIX_LEN + 1, GFP_KERNEL);
+       if (!strbuf) {
+               res = -ENOMEM;
+               goto out;
+       }
+
        err = hfsplus_find_attr(inode->i_sb, inode->i_ino, NULL, &fd);
        if (err) {
                if (err == -ENOENT) {
                if (be32_to_cpu(attr_key.cnid) != inode->i_ino)
                        goto end_listxattr;
 
-               xattr_name_len = HFSPLUS_ATTR_MAX_STRLEN;
+               xattr_name_len = NLS_MAX_CHARSET_SIZE * HFSPLUS_ATTR_MAX_STRLEN;
                if (hfsplus_uni2asc(inode->i_sb,
                        (const struct hfsplus_unistr *)&fd.key->attr.key_name,
                                        strbuf, &xattr_name_len)) {
        }
 
 end_listxattr:
+       kfree(strbuf);
+out:
        hfs_find_exit(&fd);
        return res;
 }