Index: src/OFDNSResolver.m ================================================================== --- src/OFDNSResolver.m +++ src/OFDNSResolver.m @@ -713,10 +713,13 @@ - (void)of_sendQueryForContext: (OFDNSResolverContext *)context runLoopMode: (of_run_loop_mode_t)runLoopMode { OFUDPSocket *sock; OFString *nameServer; + + [_queries setObject: context + forKey: context->_ID]; [context->_cancelTimer invalidate]; [context->_cancelTimer release]; context->_cancelTimer = nil; context->_cancelTimer = [[OFTimer alloc] @@ -819,13 +822,10 @@ context = [[[OFDNSResolverContext alloc] initWithQuery: query ID: ID settings: _settings delegate: delegate] autorelease]; - [_queries setObject: context - forKey: ID]; - [self of_sendQueryForContext: context runLoopMode: runLoopMode]; objc_autoreleasePoolPop(pool); } @@ -944,12 +944,22 @@ /* Opcode */ if ((buffer[2] & 0x78) != (queryDataBuffer[2] & 0x78)) @throw [OFInvalidServerReplyException exception]; /* TC */ - if (buffer[2] & 0x02) - @throw [OFTruncatedDataException exception]; + if (buffer[2] & 0x02) { + of_run_loop_mode_t runLoopMode; + + if (context->_settings->_usesTCP) + @throw [OFTruncatedDataException exception]; + + context->_settings->_usesTCP = true; + runLoopMode = [OFRunLoop currentRunLoop].currentMode; + [self of_sendQueryForContext: context + runLoopMode: runLoopMode]; + return false; + } /* RCODE */ switch (buffer[3] & 0x0F) { case 0: break;