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;