Skip to content

Handle malformed LZF back references - #84

Closed
yawkat wants to merge 1 commit into
ning:masterfrom
yawkat:handle-malformed-lzf-backrefs
Closed

Handle malformed LZF back references#84
yawkat wants to merge 1 commit into
ning:masterfrom
yawkat:handle-malformed-lzf-backrefs

Conversation

@yawkat

@yawkat yawkat commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Summary

  • validate compressed chunk limits before reading back-reference metadata
  • keep the optimized copy paths while reporting malformed chunks as LZFException
  • add regression coverage for safe and optimal decoder paths

Tests

  • ./mvnw -Dtest=TestLZFDecoder test
  • ./mvnw test

Ensure LZF decoders report LZFException when malformed chunks end before back-reference metadata, and add regression coverage for safe and optimal decoder paths.

Co-Authored-By: multicode <multicode@yawk.at>
Comment on lines 59 to +66
if (ctrl < LZFChunk.MAX_LITERAL) { // literal run
switch (ctrl) {
case 31:
out[outPos++] = in[inPos++];
case 30:
out[outPos++] = in[inPos++];
case 29:
out[outPos++] = in[inPos++];
case 28:
out[outPos++] = in[inPos++];
case 27:
out[outPos++] = in[inPos++];
case 26:
out[outPos++] = in[inPos++];
case 25:
out[outPos++] = in[inPos++];
case 24:
out[outPos++] = in[inPos++];
case 23:
out[outPos++] = in[inPos++];
case 22:
out[outPos++] = in[inPos++];
case 21:
out[outPos++] = in[inPos++];
case 20:
out[outPos++] = in[inPos++];
case 19:
out[outPos++] = in[inPos++];
case 18:
out[outPos++] = in[inPos++];
case 17:
out[outPos++] = in[inPos++];
case 16:
out[outPos++] = in[inPos++];
case 15:
out[outPos++] = in[inPos++];
case 14:
out[outPos++] = in[inPos++];
case 13:
out[outPos++] = in[inPos++];
case 12:
out[outPos++] = in[inPos++];
case 11:
out[outPos++] = in[inPos++];
case 10:
out[outPos++] = in[inPos++];
case 9:
out[outPos++] = in[inPos++];
case 8:
out[outPos++] = in[inPos++];
case 7:
out[outPos++] = in[inPos++];
case 6:
out[outPos++] = in[inPos++];
case 5:
out[outPos++] = in[inPos++];
case 4:
out[outPos++] = in[inPos++];
case 3:
out[outPos++] = in[inPos++];
case 2:
out[outPos++] = in[inPos++];
case 1:
out[outPos++] = in[inPos++];
case 0:
out[outPos++] = in[inPos++];
int literalLen = ctrl + 1;
if (inPos > inEnd - literalLen || outPos > outEnd - literalLen) {
throw new LZFException("Corrupt data: truncated block");
}
System.arraycopy(in, inPos, out, outPos, literalLen);
inPos += literalLen;
outPos += literalLen;

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ai has benchmarked this to be faster and it's more maintainable

@yawkat

yawkat commented Jul 23, 2026

Copy link
Copy Markdown
Contributor Author

Superseded by #85 with the latest test cleanup.

@yawkat yawkat closed this Jul 23, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant