From 5e67f4232a0a0a47c2e487559d8792be40acee55 Mon Sep 17 00:00:00 2001 From: zzz <zzz@mail.i2p> Date: Wed, 20 Nov 2019 14:54:46 +0000 Subject: [PATCH] I2CP: Prevent an uncaught OCMOSJ exception from killing the session --- .../client/ClientMessageEventListener.java | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/router/java/src/net/i2p/router/client/ClientMessageEventListener.java b/router/java/src/net/i2p/router/client/ClientMessageEventListener.java index 150773a4bd..846aa2cc4c 100644 --- a/router/java/src/net/i2p/router/client/ClientMessageEventListener.java +++ b/router/java/src/net/i2p/router/client/ClientMessageEventListener.java @@ -454,7 +454,27 @@ class ClientMessageEventListener implements I2CPMessageReader.I2CPMessageEventLi if (_log.shouldLog(Log.DEBUG)) _log.debug("handleSendMessage called"); long beforeDistribute = _context.clock().now(); - MessageId id = _runner.distributeMessage(message); + MessageId id; + try { + // ClientMessagePool runs OCMOSJ inline + // don't let bugs there kill the whole session + id = _runner.distributeMessage(message); + } catch (Exception e) { + _log.error("Error sending message", e); + MessageStatusMessage status = new MessageStatusMessage(); + status.setMessageId(_runner.getNextMessageId()); + status.setSessionId(sid.getSessionId()); + status.setSize(0); + status.setNonce(message.getNonce()); + status.setStatus(MessageStatusMessage.STATUS_SEND_FAILURE_ROUTER); + try { + _runner.doSend(status); + } catch (I2CPMessageException ime) { + if (_log.shouldLog(Log.WARN)) + _log.warn("Error writing out the message status message", ime); + } + return; + } long timeToDistribute = _context.clock().now() - beforeDistribute; // TODO validate session id _runner.ackSendMessage(sid, id, message.getNonce()); -- GitLab