Skip to content

Commit

Permalink
LibGfx/ILBM: Ensure CMAP chunk size matches expected value
Browse files Browse the repository at this point in the history
The color map should be 3 bytes per pixel and should contain
`2^nPlanes` pixels. We now return an error if the color map isn't the
size we expect.
  • Loading branch information
tcl3 authored and awesomekling committed Nov 8, 2023
1 parent 61eb754 commit f56ae8c
Show file tree
Hide file tree
Showing 3 changed files with 4 additions and 0 deletions.
1 change: 1 addition & 0 deletions Tests/LibGfx/TestImageDecoder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,7 @@ TEST_CASE(test_ilbm_malformed_header)
TEST_CASE(test_ilbm_malformed_frame)
{
Array test_inputs = {
TEST_INPUT("ilbm/incorrect-cmap-size.iff"sv),
TEST_INPUT("ilbm/incorrect-uncompressed-size.iff"sv),
TEST_INPUT("ilbm/missing-body-chunk.iff"sv)
};
Expand Down
Binary file not shown.
3 changes: 3 additions & 0 deletions Userland/Libraries/LibGfx/ImageFormats/ILBMLoader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -298,6 +298,9 @@ static ErrorOr<void> decode_iff_chunks(ILBMLoadingContext& context)
while (!chunks.is_empty()) {
auto chunk = TRY(decode_iff_advance_chunk(chunks));
if (chunk.type == FourCC("CMAP")) {
if (chunk.data.size() != (1ul << context.bm_header.planes) * 3)
return Error::from_string_literal("Invalid CMAP chunk size");

context.color_table = TRY(decode_cmap_chunk(chunk));
} else if (chunk.type == FourCC("BODY")) {
if (context.color_table.is_empty())
Expand Down

0 comments on commit f56ae8c

Please sign in to comment.