diff options
Diffstat (limited to 'libutils/Unicode.cpp')
| -rw-r--r-- | libutils/Unicode.cpp | 61 |
1 files changed, 38 insertions, 23 deletions
diff --git a/libutils/Unicode.cpp b/libutils/Unicode.cpp index f1a41b96f1..e00fb81afa 100644 --- a/libutils/Unicode.cpp +++ b/libutils/Unicode.cpp @@ -16,11 +16,10 @@ #define LOG_TAG "unicode" +#include <utils/Unicode.h> #include <limits.h> -#include <stddef.h> #include <log/log.h> -#include <utils/Unicode.h> #if defined(_WIN32) # undef nhtol @@ -160,7 +159,7 @@ int32_t utf32_from_utf8_at(const char *src, size_t src_len, size_t index, size_t return -1; } size_t dummy_index; - if (next_index == NULL) { + if (next_index == nullptr) { next_index = &dummy_index; } size_t num_read; @@ -174,21 +173,29 @@ int32_t utf32_from_utf8_at(const char *src, size_t src_len, size_t index, size_t ssize_t utf32_to_utf8_length(const char32_t *src, size_t src_len) { - if (src == NULL || src_len == 0) { + if (src == nullptr || src_len == 0) { return -1; } size_t ret = 0; const char32_t *end = src + src_len; while (src < end) { - ret += utf32_codepoint_utf8_length(*src++); + size_t char_len = utf32_codepoint_utf8_length(*src++); + if (SSIZE_MAX - char_len < ret) { + // If this happens, we would overflow the ssize_t type when + // returning from this function, so we cannot express how + // long this string is in an ssize_t. + android_errorWriteLog(0x534e4554, "37723026"); + return -1; + } + ret += char_len; } return ret; } void utf32_to_utf8(const char32_t* src, size_t src_len, char* dst, size_t dst_len) { - if (src == NULL || src_len == 0 || dst == NULL) { + if (src == nullptr || src_len == 0 || dst == nullptr) { return; } @@ -298,23 +305,22 @@ size_t strnlen16(const char16_t *s, size_t maxlen) char16_t* strstr16(const char16_t* src, const char16_t* target) { - const char16_t needle = *target++; - const size_t target_len = strlen16(target); - if (needle != '\0') { - do { + const char16_t needle = *target; + if (needle == '\0') return (char16_t*)src; + + const size_t target_len = strlen16(++target); + do { do { - if (*src == '\0') { - return nullptr; - } + if (*src == '\0') { + return nullptr; + } } while (*src++ != needle); - } while (strncmp16(src, target, target_len) != 0); - src--; - } + } while (strncmp16(src, target, target_len) != 0); + src--; return (char16_t*)src; } - int strzcmp16(const char16_t *s1, size_t n1, const char16_t *s2, size_t n2) { const char16_t* e1 = s1+n1; @@ -357,7 +363,7 @@ int strzcmp16_h_n(const char16_t *s1H, size_t n1, const char16_t *s2N, size_t n2 void utf16_to_utf8(const char16_t* src, size_t src_len, char* dst, size_t dst_len) { - if (src == NULL || src_len == 0 || dst == NULL) { + if (src == nullptr || src_len == 0 || dst == nullptr) { return; } @@ -434,21 +440,30 @@ ssize_t utf8_length(const char *src) ssize_t utf16_to_utf8_length(const char16_t *src, size_t src_len) { - if (src == NULL || src_len == 0) { + if (src == nullptr || src_len == 0) { return -1; } size_t ret = 0; const char16_t* const end = src + src_len; while (src < end) { + size_t char_len; if ((*src & 0xFC00) == 0xD800 && (src + 1) < end && (*(src + 1) & 0xFC00) == 0xDC00) { // surrogate pairs are always 4 bytes. - ret += 4; + char_len = 4; src += 2; } else { - ret += utf32_codepoint_utf8_length((char32_t) *src++); + char_len = utf32_codepoint_utf8_length((char32_t)*src++); + } + if (SSIZE_MAX - char_len < ret) { + // If this happens, we would overflow the ssize_t type when + // returning from this function, so we cannot express how + // long this string is in an ssize_t. + android_errorWriteLog(0x534e4554, "37723026"); + return -1; } + ret += char_len; } return ret; } @@ -475,7 +490,7 @@ static inline void utf8_shift_and_mask(uint32_t* codePoint, const uint8_t byte) size_t utf8_to_utf32_length(const char *src, size_t src_len) { - if (src == NULL || src_len == 0) { + if (src == nullptr || src_len == 0) { return 0; } size_t ret = 0; @@ -500,7 +515,7 @@ size_t utf8_to_utf32_length(const char *src, size_t src_len) void utf8_to_utf32(const char* src, size_t src_len, char32_t* dst) { - if (src == NULL || src_len == 0 || dst == NULL) { + if (src == nullptr || src_len == 0 || dst == nullptr) { return; } |
