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

  1. Use packages built with the default cpio payload (rpmbuild default), or downgrade to distro packages that still use cpio.
  2. Upgrade/patch the archive library to support the newer payload format, or extract with external rpm2cpio/bsdtar instead.
  3. 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

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


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