From 61ec98de02054749b4c471e341f0f4657aa818bc Mon Sep 17 00:00:00 2001 From: Teemu Suutari Date: Fri, 22 Nov 2024 21:40:29 +0200 Subject: [PATCH] Detection fixing --- src/Decompressor.cpp | 22 ++++++++++------------ src/IceDecompressor.cpp | 2 +- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/src/Decompressor.cpp b/src/Decompressor.cpp index 9add444..e7fbbf6 100644 --- a/src/Decompressor.cpp +++ b/src/Decompressor.cpp @@ -51,7 +51,8 @@ static std::vector Decompressor::create(const Buffer &packedData,bool uint32_t footer{(exactSizeKnown&&packedData.size()>=4)?packedData.readBE32(packedData.size()-4):0}; for (auto &it : decompressors) { - if (it.first(hdr,footer)) return it.second(packedData,exactSizeKnown,verify); + try + { + if (it.first(hdr,footer)) return it.second(packedData,exactSizeKnown,verify); + } catch (const Error&) { + // try next on the list + } } throw InvalidFormatError(); } catch (const Buffer::Error&) { @@ -74,16 +80,8 @@ std::shared_ptr Decompressor::create(const Buffer &packedData,bool bool Decompressor::detect(const Buffer &packedData,bool exactSizeKnown) noexcept { if (packedData.size()<2) return false; - try - { - uint32_t hdr{(packedData.size()>=4)?packedData.readBE32(0):(uint32_t(packedData.readBE16(0))<<16)}; - uint32_t footer{(exactSizeKnown&&packedData.size()>=4)?packedData.readBE32(packedData.size()-4):0}; - for (auto &it : decompressors) - if (it.first(hdr,footer)) return true; - return false; - } catch (const Buffer::Error&) { - return false; - } + // need to create the decompressor in order to work with bad detectors. + return bool(create(packedData,exactSizeKnown,true)); } void Decompressor::decompress(Buffer &rawData,bool verify) diff --git a/src/IceDecompressor.cpp b/src/IceDecompressor.cpp index 51fc22f..6eb0172 100644 --- a/src/IceDecompressor.cpp +++ b/src/IceDecompressor.cpp @@ -151,7 +151,7 @@ void IceDecompressor::decompressInternal(Buffer &rawData,bool useBytes) } // picture mode - if (_ver && readBits(1U)) + if (_ver && bitReader.available() && readBits(1U)) { uint32_t pictureSize=32000U; if (_ver==2)