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); } }
