From 7974e68ba5e3396ea369b3522ab24ce9350c4633 Mon Sep 17 00:00:00 2001
From: Yannick Lecaillez <yannick.lecaillez@forgerock.com>
Date: Fri, 25 Nov 2016 16:49:34 +0000
Subject: [PATCH] OPENDJ-3529: NPE when connection is closed during handleAccept()
---
opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/LDAPServerFilter.java | 18 ++++++------------
1 files changed, 6 insertions(+), 12 deletions(-)
diff --git a/opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/LDAPServerFilter.java b/opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/LDAPServerFilter.java
index 55c95a3..723fdb6 100644
--- a/opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/LDAPServerFilter.java
+++ b/opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/LDAPServerFilter.java
@@ -315,16 +315,13 @@
@Override
public NextAction handleRead(final FilterChainContext ctx) {
- final GrizzlyBackpressureSubscription immutableRef = downstream;
- if (immutableRef != null) {
- return immutableRef.handleRead(ctx);
- }
- ctx.suspend();
- return ctx.getSuspendAction();
+ // handleRead() is invoked only after handleAccept() completion, downstream cannot be null.
+ return downstream.handleRead(ctx);
}
@Override
public void exceptionOccurred(final FilterChainContext ctx, final Throwable error) {
+ // downstream can be null if an error happen before handleAccept() completion.
final GrizzlyBackpressureSubscription immutableRef = downstream;
if (immutableRef != null) {
immutableRef.onError(error);
@@ -336,6 +333,7 @@
@Override
public NextAction handleClose(final FilterChainContext ctx) {
isClosed = true;
+ // downstream can be null if the connection is closed before handleAccept() completion.
final GrizzlyBackpressureSubscription immutableRef = downstream;
if (immutableRef != null) {
immutableRef.onComplete();
@@ -501,11 +499,6 @@
connection.closeSilently();
}
- private void closeConnection() {
- downstream.cancel();
- connection.closeSilently();
- }
-
@Override
public void disconnect(final ResultCode resultCode, final String diagnosticMessage) {
notifyConnectionDisconnected(resultCode, diagnosticMessage);
@@ -516,7 +509,8 @@
).doAfterTerminate(new Action() {
@Override
public void run() throws Exception {
- closeConnection();
+ // handleClose() will be invoked once this connection has been closed.
+ connection.closeSilently();
}
}).subscribe();
}
--
Gitblit v1.10.0