OSDN Git Service

Fix newlocale with a NULL locale name.
authorElliott Hughes <enh@google.com>
Wed, 5 Nov 2014 02:03:44 +0000 (18:03 -0800)
committerElliott Hughes <enh@google.com>
Wed, 5 Nov 2014 02:03:44 +0000 (18:03 -0800)
Bug: https://code.google.com/p/android/issues/detail?id=78567
Change-Id: I272dabc12ab186b44a525c7e8ac1846e62334e85

libc/bionic/locale.cpp
tests/locale_test.cpp

index ddb49ce..b4a3472 100644 (file)
@@ -123,8 +123,8 @@ void freelocale(locale_t l) {
 }
 
 locale_t newlocale(int category_mask, const char* locale_name, locale_t /*base*/) {
-  // Is 'category_mask' valid?
-  if ((category_mask & ~LC_ALL_MASK) != 0) {
+  // Are 'category_mask' and 'locale_name' valid?
+  if ((category_mask & ~LC_ALL_MASK) != 0 || locale_name == NULL) {
     errno = EINVAL;
     return NULL;
   }
index 7ec607a..f308af5 100644 (file)
@@ -71,20 +71,30 @@ TEST(locale, setlocale) {
   EXPECT_EQ(ENOENT, errno); // POSIX specified, not an implementation detail!
 }
 
-TEST(locale, newlocale) {
+TEST(locale, newlocale_invalid_category_mask) {
   errno = 0;
   EXPECT_EQ(0, newlocale(1 << 20, "C", 0));
   EXPECT_EQ(EINVAL, errno);
+}
 
-  locale_t l = newlocale(LC_ALL, "C", 0);
-  ASSERT_TRUE(l != NULL);
-  freelocale(l);
+TEST(locale, newlocale_NULL_locale_name) {
+  errno = 0;
+  EXPECT_EQ(0, newlocale(LC_ALL, NULL, 0));
+  EXPECT_EQ(EINVAL, errno);
+}
 
+TEST(locale, newlocale_bad_locale_name) {
   errno = 0;
   EXPECT_EQ(0, newlocale(LC_ALL, "this-is-not-a-locale", 0));
   EXPECT_EQ(ENOENT, errno); // POSIX specified, not an implementation detail!
 }
 
+TEST(locale, newlocale) {
+  locale_t l = newlocale(LC_ALL, "C", 0);
+  ASSERT_TRUE(l != NULL);
+  freelocale(l);
+}
+
 TEST(locale, duplocale) {
   locale_t cloned_global = duplocale(LC_GLOBAL_LOCALE);
   ASSERT_TRUE(cloned_global != NULL);