From 53dc07cd2ec584aa82ebebfc4141ba5d8f1ec28b Mon Sep 17 00:00:00 2001 From: Vincent Rabaud Date: Mon, 13 Jan 2025 11:06:29 +0100 Subject: [PATCH] Fix some static analysis minor defects - fix comparison of uint64_t with SIZE_MAX for platforms where uint64_t and size_t are different - do not compare two floats for equality --- src/gainmap.c | 5 +++-- src/read.c | 8 ++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/gainmap.c b/src/gainmap.c index d7acc700a5..9f3cd44953 100644 --- a/src/gainmap.c +++ b/src/gainmap.c @@ -45,12 +45,13 @@ static float avifGetGainMapWeight(float hdrHeadroom, const avifGainMap * gainMap { const float baseHdrHeadroom = avifUnsignedFractionToFloat(gainMap->baseHdrHeadroom); const float alternateHdrHeadroom = avifUnsignedFractionToFloat(gainMap->alternateHdrHeadroom); - if (baseHdrHeadroom == alternateHdrHeadroom) { + const float diffHdrHeadroom = alternateHdrHeadroom - baseHdrHeadroom; + if (diffHdrHeadroom == 0.f) { // Do not apply the gain map if the HDR headroom is the same. // This case is not handled in the specification and does not make practical sense. return 0.0f; } - const float w = AVIF_CLAMP((hdrHeadroom - baseHdrHeadroom) / (alternateHdrHeadroom - baseHdrHeadroom), 0.0f, 1.0f); + const float w = AVIF_CLAMP((hdrHeadroom - baseHdrHeadroom) / diffHdrHeadroom, 0.0f, 1.0f); return (alternateHdrHeadroom < baseHdrHeadroom) ? -w : w; } diff --git a/src/read.c b/src/read.c index e1d1a2f036..b6378941ea 100644 --- a/src/read.c +++ b/src/read.c @@ -1138,9 +1138,11 @@ static avifResult avifDecoderItemMaxExtent(const avifDecoderItem * item, const a outExtent->offset = minOffset; const uint64_t extentLength = maxOffset - minOffset; +#if UINT64_MAX != SIZE_MAX if (extentLength > SIZE_MAX) { return AVIF_RESULT_BMFF_PARSE_FAILED; } +#endif outExtent->size = (size_t)extentLength; return AVIF_RESULT_OK; } @@ -1956,10 +1958,12 @@ static avifResult avifParseItemLocationBox(avifMeta * meta, const uint8_t * raw, } uint64_t offset = baseOffset + extentOffset; extent->offset = offset; +#if UINT64_MAX != SIZE_MAX if (extentLength > SIZE_MAX) { avifDiagnosticsPrintf(diag, "Item ID [%u] contains an extent length which overflows: [%" PRIu64 "]", itemID, extentLength); return AVIF_RESULT_BMFF_PARSE_FAILED; } +#endif extent->size = (size_t)extentLength; if (extent->size > SIZE_MAX - item->size) { avifDiagnosticsPrintf(diag, @@ -4752,9 +4756,11 @@ static avifResult avifExtentMerge(avifExtent * dst, const avifExtent * src) const uint64_t maxExtent2 = src->offset + src->size; dst->offset = AVIF_MIN(minExtent1, minExtent2); const uint64_t extentLength = AVIF_MAX(maxExtent1, maxExtent2) - dst->offset; +#if UINT64_MAX != SIZE_MAX if (extentLength > SIZE_MAX) { return AVIF_RESULT_BMFF_PARSE_FAILED; } +#endif dst->size = (size_t)extentLength; return AVIF_RESULT_OK; } @@ -4824,9 +4830,11 @@ static avifResult avifDecoderPrepareSample(avifDecoder * decoder, avifDecodeSamp avifDecoderItem * item; AVIF_CHECKRES(avifMetaFindOrCreateItem(decoder->data->meta, sample->itemID, &item)); avifROData itemContents; +#if UINT64_MAX != SIZE_MAX if (sample->offset > SIZE_MAX) { return AVIF_RESULT_BMFF_PARSE_FAILED; } +#endif size_t offset = (size_t)sample->offset; avifResult readResult = avifDecoderItemRead(item, decoder->io, &itemContents, offset, bytesToRead, &decoder->diag); if (readResult != AVIF_RESULT_OK) {