Add tagging for fxjs per-isolate data. Help identify a mismatch with Gin isolate data should both occur in the same isolate. -- save some wide char 0-bytes while at it. Change-Id: I1c756f93c4f97bc61e6b5bfb149b1cd22626316f Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/77350 Reviewed-by: Daniel Hosseinian <dhoss@chromium.org> Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/fxjs/cfxjs_engine.cpp b/fxjs/cfxjs_engine.cpp index 95a03dc..a4eb93e 100644 --- a/fxjs/cfxjs_engine.cpp +++ b/fxjs/cfxjs_engine.cpp
@@ -13,6 +13,7 @@ #include "fxjs/cjs_object.h" #include "fxjs/fxv8.h" #include "fxjs/xfa/cfxjse_runtimedata.h" +#include "third_party/base/check.h" #include "third_party/base/stl_util.h" #include "v8/include/v8-util.h" @@ -25,7 +26,11 @@ size_t g_isolate_ref_count = 0; CFX_V8ArrayBufferAllocator* g_arrayBufferAllocator = nullptr; v8::Global<v8::ObjectTemplate>* g_DefaultGlobalObjectTemplate = nullptr; -const wchar_t kPerObjectDataTag[] = L"CFXJS_PerObjectData"; + +// Only the address matters, values are for humans debugging. ASLR should +// ensure that these values are unlikely to arise otherwise. +const char kPerObjectDataTag[] = "CFXJS_PerObjectData"; +const char kPerIsolateDataTag[] = "FXJS_PerIsolateData"; void* GetAlignedPointerForPerObjectDataTag() { return const_cast<void*>(static_cast<const void*>(kPerObjectDataTag)); @@ -307,8 +312,6 @@ return g_isolate_ref_count; } -FXJS_PerIsolateData::~FXJS_PerIsolateData() = default; - // static void FXJS_PerIsolateData::SetUp(v8::Isolate* pIsolate) { if (!pIsolate->GetData(g_embedderDataSlot)) @@ -317,17 +320,22 @@ // static FXJS_PerIsolateData* FXJS_PerIsolateData::Get(v8::Isolate* pIsolate) { - return static_cast<FXJS_PerIsolateData*>( - pIsolate->GetData(g_embedderDataSlot)); + auto* result = + static_cast<FXJS_PerIsolateData*>(pIsolate->GetData(g_embedderDataSlot)); + CHECK(result->m_Tag == kPerIsolateDataTag); + return result; } +FXJS_PerIsolateData::FXJS_PerIsolateData(v8::Isolate* pIsolate) + : m_Tag(kPerIsolateDataTag), + m_pDynamicObjsMap(std::make_unique<V8TemplateMap>(pIsolate)) {} + +FXJS_PerIsolateData::~FXJS_PerIsolateData() = default; + uint32_t FXJS_PerIsolateData::CurrentMaxObjDefinitionID() const { return pdfium::CollectionSize<uint32_t>(m_ObjectDefnArray); } -FXJS_PerIsolateData::FXJS_PerIsolateData(v8::Isolate* pIsolate) - : m_pDynamicObjsMap(std::make_unique<V8TemplateMap>(pIsolate)) {} - CFXJS_ObjDefinition* FXJS_PerIsolateData::ObjDefinitionForID( uint32_t id) const { return id > 0 && id <= CurrentMaxObjDefinitionID()
diff --git a/fxjs/cfxjs_engine.h b/fxjs/cfxjs_engine.h index d4781b2..dca17a1 100644 --- a/fxjs/cfxjs_engine.h +++ b/fxjs/cfxjs_engine.h
@@ -55,6 +55,7 @@ CFXJS_ObjDefinition* ObjDefinitionForID(uint32_t id) const; uint32_t AssignIDForObjDefinition(std::unique_ptr<CFXJS_ObjDefinition> pDefn); + const char* const m_Tag; std::vector<std::unique_ptr<CFXJS_ObjDefinition>> m_ObjectDefnArray; std::unique_ptr<V8TemplateMap> m_pDynamicObjsMap; std::unique_ptr<ExtensionIface> m_pFXJSERuntimeData;