summaryrefslogtreecommitdiff
path: root/src/cmslut.c
diff options
context:
space:
mode:
authorMarti Maria <info@littlecms.com>2010-10-25 17:44:14 +0200
committerMarti Maria <info@littlecms.com>2010-10-25 17:44:14 +0200
commit49219c0843d308922089283085ffc59e8d051595 (patch)
tree7bbd73fdfdf409eb7a763407f5f4724e60d69c06 /src/cmslut.c
parent4bd08b41fa98610816e73999297ed1648fe8b999 (diff)
downloadlcms2-49219c0843d308922089283085ffc59e8d051595.tar.gz
beta2 code review
Diffstat (limited to 'src/cmslut.c')
-rw-r--r--src/cmslut.c41
1 files changed, 36 insertions, 5 deletions
diff --git a/src/cmslut.c b/src/cmslut.c
index 11aafb7..d0fe9c8 100644
--- a/src/cmslut.c
+++ b/src/cmslut.c
@@ -463,10 +463,20 @@ void EvaluateCLUTfloatIn16(const cmsFloat32Number In[], cmsFloat32Number Out[],
static
cmsUInt32Number CubeSize(const cmsUInt32Number Dims[], cmsUInt32Number b)
{
- cmsUInt32Number rv;
+ cmsUInt32Number rv, dim;
- for (rv = 1; b > 0; b--)
- rv *= Dims[b-1];
+ _cmsAssert(Dims != NULL);
+
+ for (rv = 1; b > 0; b--) {
+
+ dim = Dims[b-1];
+ if (dim == 0) return 0; // Error
+
+ rv *= dim;
+
+ // Check for overflow
+ if (rv > UINT_MAX / dim) return 0;
+ }
return rv;
}
@@ -549,6 +559,12 @@ cmsStage* CMSEXPORT cmsStageAllocCLut16bitGranular(cmsContext ContextID,
NewElem -> nEntries = n = outputChan * CubeSize(clutPoints, inputChan);
NewElem -> HasFloatValues = FALSE;
+ if (n == 0) {
+ cmsStageFree(NewMPE);
+ return NULL;
+ }
+
+
NewElem ->Tab.T = (cmsUInt16Number*) _cmsCalloc(ContextID, n, sizeof(cmsUInt16Number));
if (NewElem ->Tab.T == NULL) {
cmsStageFree(NewMPE);
@@ -610,9 +626,12 @@ cmsStage* CMSEXPORT cmsStageAllocCLutFloatGranular(cmsContext ContextID, const c
{
cmsUInt32Number i, n;
_cmsStageCLutData* NewElem;
- cmsStage* NewMPE = _cmsStageAllocPlaceholder(ContextID, cmsSigCLutElemType, inputChan, outputChan,
- EvaluateCLUTfloat, CLUTElemDup, CLutElemTypeFree, NULL);
+ cmsStage* NewMPE;
+
+ _cmsAssert(clutPoints != NULL);
+ NewMPE = _cmsStageAllocPlaceholder(ContextID, cmsSigCLutElemType, inputChan, outputChan,
+ EvaluateCLUTfloat, CLUTElemDup, CLutElemTypeFree, NULL);
if (NewMPE == NULL) return NULL;
@@ -628,6 +647,11 @@ cmsStage* CMSEXPORT cmsStageAllocCLutFloatGranular(cmsContext ContextID, const c
NewElem -> nEntries = n = outputChan * CubeSize( clutPoints, inputChan);
NewElem -> HasFloatValues = TRUE;
+ if (n == 0) {
+ cmsStageFree(NewMPE);
+ return NULL;
+ }
+
NewElem ->Tab.TFloat = (cmsFloat32Number*) _cmsCalloc(ContextID, n, sizeof(cmsFloat32Number));
if (NewElem ->Tab.TFloat == NULL) {
cmsStageFree(NewMPE);
@@ -719,6 +743,7 @@ cmsBool CMSEXPORT cmsStageSampleCLut16bit(cmsStage* mpe, cmsSAMPLER16 Sampler, v
if (nOutputs >= MAX_STAGE_CHANNELS) return FALSE;
nTotalPoints = CubeSize(nSamples, nInputs);
+ if (nTotalPoints == 0) return FALSE;
index = 0;
for (i = 0; i < nTotalPoints; i++) {
@@ -772,6 +797,7 @@ cmsBool CMSEXPORT cmsStageSampleCLutFloat(cmsStage* mpe, cmsSAMPLERFLOAT Sampler
if (nOutputs >= MAX_STAGE_CHANNELS) return FALSE;
nTotalPoints = CubeSize(nSamples, nInputs);
+ if (nTotalPoints == 0) return FALSE;
index = 0;
for (i = 0; i < nTotalPoints; i++) {
@@ -821,6 +847,7 @@ cmsBool CMSEXPORT cmsSliceSpace16(cmsUInt32Number nInputs, const cmsUInt32Number
if (nInputs >= cmsMAXCHANNELS) return FALSE;
nTotalPoints = CubeSize(clutPoints, nInputs);
+ if (nTotalPoints == 0) return FALSE;
for (i = 0; i < nTotalPoints; i++) {
@@ -850,6 +877,7 @@ cmsInt32Number CMSEXPORT cmsSliceSpaceFloat(cmsUInt32Number nInputs, const cmsUI
if (nInputs >= cmsMAXCHANNELS) return FALSE;
nTotalPoints = CubeSize(clutPoints, nInputs);
+ if (nTotalPoints == 0) return FALSE;
for (i = 0; i < nTotalPoints; i++) {
@@ -1298,6 +1326,9 @@ void CMSEXPORT cmsPipelineInsertStage(cmsPipeline* lut, cmsStageLoc loc, cmsStag
{
cmsStage* Anterior = NULL, *pt;
+ _cmsAssert(lut != NULL);
+ _cmsAssert(mpe != NULL);
+
switch (loc) {
case cmsAT_BEGIN: