locales: Fix eucJP sorting (broken upstream?)
authorJohn Marino <draco@marino.st>
Sun, 1 Nov 2015 20:47:23 +0000 (21:47 +0100)
committerJohn Marino <draco@marino.st>
Sun, 1 Nov 2015 20:59:34 +0000 (21:59 +0100)
Sorting eucJP text with "sort" resulted in an illegal sequence while
"gsort" worked.  This was traced back to mbrtowc handling which was
broken for eucJP (probably eucCN, eucKR, and eucTW as well).  This
small fix took hours to figure out.  The OR operation to build the
wide character requires an unsigned character to work correctly.  The
euc wcrtowc conversion is probably broken upstream in Illumos as well.

Reported by: bapt@FreeBSD.org
Triggered by: misc/freebsd-doc-ja in ports (encoded in eucJP)

lib/libc/locale/euc.c

index 78af95a..bd7c050 100644 (file)
@@ -315,8 +315,8 @@ _EUC_mbrtowc_impl(wchar_t * __restrict pwc, const char * __restrict s,
 {
        _EucState *es;
        int i, want;
-       wchar_t wc;
-       unsigned char ch;
+       wchar_t wc = 0;
+       unsigned char ch, chs;
 
        es = (_EucState *)ps;
 
@@ -365,7 +365,8 @@ _EUC_mbrtowc_impl(wchar_t * __restrict pwc, const char * __restrict s,
 
        for (i = 0; i < MIN(want, n); i++) {
                wc <<= 8;
-               wc |= *s;
+               chs = *s;
+               wc |= chs;
                s++;
        }
        if (i < want) {