Make more XFA attribute data truly read-only.
Split `g_AttributeValueTable` into two, so some of it can move from
.data.rel.ro to .rodata.
.rodata: +2118
.data.rel.ro: -2128
Change-Id: I87f56f5f11c288d4fe05199ab9f472b4b990f062
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/74830
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/xfa/fxfa/parser/xfa_basic_data.cpp b/xfa/fxfa/parser/xfa_basic_data.cpp
index bdcbecf..d17baee 100644
--- a/xfa/fxfa/parser/xfa_basic_data.cpp
+++ b/xfa/fxfa/parser/xfa_basic_data.cpp
@@ -113,18 +113,31 @@
"Size mismatch");
struct AttributeValueRecord {
- uint32_t uHash; // |pName| hashed as WideString.
+ // Associated entry in `kAttributeValueNames` hashed as WideString.
+ uint32_t uHash;
XFA_AttributeValue eName;
- const char* pName;
};
-const AttributeValueRecord g_AttributeValueTable[] = {
+// Contains read-only data that do not require relocation.
+// Parts that require relocation are in `kAttributeValueNames` below.
+constexpr AttributeValueRecord kAttributeValueRecords[] = {
#undef VALUE____
-#define VALUE____(a, b, c) {a, XFA_AttributeValue::c, b},
+#define VALUE____(a, b, c) {a, XFA_AttributeValue::c},
#include "xfa/fxfa/parser/attribute_values.inc"
#undef VALUE____
};
+constexpr const char* kAttributeValueNames[] = {
+#undef VALUE____
+#define VALUE____(a, b, c) b,
+#include "xfa/fxfa/parser/attribute_values.inc"
+#undef VALUE____
+};
+
+static_assert(pdfium::size(kAttributeValueRecords) ==
+ pdfium::size(kAttributeValueNames),
+ "Size mismatch");
+
struct ElementAttributeRecord {
XFA_Element element;
XFA_Attribute attribute;
@@ -207,19 +220,23 @@
}
ByteStringView XFA_AttributeValueToName(XFA_AttributeValue item) {
- return g_AttributeValueTable[static_cast<int32_t>(item)].pName;
+ return kAttributeValueNames[static_cast<int32_t>(item)];
}
Optional<XFA_AttributeValue> XFA_GetAttributeValueByName(WideStringView name) {
- auto* it = std::lower_bound(std::begin(g_AttributeValueTable),
- std::end(g_AttributeValueTable),
+ auto* it = std::lower_bound(std::begin(kAttributeValueRecords),
+ std::end(kAttributeValueRecords),
FX_HashCode_GetW(name, false),
[](const AttributeValueRecord& arg,
uint32_t hash) { return arg.uHash < hash; });
- if (it != std::end(g_AttributeValueTable) && name.EqualsASCII(it->pName))
- return it->eName;
+ if (it == std::end(kAttributeValueRecords))
+ return pdfium::nullopt;
- return {};
+ size_t index = std::distance(std::begin(kAttributeValueRecords), it);
+ if (!name.EqualsASCII(kAttributeValueNames[index]))
+ return pdfium::nullopt;
+
+ return it->eName;
}
Optional<XFA_SCRIPTATTRIBUTEINFO> XFA_GetScriptAttributeByName(