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 3bc2c85a7b4cf3117b03d3dd0d4b28ea95cdc09d Author: Amichai Rothman <[email protected]> AuthorDate: Thu Apr 30 01:54:37 2026 +0300 ARIES-2205 Fix EventAdminSender.notifyEventAdmins potential NPE and leaked service reference --- .../aries/rsa/core/event/EventAdminSender.java | 30 ++++++++++++++-------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/rsa/src/main/java/org/apache/aries/rsa/core/event/EventAdminSender.java b/rsa/src/main/java/org/apache/aries/rsa/core/event/EventAdminSender.java index ce65cd75..dec33487 100644 --- a/rsa/src/main/java/org/apache/aries/rsa/core/event/EventAdminSender.java +++ b/rsa/src/main/java/org/apache/aries/rsa/core/event/EventAdminSender.java @@ -35,26 +35,36 @@ import org.osgi.service.remoteserviceadmin.EndpointDescription; import org.osgi.service.remoteserviceadmin.ExportReference; import org.osgi.service.remoteserviceadmin.ImportReference; import org.osgi.service.remoteserviceadmin.RemoteServiceAdminEvent; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class EventAdminSender { + private static final Logger LOG = LoggerFactory.getLogger(EventAdminSender.class); + private BundleContext context; public EventAdminSender(BundleContext context) { this.context = context; } - private void notifyEventAdmins(Event event) { - ServiceReference<EventAdmin> sref = this.context.getServiceReference(EventAdmin.class); + private void notifyEventAdmins(String type, Event event) { + // according to the EventAdmin specs, we publish to the service with the + // highest ranking (which is the one returned by getServiceReference) + ServiceReference<EventAdmin> sref = context.getServiceReference(EventAdmin.class); if (sref != null) { - final EventAdmin eventAdmin = this.context.getService(sref); - AccessController.doPrivileged(new PrivilegedAction<Void>() { - public Void run() { - eventAdmin.postEvent(event); - return null; + LOG.debug("Publishing event {} to EventAdmin", type); + final EventAdmin eventAdmin = context.getService(sref); + if (eventAdmin != null) { + try { + AccessController.doPrivileged((PrivilegedAction<Void>) () -> { + eventAdmin.postEvent(event); + return null; + }); + } finally { + context.ungetService(sref); } - }); - this.context.ungetService(sref); + } } } @@ -63,7 +73,7 @@ public class EventAdminSender { String topic = "org/osgi/service/remoteserviceadmin/" + type; Map<String, Object> props = createProps(rsae); Event event = new Event(topic, props); - notifyEventAdmins(event); + notifyEventAdmins(type, event); } private static String getTypeName(int type) {
