From 391912b1d9b98996defb99e9ce795821813f4f5e Mon Sep 17 00:00:00 2001
From: Alberto Massari <amassari@apache.org>
Date: Tue, 6 Mar 2007 08:18:53 +0000
Subject: [PATCH] IconvGNU and IconvFBSD transcoders override application-set
 locale, XERCESC-1660 (patch by Boris Kolpackov)

git-svn-id: https://svn.apache.org/repos/asf/xerces/c/trunk@515018 13f79535-47bb-0310-9956-ffa450edef68
---
 .../IconvFBSD/IconvFBSDTransService.cpp       | 23 ++++++++++++++++---
 .../IconvGNU/IconvGNUTransService.cpp         | 23 ++++++++++++++++---
 2 files changed, 40 insertions(+), 6 deletions(-)

diff --git a/src/xercesc/util/Transcoders/IconvFBSD/IconvFBSDTransService.cpp b/src/xercesc/util/Transcoders/IconvFBSD/IconvFBSDTransService.cpp
index a5ecdbbfb..e54e976f2 100644
--- a/src/xercesc/util/Transcoders/IconvFBSD/IconvFBSDTransService.cpp
+++ b/src/xercesc/util/Transcoders/IconvFBSD/IconvFBSDTransService.cpp
@@ -509,9 +509,26 @@ IconvFBSDTransService::IconvFBSDTransService()
     }
 #endif
 
-    // Try to obtain local (host) characterset through the environment
-    char*    fLocalCP = setlocale (LC_CTYPE, "");
-    if (fLocalCP == NULL)
+    // Try to obtain local (host) characterset from the setlocale
+    // and through the environment. Do not call setlocale(LC_*, "")!
+    // Using an empty string instead of NULL, will modify the libc
+    // behavior.
+    //
+    char* fLocalCP = setlocale (LC_CTYPE, NULL);
+    if (fLocalCP == NULL || *fLocalCP == 0 ||
+        strcmp (fLocalCP, "C") == 0 ||
+        strcmp (fLocalCP, "POSIX") == 0) {
+      fLocalCP = getenv ("LC_ALL");
+      if (fLocalCP == NULL) {
+        fLocalCP = getenv ("LC_CTYPE");
+        if (fLocalCP == NULL)
+          fLocalCP = getenv ("LANG");
+      }
+    }
+
+    if (fLocalCP == NULL || *fLocalCP == 0 ||
+        strcmp (fLocalCP, "C") == 0 ||
+        strcmp (fLocalCP, "POSIX") == 0)
         fLocalCP = "iso-8859-1";    // fallback locale
     else {
         char    *ptr = strchr (fLocalCP, '.');
diff --git a/src/xercesc/util/Transcoders/IconvGNU/IconvGNUTransService.cpp b/src/xercesc/util/Transcoders/IconvGNU/IconvGNUTransService.cpp
index 302429fde..37faba188 100644
--- a/src/xercesc/util/Transcoders/IconvGNU/IconvGNUTransService.cpp
+++ b/src/xercesc/util/Transcoders/IconvGNU/IconvGNUTransService.cpp
@@ -417,9 +417,26 @@ IconvGNUTransService::IconvGNUTransService()
     }
 #endif
 
-    // Try to obtain local (host) characterset through the environment
-    char*    fLocalCP = setlocale (LC_CTYPE, "");
-    if (fLocalCP == NULL)
+    // Try to obtain local (host) characterset from the setlocale
+    // and through the environment. Do not call setlocale(LC_*, "")!
+    // Using an empty string instead of NULL, will modify the libc
+    // behavior.
+    //
+    char* fLocalCP = setlocale (LC_CTYPE, NULL);
+    if (fLocalCP == NULL || *fLocalCP == 0 ||
+        strcmp (fLocalCP, "C") == 0 ||
+        strcmp (fLocalCP, "POSIX") == 0) {
+      fLocalCP = getenv ("LC_ALL");
+      if (fLocalCP == NULL) {
+        fLocalCP = getenv ("LC_CTYPE");
+        if (fLocalCP == NULL)
+          fLocalCP = getenv ("LANG");
+      }
+    }
+
+    if (fLocalCP == NULL || *fLocalCP == 0 ||
+        strcmp (fLocalCP, "C") == 0 ||
+        strcmp (fLocalCP, "POSIX") == 0)
         fLocalCP = "iso-8859-1";    // fallback locale
     else {
         char    *ptr = strchr (fLocalCP, '.');
-- 
GitLab