Hi

I think there are a couple of options here:

Option 1)
Make C++11 a requirement only when PoDoFo is compiled with PODOFO_MULTI_THREAD. 
That means the change won’t affect users who compile PoDoFo single threaded

So the recursion guard definition would look something like this:

#if !defined(PODOFO_MULTI_THREAD)
  static int  s_nRecursionDepth;  // PoDoFo is single threaded
#elif defined(thread_local)
  static int thread_local s_nRecursionDepth; // PoDoFo has threading support 
and using C++11 compiler
#else
#error C++11 thread_local is required for multi-thread
#endif

The thread_local macro is available in

GCC 4.8.0 and later (4.8.0 was released 2013)
clang 3.3 and later (3.3 was released 2013)
clang (macOS fork) (available in XCode 8, which was released in 2016)
Visual Studio 2015 and later

Option 2)
Another option is adding a fallback for very old compilers that uses mutexes. 
This mutex fallback won’t be used by many people (because most will use modern 
compilers that support C++11) but might make it easier to agree on a patch (and 
isn’t hard to implement). It would look something like this:

#if !defined(PODOFO_MULTI_THREAD)
  static int  s_nRecursionDepth;  // PoDoFo is single threaded
#eif defined(thread_local)
  static int thread_local s_nRecursionDepth; // PoDoFo has threading support 
and using C++11 compiler
#else
  static Util::PdfMutex s_guardMutex;
  static int  s_nRecursionDepth;  // PoDoFo is multi threaded and this needs 
protected by a mutex
#endif


PdfRecursionGuard ::~PdfRecursionGuard()
{
#if !defined(PODOFO_MULTI_THREAD)
  --s_nRecursionDepth;  // PoDoFo is single threaded
#elif defined(thread_local)
  --s_nRecursionDepth; // PoDoFo has threading support but this is thread_local
#else
  PdfMutexWrapper lock(s_guardMutex);
  --s_nRecursionDepth;  // PoDoFo is multi threaded and this needs protected by 
a mutex
#endif
}

Best Regards
Mark


Mark Rogers - mark.rog...@powermapper.com
PowerMapper Software Ltd - www.powermapper.com
Registered in Scotland No 362274 Quartermile 2 Edinburgh EH3 9GL




From: Christopher Creutzig <ccreu...@mathworks.com>
Date: Monday, 22 November 2021 at 07:45
To: Michal Sudolsky <sudols...@gmail.com>, "PowerMapper.com" 
<mark.rog...@powermapper.com>
Cc: "podofo-users@lists.sourceforge.net" <podofo-users@lists.sourceforge.net>
Subject: RE: [Podofo-users] PoDoFo and recursive stack consumption CVEs

From: Michal Sudolsky sudols...@gmail.com<mailto:sudols...@gmail.com>
> But this fallback would cause UB unless all access to t_nRecursionDepth is 
> atomic or guarded by mutex.

If we want to avoid UB in the multithreaded world, I’m afraid we will have to 
make a C++11 compiler a requirement, as C++03 never acknowledged the existence 
of threads. (That is not limited to this place, a lot of methods like 
PdfEncodingFactory::GlobalPdfRomanEncodingInstance are not currently threadsafe 
in C++03, as discussed earlier.)

Now, if we do that, the solution is easy, make the variables used with the 
recursion guard thread_local. (Atomic or mutex are not a good solution, as 
those would make the recursion guard depend on what other threads are doing at 
the same time.)


Cheers,
Christopher
The MathWorks GmbH | Friedlandstr.18 | 52064 Aachen | District Court Aachen | 
HRB 8082 | Managing Directors: Bertrand Dissler, Steven D. Barbo, Jeanne O’Keefe


_______________________________________________
Podofo-users mailing list
Podofo-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/podofo-users

Reply via email to