Isolate 'filterSpec == null' case 45/116445/3
authorRobert Varga <robert.varga@pantheon.tech>
Mon, 5 May 2025 21:13:46 +0000 (23:13 +0200)
committerIvan Hrasko <ivan.hrasko@pantheon.tech>
Tue, 6 May 2025 07:33:53 +0000 (09:33 +0200)
When we have a filter without a spec we should call removeFilter(), not
try to putFilter(null), which will induce a NPE because we try to put it
into a null-hostile map.

This is a known invariant, so cover it with nullness annotations, which
point out problems which will be addressed in subsequent patches.

JIRA: NETCONF-1459
Change-Id: I1e409464810256a2839532caba552c8026a272fd
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
plugins/restconf-server-mdsal/src/main/java/org/opendaylight/restconf/server/mdsal/MdsalRestconfStreamRegistry.java
protocol/restconf-server-spi/src/main/java/org/opendaylight/restconf/server/spi/AbstractRestconfStreamRegistry.java

index 0bffcb63d5aeab3d9bcfcd7a4bd4f997eda6eb95..2c22ddfe83f355ba672231d5304b092d5c612f17 100644 (file)
@@ -165,6 +165,11 @@ public final class MdsalRestconfStreamRegistry extends AbstractRestconfStreamReg
             node.body().forEach(entry -> {
                 final var name = extractFilterName(entry);
                 final var filterSpec = (ChoiceNode) entry.childByArg(FILTER_SPEC_NODEID);
+                if (filterSpec == null) {
+                    removeFilter(name);
+                    return;
+                }
+
                 final var subtree = extractFilter(filterSpec);
                 final EventStreamFilter filter;
                 try {
@@ -173,14 +178,11 @@ public final class MdsalRestconfStreamRegistry extends AbstractRestconfStreamReg
                     LOG.error("Failed to parse subtree {} filter", subtree, e);
                     throw new RuntimeException(e);
                 }
-                putFilter(name ,filter);
+                putFilter(namefilter);
             });
         }
 
         private static RestconfStream.SubscriptionFilter extractFilter(final ChoiceNode filterSpec) {
-            if (filterSpec == null) {
-                return null;
-            }
             final var subtree = (AnydataNode<?>) filterSpec.childByArg(STREAM_SUBTREE_FILTER_NODEID);
             if (subtree != null) {
                 return new RestconfStream.SubscriptionFilter.SubtreeDefinition(subtree);
index 7c20a4789647d37320faad97af999c9ce7945820..cfe785fe57ac72b7ce24fed79920095e89e9aab5 100644 (file)
@@ -301,10 +301,12 @@ public abstract class AbstractRestconfStreamRegistry implements RestconfStream.R
     protected abstract ListenableFuture<Subscription> modifySubscriptionFilter(Subscription subscription,
         SubscriptionFilter filter);
 
+    @NonNullByDefault
     protected void putFilter(final String name, final EventStreamFilter filter) {
         filters.put(name, filter);
     }
 
+    @NonNullByDefault
     protected void removeFilter(final String name) {
         filters.remove(name);
     }