From 7e0d0f8572152c47a993e7bc8407690556754bd4 Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Tue, 4 Nov 2014 18:03:44 -0800 Subject: [PATCH] Fix newlocale with a NULL locale name. Bug: https://code.google.com/p/android/issues/detail?id=78567 Change-Id: I272dabc12ab186b44a525c7e8ac1846e62334e85 --- libc/bionic/locale.cpp | 4 ++-- 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 ddb49ce6f..b4a3472d7 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 7ec607a28..f308af534 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);