// U+100000..U+10FFFF | F4 | 80..8F | 80..BF | 80..BF |
// -------------------+----------+----------+----------+----------+
-bool wxStringOperationsUtf8::IsValidUtf8String(const char *str)
+bool wxStringOperationsUtf8::IsValidUtf8String(const char *str, size_t len)
{
if ( !str )
return true; // empty string is UTF8 string
const unsigned char *c = (const unsigned char*)str;
+ const unsigned char * const end = (len == wxStringImpl::npos) ? NULL : c + len;
- for ( ; *c; ++c )
+ for ( ; c != end && *c; ++c )
{
unsigned char b = *c;
+ if ( end != NULL )
+ {
+ // if the string is not NULL-terminated, verify we have enough
+ // bytes in it left for current character's encoding:
+ if ( c + ms_utf8IterTable[*c] > end )
+ return false;
+ }
+
if ( b <= 0x7F ) // 00..7F
continue;