This is an automated email from the ASF dual-hosted git repository.

amichair pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/aries-rsa.git

commit 0caf5a7d676450e70b39a79dff247e2dc32fb26c
Author: Amichai Rothman <[email protected]>
AuthorDate: Wed Apr 1 13:50:13 2026 +0300

    ARIES-2215 Fix service reference leak on export error
---
 .../aries/rsa/core/RemoteServiceAdminCore.java     | 33 ++++++++++++++--------
 1 file changed, 21 insertions(+), 12 deletions(-)

diff --git 
a/rsa/src/main/java/org/apache/aries/rsa/core/RemoteServiceAdminCore.java 
b/rsa/src/main/java/org/apache/aries/rsa/core/RemoteServiceAdminCore.java
index be719ae2..de033321 100644
--- a/rsa/src/main/java/org/apache/aries/rsa/core/RemoteServiceAdminCore.java
+++ b/rsa/src/main/java/org/apache/aries/rsa/core/RemoteServiceAdminCore.java
@@ -204,24 +204,33 @@ public class RemoteServiceAdminCore implements 
RemoteServiceAdmin {
         try {
             checkPermission(new EndpointPermission("*", 
EndpointPermission.EXPORT));
             final BundleContext serviceContext = 
getBundleContext(serviceReference);
-            final Object serviceO = 
serviceContext.getService(serviceReference); // unget it when export is closed
-            if (serviceO == null) {
+            final Object serviceObject = 
serviceContext.getService(serviceReference); // unget it when export is closed
+            if (serviceObject == null) {
                 throw new IllegalStateException("service object is null 
(service was unregistered?)");
             }
-            final Class<?>[] interfaces = getInterfaces(serviceO, 
interfaceNames);
-            final Map<String, Object> eprops = 
createEndpointProps(serviceProperties, configTypes, interfaces);
-
-            Endpoint endpoint = AccessController.doPrivileged(
-                (PrivilegedAction<Endpoint>) () -> 
provider.exportService(serviceO, serviceContext, eprops, interfaces));
-            if (endpoint == null) {
-                return null;
+            ExportRegistration reg = null;
+            try {
+                final Class<?>[] interfaces = getInterfaces(serviceObject, 
interfaceNames);
+                final Map<String, Object> eprops = 
createEndpointProps(serviceProperties, configTypes, interfaces);
+
+                Endpoint endpoint = AccessController.doPrivileged(
+                    (PrivilegedAction<Endpoint>) () -> provider.exportService(
+                        serviceObject, serviceContext, eprops, interfaces));
+                if (endpoint != null) {
+                    reg = new ExportRegistrationImpl(serviceReference, 
endpoint, closeHandler, eventProducer);
+                }
+                return reg;
+            } finally {
+                // if anything went wrong, don't leak the service reference
+                if (reg == null) {
+                    serviceContext.ungetService(serviceReference);
+                }
             }
-            return new ExportRegistrationImpl(serviceReference, endpoint, 
closeHandler, eventProducer);
         } catch (IllegalArgumentException iae) {
             // TCK expects this for garbage input in config-type specific 
properties
             throw iae;
-        } catch (Exception e) {
-            return new ExportRegistrationImpl(e, closeHandler, eventProducer);
+        } catch (Throwable t) {
+            return new ExportRegistrationImpl(t, closeHandler, eventProducer);
         }
     }
 

Reply via email to