containerd 2.4.1 turns example.com/../other into the registry other
example.com/../other/image:latest does not name example.com once containerd’s own reference parser has finished with it. On the v2.4.1 module, Parse returned a locator of other/image and a hostname of other. The same call on v2.4.2 returned invalid reference and no locator. Both results came from the tagged module, not from a reimplementation of the function, and neither call opened a registry connection.
That split is easy to miss if the only check is a CRI pull error. containerd’s CRI PullImage parses the name with distribution.ParseDockerRef before it asks the transfer service or client.Pull to fetch anything. github.com/distribution/reference v0.6.0, the version required by containerd v2.4.1, already rejects a .. path component. A pod that fails there never reaches the parser that rewrites the host. ctr, the transfer service, and client.Pull do not take that detour. The docker resolver builds its registry host from reference.Parse in resolveDockerBase. On an unfixed module, the host it builds is the host left after path.Join, not the host that was written in the reference.