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

  1. Re-download or re-export the .rpm from a trusted source and verify its checksum.
  2. Rebuild the package with standard rpmbuild so headers are correctly 8-byte aligned.
  3. 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

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


AI-assisted analysis of can1357/oh-my-pi@9690622007 (2026-08-31). Data as JSON: /api/errors/273dc56d2bf69138. Report an issue: GitHub.