From fd9dae546f92d226cc677ddf0079925472c8e175 Mon Sep 17 00:00:00 2001 From: "dcamp%mozilla.com" Date: Tue, 27 Nov 2007 20:42:33 +0000 Subject: [PATCH] Bug 394525: malware check non-http channels. r=bz, sr=biesi git-svn-id: svn://10.0.0.236/trunk@239994 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 56b5006c9dd..4ec787854d6 100644 --- a/mozilla/docshell/base/nsDocShell.cpp +++ b/mozilla/docshell/base/nsDocShell.cpp @@ -9262,12 +9262,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); @@ -9281,7 +9294,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,