From 8981ab5955307fbbece2bbacdbff66ebf08c4c45 Mon Sep 17 00:00:00 2001 From: Rico Suter Date: Tue, 17 Feb 2026 06:30:05 +0100 Subject: [PATCH] Fix TcpTransportListener resource leak in ServerBase.StopAsync (#3561) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ServerBase.StopAsync() calls Close() on each transport listener then Clear() on the list. ServerBase.Dispose() later iterates TransportListeners to call Dispose() on each — but the list is already empty, so TcpTransportListener.Dispose() never runs. Add Utils.SilentDispose() after Close() in StopAsync to ensure TcpTransportListener.Dispose() executes before the list is cleared. --- Stack/Opc.Ua.Core/Stack/Server/ServerBase.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Stack/Opc.Ua.Core/Stack/Server/ServerBase.cs b/Stack/Opc.Ua.Core/Stack/Server/ServerBase.cs index db6ed17f33..7ac6350fb8 100644 --- a/Stack/Opc.Ua.Core/Stack/Server/ServerBase.cs +++ b/Stack/Opc.Ua.Core/Stack/Server/ServerBase.cs @@ -554,7 +554,7 @@ namespace Opc.Ua ServerError = new ServiceResult(e); } - // close any listeners. + // close and dispose any listeners. List listeners = TransportListeners; if (listeners != null) @@ -572,6 +572,8 @@ namespace Opc.Ua "Unexpected error closing a listener {Name}.", listeners[ii].GetType().FullName); } + + Utils.SilentDispose(listeners[ii]); } listeners.Clear();