diff options
Diffstat (limited to 'third_party/lcms/0000-cmserr-changes.patch')
-rw-r--r-- | third_party/lcms/0000-cmserr-changes.patch | 285 |
1 files changed, 285 insertions, 0 deletions
diff --git a/third_party/lcms/0000-cmserr-changes.patch b/third_party/lcms/0000-cmserr-changes.patch new file mode 100644 index 0000000000..5ccaac9ee1 --- /dev/null +++ b/third_party/lcms/0000-cmserr-changes.patch @@ -0,0 +1,285 @@ +diff --git a/third_party/lcms/src/cmserr.c b/third_party/lcms/src/cmserr.c +index 700152ee3..3c3848b2a 100644 +--- a/third_party/lcms/src/cmserr.c ++++ b/third_party/lcms/src/cmserr.c +@@ -25,6 +25,8 @@ + + #include "lcms2_internal.h" + ++#include "core/fxcrt/fx_memory.h" ++#include "core/fxcrt/fx_system.h" + + // This function is here to help applications to prevent mixing lcms versions on header and shared objects. + int CMSEXPORT cmsGetEncodedCMMversion(void) +@@ -65,140 +67,75 @@ long int CMSEXPORT cmsfilelength(FILE* f) + return n; + } + +- +-// Memory handling ------------------------------------------------------------------ +-// +-// This is the interface to low-level memory management routines. By default a simple +-// wrapping to malloc/free/realloc is provided, although there is a limit on the max +-// amount of memoy that can be reclaimed. This is mostly as a safety feature to prevent +-// bogus or evil code to allocate huge blocks that otherwise lcms would never need. +- +-#define MAX_MEMORY_FOR_ALLOC ((cmsUInt32Number)(1024U*1024U*512U)) +- +-// User may override this behaviour by using a memory plug-in, which basically replaces +-// the default memory management functions. In this case, no check is performed and it +-// is up to the plug-in writter to keep in the safe side. There are only three functions +-// required to be implemented: malloc, realloc and free, although the user may want to +-// replace the optional mallocZero, calloc and dup as well. +- +-cmsBool _cmsRegisterMemHandlerPlugin(cmsContext ContextID, cmsPluginBase* Plugin); +- +-// ********************************************************************************* +- +-// This is the default memory allocation function. It does a very coarse +-// check of amout of memory, just to prevent exploits +-static +-void* _cmsMallocDefaultFn(cmsContext ContextID, cmsUInt32Number size) ++cmsBool _cmsRegisterMemHandlerPlugin(cmsContext ContextID, cmsPluginBase* Plugin) + { +- if (size > MAX_MEMORY_FOR_ALLOC) return NULL; // Never allow over maximum +- +- return (void*) malloc(size); ++ return TRUE; ++} + +- cmsUNUSED_PARAMETER(ContextID); ++// Generic allocate ++void* CMSEXPORT _cmsMalloc(cmsContext ContextID, cmsUInt32Number size) ++{ ++ return FXMEM_DefaultAlloc(size, 1); + } + + // Generic allocate & zero +-static +-void* _cmsMallocZeroDefaultFn(cmsContext ContextID, cmsUInt32Number size) ++void* CMSEXPORT _cmsMallocZero(cmsContext ContextID, cmsUInt32Number size) + { +- void *pt = _cmsMalloc(ContextID, size); +- if (pt == NULL) return NULL; +- +- memset(pt, 0, size); +- return pt; ++ void* p = FXMEM_DefaultAlloc(size, 1); ++ if (p) memset(p, 0, size); ++ return p; + } + +- +-// The default free function. The only check proformed is against NULL pointers +-static +-void _cmsFreeDefaultFn(cmsContext ContextID, void *Ptr) ++// Generic calloc ++void* CMSEXPORT _cmsCalloc(cmsContext ContextID, cmsUInt32Number num, cmsUInt32Number size) + { +- // free(NULL) is defined a no-op by C99, therefore it is safe to +- // avoid the check, but it is here just in case... +- +- if (Ptr) free(Ptr); ++ cmsUInt32Number total = num * size; ++ if (total == 0 || total / size != num || total >= 512 * 1024 * 1024) ++ return NULL; + +- cmsUNUSED_PARAMETER(ContextID); ++ return _cmsMallocZero(ContextID, num * size); + } + +-// The default realloc function. Again it checks for exploits. If Ptr is NULL, +-// realloc behaves the same way as malloc and allocates a new block of size bytes. +-static +-void* _cmsReallocDefaultFn(cmsContext ContextID, void* Ptr, cmsUInt32Number size) ++// Generic reallocate ++void* CMSEXPORT _cmsRealloc(cmsContext ContextID, void* Ptr, cmsUInt32Number size) + { +- +- if (size > MAX_MEMORY_FOR_ALLOC) return NULL; // Never realloc over 512Mb +- +- return realloc(Ptr, size); +- +- cmsUNUSED_PARAMETER(ContextID); ++ return FXMEM_DefaultRealloc(Ptr, size, 1); + } + +- +-// The default calloc function. Allocates an array of num elements, each one of size bytes +-// all memory is initialized to zero. +-static +-void* _cmsCallocDefaultFn(cmsContext ContextID, cmsUInt32Number num, cmsUInt32Number size) ++// Generic free memory ++void CMSEXPORT _cmsFree(cmsContext ContextID, void* Ptr) + { +- cmsUInt32Number Total = num * size; +- +- // Preserve calloc behaviour +- if (Total == 0) return NULL; +- +- // Safe check for overflow. +- if (num >= UINT_MAX / size) return NULL; +- +- // Check for overflow +- if (Total < num || Total < size) { +- return NULL; +- } +- +- if (Total > MAX_MEMORY_FOR_ALLOC) return NULL; // Never alloc over 512Mb +- +- return _cmsMallocZero(ContextID, Total); ++ if (Ptr != NULL) FXMEM_DefaultFree(Ptr, 0); + } + + // Generic block duplication +-static +-void* _cmsDupDefaultFn(cmsContext ContextID, const void* Org, cmsUInt32Number size) ++void* CMSEXPORT _cmsDupMem(cmsContext ContextID, const void* Org, cmsUInt32Number size) + { +- void* mem; +- +- if (size > MAX_MEMORY_FOR_ALLOC) return NULL; // Never dup over 512Mb +- +- mem = _cmsMalloc(ContextID, size); +- +- if (mem != NULL && Org != NULL) +- memmove(mem, Org, size); +- +- return mem; ++ void* p = FXMEM_DefaultAlloc(size, 1); ++ memmove(p, Org, size); ++ return p; + } + +- +-// Pointers to memory manager functions in Context0 +-_cmsMemPluginChunkType _cmsMemPluginChunk = { _cmsMallocDefaultFn, _cmsMallocZeroDefaultFn, _cmsFreeDefaultFn, +- _cmsReallocDefaultFn, _cmsCallocDefaultFn, _cmsDupDefaultFn ++_cmsMemPluginChunkType _cmsMemPluginChunk = {_cmsMalloc, _cmsMallocZero, _cmsFree, ++ _cmsRealloc, _cmsCalloc, _cmsDupMem + }; + +- +-// Reset and duplicate memory manager + void _cmsAllocMemPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src) + { + _cmsAssert(ctx != NULL); + +- if (src != NULL) { ++ if (src != NULL) { + + // Duplicate +- ctx ->chunks[MemPlugin] = _cmsSubAllocDup(ctx ->MemPool, src ->chunks[MemPlugin], sizeof(_cmsMemPluginChunkType)); ++ ctx ->chunks[MemPlugin] = _cmsSubAllocDup(ctx ->MemPool, src ->chunks[MemPlugin], sizeof(_cmsMemPluginChunkType)); + } + else { + + // To reset it, we use the default allocators, which cannot be overriden + ctx ->chunks[MemPlugin] = &ctx ->DefaultMemoryManager; +- } ++ } + } + +-// Auxiliary to fill memory management functions from plugin (or context 0 defaults) + void _cmsInstallAllocFunctions(cmsPluginMemHandler* Plugin, _cmsMemPluginChunkType* ptr) + { + if (Plugin == NULL) { +@@ -212,94 +149,15 @@ void _cmsInstallAllocFunctions(cmsPluginMemHandler* Plugin, _cmsMemPluginChunkTy + ptr ->ReallocPtr = Plugin -> ReallocPtr; + + // Make sure we revert to defaults +- ptr ->MallocZeroPtr= _cmsMallocZeroDefaultFn; +- ptr ->CallocPtr = _cmsCallocDefaultFn; +- ptr ->DupPtr = _cmsDupDefaultFn; +- ++ ptr ->MallocZeroPtr= _cmsMallocZero; ++ ptr ->CallocPtr = _cmsCalloc; ++ ptr ->DupPtr = _cmsDupMem; ++ + if (Plugin ->MallocZeroPtr != NULL) ptr ->MallocZeroPtr = Plugin -> MallocZeroPtr; + if (Plugin ->CallocPtr != NULL) ptr ->CallocPtr = Plugin -> CallocPtr; + if (Plugin ->DupPtr != NULL) ptr ->DupPtr = Plugin -> DupPtr; +- +- } +-} +- + +-// Plug-in replacement entry +-cmsBool _cmsRegisterMemHandlerPlugin(cmsContext ContextID, cmsPluginBase *Data) +-{ +- cmsPluginMemHandler* Plugin = (cmsPluginMemHandler*) Data; +- _cmsMemPluginChunkType* ptr; +- +- // NULL forces to reset to defaults. In this special case, the defaults are stored in the context structure. +- // Remaining plug-ins does NOT have any copy in the context structure, but this is somehow special as the +- // context internal data should be malloce'd by using those functions. +- if (Data == NULL) { +- +- struct _cmsContext_struct* ctx = ( struct _cmsContext_struct*) ContextID; +- +- // Return to the default allocators +- if (ContextID != NULL) { +- ctx->chunks[MemPlugin] = (void*) &ctx->DefaultMemoryManager; +- } +- return TRUE; + } +- +- // Check for required callbacks +- if (Plugin -> MallocPtr == NULL || +- Plugin -> FreePtr == NULL || +- Plugin -> ReallocPtr == NULL) return FALSE; +- +- // Set replacement functions +- ptr = (_cmsMemPluginChunkType*) _cmsContextGetClientChunk(ContextID, MemPlugin); +- if (ptr == NULL) +- return FALSE; +- +- _cmsInstallAllocFunctions(Plugin, ptr); +- return TRUE; +-} +- +-// Generic allocate +-void* CMSEXPORT _cmsMalloc(cmsContext ContextID, cmsUInt32Number size) +-{ +- _cmsMemPluginChunkType* ptr = (_cmsMemPluginChunkType*) _cmsContextGetClientChunk(ContextID, MemPlugin); +- return ptr ->MallocPtr(ContextID, size); +-} +- +-// Generic allocate & zero +-void* CMSEXPORT _cmsMallocZero(cmsContext ContextID, cmsUInt32Number size) +-{ +- _cmsMemPluginChunkType* ptr = (_cmsMemPluginChunkType*) _cmsContextGetClientChunk(ContextID, MemPlugin); +- return ptr->MallocZeroPtr(ContextID, size); +-} +- +-// Generic calloc +-void* CMSEXPORT _cmsCalloc(cmsContext ContextID, cmsUInt32Number num, cmsUInt32Number size) +-{ +- _cmsMemPluginChunkType* ptr = (_cmsMemPluginChunkType*) _cmsContextGetClientChunk(ContextID, MemPlugin); +- return ptr->CallocPtr(ContextID, num, size); +-} +- +-// Generic reallocate +-void* CMSEXPORT _cmsRealloc(cmsContext ContextID, void* Ptr, cmsUInt32Number size) +-{ +- _cmsMemPluginChunkType* ptr = (_cmsMemPluginChunkType*) _cmsContextGetClientChunk(ContextID, MemPlugin); +- return ptr->ReallocPtr(ContextID, Ptr, size); +-} +- +-// Generic free memory +-void CMSEXPORT _cmsFree(cmsContext ContextID, void* Ptr) +-{ +- if (Ptr != NULL) { +- _cmsMemPluginChunkType* ptr = (_cmsMemPluginChunkType*) _cmsContextGetClientChunk(ContextID, MemPlugin); +- ptr ->FreePtr(ContextID, Ptr); +- } +-} +- +-// Generic block duplication +-void* CMSEXPORT _cmsDupMem(cmsContext ContextID, const void* Org, cmsUInt32Number size) +-{ +- _cmsMemPluginChunkType* ptr = (_cmsMemPluginChunkType*) _cmsContextGetClientChunk(ContextID, MemPlugin); +- return ptr ->DupPtr(ContextID, Org, size); + } + + // ******************************************************************************************** |