Bug 1554847 - Improve cross-origin checks in canvas API - propagate allRedirectsSameOrigin to HttpChannelChild actor, r=mayhemer

Differential Revision: https://phabricator.services.mozilla.com/D32793

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Andrea Marchesini 2019-06-04 06:33:11 +00:00
parent f4c9f068fa
commit b4b9392f9d
4 changed files with 24 additions and 10 deletions

View File

@ -395,7 +395,8 @@ class StartRequestEvent : public NeckoTargetChannelEvent<HttpChannelChild> {
const NetAddr& aPeerAddr, const uint32_t& aCacheKey,
const nsCString& altDataType, const int64_t& altDataLen,
const bool& deliveringAltData, const bool& aApplyConversion,
const bool& aIsResolvedByTRR, const ResourceTimingStruct& aTiming)
const bool& aIsResolvedByTRR, const ResourceTimingStruct& aTiming,
const bool& aAllRedirectsSameOrigin)
: NeckoTargetChannelEvent<HttpChannelChild>(aChild),
mChannelStatus(aChannelStatus),
mResponseHead(aResponseHead),
@ -418,7 +419,8 @@ class StartRequestEvent : public NeckoTargetChannelEvent<HttpChannelChild> {
mDeliveringAltData(deliveringAltData),
mLoadInfoForwarder(loadInfoForwarder),
mIsResolvedByTRR(aIsResolvedByTRR),
mTiming(aTiming) {}
mTiming(aTiming),
mAllRedirectsSameOrigin(aAllRedirectsSameOrigin) {}
void Run() override {
LOG(("StartRequestEvent [this=%p]\n", mChild));
@ -428,7 +430,7 @@ class StartRequestEvent : public NeckoTargetChannelEvent<HttpChannelChild> {
mCacheEntryId, mCacheFetchCount, mCacheExpirationTime, mCachedCharset,
mSecurityInfoSerialization, mSelfAddr, mPeerAddr, mCacheKey,
mAltDataType, mAltDataLen, mDeliveringAltData, mApplyConversion,
mIsResolvedByTRR, mTiming);
mIsResolvedByTRR, mTiming, mAllRedirectsSameOrigin);
}
private:
@ -454,6 +456,7 @@ class StartRequestEvent : public NeckoTargetChannelEvent<HttpChannelChild> {
ParentLoadInfoForwarderArgs mLoadInfoForwarder;
bool mIsResolvedByTRR;
ResourceTimingStruct mTiming;
bool mAllRedirectsSameOrigin;
};
mozilla::ipc::IPCResult HttpChannelChild::RecvOnStartRequest(
@ -468,7 +471,8 @@ mozilla::ipc::IPCResult HttpChannelChild::RecvOnStartRequest(
const int16_t& redirectCount, const uint32_t& cacheKey,
const nsCString& altDataType, const int64_t& altDataLen,
const bool& deliveringAltData, const bool& aApplyConversion,
const bool& aIsResolvedByTRR, const ResourceTimingStruct& aTiming) {
const bool& aIsResolvedByTRR, const ResourceTimingStruct& aTiming,
const bool& aAllRedirectsSameOrigin) {
AUTO_PROFILER_LABEL("HttpChannelChild::RecvOnStartRequest", NETWORK);
LOG(("HttpChannelChild::RecvOnStartRequest [this=%p]\n", this));
// mFlushedForDiversion and mDivertingToParent should NEVER be set at this
@ -488,7 +492,7 @@ mozilla::ipc::IPCResult HttpChannelChild::RecvOnStartRequest(
cacheEntryId, cacheFetchCount, cacheExpirationTime, cachedCharset,
securityInfoSerialization, selfAddr, peerAddr, cacheKey, altDataType,
altDataLen, deliveringAltData, aApplyConversion, aIsResolvedByTRR,
aTiming));
aTiming, aAllRedirectsSameOrigin));
{
// Child's mEventQ is to control the execution order of the IPC messages
@ -522,7 +526,8 @@ void HttpChannelChild::OnStartRequest(
const NetAddr& selfAddr, const NetAddr& peerAddr, const uint32_t& cacheKey,
const nsCString& altDataType, const int64_t& altDataLen,
const bool& deliveringAltData, const bool& aApplyConversion,
const bool& aIsResolvedByTRR, const ResourceTimingStruct& aTiming) {
const bool& aIsResolvedByTRR, const ResourceTimingStruct& aTiming,
const bool& aAllRedirectsSameOrigin) {
LOG(("HttpChannelChild::OnStartRequest [this=%p]\n", this));
// mFlushedForDiversion and mDivertingToParent should NEVER be set at this
@ -598,6 +603,8 @@ void HttpChannelChild::OnStartRequest(
mTransactionTimings = aTiming;
mAllRedirectsSameOrigin = aAllRedirectsSameOrigin;
DoOnStartRequest(this, nullptr);
}

View File

@ -141,7 +141,8 @@ class HttpChannelChild final : public PHttpChannelChild,
const uint32_t& cacheKey, const nsCString& altDataType,
const int64_t& altDataLen, const bool& deliveringAltData,
const bool& aApplyConversion, const bool& aIsResolvedByTRR,
const ResourceTimingStruct& aTiming) override;
const ResourceTimingStruct& aTiming,
const bool& aAllRedirectsSameOrigin) override;
mozilla::ipc::IPCResult RecvFailedAsyncOpen(const nsresult& status) override;
mozilla::ipc::IPCResult RecvRedirect1Begin(
const uint32_t& registrarId, const URIParams& newURI,
@ -471,7 +472,8 @@ class HttpChannelChild final : public PHttpChannelChild,
const NetAddr& peerAddr, const uint32_t& cacheKey,
const nsCString& altDataType, const int64_t& altDataLen,
const bool& deliveringAltData, const bool& aApplyConversion,
const bool& aIsResolvedByTRR, const ResourceTimingStruct& aTiming);
const bool& aIsResolvedByTRR, const ResourceTimingStruct& aTiming,
const bool& aAllRedirectsSameOrigin);
void MaybeDivertOnData(const nsCString& data, const uint64_t& offset,
const uint32_t& count);
void OnTransportAndData(const nsresult& channelStatus, const nsresult& status,

View File

@ -1467,6 +1467,9 @@ HttpChannelParent::OnStartRequest(nsIRequest* aRequest) {
bool isResolvedByTRR = false;
chan->GetIsResolvedByTRR(&isResolvedByTRR);
bool allRedirectsSameOrigin = false;
chan->GetAllRedirectsSameOrigin(&allRedirectsSameOrigin);
rv = NS_OK;
if (mIPCClosed ||
!SendOnStartRequest(
@ -1476,7 +1479,8 @@ HttpChannelParent::OnStartRequest(nsIRequest* aRequest) {
mCacheEntry ? true : false, cacheEntryId, fetchCount, expirationTime,
cachedCharset, secInfoSerialization, chan->GetSelfAddr(),
chan->GetPeerAddr(), redirectCount, cacheKey, altDataType, altDataLen,
deliveringAltData, applyConversion, isResolvedByTRR, timing)) {
deliveringAltData, applyConversion, isResolvedByTRR, timing,
allRedirectsSameOrigin)) {
rv = NS_ERROR_UNEXPECTED;
}
requestHead->Exit();

View File

@ -129,7 +129,8 @@ child:
bool deliveringAltData,
bool applyConversion,
bool isResolvedByTRR,
ResourceTimingStruct timing);
ResourceTimingStruct timing,
bool allRedirectsSameOrigin);
// Used to cancel child channel if we hit errors during creating and
// AsyncOpen of nsHttpChannel on the parent.