Handle invalid deflate frames:

This fixes a problem where an assert is generated or an
error is ignored when an invalid deflate stream is produced
after appending the final empty deflate block.
This commit is contained in:
Vinnie Falco committed 2017-12-04 12:05:36 -08:00
1 parent 1b86bc3c36
commit 4053c1bb09
7 files changed
+206 -18

No files matched your search

+4 -1
View File
@@ -30,7 +30,10 @@ enum class error
handshake_failed,
/// buffer overflow
buffer_overflow
buffer_overflow,
/// partial deflate block
partial_deflate_block
};
} // websocket
@@ -43,6 +43,7 @@ public:
case error::closed: return "WebSocket connection closed normally";
case error::handshake_failed: return "WebSocket upgrade handshake failed";
case error::buffer_overflow: return "WebSocket dynamic buffer overflow";
case error::partial_deflate_block: return "WebSocket partial deflate block";
}
}
+16 -16
View File
@@ -512,13 +512,14 @@ operator()(
zs.next_in = empty_block;
zs.avail_in = sizeof(empty_block);
ws_.pmd_->zi.write(zs, zlib::Flush::sync, ec);
BOOST_ASSERT(! ec);
// VFALCO See:
// https://github.com/madler/zlib/issues/280
BOOST_ASSERT(zs.total_out == 0);
cb_.consume(zs.total_out);
ws_.rd_size_ += zs.total_out;
bytes_written_ += zs.total_out;
if(! ec)
{
// https://github.com/madler/zlib/issues/280
if(zs.total_out > 0)
ec = error::partial_deflate_block;
}
if(! ws_.check_ok(ec))
goto upcall;
if(
(ws_.role_ == role_type::client &&
ws_.pmd_config_.server_no_context_takeover) ||
@@ -533,7 +534,6 @@ operator()(
break;
}
ws_.pmd_->zi.write(zs, zlib::Flush::sync, ec);
BOOST_ASSERT(ec != zlib::error::end_of_stream);
if(! ws_.check_ok(ec))
goto upcall;
if(ws_.rd_msg_max_ && beast::detail::sum_exceeds(
@@ -1239,13 +1239,14 @@ loop:
zs.next_in = empty_block;
zs.avail_in = sizeof(empty_block);
pmd_->zi.write(zs, zlib::Flush::sync, ec);
BOOST_ASSERT(! ec);
// VFALCO See:
// https://github.com/madler/zlib/issues/280
BOOST_ASSERT(zs.total_out == 0);
cb.consume(zs.total_out);
rd_size_ += zs.total_out;
bytes_written += zs.total_out;
if(! ec)
{
// https://github.com/madler/zlib/issues/280
if(zs.total_out > 0)
ec = error::partial_deflate_block;
}
if(! check_ok(ec))
return bytes_written;
if(
(role_ == role_type::client &&
pmd_config_.server_no_context_takeover) ||
@@ -1260,7 +1261,6 @@ loop:
break;
}
pmd_->zi.write(zs, zlib::Flush::sync, ec);
BOOST_ASSERT(ec != zlib::error::end_of_stream);
if(! check_ok(ec))
return bytes_written;
if(rd_msg_max_ && beast::detail::sum_exceeds(
+1 -1
View File
@@ -69,7 +69,7 @@ public:
switch(static_cast<error>(ev))
{
case error::need_buffers: return "need buffers";
case error::end_of_stream: return "end of stream";
case error::end_of_stream: return "unexpected end of deflate stream";
case error::stream_error: return "stream error";
case error::invalid_block_type: return "invalid block type";