diff --git a/mozilla/content/html/document/src/nsHTMLContentSink.cpp b/mozilla/content/html/document/src/nsHTMLContentSink.cpp index 983df916e18..f0652166325 100644 --- a/mozilla/content/html/document/src/nsHTMLContentSink.cpp +++ b/mozilla/content/html/document/src/nsHTMLContentSink.cpp @@ -77,6 +77,7 @@ #include "nsIStyleSheetLinkingElement.h" #include "nsIDOMHTMLTitleElement.h" #include "stopwatch.h" +#include "nsDOMError.h" static NS_DEFINE_IID(kIDOMHTMLTitleElementIID, NS_IDOMHTMLTITLEELEMENT_IID); static NS_DEFINE_IID(kIDOMNodeIID, NS_IDOMNODE_IID); @@ -3611,6 +3612,35 @@ HTMLContentSink::OnUnicharStreamComplete(nsIUnicharStreamLoader* aLoader, return rv; } +/* +** The enum "SchemeOrder" defines an ordering of URI schemes used to +** determine whether a page can load a script. Schemes are listed in +** order of declining power: chrome can access everything, resource +** can access everything but chrome, and so forth. +*/ + +enum SchemeOrder { CHROME_SCHEME, RESOURCE_SCHEME, FILE_SCHEME, OTHER_SCHEME }; + +static SchemeOrder +GetSchemeOrder(nsIURI *uri) +{ + SchemeOrder result = OTHER_SCHEME; + if (uri) { + char *scheme; + uri->GetScheme(&scheme); + if (scheme) { + if (PL_strcmp(scheme, "chrome") == 0) + result = CHROME_SCHEME; + else if (PL_strcmp(scheme, "resource") == 0) + result = RESOURCE_SCHEME; + else if (PL_strcmp(scheme, "file") == 0) + result = FILE_SCHEME; + nsCRT::free(scheme); + } + } + return result; +} + nsresult HTMLContentSink::ProcessSCRIPTTag(const nsIParserNode& aNode) { @@ -3739,6 +3769,14 @@ HTMLContentSink::ProcessSCRIPTTag(const nsIParserNode& aNode) return rv; } + // Check access to file:, chrome:, and resource:. + SchemeOrder order = GetSchemeOrder(url); + SchemeOrder baseOrder = GetSchemeOrder(mDocumentBaseURL); + if (baseOrder > order) { + NS_RELEASE(url); + return NS_ERROR_DOM_BAD_URI; + } + nsCOMPtr loadGroup; nsIUnicharStreamLoader* loader; diff --git a/mozilla/layout/html/document/src/nsHTMLContentSink.cpp b/mozilla/layout/html/document/src/nsHTMLContentSink.cpp index 983df916e18..f0652166325 100644 --- a/mozilla/layout/html/document/src/nsHTMLContentSink.cpp +++ b/mozilla/layout/html/document/src/nsHTMLContentSink.cpp @@ -77,6 +77,7 @@ #include "nsIStyleSheetLinkingElement.h" #include "nsIDOMHTMLTitleElement.h" #include "stopwatch.h" +#include "nsDOMError.h" static NS_DEFINE_IID(kIDOMHTMLTitleElementIID, NS_IDOMHTMLTITLEELEMENT_IID); static NS_DEFINE_IID(kIDOMNodeIID, NS_IDOMNODE_IID); @@ -3611,6 +3612,35 @@ HTMLContentSink::OnUnicharStreamComplete(nsIUnicharStreamLoader* aLoader, return rv; } +/* +** The enum "SchemeOrder" defines an ordering of URI schemes used to +** determine whether a page can load a script. Schemes are listed in +** order of declining power: chrome can access everything, resource +** can access everything but chrome, and so forth. +*/ + +enum SchemeOrder { CHROME_SCHEME, RESOURCE_SCHEME, FILE_SCHEME, OTHER_SCHEME }; + +static SchemeOrder +GetSchemeOrder(nsIURI *uri) +{ + SchemeOrder result = OTHER_SCHEME; + if (uri) { + char *scheme; + uri->GetScheme(&scheme); + if (scheme) { + if (PL_strcmp(scheme, "chrome") == 0) + result = CHROME_SCHEME; + else if (PL_strcmp(scheme, "resource") == 0) + result = RESOURCE_SCHEME; + else if (PL_strcmp(scheme, "file") == 0) + result = FILE_SCHEME; + nsCRT::free(scheme); + } + } + return result; +} + nsresult HTMLContentSink::ProcessSCRIPTTag(const nsIParserNode& aNode) { @@ -3739,6 +3769,14 @@ HTMLContentSink::ProcessSCRIPTTag(const nsIParserNode& aNode) return rv; } + // Check access to file:, chrome:, and resource:. + SchemeOrder order = GetSchemeOrder(url); + SchemeOrder baseOrder = GetSchemeOrder(mDocumentBaseURL); + if (baseOrder > order) { + NS_RELEASE(url); + return NS_ERROR_DOM_BAD_URI; + } + nsCOMPtr loadGroup; nsIUnicharStreamLoader* loader;