From d5b11331f37a82d1c2e5b6dc301c91c7cd39bef5 Mon Sep 17 00:00:00 2001 From: Nika Layzell Date: Wed, 28 Sep 2022 19:25:13 +0000 Subject: [PATCH] Bug 1783242 - Part 2: Relax structured clone payload size limits, r=ipc-reviewers,mccr8 Differential Revision: https://phabricator.services.mozilla.com/D153805 --- dom/base/nsFrameMessageManager.cpp | 19 ------------------- dom/ipc/jsactor/JSActor.cpp | 15 --------------- dom/ipc/jsactor/JSActor.h | 5 ----- dom/ipc/jsactor/JSProcessActorChild.cpp | 15 --------------- dom/ipc/jsactor/JSProcessActorParent.cpp | 15 --------------- dom/ipc/jsactor/JSWindowActorChild.cpp | 16 ---------------- dom/ipc/jsactor/JSWindowActorParent.cpp | 16 ---------------- 7 files changed, 101 deletions(-) diff --git a/dom/base/nsFrameMessageManager.cpp b/dom/base/nsFrameMessageManager.cpp index 8f913f31840a..91e034c18f50 100644 --- a/dom/base/nsFrameMessageManager.cpp +++ b/dom/base/nsFrameMessageManager.cpp @@ -469,15 +469,6 @@ bool nsFrameMessageManager::GetParamsForMessage(JSContext* aCx, static bool sSendingSyncMessage = false; -static bool AllowMessage(size_t aDataLength, const nsAString& aMessageName) { - // A message includes more than structured clone data, so subtract - // 20KB to make it more likely that a message within this bound won't - // result in an overly large IPC message. - static const size_t kMaxMessageSize = - IPC::Channel::kMaximumMessageSize - 20 * 1024; - return aDataLength < kMaxMessageSize; -} - void nsFrameMessageManager::SendSyncMessage(JSContext* aCx, const nsAString& aMessageName, JS::Handle aObj, @@ -511,11 +502,6 @@ void nsFrameMessageManager::SendSyncMessage(JSContext* aCx, } #endif - if (!AllowMessage(data.DataLength(), aMessageName)) { - aError.Throw(NS_ERROR_FAILURE); - return; - } - if (!mCallback) { aError.Throw(NS_ERROR_NOT_INITIALIZED); return; @@ -593,11 +579,6 @@ void nsFrameMessageManager::DispatchAsyncMessage( } #endif - if (!AllowMessage(data.DataLength(), aMessageName)) { - aError.Throw(NS_ERROR_FAILURE); - return; - } - aError = DispatchAsyncMessageInternal(aCx, aMessageName, data); } diff --git a/dom/ipc/jsactor/JSActor.cpp b/dom/ipc/jsactor/JSActor.cpp index c409d6a1bb2f..4e4a2b7bacf4 100644 --- a/dom/ipc/jsactor/JSActor.cpp +++ b/dom/ipc/jsactor/JSActor.cpp @@ -129,21 +129,6 @@ nsresult JSActor::QueryInterfaceActor(const nsIID& aIID, void** aPtr) { return mWrappedJS->QueryInterface(aIID, aPtr); } -/* static */ -bool JSActor::AllowMessage(const JSActorMessageMeta& aMetadata, - size_t aDataLength) { - // A message includes more than structured clone data, so subtract - // 20KB to make it more likely that a message within this bound won't - // result in an overly large IPC message. - static const size_t kMaxMessageSize = - IPC::Channel::kMaximumMessageSize - 20 * 1024; - if (aDataLength < kMaxMessageSize) { - return true; - } - - return false; -} - void JSActor::SetName(const nsACString& aName) { MOZ_ASSERT(mName.IsEmpty(), "Cannot set name twice!"); mName = aName; diff --git a/dom/ipc/jsactor/JSActor.h b/dom/ipc/jsactor/JSActor.h index b4bd1e421daa..54af93d1cee4 100644 --- a/dom/ipc/jsactor/JSActor.h +++ b/dom/ipc/jsactor/JSActor.h @@ -69,11 +69,6 @@ class JSActor : public nsISupports, public nsWrapperCache { Maybe&& aStack, ErrorResult& aRv) = 0; - // Check if a message is so large that IPC will probably crash if we try to - // send it. If it is too large, record telemetry about the message. - static bool AllowMessage(const JSActorMessageMeta& aMetadata, - size_t aDataLength); - // Helper method to send an in-process raw message. using OtherSideCallback = std::function()>; static void SendRawMessageInProcess(const JSActorMessageMeta& aMeta, diff --git a/dom/ipc/jsactor/JSProcessActorChild.cpp b/dom/ipc/jsactor/JSProcessActorChild.cpp index 6c23af656e34..a9379838cfa4 100644 --- a/dom/ipc/jsactor/JSProcessActorChild.cpp +++ b/dom/ipc/jsactor/JSProcessActorChild.cpp @@ -33,21 +33,6 @@ void JSProcessActorChild::SendRawMessage( return; } - size_t length = 0; - if (aData) { - length += aData->DataLength(); - } - if (aStack) { - length += aStack->DataLength(); - } - if (NS_WARN_IF(!AllowMessage(aMeta, length))) { - aRv.ThrowDataCloneError( - nsPrintfCString("JSProcessActorChild serialization error: data too " - "large, in actor '%s'", - PromiseFlatCString(aMeta.actorName()).get())); - return; - } - // If the parent side is in the same process, we have a PInProcess manager, // and can dispatch the message directly to the event loop. ContentChild* contentChild = mManager->AsContentChild(); diff --git a/dom/ipc/jsactor/JSProcessActorParent.cpp b/dom/ipc/jsactor/JSProcessActorParent.cpp index 52490f167583..eec8ad17c73b 100644 --- a/dom/ipc/jsactor/JSProcessActorParent.cpp +++ b/dom/ipc/jsactor/JSProcessActorParent.cpp @@ -46,21 +46,6 @@ void JSProcessActorParent::SendRawMessage( return; } - size_t length = 0; - if (aData) { - length += aData->DataLength(); - } - if (aStack) { - length += aStack->DataLength(); - } - if (NS_WARN_IF(!AllowMessage(aMeta, length))) { - aRv.ThrowDataError(nsPrintfCString( - "Actor '%s' cannot send message '%s': message too long.", - PromiseFlatCString(aMeta.actorName()).get(), - NS_ConvertUTF16toUTF8(aMeta.messageName()).get())); - return; - } - // If the parent side is in the same process, we have a PInProcess manager, // and can dispatch the message directly to the event loop. ContentParent* contentParent = mManager->AsContentParent(); diff --git a/dom/ipc/jsactor/JSWindowActorChild.cpp b/dom/ipc/jsactor/JSWindowActorChild.cpp index db3c60963c53..a36c06502826 100644 --- a/dom/ipc/jsactor/JSWindowActorChild.cpp +++ b/dom/ipc/jsactor/JSWindowActorChild.cpp @@ -53,22 +53,6 @@ void JSWindowActorChild::SendRawMessage( return; } - size_t length = 0; - if (aData) { - length += aData->DataLength(); - } - if (aStack) { - length += aStack->DataLength(); - } - - if (NS_WARN_IF(!AllowMessage(aMeta, length))) { - aRv.ThrowDataCloneError( - nsPrintfCString("JSWindowActorChild serialization error: data too " - "large, in actor '%s'", - PromiseFlatCString(aMeta.actorName()).get())); - return; - } - // Cross-process case - send data over WindowGlobalChild to other side. Maybe msgData; if (aData) { diff --git a/dom/ipc/jsactor/JSWindowActorParent.cpp b/dom/ipc/jsactor/JSWindowActorParent.cpp index 73455dc9fdd7..0bb82a9b8ec6 100644 --- a/dom/ipc/jsactor/JSWindowActorParent.cpp +++ b/dom/ipc/jsactor/JSWindowActorParent.cpp @@ -51,22 +51,6 @@ void JSWindowActorParent::SendRawMessage( return; } - size_t length = 0; - if (aData) { - length += aData->DataLength(); - } - if (aStack) { - length += aStack->DataLength(); - } - - if (NS_WARN_IF(!AllowMessage(aMeta, length))) { - aRv.ThrowDataCloneError( - nsPrintfCString("JSWindowActorParent serialization error: data too " - "large, in actor '%s'", - PromiseFlatCString(aMeta.actorName()).get())); - return; - } - Maybe msgData; if (aData) { msgData.emplace();