Fix the following conversion overflow errors. The UTF8-to-UTF16
conversion is done through 32bit wchar_t, but U-Boot codebase is
built with -fshort-wchar which limits wchar_t to 16bit. Replace
the built-in wchar_t with u32 to assure the intermediate type is
32bit.

"
fs/exfat/utf.c: In function ‘utf8_to_wchar’:
fs/exfat/utf.c:165:23: warning: overflow in conversion from ‘int’ to ‘wchar_t’ 
{aka ‘short unsigned int’} changes value from ‘(int)(short unsigned int)*input 
<< 18 & 1835008’ to ‘0’ [-Woverflow]
  165 |                 *wc = ((wchar_t) input[0] & 0x07) << 18;
      |                       ^
fs/exfat/utf.c:170:23: warning: overflow in conversion from ‘int’ to ‘wchar_t’ 
{aka ‘short unsigned int’} changes value from ‘(int)(short unsigned int)*input 
<< 24 & 50331648’ to ‘0’ [-Woverflow]
  170 |                 *wc = ((wchar_t) input[0] & 0x03) << 24;
      |                       ^
fs/exfat/utf.c:175:23: warning: overflow in conversion from ‘int’ to ‘wchar_t’ 
{aka ‘short unsigned int’} changes value from ‘(int)(short unsigned int)*input 
<< 30 & 1073741824’ to ‘0’ [-Woverflow]
  175 |                 *wc = ((wchar_t) input[0] & 0x01) << 30;
      |                       ^
"

Signed-off-by: Marek Vasut <ma...@denx.de>
---
Cc: Baruch Siach <bar...@tkos.co.il>
Cc: Francesco Dolcini <francesco.dolc...@toradex.com>
Cc: Heinrich Schuchardt <xypron.g...@gmx.de>
Cc: Hiago De Franco <hiago.fra...@toradex.com>
Cc: Ilias Apalodimas <ilias.apalodi...@linaro.org>
Cc: Nam Cao <nam...@linutronix.de>
Cc: Simon Glass <s...@chromium.org>
Cc: Sughosh Ganu <sughosh.g...@linaro.org>
Cc: Tom Rini <tr...@konsulko.com>
Cc: u-boot@lists.denx.de
---
V2: Rework the patch, replace wchar_t with u32
---
 fs/exfat/utf.c | 26 +++++++++++++-------------
 1 file changed, 13 insertions(+), 13 deletions(-)

diff --git a/fs/exfat/utf.c b/fs/exfat/utf.c
index b1d09e76478..8a28e7621ca 100644
--- a/fs/exfat/utf.c
+++ b/fs/exfat/utf.c
@@ -23,7 +23,7 @@
 #include "exfat.h"
 #include <errno.h>
 
-static char* wchar_to_utf8(char* output, wchar_t wc, size_t outsize)
+static char* wchar_to_utf8(char* output, u32 wc, size_t outsize)
 {
        if (wc <= 0x7f)
        {
@@ -82,14 +82,14 @@ static char* wchar_to_utf8(char* output, wchar_t wc, size_t 
outsize)
        return output;
 }
 
-static const le16_t* utf16_to_wchar(const le16_t* input, wchar_t* wc,
+static const le16_t* utf16_to_wchar(const le16_t* input, u32* wc,
                size_t insize)
 {
        if ((le16_to_cpu(input[0]) & 0xfc00) == 0xd800)
        {
                if (insize < 2 || (le16_to_cpu(input[1]) & 0xfc00) != 0xdc00)
                        return NULL;
-               *wc = ((wchar_t) (le16_to_cpu(input[0]) & 0x3ff) << 10);
+               *wc = ((u32) (le16_to_cpu(input[0]) & 0x3ff) << 10);
                *wc |= (le16_to_cpu(input[1]) & 0x3ff);
                *wc += 0x10000;
                return input + 2;
@@ -108,7 +108,7 @@ int exfat_utf16_to_utf8(char* output, const le16_t* input, 
size_t outsize,
        const le16_t* iend = input + insize;
        char* optr = output;
        const char* oend = output + outsize;
-       wchar_t wc;
+       u32 wc;
 
        while (iptr < iend)
        {
@@ -136,7 +136,7 @@ int exfat_utf16_to_utf8(char* output, const le16_t* input, 
size_t outsize,
        return 0;
 }
 
-static const char* utf8_to_wchar(const char* input, wchar_t* wc,
+static const char* utf8_to_wchar(const char* input, u32* wc,
                size_t insize)
 {
        size_t size;
@@ -147,32 +147,32 @@ static const char* utf8_to_wchar(const char* input, 
wchar_t* wc,
 
        if ((input[0] & 0x80) == 0)
        {
-               *wc = (wchar_t) input[0];
+               *wc = (u32) input[0];
                return input + 1;
        }
        else if ((input[0] & 0xe0) == 0xc0)
        {
-               *wc = ((wchar_t) input[0] & 0x1f) << 6;
+               *wc = ((u32) input[0] & 0x1f) << 6;
                size = 2;
        }
        else if ((input[0] & 0xf0) == 0xe0)
        {
-               *wc = ((wchar_t) input[0] & 0x0f) << 12;
+               *wc = ((u32) input[0] & 0x0f) << 12;
                size = 3;
        }
        else if ((input[0] & 0xf8) == 0xf0)
        {
-               *wc = ((wchar_t) input[0] & 0x07) << 18;
+               *wc = ((u32) input[0] & 0x07) << 18;
                size = 4;
        }
        else if ((input[0] & 0xfc) == 0xf8)
        {
-               *wc = ((wchar_t) input[0] & 0x03) << 24;
+               *wc = ((u32) input[0] & 0x03) << 24;
                size = 5;
        }
        else if ((input[0] & 0xfe) == 0xfc)
        {
-               *wc = ((wchar_t) input[0] & 0x01) << 30;
+               *wc = ((u32) input[0] & 0x01) << 30;
                size = 6;
        }
        else
@@ -192,7 +192,7 @@ static const char* utf8_to_wchar(const char* input, 
wchar_t* wc,
        return input + size;
 }
 
-static le16_t* wchar_to_utf16(le16_t* output, wchar_t wc, size_t outsize)
+static le16_t* wchar_to_utf16(le16_t* output, u32 wc, size_t outsize)
 {
        if (wc <= 0xffff) /* if character is from BMP */
        {
@@ -216,7 +216,7 @@ int exfat_utf8_to_utf16(le16_t* output, const char* input, 
size_t outsize,
        const char* iend = input + insize;
        le16_t* optr = output;
        const le16_t* oend = output + outsize;
-       wchar_t wc;
+       u32 wc;
 
        while (iptr < iend)
        {
-- 
2.47.2

Reply via email to