Fix client crash when decoding malformed PNG data#5052
Open
HeresHavi wants to merge 1 commit into
Open
Conversation
Handle fatal libpng decoding errors locally and reject reads beyond the supplied pixel buffer, allowing malformed PNG data to return false instead of terminating the client.
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.
Summary
Added recoverable error handling to
PngDecode.Malformed PNG data now returns
falseinstead of reaching libpng's fatal error path and terminating the client. PNG reads that extend beyond the supplied buffer are also rejected safely.Motivation
MTA builds libpng without its normal setjmp recovery support. When libpng found a fatal decoding error, its default handler called
abort()and closed the client.For example, a resource might download an image and pass its bytes to
dxGetPixelsSizeordxConvertPixels. If the image has a damaged PNG chunk or was cut off during download, processing it could crash the player's client.Crash Stack
The dialog labels this as a stack buffer overrun, but the stack shows that the client was terminated by libpng's
abort()path.Test plan
Runtime
png_longjmpandabort.false, and the client stayed open.falseafter the output buffers had been allocated, and the client stayed open.false, and the client stayed open.Builds and Tests
Debug | Win32: Full build passed, 304 client tests passed.Release | Win32: Full build passed.Debug | x64: Full build passed.Release | x64: Full build passed.clang-format.Checklist