{{ message }}
zero reserved2 field before writing dds header#654
Merged
solidpixel merged 1 commit intoJul 1, 2026
Conversation
solidpixel
approved these changes
Jul 1, 2026
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.

store_dds_uncompressed_image sets every field of the on-stack dds_header individually, but the trailing reserved2 word is never assigned. Since the whole struct is then serialised with file.write(&hdr, sizeof(dds_header)), those four bytes come straight from uninitialised stack memory. I spotted it while auditing the header writers after the recent DDS/KTX store fixes: caps3, caps4 and the reserved1 array are all explicitly zeroed, but reserved2 sits just past caps4 and was missed. A build with -ftrivial-auto-var-init=pattern makes it obvious, the field lands in the output file as 0xAAAAAAAA.
Every uncompressed .dds we write therefore leaks four bytes of encoder stack at file offset 124, and the container is non-conformant because the spec requires that word to be zero. The fix assigns hdr.reserved2 = 0 next to the existing caps3/caps4 zeroing, keeping the field-by-field style of the function. After the change a round-tripped .dds carries a zero reserved2 and the unit tests stay green.