summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRemko Tronçon <git@el-tramo.be>2011-02-05 15:56:47 (GMT)
committerRemko Tronçon <git@el-tramo.be>2011-02-05 15:56:47 (GMT)
commit374ebf0f8c32c4fd8758af4b8381ac5cff0d151c (patch)
treec89be053096b0025f3839d97b5ae08b102335054 /Swiften
parentd18f20669671991825230fe956acd472cca999fc (diff)
downloadswift-374ebf0f8c32c4fd8758af4b8381ac5cff0d151c.zip
swift-374ebf0f8c32c4fd8758af4b8381ac5cff0d151c.tar.bz2
Don't crash when receiving null roster payload.
Diffstat (limited to 'Swiften')
-rw-r--r--Swiften/Roster/UnitTest/XMPPRosterControllerTest.cpp16
-rw-r--r--Swiften/Roster/XMPPRosterController.cpp14
-rw-r--r--Swiften/Roster/XMPPRosterController.h1
3 files changed, 22 insertions, 9 deletions
diff --git a/Swiften/Roster/UnitTest/XMPPRosterControllerTest.cpp b/Swiften/Roster/UnitTest/XMPPRosterControllerTest.cpp
index debbd50..22a55d4 100644
--- a/Swiften/Roster/UnitTest/XMPPRosterControllerTest.cpp
+++ b/Swiften/Roster/UnitTest/XMPPRosterControllerTest.cpp
@@ -6,12 +6,13 @@
#include <cppunit/extensions/HelperMacros.h>
#include <cppunit/extensions/TestFactoryRegistry.h>
+#include <boost/smart_ptr/make_shared.hpp>
#include "Swiften/Roster/XMPPRosterController.h"
#include "Swiften/Elements/Payload.h"
#include "Swiften/Elements/RosterItemPayload.h"
#include "Swiften/Elements/RosterPayload.h"
-#include "Swiften/Queries/DummyIQChannel.h"
+#include "Swiften/Client/DummyStanzaChannel.h"
#include "Swiften/Queries/IQRouter.h"
#include "Swiften/Roster/XMPPRosterImpl.h"
@@ -19,6 +20,7 @@ using namespace Swift;
class XMPPRosterControllerTest : public CppUnit::TestFixture {
CPPUNIT_TEST_SUITE(XMPPRosterControllerTest);
+ CPPUNIT_TEST(testGet_EmptyResponse);
CPPUNIT_TEST(testAdd);
CPPUNIT_TEST(testModify);
CPPUNIT_TEST(testRemove);
@@ -26,7 +28,7 @@ class XMPPRosterControllerTest : public CppUnit::TestFixture {
public:
void setUp() {
- channel_ = new DummyIQChannel();
+ channel_ = new DummyStanzaChannel();
router_ = new IQRouter(channel_);
xmppRoster_ = new XMPPRosterImpl();
}
@@ -37,6 +39,14 @@ class XMPPRosterControllerTest : public CppUnit::TestFixture {
delete channel_;
}
+ void testGet_EmptyResponse() {
+ XMPPRosterController controller(router_, xmppRoster_);
+
+ controller.requestRoster();
+
+ channel_->onIQReceived(IQ::createResult(JID("baz@fum.com/dum"), channel_->sentStanzas[0]->getID(), boost::shared_ptr<RosterPayload>()));
+ }
+
void testAdd() {
XMPPRosterController controller(router_, xmppRoster_);
@@ -74,7 +84,7 @@ class XMPPRosterControllerTest : public CppUnit::TestFixture {
}
private:
- DummyIQChannel* channel_;
+ DummyStanzaChannel* channel_;
IQRouter* router_;
XMPPRosterImpl* xmppRoster_;
};
diff --git a/Swiften/Roster/XMPPRosterController.cpp b/Swiften/Roster/XMPPRosterController.cpp
index 62bebc3..909ef8e 100644
--- a/Swiften/Roster/XMPPRosterController.cpp
+++ b/Swiften/Roster/XMPPRosterController.cpp
@@ -39,12 +39,14 @@ void XMPPRosterController::requestRoster() {
}
void XMPPRosterController::handleRosterReceived(boost::shared_ptr<RosterPayload> rosterPayload) {
- foreach(const RosterItemPayload& item, rosterPayload->getItems()) {
- //Don't worry about the updated case, the XMPPRoster sorts that out.
- if (item.getSubscription() == RosterItemPayload::Remove) {
- xmppRoster_->removeContact(item.getJID());
- } else {
- xmppRoster_->addContact(item.getJID(), item.getName(), item.getGroups(), item.getSubscription());
+ if (rosterPayload) {
+ foreach(const RosterItemPayload& item, rosterPayload->getItems()) {
+ //Don't worry about the updated case, the XMPPRoster sorts that out.
+ if (item.getSubscription() == RosterItemPayload::Remove) {
+ xmppRoster_->removeContact(item.getJID());
+ } else {
+ xmppRoster_->addContact(item.getJID(), item.getName(), item.getGroups(), item.getSubscription());
+ }
}
}
}
diff --git a/Swiften/Roster/XMPPRosterController.h b/Swiften/Roster/XMPPRosterController.h
index dedf090..073a233 100644
--- a/Swiften/Roster/XMPPRosterController.h
+++ b/Swiften/Roster/XMPPRosterController.h
@@ -26,6 +26,7 @@ namespace Swift {
void requestRoster();
+ private:
void handleRosterReceived(boost::shared_ptr<RosterPayload> rosterPayload);
private: