can1357/oh-my-pi · error · ArchiveError
RPM package '${identity}' uses unsupported payload format '$
Error message
RPM package '${identity}' uses unsupported payload format '${metadata.payloadFormat}' What it means
The main RPM header advertises a payload format tag (RPMTAG_PAYLOADFORMAT) that is not 'cpio'. This reader only unpacks the traditional cpio payload (optionally compressed), so any other payload container is rejected with a message naming the package identity and offending format.
Source
Thrown at packages/utils/src/ar/rpm.ts:295
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}'`);
}
const payloadOffset = mainHeaderOffset + mainIntro.totalSize;
const payloadSize = source.size - payloadOffset;
assertInMemorySize(payloadSize, options.limits);
const payload = await readExact(source, payloadOffset, source.size, "payload");
const cpio = await decompressPayload(payload, metadata, identity, options.limits.maxInMemorySize);
assertInMemorySize(cpio.byteLength, options.limits);
return readCpioEntriesFromBuffer(cpio, options);
}
/** Read an RPM lead, headers, compressed payload, and its contained CPIO entries. */
export const readRpm: FormatReader = async (source, options) => {
try {
return await readRpmArchive(source, options);
} catch (error) {
if (error instanceof ArchiveError) throw error;
throw new ArchiveError(error instanceof Error ? error.message : String(error));View on GitHub (pinned to 9690622007)
Solutions
- Use packages built with the default cpio payload (rpmbuild default), or downgrade to distro packages that still use cpio.
- Upgrade/patch the archive library to support the newer payload format, or extract with external rpm2cpio/bsdtar instead.
- If you control the payloadFormat metadata source, confirm the tag value is actually 'cpio' (case-insensitive).
Example fix
// before
const entries = await readRpm(source);
// after
const metadata = await readRpmMetadata(source);
if (metadata.payloadFormat && metadata.payloadFormat.toLowerCase() !== "cpio") {
const { stdout } = await $`rpm2cpio pkg.rpm | cpio -idm`.cwd(outDir);
} else {
const entries = await readRpm(source);
} Defensive patterns
Strategy: validation
Validate before calling
// inspect PAYLOADFORMAT before full parse
const meta = await readRpmMetadata(source);
if (meta.payloadFormat && meta.payloadFormat.toLowerCase() !== "cpio") {
throw new Error(`unsupported payload: ${meta.payloadFormat}`);
} Try / catch
try {
const entries = await readRpm(source);
} catch (err) {
if (err instanceof ArchiveError && err.message.includes("unsupported payload format")) {
// fall back to external rpm2cpio/bsdtar extraction
} else throw err;
} Prevention
- Check the payloadFormat metadata of your package corpus up front
- Pin to distro packages still using cpio payloads, or add ar-payload support
- Keep a fallback extractor (rpm2cpio | cpio) for modern packages
When it happens
Trigger: readRpm on an RPM whose PAYLOADFORMAT header tag is missing-but-nonstandard, e.g. 'ar' (newer rpm 4.20+ unified payloads) or a custom value; the check only passes for 'cpio' case-insensitively.
Common situations: Parsing very new distro packages (Fedora/openSUSE moving to non-cpio/ar payloads) with an older reader; enterprise RPMs built with custom payload settings; mislabeled test fixtures.
Related errors
- Unsupported RPM package lead version or type
- Unsupported RPM signature type ${signatureType}; only header
- Unsupported archive format: ${assetName}
- Unsupported ISO 9660 logical block size ${blockSize} (expect
- LZH uses the incompatible LHARK -lh7- variant
AI-assisted analysis of can1357/oh-my-pi@9690622007 (2026-08-31).
Data as JSON: /api/errors/04f94faa6dde74d0.
Report an issue: GitHub.