summaryrefslogtreecommitdiff
path: root/fpdfsdk/fpdfxfa
diff options
context:
space:
mode:
authorTom Sepez <tsepez@chromium.org>2017-05-16 14:01:47 -0700
committerChromium commit bot <commit-bot@chromium.org>2017-05-16 21:29:40 +0000
commitcc205131b021ebded854958973f445ed121da1b8 (patch)
tree18abcb19e5ec70dc8079cc7ad5192a5ff50aaf27 /fpdfsdk/fpdfxfa
parentd3a3cc24a034654b0825e4822446ddfc6a22c045 (diff)
downloadpdfium-cc205131b021ebded854958973f445ed121da1b8.tar.xz
Introduce CFX_UnownedPtr to detect lifetime inversion issues.
There are places where an object "child" has a raw pointer back to object "owner" with the understanding that owner will always outlive child. Violating this constraint can lead to use after free, but this requires finding two paths: one that frees the objects in the wrong order, and one that uses the object after the free. The purpose of this patch is to detect the constraint violation even when the second path is not hit. We create a template that is used in place of TYPE*. It's dtor, when a memory tool is present, goes out and probes the first byte of the object to which it points. Used in "child", this allows the memory tool to prove that the "owner" is still alive at the time the child is destroyed, and hence the constraint is never violated. Change-Id: I2a6d696d51dda4a79ee2f00a6752965e058a6417 Reviewed-on: https://pdfium-review.googlesource.com/5475 Commit-Queue: Tom Sepez <tsepez@chromium.org> Reviewed-by: dsinclair <dsinclair@chromium.org> Reviewed-by: Lei Zhang <thestig@chromium.org>
Diffstat (limited to 'fpdfsdk/fpdfxfa')
-rw-r--r--fpdfsdk/fpdfxfa/cpdfxfa_context.cpp2
-rw-r--r--fpdfsdk/fpdfxfa/cpdfxfa_context.h12
-rw-r--r--fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp2
-rw-r--r--fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.h5
4 files changed, 13 insertions, 8 deletions
diff --git a/fpdfsdk/fpdfxfa/cpdfxfa_context.cpp b/fpdfsdk/fpdfxfa/cpdfxfa_context.cpp
index 454e2187a3..93ecab0d08 100644
--- a/fpdfsdk/fpdfxfa/cpdfxfa_context.cpp
+++ b/fpdfsdk/fpdfxfa/cpdfxfa_context.cpp
@@ -358,6 +358,6 @@ bool CPDFXFA_Context::PutRequestURL(const CFX_WideString& wsURL,
IFWL_AdapterTimerMgr* CPDFXFA_Context::GetTimerMgr() {
CXFA_FWLAdapterTimerMgr* pAdapter = nullptr;
if (m_pFormFillEnv)
- pAdapter = new CXFA_FWLAdapterTimerMgr(m_pFormFillEnv);
+ pAdapter = new CXFA_FWLAdapterTimerMgr(m_pFormFillEnv.Get());
return pAdapter;
}
diff --git a/fpdfsdk/fpdfxfa/cpdfxfa_context.h b/fpdfsdk/fpdfxfa/cpdfxfa_context.h
index 8e6b2198af..690e1855e3 100644
--- a/fpdfsdk/fpdfxfa/cpdfxfa_context.h
+++ b/fpdfsdk/fpdfxfa/cpdfxfa_context.h
@@ -10,6 +10,8 @@
#include <memory>
#include <vector>
+#include "core/fxcrt/cfx_unowned_ptr.h"
+#include "core/fxcrt/fx_system.h"
#include "fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.h"
#include "xfa/fxfa/cxfa_ffdoc.h"
@@ -36,12 +38,14 @@ class CPDFXFA_Context : public IXFA_AppProvider {
bool LoadXFADoc();
CPDF_Document* GetPDFDoc() { return m_pPDFDoc.get(); }
CXFA_FFDoc* GetXFADoc() { return m_pXFADoc.get(); }
- CXFA_FFDocView* GetXFADocView() { return m_pXFADocView; }
+ CXFA_FFDocView* GetXFADocView() { return m_pXFADocView.Get(); }
XFA_DocType GetDocType() const { return m_iDocType; }
v8::Isolate* GetJSERuntime() const;
CXFA_FFApp* GetXFAApp() { return m_pXFAApp.get(); }
- CPDFSDK_FormFillEnvironment* GetFormFillEnv() const { return m_pFormFillEnv; }
+ CPDFSDK_FormFillEnvironment* GetFormFillEnv() const {
+ return m_pFormFillEnv.Get();
+ }
void SetFormFillEnv(CPDFSDK_FormFillEnvironment* pFormFillEnv);
void DeletePage(int page_index);
@@ -102,8 +106,8 @@ class CPDFXFA_Context : public IXFA_AppProvider {
std::unique_ptr<CPDF_Document> m_pPDFDoc;
std::unique_ptr<CXFA_FFDoc> m_pXFADoc;
- CPDFSDK_FormFillEnvironment* m_pFormFillEnv; // not owned.
- CXFA_FFDocView* m_pXFADocView; // not owned.
+ CFX_UnownedPtr<CPDFSDK_FormFillEnvironment> m_pFormFillEnv;
+ CFX_UnownedPtr<CXFA_FFDocView> m_pXFADocView;
std::unique_ptr<CXFA_FFApp> m_pXFAApp;
std::unique_ptr<CJS_Runtime> m_pRuntime;
std::vector<CPDFXFA_Page*> m_XFAPageList;
diff --git a/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp b/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp
index 4464f1c43a..1a27d9b015 100644
--- a/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp
+++ b/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp
@@ -46,7 +46,7 @@ CPDFXFA_DocEnvironment::CPDFXFA_DocEnvironment(CPDFXFA_Context* pContext)
CPDFXFA_DocEnvironment::~CPDFXFA_DocEnvironment() {
if (m_pJSEventContext && m_pContext->GetFormFillEnv()) {
m_pContext->GetFormFillEnv()->GetJSRuntime()->ReleaseEventContext(
- m_pJSEventContext);
+ m_pJSEventContext.Get());
}
}
diff --git a/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.h b/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.h
index 8f1d238103..ec04e78db9 100644
--- a/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.h
+++ b/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.h
@@ -8,6 +8,7 @@
#define FPDFSDK_FPDFXFA_CPDFXFA_DOCENVIRONMENT_H_
#include "core/fxcrt/cfx_retain_ptr.h"
+#include "core/fxcrt/cfx_unowned_ptr.h"
#include "public/fpdfview.h"
#include "xfa/fxfa/fxfa.h"
@@ -105,8 +106,8 @@ class CPDFXFA_DocEnvironment : public IXFA_DocEnvironment {
FPDF_DWORD flag);
void ToXFAContentFlags(CFX_WideString csSrcContent, FPDF_DWORD& flag);
- CPDFXFA_Context* const m_pContext; // Not owned.
- IJS_EventContext* m_pJSEventContext; // Not owned.
+ CFX_UnownedPtr<CPDFXFA_Context> const m_pContext;
+ CFX_UnownedPtr<IJS_EventContext> m_pJSEventContext;
};
#endif // FPDFSDK_FPDFXFA_CPDFXFA_DOCENVIRONMENT_H_