From 7307fea23c211bc2c7c170e878b428ad0564a6d7 Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Tue, 18 Aug 2009 18:24:20 -0700 Subject: [PATCH] Don't NPE in SSH keys panel when SSHD is bound to localhost If the SSHD was bound to 127.0.0.1 (aka localhost), such as might be done on a developer workstation, don't crash out with an NPE on the server side when the client requests the server host keys. Instead try to return the host keys using that 127.0.0.1 address, and if we really don't have a name for our SSHD, don't return any host keys at all, as there is no reasonable way for the client to contact us. Signed-off-by: Shawn O. Pearce --- .../gerrit/server/rpc/SystemInfoServiceImpl.java | 9 +++++++++ .../java/com/google/gerrit/server/ssh/SshDaemon.java | 11 +++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/main/java/com/google/gerrit/server/rpc/SystemInfoServiceImpl.java b/src/main/java/com/google/gerrit/server/rpc/SystemInfoServiceImpl.java index 9faef366fa..799e252b64 100644 --- a/src/main/java/com/google/gerrit/server/rpc/SystemInfoServiceImpl.java +++ b/src/main/java/com/google/gerrit/server/rpc/SystemInfoServiceImpl.java @@ -87,6 +87,11 @@ class SystemInfoServiceImpl implements SystemInfoService { public void daemonHostKeys(final AsyncCallback> callback) { final String hostIdent = hostIdent(); + if (hostIdent == null) { + callback.onSuccess(Collections. emptyList()); + return; + } + final ArrayList r = new ArrayList(hostKeys.size()); for (final PublicKey pub : hostKeys) { try { @@ -132,6 +137,10 @@ class SystemInfoServiceImpl implements SystemInfoService { private String hostIdent() { InetSocketAddress addr = sshd.getAddress(); + if (addr == null) { + return null; + } + InetAddress ip = addr.getAddress(); if (ip.isAnyLocalAddress()) { try { diff --git a/src/main/java/com/google/gerrit/server/ssh/SshDaemon.java b/src/main/java/com/google/gerrit/server/ssh/SshDaemon.java index dd21bb6ff8..4df78fb63f 100644 --- a/src/main/java/com/google/gerrit/server/ssh/SshDaemon.java +++ b/src/main/java/com/google/gerrit/server/ssh/SshDaemon.java @@ -245,6 +245,17 @@ public class SshDaemon extends SshServer implements SshInfo { } return inetAddr; } + + // No non-loopback address available? Try any address then. + // + for (final SocketAddress addr : listen) { + if (addr instanceof InetSocketAddress) { + return (InetSocketAddress) addr; + } + } + + // We give up, with no valid address. + // return null; }