From: AsamK Date: Sat, 19 Feb 2022 17:46:45 +0000 (+0100) Subject: Prevent a stale jsonrpc connection from interfering with message receiving X-Git-Tag: v0.10.4~8 X-Git-Url: https://git.nmode.ca/signal-cli/commitdiff_plain/3f582e9c2e7db9adeb48dbc569f3c32509a63ad5?ds=sidebyside Prevent a stale jsonrpc connection from interfering with message receiving Fixes #893 --- diff --git a/lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java b/lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java index 3f418de8..941a6122 100644 --- a/lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java +++ b/lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java @@ -770,7 +770,7 @@ class ManagerImpl implements Manager { Stream.concat(messageHandlers.stream(), weakHandlers.stream()).forEach(h -> { try { h.handleMessage(envelope, e); - } catch (Exception ex) { + } catch (Throwable ex) { logger.warn("Message handler failed, ignoring", ex); } }); diff --git a/src/main/java/org/asamk/signal/commands/DaemonCommand.java b/src/main/java/org/asamk/signal/commands/DaemonCommand.java index e224bf1c..7c972496 100644 --- a/src/main/java/org/asamk/signal/commands/DaemonCommand.java +++ b/src/main/java/org/asamk/signal/commands/DaemonCommand.java @@ -35,7 +35,6 @@ import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; import java.nio.charset.StandardCharsets; import java.util.List; -import java.util.Objects; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Consumer; @@ -240,12 +239,13 @@ public class DaemonCommand implements MultiLocalCommand, LocalCommand { private void runSocket(final ServerSocketChannel serverChannel, Consumer socketHandler) { final var thread = new Thread(() -> { while (true) { + final var connectionId = threadNumber.getAndIncrement(); final SocketChannel channel; final String clientString; try { channel = serverChannel.accept(); clientString = channel.getRemoteAddress() + " " + IOUtils.getUnixDomainPrincipal(channel); - logger.info("Accepted new client: " + clientString); + logger.info("Accepted new client connection {}: {}", connectionId, clientString); } catch (IOException e) { logger.error("Failed to accept new socket connection", e); synchronized (this) { @@ -256,12 +256,14 @@ public class DaemonCommand implements MultiLocalCommand, LocalCommand { final var connectionThread = new Thread(() -> { try (final var c = channel) { socketHandler.accept(c); - logger.info("Connection closed: " + clientString); } catch (IOException e) { logger.warn("Failed to close channel", e); + } catch (Throwable e) { + logger.warn("Connection handler failed, closing connection", e); } + logger.info("Connection {} closed: {}", connectionId, clientString); }); - connectionThread.setName("daemon-connection-" + threadNumber.getAndIncrement()); + connectionThread.setName("daemon-connection-" + connectionId); connectionThread.start(); } }); @@ -298,11 +300,9 @@ public class DaemonCommand implements MultiLocalCommand, LocalCommand { c.addOnManagerAddedHandler(m -> { final var thread = exportMultiAccountManager(connection, m, noReceiveOnStart); - if (thread != null) { - try { - thread.join(); - } catch (InterruptedException ignored) { - } + try { + thread.join(); + } catch (InterruptedException ignored) { } }); c.addOnManagerRemovedHandler(m -> { @@ -319,7 +319,6 @@ public class DaemonCommand implements MultiLocalCommand, LocalCommand { final var initThreads = c.getManagers() .stream() .map(m -> exportMultiAccountManager(connection, m, noReceiveOnStart)) - .filter(Objects::nonNull) .toList(); for (var t : initThreads) {