summaryrefslogtreecommitdiff
path: root/chromium/v8
diff options
context:
space:
mode:
authorIgor Sheludko <ishell@chromium.org>2021-11-12 16:49:02 +0100
committerMichael BrĂ¼ning <michael.bruning@qt.io>2022-02-14 13:50:38 +0000
commited5d6385e0e86407a6af221d936a0f00011d61df (patch)
tree971e3ddbc86375f61d5cf8556a6e2f130fbbb03b /chromium/v8
parentb16741a83ce0d02c814752a2f4346818bf430b3e (diff)
downloadqtwebengine-chromium-ed5d6385e0e86407a6af221d936a0f00011d61df.tar.gz
[Backport] Security bug 1265570
Manual cherry-pick of patch originally reviewed on https://chromium-review.googlesource.com/c/v8/v8/+/3275569: Ensure JSMessageObject has source positions Under certain conditions GC could flush bytecode array from SharedFunctionInfos. This CL ensures that the bytecode array is always available for reconstructing source positions. Bug: chromium:1265570 Change-Id: I2ce7eb04201f69121687ab0aaa2af42adb2caae0 Reviewed-by: Tobias Tebbi <tebbi@chromium.org> Reviewed-by: Toon Verwaest <verwaest@chromium.org> Commit-Queue: Igor Sheludko <ishell@chromium.org> Cr-Commit-Position: refs/heads/main@{#77877} Reviewed-by: Michal Klocek <michal.klocek@qt.io>
Diffstat (limited to 'chromium/v8')
-rw-r--r--chromium/v8/src/codegen/compiler.cc6
-rw-r--r--chromium/v8/src/codegen/compiler.h4
-rw-r--r--chromium/v8/src/debug/debug.cc2
-rw-r--r--chromium/v8/src/objects/js-objects.cc3
-rw-r--r--chromium/v8/src/objects/shared-function-info.cc13
-rw-r--r--chromium/v8/src/objects/shared-function-info.h9
6 files changed, 34 insertions, 3 deletions
diff --git a/chromium/v8/src/codegen/compiler.cc b/chromium/v8/src/codegen/compiler.cc
index 4fd70a8d9e1..7bd68b34287 100644
--- a/chromium/v8/src/codegen/compiler.cc
+++ b/chromium/v8/src/codegen/compiler.cc
@@ -1817,7 +1817,8 @@ bool Compiler::CollectSourcePositions(Isolate* isolate,
// static
bool Compiler::Compile(Isolate* isolate, Handle<SharedFunctionInfo> shared_info,
ClearExceptionFlag flag,
- IsCompiledScope* is_compiled_scope) {
+ IsCompiledScope* is_compiled_scope,
+ CreateSourcePositions create_source_positions_flag) {
// We should never reach here if the function is already compiled.
DCHECK(!shared_info->is_compiled());
DCHECK(!is_compiled_scope->is_compiled());
@@ -1838,6 +1839,9 @@ bool Compiler::Compile(Isolate* isolate, Handle<SharedFunctionInfo> shared_info,
// Set up parse info.
UnoptimizedCompileFlags flags =
UnoptimizedCompileFlags::ForFunctionCompile(isolate, *shared_info);
+ if (create_source_positions_flag == CreateSourcePositions::kYes) {
+ flags.set_collect_source_positions(true);
+ }
UnoptimizedCompileState compile_state(isolate);
ParseInfo parse_info(isolate, flags, &compile_state);
diff --git a/chromium/v8/src/codegen/compiler.h b/chromium/v8/src/codegen/compiler.h
index 0d1582d872a..fc078352778 100644
--- a/chromium/v8/src/codegen/compiler.h
+++ b/chromium/v8/src/codegen/compiler.h
@@ -69,7 +69,9 @@ class V8_EXPORT_PRIVATE Compiler : public AllStatic {
static bool Compile(Isolate* isolate, Handle<SharedFunctionInfo> shared,
ClearExceptionFlag flag,
- IsCompiledScope* is_compiled_scope);
+ IsCompiledScope* is_compiled_scope,
+ CreateSourcePositions create_source_positions_flag =
+ CreateSourcePositions::kNo);
static bool Compile(Isolate* isolate, Handle<JSFunction> function,
ClearExceptionFlag flag,
IsCompiledScope* is_compiled_scope);
diff --git a/chromium/v8/src/debug/debug.cc b/chromium/v8/src/debug/debug.cc
index 41775c89656..a3fc2d34295 100644
--- a/chromium/v8/src/debug/debug.cc
+++ b/chromium/v8/src/debug/debug.cc
@@ -1787,7 +1787,7 @@ bool Debug::EnsureBreakInfo(Handle<SharedFunctionInfo> shared) {
IsCompiledScope is_compiled_scope = shared->is_compiled_scope(isolate_);
if (!is_compiled_scope.is_compiled() &&
!Compiler::Compile(isolate_, shared, Compiler::CLEAR_EXCEPTION,
- &is_compiled_scope)) {
+ &is_compiled_scope, CreateSourcePositions::kYes)) {
return false;
}
CreateBreakInfo(shared);
diff --git a/chromium/v8/src/objects/js-objects.cc b/chromium/v8/src/objects/js-objects.cc
index e329cba144b..657cf655a2e 100644
--- a/chromium/v8/src/objects/js-objects.cc
+++ b/chromium/v8/src/objects/js-objects.cc
@@ -5389,6 +5389,9 @@ void JSMessageObject::EnsureSourcePositionsAvailable(
DCHECK_GE(message->bytecode_offset().value(), kFunctionEntryBytecodeOffset);
Handle<SharedFunctionInfo> shared_info(
SharedFunctionInfo::cast(message->shared_info()), isolate);
+ IsCompiledScope is_compiled_scope;
+ SharedFunctionInfo::EnsureBytecodeArrayAvailable(
+ isolate, shared_info, &is_compiled_scope, CreateSourcePositions::kYes);
SharedFunctionInfo::EnsureSourcePositionsAvailable(isolate, shared_info);
DCHECK(shared_info->HasBytecodeArray());
int position = shared_info->abstract_code(isolate).SourcePosition(
diff --git a/chromium/v8/src/objects/shared-function-info.cc b/chromium/v8/src/objects/shared-function-info.cc
index 22e98a140c4..6ca4378f931 100644
--- a/chromium/v8/src/objects/shared-function-info.cc
+++ b/chromium/v8/src/objects/shared-function-info.cc
@@ -668,6 +668,19 @@ void SharedFunctionInfo::SetPosition(int start_position, int end_position) {
}
// static
+void SharedFunctionInfo::EnsureBytecodeArrayAvailable(
+ Isolate* isolate, Handle<SharedFunctionInfo> shared_info,
+ IsCompiledScope* is_compiled_scope, CreateSourcePositions flag) {
+ if (!shared_info->HasBytecodeArray()) {
+ if (!Compiler::Compile(isolate, shared_info, Compiler::CLEAR_EXCEPTION,
+ is_compiled_scope, flag)) {
+ FATAL("Failed to compile shared info that was already compiled before");
+ }
+ DCHECK(shared_info->GetBytecodeArray(isolate).HasSourcePositionTable());
+ }
+}
+
+// static
void SharedFunctionInfo::EnsureSourcePositionsAvailable(
Isolate* isolate, Handle<SharedFunctionInfo> shared_info) {
if (shared_info->CanCollectSourcePosition(isolate)) {
diff --git a/chromium/v8/src/objects/shared-function-info.h b/chromium/v8/src/objects/shared-function-info.h
index fd19f90165f..88a88fd500a 100644
--- a/chromium/v8/src/objects/shared-function-info.h
+++ b/chromium/v8/src/objects/shared-function-info.h
@@ -49,6 +49,10 @@ using FunctionSig = Signature<ValueType>;
#include "torque-generated/src/objects/shared-function-info-tq.inc"
+// Defines whether the source positions should be created during function
+// compilation.
+enum class CreateSourcePositions { kNo, kYes };
+
// Data collected by the pre-parser storing information about scopes and inner
// functions.
//
@@ -575,6 +579,11 @@ class SharedFunctionInfo
void SetFunctionTokenPosition(int function_token_position,
int start_position);
+ static void EnsureBytecodeArrayAvailable(
+ Isolate* isolate, Handle<SharedFunctionInfo> shared_info,
+ IsCompiledScope* is_compiled,
+ CreateSourcePositions flag = CreateSourcePositions::kNo);
+
inline bool CanCollectSourcePosition(Isolate* isolate);
static void EnsureSourcePositionsAvailable(
Isolate* isolate, Handle<SharedFunctionInfo> shared_info);