Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 1 Nov 2015 21:02:30 +0000 (UTC)
From:      Baptiste Daroussin <bapt@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r290240 - projects/collation/lib/libc/locale
Message-ID:  <201511012102.tA1L2Ubi026119@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: bapt
Date: Sun Nov  1 21:02:30 2015
New Revision: 290240
URL: https://svnweb.freebsd.org/changeset/base/290240

Log:
  locales: Fix eucJP sorting (broken upstream?)
  
  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.
  
  Triggered by: misc/freebsd-doc-ja in ports (encoded in eucJP)
  
  Submitted by:	marino
  Obtained from:	DragonflyBSD

Modified:
  projects/collation/lib/libc/locale/euc.c

Modified: projects/collation/lib/libc/locale/euc.c
==============================================================================
--- projects/collation/lib/libc/locale/euc.c	Sun Nov  1 19:59:04 2015	(r290239)
+++ projects/collation/lib/libc/locale/euc.c	Sun Nov  1 21:02:30 2015	(r290240)
@@ -317,8 +317,8 @@ _EUC_mbrtowc_impl(wchar_t * __restrict p
 {
 	_EucState *es;
 	int i, want;
-	wchar_t wc;
-	unsigned char ch;
+	wchar_t wc = 0;
+	unsigned char ch, chs;
 
 	es = (_EucState *)ps;
 
@@ -367,7 +367,8 @@ _EUC_mbrtowc_impl(wchar_t * __restrict p
 
 	for (i = 0; i < MIN(want, n); i++) {
 		wc <<= 8;
-		wc |= *s;
+		chs = *s;
+		wc |= chs;
 		s++;
 	}
 	if (i < want) {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201511012102.tA1L2Ubi026119>