Merge pull request #24441 from vrabaud:avif_check

Make sure AVIF decoder is destroyed in case of failure
This commit is contained in:
Alexander Smorkalov 2023-10-24 13:18:03 +03:00 committed by GitHub
commit 1fe0fc224c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -8,6 +8,7 @@
#include <avif/avif.h> #include <avif/avif.h>
#include <fstream> #include <fstream>
#include <memory>
#include <opencv2/core/utils/configuration.private.hpp> #include <opencv2/core/utils/configuration.private.hpp>
#include "opencv2/imgproc.hpp" #include "opencv2/imgproc.hpp"
@ -159,16 +160,16 @@ size_t AvifDecoder::signatureLength() const { return kAvifSignatureSize; }
} }
bool AvifDecoder::checkSignature(const String &signature) const { bool AvifDecoder::checkSignature(const String &signature) const {
avifDecoder *decoder = avifDecoderCreate(); std::unique_ptr<avifDecoder, decltype(&avifDecoderDestroy)> decoder(
avifDecoderCreate(), avifDecoderDestroy);
if (!decoder) return false; if (!decoder) return false;
OPENCV_AVIF_CHECK_STATUS( OPENCV_AVIF_CHECK_STATUS(
avifDecoderSetIOMemory( avifDecoderSetIOMemory(
decoder, reinterpret_cast<const uint8_t *>(signature.c_str()), decoder.get(), reinterpret_cast<const uint8_t *>(signature.c_str()),
signature.size()), signature.size()),
decoder); decoder);
decoder->io->sizeHint = 1e9; decoder->io->sizeHint = 1e9;
const avifResult status = avifDecoderParse(decoder); const avifResult status = avifDecoderParse(decoder.get());
avifDecoderDestroy(decoder);
return (status == AVIF_RESULT_OK || status == AVIF_RESULT_TRUNCATED_DATA); return (status == AVIF_RESULT_OK || status == AVIF_RESULT_TRUNCATED_DATA);
} }