aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.7
diff options
context:
space:
mode:
authorAndrew Hsieh <andrewhsieh@google.com>2012-10-30 19:11:19 -0700
committerAndrew Hsieh <andrewhsieh@google.com>2012-10-30 19:11:19 -0700
commit20ffc596a2771a96ac9b4a4838edc7779a48f0af (patch)
treee11a3a21968c4463edb7fa5e602aaa0851571c39 /gcc-4.7
parent8be8667d162a7bd04972e12f75bb71a8632391b9 (diff)
downloadtoolchain_gcc-20ffc596a2771a96ac9b4a4838edc7779a48f0af.tar.gz
toolchain_gcc-20ffc596a2771a96ac9b4a4838edc7779a48f0af.tar.bz2
toolchain_gcc-20ffc596a2771a96ac9b4a4838edc7779a48f0af.zip
Handle NULL return value of setlocale() in libstdc++
Bionic setlocale() always returns NULL. $NDK/tests/device/test-gnustl-2 (as well as others using iostream, etc) segfault w/o this change Port of google ref 46499. Change-Id: I3fff815a365b0118d9a8362725a7267bccc93a8e
Diffstat (limited to 'gcc-4.7')
-rw-r--r--gcc-4.7/libstdc++-v3/config/locale/generic/c_locale.cc12
-rw-r--r--gcc-4.7/libstdc++-v3/config/locale/generic/c_locale.h2
-rw-r--r--gcc-4.7/libstdc++-v3/config/locale/generic/time_members.cc12
3 files changed, 17 insertions, 9 deletions
diff --git a/gcc-4.7/libstdc++-v3/config/locale/generic/c_locale.cc b/gcc-4.7/libstdc++-v3/config/locale/generic/c_locale.cc
index fb9b425da..a89c16fcb 100644
--- a/gcc-4.7/libstdc++-v3/config/locale/generic/c_locale.cc
+++ b/gcc-4.7/libstdc++-v3/config/locale/generic/c_locale.cc
@@ -52,10 +52,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{
// Assumes __s formatted for "C" locale.
char* __old = setlocale(LC_ALL, 0);
- const size_t __len = strlen(__old) + 1;
- char* __sav = new char[__len];
- memcpy(__sav, __old, __len);
- setlocale(LC_ALL, "C");
+ char* __sav = 0;
+ if (__old)
+ {
+ const size_t __len = strlen(__old) + 1;
+ __sav = new char[__len];
+ memcpy(__sav, __old, __len);
+ setlocale(LC_ALL, "C");
+ }
char* __sanity;
bool __overflow = false;
diff --git a/gcc-4.7/libstdc++-v3/config/locale/generic/c_locale.h b/gcc-4.7/libstdc++-v3/config/locale/generic/c_locale.h
index 2c7600047..fa42918cc 100644
--- a/gcc-4.7/libstdc++-v3/config/locale/generic/c_locale.h
+++ b/gcc-4.7/libstdc++-v3/config/locale/generic/c_locale.h
@@ -60,7 +60,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{
char* __old = std::setlocale(LC_NUMERIC, 0);
char* __sav = 0;
- if (__builtin_strcmp(__old, "C"))
+ if (__old && __builtin_strcmp(__old, "C"))
{
const size_t __len = __builtin_strlen(__old) + 1;
__sav = new char[__len];
diff --git a/gcc-4.7/libstdc++-v3/config/locale/generic/time_members.cc b/gcc-4.7/libstdc++-v3/config/locale/generic/time_members.cc
index 30310752b..a260904f0 100644
--- a/gcc-4.7/libstdc++-v3/config/locale/generic/time_members.cc
+++ b/gcc-4.7/libstdc++-v3/config/locale/generic/time_members.cc
@@ -45,10 +45,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
const tm* __tm) const throw()
{
char* __old = setlocale(LC_ALL, 0);
- const size_t __llen = strlen(__old) + 1;
- char* __sav = new char[__llen];
- memcpy(__sav, __old, __llen);
- setlocale(LC_ALL, _M_name_timepunct);
+ char* __sav = 0;
+ if (__old)
+ {
+ 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;