|
|
@ -219,14 +219,20 @@ void plResManager::IShutdown() |
|
|
|
// Shut down the registry (finally!)
|
|
|
|
// Shut down the registry (finally!)
|
|
|
|
ILockPages(); |
|
|
|
ILockPages(); |
|
|
|
|
|
|
|
|
|
|
|
PageSet::const_iterator it; |
|
|
|
// Unload all keys before actually deleting the pages.
|
|
|
|
for (it = fAllPages.begin(); it != fAllPages.end(); it++) |
|
|
|
// When a key's refcount drops to zero, IKeyUnreffed looks up the key's page.
|
|
|
|
|
|
|
|
// If the page is already deleted at that point, this causes a use after free and potential crash.
|
|
|
|
|
|
|
|
for (PageSet::const_iterator it = fAllPages.begin(); it != fAllPages.end(); it++) { |
|
|
|
|
|
|
|
(*it)->UnloadKeys(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
fLoadedPages.clear(); |
|
|
|
|
|
|
|
fLastFoundPage = nil; |
|
|
|
|
|
|
|
for (PageSet::const_iterator it = fAllPages.begin(); it != fAllPages.end(); it++) { |
|
|
|
delete *it; |
|
|
|
delete *it; |
|
|
|
|
|
|
|
} |
|
|
|
fAllPages.clear(); |
|
|
|
fAllPages.clear(); |
|
|
|
fLoadedPages.clear(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
IUnlockPages(); |
|
|
|
IUnlockPages(); |
|
|
|
fLastFoundPage = nil; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Now, kill off the Dispatcher
|
|
|
|
// Now, kill off the Dispatcher
|
|
|
|
hsRefCnt_SafeUnRef(fDispatch); |
|
|
|
hsRefCnt_SafeUnRef(fDispatch); |
|
|
|