1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
From 9ed97d606aaaf79776b0e19a73ba30d8ad0685b5 Mon Sep 17 00:00:00 2001
From: Ben Turner <bent.mozilla@gmail.com>
Date: Tue, 26 May 2015 17:27:01 -0400
Subject: [PATCH] Bug 1163109 - Restrict the resource:// weirdness in workers
to loads from a system principal. r=bzbarsky, a=lizzard
--HG--
extra : transplant_source : sQUdu%7C%ED%84%CA%5B%91%89/%1B2%25%CFY%B0%C3
---
dom/workers/ScriptLoader.cpp | 37 ++++++++++++++++---------------------
1 file changed, 16 insertions(+), 21 deletions(-)
diff --git a/dom/workers/ScriptLoader.cpp b/dom/workers/ScriptLoader.cpp
index 0dfe625..3335c3e 100644
--- a/dom/workers/ScriptLoader.cpp
+++ b/dom/workers/ScriptLoader.cpp
@@ -509,22 +509,6 @@ private:
rv = ssm->GetChannelPrincipal(channel, getter_AddRefs(channelPrincipal));
NS_ENSURE_SUCCESS(rv, rv);
- // See if this is a resource URI. Since JSMs usually come from resource://
- // URIs we're currently considering all URIs with the URI_IS_UI_RESOURCE
- // flag as valid for creating privileged workers.
- if (!nsContentUtils::IsSystemPrincipal(channelPrincipal)) {
- bool isResource;
- rv = NS_URIChainHasFlags(finalURI,
- nsIProtocolHandler::URI_IS_UI_RESOURCE,
- &isResource);
- NS_ENSURE_SUCCESS(rv, rv);
-
- if (isResource) {
- rv = ssm->GetSystemPrincipal(getter_AddRefs(channelPrincipal));
- NS_ENSURE_SUCCESS(rv, rv);
- }
- }
-
// If the load principal is the system principal then the channel
// principal must also be the system principal (we do not allow chrome
// code to create workers with non-chrome scripts). Otherwise this channel
@@ -532,14 +516,25 @@ private:
// here in case redirects changed the location of the script).
if (nsContentUtils::IsSystemPrincipal(loadPrincipal)) {
if (!nsContentUtils::IsSystemPrincipal(channelPrincipal)) {
- return NS_ERROR_DOM_BAD_URI;
+ // See if this is a resource URI. Since JSMs usually come from
+ // resource:// URIs we're currently considering all URIs with the
+ // URI_IS_UI_RESOURCE flag as valid for creating privileged workers.
+ bool isResource;
+ rv = NS_URIChainHasFlags(finalURI,
+ nsIProtocolHandler::URI_IS_UI_RESOURCE,
+ &isResource);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ if (isResource) {
+ // Assign the system principal to the resource:// worker only if it
+ // was loaded from code using the system principal.
+ channelPrincipal = loadPrincipal;
+ } else {
+ return NS_ERROR_DOM_BAD_URI;
+ }
}
}
else {
- nsCString scheme;
- rv = finalURI->GetScheme(scheme);
- NS_ENSURE_SUCCESS(rv, rv);
-
// We exempt data urls and other URI's that inherit their
// principal again.
if (NS_FAILED(loadPrincipal->CheckMayLoad(finalURI, false, true))) {
--
2.4.3
|