can1357/oh-my-pi · error · ArchiveError
Invalid RPM package: non-zero signature alignment padding
Error message
Invalid RPM package: non-zero signature alignment padding
What it means
readRpmArchive validates that the 8-byte alignment padding between the RPM signature header body and the main header is all zero bytes, as required by the RPM file format. A non-zero byte in this padding means the package is malformed, corrupted, or hand-crafted, so the library refuses to parse it rather than guessing at the layout.
Source
Thrown at packages/utils/src/ar/rpm.ts:278
if (decoded) leadName = decoded;
} catch {}
const signatureIntro = parseHeaderIntro(initial.subarray(RPM_LEAD_SIZE), options, "signature");
const signatureEnd = RPM_LEAD_SIZE + signatureIntro.totalSize;
const mainHeaderOffset = align(signatureEnd, 8);
const signatureBodyAndPadding = await readExact(
source,
RPM_LEAD_SIZE + RPM_HEADER_INTRO_SIZE,
mainHeaderOffset,
"signature header",
);
if (signatureBodyAndPadding.byteLength < signatureIntro.bodySize) {
throw new ArchiveError("Invalid RPM package: truncated signature header");
}
validateHeaderBody(signatureBodyAndPadding.subarray(0, signatureIntro.bodySize), signatureIntro, "signature");
for (let offset = signatureIntro.bodySize; offset < signatureBodyAndPadding.byteLength; offset++) {
if (signatureBodyAndPadding[offset] !== 0) {
throw new ArchiveError("Invalid RPM package: non-zero signature alignment padding");
}
}
const mainIntroBytes = await readExact(
source,
mainHeaderOffset,
mainHeaderOffset + RPM_HEADER_INTRO_SIZE,
"main header intro",
);
const mainIntro = parseHeaderIntro(mainIntroBytes, options, "main");
assertIndexSize(signatureIntro.totalSize + mainIntro.totalSize, options.limits, "RPM headers");
const mainBodyOffset = mainHeaderOffset + RPM_HEADER_INTRO_SIZE;
const mainBody = await readExact(source, mainBodyOffset, mainBodyOffset + mainIntro.bodySize, "main header");
const metadata = parseMainHeader(mainBody, mainIntro);
const identity = rpmIdentity(metadata, leadName);
if (metadata.payloadFormat && metadata.payloadFormat.toLowerCase() !== "cpio") {
throw new ArchiveError(`RPM package '${identity}' uses unsupported payload format '${metadata.payloadFormat}'`);
}View on GitHub (pinned to 9690622007)
Solutions
- Re-download or re-export the .rpm from a trusted source and verify its checksum.
- Rebuild the package with standard rpmbuild so headers are correctly 8-byte aligned.
- If you must accept such files, copy them and zero the padding region before parsing (only for trusted data).
Example fix
// before (trusting a possibly corrupt file)
await readRpm(source);
// after (verify integrity first)
const ok = (await Bun.file("pkg.rpm").slice()).size && await verifyChecksum("pkg.rpm", expectedSha256);
if (!ok) throw new Error("RPM download corrupt");
await readRpm(source); Defensive patterns
Strategy: validation
Validate before calling
// check 8-byte alignment padding zero-ness before parsing
function signaturePaddingIsClean(bytes: Uint8Array, bodyStart: number, bodySize: number): boolean {
const padEnd = Math.min(bodyStart + bodySize + 8, bytes.byteLength);
for (let i = bodyStart + bodySize; i < padEnd; i++) if (bytes[i] !== 0) return false;
return true;
} Try / catch
try {
const entries = await readRpm(source);
} catch (err) {
if (err instanceof ArchiveError && err.message.includes("alignment padding")) {
// treat as corrupt/untrusted package; refuse or re-fetch
} else throw err;
} Prevention
- Verify package checksums (sha256) against the repository before parsing
- Only parse RPMs built by standard rpmbuild tooling
- Treat padding violations as untrusted input, never attempt in-place repair
When it happens
Trigger: Calling readRpm/readRpmArchive on an RPM file whose signature header body size is not 8-byte aligned and whose padding bytes are non-zero (corrupt download, truncated-and-reassembled file, maliciously crafted package).
Common situations: Partially downloaded or re-uploaded .rpm files; packages produced by non-rpm tooling that writes junk padding; deliberate fuzzing/malware-crafted archives.
Related errors
- Invalid ${label} Huffman table: oversubscribed codes
- Invalid ${label} Huffman table: incomplete codes
- Invalid ${label} temporary Huffman table
- Invalid RPM package: truncated main header
- Invalid RPM package: truncated signature header
AI-assisted analysis of can1357/oh-my-pi@9690622007 (2026-08-31).
Data as JSON: /api/errors/273dc56d2bf69138.
Report an issue: GitHub.