Index: src/XMPPConnection.m ================================================================== --- src/XMPPConnection.m +++ src/XMPPConnection.m @@ -267,25 +267,26 @@ for (;;) { size_t length = [sock readNBytes: 512 intoBuffer: buffer]; - if (length < 1 && [delegate respondsToSelector: - @selector(connectionWasClosed:)]) - [delegate connectionWasClosed: self]; + [self parseBuffer: buffer + withLength: length]; - [parser parseBuffer: buffer - withLength: length]; + if (length < 1) + return; } } - (void)parseBuffer: (const char*)buffer withLength: (size_t)length { if (length < 1 && [delegate respondsToSelector: - @selector(connectionWasClosed:)]) + @selector(connectionWasClosed:)]) { [delegate connectionWasClosed: self]; + return; + } [parser parseBuffer: buffer withLength: length]; [oldParser release]; @@ -451,10 +452,23 @@ [self XMPP_handleTLS: element]; if ([[element namespace] isEqual: XMPP_NS_SASL]) [self XMPP_handleSASL: element]; } + +- (void)elementBuilder: (OFXMLElementBuilder *)builder + didNotExpectCloseTag: (OFString *)name + withPrefix: (OFString *)prefix + namespace: (OFString *)ns +{ + if (![name isEqual: @"stream"] || ![prefix isEqual: @"stream"] || + ![ns isEqual: XMPP_NS_STREAM]) { + @throw [OFMalformedXMLException + exceptionWithClass: [builder class] + parser: nil]; + } +} - (void)XMPP_startStream { /* Make sure we don't get any old events */ [parser setDelegate: nil];