From 8b90884fa0d9689b2d597b2324e44d6168bea82d Mon Sep 17 00:00:00 2001 From: Valentin Lorentz Date: Thu, 1 Apr 2021 19:08:54 +0200 Subject: [PATCH] irclib: Copy messages before echoing them Fixes a bug triggered by Relay when it relays between three or more networks. --- src/irclib.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/irclib.py b/src/irclib.py index 8396d5c86..9aa085d3b 100644 --- a/src/irclib.py +++ b/src/irclib.py @@ -1406,8 +1406,16 @@ class Irc(IrcCommandDispatcher, log.Firewalled): assert not msg.tagged('receivedAt') if not world.testing: assert not msg.tagged('emulatedEcho') - msg.tag('emulatedEcho', True) - self.feedMsg(msg, tag=False) + + # Copy the msg before echoing it back. Without a copy, it + # can cause all sorts of issues if the msg is reused (eg. Relay + # sends the same message object to the same network, so when + # sending the msg for the second time, it would already be + # tagged with emulatedEcho and fail the assertion above) + echo_msg = ircmsgs.IrcMsg(msg=msg) + + echo_msg.tag('emulatedEcho', True) + self.feedMsg(echo_msg, tag=False) else: # I don't think we should do this. Why should it matter? If it's # something important, then the server will send it back to us,