Sending invalid UTF-8 TEXT message should fail and close the connection (fix remaining autobahn test: 6.X UTF-8 Handling)
This commit is contained in:
@ -8,66 +8,12 @@
|
||||
#include "IXSetThreadName.h"
|
||||
#include "IXWebSocketHandshake.h"
|
||||
#include "IXExponentialBackoff.h"
|
||||
#include "IXUtf8Validator.h"
|
||||
|
||||
#include <cmath>
|
||||
#include <cassert>
|
||||
#include <iostream>
|
||||
|
||||
namespace
|
||||
{
|
||||
//
|
||||
// Stolen from here http://www.zedwood.com/article/cpp-is-valid-utf8-string-function
|
||||
// There doesn't seem to be anything in the C++ library so far to do that.
|
||||
// The closest thing is code for converting from utf-8 to utf-16 or utf-32 but
|
||||
// that isn't working well for some broken input strings.
|
||||
//
|
||||
bool isValidUtf8(const std::string& str)
|
||||
{
|
||||
size_t i = 0;
|
||||
size_t ix = str.length();
|
||||
int c, n, j;
|
||||
|
||||
for (; i < ix; i++)
|
||||
{
|
||||
c = (unsigned char) str[i];
|
||||
//if (c==0x09 || c==0x0a || c==0x0d || (0x20 <= c && c <= 0x7e) ) n = 0; // is_printable_ascii
|
||||
if (0x00 <= c && c <= 0x7f)
|
||||
{
|
||||
n = 0; // 0bbbbbbb
|
||||
}
|
||||
else if ((c & 0xE0) == 0xC0)
|
||||
{
|
||||
n = 1; // 110bbbbb
|
||||
}
|
||||
else if ( c==0xed && i<(ix-1) && ((unsigned char)str[i+1] & 0xa0)==0xa0)
|
||||
{
|
||||
return false; //U+d800 to U+dfff
|
||||
}
|
||||
else if ((c & 0xF0) == 0xE0)
|
||||
{
|
||||
n = 2; // 1110bbbb
|
||||
}
|
||||
else if ((c & 0xF8) == 0xF0)
|
||||
{
|
||||
n = 3; // 11110bbb
|
||||
}
|
||||
//else if (($c & 0xFC) == 0xF8) n=4; // 111110bb //byte 5, unnecessary in 4 byte UTF-8
|
||||
//else if (($c & 0xFE) == 0xFC) n=5; // 1111110b //byte 6, unnecessary in 4 byte UTF-8
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
for (j=0; j<n && i<ix; j++)
|
||||
{ // n bytes matching 10bbbbbb follow ?
|
||||
if ((++i == ix) || (( (unsigned char)str[i] & 0xC0) != 0x80))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
namespace ix
|
||||
{
|
||||
@ -459,7 +405,7 @@ namespace ix
|
||||
WebSocketSendInfo WebSocket::sendText(const std::string& text,
|
||||
const OnProgressCallback& onProgressCallback)
|
||||
{
|
||||
if (!isValidUtf8(text))
|
||||
if (!validateUtf8(text))
|
||||
{
|
||||
close(WebSocketCloseConstants::kInvalidFramePayloadData,
|
||||
WebSocketCloseConstants::kInvalidFramePayloadDataMessage);
|
||||
|
Reference in New Issue
Block a user