diff options
| author | Remko Tronçon <git@el-tramo.be> | 2010-12-06 19:22:07 (GMT) | 
|---|---|---|
| committer | Remko Tronçon <git@el-tramo.be> | 2010-12-06 21:01:49 (GMT) | 
| commit | 4fc7861cebaa82e5057a7ff7d385b49b79e442a4 (patch) | |
| tree | 1deb65bf880cf279dd8463ef8af257071af836ee | |
| parent | a38a702e8dd10a5abdd8cebe245c0cd31d6c4ddc (diff) | |
| download | swift-4fc7861cebaa82e5057a7ff7d385b49b79e442a4.zip swift-4fc7861cebaa82e5057a7ff7d385b49b79e442a4.tar.bz2  | |
Fixed assertion failure on invalid stream start.
Resolves: #707
| -rw-r--r-- | Swiften/Parser/UnitTest/XMPPParserTest.cpp | 7 | ||||
| -rw-r--r-- | Swiften/Parser/XMPPParser.cpp | 66 | 
2 files changed, 43 insertions, 30 deletions
diff --git a/Swiften/Parser/UnitTest/XMPPParserTest.cpp b/Swiften/Parser/UnitTest/XMPPParserTest.cpp index 90a4b03..1eaa798 100644 --- a/Swiften/Parser/UnitTest/XMPPParserTest.cpp +++ b/Swiften/Parser/UnitTest/XMPPParserTest.cpp @@ -33,6 +33,7 @@ class XMPPParserTest : public CppUnit::TestFixture {  		CPPUNIT_TEST(testParse_UnknownElement);  		CPPUNIT_TEST(testParse_StrayCharacterData);  		CPPUNIT_TEST(testParse_InvalidStreamStart); +		CPPUNIT_TEST(testParse_ElementEndAfterInvalidStreamStart);  		CPPUNIT_TEST_SUITE_END();  	public: @@ -149,6 +150,12 @@ class XMPPParserTest : public CppUnit::TestFixture {  			CPPUNIT_ASSERT(!testling.parse("<tream>"));  		} +		void testParse_ElementEndAfterInvalidStreamStart() { +			XMPPParser testling(&client_, &factories_); + +			CPPUNIT_ASSERT(!testling.parse("<tream/>")); +		} +  	private:  		class Client : public XMPPParserClient {  			public: diff --git a/Swiften/Parser/XMPPParser.cpp b/Swiften/Parser/XMPPParser.cpp index 93797b3..6bd6082 100644 --- a/Swiften/Parser/XMPPParser.cpp +++ b/Swiften/Parser/XMPPParser.cpp @@ -67,54 +67,60 @@ bool XMPPParser::parse(const String& data) {  }  void XMPPParser::handleStartElement(const String& element, const String& ns, const AttributeMap& attributes) { -	if (level_ == TopLevel) { -		if (element == "stream" && ns == "http://etherx.jabber.org/streams") { -			ProtocolHeader header; -			header.setFrom(attributes.getAttribute("from")); -			header.setTo(attributes.getAttribute("to")); -			header.setID(attributes.getAttribute("id")); -			header.setVersion(attributes.getAttribute("version")); -			client_->handleStreamStart(header); +	if (!parseErrorOccurred_) { +		if (level_ == TopLevel) { +			if (element == "stream" && ns == "http://etherx.jabber.org/streams") { +				ProtocolHeader header; +				header.setFrom(attributes.getAttribute("from")); +				header.setTo(attributes.getAttribute("to")); +				header.setID(attributes.getAttribute("id")); +				header.setVersion(attributes.getAttribute("version")); +				client_->handleStreamStart(header); +			} +			else { +				parseErrorOccurred_ = true; +			}  		}  		else { -			parseErrorOccurred_ = true; +			if (level_ == StreamLevel) { +				assert(!currentElementParser_); +				currentElementParser_ = createElementParser(element, ns); +			} +			currentElementParser_->handleStartElement(element, ns, attributes);  		}  	} -	else { -		if (level_ == StreamLevel) { -			assert(!currentElementParser_); -			currentElementParser_ = createElementParser(element, ns); -		} -		currentElementParser_->handleStartElement(element, ns, attributes); -	}  	++level_;  }  void XMPPParser::handleEndElement(const String& element, const String& ns) {  	assert(level_ > TopLevel);  	--level_; -	if (level_ == TopLevel) { -		assert(element == "stream"); -		client_->handleStreamEnd(); -	} -	else { -		assert(currentElementParser_); -		currentElementParser_->handleEndElement(element, ns); -		if (level_ == StreamLevel) { -			client_->handleElement(currentElementParser_->getElement()); -			delete currentElementParser_; -			currentElementParser_ = NULL; +	if (!parseErrorOccurred_) { +		if (level_ == TopLevel) { +			assert(element == "stream"); +			client_->handleStreamEnd(); +		} +		else { +			assert(currentElementParser_); +			currentElementParser_->handleEndElement(element, ns); +			if (level_ == StreamLevel) { +				client_->handleElement(currentElementParser_->getElement()); +				delete currentElementParser_; +				currentElementParser_ = NULL; +			}  		}  	}  }  void XMPPParser::handleCharacterData(const String& data) { -	if (currentElementParser_) { -		currentElementParser_->handleCharacterData(data); -	} +	if (!parseErrorOccurred_) { +		if (currentElementParser_) { +			currentElementParser_->handleCharacterData(data); +		}  	//else {  	//	std::cerr << "XMPPParser: Ignoring stray character data: " << data << std::endl;  	//} +	}  }  ElementParser* XMPPParser::createElementParser(const String& element, const String& ns) {  | 
 Swift