mirror of
https://github.com/boostorg/beast.git
synced 2025-08-02 14:24:31 +02:00
Fix unaligned reads in utf8-checker
This commit is contained in:
@@ -1,3 +1,9 @@
|
|||||||
|
Version 58:
|
||||||
|
|
||||||
|
* Fix unaligned reads in utf8-checker
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
Version 57:
|
Version 57:
|
||||||
|
|
||||||
* Fix message.hpp javadocs
|
* Fix message.hpp javadocs
|
||||||
|
@@ -245,39 +245,59 @@ write(std::uint8_t const* in, std::size_t size)
|
|||||||
p_ = have_;
|
p_ = have_;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto last = in + size - 7;
|
if(size <= sizeof(std::size_t))
|
||||||
|
goto slow;
|
||||||
|
|
||||||
|
// align in to sizeof(std::size_t) boundary
|
||||||
|
{
|
||||||
|
auto const in0 = in;
|
||||||
|
auto last = reinterpret_cast<std::uint8_t const*>(
|
||||||
|
((reinterpret_cast<std::uintptr_t>(in) + sizeof(std::size_t) - 1) /
|
||||||
|
sizeof(std::size_t)) * sizeof(std::size_t));
|
||||||
while(in < last)
|
while(in < last)
|
||||||
{
|
{
|
||||||
#if BEAST_WEBSOCKET_NO_UNALIGNED_READ
|
if(*in & 0x80)
|
||||||
auto constexpr align = sizeof(std::size_t) - 1;
|
{
|
||||||
|
size = size - (in - in0);
|
||||||
|
goto slow;
|
||||||
|
}
|
||||||
|
++in;
|
||||||
|
}
|
||||||
|
size = size - (in - in0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// fast loop
|
||||||
|
{
|
||||||
|
auto const in0 = in;
|
||||||
|
auto last = in + size - 7;
|
||||||
auto constexpr mask = static_cast<
|
auto constexpr mask = static_cast<
|
||||||
std::size_t>(0x8080808080808080 &
|
std::size_t>(0x8080808080808080 & ~std::size_t{0});
|
||||||
~std::size_t{0});
|
while(in < last)
|
||||||
if(
|
{
|
||||||
((reinterpret_cast<
|
if((*reinterpret_cast<std::size_t const*>(in) & mask) != 0)
|
||||||
std::uintptr_t>(in) & align) == 0) &&
|
{
|
||||||
(*reinterpret_cast<
|
size = size - (in - in0);
|
||||||
std::size_t const*>(in) & mask) == 0)
|
goto slow;
|
||||||
|
}
|
||||||
in += sizeof(std::size_t);
|
in += sizeof(std::size_t);
|
||||||
else if(! valid(in))
|
|
||||||
return false;
|
|
||||||
#else
|
|
||||||
auto constexpr mask = static_cast<
|
|
||||||
std::size_t>(0x8080808080808080 &
|
|
||||||
~std::size_t{0});
|
|
||||||
if(
|
|
||||||
(*reinterpret_cast<
|
|
||||||
std::size_t const*>(in) & mask) == 0)
|
|
||||||
in += sizeof(std::size_t);
|
|
||||||
else if(! valid(in))
|
|
||||||
return false;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
last += 4;
|
last += 4;
|
||||||
while(in < last)
|
while(in < last)
|
||||||
if(! valid(in))
|
if(! valid(in))
|
||||||
return false;
|
return false;
|
||||||
|
goto tail;
|
||||||
|
}
|
||||||
|
|
||||||
|
// slow loop: one code point at a time
|
||||||
|
slow:
|
||||||
|
{
|
||||||
|
auto last = in + size - 3;
|
||||||
|
while(in < last)
|
||||||
|
if(! valid(in))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
tail:
|
||||||
for(;;)
|
for(;;)
|
||||||
{
|
{
|
||||||
auto n = end - in;
|
auto n = end - in;
|
||||||
|
Reference in New Issue
Block a user