From c0e89ce04d02be61347e2eca3152412be1112879 Mon Sep 17 00:00:00 2001 From: Guus der Kinderen Date: Fri, 22 Dec 2023 22:06:23 +0100 Subject: [PATCH] OF-2761: Prevent NPE when MUC service gets unexpected IQ result When an IQ Service gets send an IQ result, it generates a null response, which it tries to route. That causes NullPointerExceptions to be logged. With this commit, such null responses are silently dropped. --- .../muc/spi/MultiUserChatServiceImpl.java | 34 +++++++++++++------ 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/xmppserver/src/main/java/org/jivesoftware/openfire/muc/spi/MultiUserChatServiceImpl.java b/xmppserver/src/main/java/org/jivesoftware/openfire/muc/spi/MultiUserChatServiceImpl.java index 949cc4d1d4..ff2e726316 100644 --- a/xmppserver/src/main/java/org/jivesoftware/openfire/muc/spi/MultiUserChatServiceImpl.java +++ b/xmppserver/src/main/java/org/jivesoftware/openfire/muc/spi/MultiUserChatServiceImpl.java @@ -456,34 +456,46 @@ private boolean process(final IQ iq) { } if ("jabber:iq:register".equals(namespace)) { final IQ reply = registerHandler.handleIQ(iq); - XMPPServer.getInstance().getPacketRouter().route(reply); + if (reply != null) { + XMPPServer.getInstance().getPacketRouter().route(reply); + } } else if ("jabber:iq:search".equals(namespace)) { final IQ reply = searchHandler.handleIQ(iq); - XMPPServer.getInstance().getPacketRouter().route(reply); + if (reply != null) { + XMPPServer.getInstance().getPacketRouter().route(reply); + } } else if (IQMuclumbusSearchHandler.NAMESPACE.equals(namespace)) { final IQ reply = muclumbusSearchHandler.handleIQ(iq); - XMPPServer.getInstance().getPacketRouter().route(reply); + if (reply != null) { + XMPPServer.getInstance().getPacketRouter().route(reply); + } } else if (IQMUCvCardHandler.NAMESPACE.equals(namespace)) { final IQ reply = mucVCardHandler.handleIQ(iq); - XMPPServer.getInstance().getPacketRouter().route(reply); + if (reply != null) { + XMPPServer.getInstance().getPacketRouter().route(reply); + } } else if ("http://jabber.org/protocol/disco#info".equals(namespace)) { - // TODO MUC should have an IQDiscoInfoHandler of its own when MUC becomes - // a component + // TODO MUC should have an IQDiscoInfoHandler of its own when MUC becomes a component final IQ reply = XMPPServer.getInstance().getIQDiscoInfoHandler().handleIQ(iq); - XMPPServer.getInstance().getPacketRouter().route(reply); + if (reply != null) { + XMPPServer.getInstance().getPacketRouter().route(reply); + } } else if ("http://jabber.org/protocol/disco#items".equals(namespace)) { - // TODO MUC should have an IQDiscoItemsHandler of its own when MUC becomes - // a component + // TODO MUC should have an IQDiscoItemsHandler of its own when MUC becomes a component final IQ reply = XMPPServer.getInstance().getIQDiscoItemsHandler().handleIQ(iq); - XMPPServer.getInstance().getPacketRouter().route(reply); + if (reply != null) { + XMPPServer.getInstance().getPacketRouter().route(reply); + } } else if ("urn:xmpp:ping".equals(namespace)) { - XMPPServer.getInstance().getPacketRouter().route( IQ.createResultIQ(iq) ); + if (iq.isRequest()) { + XMPPServer.getInstance().getPacketRouter().route( IQ.createResultIQ(iq) ); + } } else if (this.iqHandlers != null) { final IQHandler h = this.iqHandlers.get(namespace);