Skip to content

Commit c29d6d4

Browse files
authored
Merge pull request #109 from Juliapixel/main
Ignore reserved bits in chunks
2 parents ce638c7 + 49751eb commit c29d6d4

File tree

2 files changed

+10
-17
lines changed

2 files changed

+10
-17
lines changed

src/decoder.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,18 @@ quick_error! {
4343
display("Invalid Chunk header: {err:x?}")
4444
}
4545

46+
#[allow(deprecated)]
47+
#[deprecated]
4648
/// Some bits were invalid
4749
ReservedBitSet {
4850
display("Reserved bits set")
4951
}
5052

53+
/// The ALPH chunk preprocessing info flag was invalid
54+
InvalidAlphaPreprocessing {
55+
display("Alpha chunk preprocessing flag invalid")
56+
}
57+
5158
/// Invalid compression method
5259
InvalidCompressionMethod {
5360
display("Invalid compression method")
@@ -721,10 +728,6 @@ impl<R: BufRead + Seek> WebPDecoder<R> {
721728
}
722729
let duration = extended::read_3_bytes(&mut self.r)?;
723730
let frame_info = self.r.read_u8()?;
724-
let reserved = frame_info & 0b11111100;
725-
if reserved != 0 {
726-
return Err(DecodingError::ReservedBitSet);
727-
}
728731
let use_alpha_blending = frame_info & 0b00000010 == 0;
729732
let dispose = frame_info & 0b00000001 != 0;
730733

src/extended.rs

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -238,19 +238,14 @@ pub(crate) fn read_extended_header<R: Read>(
238238
) -> Result<WebPExtendedInfo, DecodingError> {
239239
let chunk_flags = reader.read_u8()?;
240240

241-
let reserved_first = chunk_flags & 0b11000000;
242241
let icc_profile = chunk_flags & 0b00100000 != 0;
243242
let alpha = chunk_flags & 0b00010000 != 0;
244243
let exif_metadata = chunk_flags & 0b00001000 != 0;
245244
let xmp_metadata = chunk_flags & 0b00000100 != 0;
246245
let animation = chunk_flags & 0b00000010 != 0;
247-
let reserved_second = chunk_flags & 0b00000001;
248246

249-
let reserved_third = read_3_bytes(reader)?;
250-
251-
if reserved_first != 0 || reserved_second != 0 || reserved_third != 0 {
252-
return Err(DecodingError::ReservedBitSet);
253-
}
247+
// reserved bytes are ignored
248+
let _reserved_bytes = read_3_bytes(reader)?;
254249

255250
let canvas_width = read_3_bytes(reader)? + 1;
256251
let canvas_height = read_3_bytes(reader)? + 1;
@@ -304,19 +299,14 @@ pub(crate) fn read_alpha_chunk<R: BufRead>(
304299
) -> Result<AlphaChunk, DecodingError> {
305300
let info_byte = reader.read_u8()?;
306301

307-
let reserved = info_byte & 0b11000000;
308302
let preprocessing = (info_byte & 0b00110000) >> 4;
309303
let filtering = (info_byte & 0b00001100) >> 2;
310304
let compression = info_byte & 0b00000011;
311305

312-
if reserved != 0 {
313-
return Err(DecodingError::ReservedBitSet);
314-
}
315-
316306
let preprocessing = match preprocessing {
317307
0 => false,
318308
1 => true,
319-
_ => return Err(DecodingError::ReservedBitSet),
309+
_ => return Err(DecodingError::InvalidAlphaPreprocessing),
320310
};
321311

322312
let filtering_method = match filtering {

0 commit comments

Comments
 (0)