{"record":{"id":"ba50732590e349e7","repo":"can1357/oh-my-pi","slug":"invalid-xz-stream-footer-magic-mismatch","errorCode":null,"errorMessage":"Invalid XZ stream: footer magic mismatch","messagePattern":"Invalid XZ stream: footer magic mismatch","errorType":"exception","errorClass":"ArchiveError","httpStatus":null,"severity":"error","filePath":"packages/utils/src/ar/codecs/xz.ts","lineNumber":120,"sourceCode":"\treturn records;\n}\n\nfunction discoverStreams(bytes: Uint8Array): XzStream[] {\n\tif (bytes.byteLength === 0 || (bytes.byteLength & 3) !== 0)\n\t\tthrow new ArchiveError(\"Invalid XZ stream: size is not a multiple of four bytes\");\n\tconst streams: XzStream[] = [];\n\tlet end = bytes.byteLength;\n\twhile (end > 0) {\n\t\tlet padding = 0;\n\t\twhile (end >= 4 && bytes[end - 1] === 0 && bytes[end - 2] === 0 && bytes[end - 3] === 0 && bytes[end - 4] === 0) {\n\t\t\tend -= 4;\n\t\t\tpadding += 4;\n\t\t}\n\t\tif (end === 0) throw new ArchiveError(\"Invalid XZ stream: padding without a stream\");\n\t\tif (end < 24) throw new ArchiveError(\"Invalid XZ stream: truncated stream framing\");\n\t\tconst footerStart = end - 12;\n\t\tif (bytes[footerStart + 10] !== 0x59 || bytes[footerStart + 11] !== 0x5a)\n\t\t\tthrow new ArchiveError(\"Invalid XZ stream: footer magic mismatch\");\n\t\tif (crc32(bytes.subarray(footerStart + 4, footerStart + 10)) !== read32LE(bytes, footerStart))\n\t\t\tthrow new ArchiveError(\"Invalid XZ stream: footer CRC32 mismatch\");\n\t\tconst flag0 = bytes[footerStart + 8]!;\n\t\tconst flag1 = bytes[footerStart + 9]!;\n\t\tif (flag0 !== 0 || (flag1 & 0xf0) !== 0) throw new ArchiveError(\"Unsupported XZ stream flags\");\n\t\tconst checkId = flag1 & 0x0f;\n\t\tcheckSize(checkId);\n\t\tconst indexSize = (read32LE(bytes, footerStart + 4) + 1) * 4;\n\t\tif (!Number.isSafeInteger(indexSize) || indexSize > footerStart)\n\t\t\tthrow new ArchiveError(\"Invalid XZ stream: backward index size is invalid\");\n\t\tconst indexStart = footerStart - indexSize;\n\t\tconst records = parseIndex(bytes, indexStart, indexSize);\n\t\tlet blocksSize = 0;\n\t\tfor (const record of records) {\n\t\t\tblocksSize += Math.ceil(record.unpaddedSize / 4) * 4;\n\t\t\tif (!Number.isSafeInteger(blocksSize)) throw new ArchiveError(\"XZ stream uses sizes too large to read safely\");\n\t\t}\n\t\tconst start = indexStart - blocksSize - 12;","sourceCodeStart":102,"sourceCodeEnd":138,"githubUrl":"https://github.com/can1357/oh-my-pi/blob/969062200754ea02cfac922e5ebb8c608c079e15/packages/utils/src/ar/codecs/xz.ts#L102-L138","documentation":"Every XZ stream ends with a 12-byte footer whose last two bytes must be the magic 'YZ' (0x59 0x5A). discoverStreams() checks these bytes after locating the footer; if they differ, the bytes at that position are not an XZ stream footer, so the buffer is not a valid (or is a corrupted) XZ stream.","triggerScenarios":"Feeding a non-XZ archive (gzip, zip, tar, raw LZMA) to the xz decoder; a footer corrupted by a bad transfer or write; an off-by-N slice that shifts the footer position so the magic bytes land elsewhere.","commonSituations":"Opening a file with the wrong extension, hand-editing or post-processing an .xz file, concatenating streams with junk between them, or byte-level corruption from a faulty disk/transfer.","solutions":["Confirm the input is actually XZ format (check for magic fd 37 7a 58 5a 00 at a stream start)","Re-acquire the file and verify its checksum to rule out corruption","If the data is raw LZMA or another format, use the matching codec instead of xz","If handling concatenated streams, do not insert non-zero filler between them"],"exampleFix":"// before\nawait xzDecode(gzipBytes); // wrong format\n// after\nimport * as gzip from \"./gzip\";\nawait gzip.decode(gzipBytes); // use the right codec per format","handlingStrategy":"validation","validationCode":"function hasXzMagic(bytes: Uint8Array): boolean {\n  return bytes.byteLength >= 6\n    && bytes[0] === 0xfd && bytes[1] === 0x37 && bytes[2] === 0x7a\n    && bytes[3] === 0x58 && bytes[4] === 0x5a && bytes[5] === 0x00;\n}","typeGuard":"null","tryCatchPattern":"try {\n  await xzDecode(bytes);\n} catch (err) {\n  if (err instanceof ArchiveError && err.message.includes(\"footer magic mismatch\")) {\n    throw new Error(\"Input is not a valid XZ stream — check file format\");\n  }\n  throw err;\n}","preventionTips":["Detect the actual format (xz vs gzip vs zip) before choosing a codec","Never trust file extensions; sniff magic bytes","Re-verify files after any manual byte manipulation"],"tags":["xz","archive","corrupt-input","magic-bytes"],"backgroundTag":"invalid-archive-format","analyzedSha":"969062200754ea02cfac922e5ebb8c608c079e15","analyzedAt":"2026-08-31T10:29:35.737Z","schemaVersion":2},"datasetVersion":"2026-08-31T14:17:45.589Z"}