From 58cbf8af7149cd468f0f1e84772d62d9dee770fc Mon Sep 17 00:00:00 2001 From: ChrisCoxArt Date: Tue, 19 May 2026 21:34:38 -0700 Subject: [PATCH 1/8] a few missed items part of PR#1063 --- IccProfLib/IccProfile.cpp | 2 +- IccProfLib/IccTagEmbedIcc.cpp | 13 +++++++++++-- IccXML/IccLibXML/IccMpeXml.cpp | 2 +- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/IccProfLib/IccProfile.cpp b/IccProfLib/IccProfile.cpp index 337ba0929..81c3cf669 100644 --- a/IccProfLib/IccProfile.cpp +++ b/IccProfLib/IccProfile.cpp @@ -3766,7 +3766,7 @@ CIccProfile* ValidateIccProfile(CIccIO *pIO, std::string &sReport, icValidateSta return NULL; } - CIccProfile *pIcc = new CIccProfile; + CIccProfile *pIcc = new (std::nothrow) CIccProfile; if (!pIcc) { delete pIO; diff --git a/IccProfLib/IccTagEmbedIcc.cpp b/IccProfLib/IccTagEmbedIcc.cpp index fec6b2894..3352b5b4e 100644 --- a/IccProfLib/IccTagEmbedIcc.cpp +++ b/IccProfLib/IccTagEmbedIcc.cpp @@ -76,6 +76,7 @@ Copyright: ? see ICC Software License #include #include #include +#include #include "IccTagEmbedIcc.h" #include "IccUtil.h" #include "IccProfile.h" @@ -465,16 +466,24 @@ void CIccTagEmbeddedProfile::Describe(std::string& sDescription, int /* nVerbose // n is number of Tags in Tag Table for (n = 0, i = m_pProfile->m_Tags.begin(); i != m_pProfile->m_Tags.end(); i++, n++) { - // Find closest tag after this tag, by scanning all offsets of other tags + // Find closest tag after this tag, by scanning all offsets of other tags + // NOTE - if this O(N^2) search is a performance problem, copy algorithm from iccDumpProfile closest = pHdr->size; for (j = m_pProfile->m_Tags.begin(); j != m_pProfile->m_Tags.end(); j++) { if ((i != j) && (i->TagInfo.size <= (0xFFFFFFFF - i->TagInfo.offset)) && (j->TagInfo.offset >= i->TagInfo.offset + i->TagInfo.size) && (j->TagInfo.offset <= closest)) { closest = j->TagInfo.offset; } } + // Number of actual padding bytes between this tag and closest neighbour (or EOF) // Should be 0-3 if compliant. Negative number if tags overlap! - pad = closest - i->TagInfo.offset - i->TagInfo.size; + int64_t temp = (int64_t)closest - i->TagInfo.offset - i->TagInfo.size; + if (temp > (int64_t)INT_MAX) + pad = INT_MAX; + else if (temp < (int64_t)INT_MIN) + pad = INT_MIN; + else + pad = (int)temp; const size_t tempSize = 20; char sOffset[tempSize], sSize[tempSize], sPad[tempSize]; diff --git a/IccXML/IccLibXML/IccMpeXml.cpp b/IccXML/IccLibXML/IccMpeXml.cpp index 9a9f43907..9371f9538 100644 --- a/IccXML/IccLibXML/IccMpeXml.cpp +++ b/IccXML/IccLibXML/IccMpeXml.cpp @@ -1822,7 +1822,7 @@ bool CIccMpeXmlTintArray::ParseXml(xmlNode *pNode, std::string &parseStr) CIccToneMapFunc* CIccXmlToneMapFunc::NewCopy() const { - CIccToneMapFunc* rv = new CIccXmlToneMapFunc(); + CIccToneMapFunc* rv = new (std::nothrow) CIccXmlToneMapFunc(); if (rv) *rv = *this; From b773f7e0dd45e87efc805653b1f3d4a6757144f8 Mon Sep 17 00:00:00 2001 From: ChrisCoxArt Date: Wed, 20 May 2026 15:26:07 -0700 Subject: [PATCH 2/8] removing guarded frees part of #1063 --- IccProfLib/IccCmm.cpp | 15 ++--- IccProfLib/IccMpeACS.cpp | 6 +- IccProfLib/IccMpeBasic.cpp | 114 +++++++++++--------------------- IccProfLib/IccMpeCalc.cpp | 21 ++---- IccProfLib/IccMpeSpectral.cpp | 59 ++++++----------- IccProfLib/IccTagBasic.cpp | 92 +++++++++----------------- IccProfLib/IccTagLut.cpp | 24 +++---- IccProfLib/IccTagMPE.cpp | 58 +++++++--------- IccProfLib/IccUtil.cpp | 2 +- IccXML/IccLibXML/IccMpeXml.cpp | 14 ++-- IccXML/IccLibXML/IccUtilXml.cpp | 8 +-- 11 files changed, 138 insertions(+), 275 deletions(-) diff --git a/IccProfLib/IccCmm.cpp b/IccProfLib/IccCmm.cpp index 7c25d2e4a..b6fa004b6 100644 --- a/IccProfLib/IccCmm.cpp +++ b/IccProfLib/IccCmm.cpp @@ -7818,14 +7818,10 @@ CIccApplyCmm::~CIccApplyCmm() // if (m_pPCS) // delete m_pPCS; - if (m_Pixel) - free(m_Pixel); - if (m_Pixel2) - free(m_Pixel2); - if (m_ChunkBuf[0]) - free(m_ChunkBuf[0]); - if (m_ChunkBuf[1]) - free(m_ChunkBuf[1]); + free(m_Pixel); + free(m_Pixel2); + free(m_ChunkBuf[0]); + free(m_ChunkBuf[1]); } // Chunk size for transform-sequential multi-pixel apply (pixels per batch). @@ -11305,8 +11301,7 @@ CIccMruCache::~CIccMruCache() if (m_cache) delete[] m_cache; - if (m_pixelData) - free(m_pixelData); + free(m_pixelData); } /** diff --git a/IccProfLib/IccMpeACS.cpp b/IccProfLib/IccMpeACS.cpp index 8dcf34cf6..62bab9d8e 100644 --- a/IccProfLib/IccMpeACS.cpp +++ b/IccProfLib/IccMpeACS.cpp @@ -110,8 +110,7 @@ CIccMpeAcs::CIccMpeAcs() ******************************************************************************/ CIccMpeAcs::~CIccMpeAcs() { - if (m_pData) - free(m_pData); + free(m_pData); } /** @@ -304,8 +303,7 @@ icValidateStatus CIccMpeAcs::Validate(std::string sigPath, std::string &sReport, ******************************************************************************/ bool CIccMpeAcs::AllocData(size_t size) { - if (m_pData) - free(m_pData); + free(m_pData); if (size) { m_pData = (icUInt8Number*)malloc(size); diff --git a/IccProfLib/IccMpeBasic.cpp b/IccProfLib/IccMpeBasic.cpp index 2df0799f5..9b89b1721 100644 --- a/IccProfLib/IccMpeBasic.cpp +++ b/IccProfLib/IccMpeBasic.cpp @@ -153,8 +153,7 @@ CIccFormulaCurveSegment::CIccFormulaCurveSegment(const CIccFormulaCurveSegment & ******************************************************************************/ CIccFormulaCurveSegment &CIccFormulaCurveSegment::operator=(const CIccFormulaCurveSegment &seg) { - if (m_params) - free(m_params); + free(m_params); m_nReserved = seg.m_nReserved; m_nReserved2 = seg.m_nReserved2; @@ -187,9 +186,7 @@ CIccFormulaCurveSegment &CIccFormulaCurveSegment::operator=(const CIccFormulaCur ******************************************************************************/ CIccFormulaCurveSegment::~CIccFormulaCurveSegment() { - if (m_params) { - free(m_params); - } + free(m_params); } /** @@ -339,8 +336,7 @@ void CIccFormulaCurveSegment::Describe(std::string &sDescription, int /* nVerbos ******************************************************************************/ void CIccFormulaCurveSegment::SetFunction(icUInt16Number functionType, icUInt8Number num_parameters, icFloatNumber *parameters) { - if (m_params) - free(m_params); + free(m_params); if (num_parameters) { m_params = (icFloatNumber*)malloc(num_parameters * sizeof(icFloatNumber)); @@ -392,10 +388,8 @@ bool CIccFormulaCurveSegment::Read(size_t size, CIccIO *pIO) if (!pIO->Read16(&m_nReserved2)) return false; - if (m_params) { - free(m_params); - m_params = NULL; - } + free(m_params); + m_params = NULL; switch(m_nFunctionType) { case 0x0000: @@ -926,8 +920,7 @@ CIccSampledCurveSegment::CIccSampledCurveSegment(const CIccSampledCurveSegment & ******************************************************************************/ CIccSampledCurveSegment &CIccSampledCurveSegment::operator=(const CIccSampledCurveSegment &curve) { - if (m_pSamples) - free(m_pSamples); + free(m_pSamples); m_nReserved = curve.m_nReserved; m_startPoint = curve.m_startPoint; @@ -962,8 +955,7 @@ CIccSampledCurveSegment &CIccSampledCurveSegment::operator=(const CIccSampledCur ******************************************************************************/ CIccSampledCurveSegment::~CIccSampledCurveSegment() { - if (m_pSamples) - free(m_pSamples); + free(m_pSamples); } /** @@ -986,18 +978,14 @@ CIccSampledCurveSegment::~CIccSampledCurveSegment() ******************************************************************************/ bool CIccSampledCurveSegment::SetSize(icUInt32Number nCount, bool bZeroAlloc/*=true*/) { + free(m_pSamples); + m_pSamples = NULL; + if (!nCount) { - if (m_pSamples) - free(m_pSamples); - m_pSamples = NULL; m_nCount = nCount; return true; } - if (m_pSamples) { - free(m_pSamples); - } - if (bZeroAlloc) m_pSamples = (icFloatNumber*)calloc(nCount, sizeof(icFloatNumber)); else @@ -1366,8 +1354,7 @@ CIccSingleSampledCurve::CIccSingleSampledCurve(const CIccSingleSampledCurve &cur ******************************************************************************/ CIccSingleSampledCurve &CIccSingleSampledCurve::operator=(const CIccSingleSampledCurve &curve) { - if (m_pSamples) - free(m_pSamples); + free(m_pSamples); m_nReserved = curve.m_nReserved; m_nCount = curve.m_nCount; @@ -1410,8 +1397,7 @@ CIccSingleSampledCurve &CIccSingleSampledCurve::operator=(const CIccSingleSample ******************************************************************************/ CIccSingleSampledCurve::~CIccSingleSampledCurve() { - if (m_pSamples) - free(m_pSamples); + free(m_pSamples); } /** @@ -1507,18 +1493,14 @@ bool CIccSingleSampledCurve::SetStorageType(icUInt16Number nStorateType) ******************************************************************************/ bool CIccSingleSampledCurve::SetSize(icUInt32Number nCount, bool bZeroAlloc/*=true*/) { + free(m_pSamples); + m_pSamples = NULL; + if (!nCount) { - if (m_pSamples) - free(m_pSamples); - m_pSamples = NULL; m_nCount = nCount; return true; } - if (m_pSamples) { - free(m_pSamples); - } - if (bZeroAlloc) m_pSamples = (icFloatNumber*)calloc(nCount, sizeof(icFloatNumber)); else @@ -2032,8 +2014,7 @@ CIccSampledCalculatorCurve &CIccSampledCalculatorCurve::operator=(const CIccSamp delete m_pCalc; } - if (m_pSamples) - free(m_pSamples); + free(m_pSamples); m_nReserved = curve.m_nReserved; m_nReserved2 = curve.m_nReserved2; @@ -2087,8 +2068,7 @@ CIccSampledCalculatorCurve &CIccSampledCalculatorCurve::operator=(const CIccSamp ******************************************************************************/ CIccSampledCalculatorCurve::~CIccSampledCalculatorCurve() { - if (m_pSamples) - free(m_pSamples); + free(m_pSamples); if (m_pCalc) { m_pCalc->SetParentObject(nullptr); @@ -2215,18 +2195,14 @@ bool CIccSampledCalculatorCurve::SetRecommendedSize(icUInt32Number nSize) ******************************************************************************/ bool CIccSampledCalculatorCurve::SetSize(icUInt32Number nCount, bool bZeroAlloc/*=true*/) { + free(m_pSamples); + m_pSamples = NULL; + if (nCount<2) { - if (m_pSamples) - free(m_pSamples); - m_pSamples = NULL; m_nCount = nCount; return nCount == 0; } - if (m_pSamples) { - free(m_pSamples); - } - if (bZeroAlloc) m_pSamples = (icFloatNumber*)calloc(nCount, sizeof(icFloatNumber)); else @@ -3132,9 +3108,7 @@ CIccMpeCurveSet &CIccMpeCurveSet::operator=(const CIccMpeCurveSet &curveSet) { m_nReserved = curveSet.m_nReserved; - if (m_curve) { - free(m_curve); - } + free(m_curve); if (curveSet.m_nInputChannels) { int i; @@ -3205,10 +3179,9 @@ bool CIccMpeCurveSet::SetSize(int nNewSize) free(m_curve); m_curve = NULL; } - if (m_position) { - free(m_position); - m_position = NULL; - } + + free(m_position); + m_position = NULL; if (nNewSize) { m_curve = (icCurveSetCurvePtr*)calloc(nNewSize, sizeof(icCurveSetCurvePtr)); @@ -4001,8 +3974,7 @@ CIccToneMapFunc::CIccToneMapFunc() CIccToneMapFunc::~CIccToneMapFunc() { - if (m_params) - free(m_params); + free(m_params); } CIccToneMapFunc& CIccToneMapFunc::operator=(const CIccToneMapFunc& toneMapFunc) @@ -4013,8 +3985,7 @@ CIccToneMapFunc& CIccToneMapFunc::operator=(const CIccToneMapFunc& toneMapFunc) m_nFunctionType = toneMapFunc.m_nFunctionType; m_nParameters = toneMapFunc.m_nParameters; - if (m_params) - free(m_params); + free(m_params); if (toneMapFunc.m_nParameters && toneMapFunc.m_params) { m_params = (icFloatNumber*)malloc(m_nParameters * sizeof(icFloatNumber)); if (m_params) @@ -4050,8 +4021,7 @@ bool CIccToneMapFunc::SetFunction(icUInt16Number nFunc, icUInt8Number nParams, i { m_nFunctionType = nFunc; - if (m_params) - free(m_params); + free(m_params); int nArgs = NumArgs(); m_nParameters = (icUInt8Number)icIntMin(nParams, NumArgs()); @@ -4122,9 +4092,7 @@ bool CIccToneMapFunc::Read(icUInt32Number size, CIccIO* pIO) if (!pIO->Read16(&m_nReserved2)) return false; - if (m_params) { - free(m_params); - } + free(m_params); m_nParameters = (icUInt8Number)((size - headerSize)/sizeof(icFloatNumber)); @@ -5024,8 +4992,7 @@ CIccMpeMatrix &CIccMpeMatrix::operator=(const CIccMpeMatrix &matrix) m_nInputChannels = matrix.m_nInputChannels; m_nOutputChannels = matrix.m_nOutputChannels; - if (m_pMatrix) - free(m_pMatrix); + free(m_pMatrix); m_size = matrix.m_size; if (matrix.m_pMatrix) { @@ -5036,8 +5003,7 @@ CIccMpeMatrix &CIccMpeMatrix::operator=(const CIccMpeMatrix &matrix) else m_pMatrix = NULL; - if (m_pConstants) - free(m_pConstants); + free(m_pConstants); if (matrix.m_pConstants) { int num = m_nOutputChannels*sizeof(icFloatNumber); @@ -5064,11 +5030,8 @@ CIccMpeMatrix &CIccMpeMatrix::operator=(const CIccMpeMatrix &matrix) ******************************************************************************/ CIccMpeMatrix::~CIccMpeMatrix() { - if (m_pMatrix) - free(m_pMatrix); - - if (m_pConstants) - free(m_pConstants); + free(m_pMatrix); + free(m_pConstants); } /** @@ -5083,14 +5046,11 @@ CIccMpeMatrix::~CIccMpeMatrix() ******************************************************************************/ bool CIccMpeMatrix::SetSize(icUInt16Number nInputChannels, icUInt16Number nOutputChannels, bool bUseConstants) { - if (m_pMatrix) { - free(m_pMatrix); - m_pMatrix = NULL; - } - if (m_pConstants) { - free(m_pConstants); - m_pConstants = NULL; - } + free(m_pMatrix); + m_pMatrix = NULL; + + free(m_pConstants); + m_pConstants = NULL; m_size = (icUInt32Number)nInputChannels * nOutputChannels; diff --git a/IccProfLib/IccMpeCalc.cpp b/IccProfLib/IccMpeCalc.cpp index 818fb4d60..71aea588a 100644 --- a/IccProfLib/IccMpeCalc.cpp +++ b/IccProfLib/IccMpeCalc.cpp @@ -2981,8 +2981,7 @@ CIccCalculatorFunc &CIccCalculatorFunc::operator=(const CIccCalculatorFunc &func m_nReserved= func.m_nReserved; - if (m_Op) - free(m_Op); + free(m_Op); m_nOps = func.m_nOps; @@ -3008,9 +3007,7 @@ CIccCalculatorFunc &CIccCalculatorFunc::operator=(const CIccCalculatorFunc &func ******************************************************************************/ CIccCalculatorFunc::~CIccCalculatorFunc() { - if (m_Op) { - free(m_Op); - } + free(m_Op); } void CIccCalculatorFunc::InsertBlanks(std::string &sDescription, int nBlanks) @@ -3489,10 +3486,8 @@ icFuncParseStatus CIccCalculatorFunc::SetFunction(const char *szFuncDef, std::st ******************************************************************************/ icFuncParseStatus CIccCalculatorFunc::SetFunction(CIccCalcOpList &opList, std::string &sReport) { - if (m_Op) { - free(m_Op); - m_Op = NULL; - } + free(m_Op); + m_Op = NULL; m_nOps = (icUInt32Number)opList.size(); @@ -3556,9 +3551,7 @@ bool CIccCalculatorFunc::Read(icUInt32Number size, CIccIO *pIO) if ((icUInt64Number)m_nOps * sizeof(icUInt32Number) * 2 > (icUInt64Number)size - headerSize) return false; - if (m_Op) { - free(m_Op); - } + free(m_Op); if (m_nOps) { m_Op = (SIccCalcOp*)calloc(m_nOps, sizeof(SIccCalcOp)); @@ -5377,9 +5370,7 @@ CIccApplyMpeCalculator::~CIccApplyMpeCalculator() delete m_scratch; } - if (m_temp) { - free(m_temp); - } + free(m_temp); icUInt32Number i; diff --git a/IccProfLib/IccMpeSpectral.cpp b/IccProfLib/IccMpeSpectral.cpp index 69957d8f8..49c4af774 100644 --- a/IccProfLib/IccMpeSpectral.cpp +++ b/IccProfLib/IccMpeSpectral.cpp @@ -185,8 +185,7 @@ void CIccMpeSpectralMatrix::copyData(const CIccMpeSpectralMatrix &matrix) m_Range = matrix.m_Range; - if (m_pMatrix) - free(m_pMatrix); + free(m_pMatrix); m_size = matrix.m_size; if (matrix.m_pMatrix) { @@ -197,8 +196,7 @@ void CIccMpeSpectralMatrix::copyData(const CIccMpeSpectralMatrix &matrix) else m_pMatrix = NULL; - if (m_pOffset) - free(m_pOffset); + free(m_pOffset); if (matrix.m_pOffset) { int num = m_Range.steps * sizeof(icFloatNumber); @@ -208,8 +206,7 @@ void CIccMpeSpectralMatrix::copyData(const CIccMpeSpectralMatrix &matrix) else m_pOffset = NULL; - if (m_pWhite) - free(m_pWhite); + free(m_pWhite); if (matrix.m_pWhite) { int num = m_Range.steps * sizeof(icFloatNumber); @@ -234,14 +231,9 @@ void CIccMpeSpectralMatrix::copyData(const CIccMpeSpectralMatrix &matrix) ******************************************************************************/ CIccMpeSpectralMatrix::~CIccMpeSpectralMatrix() { - if (m_pMatrix) - free(m_pMatrix); - - if (m_pOffset) - free(m_pOffset); - - if (m_pWhite) - free(m_pWhite); + free(m_pMatrix); + free(m_pOffset); + free(m_pWhite); if (m_pApplyMtx) delete m_pApplyMtx; @@ -260,20 +252,14 @@ CIccMpeSpectralMatrix::~CIccMpeSpectralMatrix() ******************************************************************************/ bool CIccMpeSpectralMatrix::SetSize(icUInt16Number nInputChannels, icUInt16Number nOutputChannels, const icSpectralRange &range) { - if (m_pMatrix) { - free(m_pMatrix); - m_pMatrix = NULL; - } + free(m_pMatrix); + m_pMatrix = NULL; - if (m_pWhite) { - free(m_pWhite); - m_pWhite = NULL; - } + free(m_pWhite); + m_pWhite = NULL; - if (m_pOffset) { - free(m_pOffset); - m_pOffset = NULL; - } + free(m_pOffset); + m_pOffset = NULL; if (m_pApplyMtx) { delete m_pApplyMtx; @@ -884,8 +870,7 @@ void CIccMpeSpectralCLUT::copyData(const CIccMpeSpectralCLUT &clut) if (m_pApplyCLUT) delete m_pApplyCLUT; - if (m_pWhite) - free(m_pWhite); + free(m_pWhite); if (clut.m_pCLUT) m_pCLUT = new CIccCLUT(*clut.m_pCLUT); @@ -931,8 +916,7 @@ CIccMpeSpectralCLUT::~CIccMpeSpectralCLUT() if (m_pApplyCLUT) delete m_pApplyCLUT; - if (m_pWhite) - free(m_pWhite); + free(m_pWhite); } @@ -969,8 +953,7 @@ void CIccMpeSpectralCLUT::SetData(CIccCLUT *pCLUT, icUInt16Number nStorageType, m_Range = range; - if (m_pWhite) - free(m_pWhite); + free(m_pWhite); m_pWhite = pWhite; } @@ -1738,8 +1721,7 @@ void CIccMpeSpectralObserver::copyData(const CIccMpeSpectralObserver &matrix) m_Range = matrix.m_Range; - if (m_pWhite) - free(m_pWhite); + free(m_pWhite); if (matrix.m_pWhite) { int num = m_Range.steps*sizeof(icFloatNumber); @@ -1764,8 +1746,7 @@ void CIccMpeSpectralObserver::copyData(const CIccMpeSpectralObserver &matrix) ******************************************************************************/ CIccMpeSpectralObserver::~CIccMpeSpectralObserver() { - if (m_pWhite) - free(m_pWhite); + free(m_pWhite); if (m_pApplyMtx) delete m_pApplyMtx; @@ -1784,10 +1765,8 @@ CIccMpeSpectralObserver::~CIccMpeSpectralObserver() ******************************************************************************/ bool CIccMpeSpectralObserver::SetSize(icUInt16Number nInputChannels, icUInt16Number nOutputChannels, const icSpectralRange &range) { - if (m_pWhite) { - free(m_pWhite); - m_pWhite = NULL; - } + free(m_pWhite); + m_pWhite = NULL; if (m_pApplyMtx) { delete m_pApplyMtx; diff --git a/IccProfLib/IccTagBasic.cpp b/IccProfLib/IccTagBasic.cpp index f38a6d6a3..c443aae06 100644 --- a/IccProfLib/IccTagBasic.cpp +++ b/IccProfLib/IccTagBasic.cpp @@ -1321,8 +1321,7 @@ CIccTagZipUtf8Text &CIccTagZipUtf8Text::operator=(const CIccTagZipUtf8Text &ITT) */ CIccTagZipUtf8Text::~CIccTagZipUtf8Text() { - if (m_pZipBuf) - free(m_pZipBuf); + free(m_pZipBuf); } /** @@ -1632,10 +1631,8 @@ icUChar *CIccTagZipUtf8Text::AllocBuffer(icUInt32Number nSize) { if (m_nBufSize != nSize) { if (!nSize) { - if (m_pZipBuf) { - free(m_pZipBuf); - m_pZipBuf = NULL; - } + free(m_pZipBuf); + m_pZipBuf = NULL; m_nBufSize = nSize; return NULL; @@ -1647,7 +1644,6 @@ icUChar *CIccTagZipUtf8Text::AllocBuffer(icUInt32Number nSize) m_pZipBuf = (icUChar*)icRealloc(m_pZipBuf, nSize); m_nBufSize = nSize; - } return m_pZipBuf; @@ -2216,8 +2212,7 @@ CIccTagTextDescription &CIccTagTextDescription::operator=(const CIccTagTextDescr m_nScriptSize = TextDescTag.m_nScriptSize; m_nScriptCode = TextDescTag.m_nScriptCode; - if (m_szText) - free(m_szText); + free(m_szText); if (m_nASCIISize) { m_szText = (icChar*)calloc(m_nASCIISize, sizeof(icChar)); memcpy(m_szText, TextDescTag.m_szText, m_nASCIISize*sizeof(icChar)); @@ -2228,8 +2223,7 @@ CIccTagTextDescription &CIccTagTextDescription::operator=(const CIccTagTextDescr m_szText[0] = '\0'; } - if (m_uzUnicodeText) - free(m_uzUnicodeText); + free(m_uzUnicodeText); if (m_nUnicodeSize) { m_uzUnicodeText = (icUInt16Number*)calloc(m_nUnicodeSize, sizeof(icUInt16Number)); memcpy(m_uzUnicodeText, TextDescTag.m_uzUnicodeText, m_nUnicodeSize*sizeof(icUInt16Number)); @@ -2994,8 +2988,7 @@ CIccTagNamedColor2 &CIccTagNamedColor2::operator=(const CIccTagNamedColor2 &Name memcpy(m_szPrefix, NamedColor2Tag.m_szPrefix, sizeof(m_szPrefix)); memcpy(m_szSufix, NamedColor2Tag.m_szSufix, sizeof(m_szSufix)); - if (m_NamedColor) - free(m_NamedColor); + free(m_NamedColor); m_NamedColor = (SIccNamedColorEntry*)calloc(m_nSize, m_nColorEntrySize); memcpy(m_NamedColor, NamedColor2Tag.m_NamedColor, (size_t)m_nColorEntrySize*m_nSize); @@ -3015,8 +3008,7 @@ CIccTagNamedColor2 &CIccTagNamedColor2::operator=(const CIccTagNamedColor2 &Name */ CIccTagNamedColor2::~CIccTagNamedColor2() { - if (m_NamedColor) - free(m_NamedColor); + free(m_NamedColor); if (m_NamedLab) delete [] m_NamedLab; @@ -3807,8 +3799,7 @@ CIccTagXYZ &CIccTagXYZ::operator=(const CIccTagXYZ &XYZTag) m_nSize = XYZTag.m_nSize; - if (m_XYZ) - free(m_XYZ); + free(m_XYZ); m_XYZ = (icXYZNumber*)calloc(m_nSize, sizeof(icXYZNumber)); memcpy(m_XYZ, XYZTag.m_XYZ, sizeof(icXYZNumber)*m_nSize); @@ -3826,8 +3817,7 @@ CIccTagXYZ &CIccTagXYZ::operator=(const CIccTagXYZ &XYZTag) */ CIccTagXYZ::~CIccTagXYZ() { - if (m_XYZ) - free(m_XYZ); + free(m_XYZ); } @@ -4069,8 +4059,7 @@ CIccTagChromaticity &CIccTagChromaticity::operator=(const CIccTagChromaticity &C m_nChannels = ChromTag.m_nChannels; - if (m_xy) - free(m_xy); + free(m_xy); m_xy = (icChromaticityNumber*)calloc(m_nChannels, sizeof(icChromaticityNumber)); memcpy(m_xy, ChromTag.m_xy, sizeof(icChromaticityNumber)*m_nChannels); @@ -4088,8 +4077,7 @@ CIccTagChromaticity &CIccTagChromaticity::operator=(const CIccTagChromaticity &C */ CIccTagChromaticity::~CIccTagChromaticity() { - if (m_xy) - free(m_xy); + free(m_xy); } @@ -4737,8 +4725,7 @@ CIccTagSparseMatrixArray &CIccTagSparseMatrixArray::operator=(const CIccTagSpars m_nSize = ITSMA.m_nSize; m_nChannelsPerMatrix = ITSMA.m_nChannelsPerMatrix; - if (m_RawData) - free(m_RawData); + free(m_RawData); m_RawData = (icUInt8Number*)calloc(m_nSize, GetBytesPerMatrix()); memcpy(m_RawData, ITSMA.m_RawData, (size_t)m_nSize*GetBytesPerMatrix()); @@ -4759,8 +4746,7 @@ CIccTagSparseMatrixArray &CIccTagSparseMatrixArray::operator=(const CIccTagSpars */ CIccTagSparseMatrixArray::~CIccTagSparseMatrixArray() { - if (m_RawData) - free(m_RawData); + free(m_RawData); } @@ -5557,8 +5543,7 @@ CIccTagFixedNum &CIccTagFixedNum::operator=(const CIccTagFixed m_nSize = ITFN.m_nSize; - if (m_Num) - free(m_Num); + free(m_Num); m_Num = (T*)calloc(m_nSize, sizeof(T)); memcpy(m_Num, ITFN.m_Num, m_nSize*sizeof(T)); @@ -5578,8 +5563,7 @@ CIccTagFixedNum &CIccTagFixedNum::operator=(const CIccTagFixed template CIccTagFixedNum::~CIccTagFixedNum() { - if (m_Num) - free(m_Num); + free(m_Num); } /** @@ -6038,8 +6022,7 @@ CIccTagNum &CIccTagNum::operator=(const CIccTagNum &I template CIccTagNum::~CIccTagNum() { - if (m_Num) - free(m_Num); + free(m_Num); } /** @@ -6652,8 +6635,7 @@ CIccTagFloatNum &CIccTagFloatNum::operator=(const CIccTagFloat template CIccTagFloatNum::~CIccTagFloatNum() { - if (m_Num) - free(m_Num); + free(m_Num); } /** @@ -7408,8 +7390,7 @@ CIccLocalizedUnicode &CIccLocalizedUnicode::operator=(const CIccLocalizedUnicode */ CIccLocalizedUnicode::~CIccLocalizedUnicode() { - if (m_pBuf) - free(m_pBuf); + free(m_pBuf); } static bool icIsValidUtf16(const icUInt16Number *pBuf, icUInt32Number nLength) @@ -8366,8 +8347,7 @@ CIccTagData &CIccTagData::operator=(const CIccTagData &DataTag) m_nDataFlag = DataTag.m_nDataFlag; m_nSize = DataTag.m_nSize; - if (m_pData) - free(m_pData); + free(m_pData); m_pData = (icUInt8Number*)calloc(m_nSize, sizeof(icUInt8Number)); memcpy(m_pData, DataTag.m_pData, sizeof(icUInt8Number)*m_nSize); @@ -8385,8 +8365,7 @@ CIccTagData &CIccTagData::operator=(const CIccTagData &DataTag) */ CIccTagData::~CIccTagData() { - if (m_pData) - free(m_pData); + free(m_pData); } @@ -8888,8 +8867,7 @@ CIccTagColorantOrder &CIccTagColorantOrder::operator=(const CIccTagColorantOrder m_nCount = ColorantOrderTag.m_nCount; - if (m_pData) - free(m_pData); + free(m_pData); m_pData = (icUInt8Number*)calloc(m_nCount, sizeof(icUInt8Number)); memcpy(m_pData, ColorantOrderTag.m_pData, sizeof(icUInt8Number)*m_nCount); @@ -8907,8 +8885,7 @@ CIccTagColorantOrder &CIccTagColorantOrder::operator=(const CIccTagColorantOrder */ CIccTagColorantOrder::~CIccTagColorantOrder() { - if (m_pData) - free(m_pData); + free(m_pData); } @@ -9162,8 +9139,7 @@ CIccTagColorantTable &CIccTagColorantTable::operator=(const CIccTagColorantTable m_PCS = ColorantTableTag.m_PCS; m_nCount = ColorantTableTag.m_nCount; - if (m_pData) - free(m_pData); + free(m_pData); m_pData = (icColorantTableEntry*)calloc(m_nCount, sizeof(icColorantTableEntry)); memcpy(m_pData, ColorantTableTag.m_pData, m_nCount*sizeof(icColorantTableEntry)); @@ -9181,8 +9157,7 @@ CIccTagColorantTable &CIccTagColorantTable::operator=(const CIccTagColorantTable */ CIccTagColorantTable::~CIccTagColorantTable() { - if (m_pData) - free(m_pData); + free(m_pData); } @@ -10390,9 +10365,7 @@ CIccResponseCurveStruct &CIccResponseCurveStruct::operator=(const CIccResponseCu m_nChannels = RespCurveStruct.m_nChannels; m_measurementUnitSig = RespCurveStruct.m_measurementUnitSig; - if (m_maxColorantXYZ) - free(m_maxColorantXYZ); - + free(m_maxColorantXYZ); m_maxColorantXYZ = (icXYZNumber*)calloc(m_nChannels, sizeof(icXYZNumber)); memcpy(m_maxColorantXYZ, RespCurveStruct.m_maxColorantXYZ, m_nChannels*sizeof(icXYZNumber)); @@ -10416,8 +10389,7 @@ CIccResponseCurveStruct &CIccResponseCurveStruct::operator=(const CIccResponseCu */ CIccResponseCurveStruct::~CIccResponseCurveStruct() { - if (m_maxColorantXYZ) - free(m_maxColorantXYZ); + free(m_maxColorantXYZ); if (m_Response16ListArray) delete [] m_Response16ListArray; @@ -12282,8 +12254,7 @@ CIccTagEmbeddedHeightImage &CIccTagEmbeddedHeightImage::operator=(const CIccTagE m_fMetersMaxPixelValue = HeightImageTag.m_fMetersMaxPixelValue; m_nSize = HeightImageTag.m_nSize; - if (m_pData) - free(m_pData); + free(m_pData); m_pData = (icUInt8Number*)calloc(m_nSize, sizeof(icUInt8Number)); memcpy(m_pData, HeightImageTag.m_pData, sizeof(icUInt8Number)*m_nSize); @@ -12301,8 +12272,7 @@ CIccTagEmbeddedHeightImage &CIccTagEmbeddedHeightImage::operator=(const CIccTagE */ CIccTagEmbeddedHeightImage::~CIccTagEmbeddedHeightImage() { - if (m_pData) - free(m_pData); + free(m_pData); } @@ -12599,8 +12569,7 @@ CIccTagEmbeddedNormalImage &CIccTagEmbeddedNormalImage::operator=(const CIccTagE m_nEncodingFormat = NormalImageTag.m_nEncodingFormat; m_nSize = NormalImageTag.m_nSize; - if (m_pData) - free(m_pData); + free(m_pData); m_pData = (icUInt8Number*)calloc(m_nSize, sizeof(icUInt8Number)); memcpy(m_pData, NormalImageTag.m_pData, sizeof(icUInt8Number)*m_nSize); @@ -12618,8 +12587,7 @@ CIccTagEmbeddedNormalImage &CIccTagEmbeddedNormalImage::operator=(const CIccTagE */ CIccTagEmbeddedNormalImage::~CIccTagEmbeddedNormalImage() { - if (m_pData) - free(m_pData); + free(m_pData); } diff --git a/IccProfLib/IccTagLut.cpp b/IccProfLib/IccTagLut.cpp index ab98805b7..95301145e 100644 --- a/IccProfLib/IccTagLut.cpp +++ b/IccProfLib/IccTagLut.cpp @@ -198,8 +198,7 @@ CIccTagCurve &CIccTagCurve::operator=(const CIccTagCurve &CurveTag) m_nSize = CurveTag.m_nSize; m_nMaxIndex = CurveTag.m_nMaxIndex; - if (m_Curve) - free(m_Curve); + free(m_Curve); m_Curve = NULL; if (m_nSize > 0) { @@ -221,8 +220,7 @@ CIccTagCurve &CIccTagCurve::operator=(const CIccTagCurve &CurveTag) */ CIccTagCurve::~CIccTagCurve() { - if (m_Curve) - free(m_Curve); + free(m_Curve); } @@ -459,10 +457,8 @@ bool CIccTagCurve::SetSize(icUInt32Number nSize, icTagCurveSizeInit nSizeOpt/*=i return true; if (!nSize) { - if (m_Curve) { - free(m_Curve); - m_Curve = NULL; - } + free(m_Curve); + m_Curve = NULL; m_nSize = 0; return true; } @@ -1691,14 +1687,10 @@ CIccApplyCLUT::CIccApplyCLUT() */ CIccApplyCLUT::~CIccApplyCLUT() { - if (m_df) - free(m_df); - if (m_s) - free(m_s); - if (m_g) - free(m_g); - if (m_ig) - free(m_ig); + free(m_df); + free(m_s); + free(m_g); + free(m_ig); } diff --git a/IccProfLib/IccTagMPE.cpp b/IccProfLib/IccTagMPE.cpp index 0badf2a40..85d50c35f 100644 --- a/IccProfLib/IccTagMPE.cpp +++ b/IccProfLib/IccTagMPE.cpp @@ -208,23 +208,22 @@ CIccMpeUnknown::CIccMpeUnknown(const CIccMpeUnknown &elem) ******************************************************************************/ CIccMpeUnknown &CIccMpeUnknown::operator=(const CIccMpeUnknown &elem) { - if (m_pData) - free(m_pData); + free(m_pData); - m_sig = elem.m_sig; - m_nReserved = elem.m_nReserved; - m_nInputChannels = elem.m_nInputChannels; - m_nOutputChannels = elem.m_nOutputChannels; - m_nSize = elem.m_nSize; - if (m_nSize) { - m_pData = (icUInt8Number*)malloc(m_nSize); - if (m_pData) + m_sig = elem.m_sig; + m_nReserved = elem.m_nReserved; + m_nInputChannels = elem.m_nInputChannels; + m_nOutputChannels = elem.m_nOutputChannels; + m_nSize = elem.m_nSize; + if (m_nSize) { + m_pData = (icUInt8Number*)malloc(m_nSize); + if (m_pData) memcpy(m_pData, elem.m_pData, m_nSize); - } - else - m_pData = NULL; + } + else + m_pData = NULL; - return (*this); + return (*this); } /** @@ -239,8 +238,7 @@ CIccMpeUnknown &CIccMpeUnknown::operator=(const CIccMpeUnknown &elem) ******************************************************************************/ CIccMpeUnknown::~CIccMpeUnknown() { - if (m_pData) - free(m_pData); + free(m_pData); } /** @@ -313,8 +311,7 @@ void CIccMpeUnknown::Describe(std::string &sDescription, int nVerboseness) bool CIccMpeUnknown::SetDataSize(icUInt32Number nSize, bool /* bZeroData =true */) { bool rv = true; - if (m_pData) - free(m_pData); + free(m_pData); // Prevent excessive allocation - limit to 256MB for unknown MPE data const icUInt32Number MAX_MPE_UNKNOWN_SIZE = 268435456; // 256 MB @@ -588,14 +585,12 @@ CIccDblPixelBuffer::~CIccDblPixelBuffer() ******************************************************************************/ void CIccDblPixelBuffer::Clean() { - if (m_pixelBuf1) { - free(m_pixelBuf1); - m_pixelBuf1 = NULL; - } - if (m_pixelBuf2) { - free(m_pixelBuf2); - m_pixelBuf2 = NULL; - } + free(m_pixelBuf1); + m_pixelBuf1 = NULL; + + free(m_pixelBuf2); + m_pixelBuf2 = NULL; + m_nMaxChannels = 0; m_nLastNumChannels = 0; } @@ -858,10 +853,8 @@ void CIccTagMultiProcessElement::Clean() m_list = NULL; } - if (m_position) { - free(m_position); - m_position = NULL; - } + free(m_position); + m_position = NULL; m_nProcElements = 0; } @@ -1131,10 +1124,7 @@ bool CIccTagMultiProcessElement::Write(CIccIO *pIO) if (m_nProcElements) { size_t offsetPos = pIO->Tell(); - if (m_position) { - free(m_position); - } - + free(m_position); m_position = (icPositionNumber*)calloc(m_nProcElements, sizeof(icPositionNumber)); if (!m_position) diff --git a/IccProfLib/IccUtil.cpp b/IccProfLib/IccUtil.cpp index bf179d446..94d68aa47 100644 --- a/IccProfLib/IccUtil.cpp +++ b/IccProfLib/IccUtil.cpp @@ -124,7 +124,7 @@ ICCPROFLIB_API const char* icMsgValidateInformation = "Information - "; else nptr = malloc(size); - if (!nptr && ptr) + if (!nptr) free(ptr); return nptr; diff --git a/IccXML/IccLibXML/IccMpeXml.cpp b/IccXML/IccLibXML/IccMpeXml.cpp index 9371f9538..a4adefbae 100644 --- a/IccXML/IccLibXML/IccMpeXml.cpp +++ b/IccXML/IccLibXML/IccMpeXml.cpp @@ -306,9 +306,7 @@ bool CIccFormulaCurveSegmentXml::ParseXml(xmlNode *pNode, std::string &parseStr) if (args.GetSize()::CIccXmlArrayType() template CIccXmlArrayType::~CIccXmlArrayType() { - if (m_pBuf) { - free(m_pBuf); - } + free(m_pBuf); } template @@ -973,9 +971,7 @@ bool CIccXmlArrayType::ParseArray(T* pBuf, icUInt32Number nSize, xmlNod template bool CIccXmlArrayType::SetSize(icUInt32Number nSize) { - if (m_pBuf) { - free(m_pBuf); - } + free(m_pBuf); m_pBuf = (T*)malloc(nSize * sizeof(T)); if (!m_pBuf) { m_nSize = 0; From d32c4fda74a851e831ecffa6c5eb65455d7f1e76 Mon Sep 17 00:00:00 2001 From: ChrisCoxArt Date: Wed, 20 May 2026 15:45:37 -0700 Subject: [PATCH 3/8] JSON array size casts --- IccConnect/IccLibConnect/IccCmmConfig.cpp | 79 ++++++++++++----------- IccConnect/IccLibConnect/IccJsonUtil.cpp | 2 +- 2 files changed, 44 insertions(+), 37 deletions(-) diff --git a/IccConnect/IccLibConnect/IccCmmConfig.cpp b/IccConnect/IccLibConnect/IccCmmConfig.cpp index 1e0dc23ea..51e19923f 100644 --- a/IccConnect/IccLibConnect/IccCmmConfig.cpp +++ b/IccConnect/IccLibConnect/IccCmmConfig.cpp @@ -331,11 +331,11 @@ void CIccCfgDataApply::toJson(json& j) const j["srcSpace"] = icGetColorSigStr(buf, 30, m_srcSpace); } - if (m_srcFile.size()) + if (m_srcFile.size() != size_t(0)) j["srcFile"] = m_srcFile; jsonSetValue(j, "dstType", m_dstType); - if (m_dstFile.size()) + if (m_dstFile.size() != size_t(0)) j["dstFile"] = m_dstFile; if (m_dstEncoding != icEncodeValue) @@ -460,9 +460,9 @@ bool CIccCfgImageApply::fromJson(json j, bool bReset) void CIccCfgImageApply::toJson(json& j) const { - if (m_srcImgFile.size()) + if (m_srcImgFile.size() != size_t(0)) j["srcImageFile"] = m_srcImgFile; - if (m_dstImgFile.size()) + if (m_dstImgFile.size() != size_t(0)) j["dstImageFile"] = m_dstImgFile; if (m_dstEncoding != icEncode8Bit) @@ -599,7 +599,7 @@ bool CIccCfgCreateLink::fromJson(json j, bool bReset) void CIccCfgCreateLink::toJson(json& j) const { - if (m_linkFile.size()) + if (m_linkFile.size() != size_t(0)) j["linkFile"] = m_linkFile; switch (m_linkType) { @@ -778,7 +778,7 @@ static bool jsonFromEnvMap(json& j, const icCmmEnvSigMap& map) void CIccCfgProfile::toJson(json& j) const { - if (m_iccFile.size()) + if (m_iccFile.size() != size_t(0)) j["iccFile"] = m_iccFile; else j["iccFile"] = nullptr; @@ -788,7 +788,7 @@ void CIccCfgProfile::toJson(json& j) const json iccMap; if (jsonFromEnvMap(iccMap, m_iccEnvVars)) j["iccEnvVars"] = iccMap; - if (m_pccFile.size()) + if (m_pccFile.size() != size_t(0)) j["pccFile"] = m_pccFile; json pccMap; if (jsonFromEnvMap(pccMap, m_pccEnvVars)) @@ -1271,11 +1271,11 @@ bool CIccCfgSearchApply::fromJsonInit(json j) void CIccCfgSearchApply::toJson(json& j) const { - if (m_profiles.size()) + if (m_profiles.size() != size_t(0)) toJsonProfiles(j["profileSequence"]); if (m_bInitialized) toJsonInit(j["initial"]); - if (m_pccWeights.size()) + if (m_pccWeights.size() != size_t(0)) toJsonPccWeights(j["pccWeights"]); } @@ -1322,7 +1322,7 @@ class CIccIt8Parser while (!isEOF()) { int c = m_f->get(); if (c < 0) { - if (str.size()) + if (str.size() != size_t(0)) line.push_back(str); if (!line.size()) return false; @@ -1331,7 +1331,7 @@ class CIccIt8Parser else if (c == '\n' || c == '\r') { if (c == '\r' && m_f->peek() == '\n') m_f->get(); - if (str.size() || bHasField) + if ((str.size() != size_t(0)) || bHasField) line.push_back(str); break; } @@ -1349,7 +1349,7 @@ class CIccIt8Parser bool parseNextLine(std::vector& line) { while (parseLine(line)) { - if (line.size()) + if (line.size() != size_t(0)) return true; } return false; @@ -1558,6 +1558,8 @@ typedef std::vector icValueVector; static void setSampleIndex(std::vector& samples, int index, const char* szFmt, const char** szChannels) { + if (samples.size() < 1) + return; size_t nPos = samples.size() - 1; for (size_t i = 0; i < samples[nPos].size(); i++) { if (!strcmp(szFmt, szChannels[i])) { @@ -1702,9 +1704,11 @@ bool CIccCfgColorData::fromIt8(const char* filename, bool bReset) if (szFmt) { szFmt++; size_t nChannel = (size_t)atoi(szFmt); - size_t last = samples.size() - 1; - if (nChannel > 0 && samples[last].size() >= nChannel) { - samples[samples.size() - 1][nChannel - 1].nIndex = index; + if (samples.size() > 1) { + size_t last = samples.size() - 1; + if (nChannel > 0 && samples[last].size() >= nChannel) { + samples[samples.size() - 1][nChannel - 1].nIndex = index; + } } } } @@ -1830,7 +1834,10 @@ bool CIccCfgColorData::fromIt8(const char* filename, bool bReset) } } - if (pData->m_values.size() || pData->m_srcValues.size() || pData->m_name.size() || pData->m_srcName.size()) + if ( pData->m_values.size() != size_t(0) + || pData->m_srcValues.size() != size_t(0) + || pData->m_name.size() != size_t(0) + || pData->m_srcName.size() != size_t(0)) m_data.push_back(pData); else pData.reset(); @@ -1924,7 +1931,7 @@ bool CIccCfgColorData::toLegacy(const char* filename, const CIccCfgProfileArray CIccCfgProfile* pProf = pIter->get(); if (!pProf) continue; - if (pProf->m_pccFile.size()) { + if (pProf->m_pccFile.size() != size_t(0)) { fprintf(f, "; %s -PCC %s\n", pProf->m_iccFile.c_str(), pProf->m_pccFile.c_str()); } else { @@ -1938,13 +1945,13 @@ fprintf(f, "\n"); if (!pData) continue; - if (bShowDebug && pData->m_debugInfo.size()) { + if (bShowDebug && pData->m_debugInfo.size() != size_t(0)) { for (auto l = pData->m_debugInfo.begin(); l != pData->m_debugInfo.end(); l++) { fprintf(f, "; %s\n", l->c_str()); } } - if (pData->m_name.size()) { + if (pData->m_name.size() != size_t(0)) { fprintf(f, "{ \"%s\" }\t;", pData->m_name.c_str()); } else { @@ -1954,7 +1961,7 @@ fprintf(f, "\n"); fprintf(f, "\t;"); } - if (pData->m_srcName.size()) { + if (pData->m_srcName.size() != size_t(0)) { fprintf(f,"{ \"%s\" }", pData->m_srcName.c_str()); if (pData->m_srcValues.size() && pData->m_srcValues[0] != 1.0) { if (!writeFloat(pData->m_srcValues[0])) { if (f != stdout) fclose(f); return false; } @@ -2074,7 +2081,7 @@ void CIccCfgColorData::addFields(std::string& dataFormat, int& nFields, int& nSa bool CIccCfgColorData::toIt8(const char* filename, icUInt8Number nDigits, icUInt8Number nPrecision) { - if (!m_data.size()) + if (m_data.size() == size_t(0)) return false; FILE* f; @@ -2101,7 +2108,7 @@ bool CIccCfgColorData::toIt8(const char* filename, icUInt8Number nDigits, icUInt bShowIndex = true; } - if (pEntry->m_label.size()) { + if (pEntry->m_label.size() != size_t(0)) { if (nFields) dataFormat+="\t"; dataFormat += "SAMPLE_ID"; nFields++; @@ -2110,7 +2117,7 @@ bool CIccCfgColorData::toIt8(const char* filename, icUInt8Number nDigits, icUInt bool bSameSpace = spaceName(m_space) == spaceName(m_srcSpace); - if (pEntry->m_name.size()) { + if (pEntry->m_name.size() != size_t(0)) { if (nFields) dataFormat += "\t"; dataFormat += "NAME"; nFields++; @@ -2123,7 +2130,7 @@ bool CIccCfgColorData::toIt8(const char* filename, icUInt8Number nDigits, icUInt bShowValues = true; } - if (pEntry->m_srcName.size()) { + if (pEntry->m_srcName.size() != size_t(0)) { if (nFields) dataFormat += "\t"; if (bSameSpace) dataFormat += "SRC_"; @@ -2174,7 +2181,7 @@ bool CIccCfgColorData::toIt8(const char* filename, icUInt8Number nDigits, icUInt } if (bShowLabel) { - if (line.size()) line += "\t"; + if (line.size() != size_t(0)) line += "\t"; if (!pCurEntry->m_label.size()) line += "\"\""; else @@ -2182,7 +2189,7 @@ bool CIccCfgColorData::toIt8(const char* filename, icUInt8Number nDigits, icUInt } if (bShowName) { - if (line.size()) line += "\t"; + if (line.size() != size_t(0)) line += "\t"; if (!pCurEntry->m_name.size()) line += "\"\""; else @@ -2190,7 +2197,7 @@ bool CIccCfgColorData::toIt8(const char* filename, icUInt8Number nDigits, icUInt } if (bShowValues) { - if (line.size()) line += "\t"; + if (line.size() != size_t(0)) line += "\t"; for (size_t i = 0; i < (size_t)nDstSamples; i++) { icFloatNumber v = (i >= pCurEntry->m_values.size()) ? 0 : pCurEntry->m_values[i]; if (!icFormatFloatValue(buf, bufSize, nDigits, nPrecision, v)) { @@ -2204,7 +2211,7 @@ bool CIccCfgColorData::toIt8(const char* filename, icUInt8Number nDigits, icUInt } if (bShowSrcName) { - if (line.size()) line += "\t"; + if (line.size() != size_t(0)) line += "\t"; if (!pCurEntry->m_srcName.size()) line += "\"\""; else @@ -2212,7 +2219,7 @@ bool CIccCfgColorData::toIt8(const char* filename, icUInt8Number nDigits, icUInt } if (bShowSrcValues) { - if (line.size()) line += "\t"; + if (line.size() != size_t(0)) line += "\t"; for (size_t i = 0; i < (size_t)nSrcSamples; i++) { icFloatNumber v = (i >= pCurEntry->m_srcValues.size()) ? 0 : pCurEntry->m_srcValues[i]; if (!icFormatFloatValue(buf, bufSize, nDigits, nPrecision, v)) { @@ -2255,7 +2262,7 @@ void CIccCfgColorData::toJson(json& obj) const if (entry.is_object()) data.push_back(entry); } - if (data.is_array() && data.size()) { + if (data.is_array() && data.size() != size_t(0)) { obj["data"] = data; } } @@ -2300,23 +2307,23 @@ bool CIccCfgDataEntry::fromJson(json j, bool bReset) void CIccCfgDataEntry::toJson(json& obj) { - if (m_name.size()) + if (m_name.size() != size_t(0)) obj["n"] = m_name; - if (m_values.size()) + if (m_values.size() != size_t(0)) obj["v"] = m_values; - if (m_srcName.size()) + if (m_srcName.size() != size_t(0)) obj["sn"] = m_srcName; - if (m_srcValues.size()) + if (m_srcValues.size() != size_t(0)) obj["sv"] = m_srcValues; - if (m_label.size()) + if (m_label.size() != size_t(0)) obj["l"] = m_label; if (m_index >= 0) obj["i"] = m_index; - if (m_debugInfo.size()) + if (m_debugInfo.size() != size_t(0)) obj["d"] = m_debugInfo; } diff --git a/IccConnect/IccLibConnect/IccJsonUtil.cpp b/IccConnect/IccLibConnect/IccJsonUtil.cpp index 1a8aa2ab2..95a02eb3e 100644 --- a/IccConnect/IccLibConnect/IccJsonUtil.cpp +++ b/IccConnect/IccLibConnect/IccJsonUtil.cpp @@ -429,7 +429,7 @@ bool jsonToColorSpace(const json& j, icColorSpaceSignature& sig) { std::string str; if (jsonToValue(j, str)) { - if (str.size()) + if (str.size() != size_t(0)) sig = (icColorSpaceSignature)icGetSigVal(str.c_str()); else sig = icSigUnknownData; From 5956d3ca37a450f6d84f3f7c343ece5bd6e16bab Mon Sep 17 00:00:00 2001 From: ChrisCoxArt Date: Wed, 20 May 2026 16:52:27 -0700 Subject: [PATCH 4/8] division without zero check plus some spacing corrections and simplification --- IccProfLib/IccCmm.cpp | 127 +++++++++--------- IccProfLib/IccMatrixMath.cpp | 2 +- IccXML/IccLibXML/IccTagXml.cpp | 8 ++ Testing/Named/NamedColorV4_luts.pdf | Bin 0 -> 25113 bytes Tools/CmdLine/IccRoundTrip/iccRoundTrip.cpp | 10 +- .../wxWidget/wxProfileDump/wxProfileDump.cpp | 20 +-- 6 files changed, 89 insertions(+), 78 deletions(-) create mode 100644 Testing/Named/NamedColorV4_luts.pdf diff --git a/IccProfLib/IccCmm.cpp b/IccProfLib/IccCmm.cpp index b6fa004b6..b48c39812 100644 --- a/IccProfLib/IccCmm.cpp +++ b/IccProfLib/IccCmm.cpp @@ -1444,79 +1444,84 @@ icStatusCMM CIccXform::Begin() } // set up for any needed PCS adjustment - if (m_nIntent == icAbsoluteColorimetric && - (m_MediaXYZ.X != illXYZ.X || - m_MediaXYZ.Y != illXYZ.Y || - m_MediaXYZ.Z != illXYZ.Z)) { - - icColorSpaceSignature Space = m_pProfile->m_Header.pcs; - - if (IsSpacePCS(Space)) { - m_bAdjustPCS = true; // turn ON PCS adjustment - - // scale factors depend upon media white point - // set up for input transform - if (!m_bInput) { - m_PCSScale[0] = illumXYZ[0] / mediaXYZ[0]; - m_PCSScale[1] = illumXYZ[1] / mediaXYZ[1]; - m_PCSScale[2] = illumXYZ[2] / mediaXYZ[2]; - } - else { - m_PCSScale[0] = mediaXYZ[0] / illumXYZ[0]; - m_PCSScale[1] = mediaXYZ[1] / illumXYZ[1]; - m_PCSScale[2] = mediaXYZ[2] / illumXYZ[2]; + if (m_nIntent == icAbsoluteColorimetric && + (m_MediaXYZ.X != illXYZ.X || + m_MediaXYZ.Y != illXYZ.Y || + m_MediaXYZ.Z != illXYZ.Z)) { - } + icColorSpaceSignature Space = m_pProfile->m_Header.pcs; - m_PCSOffset[0] = 0.0; - m_PCSOffset[1] = 0.0; - m_PCSOffset[2] = 0.0; - } - } - else if (m_nIntent == icPerceptual && (IsVersion2() || !HasPerceptualHandling())) { - icColorSpaceSignature Space = m_pProfile->m_Header.pcs; + if (IsSpacePCS(Space)) { + m_bAdjustPCS = true; // turn ON PCS adjustment - if (IsSpacePCS(Space) && m_pProfile->m_Header.deviceClass!=icSigAbstractClass) { - m_bAdjustPCS = true; // turn ON PCS adjustment + // scale factors depend upon media white point + // set up for input transform + if (!m_bInput) { + m_PCSScale[0] = illumXYZ[0] / mediaXYZ[0]; + m_PCSScale[1] = illumXYZ[1] / mediaXYZ[1]; + m_PCSScale[2] = illumXYZ[2] / mediaXYZ[2]; + } + else { + m_PCSScale[0] = mediaXYZ[0] / illumXYZ[0]; + m_PCSScale[1] = mediaXYZ[1] / illumXYZ[1]; + m_PCSScale[2] = mediaXYZ[2] / illumXYZ[2]; + } + + if (m_PCSScale[0] == 0.0f || m_PCSScale[1] == 0.0f || m_PCSScale[2] == 0.0f) + return icCmmStatInvalidProfile; - // set up for input transform, which needs version 2 black point to version 4 - m_PCSScale[0] = (icFloatNumber) (1.0 - icPerceptualRefBlackX / icPerceptualRefWhiteX); // scale factors - m_PCSScale[1] = (icFloatNumber) (1.0 - icPerceptualRefBlackY / icPerceptualRefWhiteY); - m_PCSScale[2] = (icFloatNumber) (1.0 - icPerceptualRefBlackZ / icPerceptualRefWhiteZ); + m_PCSOffset[0] = 0.0; + m_PCSOffset[1] = 0.0; + m_PCSOffset[2] = 0.0; + } + } + else if (m_nIntent == icPerceptual && (IsVersion2() || !HasPerceptualHandling())) { + icColorSpaceSignature Space = m_pProfile->m_Header.pcs; - m_PCSOffset[0] = (icFloatNumber) (icPerceptualRefBlackX * 32768.0 / 65535.0); // offset factors - m_PCSOffset[1] = (icFloatNumber) (icPerceptualRefBlackY * 32768.0 / 65535.0); - m_PCSOffset[2] = (icFloatNumber) (icPerceptualRefBlackZ * 32768.0 / 65535.0); + if (IsSpacePCS(Space) && m_pProfile->m_Header.deviceClass!=icSigAbstractClass) { + m_bAdjustPCS = true; // turn ON PCS adjustment - if (!m_bInput) { // output transform must convert version 4 black point to version 2 - m_PCSScale[0] = (icFloatNumber) 1.0 / m_PCSScale[0]; // invert scale factors - m_PCSScale[1] = (icFloatNumber) 1.0 / m_PCSScale[1]; - m_PCSScale[2] = (icFloatNumber) 1.0 / m_PCSScale[2]; + // set up for input transform, which needs version 2 black point to version 4 + m_PCSScale[0] = (icFloatNumber) (1.0 - icPerceptualRefBlackX / icPerceptualRefWhiteX); // scale factors + m_PCSScale[1] = (icFloatNumber) (1.0 - icPerceptualRefBlackY / icPerceptualRefWhiteY); + m_PCSScale[2] = (icFloatNumber) (1.0 - icPerceptualRefBlackZ / icPerceptualRefWhiteZ); + + if (m_PCSScale[0] == 0.0f || m_PCSScale[1] == 0.0f || m_PCSScale[2] == 0.0f) + return icCmmStatInvalidProfile; - m_PCSOffset[0] = - m_PCSOffset[0] * m_PCSScale[0]; // negate offset factors - m_PCSOffset[1] = - m_PCSOffset[1] * m_PCSScale[1]; - m_PCSOffset[2] = - m_PCSOffset[2] * m_PCSScale[2]; - } - } - } + m_PCSOffset[0] = (icFloatNumber) (icPerceptualRefBlackX * 32768.0 / 65535.0); // offset factors + m_PCSOffset[1] = (icFloatNumber) (icPerceptualRefBlackY * 32768.0 / 65535.0); + m_PCSOffset[2] = (icFloatNumber) (icPerceptualRefBlackZ * 32768.0 / 65535.0); + if (!m_bInput) { // output transform must convert version 4 black point to version 2 + m_PCSScale[0] = (icFloatNumber) 1.0 / m_PCSScale[0]; // invert scale factors + m_PCSScale[1] = (icFloatNumber) 1.0 / m_PCSScale[1]; + m_PCSScale[2] = (icFloatNumber) 1.0 / m_PCSScale[2]; - if (m_pAdjustPCS) { - CIccProfile ProfileCopy(*m_pProfile); + m_PCSOffset[0] = - m_PCSOffset[0] * m_PCSScale[0]; // negate offset factors + m_PCSOffset[1] = - m_PCSOffset[1] * m_PCSScale[1]; + m_PCSOffset[2] = - m_PCSOffset[2] * m_PCSScale[2]; + } + } + } - // need to read in all the tags, so that a copy of the profile can be made - if (!ProfileCopy.ReadTags(m_pProfile)) { - return icCmmStatInvalidProfile; - } + + if (m_pAdjustPCS) { + CIccProfile ProfileCopy(*m_pProfile); + + // need to read in all the tags, so that a copy of the profile can be made + if (!ProfileCopy.ReadTags(m_pProfile)) { + return icCmmStatInvalidProfile; + } - if (!m_pAdjustPCS->CalcFactors(&ProfileCopy, this, m_PCSScale, m_PCSOffset)) { - return icCmmStatIncorrectApply; - } + if (!m_pAdjustPCS->CalcFactors(&ProfileCopy, this, m_PCSScale, m_PCSOffset)) { + return icCmmStatIncorrectApply; + } - m_bAdjustPCS = true; - delete m_pAdjustPCS; - m_pAdjustPCS = NULL; - } + m_bAdjustPCS = true; + delete m_pAdjustPCS; + m_pAdjustPCS = NULL; + } return icCmmStatOk; } diff --git a/IccProfLib/IccMatrixMath.cpp b/IccProfLib/IccMatrixMath.cpp index f377930df..2ff2179f2 100644 --- a/IccProfLib/IccMatrixMath.cpp +++ b/IccProfLib/IccMatrixMath.cpp @@ -373,7 +373,7 @@ bool CIccMatrixMath::SetRange(const icSpectralRange &srcRange, const icSpectralR icFloatNumber srcScale = (srcEnd - srcStart) / (srcRange.steps-1); icFloatNumber dstScale = (dstEnd - dstStart ) / (dstRange.steps - 1); - if (!std::isfinite(srcScale) || !std::isfinite(dstScale)) + if (!std::isfinite(srcScale) || !std::isfinite(dstScale) || srcScale == 0.0f) return false; icFloatNumber *data=entry(0); diff --git a/IccXML/IccLibXML/IccTagXml.cpp b/IccXML/IccLibXML/IccTagXml.cpp index 0609919e1..df50ced02 100644 --- a/IccXML/IccLibXML/IccTagXml.cpp +++ b/IccXML/IccLibXML/IccTagXml.cpp @@ -3016,6 +3016,9 @@ bool CIccTagXmlCurve::ParseXml(xmlNode *pNode, icConvertType nType, std::string if (szSize && *szSize) { icUInt32Number nSize = (icUInt32Number)atol(szSize); + if (nSize <= 1) + return false; + SetSize(nSize); if (m_nSize == nSize) { @@ -3062,6 +3065,9 @@ bool CIccTagXmlCurve::ParseXml(xmlNode *pNode, icConvertType nType, std::string if (szSize && *szSize) { icUInt32Number nSize = (icUInt32Number)atol(szSize); + if (nSize <= 1) + return false; + SetSize(nSize); if (m_nSize == nSize) { @@ -3101,6 +3107,8 @@ bool CIccTagXmlCurve::ParseXml(xmlNode *pNode, icConvertType nType, std::string if (szSize && *szSize) { icUInt32Number nSize = (icUInt32Number)atol(szSize); + if (nSize <= 1) + return false; SetSize(nSize); diff --git a/Testing/Named/NamedColorV4_luts.pdf b/Testing/Named/NamedColorV4_luts.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5b30a95343e219013b445bc391796bd3cc31ec08 GIT binary patch literal 25113 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 0) + scaleEval = 100.0f / (float)eval.m_nTotal; + report += wxString::Format(" DE <= 1.0 (%8u): %5.1f%%\n\n", eval.num3, scaleEval*(float)eval.num3); report += wxString::Format(" Max L, a, b: " ICFLOATFMT ", " ICFLOATFMT ", " ICFLOATFMT "\n", eval.maxLab2[0], eval.maxLab2[1], eval.maxLab2[2]); @@ -1072,11 +1075,12 @@ wxString AnalyzeRoundTrip(wxString &profilePath, icRenderingIntent nIntent, bool report += wxString::Format("\n PRMG Interoperability - Round Trip Results\n"); report += wxString::Format( " ------------------------------------------------------\n"); - report += wxString::Format(" DE <= 1.0 (%8u): %5.1f%%\n", prmg.m_nDE1, (float)prmg.m_nDE1/(float)prmg.m_nTotal*100.0); - report += wxString::Format(" DE <= 2.0 (%8u): %5.1f%%\n", prmg.m_nDE2, (float)prmg.m_nDE2/(float)prmg.m_nTotal*100.0); - report += wxString::Format(" DE <= 3.0 (%8u): %5.1f%%\n", prmg.m_nDE3, (float)prmg.m_nDE3/(float)prmg.m_nTotal*100.0); - report += wxString::Format(" DE <= 5.0 (%8u): %5.1f%%\n", prmg.m_nDE5, (float)prmg.m_nDE5/(float)prmg.m_nTotal*100.0); - report += wxString::Format(" DE <=10.0 (%8u): %5.1f%%\n", prmg.m_nDE10, (float)prmg.m_nDE10/(float)prmg.m_nTotal*100.0); + float scaling = 100.0f / (float)prmg.m_nTotal; + report += wxString::Format(" DE <= 1.0 (%8u): %5.1f%%\n", prmg.m_nDE1, scaling*(float)prmg.m_nDE1); + report += wxString::Format(" DE <= 2.0 (%8u): %5.1f%%\n", prmg.m_nDE2, scaling*(float)prmg.m_nDE2); + report += wxString::Format(" DE <= 3.0 (%8u): %5.1f%%\n", prmg.m_nDE3, scaling*(float)prmg.m_nDE3); + report += wxString::Format(" DE <= 5.0 (%8u): %5.1f%%\n", prmg.m_nDE5, scaling*(float)prmg.m_nDE5); + report += wxString::Format(" DE <=10.0 (%8u): %5.1f%%\n", prmg.m_nDE10, scaling*(float)prmg.m_nDE10); report += wxString::Format(" Total (%8u)\n", prmg.m_nTotal); } From 93c07ed87623c75c403e71553d357ade6d4e33e8 Mon Sep 17 00:00:00 2001 From: ChrisCoxArt Date: Wed, 20 May 2026 19:52:57 -0700 Subject: [PATCH 5/8] unchecked allocations - add checks and some limits and some cleanup --- IccProfLib/IccMpeBasic.cpp | 26 ++- IccProfLib/IccMpeCalc.cpp | 19 +- IccProfLib/IccMpeSpectral.cpp | 30 ++- IccProfLib/IccTagBasic.cpp | 421 +++++++++++++++++++++++++--------- IccProfLib/IccTagLut.cpp | 34 ++- 5 files changed, 385 insertions(+), 145 deletions(-) diff --git a/IccProfLib/IccMpeBasic.cpp b/IccProfLib/IccMpeBasic.cpp index 9b89b1721..b1e1cb1a5 100644 --- a/IccProfLib/IccMpeBasic.cpp +++ b/IccProfLib/IccMpeBasic.cpp @@ -3043,6 +3043,9 @@ CIccMpeCurveSet::CIccMpeCurveSet(int nSize/*=0*/) m_nInputChannels = m_nOutputChannels = nSize; m_curve = (icCurveSetCurvePtr*)calloc(nSize, sizeof(icCurveSetCurvePtr)); m_position = (icPositionNumber*)calloc(nSize, sizeof(icPositionNumber)); + if (!m_curve || !m_position) { + m_nInputChannels = m_nOutputChannels = 0; + } } else { m_nInputChannels = m_nOutputChannels = 0; @@ -3073,6 +3076,10 @@ CIccMpeCurveSet::CIccMpeCurveSet(const CIccMpeCurveSet &curveSet) m_nInputChannels = m_nOutputChannels = curveSet.m_nInputChannels; m_curve = (icCurveSetCurvePtr*)calloc(m_nInputChannels, sizeof(icCurveSetCurvePtr)); m_position = (icPositionNumber*)calloc(m_nInputChannels, sizeof(icPositionNumber)); + if (!m_curve || !m_position) { + m_nInputChannels = m_nOutputChannels = 0; + return; + } icCurveMap map; for (i=0; i(m_size) * sizeof(icFloatNumber); m_pMatrix = (icFloatNumber*)malloc(num); - memcpy(m_pMatrix, matrix.m_pMatrix, num); + if (m_pMatrix) + memcpy(m_pMatrix, matrix.m_pMatrix, num); } else m_pMatrix = NULL; @@ -4963,7 +4977,8 @@ CIccMpeMatrix::CIccMpeMatrix(const CIccMpeMatrix &matrix) if (matrix.m_pConstants) { int num = m_nOutputChannels*sizeof(icFloatNumber); m_pConstants = (icFloatNumber*)malloc(num); - memcpy(m_pConstants, matrix.m_pConstants, num); + if (m_pConstants) + memcpy(m_pConstants, matrix.m_pConstants, num); } else m_pConstants = NULL; @@ -4998,7 +5013,8 @@ CIccMpeMatrix &CIccMpeMatrix::operator=(const CIccMpeMatrix &matrix) if (matrix.m_pMatrix) { size_t num = static_cast(m_size) * sizeof(icFloatNumber); m_pMatrix = (icFloatNumber*)malloc(num); - memcpy(m_pMatrix, matrix.m_pMatrix, num); + if (m_pMatrix) + memcpy(m_pMatrix, matrix.m_pMatrix, num); } else m_pMatrix = NULL; @@ -5008,7 +5024,8 @@ CIccMpeMatrix &CIccMpeMatrix::operator=(const CIccMpeMatrix &matrix) if (matrix.m_pConstants) { int num = m_nOutputChannels*sizeof(icFloatNumber); m_pConstants = (icFloatNumber*)malloc(num); - memcpy(m_pConstants, matrix.m_pConstants, num); + if (m_pConstants) + memcpy(m_pConstants, matrix.m_pConstants, num); } else m_pConstants = NULL; @@ -5062,7 +5079,6 @@ bool CIccMpeMatrix::SetSize(icUInt16Number nInputChannels, icUInt16Number nOutpu if (bUseConstants) { m_pConstants = (icFloatNumber*)calloc(nOutputChannels, sizeof(icFloatNumber)); - if (!m_pConstants) return false; } diff --git a/IccProfLib/IccMpeCalc.cpp b/IccProfLib/IccMpeCalc.cpp index 71aea588a..6ac7da885 100644 --- a/IccProfLib/IccMpeCalc.cpp +++ b/IccProfLib/IccMpeCalc.cpp @@ -2959,7 +2959,10 @@ CIccCalculatorFunc::CIccCalculatorFunc(const CIccCalculatorFunc &func) if (m_nOps) { m_Op = (SIccCalcOp*)malloc(m_nOps * sizeof(SIccCalcOp)); - memcpy(m_Op, func.m_Op, m_nOps*sizeof(SIccCalcOp)); + if (m_Op) + memcpy(m_Op, func.m_Op, m_nOps*sizeof(SIccCalcOp)); + else + m_nOps = 0; } else m_Op = NULL; @@ -2987,7 +2990,10 @@ CIccCalculatorFunc &CIccCalculatorFunc::operator=(const CIccCalculatorFunc &func if (m_nOps) { m_Op = (SIccCalcOp*)malloc(m_nOps * sizeof(SIccCalcOp)); - memcpy(m_Op, func.m_Op, m_nOps*sizeof(SIccCalcOp)); + if (m_Op) + memcpy(m_Op, func.m_Op, m_nOps*sizeof(SIccCalcOp)); + else + m_nOps = 0; } else m_Op = NULL; @@ -3496,10 +3502,13 @@ icFuncParseStatus CIccCalculatorFunc::SetFunction(CIccCalcOpList &opList, std::s int j; m_Op = (SIccCalcOp*)calloc(m_nOps , sizeof(SIccCalcOp)); - - for (i=opList.begin(), j=0; i!= opList.end(); i++, j++) { - m_Op[j] = *i; + if (m_Op) { + for (i=opList.begin(), j=0; i!= opList.end(); i++, j++) { + m_Op[j] = *i; + } } + else + m_nOps = 0; } else { return icFuncParseEmptyFunction; diff --git a/IccProfLib/IccMpeSpectral.cpp b/IccProfLib/IccMpeSpectral.cpp index 49c4af774..e3d8bd10e 100644 --- a/IccProfLib/IccMpeSpectral.cpp +++ b/IccProfLib/IccMpeSpectral.cpp @@ -141,7 +141,8 @@ CIccMpeSpectralMatrix::CIccMpeSpectralMatrix(const CIccMpeSpectralMatrix &matrix if(matrix.m_pMatrix) { int num = m_size * sizeof(icFloatNumber); m_pMatrix = (icFloatNumber*)malloc(num); - memcpy(m_pMatrix, matrix.m_pMatrix, num); + if (m_pMatrix) + memcpy(m_pMatrix, matrix.m_pMatrix, num); } else m_pMatrix = NULL; @@ -149,7 +150,8 @@ CIccMpeSpectralMatrix::CIccMpeSpectralMatrix(const CIccMpeSpectralMatrix &matrix if (matrix.m_pOffset) { int num = m_Range.steps * sizeof(icFloatNumber); m_pOffset = (icFloatNumber*)malloc(num); - memcpy(m_pOffset, matrix.m_pOffset, num); + if (m_pOffset) + memcpy(m_pOffset, matrix.m_pOffset, num); } else m_pOffset = NULL; @@ -157,7 +159,8 @@ CIccMpeSpectralMatrix::CIccMpeSpectralMatrix(const CIccMpeSpectralMatrix &matrix if (matrix.m_pWhite) { int num = m_Range.steps * sizeof(icFloatNumber); m_pWhite = (icFloatNumber*)malloc(num); - memcpy(m_pWhite, matrix.m_pWhite, num); + if (m_pWhite) + memcpy(m_pWhite, matrix.m_pWhite, num); } else m_pWhite = NULL; @@ -191,7 +194,8 @@ void CIccMpeSpectralMatrix::copyData(const CIccMpeSpectralMatrix &matrix) if (matrix.m_pMatrix) { int num = m_size * sizeof(icFloatNumber); m_pMatrix = (icFloatNumber*)malloc(num); - memcpy(m_pMatrix, matrix.m_pMatrix, num); + if (m_pMatrix) + memcpy(m_pMatrix, matrix.m_pMatrix, num); } else m_pMatrix = NULL; @@ -201,7 +205,8 @@ void CIccMpeSpectralMatrix::copyData(const CIccMpeSpectralMatrix &matrix) if (matrix.m_pOffset) { int num = m_Range.steps * sizeof(icFloatNumber); m_pOffset = (icFloatNumber*)malloc(num); - memcpy(m_pOffset, matrix.m_pOffset, num); + if (m_pOffset) + memcpy(m_pOffset, matrix.m_pOffset, num); } else m_pOffset = NULL; @@ -211,7 +216,8 @@ void CIccMpeSpectralMatrix::copyData(const CIccMpeSpectralMatrix &matrix) if (matrix.m_pWhite) { int num = m_Range.steps * sizeof(icFloatNumber); m_pWhite = (icFloatNumber*)malloc(num); - memcpy(m_pWhite, matrix.m_pWhite, num); + if (m_pWhite) + memcpy(m_pWhite, matrix.m_pWhite, num); } else m_pWhite = NULL; @@ -838,7 +844,8 @@ CIccMpeSpectralCLUT::CIccMpeSpectralCLUT(const CIccMpeSpectralCLUT &clut) if (clut.m_pWhite) { m_pWhite = (icFloatNumber *)malloc((int)clut.m_Range.steps*sizeof(icFloatNumber)); - memcpy(m_pWhite, clut.m_pWhite, clut.m_Range.steps*sizeof(icFloatNumber)); + if (m_pWhite) + memcpy(m_pWhite, clut.m_pWhite, clut.m_Range.steps*sizeof(icFloatNumber)); } else m_pWhite = NULL; @@ -884,7 +891,8 @@ void CIccMpeSpectralCLUT::copyData(const CIccMpeSpectralCLUT &clut) if (clut.m_pWhite) { m_pWhite = (icFloatNumber *)malloc((int)clut.m_Range.steps*sizeof(icFloatNumber)); - memcpy(m_pWhite, clut.m_pWhite, clut.m_Range.steps*sizeof(icFloatNumber)); + if (m_pWhite) + memcpy(m_pWhite, clut.m_pWhite, clut.m_Range.steps*sizeof(icFloatNumber)); } else m_pWhite = NULL; @@ -1694,7 +1702,8 @@ CIccMpeSpectralObserver::CIccMpeSpectralObserver(const CIccMpeSpectralObserver & if (matrix.m_pWhite) { int num = m_Range.steps*sizeof(icFloatNumber); m_pWhite = (icFloatNumber*)malloc(num); - memcpy(m_pWhite, matrix.m_pWhite, num); + if (m_pWhite) + memcpy(m_pWhite, matrix.m_pWhite, num); } else m_pWhite = NULL; @@ -1726,7 +1735,8 @@ void CIccMpeSpectralObserver::copyData(const CIccMpeSpectralObserver &matrix) if (matrix.m_pWhite) { int num = m_Range.steps*sizeof(icFloatNumber); m_pWhite = (icFloatNumber*)malloc(num); - memcpy(m_pWhite, matrix.m_pWhite, num); + if (m_pWhite) + memcpy(m_pWhite, matrix.m_pWhite, num); } else m_pWhite = NULL; diff --git a/IccProfLib/IccTagBasic.cpp b/IccProfLib/IccTagBasic.cpp index c443aae06..b5f1ae50c 100644 --- a/IccProfLib/IccTagBasic.cpp +++ b/IccProfLib/IccTagBasic.cpp @@ -563,8 +563,12 @@ void CIccTagUnknown::Describe(std::string &sDescription, int nVerboseness) CIccTagText::CIccTagText() { m_szText = (icChar*)malloc(1); - m_szText[0] = '\0'; - m_nBufSize = 1; + if (m_szText) { + m_szText[0] = '\0'; + m_nBufSize = 1; + } + else + m_nBufSize = 0; } /** @@ -580,9 +584,13 @@ CIccTagText::CIccTagText() CIccTagText::CIccTagText(const CIccTagText &ITT) { m_szText = (icChar*)malloc(1); - m_szText[0] = '\0'; - m_nBufSize = 1; - SetText(ITT.m_szText); + if (m_szText) { + m_szText[0] = '\0'; + m_nBufSize = 1; + SetText(ITT.m_szText); + } + else + m_nBufSize = 0; } /** @@ -601,9 +609,13 @@ CIccTagText &CIccTagText::operator=(const CIccTagText &TextTag) return *this; m_szText = (icChar*)malloc(1); - m_szText[0] = '\0'; - m_nBufSize = 1; - SetText(TextTag.m_szText); + if (m_szText) { + m_szText[0] = '\0'; + m_nBufSize = 1; + SetText(TextTag.m_szText); + } + else + m_nBufSize = 0; return *this; } @@ -807,7 +819,6 @@ icChar *CIccTagText::GetBuffer(icUInt32Number nSize) { if (m_nBufSize < nSize) { m_szText = (icChar*)icRealloc(m_szText, nSize+1); - if (m_szText) { m_szText[nSize] = '\0'; m_nBufSize = nSize; @@ -833,7 +844,10 @@ void CIccTagText::Release() if (nSize < m_nBufSize-1) { m_szText=(icChar*)icRealloc(m_szText, nSize+1); - m_nBufSize = nSize+1; + if (m_szText) + m_nBufSize = nSize+1; + else + m_nBufSize = 0; } } @@ -912,8 +926,12 @@ icValidateStatus CIccTagText::Validate(std::string sigPath, std::string &sReport CIccTagUtf8Text::CIccTagUtf8Text() { m_szText = (icUChar*)malloc(1); - m_szText[0] = '\0'; - m_nBufSize = 1; + if (m_szText) { + m_szText[0] = '\0'; + m_nBufSize = 1; + } + else + m_nBufSize = 0; } /** @@ -929,9 +947,13 @@ CIccTagUtf8Text::CIccTagUtf8Text() CIccTagUtf8Text::CIccTagUtf8Text(const CIccTagUtf8Text &ITT) { m_szText = (icUChar*)malloc(1); - m_szText[0] = '\0'; - m_nBufSize = 1; - SetText(ITT.m_szText); + if (m_szText) { + m_szText[0] = '\0'; + m_nBufSize = 1; + SetText(ITT.m_szText); + } + else + m_nBufSize = 0; } /** @@ -950,9 +972,14 @@ CIccTagUtf8Text &CIccTagUtf8Text::operator=(const CIccTagUtf8Text &TextTag) return *this; m_szText = (icUChar*)malloc(1); - m_szText[0] = '\0'; - m_nBufSize = 1; SetText(TextTag.m_szText); + if (m_szText) { + m_szText[0] = '\0'; + m_nBufSize = 1; + SetText(TextTag.m_szText); + } + else + m_nBufSize = 0; return *this; } @@ -1186,7 +1213,6 @@ icUChar *CIccTagUtf8Text::GetBuffer(icUInt32Number nSize) { if (m_nBufSize < nSize) { m_szText = (icUChar*)icRealloc(m_szText, nSize+1); - if (m_szText) { m_szText[nSize] = '\0'; m_nBufSize = nSize; @@ -1213,7 +1239,10 @@ void CIccTagUtf8Text::Release() if (nSize < m_nBufSize-1) { m_szText=(icUChar*)icRealloc(m_szText, nSize+1); - m_nBufSize = nSize+1; + if (m_szText) + m_nBufSize = nSize+1; + else + m_nBufSize = 0; } } @@ -1633,8 +1662,7 @@ icUChar *CIccTagZipUtf8Text::AllocBuffer(icUInt32Number nSize) if (!nSize) { free(m_pZipBuf); m_pZipBuf = NULL; - - m_nBufSize = nSize; + m_nBufSize = 0; return NULL; } @@ -1643,7 +1671,10 @@ icUChar *CIccTagZipUtf8Text::AllocBuffer(icUInt32Number nSize) else m_pZipBuf = (icUChar*)icRealloc(m_pZipBuf, nSize); - m_nBufSize = nSize; + if (m_pZipBuf) + m_nBufSize = nSize; + else + m_nBufSize = 0; } return m_pZipBuf; @@ -1718,8 +1749,12 @@ icValidateStatus CIccTagZipUtf8Text::Validate(std::string sigPath, std::string & CIccTagUtf16Text::CIccTagUtf16Text() { m_szText = (icUChar16*)malloc(1*sizeof(icUChar16)); - m_szText[0] = 0; - m_nBufSize = 1; + if (m_szText) { + m_szText[0] = 0; + m_nBufSize = 1; + } + else + m_nBufSize = 0; } /** @@ -1735,9 +1770,13 @@ CIccTagUtf16Text::CIccTagUtf16Text() CIccTagUtf16Text::CIccTagUtf16Text(const CIccTagUtf16Text &ITT) { m_szText = (icUChar16*)malloc(1*sizeof(icUChar16)); - m_szText[0] = 0; - m_nBufSize = 1; - SetText(ITT.m_szText); + if (m_szText) { + m_szText[0] = 0; + m_nBufSize = 1; + SetText(ITT.m_szText); + } + else + m_nBufSize = 0; } /** @@ -1756,9 +1795,13 @@ CIccTagUtf16Text &CIccTagUtf16Text::operator=(const CIccTagUtf16Text &TextTag) return *this; m_szText = (icUChar16*)malloc(1*sizeof(icUChar16)); - m_szText[0] = '\0'; - m_nBufSize = 1; - SetText(TextTag.m_szText); + if (m_szText) { + m_szText[0] = '\0'; + m_nBufSize = 1; + SetText(TextTag.m_szText); + } + else + m_nBufSize = 0; return *this; } @@ -2060,10 +2103,13 @@ icUChar16 *CIccTagUtf16Text::GetBuffer(icUInt32Number nSize) { if (m_nBufSize < nSize) { m_szText = (icUChar16*)icRealloc(m_szText, (nSize+1)*sizeof(icUChar16)); - - m_szText[nSize] = 0; - - m_nBufSize = nSize; + if (m_szText) { + m_szText[nSize] = 0; + m_nBufSize = nSize; + } + else { + m_nBufSize = 0; + } } return m_szText; @@ -2083,7 +2129,10 @@ void CIccTagUtf16Text::Release() if (nSize < m_nBufSize-1) { m_szText=(icUChar16*)icRealloc(m_szText, (nSize+1)*sizeof(icUChar16)); - m_nBufSize = nSize+1; + if (m_szText) + m_nBufSize = nSize+1; + else + m_nBufSize = 0; } } @@ -2132,12 +2181,20 @@ icValidateStatus CIccTagUtf16Text::Validate(std::string sigPath, std::string &sR CIccTagTextDescription::CIccTagTextDescription() { m_szText = (icChar*)malloc(1); - m_szText[0] = '\0'; - m_nASCIISize = 1; + if (m_szText) { + m_szText[0] = 0; + m_nASCIISize = 1; + } + else + m_nASCIISize = 0; m_uzUnicodeText = (icUInt16Number*)malloc(sizeof(icUInt16Number)); - m_uzUnicodeText[0] = 0; - m_nUnicodeSize = 1; + if (m_uzUnicodeText) { + m_uzUnicodeText[0] = 0; + m_nUnicodeSize = 1; + } else + m_nUnicodeSize = 0; + m_nUnicodeLanguageCode = 0; m_nScriptSize = 0; @@ -2167,22 +2224,34 @@ CIccTagTextDescription::CIccTagTextDescription(const CIccTagTextDescription &ITT if (m_nASCIISize) { m_szText = (icChar*)malloc(m_nASCIISize * sizeof(icChar)); - memcpy(m_szText, ITTD.m_szText, m_nASCIISize*sizeof(icChar)); + if (m_szText) + memcpy(m_szText, ITTD.m_szText, m_nASCIISize*sizeof(icChar)); + else + m_nASCIISize = 0; } else { m_nASCIISize = 1; m_szText = (icChar*)calloc(m_nASCIISize, sizeof(icChar)); - m_szText[0] = '\0'; + if (m_szText) + m_szText[0] = '\0'; + else + m_nASCIISize = 0; } if (m_nUnicodeSize) { m_uzUnicodeText = (icUInt16Number*)malloc((m_nUnicodeSize) * sizeof(icUInt16Number)); - memcpy(m_uzUnicodeText, ITTD.m_uzUnicodeText, m_nUnicodeSize*sizeof(icUInt16Number)); + if (m_uzUnicodeText) + memcpy(m_uzUnicodeText, ITTD.m_uzUnicodeText, m_nUnicodeSize*sizeof(icUInt16Number)); + else + m_nUnicodeSize = 0; } else { m_nUnicodeSize = 1; m_uzUnicodeText = (icUInt16Number*)calloc(m_nUnicodeSize, sizeof(icUInt16Number)); - m_uzUnicodeText[0] = 0; + if (m_uzUnicodeText) + m_uzUnicodeText[0] = 0; + else + m_nUnicodeSize = 0; } memcpy(m_szScriptText, ITTD.m_szScriptText, sizeof(m_szScriptText)); @@ -2215,23 +2284,35 @@ CIccTagTextDescription &CIccTagTextDescription::operator=(const CIccTagTextDescr free(m_szText); if (m_nASCIISize) { m_szText = (icChar*)calloc(m_nASCIISize, sizeof(icChar)); - memcpy(m_szText, TextDescTag.m_szText, m_nASCIISize*sizeof(icChar)); - } + if (m_szText) + memcpy(m_szText, TextDescTag.m_szText, m_nASCIISize*sizeof(icChar)); + else + m_nASCIISize = 0; + } else { m_nASCIISize = 1; m_szText = (icChar*)calloc(m_nASCIISize, sizeof(icChar)); - m_szText[0] = '\0'; + if (m_szText) + m_szText[0] = '\0'; + else + m_nASCIISize = 0; } free(m_uzUnicodeText); if (m_nUnicodeSize) { m_uzUnicodeText = (icUInt16Number*)calloc(m_nUnicodeSize, sizeof(icUInt16Number)); - memcpy(m_uzUnicodeText, TextDescTag.m_uzUnicodeText, m_nUnicodeSize*sizeof(icUInt16Number)); + if (m_uzUnicodeText) + memcpy(m_uzUnicodeText, TextDescTag.m_uzUnicodeText, m_nUnicodeSize*sizeof(icUInt16Number)); + else + m_nUnicodeSize = 0; } else { m_nUnicodeSize = 1; m_uzUnicodeText = (icUInt16Number*)calloc(m_nUnicodeSize, sizeof(icUInt16Number)); - m_uzUnicodeText[0] = 0; + if (m_uzUnicodeText) + m_uzUnicodeText[0] = 0; + else + m_nUnicodeSize = 0; } memcpy(m_szScriptText, TextDescTag.m_szScriptText, sizeof(m_szScriptText)); @@ -2477,8 +2558,8 @@ void CIccTagTextDescription::SetText(const icChar *szText) icUInt32Number len=(icUInt32Number)strlen(szText) + 1; icChar *szBuf = GetBuffer(len); - - strcpy(szBuf, szText); + if (szBuf) + strcpy(szBuf, szText); Release(); } @@ -2517,10 +2598,12 @@ icChar *CIccTagTextDescription::GetBuffer(icUInt32Number nSize) { if (m_nASCIISize < (nSize+1)) { m_szText = (icChar*)icRealloc(m_szText, (nSize+1)); - - m_szText[nSize] = '\0'; - - m_nASCIISize = (nSize+1); // include NULL termination! + if (m_szText) { + m_szText[nSize] = '\0'; + m_nASCIISize = (nSize+1); // include NULL termination! + } + else + m_nASCIISize = 0; } return m_szText; @@ -2540,7 +2623,10 @@ void CIccTagTextDescription::Release() if (nSize < m_nASCIISize-1) { m_szText=(icChar*)icRealloc(m_szText, nSize+1); - m_nASCIISize = nSize+1; + if (m_szText) + m_nASCIISize = nSize+1; + else + m_nASCIISize = 0; } } @@ -2561,11 +2647,13 @@ icUInt16Number *CIccTagTextDescription::GetUnicodeBuffer(icUInt32Number nSize) { if (m_nUnicodeSize < (nSize+2)) { // test for existing size must include the NULL termination! m_uzUnicodeText = (icUInt16Number*)icRealloc(m_uzUnicodeText, (nSize+2)*sizeof(icUInt16Number)); - - m_uzUnicodeText[nSize] = 0; - m_uzUnicodeText[nSize+1] = 0; - - m_nUnicodeSize = nSize+2; + if (m_uzUnicodeText) { + m_uzUnicodeText[nSize] = 0; + m_uzUnicodeText[nSize+1] = 0; + m_nUnicodeSize = nSize+2; + } + else + m_nUnicodeSize = 0; } return m_uzUnicodeText; @@ -2591,9 +2679,13 @@ void CIccTagTextDescription::ReleaseUnicode() // but don't reallocate because of the NULLs if (nSize < (m_nUnicodeSize-2)) { m_uzUnicodeText=(icUInt16Number*)icRealloc(m_uzUnicodeText, (nSize+2)*sizeof(icUInt16Number)); - m_uzUnicodeText[nSize] = 0; - m_uzUnicodeText[nSize+1] = 0; - m_nUnicodeSize = nSize+2; + if (m_uzUnicodeText) { + m_uzUnicodeText[nSize] = 0; + m_uzUnicodeText[nSize+1] = 0; + m_nUnicodeSize = nSize+2; + } + else + m_nUnicodeSize = 0; } } @@ -2927,6 +3019,8 @@ CIccTagNamedColor2::CIccTagNamedColor2(int nSize/*=1*/, int nDeviceCoords/*=0*/) m_nColorEntrySize = 32/*rootName*/ + (3/*PCS*/ + 1/*iAny*/ + nDeviceCoords)*sizeof(icFloatNumber); m_NamedColor = (SIccNamedColorEntry*)calloc(nSize, m_nColorEntrySize); + if (!m_NamedColor) + nSize = 0; m_NamedLab = NULL; } @@ -2956,7 +3050,10 @@ CIccTagNamedColor2::CIccTagNamedColor2(const CIccTagNamedColor2 &ITNC) memcpy(m_szSufix, ITNC.m_szSufix, sizeof(m_szSufix)); m_NamedColor = (SIccNamedColorEntry*)calloc(m_nSize, m_nColorEntrySize); - memcpy(m_NamedColor, ITNC.m_NamedColor, (size_t)m_nColorEntrySize*m_nSize); + if (m_NamedColor) + memcpy(m_NamedColor, ITNC.m_NamedColor, (size_t)m_nColorEntrySize*m_nSize); + else + m_nSize = 0; m_NamedLab = NULL; } @@ -2990,7 +3087,10 @@ CIccTagNamedColor2 &CIccTagNamedColor2::operator=(const CIccTagNamedColor2 &Name free(m_NamedColor); m_NamedColor = (SIccNamedColorEntry*)calloc(m_nSize, m_nColorEntrySize); - memcpy(m_NamedColor, NamedColor2Tag.m_NamedColor, (size_t)m_nColorEntrySize*m_nSize); + if (m_NamedColor) + memcpy(m_NamedColor, NamedColor2Tag.m_NamedColor, (size_t)m_nColorEntrySize*m_nSize); + else + m_nSize = 0; m_NamedLab = NULL; @@ -3777,7 +3877,10 @@ CIccTagXYZ::CIccTagXYZ(const CIccTagXYZ &ITXYZ) m_nSize = ITXYZ.m_nSize; m_XYZ = (icXYZNumber*)calloc(m_nSize, sizeof(icXYZNumber)); - memcpy(m_XYZ, ITXYZ.m_XYZ, sizeof(icXYZNumber)*m_nSize); + if (m_XYZ) + memcpy(m_XYZ, ITXYZ.m_XYZ, sizeof(icXYZNumber)*m_nSize); + else + m_nSize = 0; } @@ -3801,7 +3904,10 @@ CIccTagXYZ &CIccTagXYZ::operator=(const CIccTagXYZ &XYZTag) free(m_XYZ); m_XYZ = (icXYZNumber*)calloc(m_nSize, sizeof(icXYZNumber)); - memcpy(m_XYZ, XYZTag.m_XYZ, sizeof(icXYZNumber)*m_nSize); + if (m_XYZ) + memcpy(m_XYZ, XYZTag.m_XYZ, sizeof(icXYZNumber)*m_nSize); + else + m_nSize = 0; return *this; } @@ -3949,8 +4055,13 @@ bool CIccTagXYZ::SetSize(icUInt32Number nSize, bool bZeroNew/*=true*/) if (nSize==m_nSize) return true; - m_XYZ = (icXYZNumber*)icRealloc(m_XYZ, nSize*sizeof(icXYZNumber)); + if (nSize > 65536) { + free(m_XYZ); + m_nSize = 0; + return false; + } + m_XYZ = (icXYZNumber*)icRealloc(m_XYZ, nSize*sizeof(icXYZNumber)); if (!m_XYZ) { m_nSize = 0; return false; @@ -4038,7 +4149,8 @@ CIccTagChromaticity::CIccTagChromaticity(const CIccTagChromaticity &ITCh) m_nChannels = ITCh.m_nChannels; m_xy = (icChromaticityNumber*)calloc(m_nChannels, sizeof(icChromaticityNumber)); - memcpy(m_xy, ITCh.m_xy, sizeof(icChromaticityNumber)*m_nChannels); + if (m_xy) + memcpy(m_xy, ITCh.m_xy, sizeof(icChromaticityNumber)*m_nChannels); } @@ -4061,7 +4173,8 @@ CIccTagChromaticity &CIccTagChromaticity::operator=(const CIccTagChromaticity &C free(m_xy); m_xy = (icChromaticityNumber*)calloc(m_nChannels, sizeof(icChromaticityNumber)); - memcpy(m_xy, ChromTag.m_xy, sizeof(icChromaticityNumber)*m_nChannels); + if (m_xy) + memcpy(m_xy, ChromTag.m_xy, sizeof(icChromaticityNumber)*m_nChannels); return *this; } @@ -4229,7 +4342,6 @@ bool CIccTagChromaticity::SetSize(icUInt16Number nSize, bool bZeroNew/*=true*/) return true; m_xy = (icChromaticityNumber*)icRealloc(m_xy, nSize*sizeof(icChromaticityNumber)); - if (!m_xy) { m_nChannels = 0; return false; @@ -4672,6 +4784,8 @@ CIccTagSparseMatrixArray::CIccTagSparseMatrixArray(int nNumMatrices/* =1 */, int m_nChannelsPerMatrix = 4; m_RawData = (icUInt8Number*)calloc(m_nSize, GetBytesPerMatrix()); + if (!m_RawData) + m_nSize = 0; m_bNonZeroPadding = false; } @@ -4727,7 +4841,10 @@ CIccTagSparseMatrixArray &CIccTagSparseMatrixArray::operator=(const CIccTagSpars free(m_RawData); m_RawData = (icUInt8Number*)calloc(m_nSize, GetBytesPerMatrix()); - memcpy(m_RawData, ITSMA.m_RawData, (size_t)m_nSize*GetBytesPerMatrix()); + if (m_RawData) + memcpy(m_RawData, ITSMA.m_RawData, (size_t)m_nSize*GetBytesPerMatrix()); + else + m_nSize = 0; m_bNonZeroPadding = ITSMA.m_bNonZeroPadding; @@ -5503,6 +5620,8 @@ CIccTagFixedNum::CIccTagFixedNum(int nSize/*=1*/) if (m_nSize <1) m_nSize = 1; m_Num = (T*)calloc(nSize, sizeof(T)); + if (!m_Num) + m_nSize = 0; } @@ -5521,7 +5640,10 @@ CIccTagFixedNum::CIccTagFixedNum(const CIccTagFixedNum &ITFN) { m_nSize = ITFN.m_nSize; m_Num = (T*)calloc(m_nSize, sizeof(T)); - memcpy(m_Num, ITFN.m_Num, m_nSize*sizeof(T)); + if (m_Num) + memcpy(m_Num, ITFN.m_Num, m_nSize*sizeof(T)); + else + m_nSize = 0; } @@ -5545,7 +5667,10 @@ CIccTagFixedNum &CIccTagFixedNum::operator=(const CIccTagFixed free(m_Num); m_Num = (T*)calloc(m_nSize, sizeof(T)); - memcpy(m_Num, ITFN.m_Num, m_nSize*sizeof(T)); + if (m_Num) + memcpy(m_Num, ITFN.m_Num, m_nSize*sizeof(T)); + else + m_nSize = 0; return *this; } @@ -5725,7 +5850,6 @@ bool CIccTagFixedNum::SetSize(icUInt32Number nSize, bool bZeroNew/*=tru return true; m_Num = (T*)icRealloc(m_Num, nSize*sizeof(T)); - if (!m_Num) { m_nSize = 0; return false; @@ -5962,6 +6086,8 @@ CIccTagNum::CIccTagNum(int nSize/*=1*/) if (m_nSize <1) m_nSize = 1; m_Num = (T*)calloc(nSize, sizeof(T)); + if (!m_Num) + m_nSize = 0; } @@ -5981,7 +6107,10 @@ CIccTagNum::CIccTagNum(const CIccTagNum &ITNum) m_nSize = ITNum.m_nSize; m_Num = (T*)calloc(m_nSize, sizeof(T)); - memcpy(m_Num, ITNum.m_Num, m_nSize * sizeof(T)); + if (m_Num) + memcpy(m_Num, ITNum.m_Num, m_nSize * sizeof(T)); + else + m_nSize = 0; } @@ -6004,7 +6133,10 @@ CIccTagNum &CIccTagNum::operator=(const CIccTagNum &I m_nSize = ITNum.m_nSize; m_Num = (T*)calloc(m_nSize, sizeof(T)); - memcpy(m_Num, ITNum.m_Num, m_nSize * sizeof(T)); + if (m_Num) + memcpy(m_Num, ITNum.m_Num, m_nSize * sizeof(T)); + else + m_nSize = 0; return *this; } @@ -6289,7 +6421,6 @@ bool CIccTagNum::SetSize(icUInt32Number nSize, bool bZeroNew/*=true*/) return true; m_Num = (T*)icRealloc(m_Num, nSize*sizeof(T)); - if (!m_Num) { m_nSize = 0; return false; @@ -6575,6 +6706,8 @@ CIccTagFloatNum::CIccTagFloatNum(int nSize/*=1*/) if (m_nSize <1) m_nSize = 1; m_Num = (T*)calloc(nSize, sizeof(T)); + if (!m_Num) + m_nSize = 0; } @@ -6594,7 +6727,10 @@ CIccTagFloatNum::CIccTagFloatNum(const CIccTagFloatNum &ITNum) m_nSize = ITNum.m_nSize; m_Num = (T*)calloc(m_nSize, sizeof(T)); - memcpy(m_Num, ITNum.m_Num, m_nSize * sizeof(T)); + if (m_Num) + memcpy(m_Num, ITNum.m_Num, m_nSize * sizeof(T)); + else + m_nSize = 0; } @@ -6617,7 +6753,10 @@ CIccTagFloatNum &CIccTagFloatNum::operator=(const CIccTagFloat m_nSize = ITNum.m_nSize; m_Num = (T*)calloc(m_nSize, sizeof(T)); - memcpy(m_Num, ITNum.m_Num, m_nSize * sizeof(T)); + if (m_Num) + memcpy(m_Num, ITNum.m_Num, m_nSize * sizeof(T)); + else + m_nSize = 0; return *this; } @@ -6865,7 +7004,6 @@ bool CIccTagFloatNum::SetSize(icUInt32Number nSize, bool bZeroNew/*=tr return true; m_Num = (T*)icRealloc(m_Num, nSize*sizeof(T)); - if (!m_Num) { m_nSize = 0; return false; @@ -7325,7 +7463,9 @@ icValidateStatus CIccTagMeasurement::Validate(std::string sigPath, std::string & CIccLocalizedUnicode::CIccLocalizedUnicode() { m_pBuf = (icUInt16Number*)malloc(1*sizeof(icUInt16Number)); - *m_pBuf = 0; + if (m_pBuf) + *m_pBuf = 0; + m_nLength = 0; m_nLanguageCode = icLanguageCodeEnglish; m_nCountryCode = icCountryCodeUSA; @@ -7346,10 +7486,15 @@ CIccLocalizedUnicode::CIccLocalizedUnicode(const CIccLocalizedUnicode& ILU) { m_nLength = ILU.GetLength(); m_pBuf = (icUInt16Number*)malloc((m_nLength+2) * sizeof(icUInt16Number)); - if (m_nLength) - memcpy(m_pBuf, ILU.GetBuf(), m_nLength*sizeof(icUInt16Number)); - m_pBuf[m_nLength] = 0; // safety against malformed unicode - m_pBuf[m_nLength+1] = 0; // safety against malformed unicode + if (m_pBuf) { + if (m_nLength) + memcpy(m_pBuf, ILU.GetBuf(), m_nLength*sizeof(icUInt16Number)); + m_pBuf[m_nLength] = 0; // safety against malformed unicode + m_pBuf[m_nLength+1] = 0; // safety against malformed unicode + } + else + m_nLength = 0; + m_nLanguageCode = ILU.m_nLanguageCode; m_nCountryCode = ILU.m_nCountryCode; } @@ -7571,7 +7716,6 @@ bool CIccLocalizedUnicode::SetSize(icUInt32Number nSize) // Do the size math in 64-bit defensively, even with the cap above. size_t nBytes = (static_cast(nSize) + 2u) * sizeof(icUInt16Number); m_pBuf = (icUInt16Number*)icRealloc(m_pBuf, nBytes); - if (!m_pBuf) { m_nLength = 0; return false; @@ -8305,6 +8449,8 @@ CIccTagData::CIccTagData(int nSize/*=1*/) if (m_nSize <1) m_nSize = 1; m_pData = (icUInt8Number*)calloc(nSize, sizeof(icUInt8Number)); + if (!m_pData) + m_nSize = 0; m_nDataFlag = icAsciiData; } @@ -8325,7 +8471,10 @@ CIccTagData::CIccTagData(const CIccTagData &ITD) m_nSize = ITD.m_nSize; m_pData = (icUInt8Number*)calloc(m_nSize, sizeof(icUInt8Number)); - memcpy(m_pData, ITD.m_pData, sizeof(icUInt8Number)*m_nSize); + if (m_pData) + memcpy(m_pData, ITD.m_pData, sizeof(icUInt8Number)*m_nSize); + else + m_nSize = 0; } @@ -8349,7 +8498,10 @@ CIccTagData &CIccTagData::operator=(const CIccTagData &DataTag) free(m_pData); m_pData = (icUInt8Number*)calloc(m_nSize, sizeof(icUInt8Number)); - memcpy(m_pData, DataTag.m_pData, sizeof(icUInt8Number)*m_nSize); + if (m_pData) + memcpy(m_pData, DataTag.m_pData, sizeof(icUInt8Number)*m_nSize); + else + m_nSize = 0; return *this; } @@ -8540,7 +8692,6 @@ bool CIccTagData::SetSize(icUInt32Number nSize, bool bZeroNew/*=true*/) return true; m_pData = (icUInt8Number*)icRealloc(m_pData, nSize*sizeof(icUInt8Number)); - if (!m_pData) { m_nSize = 0; return false; @@ -8827,6 +8978,8 @@ CIccTagColorantOrder::CIccTagColorantOrder(int nsize/*=1*/) if (m_nCount <1) m_nCount = 1; m_pData = (icUInt8Number*)calloc(nsize, sizeof(icUInt8Number)); + if (!m_pData) + m_nCount = 0; } @@ -8846,7 +8999,10 @@ CIccTagColorantOrder::CIccTagColorantOrder(const CIccTagColorantOrder &ITCO) m_nCount = ITCO.m_nCount; m_pData = (icUInt8Number*)calloc(m_nCount, sizeof(icUInt8Number)); - memcpy(m_pData, ITCO.m_pData, sizeof(icUInt8Number)*m_nCount); + if (m_pData) + memcpy(m_pData, ITCO.m_pData, sizeof(icUInt8Number)*m_nCount); + else + m_nCount = 0; } @@ -8869,7 +9025,10 @@ CIccTagColorantOrder &CIccTagColorantOrder::operator=(const CIccTagColorantOrder free(m_pData); m_pData = (icUInt8Number*)calloc(m_nCount, sizeof(icUInt8Number)); - memcpy(m_pData, ColorantOrderTag.m_pData, sizeof(icUInt8Number)*m_nCount); + if (m_pData) + memcpy(m_pData, ColorantOrderTag.m_pData, sizeof(icUInt8Number)*m_nCount); + else + m_nCount = 0; return *this; } @@ -9022,8 +9181,13 @@ bool CIccTagColorantOrder::SetSize(icUInt16Number nSize, bool bZeroNew/*=true*/) if (m_nCount == nSize) return true; - m_pData = (icUInt8Number*)icRealloc(m_pData, nSize*sizeof(icUInt8Number)); + if (nSize > 65535) { + free(m_pData); + m_nCount = 0; + return false; + } + m_pData = (icUInt8Number*)icRealloc(m_pData, nSize*sizeof(icUInt8Number)); if (!m_pData) { m_nCount = 0; return false; @@ -9098,6 +9262,8 @@ CIccTagColorantTable::CIccTagColorantTable(int nSize/*=1*/) m_nCount = 1; m_pData = (icColorantTableEntry*)calloc(nSize, sizeof(icColorantTableEntry)); + if (!m_pData) + m_nCount = 0; } @@ -9117,7 +9283,10 @@ CIccTagColorantTable::CIccTagColorantTable(const CIccTagColorantTable &ITCT) m_nCount = ITCT.m_nCount; m_pData = (icColorantTableEntry*)calloc(m_nCount, sizeof(icColorantTableEntry)); - memcpy(m_pData, ITCT.m_pData, m_nCount*sizeof(icColorantTableEntry)); + if (m_pData) + memcpy(m_pData, ITCT.m_pData, m_nCount*sizeof(icColorantTableEntry)); + else + m_nCount = 0; } @@ -9141,7 +9310,10 @@ CIccTagColorantTable &CIccTagColorantTable::operator=(const CIccTagColorantTable free(m_pData); m_pData = (icColorantTableEntry*)calloc(m_nCount, sizeof(icColorantTableEntry)); - memcpy(m_pData, ColorantTableTag.m_pData, m_nCount*sizeof(icColorantTableEntry)); + if (m_pData) + memcpy(m_pData, ColorantTableTag.m_pData, m_nCount*sizeof(icColorantTableEntry)); + else + m_nCount = 0; return *this; } @@ -9340,9 +9512,14 @@ bool CIccTagColorantTable::SetSize(icUInt16Number nSize, bool bZeroNew/*=true*/) { if (m_nCount == nSize) return true; + + if (nSize > 65535) { + free(m_pData); + m_nCount = 0; + return false; + } m_pData = (icColorantTableEntry*)icRealloc(m_pData, nSize*sizeof(icColorantTableEntry)); - if (!m_pData) { m_nCount = 0; return false; @@ -10339,7 +10516,8 @@ CIccResponseCurveStruct::CIccResponseCurveStruct(const CIccResponseCurveStruct & m_measurementUnitSig = IRCS.m_measurementUnitSig; m_maxColorantXYZ = (icXYZNumber*)calloc(m_nChannels, sizeof(icXYZNumber)); - memcpy(m_maxColorantXYZ, IRCS.m_maxColorantXYZ, m_nChannels*sizeof(icXYZNumber)); + if (m_maxColorantXYZ) + memcpy(m_maxColorantXYZ, IRCS.m_maxColorantXYZ, m_nChannels*sizeof(icXYZNumber)); m_Response16ListArray = new CIccResponse16List[m_nChannels]; for (icUInt32Number i=0; iVectorMult(rv, m_observer); - range->VectorMult(&rv[newRange.steps], &m_observer[m_observerRange.steps]); - range->VectorMult(&rv[newRange.steps*2], &m_observer[m_observerRange.steps*2]); - delete range; - } - else { - memcpy(rv, m_observer, m_observerRange.steps*3*sizeof(icFloatNumber)); + if (rv) { + CIccMatrixMath *range = CIccMatrixMath::rangeMap(m_observerRange, newRange); + if (range) { + range->VectorMult(rv, m_observer); + range->VectorMult(&rv[newRange.steps], &m_observer[m_observerRange.steps]); + range->VectorMult(&rv[newRange.steps*2], &m_observer[m_observerRange.steps*2]); + delete range; + } + else { + memcpy(rv, m_observer, m_observerRange.steps*3*sizeof(icFloatNumber)); + } } return rv; @@ -12203,6 +12384,8 @@ CIccTagEmbeddedHeightImage::CIccTagEmbeddedHeightImage(int nSize/*=1*/) if (m_nSize <1) m_nSize = 1; m_pData = (icUInt8Number*)calloc(nSize, sizeof(icUInt8Number)); + if (!m_pData) + m_nSize = 0; m_nSeamlesIndicator = 0; m_nEncodingFormat = icPngImageType; m_fMetersMinPixelValue = 0; @@ -12229,7 +12412,10 @@ CIccTagEmbeddedHeightImage::CIccTagEmbeddedHeightImage(const CIccTagEmbeddedHeig m_nSize = IEHI.m_nSize; m_pData = (icUInt8Number*)calloc(m_nSize, sizeof(icUInt8Number)); - memcpy(m_pData, IEHI.m_pData, sizeof(icUInt8Number)*m_nSize); + if (m_pData) + memcpy(m_pData, IEHI.m_pData, sizeof(icUInt8Number)*m_nSize); + else + m_nSize = 0; } @@ -12256,7 +12442,10 @@ CIccTagEmbeddedHeightImage &CIccTagEmbeddedHeightImage::operator=(const CIccTagE free(m_pData); m_pData = (icUInt8Number*)calloc(m_nSize, sizeof(icUInt8Number)); - memcpy(m_pData, HeightImageTag.m_pData, sizeof(icUInt8Number)*m_nSize); + if (m_pData) + memcpy(m_pData, HeightImageTag.m_pData, sizeof(icUInt8Number)*m_nSize); + else + m_nSize = 0; return *this; } @@ -12444,7 +12633,6 @@ bool CIccTagEmbeddedHeightImage::SetSize(icUInt32Number nSize, bool bZeroNew/*=t return true; m_pData = (icUInt8Number*)icRealloc(m_pData, nSize * sizeof(icUInt8Number)); - if (!m_pData) { m_nSize = 0; return false; @@ -12524,6 +12712,8 @@ CIccTagEmbeddedNormalImage::CIccTagEmbeddedNormalImage(int nSize/*=1*/) if (m_nSize < 1) m_nSize = 1; m_pData = (icUInt8Number*)calloc(nSize, sizeof(icUInt8Number)); + if (!m_pData) + m_nSize = 0; m_nSeamlesIndicator = 0; m_nEncodingFormat = icPngImageType; } @@ -12546,7 +12736,10 @@ CIccTagEmbeddedNormalImage::CIccTagEmbeddedNormalImage(const CIccTagEmbeddedNorm m_nSize = IENI.m_nSize; m_pData = (icUInt8Number*)calloc(m_nSize, sizeof(icUInt8Number)); - memcpy(m_pData, IENI.m_pData, sizeof(icUInt8Number)*m_nSize); + if (m_pData) + memcpy(m_pData, IENI.m_pData, sizeof(icUInt8Number)*m_nSize); + else + m_nSize = 0; } @@ -12571,7 +12764,10 @@ CIccTagEmbeddedNormalImage &CIccTagEmbeddedNormalImage::operator=(const CIccTagE free(m_pData); m_pData = (icUInt8Number*)calloc(m_nSize, sizeof(icUInt8Number)); - memcpy(m_pData, NormalImageTag.m_pData, sizeof(icUInt8Number)*m_nSize); + if (m_pData) + memcpy(m_pData, NormalImageTag.m_pData, sizeof(icUInt8Number)*m_nSize); + else + m_nSize = 0; return *this; } @@ -12742,7 +12938,6 @@ bool CIccTagEmbeddedNormalImage::SetSize(icUInt32Number nSize, bool bZeroNew/*=t return true; m_pData = (icUInt8Number*)icRealloc(m_pData, nSize * sizeof(icUInt8Number)); - if (!m_pData) { m_nSize = 0; return false; diff --git a/IccProfLib/IccTagLut.cpp b/IccProfLib/IccTagLut.cpp index 95301145e..cc241cbb8 100644 --- a/IccProfLib/IccTagLut.cpp +++ b/IccProfLib/IccTagLut.cpp @@ -152,8 +152,11 @@ CIccTagCurve::CIccTagCurve(int nSize/*=0*/) m_nMaxIndex = 0; m_Curve = NULL; - if (m_nSize > 0) + if (m_nSize > 0) { m_Curve = (icFloatNumber*)calloc(nSize, sizeof(icFloatNumber)); + if (!m_Curve) + m_nSize = 0; + } } @@ -175,7 +178,10 @@ CIccTagCurve::CIccTagCurve(const CIccTagCurve &ITCurve) if (m_nSize > 0) { m_Curve = (icFloatNumber*)calloc(m_nSize, sizeof(icFloatNumber)); - memcpy(m_Curve, ITCurve.m_Curve, m_nSize*sizeof(icFloatNumber)); + if (m_Curve) + memcpy(m_Curve, ITCurve.m_Curve, m_nSize*sizeof(icFloatNumber)); + else + m_nSize = 0; } } @@ -203,7 +209,10 @@ CIccTagCurve &CIccTagCurve::operator=(const CIccTagCurve &CurveTag) if (m_nSize > 0) { m_Curve = (icFloatNumber*)calloc(m_nSize, sizeof(icFloatNumber)); - memcpy(m_Curve, CurveTag.m_Curve, m_nSize*sizeof(icFloatNumber)); + if (m_Curve) + memcpy(m_Curve, CurveTag.m_Curve, m_nSize*sizeof(icFloatNumber)); + else + m_nSize = 0; } return *this; @@ -419,7 +428,7 @@ void CIccTagCurve::DumpLut(std::string &sDescription, const icChar *szName, for (i=0; i<(int)m_nSize; i++) { ptr = buf; - icFloatNumber fraction = (m_nSize > 1) ? ((icFloatNumber)i/(m_nSize-1)) : 1.0f; + icFloatNumber fraction = (icFloatNumber)i/(m_nSize-1); icColorValue(buf, bufSize, fraction, csSig, nIndex); ptr += strlen(buf); @@ -456,7 +465,8 @@ bool CIccTagCurve::SetSize(icUInt32Number nSize, icTagCurveSizeInit nSizeOpt/*=i if (nSize==m_nSize) return true; - if (!nSize) { + // set upper limit of 65536 table entries, to help catch errors + if (!nSize || nSize > 65536) { free(m_Curve); m_Curve = NULL; m_nSize = 0; @@ -6014,7 +6024,13 @@ bool CIccTagGamutBoundaryDesc::Read(icUInt32Number size, CIccIO *pIO) delete [] m_Triangles; size_t pcsSize = (size_t)m_nPCSChannels * (size_t)m_NumberOfVertices; + if (pcsSize > (size_t)UINT32_MAX) + return false; + size_t deviceSize = (size_t)m_nDeviceChannels * (size_t)m_NumberOfVertices; + if (deviceSize > (size_t)UINT32_MAX) + return false; + m_PCSValues = new (std::nothrow) icFloatNumber[pcsSize]; if (!m_PCSValues) @@ -6044,9 +6060,6 @@ bool CIccTagGamutBoundaryDesc::Read(icUInt32Number size, CIccIO *pIO) if (pIO->Read32(m_Triangles, nNum32)!=nNum32) return false; - if (pcsSize > (size_t)UINT32_MAX) - return false; - nNum32 = (icUInt32Number) pcsSize; if (pIO->ReadFloat32Float(m_PCSValues, nNum32)!=nNum32) @@ -6054,11 +6067,8 @@ bool CIccTagGamutBoundaryDesc::Read(icUInt32Number size, CIccIO *pIO) if (m_nDeviceChannels > 0) { - if (pcsSize > (size_t)UINT32_MAX) - return false; - nNum32 = (icUInt32Number) deviceSize; - + if (pIO->ReadFloat32Float(m_DeviceValues, nNum32)!=nNum32) return false; } From 99d873f5afdc2688bc481a4c379b41c2e580456d Mon Sep 17 00:00:00 2001 From: ChrisCoxArt Date: Wed, 20 May 2026 20:01:41 -0700 Subject: [PATCH 6/8] comparison result is constant --- IccProfLib/IccTagLut.cpp | 4 ++-- Tools/CmdLine/IccApplySearch/iccApplySearch.cpp | 2 +- Tools/CmdLine/IccPawgReport/IccQualityMetrics.h | 7 ++++--- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/IccProfLib/IccTagLut.cpp b/IccProfLib/IccTagLut.cpp index cc241cbb8..6eee09328 100644 --- a/IccProfLib/IccTagLut.cpp +++ b/IccProfLib/IccTagLut.cpp @@ -5463,7 +5463,7 @@ bool CIccTagLut16::Read(icUInt32Number size, CIccIO *pIO) if (!pCurve->SetSize(nInputEntries)) return false; - if ((nInputEntries > 0) && pIO->ReadUInt16Float(&(*pCurve)[0], nInputEntries) != nInputEntries) + if (pIO->ReadUInt16Float(&(*pCurve)[0], nInputEntries) != nInputEntries) return false; } @@ -5495,7 +5495,7 @@ bool CIccTagLut16::Read(icUInt32Number size, CIccIO *pIO) if (!pCurve->SetSize(nOutputEntries)) return false; - if ((nOutputEntries > 0) && pIO->ReadUInt16Float(&(*pCurve)[0], nOutputEntries) != nOutputEntries) + if (pIO->ReadUInt16Float(&(*pCurve)[0], nOutputEntries) != nOutputEntries) return false; } return true; diff --git a/Tools/CmdLine/IccApplySearch/iccApplySearch.cpp b/Tools/CmdLine/IccApplySearch/iccApplySearch.cpp index 6012bb99f..fd7851f86 100644 --- a/Tools/CmdLine/IccApplySearch/iccApplySearch.cpp +++ b/Tools/CmdLine/IccApplySearch/iccApplySearch.cpp @@ -267,7 +267,7 @@ int main(int argc, const char* argv[]) CIccCfgSearchApply cfgSearchApply; CIccCfgColorData cfgData; - if (argc > 2 && !stricmp(argv[1], "-cfg")) { + if (!stricmp(argv[1], "-cfg")) { json cfg; if (!loadJsonFrom(cfg, argv[2]) || !cfg.is_object()) { printf("Unable to read configuration from '%s'\n", argv[2]); diff --git a/Tools/CmdLine/IccPawgReport/IccQualityMetrics.h b/Tools/CmdLine/IccPawgReport/IccQualityMetrics.h index 8385d93b2..072272d0d 100644 --- a/Tools/CmdLine/IccPawgReport/IccQualityMetrics.h +++ b/Tools/CmdLine/IccPawgReport/IccQualityMetrics.h @@ -1430,9 +1430,10 @@ inline void append_mbb_curve_targets(std::vectorIsInputMatrix() ? mbb->InputChannels() : mbb->OutputChannels(); const int bCurves = mbb->IsInputB() ? mbb->InputChannels() : mbb->OutputChannels(); - if (aCurves < 0 || aCurves > kMaxQualityChannels || - mCurves < 0 || mCurves > kMaxQualityChannels || - bCurves < 0 || bCurves > kMaxQualityChannels) { + // they can't be negative when copied from unsigned values + if (aCurves > kMaxQualityChannels || + mCurves > kMaxQualityChannels || + bCurves > kMaxQualityChannels) { return; } From 2ddf6e9cd25254cc126b2837ed796d44d92d43ae Mon Sep 17 00:00:00 2001 From: ChrisCoxArt Date: Wed, 20 May 2026 20:14:23 -0700 Subject: [PATCH 7/8] remove mistaken size limits --- IccProfLib/IccTagBasic.cpp | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/IccProfLib/IccTagBasic.cpp b/IccProfLib/IccTagBasic.cpp index b5f1ae50c..ce99451c9 100644 --- a/IccProfLib/IccTagBasic.cpp +++ b/IccProfLib/IccTagBasic.cpp @@ -9181,12 +9181,6 @@ bool CIccTagColorantOrder::SetSize(icUInt16Number nSize, bool bZeroNew/*=true*/) if (m_nCount == nSize) return true; - if (nSize > 65535) { - free(m_pData); - m_nCount = 0; - return false; - } - m_pData = (icUInt8Number*)icRealloc(m_pData, nSize*sizeof(icUInt8Number)); if (!m_pData) { m_nCount = 0; @@ -9512,12 +9506,6 @@ bool CIccTagColorantTable::SetSize(icUInt16Number nSize, bool bZeroNew/*=true*/) { if (m_nCount == nSize) return true; - - if (nSize > 65535) { - free(m_pData); - m_nCount = 0; - return false; - } m_pData = (icColorantTableEntry*)icRealloc(m_pData, nSize*sizeof(icColorantTableEntry)); if (!m_pData) { From c5acc89c5d882fabbe00c375855ffb8db214ba59 Mon Sep 17 00:00:00 2001 From: ChrisCoxArt Date: Wed, 20 May 2026 21:11:54 -0700 Subject: [PATCH 8/8] fix a few static analysis finds --- IccProfLib/IccCmm.cpp | 5 +++-- IccProfLib/IccMpeBasic.cpp | 2 ++ IccProfLib/IccTagBasic.cpp | 21 ++++++++++++--------- IccXML/IccLibXML/IccTagXml.cpp | 10 ++++++++-- 4 files changed, 25 insertions(+), 13 deletions(-) diff --git a/IccProfLib/IccCmm.cpp b/IccProfLib/IccCmm.cpp index b48c39812..82d556104 100644 --- a/IccProfLib/IccCmm.cpp +++ b/IccProfLib/IccCmm.cpp @@ -343,8 +343,10 @@ bool CIccCreateXformHintManager::AddHint(IIccCreateXformHint* pHint) { if (!m_pList) { m_pList = new (std::nothrow) IIccCreateXformHintList; - if (!m_pList) + if (!m_pList) { + delete pHint; // don't leave the pointer hanging return false; + } } if (pHint) { @@ -825,7 +827,6 @@ CIccXform *CIccXform::Create(CIccProfile *pProfile, if (pHintManager) { pHintManager->AddHint(pNamedColorHint); rv = CIccXformCreator::CreateXform(icXformTypeNamedColor, pTag, pHintManager); -// pHintManager->DeleteHint(pNamedColorHint); // hint manager takes ownership, we should not delete } else { CIccCreateXformHintManager HintManager; diff --git a/IccProfLib/IccMpeBasic.cpp b/IccProfLib/IccMpeBasic.cpp index b1e1cb1a5..b8bf4f742 100644 --- a/IccProfLib/IccMpeBasic.cpp +++ b/IccProfLib/IccMpeBasic.cpp @@ -4561,6 +4561,8 @@ bool CIccMpeToneMap::Read(icUInt32Number size, CIccIO* pIO) m_nInputChannels = nInputChannels; SetNumOutputChannels(nOutputChannels); + if (!m_pToneFuncs || m_nOutputChannels == 0) + return false; //setup to read luminance curve based on position icPositionNumber lumPos; diff --git a/IccProfLib/IccTagBasic.cpp b/IccProfLib/IccTagBasic.cpp index ce99451c9..bb5c73e93 100644 --- a/IccProfLib/IccTagBasic.cpp +++ b/IccProfLib/IccTagBasic.cpp @@ -2619,15 +2619,18 @@ icChar *CIccTagTextDescription::GetBuffer(icUInt32Number nSize) */ void CIccTagTextDescription::Release() { - icUInt32Number nSize = (icUInt32Number)strlen(m_szText); - - if (nSize < m_nASCIISize-1) { - m_szText=(icChar*)icRealloc(m_szText, nSize+1); - if (m_szText) - m_nASCIISize = nSize+1; - else - m_nASCIISize = 0; + if (m_szText) { + icUInt32Number nSize = (icUInt32Number)strlen(m_szText); + if (nSize < m_nASCIISize-1) { + m_szText=(icChar*)icRealloc(m_szText, nSize+1); + if (m_szText) + m_nASCIISize = nSize+1; + else + m_nASCIISize = 0; + } } + else + m_nASCIISize = 0; } /** @@ -3020,7 +3023,7 @@ CIccTagNamedColor2::CIccTagNamedColor2(int nSize/*=1*/, int nDeviceCoords/*=0*/) m_NamedColor = (SIccNamedColorEntry*)calloc(nSize, m_nColorEntrySize); if (!m_NamedColor) - nSize = 0; + m_nSize = 0; m_NamedLab = NULL; } diff --git a/IccXML/IccLibXML/IccTagXml.cpp b/IccXML/IccLibXML/IccTagXml.cpp index df50ced02..002f0fe7d 100644 --- a/IccXML/IccLibXML/IccTagXml.cpp +++ b/IccXML/IccLibXML/IccTagXml.cpp @@ -4561,8 +4561,11 @@ bool CIccTagXmlDict::ParseXml(xmlNode *pNode, std::string & /*parseStr*/) CIccTagMultiLocalizedUnicode *pTag = pDesc->GetNameLocalized(); if (!pTag) { pTag = new (std::nothrow) CIccTagMultiLocalizedUnicode(); - if (!pTag) + if (!pTag) { + delete pDesc; + ptr.ptr = NULL; return false; + } pDesc->SetNameLocalized(pTag); } @@ -4586,8 +4589,11 @@ bool CIccTagXmlDict::ParseXml(xmlNode *pNode, std::string & /*parseStr*/) CIccTagMultiLocalizedUnicode *pTag = pDesc->GetValueLocalized(); if (!pTag) { pTag = new (std::nothrow) CIccTagMultiLocalizedUnicode(); - if (!pTag) + if (!pTag) { + delete pDesc; + ptr.ptr = NULL; return false; + } pDesc->SetValueLocalized(pTag); }