diff options
author | Sergio Giro <sgiro@google.com> | 2016-06-28 18:02:29 +0100 |
---|---|---|
committer | gitbuildkicker <android-build@google.com> | 2016-07-21 17:35:58 -0700 |
commit | 3c28cda5d0120eb7bf7a49b36b96f45c0a588232 (patch) | |
tree | f8ac5f336ba4a8c575d29915f7c087eb624556be /libutils/tests/String8_test.cpp | |
parent | 671d62d73c9c643159107ca77721b6540ef79eea (diff) | |
download | system_core-3c28cda5d0120eb7bf7a49b36b96f45c0a588232.tar.gz system_core-3c28cda5d0120eb7bf7a49b36b96f45c0a588232.tar.bz2 system_core-3c28cda5d0120eb7bf7a49b36b96f45c0a588232.zip |
libutils/Unicode.cpp: Correct length computation and add checks for utf16->utf8
Inconsistent behaviour between utf16_to_utf8 and utf16_to_utf8_length
is causing a heap overflow.
Correcting the length computation and adding bound checks to the
conversion functions.
Test: ran libutils_tests
Bug: 29250543
Change-Id: I6115e3357141ed245c63c6eb25fc0fd0a9a7a2bb
(cherry picked from commit c4966a363e46d2e1074d1a365e232af0dcedd6a1)
Diffstat (limited to 'libutils/tests/String8_test.cpp')
-rw-r--r-- | libutils/tests/String8_test.cpp | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/libutils/tests/String8_test.cpp b/libutils/tests/String8_test.cpp index c42c68dce..7cd67d314 100644 --- a/libutils/tests/String8_test.cpp +++ b/libutils/tests/String8_test.cpp @@ -17,6 +17,7 @@ #define LOG_TAG "String8_test" #include <utils/Log.h> #include <utils/String8.h> +#include <utils/String16.h> #include <gtest/gtest.h> @@ -72,4 +73,22 @@ TEST_F(String8Test, OperatorPlusEquals) { EXPECT_STREQ(src3, " Verify me."); } +// http://b/29250543 +TEST_F(String8Test, CorrectInvalidSurrogate) { + // d841d8 is an invalid start for a surrogate pair. Make sure this is handled by ignoring the + // first character in the pair and handling the rest correctly. + String16 string16(u"\xd841\xd841\xdc41\x0000"); + String8 string8(string16); + + EXPECT_EQ(4U, string8.length()); +} + +TEST_F(String8Test, CheckUtf32Conversion) { + // Since bound checks were added, check the conversion can be done without fatal errors. + // The utf8 lengths of these are chars are 1 + 2 + 3 + 4 = 10. + const char32_t string32[] = U"\x0000007f\x000007ff\x0000911\x0010fffe"; + String8 string8(string32); + EXPECT_EQ(10U, string8.length()); +} + } |