diff options
author | Lei Zhang <thestig@chromium.org> | 2015-09-22 21:53:22 -0700 |
---|---|---|
committer | Lei Zhang <thestig@chromium.org> | 2015-09-22 21:53:22 -0700 |
commit | 13fe8c9d74607610b3a535c7edf911eaa8711318 (patch) | |
tree | abfc392171d0ace3144035903f7d930c78a9c96c /core | |
parent | 0244d40daf39caf97f47de9982f4aac88c0c8644 (diff) | |
download | pdfium-13fe8c9d74607610b3a535c7edf911eaa8711318.tar.xz |
Merge to XFA: Change nonstd::unique_ptr to take a custom deleter.
Code is mostly stolen from Chromium's scoped_ptr.
- Add unit tests.
- Use this to fix a leak.
BUG=chromium:531408
TBR=tsepez@chromium.org
Review URL: https://codereview.chromium.org/1351383004 .
(cherry picked from commit cef2a9c51bee4b987fc813013d45dad6535a9a46)
Review URL: https://codereview.chromium.org/1358163003 .
Diffstat (limited to 'core')
-rw-r--r-- | core/include/fxcrt/fx_basic.h | 8 | ||||
-rw-r--r-- | core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp | 7 |
2 files changed, 12 insertions, 3 deletions
diff --git a/core/include/fxcrt/fx_basic.h b/core/include/fxcrt/fx_basic.h index 661722e1b2..fa536004d4 100644 --- a/core/include/fxcrt/fx_basic.h +++ b/core/include/fxcrt/fx_basic.h @@ -1085,6 +1085,13 @@ class CFX_AutoRestorer { T m_OldValue; }; +// Used with nonstd::unique_ptr to Release() objects that can't be deleted. +template <class T> +struct ReleaseDeleter { + inline void operator()(T* ptr) const { ptr->Release(); } +}; + +// TODO(thestig) Remove in favor of nonstd::unique_ptr. template <class T> class CFX_SmartPointer { public: @@ -1097,6 +1104,7 @@ class CFX_SmartPointer { protected: T* m_pObj; }; + #define FX_DATALIST_LENGTH 1024 template <size_t unit> class CFX_SortListArray { diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp index 4c2bb346a1..5909d0f758 100644 --- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp +++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp @@ -2385,8 +2385,9 @@ CPDF_Object* CPDF_SyntaxParser::GetObjectByStrict( continue; } key = PDF_NameDecode(key); - CPDF_Object* pObj = GetObject(pObjList, objnum, gennum); - if (pObj == NULL) { + nonstd::unique_ptr<CPDF_Object, ReleaseDeleter<CPDF_Object>> obj( + GetObject(pObjList, objnum, gennum)); + if (!obj) { if (pDict) { pDict->Release(); } @@ -2403,7 +2404,7 @@ CPDF_Object* CPDF_SyntaxParser::GetObjectByStrict( } if (key.GetLength() > 1) { pDict->AddValue(CFX_ByteStringC(key.c_str() + 1, key.GetLength() - 1), - pObj); + obj.release()); } } if (pContext) { |