зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1346759 - Use URI comparison for null principals instead of pointer comparison. r=ckerschb,bholley
Differential Revision: https://phabricator.services.mozilla.com/D12154 --HG-- extra : moz-landing-system : lando
This commit is contained in:
Родитель
9e0663f555
Коммит
dcf26b19b4
|
@ -1123,6 +1123,7 @@ dependencies = [
|
||||||
"encoding_glue 0.1.0",
|
"encoding_glue 0.1.0",
|
||||||
"env_logger 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
"env_logger 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"geckoservo 0.0.1",
|
"geckoservo 0.0.1",
|
||||||
|
"gkrust_utils 0.1.0",
|
||||||
"jsrust_shared 0.1.0",
|
"jsrust_shared 0.1.0",
|
||||||
"kvstore 0.1.0",
|
"kvstore 0.1.0",
|
||||||
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
@ -1140,6 +1141,14 @@ dependencies = [
|
||||||
"xpcom 0.1.0",
|
"xpcom 0.1.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "gkrust_utils"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"nsstring 0.1.0",
|
||||||
|
"uuid 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "gl_generator"
|
name = "gl_generator"
|
||||||
version = "0.10.0"
|
version = "0.10.0"
|
||||||
|
|
|
@ -36,6 +36,7 @@ exclude = [
|
||||||
"media/mp4parse-rust/mp4parse",
|
"media/mp4parse-rust/mp4parse",
|
||||||
"media/mp4parse-rust/mp4parse_capi",
|
"media/mp4parse-rust/mp4parse_capi",
|
||||||
"media/mp4parse-rust/mp4parse_fallible",
|
"media/mp4parse-rust/mp4parse_fallible",
|
||||||
|
"xpcom/rust/gkrust_utils",
|
||||||
]
|
]
|
||||||
|
|
||||||
# Explicitly specify what our profiles use. The opt-level setting here is
|
# Explicitly specify what our profiles use. The opt-level setting here is
|
||||||
|
|
|
@ -279,13 +279,11 @@ inline bool BasePrincipal::FastEquals(nsIPrincipal* aOther) {
|
||||||
// Two principals are considered to be equal if their origins are the same.
|
// Two principals are considered to be equal if their origins are the same.
|
||||||
// If the two principals are codebase principals, their origin attributes
|
// If the two principals are codebase principals, their origin attributes
|
||||||
// (aka the origin suffix) must also match.
|
// (aka the origin suffix) must also match.
|
||||||
// If the two principals are null principals, they're only equal if they're
|
if (Kind() == eSystemPrincipal) {
|
||||||
// the same object.
|
|
||||||
if (Kind() == eNullPrincipal || Kind() == eSystemPrincipal) {
|
|
||||||
return this == other;
|
return this == other;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Kind() == eCodebasePrincipal) {
|
if (Kind() == eCodebasePrincipal || Kind() == eNullPrincipal) {
|
||||||
return mOriginNoSuffix == other->mOriginNoSuffix &&
|
return mOriginNoSuffix == other->mOriginNoSuffix &&
|
||||||
mOriginSuffix == other->mOriginSuffix;
|
mOriginSuffix == other->mOriginSuffix;
|
||||||
}
|
}
|
||||||
|
@ -308,13 +306,6 @@ inline bool BasePrincipal::FastEqualsConsideringDomain(nsIPrincipal* aOther) {
|
||||||
|
|
||||||
inline bool BasePrincipal::FastSubsumes(nsIPrincipal* aOther) {
|
inline bool BasePrincipal::FastSubsumes(nsIPrincipal* aOther) {
|
||||||
// If two principals are equal, then they both subsume each other.
|
// If two principals are equal, then they both subsume each other.
|
||||||
// We deal with two special cases first:
|
|
||||||
// Null principals only subsume each other if they are equal, and are only
|
|
||||||
// equal if they're the same object.
|
|
||||||
auto other = Cast(aOther);
|
|
||||||
if (Kind() == eNullPrincipal && other->Kind() == eNullPrincipal) {
|
|
||||||
return this == other;
|
|
||||||
}
|
|
||||||
if (FastEquals(aOther)) {
|
if (FastEquals(aOther)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -171,7 +171,9 @@ bool NullPrincipal::MayLoadInternal(nsIURI* aURI) {
|
||||||
nsCOMPtr<nsIPrincipal> blobPrincipal;
|
nsCOMPtr<nsIPrincipal> blobPrincipal;
|
||||||
if (dom::BlobURLProtocolHandler::GetBlobURLPrincipal(
|
if (dom::BlobURLProtocolHandler::GetBlobURLPrincipal(
|
||||||
aURI, getter_AddRefs(blobPrincipal))) {
|
aURI, getter_AddRefs(blobPrincipal))) {
|
||||||
return blobPrincipal == this;
|
MOZ_ASSERT(blobPrincipal);
|
||||||
|
return SubsumesInternal(blobPrincipal,
|
||||||
|
BasePrincipal::ConsiderDocumentDomain);
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -87,7 +87,8 @@ class NullPrincipal final : public BasePrincipal {
|
||||||
|
|
||||||
bool SubsumesInternal(nsIPrincipal* aOther,
|
bool SubsumesInternal(nsIPrincipal* aOther,
|
||||||
DocumentDomainConsideration aConsideration) override {
|
DocumentDomainConsideration aConsideration) override {
|
||||||
return aOther == this;
|
MOZ_ASSERT(aOther);
|
||||||
|
return FastEquals(aOther);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MayLoadInternal(nsIURI* aURI) override;
|
bool MayLoadInternal(nsIURI* aURI) override;
|
||||||
|
|
|
@ -15,6 +15,8 @@
|
||||||
#include "nsCRT.h"
|
#include "nsCRT.h"
|
||||||
#include "nsIUUIDGenerator.h"
|
#include "nsIUUIDGenerator.h"
|
||||||
|
|
||||||
|
#include "mozilla/GkRustUtils.h"
|
||||||
|
|
||||||
using namespace mozilla;
|
using namespace mozilla;
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -27,18 +29,7 @@ NullPrincipalURI::NullPrincipalURI(const NullPrincipalURI& aOther) {
|
||||||
}
|
}
|
||||||
|
|
||||||
nsresult NullPrincipalURI::Init() {
|
nsresult NullPrincipalURI::Init() {
|
||||||
// FIXME: bug 327161 -- make sure the uuid generator is reseeding-resistant.
|
GkRustUtils::GenerateUUID(mPath);
|
||||||
nsCOMPtr<nsIUUIDGenerator> uuidgen = services::GetUUIDGenerator();
|
|
||||||
NS_ENSURE_TRUE(uuidgen, NS_ERROR_NOT_AVAILABLE);
|
|
||||||
|
|
||||||
nsID id;
|
|
||||||
nsresult rv = uuidgen->GenerateUUIDInPlace(&id);
|
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
|
||||||
|
|
||||||
mPath.SetLength(NSID_LENGTH - 1); // -1 because NSID_LENGTH counts the '\0'
|
|
||||||
id.ToProvidedString(
|
|
||||||
*reinterpret_cast<char(*)[NSID_LENGTH]>(mPath.BeginWriting()));
|
|
||||||
|
|
||||||
MOZ_ASSERT(mPath.Length() == NSID_LENGTH - 1);
|
MOZ_ASSERT(mPath.Length() == NSID_LENGTH - 1);
|
||||||
MOZ_ASSERT(strlen(mPath.get()) == NSID_LENGTH - 1);
|
MOZ_ASSERT(strlen(mPath.get()) == NSID_LENGTH - 1);
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,8 @@ import subprocess
|
||||||
|
|
||||||
CARGO_LOCK = mozpath.join(buildconfig.topsrcdir, "Cargo.lock")
|
CARGO_LOCK = mozpath.join(buildconfig.topsrcdir, "Cargo.lock")
|
||||||
|
|
||||||
|
# cbindgen_crate_path needs to match the crate name
|
||||||
|
# EG: /xpcom/rust/gkrust_utils is the path for the "gkrust_utils" crate
|
||||||
def generate(output, cbindgen_crate_path, *in_tree_dependencies):
|
def generate(output, cbindgen_crate_path, *in_tree_dependencies):
|
||||||
env = os.environ.copy()
|
env = os.environ.copy()
|
||||||
env['CARGO'] = str(buildconfig.substs['CARGO'])
|
env['CARGO'] = str(buildconfig.substs['CARGO'])
|
||||||
|
|
|
@ -24,6 +24,7 @@ encoding_glue = { path = "../../../../intl/encoding_glue" }
|
||||||
audioipc-client = { path = "../../../../media/audioipc/client", optional = true }
|
audioipc-client = { path = "../../../../media/audioipc/client", optional = true }
|
||||||
audioipc-server = { path = "../../../../media/audioipc/server", optional = true }
|
audioipc-server = { path = "../../../../media/audioipc/server", optional = true }
|
||||||
u2fhid = { path = "../../../../dom/webauthn/u2f-hid-rs" }
|
u2fhid = { path = "../../../../dom/webauthn/u2f-hid-rs" }
|
||||||
|
gkrust_utils = { path = "../../../../xpcom/rust/gkrust_utils" }
|
||||||
rsdparsa_capi = { path = "../../../../media/webrtc/signaling/src/sdp/rsdparsa_capi" }
|
rsdparsa_capi = { path = "../../../../media/webrtc/signaling/src/sdp/rsdparsa_capi" }
|
||||||
# We have these to enforce common feature sets for said crates.
|
# We have these to enforce common feature sets for said crates.
|
||||||
log = {version = "0.4", features = ["release_max_level_info"]}
|
log = {version = "0.4", features = ["release_max_level_info"]}
|
||||||
|
|
|
@ -29,6 +29,7 @@ extern crate audioipc_client;
|
||||||
extern crate audioipc_server;
|
extern crate audioipc_server;
|
||||||
extern crate env_logger;
|
extern crate env_logger;
|
||||||
extern crate u2fhid;
|
extern crate u2fhid;
|
||||||
|
extern crate gkrust_utils;
|
||||||
extern crate log;
|
extern crate log;
|
||||||
extern crate cosec;
|
extern crate cosec;
|
||||||
extern crate rsdparsa_capi;
|
extern crate rsdparsa_capi;
|
||||||
|
|
|
@ -1901,7 +1901,7 @@ var AddonManagerInternal = {
|
||||||
this.installNotifyObservers("addon-install-disabled", topBrowser,
|
this.installNotifyObservers("addon-install-disabled", topBrowser,
|
||||||
aInstallingPrincipal.URI, aInstall);
|
aInstallingPrincipal.URI, aInstall);
|
||||||
return;
|
return;
|
||||||
} else if (!aBrowser.contentPrincipal || !aInstallingPrincipal.subsumes(aBrowser.contentPrincipal)) {
|
} else if (aInstallingPrincipal.isNullPrincipal || !aBrowser.contentPrincipal || !aInstallingPrincipal.subsumes(aBrowser.contentPrincipal)) {
|
||||||
aInstall.cancel();
|
aInstall.cancel();
|
||||||
|
|
||||||
this.installNotifyObservers("addon-install-origin-blocked", topBrowser,
|
this.installNotifyObservers("addon-install-origin-blocked", topBrowser,
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||||
|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
||||||
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
#include "gk_rust_utils_ffi_generated.h"
|
||||||
|
#include "nsString.h"
|
||||||
|
#include "GkRustUtils.h"
|
||||||
|
|
||||||
|
using namespace mozilla;
|
||||||
|
|
||||||
|
/* static */ void GkRustUtils::GenerateUUID(nsACString& aResult) {
|
||||||
|
GkRustUtils_GenerateUUID(&aResult);
|
||||||
|
};
|
|
@ -0,0 +1,11 @@
|
||||||
|
#ifndef __mozilla_GkRustUtils_h
|
||||||
|
#define __mozilla_GkRustUtils_h
|
||||||
|
|
||||||
|
#include "nsString.h"
|
||||||
|
|
||||||
|
class GkRustUtils {
|
||||||
|
public:
|
||||||
|
static void GenerateUUID(nsACString& aResult);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -115,6 +115,7 @@ EXPORTS.mozilla += [
|
||||||
'DeferredFinalize.h',
|
'DeferredFinalize.h',
|
||||||
'EnumeratedArrayCycleCollection.h',
|
'EnumeratedArrayCycleCollection.h',
|
||||||
'ErrorNames.h',
|
'ErrorNames.h',
|
||||||
|
'GkRustUtils.h',
|
||||||
'HoldDropJSObjects.h',
|
'HoldDropJSObjects.h',
|
||||||
'IntentionalCrash.h',
|
'IntentionalCrash.h',
|
||||||
'JSObjectHolder.h',
|
'JSObjectHolder.h',
|
||||||
|
@ -149,6 +150,7 @@ UNIFIED_SOURCES += [
|
||||||
'DebuggerOnGCRunnable.cpp',
|
'DebuggerOnGCRunnable.cpp',
|
||||||
'DeferredFinalize.cpp',
|
'DeferredFinalize.cpp',
|
||||||
'ErrorNames.cpp',
|
'ErrorNames.cpp',
|
||||||
|
'GkRustUtils.cpp',
|
||||||
'HoldDropJSObjects.cpp',
|
'HoldDropJSObjects.cpp',
|
||||||
'JSObjectHolder.cpp',
|
'JSObjectHolder.cpp',
|
||||||
'LogCommandLineHandler.cpp',
|
'LogCommandLineHandler.cpp',
|
||||||
|
@ -215,6 +217,21 @@ elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'windows':
|
||||||
'nsCrashOnException.cpp',
|
'nsCrashOnException.cpp',
|
||||||
]
|
]
|
||||||
|
|
||||||
|
if CONFIG['COMPILE_ENVIRONMENT']:
|
||||||
|
GENERATED_FILES += [
|
||||||
|
'gk_rust_utils_ffi_generated.h',
|
||||||
|
]
|
||||||
|
|
||||||
|
EXPORTS.mozilla += [
|
||||||
|
'!gk_rust_utils_ffi_generated.h',
|
||||||
|
]
|
||||||
|
|
||||||
|
ffi_generated = GENERATED_FILES['gk_rust_utils_ffi_generated.h']
|
||||||
|
ffi_generated.script = '/layout/style/RunCbindgen.py:generate'
|
||||||
|
ffi_generated.inputs = [
|
||||||
|
'/xpcom/rust/gkrust_utils',
|
||||||
|
]
|
||||||
|
|
||||||
include('/ipc/chromium/chromium-config.mozbuild')
|
include('/ipc/chromium/chromium-config.mozbuild')
|
||||||
|
|
||||||
FINAL_LIBRARY = 'xul'
|
FINAL_LIBRARY = 'xul'
|
||||||
|
|
|
@ -22,7 +22,7 @@ class nsInterfaceRequestorAgg final : public nsIInterfaceRequestor {
|
||||||
nsIEventTarget* aConsumerTarget = nullptr)
|
nsIEventTarget* aConsumerTarget = nullptr)
|
||||||
: mFirst(aFirst), mSecond(aSecond), mConsumerTarget(aConsumerTarget) {
|
: mFirst(aFirst), mSecond(aSecond), mConsumerTarget(aConsumerTarget) {
|
||||||
if (!mConsumerTarget) {
|
if (!mConsumerTarget) {
|
||||||
mConsumerTarget = GetCurrentThreadEventTarget();
|
mConsumerTarget = mozilla::GetCurrentThreadEventTarget();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
[package]
|
||||||
|
name = "gkrust_utils"
|
||||||
|
version = "0.1.0"
|
||||||
|
authors = ["Jonathan Kingston <jkt@mozilla.com>"]
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
uuid = { version = "0.6", features = ["v4"] }
|
||||||
|
nsstring = { path = "../nsstring" }
|
|
@ -0,0 +1,31 @@
|
||||||
|
header = """/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */"""
|
||||||
|
autogen_warning = """/* DO NOT MODIFY THIS MANUALLY! This file was generated using cbindgen.
|
||||||
|
* To generate this file:
|
||||||
|
* 1. Get the latest cbindgen using `cargo install --force cbindgen`
|
||||||
|
* a. Alternatively, you can clone `https://github.com/eqrion/cbindgen` and use a tagged release
|
||||||
|
* 2. Run `rustup run nightly cbindgen xpcom/rust/gkrust_utils --lockfile Cargo.lock --crate gkrust_utils -o xpcom/base/gk_rust_utils_ffi_generated.h`
|
||||||
|
*/
|
||||||
|
#include "nsError.h"
|
||||||
|
#include "nsString.h"
|
||||||
|
"""
|
||||||
|
include_version = true
|
||||||
|
braces = "SameLine"
|
||||||
|
line_length = 100
|
||||||
|
tab_width = 2
|
||||||
|
language = "C++"
|
||||||
|
namespaces = ["mozilla"]
|
||||||
|
|
||||||
|
[export]
|
||||||
|
# Skip constants because we don't have any
|
||||||
|
item_types = ["globals", "enums", "structs", "unions", "typedefs", "opaque", "functions"]
|
||||||
|
|
||||||
|
[enum]
|
||||||
|
add_sentinel = true
|
||||||
|
derive_helper_methods = true
|
||||||
|
|
||||||
|
[defines]
|
||||||
|
"target_os = windows" = "XP_WIN"
|
||||||
|
"target_os = macos" = "XP_MACOSX"
|
||||||
|
"target_os = android" = "ANDROID"
|
|
@ -0,0 +1,13 @@
|
||||||
|
extern crate nsstring;
|
||||||
|
extern crate uuid;
|
||||||
|
use nsstring::nsACString;
|
||||||
|
use uuid::Uuid;
|
||||||
|
|
||||||
|
use std::fmt::Write;
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern "C" fn GkRustUtils_GenerateUUID(res: &mut nsACString) {
|
||||||
|
// TODO once the vendored Uuid implementation is >7 this likely can use Hyphenated instead of to_string
|
||||||
|
let uuid = Uuid::new_v4().hyphenated().to_string();
|
||||||
|
write!(res, "{{{}}}", uuid).expect("Unexpected uuid generated");
|
||||||
|
}
|
Загрузка…
Ссылка в новой задаче