diff --git a/CHANGES.md b/CHANGES.md index f640b886a..3361d80ac 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -41,6 +41,7 @@ * [GH-524](https://github.com/apache/mina-sshd/issues/524) Performance improvements * [GH-533](https://github.com/apache/mina-sshd/issues/533) Fix multi-step authentication * [GH-582](https://github.com/apache/mina-sshd/issues/582) Fix filtering in `NamedFactory` +* [GH-587](https://github.com/apache/mina-sshd/issues/587) Prevent `NullPointerException`on closed channel in `NettyIoSession` * [GH-590](https://github.com/apache/mina-sshd/issues/590) Better support for FIPS ## New Features diff --git a/sshd-netty/src/main/java/org/apache/sshd/netty/NettyIoSession.java b/sshd-netty/src/main/java/org/apache/sshd/netty/NettyIoSession.java index 8d90d6ce4..02c90ed56 100644 --- a/sshd-netty/src/main/java/org/apache/sshd/netty/NettyIoSession.java +++ b/sshd-netty/src/main/java/org/apache/sshd/netty/NettyIoSession.java @@ -21,6 +21,7 @@ import java.io.IOException; import java.net.SocketAddress; +import java.nio.channels.ClosedChannelException; import java.util.HashMap; import java.util.Map; import java.util.Objects; @@ -134,11 +135,19 @@ public IoWriteFuture writeBuffer(Buffer buffer) { ByteBuf buf = Unpooled.buffer(bufLen); buf.writeBytes(buffer.array(), buffer.rpos(), bufLen); DefaultIoWriteFuture msg = new DefaultIoWriteFuture(getRemoteAddress(), null); - ChannelPromise next = context.newPromise(); + ChannelHandlerContext ctx = context; + if (ctx == null) { + msg.setValue(new ClosedChannelException()); + return msg; + } + ChannelPromise next = ctx.newPromise(); prev.addListener(whatever -> { - ChannelHandlerContext ctx = context; - if (ctx != null) { - ctx.writeAndFlush(buf, next); + ChannelHandlerContext c = context; + if (c != null) { + c.writeAndFlush(buf, next); + } else { + msg.setValue(new ClosedChannelException()); + next.cancel(true); } }); prev = next;