diff --git a/ChangeLog b/ChangeLog index f536bdf1..104f5d65 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2008-08-03 Tatsuhiro Tsujikawa + + Fixed the bug that causes segmentaion fault when resuming download + using metalink without size tag. Reproducible only using HTTP URI. + * src/HttpResponseCommand.cc + * src/FtpNegotiationCommand.cc + 2008-08-01 Tatsuhiro Tsujikawa * Release 0.15.1 diff --git a/src/FtpNegotiationCommand.cc b/src/FtpNegotiationCommand.cc index 52b2e155..80371fd3 100644 --- a/src/FtpNegotiationCommand.cc +++ b/src/FtpNegotiationCommand.cc @@ -88,7 +88,11 @@ bool FtpNegotiationCommand::executeInternal() { command->setStartupIdleTime(e->option->getAsInt(PREF_STARTUP_IDLE_TIME)); command->setLowestDownloadSpeedLimit(e->option->getAsInt(PREF_LOWEST_SPEED_LIMIT)); if(!_requestGroup->isSingleHostMultiConnectionEnabled()) { - _requestGroup->removeURIWhoseHostnameIs(_requestGroup->searchServerHost(cuid)->getHostname()); + SharedHandle sv = + _requestGroup->searchServerHost(req->getHost()); + if(!sv.isNull()) { + _requestGroup->removeURIWhoseHostnameIs(sv->getHostname()); + } } e->commands.push_back(command); return true; diff --git a/src/HttpResponseCommand.cc b/src/HttpResponseCommand.cc index ddf3acdb..929d7992 100644 --- a/src/HttpResponseCommand.cc +++ b/src/HttpResponseCommand.cc @@ -95,7 +95,17 @@ bool HttpResponseCommand::executeInternal() } if(!_requestGroup->isSingleHostMultiConnectionEnabled()) { - _requestGroup->removeURIWhoseHostnameIs(_requestGroup->searchServerHost(cuid)->getHostname()); + // Query by hostname. Searching by CUID may returns NULL. + // In case when resuming download, ServerHost is registered with CUID A. + // Then if requested range is not equal to saved one, + // StreamFileAllocationEntry is created with _nextCommand NULL and + // _currentRequest not NULL. This results creating new command CUID, say + // B and same URI. So searching ServerHost by CUID B fails. + SharedHandle sv = + _requestGroup->searchServerHost(req->getHost()); + if(!sv.isNull()) { + _requestGroup->removeURIWhoseHostnameIs(sv->getHostname()); + } } if(_requestGroup->getPieceStorage().isNull()) { uint64_t totalLength = httpResponse->getEntityLength();