Servers: add explicit error checking to low level coro_ functions

This commit is contained in:
loonycyborg 2022-10-03 19:39:31 +03:00
parent 491c6464f9
commit f308614328
No known key found for this signature in database
GPG key ID: 6E8233FAB8F26D61
2 changed files with 12 additions and 8 deletions

View file

@ -495,9 +495,8 @@ template<class Socket>
void server::serve_requests(Socket socket, boost::asio::yield_context yield)
{
while(true) {
boost::system::error_code ec;
auto doc { coro_receive_doc(socket, yield[ec]) };
if(check_error(ec, socket) || !doc) {
auto doc { coro_receive_doc(socket, yield) };
if(!doc) {
socket->lowest_layer().close();
return;
}

View file

@ -345,14 +345,17 @@ template<class SocketPtr> void coro_send_file_userspace(SocketPtr socket, const
} data_size {};
data_size.size = htonl(filesize);
async_write(*socket, boost::asio::buffer(data_size.buf), yield);
boost::system::error_code ec;
async_write(*socket, boost::asio::buffer(data_size.buf), yield[ec]);
if(check_error(ec, socket)) return;
auto ifs { filesystem::istream_file(filename) };
ifs->seekg(0);
while(ifs->good()) {
char buf[16384];
ifs->read(buf, sizeof(buf));
async_write(*socket, boost::asio::buffer(buf, ifs->gcount()), yield);
async_write(*socket, boost::asio::buffer(buf, ifs->gcount()), yield[ec]);
if(check_error(ec, socket)) return;
}
}
@ -507,8 +510,9 @@ template<class SocketPtr> std::unique_ptr<simple_wml::document> server_base::cor
uint32_t size;
char buf[4];
} data_size {};
async_read(*socket, boost::asio::buffer(data_size.buf, 4), yield);
if(*yield.ec_) return {};
boost::system::error_code ec;
async_read(*socket, boost::asio::buffer(data_size.buf, 4), yield[ec]);
if(check_error(ec, socket)) return {};
uint32_t size = ntohl(data_size.size);
if(size == 0) {
@ -525,7 +529,8 @@ template<class SocketPtr> std::unique_ptr<simple_wml::document> server_base::cor
}
boost::shared_array<char> buffer{ new char[size] };
async_read(*socket, boost::asio::buffer(buffer.get(), size), yield);
async_read(*socket, boost::asio::buffer(buffer.get(), size), yield[ec]);
if(check_error(ec, socket)) return {};
try {
simple_wml::string_span compressed_buf(buffer.get(), size);