diff --git a/core/src/main/java/org/testcontainers/utility/DockerImageName.java b/core/src/main/java/org/testcontainers/utility/DockerImageName.java index b3babc29c91..ef361b982e6 100644 --- a/core/src/main/java/org/testcontainers/utility/DockerImageName.java +++ b/core/src/main/java/org/testcontainers/utility/DockerImageName.java @@ -87,14 +87,19 @@ public DockerImageName(String fullImageName) { } if (remoteName.contains("@sha256:")) { - String beforeDigest = remoteName.split("@sha256:")[0]; + String[] nameAndDigest = remoteName.split("@sha256:", 3); + if (nameAndDigest.length != 2 || nameAndDigest[1].isEmpty()) { + throw new IllegalArgumentException("Invalid SHA-256 digest in Docker image name: " + fullImageName); + } + String beforeDigest = nameAndDigest[0]; + String digest = nameAndDigest[1]; if (beforeDigest.contains(":")) { repository = beforeDigest.split(":")[0]; String tag = beforeDigest.split(":", 2)[1]; - versioning = new Sha256Versioning(remoteName.split("@sha256:")[1], tag); + versioning = new Sha256Versioning(digest, tag); } else { repository = beforeDigest; - versioning = new Sha256Versioning(remoteName.split("@sha256:")[1]); + versioning = new Sha256Versioning(digest); } } else if (remoteName.contains(":")) { repository = remoteName.split(":")[0]; diff --git a/core/src/test/java/org/testcontainers/utility/DockerImageNameTest.java b/core/src/test/java/org/testcontainers/utility/DockerImageNameTest.java index 5b42322d678..55605e767c0 100644 --- a/core/src/test/java/org/testcontainers/utility/DockerImageNameTest.java +++ b/core/src/test/java/org/testcontainers/utility/DockerImageNameTest.java @@ -5,6 +5,7 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; +import org.junit.jupiter.params.provider.ValueSource; import java.util.stream.Stream; @@ -60,6 +61,16 @@ void testInvalidNameRejected(String imageName) { assertThatThrownBy(() -> DockerImageName.parse(imageName).assertValid()) .isInstanceOf(IllegalArgumentException.class); } + + @ParameterizedTest + @ValueSource(strings = { "", "1234abcd1234abcd1234abcd1234abcd" }) + void rejectsRepeatedDigestWhenParsing(String secondDigest) { + String digestSuffix = "@sha256:1234abcd1234abcd1234abcd1234abcd@sha256:" + secondDigest; + assertThatThrownBy(() -> DockerImageName.parse("myname" + digestSuffix)) + .isInstanceOf(IllegalArgumentException.class); + assertThatThrownBy(() -> DockerImageName.parse("myname:latest" + digestSuffix)) + .isInstanceOf(IllegalArgumentException.class); + } } @Nested