File r1838-Extend-fix-for-CVE-2017-5852.patch of Package podofo.23799
------------------------------------------------------------------------
r1838 | aja_ | 2017-04-09 13:13:05 +0200 (dom, 09 abr 2017) | 2 lines
Patch by Mark Rogers: Extend fix for CVE-2017-5852
Index: src/doc/PdfPage.cpp
===================================================================
--- src/doc/PdfPage.cpp.orig
+++ src/doc/PdfPage.cpp
#@@ -212,7 +212,7 @@
# return rect;
# }
#
#-const PdfObject* PdfPage::GetInheritedKeyFromObject( const char* inKey, const PdfObject* inObject ) const
#+const PdfObject* PdfPage::GetInheritedKeyFromObject( const char* inKey, const PdfObject* inObject, int depth ) const
# {
# const PdfObject* pObj = NULL;
#
@@ -200,6 +200,11 @@ PdfRect PdfPage::CreateStandardPageSize(
const PdfObject* PdfPage::GetInheritedKeyFromObject( const char* inKey, const PdfObject* inObject ) const
{
+ return GetInheritedKeyFromObject( inKey, inObject, 0 );
+}
+
+const PdfObject* PdfPage::GetInheritedKeyFromObject( const char* inKey, const PdfObject* inObject, int depth ) const
+{
const PdfObject* pObj = NULL;
// check for it in the object itself
@@ -213,6 +218,18 @@ const PdfObject* PdfPage::GetInheritedKe
// if we get here, we need to go check the parent - if there is one!
if( inObject->GetDictionary().HasKey( "Parent" ) )
{
+ // CVE-2017-5852 - prevent stack overflow if Parent chain contains a loop, or is very long
+ // e.g. pObj->GetParent() == pObj or pObj->GetParent()->GetParent() == pObj
+ // default stack sizes
+ // Windows: 1 MB
+ // Linux: 2 MB
+ // macOS: 8 MB for main thread, 0.5 MB for secondary threads
+ // 0.5 MB is enough space for 1000 512 byte stack frames and 2000 256 byte stack frames
+ const int maxRecursionDepth = 1000;
+
+ if ( depth > maxRecursionDepth )
+ PODOFO_RAISE_ERROR( ePdfError_ValueOutOfRange );
+
pObj = inObject->GetIndirectKey( "Parent" );
if( pObj == inObject )
{
@@ -223,7 +240,7 @@ const PdfObject* PdfPage::GetInheritedKe
}
if( pObj )
- pObj = GetInheritedKeyFromObject( inKey, pObj );
+ pObj = GetInheritedKeyFromObject( inKey, pObj, depth + 1 );
}
return pObj;
Index: src/doc/PdfPage.h
===================================================================
--- src/doc/PdfPage.h.orig
+++ src/doc/PdfPage.h
#@@ -291,7 +291,7 @@
# /** Method for getting a key value that could be inherited (such as the boxes, resources, etc.)
# * \returns PdfObject - the result of the key fetching or NULL
# */
#- const PdfObject* GetInheritedKeyFromObject( const char* inKey, const PdfObject* inObject ) const;
#+ const PdfObject* GetInheritedKeyFromObject( const char* inKey, const PdfObject* inObject, int depth = 0 ) const;
#
# /** Get the annotations array.
# * \param bCreate if true the annotations array is created
@@ -275,7 +275,8 @@ class PODOFO_DOC_API PdfPage : public Pd
/** Method for getting a key value that could be inherited (such as the boxes, resources, etc.)
* \returns PdfObject - the result of the key fetching or NULL
*/
- const PdfObject* GetInheritedKeyFromObject( const char* inKey, const PdfObject* inObject ) const;
+ const PdfObject* GetInheritedKeyFromObject( const char* inKey, const PdfObject* inObject ) const;
+ const PdfObject* GetInheritedKeyFromObject( const char* inKey, const PdfObject* inObject, int depth ) const;
/** Get the annotations array.
* \param bCreate if true the annotations array is created