summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2008-08-03 11:16:15 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2008-08-03 11:16:15 +0000
commite5730839cca71dc11e0e8a1f89b458af8edc729a (patch)
treeb007ab47df2772afb49a110edddbf58e0d5b5494
parent374083fb085fd48a969c92346ad95d931fd171ac (diff)
2008-08-03 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
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
-rw-r--r--ChangeLog7
-rw-r--r--src/FtpNegotiationCommand.cc6
-rw-r--r--src/HttpResponseCommand.cc12
3 files changed, 23 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index f536bdf1..104f5d65 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2008-08-03 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
+
+ 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 <tujikawa at rednoah dot com>
* 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<ServerHost> 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<ServerHost> sv =
+ _requestGroup->searchServerHost(req->getHost());
+ if(!sv.isNull()) {
+ _requestGroup->removeURIWhoseHostnameIs(sv->getHostname());
+ }
}
if(_requestGroup->getPieceStorage().isNull()) {
uint64_t totalLength = httpResponse->getEntityLength();