[haiku-commits] r38623 - in haiku/trunk: headers/private/libroot/locale src/system/libroot/add-ons/icu src/system/libroot/posix/locale

  • From: zooey@xxxxxxxxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Sun, 12 Sep 2010 19:24:38 +0200 (CEST)

Author: zooey
Date: 2010-09-12 19:24:38 +0200 (Sun, 12 Sep 2010)
New Revision: 38623
Changeset: http://dev.haiku-os.org/changeset/38623
Ticket: http://dev.haiku-os.org/ticket/6581

Modified:
   haiku/trunk/headers/private/libroot/locale/LocaleBackend.h
   haiku/trunk/src/system/libroot/add-ons/icu/ICUNumericData.cpp
   haiku/trunk/src/system/libroot/posix/locale/LocaleDataBridge.cpp
Log:
Try to fix #6581:
* avoid trying to overwrite values of a constant structure when
  updating the numeric locale data values used by glibc


Modified: haiku/trunk/headers/private/libroot/locale/LocaleBackend.h
===================================================================
--- haiku/trunk/headers/private/libroot/locale/LocaleBackend.h  2010-09-12 
17:21:28 UTC (rev 38622)
+++ haiku/trunk/headers/private/libroot/locale/LocaleBackend.h  2010-09-12 
17:24:38 UTC (rev 38623)
@@ -14,6 +14,7 @@
 
 struct lconv;
 struct lc_time_t;
