From 41502a32b299384b7bb33461be0a00e66b0ed712 Mon Sep 17 00:00:00 2001 From: "reed%reedloden.com" Date: Tue, 13 Nov 2007 08:23:32 +0000 Subject: [PATCH] Bug 394525 - "malware check non-http URIs" (treat Suspend() failures as nonfatal) [p=dcamp r=bzbarsky sr=biesi a=blocking1.9+] git-svn-id: svn://10.0.0.236/trunk@239289 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/docshell/base/nsDocShell.cpp | 33 ++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/mozilla/docshell/base/nsDocShell.cpp b/mozilla/docshell/base/nsDocShell.cpp index 85661c0224b..7b825836aa0 100644 --- a/mozilla/docshell/base/nsDocShell.cpp +++ b/mozilla/docshell/base/nsDocShell.cpp @@ -9201,12 +9201,25 @@ nsClassifierCallback::Run() nsresult rv = channel->GetURI(getter_AddRefs(uri)); NS_ENSURE_SUCCESS(rv, rv); - // XXX: we need to audit other channels to make sure they can handle - // being suspended directly after AsyncOpen() - nsCOMPtr httpChannel = do_QueryInterface(channel); - if (!httpChannel) { - return NS_OK; - } + // Don't bother checking certain types of URIs. + PRBool hasFlags; + rv = NS_URIChainHasFlags(uri, + nsIProtocolHandler::URI_DANGEROUS_TO_LOAD, + &hasFlags); + NS_ENSURE_SUCCESS(rv, rv); + if (hasFlags) return NS_OK; + + rv = NS_URIChainHasFlags(uri, + nsIProtocolHandler::URI_IS_LOCAL_FILE, + &hasFlags); + NS_ENSURE_SUCCESS(rv, rv); + if (hasFlags) return NS_OK; + + rv = NS_URIChainHasFlags(uri, + nsIProtocolHandler::URI_IS_UI_RESOURCE, + &hasFlags); + NS_ENSURE_SUCCESS(rv, rv); + if (hasFlags) return NS_OK; nsCOMPtr uriClassifier = do_GetService(NS_URICLASSIFIERSERVICE_CONTRACTID, &rv); @@ -9220,7 +9233,13 @@ nsClassifierCallback::Run() // Suspend the channel, it will be resumed when we get the classifier // callback. rv = channel->Suspend(); - NS_ENSURE_SUCCESS(rv, rv); + if (NS_FAILED(rv)) { + // Some channels (including nsJSChannel) fail on Suspend. This + // shouldn't be fatal, but will prevent malware from being + // blocked on these channels. + return NS_OK; + } + mSuspendedChannel = channel; #ifdef DEBUG PR_LOG(gDocShellLog, PR_LOG_DEBUG,