Skip to content

Commit

Permalink
fix #7074 Safely handle setlocale
Browse files Browse the repository at this point in the history
`setlocale` returns a pointer to a buffer containing the current locale name.
This needs to be copied into a `std::string` or it will be overwritten by the next call.

Trying to call `setlocale` with a non-null, invalid pointer can have unpredictable results, such as
```
[ RUN      ] StringPrintfTest.Multibyte
minkernel\crts\ucrt\src\appcrt\convert\mbstowcs.cpp(246) : Assertion failed: (pwcs == nullptr && sizeInWords == 0) || (pwcs != nullptr && sizeInWords > 0)
```

`setlocale` can also return a `nullptr` if it fails, but we assert against that.
  • Loading branch information
florin-crisan committed Jun 15, 2021
1 parent ee0e153 commit 1dd313c
Showing 1 changed file with 8 additions and 4 deletions.
12 changes: 8 additions & 4 deletions src/google/protobuf/stubs/stringprintf_unittest.cc
Expand Up @@ -91,7 +91,9 @@ TEST(StringPrintfTest, Multibyte) {
// out of memory while trying to determine destination buffer size.
// see b/4194543.

char* old_locale = setlocale(LC_CTYPE, nullptr);
char* old_locale_c = setlocale(LC_CTYPE, nullptr);
ASSERT_TRUE(old_locale_c != nullptr);
std::string old_locale = old_locale_c;
// Push locale with multibyte mode
setlocale(LC_CTYPE, "en_US.utf8");

Expand All @@ -115,15 +117,17 @@ TEST(StringPrintfTest, Multibyte) {
EXPECT_TRUE(value.empty() || value == buf);
delete[] buf;

setlocale(LC_CTYPE, old_locale);
setlocale(LC_CTYPE, old_locale.c_str());
}

TEST(StringPrintfTest, NoMultibyte) {
// No multibyte handling, but the string contains funny chars.
char* old_locale = setlocale(LC_CTYPE, nullptr);
char* old_locale_c = setlocale(LC_CTYPE, nullptr);
ASSERT_TRUE(old_locale_c != nullptr);
std::string old_locale = old_locale_c;
setlocale(LC_CTYPE, "POSIX");
std::string value = StringPrintf("%.*s", 3, "\375\067s");
setlocale(LC_CTYPE, old_locale);
setlocale(LC_CTYPE, old_locale.c_str());
EXPECT_EQ("\375\067s", value);
}

Expand Down

0 comments on commit 1dd313c

Please sign in to comment.