Commit a2fdf23e authored by Phillip Webb's avatar Phillip Webb

Don't throw NettyWebServer on permission errors

Update `NettyWebServer` so that the `PortInUseException` is not thrown
for permission denied errors.

Fixes gh-19807
parent c7611112
......@@ -18,6 +18,7 @@ package org.springframework.boot.web.embedded.netty;
import java.time.Duration;
import io.netty.channel.unix.Errors.NativeIoException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import reactor.netty.ChannelBindException;
......@@ -42,6 +43,11 @@ import org.springframework.util.Assert;
*/
public class NettyWebServer implements WebServer {
/**
* Permission denied error code from {@code errno.h}.
*/
private static final int ERROR_NO_EACCES = -13;
private static final Log logger = LogFactory.getLog(NettyWebServer.class);
private final HttpServer httpServer;
......@@ -68,7 +74,7 @@ public class NettyWebServer implements WebServer {
}
catch (Exception ex) {
ChannelBindException bindException = findBindException(ex);
if (bindException != null) {
if (bindException != null && !isPermissionDenied(bindException.getCause())) {
throw new PortInUseException(bindException.localPort(), ex);
}
throw new WebServerException("Unable to start Netty", ex);
......@@ -78,6 +84,17 @@ public class NettyWebServer implements WebServer {
}
}
private boolean isPermissionDenied(Throwable bindExceptionCause) {
try {
if (bindExceptionCause instanceof NativeIoException) {
return ((NativeIoException) bindExceptionCause).expectedErr() == ERROR_NO_EACCES;
}
}
catch (Throwable ex) {
}
return false;
}
private DisposableServer startHttpServer() {
if (this.lifecycleTimeout != null) {
return this.httpServer.handle(this.handlerAdapter).bindNow(this.lifecycleTimeout);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment