Skip to content

Commit 44b5ae9

Browse files
committed
PanasonicV8Decompressor: ensure that we are asked to produce the same image size we've checked for
1 parent 95dda4a commit 44b5ae9

File tree

3 files changed

+14
-10
lines changed

3 files changed

+14
-10
lines changed

fuzz/librawspeed/decompressors/PanasonicV8Decompressor.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* Data, size_t Size) {
8686
auto stripHeightsInput = bs.getStream(numStripHeights, sizeof(uint16_t));
8787
auto defineCodes = bs.getStream(numDefineCodesSize);
8888
const auto initialPrediction = bs.getArray<uint16_t, 4>();
89+
const auto imgDim = bs.getArray<int, 2>();
8990

9091
// The rest of the bs are the input strips.
9192

@@ -113,7 +114,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* Data, size_t Size) {
113114
stripHeights.reserve(1); // Array1DRef does not like nullptr's.
114115

115116
PanasonicV8Decompressor::DecompressorParamsBuilder builder(
116-
mRaw->dim, initialPrediction, getAsArray1DRef(strips),
117+
{imgDim[0], imgDim[1]}, initialPrediction, getAsArray1DRef(strips),
117118
getAsArray1DRef(stripLineOffsets), getAsArray1DRef(stripWidths),
118119
getAsArray1DRef(stripHeights), defineCodes);
119120

src/librawspeed/decompressors/PanasonicV8Decompressor.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -347,7 +347,7 @@ PanasonicV8Decompressor::PanasonicV8Decompressor(RawImage outputImg,
347347
mRawOutput->getBpp() != sizeof(uint16_t)) {
348348
ThrowRDE("Unexpected component count / data type");
349349
}
350-
if (!mRawOutput->dim.hasPositiveArea())
350+
if (mRawOutput->dim != mParams.imgSize)
351351
ThrowRDE("Unexpected image dimensions");
352352
const auto maxBpp = maxBitsPerPixelNeeded(mParams.mDecoderLUT);
353353
if (maxBpp > 32) {

src/librawspeed/decompressors/PanasonicV8Decompressor.h

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ class PanasonicV8Decompressor final : public AbstractDecompressor {
6969
struct DecompressorParamsBuilder;
7070

7171
struct DecompressorParams {
72+
iPoint2D imgSize;
7273
const Array1DRef<const Array1DRef<const uint8_t>> mStrips;
7374
const Array1DRef<const iRectangle2D> mOutRect;
7475
const Array1DRef<const DecoderLUTEntry> mDecoderLUT;
@@ -79,15 +80,17 @@ class PanasonicV8Decompressor final : public AbstractDecompressor {
7980
private:
8081
friend struct DecompressorParamsBuilder;
8182

82-
DecompressorParams(Array1DRef<const Array1DRef<const uint8_t>> mStrips_,
83+
DecompressorParams(iPoint2D imgSize_,
84+
Array1DRef<const Array1DRef<const uint8_t>> mStrips_,
8385
Array1DRef<const iRectangle2D> mOutRect_,
8486
Array1DRef<const DecoderLUTEntry> mDecoderLUT_,
8587
Bayer2x2 initialPrediction_)
86-
: mStrips(mStrips_), mOutRect(mOutRect_), mDecoderLUT(mDecoderLUT_),
87-
initialPrediction(initialPrediction_) {}
88+
: imgSize(imgSize_), mStrips(mStrips_), mOutRect(mOutRect_),
89+
mDecoderLUT(mDecoderLUT_), initialPrediction(initialPrediction_) {}
8890
};
8991

9092
struct DecompressorParamsBuilder {
93+
iPoint2D imgSize;
9194
const std::vector<PanasonicV8Decompressor::DecoderLUTEntry> mDecoderLUT;
9295
const Array1DRef<const Array1DRef<const uint8_t>> mStrips;
9396
const Bayer2x2 initialPrediction;
@@ -104,13 +107,13 @@ class PanasonicV8Decompressor final : public AbstractDecompressor {
104107

105108
// NOLINTNEXTLINE(readability-function-size)
106109
DecompressorParamsBuilder(
107-
iPoint2D imgSize, Bayer2x2 initialPrediction_,
110+
iPoint2D imgSize_, Bayer2x2 initialPrediction_,
108111
Array1DRef<const Array1DRef<const uint8_t>> mStrips_,
109112
Array1DRef<const uint32_t> stripLineOffsets,
110113
Array1DRef<const uint16_t> stripWidths,
111114
Array1DRef<const uint16_t> stripHeights, ByteStream defineCodes)
112-
: mDecoderLUT(getDecoderLUT(defineCodes)), mStrips(mStrips_),
113-
initialPrediction(initialPrediction_),
115+
: imgSize(imgSize_), mDecoderLUT(getDecoderLUT(defineCodes)),
116+
mStrips(mStrips_), initialPrediction(initialPrediction_),
114117
mOutRects(getOutRects(imgSize, stripLineOffsets, stripWidths,
115118
stripHeights)) {
116119
if (mStrips.size() != implicit_cast<int>(mOutRects.size()))
@@ -122,8 +125,8 @@ class PanasonicV8Decompressor final : public AbstractDecompressor {
122125
}
123126

124127
[[nodiscard]] DecompressorParams getDecompressorParams() const {
125-
return {mStrips, getAsArray1DRef(mOutRects), getAsArray1DRef(mDecoderLUT),
126-
initialPrediction};
128+
return {imgSize, mStrips, getAsArray1DRef(mOutRects),
129+
getAsArray1DRef(mDecoderLUT), initialPrediction};
127130
}
128131
};
129132

0 commit comments

Comments
 (0)