]> nmode's Git Repositories - signal-cli/commitdiff
Prevent a stale jsonrpc connection from interfering with message receiving
authorAsamK <asamk@gmx.de>
Sat, 19 Feb 2022 17:46:45 +0000 (18:46 +0100)
committerAsamK <asamk@gmx.de>
Sat, 19 Feb 2022 17:47:11 +0000 (18:47 +0100)
Fixes #893

lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java
src/main/java/org/asamk/signal/commands/DaemonCommand.java

index 3f418de8452fa9277b978b5f5b07a4d1ead3902d..941a612232319df345a5dd85c2d9fcd5000314cc 100644 (file)
@@ -770,7 +770,7 @@ class ManagerImpl implements Manager {
                     Stream.concat(messageHandlers.stream(), weakHandlers.stream()).forEach(h -> {
                         try {
                             h.handleMessage(envelope, e);
                     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);
                         }
                     });
                             logger.warn("Message handler failed, ignoring", ex);
                         }
                     });
index e224bf1c0a55ec4500fc1ecf581df5ade2aeca5e..7c972496dc919dacf57dd440d538c3af3e8fb0a7 100644 (file)
@@ -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.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;
 
 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<SocketChannel> socketHandler) {
         final var thread = new Thread(() -> {
             while (true) {
     private void runSocket(final ServerSocketChannel serverChannel, Consumer<SocketChannel> 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);
                 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) {
                 } 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);
                 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 (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();
             }
         });
                 connectionThread.start();
             }
         });
@@ -298,11 +300,9 @@ public class DaemonCommand implements MultiLocalCommand, LocalCommand {
 
             c.addOnManagerAddedHandler(m -> {
                 final var thread = exportMultiAccountManager(connection, m, noReceiveOnStart);
 
             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 -> {
                 }
             });
             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))
             final var initThreads = c.getManagers()
                     .stream()
                     .map(m -> exportMultiAccountManager(connection, m, noReceiveOnStart))
-                    .filter(Objects::nonNull)
                     .toList();
 
             for (var t : initThreads) {
                     .toList();
 
             for (var t : initThreads) {