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) {

Reply via email to