From 3a005f22703b9303a306bf34cbd17c3729f763aa Mon Sep 17 00:00:00 2001 From: tsepez Date: Fri, 27 May 2016 17:45:00 -0700 Subject: Workaround dubious casting between CXFA_Object and void* in FXJSE This is just a crock to get things working until we fix the underlying issue. When there's single-inheritance, it may often work in practice to C-style (reinterpret) cast a Derived* ptr to void* and then back to a Base* ptr. One place where this blows up is if Derived has virtual functions but Base does not, in which case the world will be offset by the size of a vtable ptr. Because of the use of void* types in FXJSE, the above was happening when setting a CXFA_ThisProxy (Derived, virtual) to be a global object (void*). This would then be cast back to a CFXA_Object (Base, non-virtual) and chaos is ensured. Not sure how far back this goes. Along the way, pick up some tidying which was necessary for simplicity while tracking this down. BUG=613607 Review-Url: https://codereview.chromium.org/2015143005 --- xfa/fxfa/parser/xfa_object.h | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'xfa/fxfa/parser/xfa_object.h') diff --git a/xfa/fxfa/parser/xfa_object.h b/xfa/fxfa/parser/xfa_object.h index 28d4712e46..8fc074c08f 100644 --- a/xfa/fxfa/parser/xfa_object.h +++ b/xfa/fxfa/parser/xfa_object.h @@ -41,9 +41,12 @@ enum XFA_OBJECTTYPE { XFA_NODEFLAG_UnusedNode = 0x08000, XFA_NODEFLAG_LayoutGeneratedNode = 0x10000, }; + class CXFA_Object { public: CXFA_Object(CXFA_Document* pDocument, uint32_t uFlags); + virtual ~CXFA_Object() {} + CXFA_Document* GetDocument() const { return m_pDocument; } uint32_t GetFlag() const { return m_uFlags; } XFA_OBJECTTYPE GetObjectType() const { @@ -590,7 +593,7 @@ class CXFA_Node : public CXFA_Object { protected: CXFA_Node(CXFA_Document* pDoc, uint16_t ePacket, XFA_ELEMENT eElement); - ~CXFA_Node(); + ~CXFA_Node() override; friend class CXFA_Document; CXFA_Node* Deprecated_GetPrevSibling(); FX_BOOL SetValue(XFA_ATTRIBUTE eAttr, @@ -669,7 +672,7 @@ class CXFA_ThisProxy : public CXFA_Object { m_pThisNode = pThisNode; m_pScriptNode = pScriptNode; } - virtual ~CXFA_ThisProxy() {} + ~CXFA_ThisProxy() override {} CXFA_Node* GetThisNode() { return m_pThisNode; } CXFA_Node* GetScriptNode() { return m_pScriptNode; } -- cgit v1.2.3