diff options
author | android-build-team Robot <android-build-team-robot@google.com> | 2018-04-17 18:03:23 +0000 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2018-04-17 18:03:23 +0000 |
commit | cb0f6139bd58d9e0113b6c75f5f7965ca7850179 (patch) | |
tree | 11d5e9d6bbaef903597d9399008459a678b834c7 | |
parent | f994033f998c0bd5f8815f151a648087e9b7a4f4 (diff) | |
parent | 8fe4fc5762a2051b3c45722e0c4147679f3f8fd6 (diff) | |
download | core-android-8.1.0_r29.tar.gz |
Merge cherrypicks of [3912569, 3913632, 3913633, 3913557, 3913471, 3913509, 3913558, 3913541, 3913542, 3913472, 3913473, 3913735, 3913736, 3913737, 3913738, 3913739, 3913510, 3913511, 3913512, 3913513, 3913514, 3913559, 3913560, 3913755, 3913795, 3912643, 3913543, 3912570, 3913057] into sparse-4669640-L32000000164199687android-8.1.0_r29oreo-m4-s4-release
Change-Id: I635bc21c270675100599bc9a7b9b9ec90d4e9782
-rw-r--r-- | libutils/String16.cpp | 62 |
1 files changed, 34 insertions, 28 deletions
diff --git a/libutils/String16.cpp b/libutils/String16.cpp index ad335c399..e8f1c5184 100644 --- a/libutils/String16.cpp +++ b/libutils/String16.cpp @@ -79,6 +79,23 @@ static char16_t* allocFromUTF8(const char* u8str, size_t u8len) return getEmptyString(); } +static char16_t* allocFromUTF16(const char16_t* u16str, size_t u16len) { + if (u16len >= SIZE_MAX / sizeof(char16_t)) { + android_errorWriteLog(0x534e4554, "73826242"); + abort(); + } + + SharedBuffer* buf = SharedBuffer::alloc((u16len + 1) * sizeof(char16_t)); + ALOG_ASSERT(buf, "Unable to allocate shared buffer"); + if (buf) { + char16_t* str = (char16_t*)buf->data(); + memcpy(str, u16str, u16len * sizeof(char16_t)); + str[u16len] = 0; + return str; + } + return getEmptyString(); +} + // --------------------------------------------------------------------------- String16::String16() @@ -111,35 +128,9 @@ String16::String16(const String16& o, size_t len, size_t begin) setTo(o, len, begin); } -String16::String16(const char16_t* o) -{ - size_t len = strlen16(o); - SharedBuffer* buf = SharedBuffer::alloc((len+1)*sizeof(char16_t)); - ALOG_ASSERT(buf, "Unable to allocate shared buffer"); - if (buf) { - char16_t* str = (char16_t*)buf->data(); - strcpy16(str, o); - mString = str; - return; - } - - mString = getEmptyString(); -} - -String16::String16(const char16_t* o, size_t len) -{ - SharedBuffer* buf = SharedBuffer::alloc((len+1)*sizeof(char16_t)); - ALOG_ASSERT(buf, "Unable to allocate shared buffer"); - if (buf) { - char16_t* str = (char16_t*)buf->data(); - memcpy(str, o, len*sizeof(char16_t)); - str[len] = 0; - mString = str; - return; - } +String16::String16(const char16_t* o) : mString(allocFromUTF16(o, strlen16(o))) {} - mString = getEmptyString(); -} +String16::String16(const char16_t* o, size_t len) : mString(allocFromUTF16(o, len)) {} String16::String16(const String8& o) : mString(allocFromUTF8(o.string(), o.size())) @@ -201,6 +192,11 @@ status_t String16::setTo(const char16_t* other) status_t String16::setTo(const char16_t* other, size_t len) { + if (len >= SIZE_MAX / sizeof(char16_t)) { + android_errorWriteLog(0x534e4554, "73826242"); + abort(); + } + SharedBuffer* buf = SharedBuffer::bufferFromData(mString) ->editResize((len+1)*sizeof(char16_t)); if (buf) { @@ -224,6 +220,11 @@ status_t String16::append(const String16& other) return NO_ERROR; } + if (myLen >= SIZE_MAX / sizeof(char16_t) - otherLen) { + android_errorWriteLog(0x534e4554, "73826242"); + abort(); + } + SharedBuffer* buf = SharedBuffer::bufferFromData(mString) ->editResize((myLen+otherLen+1)*sizeof(char16_t)); if (buf) { @@ -245,6 +246,11 @@ status_t String16::append(const char16_t* chrs, size_t otherLen) return NO_ERROR; } + if (myLen >= SIZE_MAX / sizeof(char16_t) - otherLen) { + android_errorWriteLog(0x534e4554, "73826242"); + abort(); + } + SharedBuffer* buf = SharedBuffer::bufferFromData(mString) ->editResize((myLen+otherLen+1)*sizeof(char16_t)); if (buf) { |