Browse Source

LibGfx/ILBM: Add validation for header fields

We now exit early if a header field is set to a value that we don't
currently support.
Tim Ledbetter 1 year ago
parent
commit
61eb754f63
1 changed files with 14 additions and 2 deletions
  1. 14 2
      Userland/Libraries/LibGfx/ImageFormats/ILBMLoader.cpp

+ 14 - 2
Userland/Libraries/LibGfx/ImageFormats/ILBMLoader.cpp

@@ -27,14 +27,16 @@ struct Chunk {
 
 
 enum class CompressionType : u8 {
 enum class CompressionType : u8 {
     None = 0,
     None = 0,
-    ByteRun = 1
+    ByteRun = 1,
+    __Count
 };
 };
 
 
 enum class MaskType : u8 {
 enum class MaskType : u8 {
     None = 0,
     None = 0,
     HasMask = 1,
     HasMask = 1,
     HasTransparentColor = 2,
     HasTransparentColor = 2,
-    HasLasso = 3
+    HasLasso = 3,
+    __Count
 };
 };
 
 
 enum class ViewportMode : u32 {
 enum class ViewportMode : u32 {
@@ -329,6 +331,16 @@ static ErrorOr<void> decode_bmhd_chunk(ILBMLoadingContext& context)
         return Error::from_string_literal("IFFImageDecoderPlugin: Not enough data for header chunk");
         return Error::from_string_literal("IFFImageDecoderPlugin: Not enough data for header chunk");
 
 
     context.bm_header = *bit_cast<BMHDHeader const*>(first_chunk.data.data());
     context.bm_header = *bit_cast<BMHDHeader const*>(first_chunk.data.data());
+
+    if (context.bm_header.planes > 8)
+        return Error::from_string_literal("IFFImageDecoderPlugin: Deep ILBMs are not currently supported");
+
+    if (context.bm_header.mask >= MaskType::__Count)
+        return Error::from_string_literal("IFFImageDecoderPlugin: Unsupported mask type");
+
+    if (context.bm_header.compression >= CompressionType::__Count)
+        return Error::from_string_literal("IFFImageDecoderPlugin: Unsupported compression type");
+
     context.pitch = ceil_div((u16)context.bm_header.width, (u16)16) * 2;
     context.pitch = ceil_div((u16)context.bm_header.width, (u16)16) * 2;
 
 
     context.state = ILBMLoadingContext::State::HeaderDecoded;
     context.state = ILBMLoadingContext::State::HeaderDecoded;