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.

Bionic will fix this problem. Keep this patch local in
order to be able to target previous/existing releases of the
platform.
Change-Id: I76a51dcfea8d7e41c4ace5178b24bf42c1f7e26e
diff --git a/gcc-4.4.3/README.google b/gcc-4.4.3/README.google
index c6b3587..bfddb6d 100644
--- a/gcc-4.4.3/README.google
+++ b/gcc-4.4.3/README.google
@@ -2111,3 +2111,10 @@
   Back port upstream fixes r156042 and r148110 to fix broken tests.
   Owner: dougkwan
   Status: in upstream.
+
+libstdc++-v3/config/locale/generic/c_locale.cc
+libstdc++-v3/config/locale/generic/c_locale.h
+libstdc++-v3/config/locale/generic/time_members.cc
+  Hanlde NULL return value of setlocale(), required by bionic.
+  Owner: jingyu
+  Status: local
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..587dc11 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
@@ -51,10 +51,14 @@
     {
       // 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;
+          __sav = new char[__len];
+          memcpy(__sav, __old, __len);
+          setlocale(LC_ALL, "C");
+        }
       char* __sanity;
       bool __overflow = false;
 
@@ -116,10 +120,14 @@
     {
       // 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;
+          __sav = new char[__len];
+          memcpy(__sav, __old, __len);
+          setlocale(LC_ALL, "C");
+        }
       char* __sanity;
 
 #if !__DBL_HAS_INFINITY__
@@ -161,10 +169,14 @@
     {
       // 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;
+          __sav = new char[__len];
+          memcpy(__sav, __old, __len);
+          setlocale(LC_ALL, "C");
+        }
 
 #if !__LDBL_HAS_INFINITY__
       errno = 0;
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 @@
   {
     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..4662294 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
@@ -43,10 +43,14 @@
 	   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);
-      setlocale(LC_ALL, _M_name_timepunct);
+      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;
@@ -128,10 +132,14 @@
 	   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);
-      setlocale(LC_ALL, _M_name_timepunct);
+      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 = wcsftime(__s, __maxlen, __format, __tm);
       setlocale(LC_ALL, __sav);
       delete [] __sav;