mirror of https://github.com/aria2/aria2
Don't enable mmap if file allocation is disabled
Without file allocation, we cannot map file because file length could be zero. This could fix bug reported at GH-478pull/481/head
parent
af98861aff
commit
3974c1223b
|
@ -284,12 +284,10 @@ ssize_t AbstractDiskWriter::readDataInternal(unsigned char* data, size_t len,
|
|||
int64_t offset)
|
||||
{
|
||||
if(mapaddr_) {
|
||||
ssize_t readlen;
|
||||
if(offset > maplen_) {
|
||||
readlen = 0;
|
||||
} else {
|
||||
readlen = std::min(static_cast<size_t>(maplen_ - offset), len);
|
||||
if (offset >= maplen_) {
|
||||
return 0;
|
||||
}
|
||||
auto readlen = std::min(maplen_ - offset, static_cast<int64_t>(len));
|
||||
memcpy(data, mapaddr_ + offset, readlen);
|
||||
return readlen;
|
||||
} else {
|
||||
|
@ -355,6 +353,14 @@ void AbstractDiskWriter::ensureMmapWrite(size_t len, int64_t offset)
|
|||
}
|
||||
} else {
|
||||
int64_t filesize = size();
|
||||
|
||||
if (filesize == 0) {
|
||||
// mapping 0 length file is useless. Also munmap with size ==
|
||||
// 0 will fail with EINVAL.
|
||||
enableMmap_ = false;
|
||||
return;
|
||||
}
|
||||
|
||||
int errNum = 0;
|
||||
if(static_cast<int64_t>(len + offset) <= filesize) {
|
||||
#ifdef __MINGW32__
|
||||
|
|
|
@ -58,9 +58,11 @@ BtFileAllocationEntry::~BtFileAllocationEntry() {}
|
|||
void BtFileAllocationEntry::prepareForNextAction
|
||||
(std::vector<std::unique_ptr<Command>>& commands, DownloadEngine* e)
|
||||
{
|
||||
BtSetup().setup(commands, getRequestGroup(), e,
|
||||
getRequestGroup()->getOption().get());
|
||||
if(getRequestGroup()->getOption()->getAsBool(PREF_ENABLE_MMAP)) {
|
||||
auto &option = getRequestGroup()->getOption();
|
||||
|
||||
BtSetup().setup(commands, getRequestGroup(), e, option.get());
|
||||
if(option->getAsBool(PREF_ENABLE_MMAP) &&
|
||||
option->get(PREF_FILE_ALLOCATION) != V_NONE) {
|
||||
getRequestGroup()->getPieceStorage()->getDiskAdaptor()->enableMmap();
|
||||
}
|
||||
if(!getRequestGroup()->downloadFinished()) {
|
||||
|
|
|
@ -60,10 +60,13 @@ void StreamFileAllocationEntry::prepareForNextAction
|
|||
(std::vector<std::unique_ptr<Command>>& commands,
|
||||
DownloadEngine* e)
|
||||
{
|
||||
auto &option = getRequestGroup()->getOption();
|
||||
|
||||
// For DownloadContext::resetDownloadStartTime(), see also
|
||||
// RequestGroup::createInitialCommand()
|
||||
getRequestGroup()->getDownloadContext()->resetDownloadStartTime();
|
||||
if(getRequestGroup()->getOption()->getAsBool(PREF_ENABLE_MMAP)) {
|
||||
if(option->getAsBool(PREF_ENABLE_MMAP) &&
|
||||
option->get(PREF_FILE_ALLOCATION) != V_NONE) {
|
||||
getRequestGroup()->getPieceStorage()->getDiskAdaptor()->enableMmap();
|
||||
}
|
||||
if(getNextCommand()) {
|
||||
|
|
Loading…
Reference in New Issue