From 4f5f4cdc9df6e8c3bf65d3f72ef7cf5a8404fdd4 Mon Sep 17 00:00:00 2001 From: Norman Maurer Date: Sun, 16 Mar 2014 06:25:52 -0700 Subject: [PATCH] [#2262] Fix NPE triggered by unresolveable InetSocketAddress in epoll transport Motivation: At the moment when an unresolvable InetSocketAddress is passed into the epoll transport a NPE is thrown Modifications: Add check in place which will throw an UnknownHostException if an InetSocketAddress could not been resolved. Result: Proper handling of unresolvable InetSocketAddresses --- .../java/io/netty/channel/epoll/AbstractEpollChannel.java | 7 +++++++ .../io/netty/channel/epoll/EpollServerSocketChannel.java | 1 + .../java/io/netty/channel/epoll/EpollSocketChannel.java | 3 +++ 3 files changed, 11 insertions(+) diff --git a/transport-native-epoll/src/main/java/io/netty/channel/epoll/AbstractEpollChannel.java b/transport-native-epoll/src/main/java/io/netty/channel/epoll/AbstractEpollChannel.java index d332986b6b..64136bb2d7 100644 --- a/transport-native-epoll/src/main/java/io/netty/channel/epoll/AbstractEpollChannel.java +++ b/transport-native-epoll/src/main/java/io/netty/channel/epoll/AbstractEpollChannel.java @@ -23,6 +23,7 @@ import io.netty.channel.EventLoop; import java.io.IOException; import java.net.InetSocketAddress; +import java.net.UnknownHostException; abstract class AbstractEpollChannel extends AbstractChannel { private static final ChannelMetadata DATA = new ChannelMetadata(false); @@ -128,6 +129,12 @@ abstract class AbstractEpollChannel extends AbstractChannel { @Override protected abstract AbstractEpollUnsafe newUnsafe(); + protected static void checkResolvable(InetSocketAddress addr) throws UnknownHostException { + if (addr.isUnresolved()) { + throw new UnknownHostException("Unable to resolve addr " + addr); + } + } + protected abstract class AbstractEpollUnsafe extends AbstractUnsafe { protected boolean readPending; diff --git a/transport-native-epoll/src/main/java/io/netty/channel/epoll/EpollServerSocketChannel.java b/transport-native-epoll/src/main/java/io/netty/channel/epoll/EpollServerSocketChannel.java index 390ca3d0e8..b4aba6e3da 100644 --- a/transport-native-epoll/src/main/java/io/netty/channel/epoll/EpollServerSocketChannel.java +++ b/transport-native-epoll/src/main/java/io/netty/channel/epoll/EpollServerSocketChannel.java @@ -47,6 +47,7 @@ public final class EpollServerSocketChannel extends AbstractEpollChannel impleme @Override protected void doBind(SocketAddress localAddress) throws Exception { InetSocketAddress addr = (InetSocketAddress) localAddress; + checkResolvable(addr); Native.bind(fd, addr.getAddress(), addr.getPort()); local = addr; Native.listen(fd, config.getBacklog()); diff --git a/transport-native-epoll/src/main/java/io/netty/channel/epoll/EpollSocketChannel.java b/transport-native-epoll/src/main/java/io/netty/channel/epoll/EpollSocketChannel.java index 3b0e985001..f053ca8929 100644 --- a/transport-native-epoll/src/main/java/io/netty/channel/epoll/EpollSocketChannel.java +++ b/transport-native-epoll/src/main/java/io/netty/channel/epoll/EpollSocketChannel.java @@ -41,6 +41,7 @@ import java.io.IOException; import java.net.ConnectException; import java.net.InetSocketAddress; import java.net.SocketAddress; +import java.net.UnknownHostException; import java.nio.ByteBuffer; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; @@ -528,11 +529,13 @@ public final class EpollSocketChannel extends AbstractEpollChannel implements So */ private boolean doConnect(InetSocketAddress remoteAddress, InetSocketAddress localAddress) throws Exception { if (localAddress != null) { + checkResolvable(localAddress); Native.bind(fd, localAddress.getAddress(), localAddress.getPort()); } boolean success = false; try { + checkResolvable(remoteAddress); boolean connected = Native.connect(fd, remoteAddress.getAddress(), remoteAddress.getPort()); if (!connected) {