diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2014-06-08 17:03:34 +0900 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2014-06-08 17:03:34 +0900 |
| commit | 570bc24fb98d72d1bce9261fdc29139224ec86ec (patch) | |
| tree | ccf2c67ef8dda9cf91c88fd41941fe0b33ade65c /src/MultiDiskAdaptor.cc | |
| parent | 442e460055fdf045cc70c87fac9f0dd481ad55e2 (diff) | |
Fix use-after-free on exit with multi-file torrent download + DHT
DefaultPieceStorage may be referenced by one of DHT task (e.g.,
DHTPeerLookupTask), after RequestGroup was deleted, and even after
RequestGroupMan was deleted. DefaultPieceStorage has a reference to
MultiDiskAdaptor which calls RequestGroupMan object on destruction.
So when DHT task is destroyed, DefaultPieceStorage is destroyed, which
in turn destroys MultiDiskAdaptor. DHT task is destroyed after
RequestGroupMan was destroyed, MultiDiskAdaptor will use now freed
RequestGroupMan object, this is use-after-free.
Diffstat (limited to 'src/MultiDiskAdaptor.cc')
| -rw-r--r-- | src/MultiDiskAdaptor.cc | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/src/MultiDiskAdaptor.cc b/src/MultiDiskAdaptor.cc index 825b04cc..4a2b0ec4 100644 --- a/src/MultiDiskAdaptor.cc +++ b/src/MultiDiskAdaptor.cc @@ -51,7 +51,7 @@ #include "LogFactory.h" #include "SimpleRandomizer.h" #include "WrDiskCacheEntry.h" -#include "RequestGroupMan.h" +#include "OpenedFileCounter.h" namespace aria2 { @@ -226,8 +226,9 @@ void MultiDiskAdaptor::openIfNot if(!entry->isOpen()) { // A2_LOG_NOTICE(fmt("DiskWriterEntry: Cache MISS. offset=%s", // util::itos(entry->getFileEntry()->getOffset()).c_str())); - if(getRequestGroupMan()) { - getRequestGroupMan()->ensureMaxOpenFileLimit(1); + auto& openedFileCounter = getOpenedFileCounter(); + if(openedFileCounter) { + openedFileCounter->ensureMaxOpenFileLimit(1); } (entry->*open)(); openedDiskWriterEntries_.push_back(entry); @@ -278,8 +279,9 @@ void MultiDiskAdaptor::closeFile() dwent->closeFile(); } } - if(getRequestGroupMan()) { - getRequestGroupMan()->reduceNumOfOpenedFile(n); + auto& openedFileCounter = getOpenedFileCounter(); + if(openedFileCounter) { + openedFileCounter->reduceNumOfOpenedFile(n); } } |
