diff --git a/src/ripple/server/impl/BaseWSPeer.h b/src/ripple/server/impl/BaseWSPeer.h index b2ba7dd6572..fd1722df003 100644 --- a/src/ripple/server/impl/BaseWSPeer.h +++ b/src/ripple/server/impl/BaseWSPeer.h @@ -29,6 +29,7 @@ #include #include #include + #include #include @@ -52,6 +53,9 @@ class BaseWSPeer : public BasePeer, public WSSession boost::beast::multi_buffer rb_; boost::beast::multi_buffer wb_; std::list> wq_; + /// The socket has been closed, or will close after the next write + /// finishes. Do not do any more writes, and don't try to close + /// again. bool do_close_ = false; boost::beast::websocket::close_reason cr_; waitable_timer timer_; @@ -256,6 +260,8 @@ BaseWSPeer::close( return post(strand_, [self = impl().shared_from_this(), reason] { self->close(reason); }); + if (do_close_) + return; do_close_ = true; if (wq_.empty()) { @@ -348,6 +354,7 @@ BaseWSPeer::on_write_fin(error_code const& ec) return fail(ec, "write_fin"); wq_.pop_front(); if (do_close_) + { impl().ws_.async_close( cr_, bind_executor( @@ -356,6 +363,7 @@ BaseWSPeer::on_write_fin(error_code const& ec) &BaseWSPeer::on_close, impl().shared_from_this(), std::placeholders::_1))); + } else if (!wq_.empty()) on_write({}); }