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.
(cherry picked from commit c4966a363e)
(changed code for safetynet logging due to lack of sstream and string in klp)
Change-Id: If50d59a91a13fddbff9a8fff0d3eebe57c711e93
Bug: 29250543
95 lines
2.8 KiB
C++
95 lines
2.8 KiB
C++
/*
|
|
* Copyright (C) 2010 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#define LOG_TAG "String8_test"
|
|
#include <utils/Log.h>
|
|
#include <utils/String8.h>
|
|
#include <utils/String16.h>
|
|
|
|
#include <gtest/gtest.h>
|
|
|
|
namespace android {
|
|
|
|
class String8Test : public testing::Test {
|
|
protected:
|
|
virtual void SetUp() {
|
|
}
|
|
|
|
virtual void TearDown() {
|
|
}
|
|
};
|
|
|
|
TEST_F(String8Test, Cstr) {
|
|
String8 tmp("Hello, world!");
|
|
|
|
EXPECT_STREQ(tmp.string(), "Hello, world!");
|
|
}
|
|
|
|
TEST_F(String8Test, OperatorPlus) {
|
|
String8 src1("Hello, ");
|
|
|
|
// Test adding String8 + const char*
|
|
const char* ccsrc2 = "world!";
|
|
String8 dst1 = src1 + ccsrc2;
|
|
EXPECT_STREQ(dst1.string(), "Hello, world!");
|
|
EXPECT_STREQ(src1.string(), "Hello, ");
|
|
EXPECT_STREQ(ccsrc2, "world!");
|
|
|
|
// Test adding String8 + String8
|
|
String8 ssrc2("world!");
|
|
String8 dst2 = src1 + ssrc2;
|
|
EXPECT_STREQ(dst2.string(), "Hello, world!");
|
|
EXPECT_STREQ(src1.string(), "Hello, ");
|
|
EXPECT_STREQ(ssrc2.string(), "world!");
|
|
}
|
|
|
|
TEST_F(String8Test, OperatorPlusEquals) {
|
|
String8 src1("My voice");
|
|
|
|
// Testing String8 += String8
|
|
String8 src2(" is my passport.");
|
|
src1 += src2;
|
|
EXPECT_STREQ(src1.string(), "My voice is my passport.");
|
|
EXPECT_STREQ(src2.string(), " is my passport.");
|
|
|
|
// Adding const char* to the previous string.
|
|
const char* src3 = " Verify me.";
|
|
src1 += src3;
|
|
EXPECT_STREQ(src1.string(), "My voice is my passport. Verify me.");
|
|
EXPECT_STREQ(src2.string(), " is my passport.");
|
|
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.
|
|
char16_t char16_arr[] = { 0xd841, 0xd841, 0xdc41, 0x0000 };
|
|
String16 string16(char16_arr);
|
|
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[] = { 0x0000007f, 0x000007ff, 0x0000911, 0x0010fffe, 0 };
|
|
String8 string8(string32);
|
|
EXPECT_EQ(10U, string8.length());
|
|
}
|
|
|
|
}
|