+struct locale_data;            // glibc
 
 
 namespace BPrivate {
@@ -47,14 +48,33 @@
 
 
 struct LocaleNumericDataBridge {
-       const char**            addrOfGlibcDecimalPoint;
-       const char**            addrOfGlibcThousandsSep;
-       const char**            addrOfGlibcGrouping;
-       uint32_t*                       addrOfGlibcWCDecimalPoint;
-       uint32_t*                       addrOfGlibcWCThousandsSep;
+private:
+       // struct used by glibc to store numeric locale data
+       struct GlibcNumericLocale {
+               const char* name;
+               const char* filedata;
+               off_t filesize;
+               int mmaped;
+               unsigned int usage_count;
+               int use_translit;
+               const char *options;
+               unsigned int nstrings;
+               union locale_data_value
+               {
+                       const uint32_t* wstr;
+                       const char* string;
+                       unsigned int word;
+               }
+               values[6];
+       };
+       locale_data* originalGlibcLocale;
+
+public:
        const struct lconv* posixLocaleConv;
+       GlibcNumericLocale  glibcNumericLocale;
 
        LocaleNumericDataBridge();
+       ~LocaleNumericDataBridge();
 };
 
 

Modified: haiku/trunk/src/system/libroot/add-ons/icu/ICUNumericData.cpp
===================================================================
--- haiku/trunk/src/system/libroot/add-ons/icu/ICUNumericData.cpp       
2010-09-12 17:21:28 UTC (rev 38622)
+++ haiku/trunk/src/system/libroot/add-ons/icu/ICUNumericData.cpp       
2010-09-12 17:24:38 UTC (rev 38623)
@@ -28,9 +28,9 @@
 void
 ICUNumericData::Initialize(LocaleNumericDataBridge* dataBridge)
 {
-       *dataBridge->addrOfGlibcDecimalPoint = fDecimalPoint;
-       *dataBridge->addrOfGlibcThousandsSep = fThousandsSep;
-       *dataBridge->addrOfGlibcGrouping = fGrouping;
+       dataBridge->glibcNumericLocale.values[0].string = fDecimalPoint;
+       dataBridge->glibcNumericLocale.values[1].string = fThousandsSep;
+       dataBridge->glibcNumericLocale.values[2].string = fGrouping;
        fDataBridge = dataBridge;
 }
 
@@ -57,13 +57,13 @@
                if (result == B_OK) {
                        result = _SetLocaleconvEntry(formatSymbols, 
fDecimalPoint,
                                DecimalFormatSymbols::kDecimalSeparatorSymbol);
-                       *fDataBridge->addrOfGlibcWCDecimalPoint
+                       fDataBridge->glibcNumericLocale.values[3].word
                                = (unsigned int)fDecimalPoint[0];
                }
                if (result == B_OK) {
                        result = _SetLocaleconvEntry(formatSymbols, 
fThousandsSep,
                                DecimalFormatSymbols::kGroupingSeparatorSymbol);
-                       *fDataBridge->addrOfGlibcWCThousandsSep
+                       fDataBridge->glibcNumericLocale.values[4].word
                                = (unsigned int)fThousandsSep[0];
                }
                if (result == B_OK) {
@@ -99,9 +99,9 @@
                strcpy(fDecimalPoint, 
fDataBridge->posixLocaleConv->decimal_point);
                strcpy(fThousandsSep, 
fDataBridge->posixLocaleConv->thousands_sep);
                strcpy(fGrouping, fDataBridge->posixLocaleConv->grouping);
-               *fDataBridge->addrOfGlibcWCDecimalPoint
+               fDataBridge->glibcNumericLocale.values[3].word
                        = (unsigned int)fDecimalPoint[0];
-               *fDataBridge->addrOfGlibcWCThousandsSep
+               fDataBridge->glibcNumericLocale.values[4].word
                        = (unsigned int)fThousandsSep[0];
        }
 

Modified: haiku/trunk/src/system/libroot/posix/locale/LocaleDataBridge.cpp
===================================================================
--- haiku/trunk/src/system/libroot/posix/locale/LocaleDataBridge.cpp    
2010-09-12 17:21:28 UTC (rev 38622)
+++ haiku/trunk/src/system/libroot/posix/locale/LocaleDataBridge.cpp    
2010-09-12 17:24:38 UTC (rev 38623)
@@ -8,6 +8,7 @@
 
 #include <ctype.h>
 #include <langinfo.h>
+#include <string.h>
 #include <time.h>
 
 #include <PosixCtype.h>
@@ -16,26 +17,7 @@
 #include <PosixLocaleConv.h>
 
 
-// struct used by glibc to access locale info
-struct locale_data
-{
-       const char* name;
-       const char* filedata;
-       off_t filesize;
-       int mmaped;
-       unsigned int usage_count;
-       int use_translit;
-       const char *options;
-       unsigned int nstrings;
-       union locale_data_value
-       {
-               const uint32_t* wstr;
-               const char* string;
-               unsigned int word;
-       }
-       values[];
-};
-extern struct locale_data _nl_C_LC_NUMERIC;
+extern locale_data* _nl_current_LC_NUMERIC;
 
 
 namespace BPrivate {
@@ -69,16 +51,21 @@
 
 LocaleNumericDataBridge::LocaleNumericDataBridge()
        :
-       addrOfGlibcDecimalPoint(&_nl_C_LC_NUMERIC.values[0].string),
-       addrOfGlibcThousandsSep(&_nl_C_LC_NUMERIC.values[1].string),
-       addrOfGlibcGrouping(&_nl_C_LC_NUMERIC.values[2].string),
-       addrOfGlibcWCDecimalPoint(&_nl_C_LC_NUMERIC.values[3].word),
-       addrOfGlibcWCThousandsSep(&_nl_C_LC_NUMERIC.values[4].word),
+       originalGlibcLocale(_nl_current_LC_NUMERIC),
        posixLocaleConv(&gPosixLocaleConv)
 {
+       memcpy(&glibcNumericLocale, _nl_current_LC_NUMERIC,
+               sizeof(glibcNumericLocale));
+       _nl_current_LC_NUMERIC = (locale_data*)&glibcNumericLocale;
 }
 
 
+LocaleNumericDataBridge::~LocaleNumericDataBridge()
+{
+       _nl_current_LC_NUMERIC = originalGlibcLocale;
+}
+
+
 LocaleTimeDataBridge::LocaleTimeDataBridge()
        :
        posixLCTimeInfo(&gPosixLCTimeInfo)


Other related posts:

  • » [haiku-commits] r38623 - in haiku/trunk: headers/private/libroot/locale src/system/libroot/add-ons/icu src/system/libroot/posix/locale - zooey