From cdc884c34f5d7f22624d4e85a8bb61fd50560e5e Mon Sep 17 00:00:00 2001
From: Valery Kharseko <vharseko@3a-systems.ru>
Date: Tue, 03 Nov 2026 10:44:13 +0000
Subject: [PATCH] [#1261] Close JMX RMI connector sockets on shutdown (#1264)

---
 opendj-server-legacy/src/main/java/org/opends/server/protocols/jmx/RmiConnector.java |   17 +++++++++++++++--
 1 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/opendj-server-legacy/src/main/java/org/opends/server/protocols/jmx/RmiConnector.java b/opendj-server-legacy/src/main/java/org/opends/server/protocols/jmx/RmiConnector.java
index 626f94d..d7e0a9b 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/protocols/jmx/RmiConnector.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/protocols/jmx/RmiConnector.java
@@ -20,6 +20,7 @@
 import static org.opends.messages.ProtocolMessages.*;
 import static org.opends.server.util.StaticUtils.*;
 
+import java.io.Closeable;
 import java.io.IOException;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
@@ -165,6 +166,9 @@
    */
   private OpendsRmiServerSocketFactory rmiSsf;
 
+  /** The socket factory owned by the RMI connector, separate from the registry's. */
+  private Closeable connectorSocketFactory;
+
   /**
    * The RMI protocol version used by this connector.
    */
@@ -371,8 +375,10 @@
         SSLSocketFactory ssf = ctx.getSocketFactory();
 
         // set the Server socket factory in the JMX map
-        rmiServerSockeyFactory = new DirectoryRMIServerSocketFactory(
+        DirectoryRMIServerSocketFactory factory = new DirectoryRMIServerSocketFactory(
             ssf, false, jmxConnectionHandler.getListenAddress());
+        connectorSocketFactory = factory;
+        rmiServerSockeyFactory = factory;
         env.put(
             "jmx.remote.rmi.server.socket.factory",
             rmiServerSockeyFactory);
@@ -393,8 +399,10 @@
         {
           logger.trace("UNSECURE CONNECTION");
         }
-        rmiServerSockeyFactory = new OpendsRmiServerSocketFactory(
+        OpendsRmiServerSocketFactory factory = new OpendsRmiServerSocketFactory(
             jmxConnectionHandler.getListenAddress());
+        connectorSocketFactory = factory;
+        rmiServerSockeyFactory = factory;
       }
 
       // specify the rmi JMX authenticator to be used
@@ -553,6 +561,11 @@
     jmxRmiConnectorNoClientCertificate = null;
     jmxRmiConnectorClientCertificate = null;
 
+    // RMI keeps anonymous-port listeners open even after the last object is unexported.
+    // Close our socket explicitly, also when stop() failed or the registry is being kept.
+    close(connectorSocketFactory);
+    connectorSocketFactory = null;
+
     // Unregister connectors and stop them.
     try
     {

--
Gitblit v1.10.0