Skip to content

KAFKA-20769: ListDeserializer can silently deserialize a corrupted entry when the input is truncated mid-entry#22755

Open
SEPURI-SAI-KRISHNA wants to merge 1 commit into
apache:trunkfrom
SEPURI-SAI-KRISHNA:KAFKA-20769-listdeserializer-truncated-entry
Open

KAFKA-20769: ListDeserializer can silently deserialize a corrupted entry when the input is truncated mid-entry#22755
SEPURI-SAI-KRISHNA wants to merge 1 commit into
apache:trunkfrom
SEPURI-SAI-KRISHNA:KAFKA-20769-listdeserializer-truncated-entry

Conversation

@SEPURI-SAI-KRISHNA

Copy link
Copy Markdown

ListDeserializer.deserialize only treated a -1 return from
DataInputStream.read(byte[]) as a truncated stream, but read may return a
partial count without reaching EOF. The entrySize bounds check compares
against data.length (the whole buffer), not the bytes remaining, so a
corrupted payload can declare an entry size that passes the check yet
exceeds the remaining bytes. When that happens the entry buffer is left
zero-padded and handed to the inner deserializer with no error, silently
producing a corrupted value instead of the intended
SerializationException("End of the stream was reached prematurely").

Switch to DataInputStream.readFully, which throws EOFException when the
buffer cannot be filled, and map it to the existing SerializationException.
Behavior is unchanged for well-formed input.

Testing: added ListDeserializerTest.shouldThrowOnEntryTruncatedMidStream,
which encodes a VARIABLE_SIZE list declaring a 10-byte entry but supplying
only 5 payload bytes. The test fails without the fix (no exception thrown,
corrupted entry returned) and passes with it. Full ListDeserializerTest
suite, checkstyle, and spotless pass locally.

Co-Authored-By: Claude Fable 5

@github-actions github-actions Bot added triage PRs from the community clients small Small PRs labels Jul 4, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

clients small Small PRs triage PRs from the community

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant