Bug 1362182 - Early return if mUpdateObserver has been nulled out by CancelUpdate().
MozReview-Commit-ID: 2fQCtjMJkx
--- a/toolkit/components/url-classifier/nsUrlClassifierDBService.cpp
+++ b/toolkit/components/url-classifier/nsUrlClassifierDBService.cpp
@@ -664,16 +664,30 @@ nsUrlClassifierDBServiceWorker::NotifyUp
}
// Do not record telemetry for testing tables.
if (!provider.Equals(TESTING_TABLE_PROVIDER_NAME)) {
Telemetry::Accumulate(Telemetry::URLCLASSIFIER_UPDATE_ERROR, provider,
NS_ERROR_GET_CODE(updateStatus));
}
+ if (!mUpdateObserver) {
+ // In the normal shutdown process, CancelUpdate() would NOT be
+ // called prior to NotifyUpdateObserver(). However, CancelUpdate()
+ // is a public API which can be called in the test case at any point.
+ // If the call sequence is FinishUpdate() then CancelUpdate(), the later
+ // might be executed before NotifyUpdateObserver() which is triggered
+ // by the update thread. In this case, we will get null mUpdateObserver.
+ NS_WARNING("CancelUpdate() is called before we asynchronously call "
+ "NotifyUpdateObserver() in FinishUpdate().");
+
+ // The DB cleanup will be done in CancelUpdate() so we can just return.
+ return NS_OK;
+ }
+
// Null out mUpdateObserver before notifying so that BeginUpdate()
// becomes available prior to callback.
nsCOMPtr<nsIUrlClassifierUpdateObserver> updateObserver = nullptr;
updateObserver.swap(mUpdateObserver);
if (NS_SUCCEEDED(mUpdateStatus)) {
LOG(("Notifying success: %d", mUpdateWaitSec));
updateObserver->UpdateSuccess(mUpdateWaitSec);