Animation encoder soundness fix#51
Open
Shnatsel wants to merge 2 commits into
Open
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The animation encoder accepted
AnimFrames whose dimensions were smaller than the animation canvas, butanim_encode()passed the canvas dimensions tonew_picture()for every frame. This made libwebp import a smaller frame buffer as if it contained a full canvas-sized image, reading past the end of the declared frame data. In practice, trailing bytes after the frame slice could be encoded as pixels; this is an out-of-bounds read that may leak memory contents into the output.Animated WebP itself supports subframes with offsets, but this crate’s
AnimFrameAPI does not expose offset/blend/dispose fields, and libwebp’sWebPAnimEncoderAdd()expects full canvas snapshots. libwebp can then optimize those full snapshots into subframes internally.This fix rejects animation frames whose dimensions do not match the canvas before calling into C, and also rejects frame buffers that are too small for their declared dimensions/layout.
The memory safety issue was discovered by GPT-5.5.