From f0f834df3d62cbcb17c67225ce09303847eebb6f Mon Sep 17 00:00:00 2001
From: Adrien Beraud <adrien.beraud@savoirfairelinux.com>
Date: Fri, 17 Jan 2025 11:38:33 -0500
Subject: [PATCH] multiplexed socket: avoid use-after-free

Change-Id: I0c093ea4e1834866fd08abb30d51d5043fe1f455
---
 src/multiplexed_socket.cpp | 14 +++++++++-----
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/src/multiplexed_socket.cpp b/src/multiplexed_socket.cpp
index 6d1e002..8dbf786 100644
--- a/src/multiplexed_socket.cpp
+++ b/src/multiplexed_socket.cpp
@@ -226,11 +226,15 @@ public:
 void
 MultiplexedSocket::Impl::eventLoop()
 {
-    endpoint->setOnStateChange([this](tls::TlsSessionState state) {
-        if (state == tls::TlsSessionState::SHUTDOWN && !isShutdown_) {
-            if (logger_)
-                logger_->debug("Tls endpoint is down, shutdown multiplexed socket");
-            shutdown();
+    endpoint->setOnStateChange([w = parent_.weak_from_this()](tls::TlsSessionState state) {
+        auto ssock = w.lock();
+        if (!ssock)
+            return false;
+        auto& this_ = *ssock->pimpl_;
+        if (state == tls::TlsSessionState::SHUTDOWN && !this_.isShutdown_) {
+            if (this_.logger_)
+                this_.logger_->debug("Tls endpoint is down, shutdown multiplexed socket");
+            this_.shutdown();
             return false;
         }
         return true;
-- 
GitLab