Fix assertion failure when dir option of paused HTTP/FTP download is changed

When the directory is changed via aria2.changeOption RPC method, we
directly change first FileEntry's path using FileEntry::setPath().  If
there is no PREF_OUT option is given, basically file name is unknown,
so we just set empty string and let the next run determine the correct
file name and new directory is applied there.  But previous code does
not reset length property of FileEntry, so the unexpected code path is
taken when unpaused and its path expects path is not empty string.
This commit fixes this issue by setting length to 0 using
FileEntry::setLength().
pull/235/merge
Tatsuhiro Tsujikawa 2014-06-03 23:09:28 +09:00
parent b1a8df4cd9
commit 83f4bced07
1 changed files with 12 additions and 3 deletions

View File

@ -1478,9 +1478,18 @@ void changeOption
&& !dctx->hasAttribute(CTX_ATTR_BT)
#endif // ENABLE_BITTORRENT
) {
dctx->getFirstFileEntry()->setPath
(grOption->blank(PREF_OUT) ? A2STR::NIL :
util::applyDir(grOption->get(PREF_DIR), grOption->get(PREF_OUT)));
auto& fileEntry = dctx->getFirstFileEntry();
if(grOption->blank(PREF_OUT)) {
// We need to reset length to 0, so that we pretend that file
// name is unknown and it should be determined at next run.
fileEntry->setLength(0);
fileEntry->setPath(A2STR::NIL);
} else {
fileEntry->setPath
(util::applyDir(grOption->get(PREF_DIR), grOption->get(PREF_OUT)));
}
}
}
#ifdef ENABLE_BITTORRENT