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/RequestGroup.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/RequestGroup.cc')
| -rw-r--r-- | src/RequestGroup.cc | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/src/RequestGroup.cc b/src/RequestGroup.cc index 066e0f21..8a111ddf 100644 --- a/src/RequestGroup.cc +++ b/src/RequestGroup.cc @@ -593,7 +593,10 @@ void RequestGroup::initPieceStorage() tempPieceStorage = ps; } tempPieceStorage->initStorage(); - tempPieceStorage->getDiskAdaptor()->setRequestGroupMan(requestGroupMan_); + if(requestGroupMan_) { + tempPieceStorage->getDiskAdaptor()->setOpenedFileCounter + (requestGroupMan_->getOpenedFileCounter()); + } segmentMan_ = std::make_shared<SegmentMan>(downloadContext_, tempPieceStorage); pieceStorage_ = tempPieceStorage; } |
