diff options
author | Tom Sepez <tsepez@chromium.org> | 2017-05-16 14:01:47 -0700 |
---|---|---|
committer | Chromium commit bot <commit-bot@chromium.org> | 2017-05-16 21:29:40 +0000 |
commit | cc205131b021ebded854958973f445ed121da1b8 (patch) | |
tree | 18abcb19e5ec70dc8079cc7ad5192a5ff50aaf27 /xfa/fxfa/cxfa_ffdocview.h | |
parent | d3a3cc24a034654b0825e4822446ddfc6a22c045 (diff) | |
download | pdfium-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 'xfa/fxfa/cxfa_ffdocview.h')
-rw-r--r-- | xfa/fxfa/cxfa_ffdocview.h | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/xfa/fxfa/cxfa_ffdocview.h b/xfa/fxfa/cxfa_ffdocview.h index 761397c4b0..83d077b548 100644 --- a/xfa/fxfa/cxfa_ffdocview.h +++ b/xfa/fxfa/cxfa_ffdocview.h @@ -11,6 +11,7 @@ #include <memory> #include <vector> +#include "core/fxcrt/cfx_unowned_ptr.h" #include "xfa/fxfa/cxfa_eventparam.h" #include "xfa/fxfa/cxfa_ffdoc.h" @@ -56,7 +57,7 @@ class CXFA_FFDocView { CXFA_WidgetAcc* pWidgetAcc); CXFA_FFWidgetHandler* GetWidgetHandler(); std::unique_ptr<CXFA_WidgetAccIterator> CreateWidgetAccIterator(); - CXFA_FFWidget* GetFocusWidget(); + CXFA_FFWidget* GetFocusWidget() const; void KillFocus(); bool SetFocus(CXFA_FFWidget* hWidget); CXFA_FFWidget* GetWidgetByName(const CFX_WideString& wsName, @@ -117,10 +118,10 @@ class CXFA_FFDocView { CXFA_FFDoc* const m_pDoc; std::unique_ptr<CXFA_FFWidgetHandler> m_pWidgetHandler; - CXFA_LayoutProcessor* m_pXFADocLayout; // not owned. - CXFA_WidgetAcc* m_pFocusAcc; // not owned. - CXFA_FFWidget* m_pFocusWidget; // not owned. - CXFA_FFWidget* m_pOldFocusWidget; // not owned. + CXFA_LayoutProcessor* m_pXFADocLayout; // Not owned. + CFX_UnownedPtr<CXFA_WidgetAcc> m_pFocusAcc; + CFX_UnownedPtr<CXFA_FFWidget> m_pFocusWidget; + CFX_UnownedPtr<CXFA_FFWidget> m_pOldFocusWidget; std::map<CXFA_FFPageView*, std::unique_ptr<CFX_RectF>> m_mapPageInvalidate; std::vector<CXFA_WidgetAcc*> m_ValidateAccs; std::vector<CXFA_WidgetAcc*> m_CalculateAccs; |