From 4e836f05a96f17b94774a127bf49c327c560d82e Mon Sep 17 00:00:00 2001 From: Povilas Kanapickas Date: Fri, 22 Nov 2024 14:33:53 +0200 Subject: [PATCH] net/tls: Wait for data_{source,sink}::close() Fixes https://github.com/scylladb/seastar/issues/799 data_{source,sink}::close() return a future. If it is not ready on close() return, then the current tls session close() may result in use after free. Converting close_after_shutdown() to a coroutine and sequentially co_awaiting on close() addresses this issue. The waiting is done sequentially, as this is shutdown path anyway. --- src/net/tls.cc | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/net/tls.cc b/src/net/tls.cc index 54e95abe2e..9c918a5c2b 100644 --- a/src/net/tls.cc +++ b/src/net/tls.cc @@ -24,6 +24,7 @@ module; #endif #include +#include #include #include #include @@ -1604,17 +1605,18 @@ class session : public enable_lw_shared_from_this { future<> close_after_shutdown() { _eof = true; try { - (void)_in.close().handle_exception([](std::exception_ptr) {}); // should wake any waiters + co_await _in.close(); // should wake any waiters } catch (...) { } try { - (void)_out.close().handle_exception([](std::exception_ptr) {}); + co_await _out.close(); } catch (...) { } + // make sure to wait for handshake attempt to leave semaphores. Must be in same order as // handshake aqcuire, because in worst case, we get here while a reader is attempting // re-handshake. - return with_semaphore(_in_sem, 1, [this] { + co_await with_semaphore(_in_sem, 1, [this] { return with_semaphore(_out_sem, 1, [] {}); }); }