[PATCH 1/8] Support full unicode in uni2char and char2uni

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

[PATCH 1/8] Support full unicode in uni2char and char2uni

Vladimir 'φ-coder/phcoder' Serbinenko
This patch extends uni2char and char2uni to full unicode but compensates this extension in every user by adding a check that only BMP characters are concerned except the users where wchar_t was used only as intermediary between 2 uni2char and char2uni calls (AFFS and BeFS).

Signed-off-by: Vladimir Serbinenko <[hidden email]>
---
 fs/affs/namei.c          |    4 ++--
 fs/affs/symlink.c        |    2 +-
 fs/befs/linuxvfs.c       |    2 +-
 fs/cifs/cifs_unicode.c   |    8 ++++----
 fs/fat/dir.c             |   27 +++++++++++++++------------
 fs/fat/namei_vfat.c      |    7 ++++---
 fs/hfs/trans.c           |    4 ++--
 fs/hfsplus/unicode.c     |   10 +++++-----
 fs/jfs/jfs_unicode.c     |    6 ++++--
 fs/ncpfs/ncplib_kernel.c |   16 +++++++++-------
 fs/nls/nls_ascii.c       |    8 ++++++--
 fs/nls/nls_base.c        |    8 ++++++--
 fs/nls/nls_cp1250.c      |    8 ++++++--
 fs/nls/nls_cp1251.c      |    8 ++++++--
 fs/nls/nls_cp1255.c      |    8 ++++++--
 fs/nls/nls_cp437.c       |    8 ++++++--
 fs/nls/nls_cp737.c       |    8 ++++++--
 fs/nls/nls_cp775.c       |    8 ++++++--
 fs/nls/nls_cp850.c       |    8 ++++++--
 fs/nls/nls_cp852.c       |    8 ++++++--
 fs/nls/nls_cp855.c       |    8 ++++++--
 fs/nls/nls_cp857.c       |    8 ++++++--
 fs/nls/nls_cp860.c       |    8 ++++++--
 fs/nls/nls_cp861.c       |    8 ++++++--
 fs/nls/nls_cp862.c       |    8 ++++++--
 fs/nls/nls_cp863.c       |    8 ++++++--
 fs/nls/nls_cp864.c       |    8 ++++++--
 fs/nls/nls_cp865.c       |    8 ++++++--
 fs/nls/nls_cp866.c       |    8 ++++++--
 fs/nls/nls_cp869.c       |    8 ++++++--
 fs/nls/nls_cp874.c       |    8 ++++++--
 fs/nls/nls_cp932.c       |    7 +++++--
 fs/nls/nls_cp936.c       |    7 +++++--
 fs/nls/nls_cp949.c       |    7 +++++--
 fs/nls/nls_cp950.c       |    7 +++++--
 fs/nls/nls_euc-jp.c      |    4 ++--
 fs/nls/nls_iso8859-1.c   |    8 ++++++--
 fs/nls/nls_iso8859-13.c  |    8 ++++++--
 fs/nls/nls_iso8859-14.c  |    8 ++++++--
 fs/nls/nls_iso8859-15.c  |    8 ++++++--
 fs/nls/nls_iso8859-2.c   |    8 ++++++--
 fs/nls/nls_iso8859-3.c   |    8 ++++++--
 fs/nls/nls_iso8859-4.c   |    8 ++++++--
 fs/nls/nls_iso8859-5.c   |    8 ++++++--
 fs/nls/nls_iso8859-6.c   |    8 ++++++--
 fs/nls/nls_iso8859-7.c   |    8 ++++++--
 fs/nls/nls_iso8859-9.c   |    8 ++++++--
 fs/nls/nls_koi8-r.c      |    8 ++++++--
 fs/nls/nls_koi8-ru.c     |    7 +++++--
 fs/nls/nls_koi8-u.c      |    8 ++++++--
 fs/nls/nls_utf8.c        |    7 ++++---
 fs/ntfs/unistr.c         |    6 +++---
 fs/udf/unicode.c         |    4 ++--
 include/linux/nls.h      |    4 ++--
 54 files changed, 289 insertions(+), 129 deletions(-)

