can1357/oh-my-pi · error · ArchiveError

Unsupported High Sierra CD-ROM filesystem (not ISO 9660)

Error message

Unsupported High Sierra CD-ROM filesystem (not ISO 9660)

What it means

The ISO volume scan found no ISO 9660 primary (or Joliet) volume descriptor, but it did see a High Sierra (CD-ROM, the pre-ISO 9660 predecessor) descriptor. Since the reader only implements ISO 9660/Joliet, it raises this specific error to tell you the image is the older filesystem rather than a generic 'descriptor not found' failure.

Source

Thrown at packages/utils/src/ar/iso.ts:299

					descriptor[88] === 0x25 &&
					descriptor[89] === 0x2f &&
					[0x40, 0x43, 0x45].includes(descriptor[90]!)
				) {
					joliet = parseVolumeDescriptor(descriptor, true);
				}
				if (type === 255) {
					terminated = true;
					break;
				}
			}
			pendingOffset += ISO_SECTOR_SIZE;
			scanned += ISO_SECTOR_SIZE;
		}
		position += pending.byteLength;
		chunkSectors = Math.min(chunkSectors * 2, Math.ceil(limits.maxIndexSize / ISO_SECTOR_SIZE));
	}
	if (!primary && !joliet) {
		if (sawHighSierra) throw new ArchiveError("Unsupported High Sierra CD-ROM filesystem (not ISO 9660)");
		if (sawUdf) throw new ArchiveError("Unsupported UDF-only image (no ISO 9660 volume descriptor)");
		throw invalidIso("primary volume descriptor not found");
	}
	if (!terminated) throw invalidIso("volume descriptor terminator not found");
	if (joliet) return { ...joliet, rockRidgeRoot: primary?.root };
	return primary!;
}

function decodeIdentifier(identifier: Uint8Array, joliet: boolean): string {
	let name: string;
	if (joliet) {
		if (identifier.byteLength % 2 !== 0) throw invalidIso("Joliet identifier has an odd byte length");
		const codeUnits = new Uint16Array(identifier.byteLength / 2);
		for (let index = 0; index < codeUnits.length; index++) codeUnits[index] = readUInt16BE(identifier, index * 2);
		const chunks: string[] = [];
		for (let index = 0; index < codeUnits.length; index += 4096) {
			chunks.push(String.fromCharCode(...codeUnits.subarray(index, index + 4096)));
		}

View on GitHub (pinned to 9690622007)

Solutions

  1. Re-master the content as ISO 9660 with xorriso/genisoimage from the original files
  2. Convert the High Sierra image with a conversion utility (e.g. isohybrid-era tools or hs2iso-style converters) that rewrites descriptors to ISO 9660
  3. Mount/inspect the image with a filesystem driver that understands High Sierra (e.g. mount -t hfs/hsfs where available) outside this library
  4. Check whether your dump contains multiple sessions and extract the ISO 9660 session instead

Example fix

// before: reading a High Sierra-only dump
const vol = await readIso(image); // ArchiveError: Unsupported High Sierra...
// after: re-master as ISO 9660
// $ xorriso -as mkisofs -o fixed.iso -r content-dir/
const vol = await readIso(fixedImage);
Defensive patterns

Strategy: fallback

Validate before calling

// check descriptor type bytes at sectors 16.. for 'CD001' vs High Sierra 'CDROM'
const sector16 = new Uint8Array(await Bun.file(path).slice(32768 + 1, 32768 + 6).arrayBuffer());
const isIso = new TextDecoder().decode(sector16) === 'CD001';
if (!isIso) console.warn('not ISO 9660; may be High Sierra');

Type guard

null

Try / catch

try {
  vol = await readIso(image);
} catch (err) {
  if (err instanceof ArchiveError && err.message.includes('High Sierra')) {
    return readWithExternalTool(image); // e.g. xorriso -osirrox extraction
  }
  throw err;
}

Prevention

When it happens

Trigger: Calling the ISO reader (readVolume, reached through the volume/entry APIs) on a disc image whose descriptor sequence contains only High Sierra volume descriptors (CD-ROM signature at the descriptor type) and no primary ISO 9660 or Joliet descriptor before the terminator/limit.

Common situations: Archived CD-ROM images from the mid-1980s (pre-1988), images converted from old mastering software, or hybrid discs where the ISO session is missing and only the High Sierra session was dumped.

Related errors


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