summaryrefslogtreecommitdiffstats
path: root/libutils/tests/String8_test.cpp
diff options
context:
space:
mode:
authorSergio Giro <sgiro@google.com>2016-06-28 18:02:29 +0100
committergitbuildkicker <android-build@google.com>2016-08-16 15:52:46 -0700
commitf2059d3fd959ce6f0d8a106ad4483c733aab3f66 (patch)
tree3e75e4cf077370505a94b29b97696fc6aa8edb74 /libutils/tests/String8_test.cpp
parentae18eb014609948a40e22192b87b10efc680daa7 (diff)
downloadsystem_core-f2059d3fd959ce6f0d8a106ad4483c733aab3f66.zip
system_core-f2059d3fd959ce6f0d8a106ad4483c733aab3f66.tar.gz
system_core-f2059d3fd959ce6f0d8a106ad4483c733aab3f66.tar.bz2
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.cpp19
1 files changed, 19 insertions, 0 deletions
diff --git a/libutils/tests/String8_test.cpp b/libutils/tests/String8_test.cpp
index c42c68d..7cd67d3 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());
+}
+
}