diff --git a/fs/affs/namei.c b/fs/affs/namei.c
index 600fa3e..044ae3e 100644
--- a/fs/affs/namei.c
+++ b/fs/affs/namei.c
@@ -399,7 +399,7 @@ affs_symlink(struct inode *dir, struct dentry *dentry, const char *symname)
  break;
  if (nls_disk && nls_io) {
  ssize_t len;
- wchar_t uni;
+ unicode_t uni;
  len = nls_io->char2uni(symname,
        symnameend - symname,
        &uni);
@@ -531,7 +531,7 @@ static size_t affs_translate_real(u8 *to, const u8 *from,
   struct nls_table *nls_from,
   size_t limit, size_t from_len)
 {
- wchar_t uni;
+ unicode_t uni;
  size_t i;
  ssize_t len;
  size_t to_len = limit;
diff --git a/fs/affs/symlink.c b/fs/affs/symlink.c
index be94d01..934e400 100644
--- a/fs/affs/symlink.c
+++ b/fs/affs/symlink.c
@@ -66,7 +66,7 @@ int affs_read_symlink(struct inode *inode, char *link)
  break;
  if (nls_disk && nls_io) {
  ssize_t len;
- wchar_t uni;
+ unicode_t uni;
  len = nls_disk->char2uni(symname,
  symnameend - symname,
  &uni);
diff --git a/fs/befs/linuxvfs.c b/fs/befs/linuxvfs.c
index e18da23..66ef58d 100644
--- a/fs/befs/linuxvfs.c
+++ b/fs/befs/linuxvfs.c
@@ -602,7 +602,7 @@ befs_nls2utf(struct super_block *sb, const char *in,
 {
  struct nls_table *nls = BEFS_SB(sb)->nls;
  int i, o;
- wchar_t uni;
+ unicode_t uni;
  int unilen, utflen;
  char *result;
  /* There're nls characters that will translate to 3-chars-wide UTF-8
diff --git a/fs/cifs/cifs_unicode.c b/fs/cifs/cifs_unicode.c
index fbb9da9..173916c 100644
--- a/fs/cifs/cifs_unicode.c
+++ b/fs/cifs/cifs_unicode.c
@@ -201,11 +201,11 @@ cifs_strtoUTF16(__le16 *to, const char *from, int len,
 {
  int charlen;
  int i;
- wchar_t wchar_to; /* needed to quiet sparse */
+ unicode_t wchar_to; /* needed to quiet sparse */
 
  for (i = 0; len && *from; i++, from += charlen, len -= charlen) {
  charlen = codepage->char2uni(from, len, &wchar_to);
- if (charlen < 1) {
+ if (charlen < 1 || wchar_to > 0xffff) {
  cERROR(1, "strtoUTF16: char2uni of 0x%x returned %d",
  *from, charlen);
  /* A question mark */
@@ -271,7 +271,7 @@ cifsConvertToUTF16(__le16 *target, const char *source, int srclen,
  int i, j, charlen;
  char src_char;
  __le16 dst_char;
- wchar_t tmp;
+ unicode_t tmp;
 
  if (!mapChars)
  return cifs_strtoUTF16(target, source, PATH_MAX, cp);
@@ -314,7 +314,7 @@ cifsConvertToUTF16(__le16 *target, const char *source, int srclen,
  * if no match, use question mark, which at least in
  * some cases serves as wild card
  */
- if (charlen < 1) {
+ if (charlen < 1 || tmp > 0xffff) {
  dst_char = cpu_to_le16(0x003f);
  charlen = 1;
  }
diff --git a/fs/fat/dir.c b/fs/fat/dir.c
index aca191b..9bb16f3 100644
--- a/fs/fat/dir.c
+++ b/fs/fat/dir.c
@@ -187,15 +187,17 @@ static inline int fat_uni_to_x8(struct super_block *sb, const wchar_t *uni,
 }
 
 static inline int
-fat_short2uni(struct nls_table *t, unsigned char *c, int clen, wchar_t *uni)
+fat_short2uni(struct nls_table *t, unsigned char *c, int clen, wchar_t *wc)
 {
  int charlen;
+ unicode_t uni;
 
- charlen = t->char2uni(c, clen, uni);
- if (charlen < 0) {
- *uni = 0x003f; /* a question mark */
- charlen = 1;
+ charlen = t->char2uni(c, clen, &uni);
+ if (charlen < 0 || uni > 0xffff) {
+ *wc = 0x003f; /* a question mark */
+ return 1;
  }
+ *wc = uni;
  return charlen;
 }
 
@@ -203,24 +205,25 @@ static inline int
 fat_short2lower_uni(struct nls_table *t, unsigned char *c, int clen, wchar_t *uni)
 {
  int charlen;
- wchar_t wc;
+ unicode_t wc;
 
  charlen = t->char2uni(c, clen, &wc);
- if (charlen < 0) {
+ if (charlen < 0 || wc > 0xffff) {
  *uni = 0x003f; /* a question mark */
- charlen = 1;
+ return 1;
  } else if (charlen <= 1) {
  unsigned char nc = t->charset2lower[*c];
 
  if (!nc)
  nc = *c;
 
- if ( (charlen = t->char2uni(&nc, 1, uni)) < 0) {
+ charlen = t->char2uni(&nc, 1, &wc);
+ if (charlen < 0 || wc > 0xffff) {
  *uni = 0x003f; /* a question mark */
- charlen = 1;
+ return 1;
  }
- } else
- *uni = wc;
+ }
+ *uni = wc;
 
  return charlen;
 }
diff --git a/fs/fat/namei_vfat.c b/fs/fat/namei_vfat.c
index 98ae804..6b9caa5 100644
--- a/fs/fat/namei_vfat.c
+++ b/fs/fat/namei_vfat.c
@@ -550,10 +550,11 @@ xlate_to_uni(const unsigned char *name, int len, unsigned char *outname,
  ip += 5;
  i += 5;
  } else {
- charlen = nls->char2uni(ip, len - i,
- (wchar_t *)op);
- if (charlen < 0)
+ unicode_t t;
+ charlen = nls->char2uni(ip, len - i, &t);
+ if (charlen < 0 || t > 0xffff)
  return -EINVAL;
+ *(wchar_t *)op = t;
  ip += charlen;
  i += charlen;
  op += 2;
diff --git a/fs/hfs/trans.c b/fs/hfs/trans.c
index b1ce4c7..0dd0c7b 100644
--- a/fs/hfs/trans.c
+++ b/fs/hfs/trans.c
@@ -45,7 +45,7 @@ int hfs_mac2asc(struct super_block *sb, char *out, const struct hfs_name *in)
  dst = out;
  dstlen = HFS_MAX_NAMELEN;
  if (nls_io) {
- wchar_t ch;
+ unicode_t ch;
 
  while (srclen > 0) {
  if (nls_disk) {
@@ -107,7 +107,7 @@ void hfs_asc2mac(struct super_block *sb, struct hfs_name *out, struct qstr *in)
  dst = out->name;
  dstlen = HFS_NAMELEN;
  if (nls_io) {
- wchar_t ch;
+ unicode_t ch;
 
  while (srclen > 0) {
  size = nls_io->char2uni(src, srclen, &ch);
diff --git a/fs/hfsplus/unicode.c b/fs/hfsplus/unicode.c
index a32998f..5b2c8de 100644
--- a/fs/hfsplus/unicode.c
+++ b/fs/hfsplus/unicode.c
@@ -253,10 +253,10 @@ out:
  * Returns the number of ASCII characters corresponding to the unicode char.
  */
 static inline int asc2unichar(struct super_block *sb, const char *astr, int len,
-      wchar_t *uc)
+      unicode_t *uc)
 {
  int size = HFSPLUS_SB(sb)->nls->char2uni(astr, len, uc);
- if (size <= 0) {
+ if (size <= 0 || *uc > 0xffff) {
  *uc = '?';
  size = 1;
  }
@@ -300,7 +300,7 @@ int hfsplus_asc2uni(struct super_block *sb, struct hfsplus_unistr *ustr,
 {
  int size, dsize, decompose;
  u16 *dstr, outlen = 0;
- wchar_t c;
+ unicode_t c;
 
  decompose = !test_bit(HFSPLUS_SB_NODECOMPOSE, &HFSPLUS_SB(sb)->flags);
  while (outlen < HFSPLUS_MAX_STRLEN && len > 0) {
@@ -341,7 +341,7 @@ int hfsplus_hash_dentry(const struct dentry *dentry, const struct inode *inode,
  const u16 *dstr;
  int casefold, decompose, size, len;
  unsigned long hash;
- wchar_t c;
+ unicode_t c;
  u16 c2;
 
  casefold = test_bit(HFSPLUS_SB_CASEFOLD, &HFSPLUS_SB(sb)->flags);
@@ -396,7 +396,7 @@ int hfsplus_compare_dentry(const struct dentry *parent,
  const u16 *dstr1, *dstr2;
  const char *astr1, *astr2;
  u16 c1, c2;
- wchar_t c;
+ unicode_t c;
 
  casefold = test_bit(HFSPLUS_SB_CASEFOLD, &HFSPLUS_SB(sb)->flags);
  decompose = !test_bit(HFSPLUS_SB_NODECOMPOSE, &HFSPLUS_SB(sb)->flags);
diff --git a/fs/jfs/jfs_unicode.c b/fs/jfs/jfs_unicode.c
index c7de6f5..2d70cf1 100644
--- a/fs/jfs/jfs_unicode.c
+++ b/fs/jfs/jfs_unicode.c
@@ -88,8 +88,10 @@ static int jfs_strtoUCS(wchar_t * to, const unsigned char *from, int len,
  if (codepage) {
  for (i = 0; len && *from; i++, from += charlen, len -= charlen)
  {
- charlen = codepage->char2uni(from, len, &to[i]);
- if (charlen < 1) {
+ unicode_t uni;
+ charlen = codepage->char2uni(from, len, &uni);
+ to[i] = uni;
+ if (charlen < 1 || uni > 0xffff) {
  jfs_err("jfs_strtoUCS: char2uni returned %d.",
  charlen);
  jfs_err("charset = %s, char = 0x%x",
diff --git a/fs/ncpfs/ncplib_kernel.c b/fs/ncpfs/ncplib_kernel.c
index 981a956..c9f66dc 100644
--- a/fs/ncpfs/ncplib_kernel.c
+++ b/fs/ncpfs/ncplib_kernel.c
@@ -1120,17 +1120,15 @@ ncp__io2vol(struct ncp_server *server, unsigned char *vname, unsigned int *vlen,
 
  while (iname < iname_end) {
  int chl;
- wchar_t ec;
+ unicode_t ec;
 
  if (NCP_IS_FLAG(server, NCP_FLAG_UTF8)) {
  int k;
- unicode_t u;
 
- k = utf8_to_utf32(iname, iname_end - iname, &u);
- if (k < 0 || u > MAX_WCHAR_T)
+ k = utf8_to_utf32(iname, iname_end - iname, &ec);
+ if (k < 0 || ec > MAX_WCHAR_T)
  return -EINVAL;
  iname += k;
- ec = u;
  } else {
  if (*iname == NCP_ESC) {
  int k;
@@ -1160,6 +1158,9 @@ nospec:;
  }
  }
 
+ if (ec > MAX_WCHAR_T)
+ return -EINVAL;
+
  /* unitoupper should be here! */
 
  chl = out->uni2char(ec, vname, vname_end - vname);
@@ -1213,10 +1214,11 @@ ncp__vol2io(struct ncp_server *server, unsigned char *iname, unsigned int *ilen,
  vname_end = vname + vlen;
 
  while (vname < vname_end) {
- wchar_t ec;
+ unicode_t ec;
  int chl;
 
- if ( (chl = in->char2uni(vname, vname_end - vname, &ec)) < 0) {
+ chl = in->char2uni(vname, vname_end - vname, &ec);
+ if (chl < 0 || ec > 0xffff) {
  err = chl;
  goto quit;
  }
diff --git a/fs/nls/nls_ascii.c b/fs/nls/nls_ascii.c
index 7020e94..c15b145 100644
--- a/fs/nls/nls_ascii.c
+++ b/fs/nls/nls_ascii.c
@@ -117,7 +117,7 @@ static const unsigned char charset2upper[256] = {
  0x58, 0x59, 0x5a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, /* 0x78-0x7f */
 };
 
-static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
+static int uni2char(unicode_t uni, unsigned char *out, int boundlen)
 {
  const unsigned char *uni2charset;
  unsigned char cl = uni & 0x00ff;
@@ -126,6 +126,9 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  if (boundlen <= 0)
  return -ENAMETOOLONG;
 
+ if (uni > 0xffff)
+ return -EINVAL;
+
  uni2charset = page_uni2charset[ch];
  if (uni2charset && uni2charset[cl])
  out[0] = uni2charset[cl];
@@ -134,7 +137,8 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  return 1;
 }
 
-static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni)
+static int char2uni(const unsigned char *rawstring, int boundlen,
+    unicode_t *uni)
 {
  *uni = charset2uni[*rawstring];
  if (*uni == 0x0000)
diff --git a/fs/nls/nls_base.c b/fs/nls/nls_base.c
index fea6bd5..4f6d1ae 100644
--- a/fs/nls/nls_base.c
+++ b/fs/nls/nls_base.c
@@ -493,7 +493,7 @@ static const unsigned char charset2upper[256] = {
 };
 
 
-static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
+static int uni2char(unicode_t uni, unsigned char *out, int boundlen)
 {
  const unsigned char *uni2charset;
  unsigned char cl = uni & 0x00ff;
@@ -502,6 +502,9 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  if (boundlen <= 0)
  return -ENAMETOOLONG;
 
+ if (uni > 0xffff)
+ return -EINVAL;
+
  uni2charset = page_uni2charset[ch];
  if (uni2charset && uni2charset[cl])
  out[0] = uni2charset[cl];
@@ -510,7 +513,8 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  return 1;
 }
 
-static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni)
+static int char2uni(const unsigned char *rawstring, int boundlen,
+    unicode_t *uni)
 {
  *uni = charset2uni[*rawstring];
  if (*uni == 0x0000)
diff --git a/fs/nls/nls_cp1250.c b/fs/nls/nls_cp1250.c
index c8471fe..05d3be1 100644
--- a/fs/nls/nls_cp1250.c
+++ b/fs/nls/nls_cp1250.c
@@ -298,7 +298,7 @@ static const unsigned char charset2upper[256] = {
  0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xff, /* 0xf8-0xff */
  };
 
-static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
+static int uni2char(unicode_t uni, unsigned char *out, int boundlen)
 {
         const unsigned char *uni2charset;
         unsigned char cl = uni & 0x00ff;
@@ -307,6 +307,9 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
         if (boundlen <= 0)
                 return -ENAMETOOLONG;
 
+ if (uni > 0xffff)
+ return -EINVAL;
+
         uni2charset = page_uni2charset[ch];
         if (uni2charset && uni2charset[cl])
                 out[0] = uni2charset[cl];
@@ -315,7 +318,8 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
         return 1;
 }
 
-static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni)
+static int char2uni(const unsigned char *rawstring, int boundlen,
+    unicode_t *uni)
 {
         *uni = charset2uni[*rawstring];
         if (*uni == 0x0000)
diff --git a/fs/nls/nls_cp1251.c b/fs/nls/nls_cp1251.c
index 1939b46..b2e5d0a 100644
--- a/fs/nls/nls_cp1251.c
+++ b/fs/nls/nls_cp1251.c
@@ -252,7 +252,7 @@ static const unsigned char charset2upper[256] = {
  0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, /* 0xf8-0xff */
 };
 
-static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
+static int uni2char(unicode_t uni, unsigned char *out, int boundlen)
 {
  const unsigned char *uni2charset;
  unsigned char cl = uni & 0x00ff;
@@ -261,6 +261,9 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  if (boundlen <= 0)
  return -ENAMETOOLONG;
 
+ if (uni > 0xffff)
+ return -EINVAL;
+
  uni2charset = page_uni2charset[ch];
  if (uni2charset && uni2charset[cl])
  out[0] = uni2charset[cl];
@@ -269,7 +272,8 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  return 1;
 }
 
-static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni)
+static int char2uni(const unsigned char *rawstring, int boundlen,
+    unicode_t *uni)
 {
  *uni = charset2uni[*rawstring];
  if (*uni == 0x0000)
diff --git a/fs/nls/nls_cp1255.c b/fs/nls/nls_cp1255.c
index 8120ae2..1365831 100644
--- a/fs/nls/nls_cp1255.c
+++ b/fs/nls/nls_cp1255.c
@@ -333,7 +333,7 @@ static const unsigned char charset2upper[256] = {
  0xf8, 0xf9, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */
 };
 
-static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
+static int uni2char(unicode_t uni, unsigned char *out, int boundlen)
 {
  const unsigned char *uni2charset;
  unsigned char cl = uni & 0x00ff;
@@ -342,6 +342,9 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  if (boundlen <= 0)
  return -ENAMETOOLONG;
 
+ if (uni > 0xffff)
+ return -EINVAL;
+
  uni2charset = page_uni2charset[ch];
  if (uni2charset && uni2charset[cl])
  out[0] = uni2charset[cl];
@@ -350,7 +353,8 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  return 1;
 }
 
-static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni)
+static int char2uni(const unsigned char *rawstring, int boundlen,
+    unicode_t *uni)
 {
  *uni = charset2uni[*rawstring];
  if (*uni == 0x0000)
diff --git a/fs/nls/nls_cp437.c b/fs/nls/nls_cp437.c
index ff37a46..cf27d0a 100644
--- a/fs/nls/nls_cp437.c
+++ b/fs/nls/nls_cp437.c
@@ -338,7 +338,7 @@ static const unsigned char charset2upper[256] = {
  0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, /* 0xf8-0xff */
 };
 
-static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
+static int uni2char(unicode_t uni, unsigned char *out, int boundlen)
 {
  const unsigned char *uni2charset;
  unsigned char cl = uni & 0x00ff;
@@ -347,6 +347,9 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  if (boundlen <= 0)
  return -ENAMETOOLONG;
 
+ if (uni > 0xffff)
+ return -EINVAL;
+
  uni2charset = page_uni2charset[ch];
  if (uni2charset && uni2charset[cl])
  out[0] = uni2charset[cl];
@@ -355,7 +358,8 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  return 1;
 }
 
-static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni)
+static int char2uni(const unsigned char *rawstring, int boundlen,
+    unicode_t *uni)
 {
  *uni = charset2uni[*rawstring];
  if (*uni == 0x0000)
diff --git a/fs/nls/nls_cp737.c b/fs/nls/nls_cp737.c
index f5576b8..f9fd323 100644
--- a/fs/nls/nls_cp737.c
+++ b/fs/nls/nls_cp737.c
@@ -301,7 +301,7 @@ static const unsigned char charset2upper[256] = {
  0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, /* 0xf8-0xff */
 };
 
-static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
+static int uni2char(unicode_t uni, unsigned char *out, int boundlen)
 {
  const unsigned char *uni2charset;
  unsigned char cl = uni & 0x00ff;
@@ -310,6 +310,9 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  if (boundlen <= 0)
  return -ENAMETOOLONG;
 
+ if (uni > 0xffff)
+ return -EINVAL;
+
  uni2charset = page_uni2charset[ch];
  if (uni2charset && uni2charset[cl])
  out[0] = uni2charset[cl];
@@ -318,7 +321,8 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  return 1;
 }
 
-static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni)
+static int char2uni(const unsigned char *rawstring, int boundlen,
+    unicode_t *uni)
 {
  *uni = charset2uni[*rawstring];
  if (*uni == 0x0000)
diff --git a/fs/nls/nls_cp775.c b/fs/nls/nls_cp775.c
index 4905635..9a9f9cb 100644
--- a/fs/nls/nls_cp775.c
+++ b/fs/nls/nls_cp775.c
@@ -270,7 +270,7 @@ static const unsigned char charset2upper[256] = {
  0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, /* 0xf8-0xff */
 };
 
-static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
+static int uni2char(unicode_t uni, unsigned char *out, int boundlen)
 {
  const unsigned char *uni2charset;
  unsigned char cl = uni & 0x00ff;
@@ -279,6 +279,9 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  if (boundlen <= 0)
  return -ENAMETOOLONG;
 
+ if (uni > 0xffff)
+ return -EINVAL;
+
  uni2charset = page_uni2charset[ch];
  if (uni2charset && uni2charset[cl])
  out[0] = uni2charset[cl];
@@ -287,7 +290,8 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  return 1;
 }
 
-static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni)
+static int char2uni(const unsigned char *rawstring, int boundlen,
+    unicode_t *uni)
 {
  *uni = charset2uni[*rawstring];
  if (*uni == 0x0000)
diff --git a/fs/nls/nls_cp850.c b/fs/nls/nls_cp850.c
index fe5bdad..66f5876 100644
--- a/fs/nls/nls_cp850.c
+++ b/fs/nls/nls_cp850.c
@@ -266,7 +266,7 @@ static const unsigned char charset2upper[256] = {
  0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, /* 0xf8-0xff */
 };
 
-static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
+static int uni2char(unicode_t uni, unsigned char *out, int boundlen)
 {
  const unsigned char *uni2charset;
  unsigned char cl = uni & 0x00ff;
@@ -275,6 +275,9 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  if (boundlen <= 0)
  return -ENAMETOOLONG;
 
+ if (uni > 0xffff)
+ return -EINVAL;
+
  uni2charset = page_uni2charset[ch];
  if (uni2charset && uni2charset[cl])
  out[0] = uni2charset[cl];
@@ -283,7 +286,8 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  return 1;
 }
 
-static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni)
+static int char2uni(const unsigned char *rawstring, int boundlen,
+    unicode_t *uni)
 {
  *uni = charset2uni[*rawstring];
  if (*uni == 0x0000)
diff --git a/fs/nls/nls_cp852.c b/fs/nls/nls_cp852.c
index ceb1c01..3a6a70b 100644
--- a/fs/nls/nls_cp852.c
+++ b/fs/nls/nls_cp852.c
@@ -288,7 +288,7 @@ static const unsigned char charset2upper[256] = {
  0xf8, 0xf9, 0xfa, 0xeb, 0xfc, 0xfc, 0xfe, 0xff, /* 0xf8-0xff */
 };
 
-static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
+static int uni2char(unicode_t uni, unsigned char *out, int boundlen)
 {
  const unsigned char *uni2charset;
  unsigned char cl = uni & 0x00ff;
@@ -297,6 +297,9 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  if (boundlen <= 0)
  return -ENAMETOOLONG;
 
+ if (uni > 0xffff)
+ return -EINVAL;
+
  uni2charset = page_uni2charset[ch];
  if (uni2charset && uni2charset[cl])
  out[0] = uni2charset[cl];
@@ -305,7 +308,8 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  return 1;
 }
 
-static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni)
+static int char2uni(const unsigned char *rawstring, int boundlen,
+    unicode_t *uni)
 {
  *uni = charset2uni[*rawstring];
  if (*uni == 0x0000)
diff --git a/fs/nls/nls_cp855.c b/fs/nls/nls_cp855.c
index cc7f5fb2..e1875dc 100644
--- a/fs/nls/nls_cp855.c
+++ b/fs/nls/nls_cp855.c
@@ -250,7 +250,7 @@ static const unsigned char charset2upper[256] = {
  0xf8, 0xfa, 0xfa, 0xfc, 0xfc, 0xfd, 0xfe, 0xff, /* 0xf8-0xff */
 };
 
-static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
+static int uni2char(unicode_t uni, unsigned char *out, int boundlen)
 {
  const unsigned char *uni2charset;
  unsigned char cl = uni & 0x00ff;
@@ -259,6 +259,9 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  if (boundlen <= 0)
  return -ENAMETOOLONG;
 
+ if (uni > 0xffff)
+ return -EINVAL;
+
  uni2charset = page_uni2charset[ch];
  if (uni2charset && uni2charset[cl])
  out[0] = uni2charset[cl];
@@ -267,7 +270,8 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  return 1;
 }
 
-static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni)
+static int char2uni(const unsigned char *rawstring, int boundlen,
+    unicode_t *uni)
 {
  *uni = charset2uni[*rawstring];
  if (*uni == 0x0000)
diff --git a/fs/nls/nls_cp857.c b/fs/nls/nls_cp857.c
index e418e19..33bb390 100644
--- a/fs/nls/nls_cp857.c
+++ b/fs/nls/nls_cp857.c
@@ -252,7 +252,7 @@ static const unsigned char charset2upper[256] = {
  0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, /* 0xf8-0xff */
 };
 
-static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
+static int uni2char(unicode_t uni, unsigned char *out, int boundlen)
 {
  const unsigned char *uni2charset;
  unsigned char cl = uni & 0x00ff;
@@ -261,6 +261,9 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  if (boundlen <= 0)
  return -ENAMETOOLONG;
 
+ if (uni > 0xffff)
+ return -EINVAL;
+
  uni2charset = page_uni2charset[ch];
  if (uni2charset && uni2charset[cl])
  out[0] = uni2charset[cl];
@@ -269,7 +272,8 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  return 1;
 }
 
-static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni)
+static int char2uni(const unsigned char *rawstring, int boundlen,
+    unicode_t *uni)
 {
  *uni = charset2uni[*rawstring];
  if (*uni == 0x0000)
diff --git a/fs/nls/nls_cp860.c b/fs/nls/nls_cp860.c
index a86c97d..375caae 100644
--- a/fs/nls/nls_cp860.c
+++ b/fs/nls/nls_cp860.c
@@ -315,7 +315,7 @@ static const unsigned char charset2upper[256] = {
  0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, /* 0xf8-0xff */
 };
 
-static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
+static int uni2char(unicode_t uni, unsigned char *out, int boundlen)
 {
  const unsigned char *uni2charset;
  unsigned char cl = uni & 0x00ff;
@@ -324,6 +324,9 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  if (boundlen <= 0)
  return -ENAMETOOLONG;
 
+ if (uni > 0xffff)
+ return -EINVAL;
+
  uni2charset = page_uni2charset[ch];
  if (uni2charset && uni2charset[cl])
  out[0] = uni2charset[cl];
@@ -332,7 +335,8 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  return 1;
 }
 
-static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni)
+static int char2uni(const unsigned char *rawstring, int boundlen,
+    unicode_t *uni)
 {
  *uni = charset2uni[*rawstring];
  if (*uni == 0x0000)
diff --git a/fs/nls/nls_cp861.c b/fs/nls/nls_cp861.c
index bd92022..6ca31c1 100644
--- a/fs/nls/nls_cp861.c
+++ b/fs/nls/nls_cp861.c
@@ -338,7 +338,7 @@ static const unsigned char charset2upper[256] = {
  0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, /* 0xf8-0xff */
 };
 
-static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
+static int uni2char(unicode_t uni, unsigned char *out, int boundlen)
 {
  const unsigned char *uni2charset;
  unsigned char cl = uni & 0x00ff;
@@ -347,6 +347,9 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  if (boundlen <= 0)
  return -ENAMETOOLONG;
 
+ if (uni > 0xffff)
+ return -EINVAL;
+
  uni2charset = page_uni2charset[ch];
  if (uni2charset && uni2charset[cl])
  out[0] = uni2charset[cl];
@@ -355,7 +358,8 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  return 1;
 }
 
-static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni)
+static int char2uni(const unsigned char *rawstring, int boundlen,
+    unicode_t *uni)
 {
  *uni = charset2uni[*rawstring];
  if (*uni == 0x0000)
diff --git a/fs/nls/nls_cp862.c b/fs/nls/nls_cp862.c
index e9b68eb..17305cf 100644
--- a/fs/nls/nls_cp862.c
+++ b/fs/nls/nls_cp862.c
@@ -372,7 +372,7 @@ static const unsigned char charset2upper[256] = {
  0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, /* 0xf8-0xff */
 };
 
-static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
+static int uni2char(unicode_t uni, unsigned char *out, int boundlen)
 {
  const unsigned char *uni2charset;
  unsigned char cl = uni & 0x00ff;
@@ -381,6 +381,9 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  if (boundlen <= 0)
  return -ENAMETOOLONG;
 
+ if (uni > 0xffff)
+ return -EINVAL;
+
  uni2charset = page_uni2charset[ch];
  if (uni2charset && uni2charset[cl])
  out[0] = uni2charset[cl];
@@ -389,7 +392,8 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  return 1;
 }
 
-static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni)
+static int char2uni(const unsigned char *rawstring, int boundlen,
+    unicode_t *uni)
 {
  *uni = charset2uni[*rawstring];
  if (*uni == 0x0000)
diff --git a/fs/nls/nls_cp863.c b/fs/nls/nls_cp863.c
index f8a9b07..edcec62 100644
--- a/fs/nls/nls_cp863.c
+++ b/fs/nls/nls_cp863.c
@@ -332,7 +332,7 @@ static const unsigned char charset2upper[256] = {
  0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, /* 0xf8-0xff */
 };
 
-static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
+static int uni2char(unicode_t uni, unsigned char *out, int boundlen)
 {
  const unsigned char *uni2charset;
  unsigned char cl = uni & 0x00ff;
@@ -341,6 +341,9 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  if (boundlen <= 0)
  return -ENAMETOOLONG;
 
+ if (uni > 0xffff)
+ return -EINVAL;
+
  uni2charset = page_uni2charset[ch];
  if (uni2charset && uni2charset[cl])
  out[0] = uni2charset[cl];
@@ -349,7 +352,8 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  return 1;
 }
 
-static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni)
+static int char2uni(const unsigned char *rawstring, int boundlen,
+    unicode_t *uni)
 {
  *uni = charset2uni[*rawstring];
  if (*uni == 0x0000)
diff --git a/fs/nls/nls_cp864.c b/fs/nls/nls_cp864.c
index 8d31f43..8ac66ef 100644
--- a/fs/nls/nls_cp864.c
+++ b/fs/nls/nls_cp864.c
@@ -358,7 +358,7 @@ static const unsigned char charset2upper[256] = {
  0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0x00, /* 0xf8-0xff */
 };
 
-static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
+static int uni2char(unicode_t uni, unsigned char *out, int boundlen)
 {
  const unsigned char *uni2charset;
  unsigned char cl = uni & 0x00ff;
@@ -367,6 +367,9 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  if (boundlen <= 0)
  return -ENAMETOOLONG;
 
+ if (uni > 0xffff)
+ return -EINVAL;
+
  uni2charset = page_uni2charset[ch];
  if (uni2charset && uni2charset[cl])
  out[0] = uni2charset[cl];
@@ -375,7 +378,8 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  return 1;
 }
 
-static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni)
+static int char2uni(const unsigned char *rawstring, int boundlen,
+    unicode_t *uni)
 {
  *uni = charset2uni[*rawstring];
  if (*uni == 0x0000)
diff --git a/fs/nls/nls_cp865.c b/fs/nls/nls_cp865.c
index 4bd902f..69ab13d 100644
--- a/fs/nls/nls_cp865.c
+++ b/fs/nls/nls_cp865.c
@@ -338,7 +338,7 @@ static const unsigned char charset2upper[256] = {
  0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, /* 0xf8-0xff */
 };
 
-static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
+static int uni2char(unicode_t uni, unsigned char *out, int boundlen)
 {
  const unsigned char *uni2charset;
  unsigned char cl = uni & 0x00ff;
@@ -347,6 +347,9 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  if (boundlen <= 0)
  return -ENAMETOOLONG;
 
+ if (uni > 0xffff)
+ return -EINVAL;
+
  uni2charset = page_uni2charset[ch];
  if (uni2charset && uni2charset[cl])
  out[0] = uni2charset[cl];
@@ -355,7 +358,8 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  return 1;
 }
 
-static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni)
+static int char2uni(const unsigned char *rawstring, int boundlen,
+    unicode_t *uni)
 {
  *uni = charset2uni[*rawstring];
  if (*uni == 0x0000)
diff --git a/fs/nls/nls_cp866.c b/fs/nls/nls_cp866.c
index bdc7cb3..fcc984a 100644
--- a/fs/nls/nls_cp866.c
+++ b/fs/nls/nls_cp866.c
@@ -256,7 +256,7 @@ static const unsigned char charset2upper[256] = {
  0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, /* 0xf8-0xff */
 };
 
-static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
+static int uni2char(unicode_t uni, unsigned char *out, int boundlen)
 {
  const unsigned char *uni2charset;
  unsigned char cl = uni & 0x00ff;
@@ -265,6 +265,9 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  if (boundlen <= 0)
  return -ENAMETOOLONG;
 
+ if (uni > 0xffff)
+ return -EINVAL;
+
  uni2charset = page_uni2charset[ch];
  if (uni2charset && uni2charset[cl])
  out[0] = uni2charset[cl];
@@ -273,7 +276,8 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  return 1;
 }
 
-static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni)
+static int char2uni(const unsigned char *rawstring, int boundlen,
+    unicode_t *uni)
 {
  *uni = charset2uni[*rawstring];
  if (*uni == 0x0000)
diff --git a/fs/nls/nls_cp869.c b/fs/nls/nls_cp869.c
index 9f283a2..9952629 100644
--- a/fs/nls/nls_cp869.c
+++ b/fs/nls/nls_cp869.c
@@ -266,7 +266,7 @@ static const unsigned char charset2upper[256] = {
  0xf8, 0xf9, 0xd5, 0x96, 0xfc, 0x98, 0xfe, 0xff, /* 0xf8-0xff */
 };
 
-static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
+static int uni2char(unicode_t uni, unsigned char *out, int boundlen)
 {
  const unsigned char *uni2charset;
  unsigned char cl = uni & 0x00ff;
@@ -275,6 +275,9 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  if (boundlen <= 0)
  return -ENAMETOOLONG;
 
+ if (uni > 0xffff)
+ return -EINVAL;
+
  uni2charset = page_uni2charset[ch];
  if (uni2charset && uni2charset[cl])
  out[0] = uni2charset[cl];
@@ -283,7 +286,8 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  return 1;
 }
 
-static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni)
+static int char2uni(const unsigned char *rawstring, int boundlen,
+    unicode_t *uni)
 {
  *uni = charset2uni[*rawstring];
  if (*uni == 0x0000)
diff --git a/fs/nls/nls_cp874.c b/fs/nls/nls_cp874.c
index 0b3c488..5b4312e 100644
--- a/fs/nls/nls_cp874.c
+++ b/fs/nls/nls_cp874.c
@@ -224,7 +224,7 @@ static const unsigned char charset2upper[256] = {
  0xf8, 0xf9, 0xfa, 0xfb, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */
 };
 
-static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
+static int uni2char(unicode_t uni, unsigned char *out, int boundlen)
 {
  const unsigned char *uni2charset;
  unsigned char cl = uni & 0x00ff;
@@ -233,6 +233,9 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  if (boundlen <= 0)
  return -ENAMETOOLONG;
 
+ if (uni > 0xffff)
+ return -EINVAL;
+
  uni2charset = page_uni2charset[ch];
  if (uni2charset && uni2charset[cl])
  out[0] = uni2charset[cl];
@@ -241,7 +244,8 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  return 1;
 }
 
-static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni)
+static int char2uni(const unsigned char *rawstring, int boundlen,
+    unicode_t *uni)
 {
  *uni = charset2uni[*rawstring];
  if (*uni == 0x0000)
diff --git a/fs/nls/nls_cp932.c b/fs/nls/nls_cp932.c
index 0ffed6f..0b9aa93 100644
--- a/fs/nls/nls_cp932.c
+++ b/fs/nls/nls_cp932.c
@@ -7834,7 +7834,7 @@ static const unsigned char charset2upper[256] = {
  0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, /* 0xf8-0xff */
 };
 
-static int uni2char(const wchar_t uni,
+static int uni2char(const unicode_t uni,
     unsigned char *out, int boundlen)
 {
  const unsigned char *uni2charset;
@@ -7844,6 +7844,9 @@ static int uni2char(const wchar_t uni,
  if (boundlen <= 0)
  return -ENAMETOOLONG;
 
+ if (uni > 0xffff)
+ return -EINVAL;
+
  if (ch == 0xFF && 0x61 <= cl && cl <= 0x9F) {
  out[0] = cl + 0x40;
  return 1;
@@ -7875,7 +7878,7 @@ static int uni2char(const wchar_t uni,
 }
 
 static int char2uni(const unsigned char *rawstring, int boundlen,
-    wchar_t *uni)
+    unicode_t *uni)
 {
  unsigned char ch, cl;
  const wchar_t *charset2uni;
diff --git a/fs/nls/nls_cp936.c b/fs/nls/nls_cp936.c
index 8277030..637f276 100644
--- a/fs/nls/nls_cp936.c
+++ b/fs/nls/nls_cp936.c
@@ -10997,7 +10997,7 @@ static const unsigned char charset2upper[256] = {
  0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, /* 0xf8-0xff */
 };
 
-static int uni2char(const wchar_t uni,
+static int uni2char(const unicode_t uni,
  unsigned char *out, int boundlen)
 {
  const unsigned char *uni2charset;
@@ -11008,6 +11008,9 @@ static int uni2char(const wchar_t uni,
  if (boundlen <= 0)
  return -ENAMETOOLONG;
 
+ if (uni > 0xffff)
+ return -EINVAL;
+
  if (uni == 0x20ac) {/* Euro symbol.The only exception with a non-ascii unicode */
  out[0] = 0x80;
  return 1;
@@ -11047,7 +11050,7 @@ static int uni2char(const wchar_t uni,
 }
 
 static int char2uni(const unsigned char *rawstring, int boundlen,
- wchar_t *uni)
+ unicode_t *uni)
 {
  unsigned char ch, cl;
  const wchar_t *charset2uni;
diff --git a/fs/nls/nls_cp949.c b/fs/nls/nls_cp949.c
index 8a7a2fe..4879982 100644
--- a/fs/nls/nls_cp949.c
+++ b/fs/nls/nls_cp949.c
@@ -13858,7 +13858,7 @@ static const unsigned char charset2upper[256] = {
  0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, /* 0xf8-0xff */
 };
 
-static int uni2char(const wchar_t uni,
+static int uni2char(const unicode_t uni,
  unsigned char *out, int boundlen)
 {
  const unsigned char *uni2charset;
@@ -13870,6 +13870,9 @@ static int uni2char(const wchar_t uni,
  return -ENAMETOOLONG;
 
 
+ if (uni > 0xffff)
+ return -EINVAL;
+
  uni2charset = page_uni2charset[ch];
  if (uni2charset) {
  if (boundlen <= 1)
@@ -13890,7 +13893,7 @@ static int uni2char(const wchar_t uni,
 }
 
 static int char2uni(const unsigned char *rawstring, int boundlen,
- wchar_t *uni)
+ unicode_t *uni)
 {
  unsigned char ch, cl;
  const wchar_t *charset2uni;
diff --git a/fs/nls/nls_cp950.c b/fs/nls/nls_cp950.c
index ef25368..019ae50 100644
--- a/fs/nls/nls_cp950.c
+++ b/fs/nls/nls_cp950.c
@@ -9394,7 +9394,7 @@ static const unsigned char charset2upper[256] = {
  0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, /* 0xf8-0xff */
 };
 
-static int uni2char(const wchar_t uni,
+static int uni2char(const unicode_t uni,
  unsigned char *out, int boundlen)
 {
  const unsigned char *uni2charset;
@@ -9406,6 +9406,9 @@ static int uni2char(const wchar_t uni,
  return -ENAMETOOLONG;
 
 
+ if (uni > 0xffff)
+ return -EINVAL;
+
  uni2charset = page_uni2charset[ch];
  if (uni2charset) {
  if (boundlen <= 1)
@@ -9426,7 +9429,7 @@ static int uni2char(const wchar_t uni,
 }
 
 static int char2uni(const unsigned char *rawstring, int boundlen,
- wchar_t *uni)
+ unicode_t *uni)
 {
  unsigned char ch, cl;
  const wchar_t *charset2uni;
diff --git a/fs/nls/nls_euc-jp.c b/fs/nls/nls_euc-jp.c
index 7424929..2af2c03 100644
--- a/fs/nls/nls_euc-jp.c
+++ b/fs/nls/nls_euc-jp.c
@@ -406,7 +406,7 @@ static inline int sjisnec2sjisibm(unsigned char *sjisibm,
  return 2;
 }
 
-static int uni2char(const wchar_t uni,
+static int uni2char(const unicode_t uni,
     unsigned char *out, int boundlen)
 {
  int n;
@@ -477,7 +477,7 @@ static int uni2char(const wchar_t uni,
 }
 
 static int char2uni(const unsigned char *rawstring, int boundlen,
-    wchar_t *uni)
+    unicode_t *uni)
 {
  unsigned char sjis_temp[2];
  int euc_offset, n;
diff --git a/fs/nls/nls_iso8859-1.c b/fs/nls/nls_iso8859-1.c
index 7b951bb..b904c26 100644
--- a/fs/nls/nls_iso8859-1.c
+++ b/fs/nls/nls_iso8859-1.c
@@ -208,7 +208,7 @@ static const unsigned char charset2upper[256] = {
  0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0x00, /* 0xf8-0xff */
 };
 
-static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
+static int uni2char(unicode_t uni, unsigned char *out, int boundlen)
 {
  const unsigned char *uni2charset;
  unsigned char cl = uni & 0x00ff;
@@ -217,6 +217,9 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  if (boundlen <= 0)
  return -ENAMETOOLONG;
 
+ if (uni > 0xffff)
+ return -EINVAL;
+
  uni2charset = page_uni2charset[ch];
  if (uni2charset && uni2charset[cl])
  out[0] = uni2charset[cl];
@@ -225,7 +228,8 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  return 1;
 }
 
-static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni)
+static int char2uni(const unsigned char *rawstring, int boundlen,
+    unicode_t *uni)
 {
  *uni = charset2uni[*rawstring];
  if (*uni == 0x0000)
diff --git a/fs/nls/nls_iso8859-13.c b/fs/nls/nls_iso8859-13.c
index c4d52ea..357a827 100644
--- a/fs/nls/nls_iso8859-13.c
+++ b/fs/nls/nls_iso8859-13.c
@@ -236,7 +236,7 @@ static const unsigned char charset2upper[256] = {
  0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xff, /* 0xf8-0xff */
 };
 
-static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
+static int uni2char(unicode_t uni, unsigned char *out, int boundlen)
 {
  const unsigned char *uni2charset;
  unsigned char cl = uni & 0x00ff;
@@ -245,6 +245,9 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  if (boundlen <= 0)
  return -ENAMETOOLONG;
 
+ if (uni > 0xffff)
+ return -EINVAL;
+
  uni2charset = page_uni2charset[ch];
  if (uni2charset && uni2charset[cl])
  out[0] = uni2charset[cl];
@@ -253,7 +256,8 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  return 1;
 }
 
-static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni)
+static int char2uni(const unsigned char *rawstring, int boundlen,
+    unicode_t *uni)
 {
  *uni = charset2uni[*rawstring];
  if (*uni == 0x0000)
diff --git a/fs/nls/nls_iso8859-14.c b/fs/nls/nls_iso8859-14.c
index dc02600..8493956 100644
--- a/fs/nls/nls_iso8859-14.c
+++ b/fs/nls/nls_iso8859-14.c
@@ -292,7 +292,7 @@ static const unsigned char charset2upper[256] = {
  0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xaf, /* 0xf8-0xff */
 };
 
-static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
+static int uni2char(unicode_t uni, unsigned char *out, int boundlen)
 {
  const unsigned char *uni2charset;
  unsigned char cl = uni & 0x00ff;
@@ -301,6 +301,9 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  if (boundlen <= 0)
  return -ENAMETOOLONG;
 
+ if (uni > 0xffff)
+ return -EINVAL;
+
  uni2charset = page_uni2charset[ch];
  if (uni2charset && uni2charset[cl])
  out[0] = uni2charset[cl];
@@ -309,7 +312,8 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  return 1;
 }
 
-static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni)
+static int char2uni(const unsigned char *rawstring, int boundlen,
+    unicode_t *uni)
 {
  *uni = charset2uni[*rawstring];
  if (*uni == 0x0000)
diff --git a/fs/nls/nls_iso8859-15.c b/fs/nls/nls_iso8859-15.c
index 3c7dfc8..4495ebf 100644
--- a/fs/nls/nls_iso8859-15.c
+++ b/fs/nls/nls_iso8859-15.c
@@ -258,7 +258,7 @@ static const unsigned char charset2upper[256] = {
  0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xbe, /* 0xf8-0xff */
 };
 
-static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
+static int uni2char(unicode_t uni, unsigned char *out, int boundlen)
 {
  const unsigned char *uni2charset;
  unsigned char cl = uni & 0x00ff;
@@ -267,6 +267,9 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  if (boundlen <= 0)
  return -ENAMETOOLONG;
 
+ if (uni > 0xffff)
+ return -EINVAL;
+
  uni2charset = page_uni2charset[ch];
  if (uni2charset && uni2charset[cl])
  out[0] = uni2charset[cl];
@@ -275,7 +278,8 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  return 1;
 }
 
-static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni)
+static int char2uni(const unsigned char *rawstring, int boundlen,
+    unicode_t *uni)
 {
  *uni = charset2uni[*rawstring];
  if (*uni == 0x0000)
diff --git a/fs/nls/nls_iso8859-2.c b/fs/nls/nls_iso8859-2.c
index a2d2197..37c2672 100644
--- a/fs/nls/nls_iso8859-2.c
+++ b/fs/nls/nls_iso8859-2.c
@@ -259,7 +259,7 @@ static const unsigned char charset2upper[256] = {
  0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xff, /* 0xf8-0xff */
 };
 
-static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
+static int uni2char(unicode_t uni, unsigned char *out, int boundlen)
 {
  const unsigned char *uni2charset;
  unsigned char cl = uni & 0x00ff;
@@ -268,6 +268,9 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  if (boundlen <= 0)
  return -ENAMETOOLONG;
 
+ if (uni > 0xffff)
+ return -EINVAL;
+
  uni2charset = page_uni2charset[ch];
  if (uni2charset && uni2charset[cl])
  out[0] = uni2charset[cl];
@@ -276,7 +279,8 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  return 1;
 }
 
-static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni)
+static int char2uni(const unsigned char *rawstring, int boundlen,
+    unicode_t *uni)
 {
  *uni = charset2uni[*rawstring];
  if (*uni == 0x0000)
diff --git a/fs/nls/nls_iso8859-3.c b/fs/nls/nls_iso8859-3.c
index a61e0da..71cfe3b 100644
--- a/fs/nls/nls_iso8859-3.c
+++ b/fs/nls/nls_iso8859-3.c
@@ -259,7 +259,7 @@ static const unsigned char charset2upper[256] = {
  0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xff, /* 0xf8-0xff */
 };
 
-static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
+static int uni2char(unicode_t uni, unsigned char *out, int boundlen)
 {
  const unsigned char *uni2charset;
  unsigned char cl = uni & 0x00ff;
@@ -268,6 +268,9 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  if (boundlen <= 0)
  return -ENAMETOOLONG;
 
+ if (uni > 0xffff)
+ return -EINVAL;
+
  uni2charset = page_uni2charset[ch];
  if (uni2charset && uni2charset[cl])
  out[0] = uni2charset[cl];
@@ -276,7 +279,8 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  return 1;
 }
 
-static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni)
+static int char2uni(const unsigned char *rawstring, int boundlen,
+    unicode_t *uni)
 {
  *uni = charset2uni[*rawstring];
  if (*uni == 0x0000)
diff --git a/fs/nls/nls_iso8859-4.c b/fs/nls/nls_iso8859-4.c
index e8ff555..72bbdcd 100644
--- a/fs/nls/nls_iso8859-4.c
+++ b/fs/nls/nls_iso8859-4.c
@@ -259,7 +259,7 @@ static const unsigned char charset2upper[256] = {
  0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xff, /* 0xf8-0xff */
 };
 
-static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
+static int uni2char(unicode_t uni, unsigned char *out, int boundlen)
 {
  const unsigned char *uni2charset;
  unsigned char cl = uni & 0x00ff;
@@ -268,6 +268,9 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  if (boundlen <= 0)
  return -ENAMETOOLONG;
 
+ if (uni > 0xffff)
+ return -EINVAL;
+
  uni2charset = page_uni2charset[ch];
  if (uni2charset && uni2charset[cl])
  out[0] = uni2charset[cl];
@@ -276,7 +279,8 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  return 1;
 }
 
-static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni)
+static int char2uni(const unsigned char *rawstring, int boundlen,
+    unicode_t *uni)
 {
  *uni = charset2uni[*rawstring];
  if (*uni == 0x0000)
diff --git a/fs/nls/nls_iso8859-5.c b/fs/nls/nls_iso8859-5.c
index 4721e89..326d0f8 100644
--- a/fs/nls/nls_iso8859-5.c
+++ b/fs/nls/nls_iso8859-5.c
@@ -223,7 +223,7 @@ static const unsigned char charset2upper[256] = {
  0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xfd, 0xae, 0xaf, /* 0xf8-0xff */
 };
 
-static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
+static int uni2char(unicode_t uni, unsigned char *out, int boundlen)
 {
  const unsigned char *uni2charset;
  unsigned char cl = uni & 0x00ff;
@@ -232,6 +232,9 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  if (boundlen <= 0)
  return -ENAMETOOLONG;
 
+ if (uni > 0xffff)
+ return -EINVAL;
+
  uni2charset = page_uni2charset[ch];
  if (uni2charset && uni2charset[cl])
  out[0] = uni2charset[cl];
@@ -240,7 +243,8 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  return 1;
 }
 
-static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni)
+static int char2uni(const unsigned char *rawstring, int boundlen,
+    unicode_t *uni)
 {
  *uni = charset2uni[*rawstring];
  if (*uni == 0x0000)
diff --git a/fs/nls/nls_iso8859-6.c b/fs/nls/nls_iso8859-6.c
index 01a517d..d42b681 100644
--- a/fs/nls/nls_iso8859-6.c
+++ b/fs/nls/nls_iso8859-6.c
@@ -214,7 +214,7 @@ static const unsigned char charset2upper[256] = {
  0xf0, 0xf1, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */
 };
 
-static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
+static int uni2char(unicode_t uni, unsigned char *out, int boundlen)
 {
  const unsigned char *uni2charset;
  unsigned char cl = uni & 0x00ff;
@@ -223,6 +223,9 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  if (boundlen <= 0)
  return -ENAMETOOLONG;
 
+ if (uni > 0xffff)
+ return -EINVAL;
+
  uni2charset = page_uni2charset[ch];
  if (uni2charset && uni2charset[cl])
  out[0] = uni2charset[cl];
@@ -231,7 +234,8 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  return 1;
 }
 
-static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni)
+static int char2uni(const unsigned char *rawstring, int boundlen,
+    unicode_t *uni)
 {
  *uni = charset2uni[*rawstring];
  if (*uni == 0x0000)
diff --git a/fs/nls/nls_iso8859-7.c b/fs/nls/nls_iso8859-7.c
index 2d27b93..0f22a64 100644
--- a/fs/nls/nls_iso8859-7.c
+++ b/fs/nls/nls_iso8859-7.c
@@ -268,7 +268,7 @@ static const unsigned char charset2upper[256] = {
  0xd8, 0xd9, 0xda, 0xdb, 0xbc, 0xbe, 0xbf, 0x00, /* 0xf8-0xff */
 };
 
-static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
+static int uni2char(unicode_t uni, unsigned char *out, int boundlen)
 {
  const unsigned char *uni2charset;
  unsigned char cl = uni & 0x00ff;
@@ -277,6 +277,9 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  if (boundlen <= 0)
  return -ENAMETOOLONG;
 
+ if (uni > 0xffff)
+ return -EINVAL;
+
  uni2charset = page_uni2charset[ch];
  if (uni2charset && uni2charset[cl])
  out[0] = uni2charset[cl];
@@ -285,7 +288,8 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  return 1;
 }
 
-static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni)
+static int char2uni(const unsigned char *rawstring, int boundlen,
+    unicode_t *uni)
 {
  *uni = charset2uni[*rawstring];
  if (*uni == 0x0000)
diff --git a/fs/nls/nls_iso8859-9.c b/fs/nls/nls_iso8859-9.c
index 694bf07..86e5dbb 100644
--- a/fs/nls/nls_iso8859-9.c
+++ b/fs/nls/nls_iso8859-9.c
@@ -223,7 +223,7 @@ static const unsigned char charset2upper[256] = {
  0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0x49, 0xde, 0x00, /* 0xf8-0xff */
 };
 
-static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
+static int uni2char(unicode_t uni, unsigned char *out, int boundlen)
 {
  const unsigned char *uni2charset;
  unsigned char cl = uni & 0x00ff;
@@ -232,6 +232,9 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  if (boundlen <= 0)
  return -ENAMETOOLONG;
 
+ if (uni > 0xffff)
+ return -EINVAL;
+
  uni2charset = page_uni2charset[ch];
  if (uni2charset && uni2charset[cl])
  out[0] = uni2charset[cl];
@@ -240,7 +243,8 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  return 1;
 }
 
-static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni)
+static int char2uni(const unsigned char *rawstring, int boundlen,
+    unicode_t *uni)
 {
  *uni = charset2uni[*rawstring];
  if (*uni == 0x0000)
diff --git a/fs/nls/nls_koi8-r.c b/fs/nls/nls_koi8-r.c
index 4387531..d51cb5e 100644
--- a/fs/nls/nls_koi8-r.c
+++ b/fs/nls/nls_koi8-r.c
@@ -274,7 +274,7 @@ static const unsigned char charset2upper[256] = {
  0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, /* 0xf8-0xff */
 };
 
-static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
+static int uni2char(unicode_t uni, unsigned char *out, int boundlen)
 {
  const unsigned char *uni2charset;
  unsigned char cl = uni & 0x00ff;
@@ -283,6 +283,9 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  if (boundlen <= 0)
  return -ENAMETOOLONG;
 
+ if (uni > 0xffff)
+ return -EINVAL;
+
  uni2charset = page_uni2charset[ch];
  if (uni2charset && uni2charset[cl])
  out[0] = uni2charset[cl];
@@ -291,7 +294,8 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  return 1;
 }
 
-static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni)
+static int char2uni(const unsigned char *rawstring, int boundlen,
+    unicode_t *uni)
 {
  *uni = charset2uni[*rawstring];
  if (*uni == 0x0000)
diff --git a/fs/nls/nls_koi8-ru.c b/fs/nls/nls_koi8-ru.c
index e7bc1d7..7c3f4ba 100644
--- a/fs/nls/nls_koi8-ru.c
+++ b/fs/nls/nls_koi8-ru.c
@@ -13,12 +13,15 @@
 
 static struct nls_table *p_nls;
 
-static int uni2char(const wchar_t uni,
+static int uni2char(const unicode_t uni,
     unsigned char *out, int boundlen)
 {
  if (boundlen <= 0)
  return -ENAMETOOLONG;
 
+ if (uni > 0xffff)
+ return -EINVAL;
+
  if ((uni & 0xffaf) == 0x040e || (uni & 0xffce) == 0x254c) {
  /* koi8-ru and koi8-u differ only on two characters */
  if (uni == 0x040e)
@@ -37,7 +40,7 @@ static int uni2char(const wchar_t uni,
 }
 
 static int char2uni(const unsigned char *rawstring, int boundlen,
-    wchar_t *uni)
+    unicode_t *uni)
 {
  int n;
 
diff --git a/fs/nls/nls_koi8-u.c b/fs/nls/nls_koi8-u.c
index 8c9f029..a177b9d 100644
--- a/fs/nls/nls_koi8-u.c
+++ b/fs/nls/nls_koi8-u.c
@@ -281,7 +281,7 @@ static const unsigned char charset2upper[256] = {
  0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, /* 0xf8-0xff */
 };
 
-static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
+static int uni2char(unicode_t uni, unsigned char *out, int boundlen)
 {
  const unsigned char *uni2charset;
  unsigned char cl = uni & 0x00ff;
@@ -290,6 +290,9 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  if (boundlen <= 0)
  return -ENAMETOOLONG;
 
+ if (uni > 0xffff)
+ return -EINVAL;
+
  uni2charset = page_uni2charset[ch];
  if (uni2charset && uni2charset[cl])
  out[0] = uni2charset[cl];
@@ -298,7 +301,8 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  return 1;
 }
 
-static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni)
+static int char2uni(const unsigned char *rawstring, int boundlen,
+    unicode_t *uni)
 {
  *uni = charset2uni[*rawstring];
  if (*uni == 0x0000)
diff --git a/fs/nls/nls_utf8.c b/fs/nls/nls_utf8.c
index 0d60a44..eb6392e 100644
--- a/fs/nls/nls_utf8.c
+++ b/fs/nls/nls_utf8.c
@@ -11,7 +11,7 @@
 
 static unsigned char identity[256];
 
-static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
+static int uni2char(unicode_t uni, unsigned char *out, int boundlen)
 {
  int n;
 
@@ -26,13 +26,14 @@ static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
  return n;
 }
 
-static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni)
+static int char2uni(const unsigned char *rawstring, int boundlen,
+    unicode_t *uni)
 {
  int n;
  unicode_t u;
 
  n = utf8_to_utf32(rawstring, boundlen, &u);
- if (n < 0 || u > MAX_WCHAR_T) {
+ if (n < 0 || u > 0x10ffff) {
  *uni = 0x003f; /* ? */
  return -EINVAL;
  }
diff --git a/fs/ntfs/unistr.c b/fs/ntfs/unistr.c
index 005ca4b..0d371e7 100644
--- a/fs/ntfs/unistr.c
+++ b/fs/ntfs/unistr.c
@@ -261,7 +261,7 @@ int ntfs_nlstoucs(const ntfs_volume *vol, const char *ins,
 {
  struct nls_table *nls = vol->nls_map;
  ntfschar *ucs;
- wchar_t wc;
+ unicode_t wc;
  int i, o, wc_len;
 
  /* We do not trust outside sources. */
@@ -271,8 +271,8 @@ int ntfs_nlstoucs(const ntfs_volume *vol, const char *ins,
  for (i = o = 0; i < ins_len; i += wc_len) {
  wc_len = nls->char2uni(ins + i, ins_len - i,
  &wc);
- if (likely(wc_len >= 0 &&
- o < NTFS_MAX_NAME_LEN)) {
+ if (likely(wc_len >= 0 && wc <= 0xffff
+   && o < NTFS_MAX_NAME_LEN)) {
  if (likely(wc)) {
  ucs[o++] = cpu_to_le16(wc);
  continue;
diff --git a/fs/udf/unicode.c b/fs/udf/unicode.c
index 44b815e..9b1b2de 100644
--- a/fs/udf/unicode.c
+++ b/fs/udf/unicode.c
@@ -298,7 +298,7 @@ static int udf_NLStoCS0(struct nls_table *nls, dstring *ocu, struct ustr *uni,
 {
  int len;
  unsigned i, max_val;
- uint16_t uni_char;
+ unicode_t uni_char;
  int u_len;
 
  memset(ocu, 0, sizeof(dstring) * length);
@@ -312,7 +312,7 @@ try_again:
  if (!len)
  continue;
  /* Invalid character, deal with it */
- if (len < 0) {
+ if (len < 0 || uni_char > 0xffff) {
  len = 1;
  uni_char = '?';
  }
diff --git a/include/linux/nls.h b/include/linux/nls.h
index 5dc635f..c0292dd 100644
--- a/include/linux/nls.h
+++ b/include/linux/nls.h
@@ -24,9 +24,9 @@ typedef u32 unicode_t;
 struct nls_table {
  const char *charset;
  const char *alias;
- int (*uni2char) (wchar_t uni, unsigned char *out, int boundlen);
+ int (*uni2char) (unicode_t uni, unsigned char *out, int boundlen);
  int (*char2uni) (const unsigned char *rawstring, int boundlen,
- wchar_t *uni);
+ unicode_t *uni);
  const unsigned char *charset2lower;
  const unsigned char *charset2upper;
  struct module *owner;
--
1.7.10

--
Regards
Vladimir 'φ-coder/phcoder' Serbinenko




------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and
threat landscape has changed and how IT managers can respond. Discussions
will include endpoint security, mobile security and the latest in malware
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
Linux-NTFS-Dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/linux-ntfs-dev

signature.asc (302 bytes) Download Attachment