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)