aboutsummaryrefslogtreecommitdiff
path: root/build/tools/toolchain-patches/gcc
diff options
context:
space:
mode:
authorDavid 'Digit' Turner <digit@google.com>2010-12-13 16:39:14 +0100
committerDavid 'Digit' Turner <digit@google.com>2010-12-13 16:39:14 +0100
commit61e547de892f7dda62cc76c582326f307922b0d0 (patch)
tree902b69387a0e0f5ce1cfcfec0c1b094444007d89 /build/tools/toolchain-patches/gcc
parent28246be1383b51ebb84596f465e2e25fbac46f5d (diff)
downloadndk-61e547de892f7dda62cc76c582326f307922b0d0.tar.gz
Fix gnustl float/double iostream crashes.
Also remove wchar_t-related compiler warnings when building the STLport sources. Change-Id: I5e377f8f1e05719bb3033e42d701e2a30f1121d6
Diffstat (limited to 'build/tools/toolchain-patches/gcc')
-rw-r--r--build/tools/toolchain-patches/gcc/0001-libstdc-v3-fix-setlocale-related-crash.patch271
1 files changed, 271 insertions, 0 deletions
diff --git a/build/tools/toolchain-patches/gcc/0001-libstdc-v3-fix-setlocale-related-crash.patch b/build/tools/toolchain-patches/gcc/0001-libstdc-v3-fix-setlocale-related-crash.patch
new file mode 100644
index 000000000..54571fbfd
--- /dev/null
+++ b/build/tools/toolchain-patches/gcc/0001-libstdc-v3-fix-setlocale-related-crash.patch
@@ -0,0 +1,271 @@
+From b9bc8aa759030219f895071ea7edb6b80a7e1346 Mon Sep 17 00:00:00 2001
+From: David 'Digit' Turner <digit@android.com>
+Date: Mon, 13 Dec 2010 15:11:16 +0100
+Subject: [PATCH] libstdc++-v3: fix setlocale()-related crash.
+
+The Android setlocale() returns NULL, which was not handled properly
+by the standard library code. Add a simple test the check for
+this condition and avoid saving the old locale when it happens.
+
+Change-Id: I264aa5bfb98e9fd584d32c55fcf9661a93081070
+---
+ .../libstdc++-v3/config/locale/generic/c_locale.cc | 78 ++++++++++++-------
+ .../libstdc++-v3/config/locale/generic/c_locale.h | 2 +-
+ .../config/locale/generic/time_members.cc | 48 ++++++++----
+ 3 files changed, 81 insertions(+), 47 deletions(-)
+
+diff --git a/gcc-4.4.3/libstdc++-v3/config/locale/generic/c_locale.cc b/gcc-4.4.3/libstdc++-v3/config/locale/generic/c_locale.cc
+index 3b9f1bd..a2ad801 100644
+--- a/gcc-4.4.3/libstdc++-v3/config/locale/generic/c_locale.cc
++++ b/gcc-4.4.3/libstdc++-v3/config/locale/generic/c_locale.cc
+@@ -46,15 +46,19 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
+
+ template<>
+ void
+- __convert_to_v(const char* __s, float& __v, ios_base::iostate& __err,
+- const __c_locale&)
++ __convert_to_v(const char* __s, float& __v, ios_base::iostate& __err,
++ const __c_locale&)
+ {
+ // Assumes __s formatted for "C" locale.
+ char* __old = setlocale(LC_ALL, NULL);
+- const size_t __len = strlen(__old) + 1;
+- char* __sav = new char[__len];
+- memcpy(__sav, __old, __len);
+- setlocale(LC_ALL, "C");
++ char* __sav = NULL;
++ if (__old != NULL)
++ {
++ const size_t __len = strlen(__old) + 1;
++ char* __sav = new char[__len];
++ memcpy(__sav, __old, __len);
++ setlocale(LC_ALL, "C");
++ }
+ char* __sanity;
+ bool __overflow = false;
+
+@@ -105,21 +109,28 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
+ __err = ios_base::failbit;
+ }
+
+- setlocale(LC_ALL, __sav);
+- delete [] __sav;
++ if (__sav != NULL)
++ {
++ setlocale(LC_ALL, __sav);
++ delete [] __sav;
++ }
+ }
+
+ template<>
+ void
+- __convert_to_v(const char* __s, double& __v, ios_base::iostate& __err,
+- const __c_locale&)
++ __convert_to_v(const char* __s, double& __v, ios_base::iostate& __err,
++ const __c_locale&)
+ {
+ // Assumes __s formatted for "C" locale.
+ char* __old = setlocale(LC_ALL, NULL);
+- const size_t __len = strlen(__old) + 1;
+- char* __sav = new char[__len];
+- memcpy(__sav, __old, __len);
+- setlocale(LC_ALL, "C");
++ char* __sav = NULL;
++ if (__old != NULL)
++ {
++ const size_t __len = strlen(__old) + 1;
++ char* __sav = new char[__len];
++ memcpy(__sav, __old, __len);
++ setlocale(LC_ALL, "C");
++ }
+ char* __sanity;
+
+ #if !__DBL_HAS_INFINITY__
+@@ -139,7 +150,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
+ #if __DBL_HAS_INFINITY__
+ __v == numeric_limits<double>::infinity()
+ || __v == -numeric_limits<double>::infinity())
+-#else
++#else
+ (__v > 1.0 || __v < -1.0) && errno == ERANGE)
+ #endif
+ {
+@@ -150,21 +161,28 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
+ __err = ios_base::failbit;
+ }
+
+- setlocale(LC_ALL, __sav);
+- delete [] __sav;
++ if (__sav != NULL)
++ {
++ setlocale(LC_ALL, __sav);
++ delete [] __sav;
++ }
+ }
+
+ template<>
+ void
+- __convert_to_v(const char* __s, long double& __v,
+- ios_base::iostate& __err, const __c_locale&)
++ __convert_to_v(const char* __s, long double& __v,
++ ios_base::iostate& __err, const __c_locale&)
+ {
+ // Assumes __s formatted for "C" locale.
+ char* __old = setlocale(LC_ALL, NULL);
+- const size_t __len = strlen(__old) + 1;
+- char* __sav = new char[__len];
+- memcpy(__sav, __old, __len);
+- setlocale(LC_ALL, "C");
++ char* __sav = NULL;
++ if (__old != NULL)
++ {
++ const size_t __len = strlen(__old) + 1;
++ char* __sav = new char[__len];
++ memcpy(__sav, __old, __len);
++ setlocale(LC_ALL, "C");
++ }
+
+ #if !__LDBL_HAS_INFINITY__
+ errno = 0;
+@@ -202,12 +220,14 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
+ __err = ios_base::failbit;
+ }
+
+- setlocale(LC_ALL, __sav);
+- delete [] __sav;
++ if (__sav != NULL) {
++ setlocale(LC_ALL, __sav);
++ delete [] __sav;
++ }
+ }
+
+ void
+- locale::facet::_S_create_c_locale(__c_locale& __cloc, const char* __s,
++ locale::facet::_S_create_c_locale(__c_locale& __cloc, const char* __s,
+ __c_locale)
+ {
+ // Currently, the generic model only supports the "C" locale.
+@@ -232,10 +252,10 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
+
+ const char* const category_names[6 + _GLIBCXX_NUM_CATEGORIES] =
+ {
+- "LC_CTYPE",
++ "LC_CTYPE",
+ "LC_NUMERIC",
+- "LC_TIME",
+- "LC_COLLATE",
++ "LC_TIME",
++ "LC_COLLATE",
+ "LC_MONETARY",
+ "LC_MESSAGES"
+ };
+diff --git a/gcc-4.4.3/libstdc++-v3/config/locale/generic/c_locale.h b/gcc-4.4.3/libstdc++-v3/config/locale/generic/c_locale.h
+index 472ef55..e27a9cd 100644
+--- a/gcc-4.4.3/libstdc++-v3/config/locale/generic/c_locale.h
++++ b/gcc-4.4.3/libstdc++-v3/config/locale/generic/c_locale.h
+@@ -59,7 +59,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
+ {
+ char* __old = std::setlocale(LC_NUMERIC, NULL);
+ char* __sav = NULL;
+- if (__builtin_strcmp(__old, "C"))
++ if (__old != NULL && __builtin_strcmp(__old, "C"))
+ {
+ const size_t __len = __builtin_strlen(__old) + 1;
+ __sav = new char[__len];
+diff --git a/gcc-4.4.3/libstdc++-v3/config/locale/generic/time_members.cc b/gcc-4.4.3/libstdc++-v3/config/locale/generic/time_members.cc
+index 86c9249..d5013f4 100644
+--- a/gcc-4.4.3/libstdc++-v3/config/locale/generic/time_members.cc
++++ b/gcc-4.4.3/libstdc++-v3/config/locale/generic/time_members.cc
+@@ -39,26 +39,33 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
+ template<>
+ void
+ __timepunct<char>::
+- _M_put(char* __s, size_t __maxlen, const char* __format,
++ _M_put(char* __s, size_t __maxlen, const char* __format,
+ const tm* __tm) const
+ {
+ char* __old = setlocale(LC_ALL, NULL);
+- const size_t __llen = strlen(__old) + 1;
+- char* __sav = new char[__llen];
+- memcpy(__sav, __old, __llen);
++ char* __sav = NULL;
++ if (__old != NULL)
++ {
++ const size_t __llen = strlen(__old) + 1;
++ __sav = new char[__llen];
++ memcpy(__sav, __old, __llen);
++ }
+ setlocale(LC_ALL, _M_name_timepunct);
+ const size_t __len = strftime(__s, __maxlen, __format, __tm);
+- setlocale(LC_ALL, __sav);
+- delete [] __sav;
++ if (__sav != NULL)
++ {
++ setlocale(LC_ALL, __sav);
++ delete [] __sav;
++ }
+ // Make sure __s is null terminated.
+ if (__len == 0)
+ __s[0] = '\0';
+ }
+
+- template<>
++ template<>
+ void
+ __timepunct<char>::_M_initialize_timepunct(__c_locale)
+- {
++ {
+ // "C" locale.
+ if (!_M_data)
+ _M_data = new __timepunct_cache<char>;
+@@ -72,7 +79,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
+ _M_data->_M_am = "AM";
+ _M_data->_M_pm = "PM";
+ _M_data->_M_am_pm_format = "";
+-
++
+ // Day names, starting with "C"'s Sunday.
+ _M_data->_M_day1 = "Sunday";
+ _M_data->_M_day2 = "Monday";
+@@ -124,23 +131,30 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
+ template<>
+ void
+ __timepunct<wchar_t>::
+- _M_put(wchar_t* __s, size_t __maxlen, const wchar_t* __format,
++ _M_put(wchar_t* __s, size_t __maxlen, const wchar_t* __format,
+ const tm* __tm) const
+ {
+ char* __old = setlocale(LC_ALL, NULL);
+- const size_t __llen = strlen(__old) + 1;
+- char* __sav = new char[__llen];
+- memcpy(__sav, __old, __llen);
++ char* __sav = NULL;
++ if (__old != NULL)
++ {
++ const size_t __llen = strlen(__old) + 1;
++ char* __sav = new char[__llen];
++ memcpy(__sav, __old, __llen);
++ }
+ setlocale(LC_ALL, _M_name_timepunct);
+ const size_t __len = wcsftime(__s, __maxlen, __format, __tm);
+- setlocale(LC_ALL, __sav);
+- delete [] __sav;
++ if (__sav != NULL)
++ {
++ setlocale(LC_ALL, __sav);
++ delete [] __sav;
++ }
+ // Make sure __s is null terminated.
+ if (__len == 0)
+- __s[0] = L'\0';
++ __s[0] = L'\0';
+ }
+
+- template<>
++ template<>
+ void
+ __timepunct<wchar_t>::_M_initialize_timepunct(__c_locale)
+ {
+--
+1.7.3.1
+