diff options
author | Elliott Hughes <enh@google.com> | 2014-11-04 18:03:44 -0800 |
---|---|---|
committer | Elliott Hughes <enh@google.com> | 2014-11-04 18:03:44 -0800 |
commit | 7e0d0f8572152c47a993e7bc8407690556754bd4 (patch) | |
tree | 4098f53c0801f8076c1080604ab98a363efdbd41 | |
parent | 695781b6f0419f82939176a6ec1a240300d9f036 (diff) | |
download | bionic-7e0d0f8572152c47a993e7bc8407690556754bd4.zip bionic-7e0d0f8572152c47a993e7bc8407690556754bd4.tar.gz bionic-7e0d0f8572152c47a993e7bc8407690556754bd4.tar.bz2 |
Fix newlocale with a NULL locale name.
Bug: https://code.google.com/p/android/issues/detail?id=78567
Change-Id: I272dabc12ab186b44a525c7e8ac1846e62334e85
-rw-r--r-- | libc/bionic/locale.cpp | 4 | ||||
-rw-r--r-- | tests/locale_test.cpp | 18 |
2 files changed, 16 insertions, 6 deletions
diff --git a/libc/bionic/locale.cpp b/libc/bionic/locale.cpp index ddb49ce..b4a3472 100644 --- a/libc/bionic/locale.cpp +++ b/libc/bionic/locale.cpp @@ -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; } diff --git a/tests/locale_test.cpp b/tests/locale_test.cpp index 7ec607a..f308af5 100644 --- a/tests/locale_test.cpp +++ b/tests/locale_test.cpp @@ -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); |