From 125eb3093a4632ee519041201ca904680f3a2245 Mon Sep 17 00:00:00 2001 From: Tom Sepez Date: Fri, 27 Jul 2018 21:17:06 +0000 Subject: Tag XFA data bound to V8 Objects. Because we don't want to trust anything V8 gives us back. Use a deep namespace so we can have a short declaration in the structs, but avoid collisions. Change-Id: Ibb832a5dcd34c652159c3343dd70c9e2ee561537 Reviewed-on: https://pdfium-review.googlesource.com/38972 Reviewed-by: Lei Zhang Commit-Queue: Tom Sepez --- fxjs/cfxjse_class.cpp | 50 +++++++---- fxjs/cfxjse_engine.cpp | 11 ++- fxjs/cfxjse_formcalc_context.cpp | 186 ++++++++++++++++++++------------------- fxjs/fxjse.cpp | 9 ++ fxjs/fxjse.h | 11 +++ 5 files changed, 157 insertions(+), 110 deletions(-) diff --git a/fxjs/cfxjse_class.cpp b/fxjs/cfxjse_class.cpp index 67186ff66f..e7e54c8867 100644 --- a/fxjs/cfxjse_class.cpp +++ b/fxjs/cfxjse_class.cpp @@ -16,13 +16,25 @@ #include "fxjs/js_resources.h" #include "third_party/base/ptr_util.h" +using pdfium::fxjse::kFuncTag; +using pdfium::fxjse::kClassTag; + namespace { +FXJSE_FUNCTION_DESCRIPTOR* AsFunctionDescriptor(void* ptr) { + auto* result = static_cast(ptr); + return result && result->tag == kFuncTag ? result : nullptr; +} + +FXJSE_CLASS_DESCRIPTOR* AsClassDescriptor(void* ptr) { + auto* result = static_cast(ptr); + return result && result->tag == kClassTag ? result : nullptr; +} + void V8FunctionCallback_Wrapper( const v8::FunctionCallbackInfo& info) { const FXJSE_FUNCTION_DESCRIPTOR* lpFunctionInfo = - static_cast( - info.Data().As()->Value()); + AsFunctionDescriptor(info.Data().As()->Value()); if (!lpFunctionInfo) return; @@ -42,8 +54,7 @@ void V8ConstructorCallback_Wrapper( return; const FXJSE_CLASS_DESCRIPTOR* lpClassDefinition = - static_cast( - info.Data().As()->Value()); + AsClassDescriptor(info.Data().As()->Value()); if (!lpClassDefinition) return; @@ -54,8 +65,8 @@ void V8ConstructorCallback_Wrapper( void Context_GlobalObjToString( const v8::FunctionCallbackInfo& info) { - const FXJSE_CLASS_DESCRIPTOR* lpClass = static_cast( - info.Data().As()->Value()); + const FXJSE_CLASS_DESCRIPTOR* lpClass = + AsClassDescriptor(info.Data().As()->Value()); if (!lpClass) return; @@ -178,11 +189,13 @@ void NamedPropertyQueryCallback( v8::Local property, const v8::PropertyCallbackInfo& info) { v8::Local thisObject = info.Holder(); - const FXJSE_CLASS_DESCRIPTOR* lpClass = static_cast( - info.Data().As()->Value()); - v8::Isolate* pIsolate = info.GetIsolate(); - v8::HandleScope scope(pIsolate); - v8::String::Utf8Value szPropName(pIsolate, property); + const FXJSE_CLASS_DESCRIPTOR* lpClass = + AsClassDescriptor(info.Data().As()->Value()); + if (!lpClass) + return; + + v8::HandleScope scope(info.GetIsolate()); + v8::String::Utf8Value szPropName(info.GetIsolate(), property); ByteStringView szFxPropName(*szPropName, szPropName.length()); auto lpThisValue = pdfium::MakeUnique(info.GetIsolate()); lpThisValue->ForceSetValue(thisObject); @@ -198,8 +211,11 @@ void NamedPropertyGetterCallback( v8::Local property, const v8::PropertyCallbackInfo& info) { v8::Local thisObject = info.Holder(); - const FXJSE_CLASS_DESCRIPTOR* lpClass = static_cast( - info.Data().As()->Value()); + const FXJSE_CLASS_DESCRIPTOR* lpClass = + AsClassDescriptor(info.Data().As()->Value()); + if (!lpClass) + return; + v8::String::Utf8Value szPropName(info.GetIsolate(), property); ByteStringView szFxPropName(*szPropName, szPropName.length()); auto lpThisValue = pdfium::MakeUnique(info.GetIsolate()); @@ -215,13 +231,15 @@ void NamedPropertySetterCallback( v8::Local value, const v8::PropertyCallbackInfo& info) { v8::Local thisObject = info.Holder(); - const FXJSE_CLASS_DESCRIPTOR* lpClass = static_cast( - info.Data().As()->Value()); + const FXJSE_CLASS_DESCRIPTOR* lpClass = + AsClassDescriptor(info.Data().As()->Value()); + if (!lpClass) + return; + v8::String::Utf8Value szPropName(info.GetIsolate(), property); ByteStringView szFxPropName(*szPropName, szPropName.length()); auto lpThisValue = pdfium::MakeUnique(info.GetIsolate()); lpThisValue->ForceSetValue(thisObject); - auto lpNewValue = pdfium::MakeUnique(info.GetIsolate()); lpNewValue->ForceSetValue(value); DynPropSetterAdapter(lpClass, lpThisValue.get(), szFxPropName, diff --git a/fxjs/cfxjse_engine.cpp b/fxjs/cfxjse_engine.cpp index cc584a3fa3..bf5778bf9a 100644 --- a/fxjs/cfxjse_engine.cpp +++ b/fxjs/cfxjse_engine.cpp @@ -31,10 +31,13 @@ #include "xfa/fxfa/parser/xfa_resolvenode_rs.h" #include "xfa/fxfa/parser/xfa_utils.h" +using pdfium::fxjse::kClassTag; + const FXJSE_CLASS_DESCRIPTOR GlobalClassDescriptor = { - "Root", // name - nullptr, // methods - 0, // method count + kClassTag, // tag + "Root", // name + nullptr, // methods + 0, // method count CFXJSE_Engine::GlobalPropTypeGetter, CFXJSE_Engine::GlobalPropertyGetter, CFXJSE_Engine::GlobalPropertySetter, @@ -42,6 +45,7 @@ const FXJSE_CLASS_DESCRIPTOR GlobalClassDescriptor = { }; const FXJSE_CLASS_DESCRIPTOR NormalClassDescriptor = { + kClassTag, // tag "XFAObject", // name nullptr, // methods 0, // method count @@ -52,6 +56,7 @@ const FXJSE_CLASS_DESCRIPTOR NormalClassDescriptor = { }; const FXJSE_CLASS_DESCRIPTOR VariablesClassDescriptor = { + kClassTag, // tag "XFAScriptObject", // name nullptr, // methods 0, // method count diff --git a/fxjs/cfxjse_formcalc_context.cpp b/fxjs/cfxjse_formcalc_context.cpp index 5319466cfa..40f4249ab7 100644 --- a/fxjs/cfxjse_formcalc_context.cpp +++ b/fxjs/cfxjse_formcalc_context.cpp @@ -32,6 +32,9 @@ #include "xfa/fxfa/parser/cxfa_timezoneprovider.h" #include "xfa/fxfa/parser/xfa_utils.h" +using pdfium::fxjse::kFuncTag; +using pdfium::fxjse::kClassTag; + namespace { const double kFinancialPrecision = 0.00000001; @@ -218,97 +221,97 @@ const XFA_FMHtmlReserveCode kReservesForEncode[] = { }; const FXJSE_FUNCTION_DESCRIPTOR kFormCalcFM2JSFunctions[] = { - {"Abs", CFXJSE_FormCalcContext::Abs}, - {"Avg", CFXJSE_FormCalcContext::Avg}, - {"Ceil", CFXJSE_FormCalcContext::Ceil}, - {"Count", CFXJSE_FormCalcContext::Count}, - {"Floor", CFXJSE_FormCalcContext::Floor}, - {"Max", CFXJSE_FormCalcContext::Max}, - {"Min", CFXJSE_FormCalcContext::Min}, - {"Mod", CFXJSE_FormCalcContext::Mod}, - {"Round", CFXJSE_FormCalcContext::Round}, - {"Sum", CFXJSE_FormCalcContext::Sum}, - {"Date", CFXJSE_FormCalcContext::Date}, - {"Date2Num", CFXJSE_FormCalcContext::Date2Num}, - {"DateFmt", CFXJSE_FormCalcContext::DateFmt}, - {"IsoDate2Num", CFXJSE_FormCalcContext::IsoDate2Num}, - {"IsoTime2Num", CFXJSE_FormCalcContext::IsoTime2Num}, - {"LocalDateFmt", CFXJSE_FormCalcContext::LocalDateFmt}, - {"LocalTimeFmt", CFXJSE_FormCalcContext::LocalTimeFmt}, - {"Num2Date", CFXJSE_FormCalcContext::Num2Date}, - {"Num2GMTime", CFXJSE_FormCalcContext::Num2GMTime}, - {"Num2Time", CFXJSE_FormCalcContext::Num2Time}, - {"Time", CFXJSE_FormCalcContext::Time}, - {"Time2Num", CFXJSE_FormCalcContext::Time2Num}, - {"TimeFmt", CFXJSE_FormCalcContext::TimeFmt}, - {"Apr", CFXJSE_FormCalcContext::Apr}, - {"Cterm", CFXJSE_FormCalcContext::CTerm}, - {"FV", CFXJSE_FormCalcContext::FV}, - {"Ipmt", CFXJSE_FormCalcContext::IPmt}, - {"NPV", CFXJSE_FormCalcContext::NPV}, - {"Pmt", CFXJSE_FormCalcContext::Pmt}, - {"PPmt", CFXJSE_FormCalcContext::PPmt}, - {"PV", CFXJSE_FormCalcContext::PV}, - {"Rate", CFXJSE_FormCalcContext::Rate}, - {"Term", CFXJSE_FormCalcContext::Term}, - {"Choose", CFXJSE_FormCalcContext::Choose}, - {"Exists", CFXJSE_FormCalcContext::Exists}, - {"HasValue", CFXJSE_FormCalcContext::HasValue}, - {"Oneof", CFXJSE_FormCalcContext::Oneof}, - {"Within", CFXJSE_FormCalcContext::Within}, - {"If", CFXJSE_FormCalcContext::If}, - {"Eval", CFXJSE_FormCalcContext::Eval}, - {"Translate", CFXJSE_FormCalcContext::eval_translation}, - {"Ref", CFXJSE_FormCalcContext::Ref}, - {"UnitType", CFXJSE_FormCalcContext::UnitType}, - {"UnitValue", CFXJSE_FormCalcContext::UnitValue}, - {"At", CFXJSE_FormCalcContext::At}, - {"Concat", CFXJSE_FormCalcContext::Concat}, - {"Decode", CFXJSE_FormCalcContext::Decode}, - {"Encode", CFXJSE_FormCalcContext::Encode}, - {"Format", CFXJSE_FormCalcContext::Format}, - {"Left", CFXJSE_FormCalcContext::Left}, - {"Len", CFXJSE_FormCalcContext::Len}, - {"Lower", CFXJSE_FormCalcContext::Lower}, - {"Ltrim", CFXJSE_FormCalcContext::Ltrim}, - {"Parse", CFXJSE_FormCalcContext::Parse}, - {"Replace", CFXJSE_FormCalcContext::Replace}, - {"Right", CFXJSE_FormCalcContext::Right}, - {"Rtrim", CFXJSE_FormCalcContext::Rtrim}, - {"Space", CFXJSE_FormCalcContext::Space}, - {"Str", CFXJSE_FormCalcContext::Str}, - {"Stuff", CFXJSE_FormCalcContext::Stuff}, - {"Substr", CFXJSE_FormCalcContext::Substr}, - {"Uuid", CFXJSE_FormCalcContext::Uuid}, - {"Upper", CFXJSE_FormCalcContext::Upper}, - {"WordNum", CFXJSE_FormCalcContext::WordNum}, - {"Get", CFXJSE_FormCalcContext::Get}, - {"Post", CFXJSE_FormCalcContext::Post}, - {"Put", CFXJSE_FormCalcContext::Put}, - {"pos_op", CFXJSE_FormCalcContext::positive_operator}, - {"neg_op", CFXJSE_FormCalcContext::negative_operator}, - {"log_or_op", CFXJSE_FormCalcContext::logical_or_operator}, - {"log_and_op", CFXJSE_FormCalcContext::logical_and_operator}, - {"log_not_op", CFXJSE_FormCalcContext::logical_not_operator}, - {"eq_op", CFXJSE_FormCalcContext::equality_operator}, - {"neq_op", CFXJSE_FormCalcContext::notequality_operator}, - {"lt_op", CFXJSE_FormCalcContext::less_operator}, - {"le_op", CFXJSE_FormCalcContext::lessequal_operator}, - {"gt_op", CFXJSE_FormCalcContext::greater_operator}, - {"ge_op", CFXJSE_FormCalcContext::greaterequal_operator}, - {"plus_op", CFXJSE_FormCalcContext::plus_operator}, - {"minus_op", CFXJSE_FormCalcContext::minus_operator}, - {"mul_op", CFXJSE_FormCalcContext::multiple_operator}, - {"div_op", CFXJSE_FormCalcContext::divide_operator}, - {"asgn_val_op", CFXJSE_FormCalcContext::assign_value_operator}, - {"dot_acc", CFXJSE_FormCalcContext::dot_accessor}, - {"dotdot_acc", CFXJSE_FormCalcContext::dotdot_accessor}, - {"concat_obj", CFXJSE_FormCalcContext::concat_fm_object}, - {"is_obj", CFXJSE_FormCalcContext::is_fm_object}, - {"is_ary", CFXJSE_FormCalcContext::is_fm_array}, - {"get_val", CFXJSE_FormCalcContext::get_fm_value}, - {"get_jsobj", CFXJSE_FormCalcContext::get_fm_jsobj}, - {"var_filter", CFXJSE_FormCalcContext::fm_var_filter}, + {kFuncTag, "Abs", CFXJSE_FormCalcContext::Abs}, + {kFuncTag, "Avg", CFXJSE_FormCalcContext::Avg}, + {kFuncTag, "Ceil", CFXJSE_FormCalcContext::Ceil}, + {kFuncTag, "Count", CFXJSE_FormCalcContext::Count}, + {kFuncTag, "Floor", CFXJSE_FormCalcContext::Floor}, + {kFuncTag, "Max", CFXJSE_FormCalcContext::Max}, + {kFuncTag, "Min", CFXJSE_FormCalcContext::Min}, + {kFuncTag, "Mod", CFXJSE_FormCalcContext::Mod}, + {kFuncTag, "Round", CFXJSE_FormCalcContext::Round}, + {kFuncTag, "Sum", CFXJSE_FormCalcContext::Sum}, + {kFuncTag, "Date", CFXJSE_FormCalcContext::Date}, + {kFuncTag, "Date2Num", CFXJSE_FormCalcContext::Date2Num}, + {kFuncTag, "DateFmt", CFXJSE_FormCalcContext::DateFmt}, + {kFuncTag, "IsoDate2Num", CFXJSE_FormCalcContext::IsoDate2Num}, + {kFuncTag, "IsoTime2Num", CFXJSE_FormCalcContext::IsoTime2Num}, + {kFuncTag, "LocalDateFmt", CFXJSE_FormCalcContext::LocalDateFmt}, + {kFuncTag, "LocalTimeFmt", CFXJSE_FormCalcContext::LocalTimeFmt}, + {kFuncTag, "Num2Date", CFXJSE_FormCalcContext::Num2Date}, + {kFuncTag, "Num2GMTime", CFXJSE_FormCalcContext::Num2GMTime}, + {kFuncTag, "Num2Time", CFXJSE_FormCalcContext::Num2Time}, + {kFuncTag, "Time", CFXJSE_FormCalcContext::Time}, + {kFuncTag, "Time2Num", CFXJSE_FormCalcContext::Time2Num}, + {kFuncTag, "TimeFmt", CFXJSE_FormCalcContext::TimeFmt}, + {kFuncTag, "Apr", CFXJSE_FormCalcContext::Apr}, + {kFuncTag, "Cterm", CFXJSE_FormCalcContext::CTerm}, + {kFuncTag, "FV", CFXJSE_FormCalcContext::FV}, + {kFuncTag, "Ipmt", CFXJSE_FormCalcContext::IPmt}, + {kFuncTag, "NPV", CFXJSE_FormCalcContext::NPV}, + {kFuncTag, "Pmt", CFXJSE_FormCalcContext::Pmt}, + {kFuncTag, "PPmt", CFXJSE_FormCalcContext::PPmt}, + {kFuncTag, "PV", CFXJSE_FormCalcContext::PV}, + {kFuncTag, "Rate", CFXJSE_FormCalcContext::Rate}, + {kFuncTag, "Term", CFXJSE_FormCalcContext::Term}, + {kFuncTag, "Choose", CFXJSE_FormCalcContext::Choose}, + {kFuncTag, "Exists", CFXJSE_FormCalcContext::Exists}, + {kFuncTag, "HasValue", CFXJSE_FormCalcContext::HasValue}, + {kFuncTag, "Oneof", CFXJSE_FormCalcContext::Oneof}, + {kFuncTag, "Within", CFXJSE_FormCalcContext::Within}, + {kFuncTag, "If", CFXJSE_FormCalcContext::If}, + {kFuncTag, "Eval", CFXJSE_FormCalcContext::Eval}, + {kFuncTag, "Translate", CFXJSE_FormCalcContext::eval_translation}, + {kFuncTag, "Ref", CFXJSE_FormCalcContext::Ref}, + {kFuncTag, "UnitType", CFXJSE_FormCalcContext::UnitType}, + {kFuncTag, "UnitValue", CFXJSE_FormCalcContext::UnitValue}, + {kFuncTag, "At", CFXJSE_FormCalcContext::At}, + {kFuncTag, "Concat", CFXJSE_FormCalcContext::Concat}, + {kFuncTag, "Decode", CFXJSE_FormCalcContext::Decode}, + {kFuncTag, "Encode", CFXJSE_FormCalcContext::Encode}, + {kFuncTag, "Format", CFXJSE_FormCalcContext::Format}, + {kFuncTag, "Left", CFXJSE_FormCalcContext::Left}, + {kFuncTag, "Len", CFXJSE_FormCalcContext::Len}, + {kFuncTag, "Lower", CFXJSE_FormCalcContext::Lower}, + {kFuncTag, "Ltrim", CFXJSE_FormCalcContext::Ltrim}, + {kFuncTag, "Parse", CFXJSE_FormCalcContext::Parse}, + {kFuncTag, "Replace", CFXJSE_FormCalcContext::Replace}, + {kFuncTag, "Right", CFXJSE_FormCalcContext::Right}, + {kFuncTag, "Rtrim", CFXJSE_FormCalcContext::Rtrim}, + {kFuncTag, "Space", CFXJSE_FormCalcContext::Space}, + {kFuncTag, "Str", CFXJSE_FormCalcContext::Str}, + {kFuncTag, "Stuff", CFXJSE_FormCalcContext::Stuff}, + {kFuncTag, "Substr", CFXJSE_FormCalcContext::Substr}, + {kFuncTag, "Uuid", CFXJSE_FormCalcContext::Uuid}, + {kFuncTag, "Upper", CFXJSE_FormCalcContext::Upper}, + {kFuncTag, "WordNum", CFXJSE_FormCalcContext::WordNum}, + {kFuncTag, "Get", CFXJSE_FormCalcContext::Get}, + {kFuncTag, "Post", CFXJSE_FormCalcContext::Post}, + {kFuncTag, "Put", CFXJSE_FormCalcContext::Put}, + {kFuncTag, "pos_op", CFXJSE_FormCalcContext::positive_operator}, + {kFuncTag, "neg_op", CFXJSE_FormCalcContext::negative_operator}, + {kFuncTag, "log_or_op", CFXJSE_FormCalcContext::logical_or_operator}, + {kFuncTag, "log_and_op", CFXJSE_FormCalcContext::logical_and_operator}, + {kFuncTag, "log_not_op", CFXJSE_FormCalcContext::logical_not_operator}, + {kFuncTag, "eq_op", CFXJSE_FormCalcContext::equality_operator}, + {kFuncTag, "neq_op", CFXJSE_FormCalcContext::notequality_operator}, + {kFuncTag, "lt_op", CFXJSE_FormCalcContext::less_operator}, + {kFuncTag, "le_op", CFXJSE_FormCalcContext::lessequal_operator}, + {kFuncTag, "gt_op", CFXJSE_FormCalcContext::greater_operator}, + {kFuncTag, "ge_op", CFXJSE_FormCalcContext::greaterequal_operator}, + {kFuncTag, "plus_op", CFXJSE_FormCalcContext::plus_operator}, + {kFuncTag, "minus_op", CFXJSE_FormCalcContext::minus_operator}, + {kFuncTag, "mul_op", CFXJSE_FormCalcContext::multiple_operator}, + {kFuncTag, "div_op", CFXJSE_FormCalcContext::divide_operator}, + {kFuncTag, "asgn_val_op", CFXJSE_FormCalcContext::assign_value_operator}, + {kFuncTag, "dot_acc", CFXJSE_FormCalcContext::dot_accessor}, + {kFuncTag, "dotdot_acc", CFXJSE_FormCalcContext::dotdot_accessor}, + {kFuncTag, "concat_obj", CFXJSE_FormCalcContext::concat_fm_object}, + {kFuncTag, "is_obj", CFXJSE_FormCalcContext::is_fm_object}, + {kFuncTag, "is_ary", CFXJSE_FormCalcContext::is_fm_array}, + {kFuncTag, "get_val", CFXJSE_FormCalcContext::get_fm_value}, + {kFuncTag, "get_jsobj", CFXJSE_FormCalcContext::get_fm_jsobj}, + {kFuncTag, "var_filter", CFXJSE_FormCalcContext::fm_var_filter}, }; const uint8_t kAltTableDate[] = { @@ -607,6 +610,7 @@ double ByteStringToDouble(const ByteStringView& szStringVal) { } // namespace const FXJSE_CLASS_DESCRIPTOR kFormCalcFM2JSDescriptor = { + kClassTag, // tag "XFA_FM2JS_FormCalcClass", // name kFormCalcFM2JSFunctions, // methods FX_ArraySize(kFormCalcFM2JSFunctions), // number of methods diff --git a/fxjs/fxjse.cpp b/fxjs/fxjse.cpp index 68adaa5dd3..44849fdfec 100644 --- a/fxjs/fxjse.cpp +++ b/fxjs/fxjse.cpp @@ -6,6 +6,15 @@ #include "fxjs/fxjse.h" +namespace pdfium { +namespace fxjse { + +const char kFuncTag[] = "function descriptor tag"; +const char kClassTag[] = "class descriptor tag"; + +} // namespace fxjse +} // namespace pdfium + CFXJSE_HostObject::CFXJSE_HostObject() = default; CFXJSE_HostObject::~CFXJSE_HostObject() = default; diff --git a/fxjs/fxjse.h b/fxjs/fxjse.h index 3f2eb1d836..c28cc6c919 100644 --- a/fxjs/fxjse.h +++ b/fxjs/fxjse.h @@ -11,6 +11,15 @@ #include "core/fxcrt/fx_system.h" #include "v8/include/v8.h" +namespace pdfium { +namespace fxjse { + +extern const char kFuncTag[]; +extern const char kClassTag[]; + +} // namespace fxjse +} // namespace pdfium + class CFXJSE_Arguments; class CFXJSE_FormCalcContext; class CFXJSE_Value; @@ -50,11 +59,13 @@ enum FXJSE_ClassPropTypes { }; struct FXJSE_FUNCTION_DESCRIPTOR { + const char* tag; // pdfium::kFuncTag always. const char* name; FXJSE_FuncCallback callbackProc; }; struct FXJSE_CLASS_DESCRIPTOR { + const char* tag; // pdfium::kClassTag always. const char* name; const FXJSE_FUNCTION_DESCRIPTOR* methods; int32_t methNum; -- cgit v1.2.3