0
Files
src/content/browser/bad_message.cc
Emily Andrews 49b8ddcb14 Add APIs to RenderProcessHost to use ChildProcessId
Using int32_t for the child process id can be fraught with peril.
Developers can mistake this for the PID. Bugs can be created by passing
in an invalid value by mistake. Using a strongly typed ChildProcessId
instead will allow the compiler to catch errors.

This change modifies the internal id_ and render_process_id_ variables
in the RenderProcessHostImpl code and adds APIs to use ChildProcessId
to index in. This will allow incremental changes to remove int
references.

Bug: 379869738
Change-Id: I9d3579b1fea007468e5953087ff75715f63452e7
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6035938
Reviewed-by: Arthur Sonzogni <arthursonzogni@chromium.org>
Commit-Queue: Emily Andrews <emiled@microsoft.com>
Reviewed-by: Alex Moshchuk <alexmos@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1394501}
2024-12-10 20:42:14 +00:00

90 lines
3.1 KiB
C++

// Copyright 2015 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/browser/bad_message.h"
#include "base/debug/dump_without_crashing.h"
#include "base/functional/bind.h"
#include "base/logging.h"
#include "base/metrics/histogram_functions.h"
#include "base/strings/string_number_conversions.h"
#include "base/trace_event/trace_event.h"
#include "content/public/browser/browser_message_filter.h"
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/render_process_host.h"
namespace content {
namespace bad_message {
namespace {
void LogBadMessage(BadMessageReason reason) {
static auto* const bad_message_reason = base::debug::AllocateCrashKeyString(
"bad_message_reason", base::debug::CrashKeySize::Size64);
TRACE_EVENT_INSTANT1("ipc,security", "content::ReceivedBadMessage",
TRACE_EVENT_SCOPE_THREAD, "reason", reason);
LOG(ERROR) << "Terminating renderer for bad IPC message, reason " << reason;
base::UmaHistogramSparse("Stability.BadMessageTerminated.Content", reason);
base::debug::SetCrashKeyString(bad_message_reason,
base::NumberToString(reason));
}
void ReceivedBadMessageOnUIThread(ChildProcessId render_process_id,
BadMessageReason reason) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
RenderProcessHost* host = RenderProcessHost::FromID(render_process_id);
if (!host)
return;
// A dump has already been generated by the caller. Don't generate another.
host->ShutdownForBadMessage(
RenderProcessHost::CrashReportMode::NO_CRASH_DUMP);
}
} // namespace
void ReceivedBadMessage(RenderProcessHost* host, BadMessageReason reason) {
LogBadMessage(reason);
host->ShutdownForBadMessage(
RenderProcessHost::CrashReportMode::GENERATE_CRASH_DUMP);
}
void ReceivedBadMessage(int render_process_id, BadMessageReason reason) {
ReceivedBadMessage(ChildProcessId(render_process_id), reason);
}
void ReceivedBadMessage(ChildProcessId render_process_id,
BadMessageReason reason) {
// We generate a crash dump here since generating one after posting to the UI
// thread is less useful.
LogBadMessage(reason);
base::debug::DumpWithoutCrashing();
if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
GetUIThreadTaskRunner({})->PostTask(
FROM_HERE, base::BindOnce(&ReceivedBadMessageOnUIThread,
render_process_id, reason));
return;
}
ReceivedBadMessageOnUIThread(render_process_id, reason);
}
#if BUILDFLAG(CONTENT_ENABLE_LEGACY_IPC)
void ReceivedBadMessage(BrowserMessageFilter* filter, BadMessageReason reason) {
LogBadMessage(reason);
filter->ShutdownForBadMessage();
}
#endif
base::debug::CrashKeyString* GetRequestedSiteInfoKey() {
static auto* const crash_key = base::debug::AllocateCrashKeyString(
"requested_site_info", base::debug::CrashKeySize::Size256);
return crash_key;
}
} // namespace bad_message
} // namespace content