Fix mbsrtowcs(3)'s handling of len parameter.
The len parameter is a _maximum_ length. The previous code was treating it as an exact length, causing the following typical call to fail: mbsrtowcs(out, &in, sizeof(out), state); // sizeof(out) > strlen(in) Change-Id: I48e474fd54ea5f122bc168a4d74bfe08704f28cc
This commit is contained in:
@@ -340,8 +340,19 @@ void test_mbsrtowcs(mbstate_t* ps) {
|
||||
ASSERT_EQ(static_cast<wchar_t>(0x00a2), out[1]);
|
||||
ASSERT_EQ(static_cast<wchar_t>(0x20ac), out[2]);
|
||||
ASSERT_EQ(static_cast<wchar_t>(0x24b62), out[3]);
|
||||
// Check that valid has advanced to the next unread character.
|
||||
ASSERT_EQ('e', *valid);
|
||||
|
||||
wmemset(out, L'x', sizeof(out) / sizeof(wchar_t));
|
||||
ASSERT_EQ(2U, mbsrtowcs(out, &valid, 4, ps));
|
||||
ASSERT_EQ(L'e', out[0]);
|
||||
ASSERT_EQ(L'f', out[1]);
|
||||
ASSERT_EQ(L'\0', out[2]);
|
||||
// Check that we didn't clobber the rest of out.
|
||||
ASSERT_EQ(L'x', out[3]);
|
||||
// Check that valid has advanced to the end of the string.
|
||||
ASSERT_EQ(L'\0', *valid);
|
||||
|
||||
const char* invalid = "A" "\xc2\x20" "ef";
|
||||
ASSERT_EQ(static_cast<size_t>(-1), mbsrtowcs(out, &invalid, 4, ps));
|
||||
EXPECT_EQ(EILSEQ, errno);
|
||||
|
Reference in New Issue
Block a user