From db826d0c884316eaee005193a6156b39c4712bf6 Mon Sep 17 00:00:00 2001 From: Michal Novotny Date: Wed, 22 Jul 2009 15:05:52 +0200 Subject: [PATCH] Bug 491873 - Crash [@ nsFtpState::CanReadCacheEntry] with cursor that points to ftp and going offline --- .../ftp/src/nsFtpConnectionThread.cpp | 29 ++++++++++++------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/netwerk/protocol/ftp/src/nsFtpConnectionThread.cpp b/netwerk/protocol/ftp/src/nsFtpConnectionThread.cpp index b2ee03060e34..684c9ef53b4a 100644 --- a/netwerk/protocol/ftp/src/nsFtpConnectionThread.cpp +++ b/netwerk/protocol/ftp/src/nsFtpConnectionThread.cpp @@ -2010,13 +2010,16 @@ nsFtpState::OnCacheEntryAvailable(nsICacheEntryDescriptor *entry, if (IsClosed()) return NS_OK; - mDoomCache = PR_TRUE; - mCacheEntry = entry; - if (CanReadCacheEntry() && ReadCacheEntry()) { - mState = FTP_READ_CACHE; - } else { - Connect(); + if (NS_SUCCEEDED(status) && entry) { + mDoomCache = PR_TRUE; + mCacheEntry = entry; + if (CanReadCacheEntry() && ReadCacheEntry()) { + mState = FTP_READ_CACHE; + return NS_OK; + } } + + Connect(); return NS_OK; } @@ -2207,15 +2210,19 @@ nsFtpState::CheckCache() // Try to open a cache entry immediately, but if the cache entry is busy, // then wait for it to be available. - session->OpenCacheEntry(key, accessReq, PR_FALSE, - getter_AddRefs(mCacheEntry)); - if (mCacheEntry) { + nsresult rv = session->OpenCacheEntry(key, accessReq, PR_FALSE, + getter_AddRefs(mCacheEntry)); + if (NS_SUCCEEDED(rv) && mCacheEntry) { mDoomCache = PR_TRUE; return PR_FALSE; // great, we're ready to proceed! } - nsresult rv = session->AsyncOpenCacheEntry(key, accessReq, this); - return NS_SUCCEEDED(rv); + if (rv == NS_ERROR_CACHE_WAIT_FOR_VALIDATION) { + rv = session->AsyncOpenCacheEntry(key, accessReq, this); + return NS_SUCCEEDED(rv); + } + + return PR_FALSE; } nsresult