Skip to content

fix(Platform): make arm64 nil-variant and v8 hash identically#764

Open
Otoru wants to merge 1 commit into
apple:mainfrom
Otoru:fix/platform-hash-arm64-variant
Open

fix(Platform): make arm64 nil-variant and v8 hash identically#764
Otoru wants to merge 1 commit into
apple:mainfrom
Otoru:fix/platform-hash-arm64-variant

Conversation

@Otoru

@Otoru Otoru commented Jun 11, 2026

Copy link
Copy Markdown

Summary

Platform.== treats arm64 with nil variant as equal to arm64/v8, but hash(into:) used description which serializes them differently (linux/arm64 vs linux/arm64/v8). This violates the Hashable contract — equal values must produce the same hash.

Root cause

// == returns true for these two
let a = Platform(arch: "arm64", os: "linux", variant: nil)
let b = Platform(arch: "arm64", os: "linux", variant: "v8")
a == b // true ✓

// but hash was different — broken
a.hashValue == b.hashValue // false ✗ (before this fix)

This mismatch caused Set<Platform> and Dictionary<Platform, ...> lookups to silently miss entries when one platform was decoded from JSON (no variant field in the manifest) and another was created via Platform(from:) or Platform.current (which both set variant = "v8").

Practical consequence

In apple/container, this manifests as inconsistent platform-string normalization across stages of a single container build — some stages log linux/arm64, others linux/arm64/v8 — which can cause COPY --from=<stage> to fail to resolve the source stage under concurrent builds. See apple/container#1542.

Fix

hash(into:) now normalizes arm64 with nil variant to "v8" before hashing, matching the existing == behavior.

Platform.== treats arm64 with nil variant as equal to arm64/v8, but
hash(into:) used description which serializes them differently
("linux/arm64" vs "linux/arm64/v8"). This violated the Hashable
contract and caused Set/Dictionary lookups to miss entries when one
platform was decoded from JSON (no variant field) and another was
created via Platform(from:) or Platform.current (which set variant=v8).

The practical consequence was inconsistent platform-string normalization
across stages of a single container build, which could cause
COPY --from=<stage> to fail to resolve the source stage.

Fix hash(into:) to normalize arm64 nil variant to "v8" before hashing,
matching the existing == behavior.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant