Skip to content

Commit

Permalink
Fix exception in server
Browse files Browse the repository at this point in the history
It can happen that a connection handler calls writefun when the
connection is already destroyed. This causes bad_weak_ptr exceptions
thrown from the server.

Fix this issue by skipping the respective do_write invocations.
  • Loading branch information
m8mble committed Feb 23, 2023
1 parent e877868 commit b4745aa
Showing 1 changed file with 12 additions and 1 deletion.
13 changes: 12 additions & 1 deletion lib/asio_server_connection.h
Original file line number Diff line number Diff line change
Expand Up @@ -88,9 +88,20 @@ class connection : public std::enable_shared_from_this<connection<socket_type>>,
void start() {
boost::system::error_code ec;

auto make_writefun = [original_self = this->shared_from_this()] {
return [weak = std::weak_ptr<connection>{original_self}]() {
auto self = weak.lock();
// If connection already got destroyed, the socket is already closed in particular.
// Therefore we can simply ignore further calls to write.
if (self) {
self->do_write();
}
};
};

handler_ = std::make_shared<http2_handler>(
GET_IO_SERVICE(socket_), socket_.lowest_layer().remote_endpoint(ec),
[this]() { do_write(); }, mux_);
make_writefun(), mux_);
if (handler_->start() != 0) {
stop();
return;
Expand Down

0 comments on commit b4745aa

Please sign in to comment.