From 1ca2cfafdd906851b923be69852ccf9a3bb4db35 Mon Sep 17 00:00:00 2001 From: Alexander Matveev Date: Mon, 30 Oct 2023 21:09:17 +0000 Subject: [PATCH] 8310933: Copying from runtime image to application image should not follow symlinks Reviewed-by: asemenyuk --- .../internal/StandardBundlerParam.java | 5 +- .../helpers/jdk/jpackage/test/TKit.java | 8 +- .../share/RuntimeImageSymbolicLinksTest.java | 107 ++++++++++++++++++ .../jpackage/share/RuntimeImageTest.java | 13 +-- 4 files changed, 119 insertions(+), 14 deletions(-) create mode 100644 test/jdk/tools/jpackage/share/RuntimeImageSymbolicLinksTest.java diff --git a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/StandardBundlerParam.java b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/StandardBundlerParam.java index e72efff10df..a50293aedb5 100644 --- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/StandardBundlerParam.java +++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/StandardBundlerParam.java @@ -30,6 +30,7 @@ import jdk.internal.util.OperatingSystem; import java.io.File; import java.io.IOException; import java.nio.file.Files; +import java.nio.file.LinkOption; import java.nio.file.Path; import java.text.MessageFormat; import java.util.ArrayList; @@ -596,8 +597,8 @@ class StandardBundlerParam extends BundlerParamInfo { // copy whole runtime, need to skip jmods and src.zip final List excludes = Arrays.asList("jmods", "src.zip"); - IOUtils.copyRecursive(topImage, - appLayout.runtimeHomeDirectory(), excludes); + IOUtils.copyRecursive(topImage, appLayout.runtimeHomeDirectory(), + excludes, LinkOption.NOFOLLOW_LINKS); // if module-path given - copy modules to appDir/mods List modulePath = MODULE_PATH.fetchFrom(params); diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TKit.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TKit.java index 9e4d2f86c00..297cf3ec36e 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TKit.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TKit.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -695,6 +695,12 @@ final public class TKit { "Check [%s] is a directory", path)); } + public static void assertSymbolicLinkExists(Path path) { + assertPathExists(path, true); + assertTrue(Files.isSymbolicLink(path), String.format + ("Check [%s] is a symbolic link", path)); + } + public static void assertFileExists(Path path) { assertPathExists(path, true); assertTrue(path.toFile().isFile(), String.format("Check [%s] is a file", diff --git a/test/jdk/tools/jpackage/share/RuntimeImageSymbolicLinksTest.java b/test/jdk/tools/jpackage/share/RuntimeImageSymbolicLinksTest.java new file mode 100644 index 00000000000..1726fe3eac6 --- /dev/null +++ b/test/jdk/tools/jpackage/share/RuntimeImageSymbolicLinksTest.java @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.HashSet; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; +import jdk.jpackage.internal.ApplicationLayout; +import jdk.jpackage.test.TKit; +import jdk.jpackage.test.PackageTest; +import jdk.jpackage.test.PackageType; +import jdk.jpackage.test.Functional; +import jdk.jpackage.test.Annotations.Test; +import jdk.jpackage.test.Annotations.Parameter; +import jdk.jpackage.test.JPackageCommand; +import jdk.jpackage.test.JavaTool; +import jdk.jpackage.test.Executor; + +/** + * Test --runtime-image parameter with runtime image containing symbolic links. + * This test only for macOS and Linux. + */ + +/* + * @test + * @summary jpackage with --runtime-image + * @library ../helpers + * @key jpackagePlatformPackage + * @requires (os.family != "windows") + * @build jdk.jpackage.test.* + * @modules jdk.jpackage/jdk.jpackage.internal + * @compile RuntimeImageSymbolicLinksTest.java + * @run main/othervm/timeout=1400 -Xmx512m jdk.jpackage.test.Main + * --jpt-run=RuntimeImageSymbolicLinksTest + */ + +public class RuntimeImageSymbolicLinksTest { + + @Test + public static void test() throws Exception { + final Path workDir = TKit.createTempDirectory("runtime").resolve("data"); + final Path jlinkOutputDir = workDir.resolve("temp.runtime"); + Files.createDirectories(jlinkOutputDir.getParent()); + + new Executor() + .setToolProvider(JavaTool.JLINK) + .dumpOutput() + .addArguments( + "--output", jlinkOutputDir.toString(), + "--add-modules", "ALL-MODULE-PATH", + "--strip-debug", + "--no-header-files", + "--no-man-pages", + "--strip-native-commands") + .execute(); + + // Add symbolic links to generated runtime image + // Release file + Path releaseLink = jlinkOutputDir.resolve("releaseLink"); + Path releaseTarget = Path.of("release"); + TKit.assertFileExists(jlinkOutputDir.resolve("release")); + Files.createSymbolicLink(releaseLink, releaseTarget); + // Legal directory + Path legalLink = jlinkOutputDir.resolve("legalLink"); + Path legalTarget = Path.of("legal"); + TKit.assertDirectoryExists(jlinkOutputDir.resolve("legal")); + Files.createSymbolicLink(legalLink, legalTarget); + + JPackageCommand cmd = JPackageCommand.helloAppImage() + .setArgumentValue("--runtime-image", jlinkOutputDir.toString()); + + cmd.executeAndAssertHelloAppImageCreated(); + + ApplicationLayout appLayout = cmd.appLayout(); + Path runtimeDir = appLayout.runtimeHomeDirectory(); + + // Make sure that links are exist + releaseLink = runtimeDir.resolve("releaseLink"); + TKit.assertSymbolicLinkExists(releaseLink); + legalLink = runtimeDir.resolve("legalLink"); + TKit.assertSymbolicLinkExists(legalLink); + } + +} diff --git a/test/jdk/tools/jpackage/share/RuntimeImageTest.java b/test/jdk/tools/jpackage/share/RuntimeImageTest.java index 3d66a163c07..36009f570c3 100644 --- a/test/jdk/tools/jpackage/share/RuntimeImageTest.java +++ b/test/jdk/tools/jpackage/share/RuntimeImageTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,20 +21,11 @@ * questions. */ -import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; -import java.util.HashSet; -import java.util.Optional; -import java.util.Set; -import java.util.stream.Collectors; import jdk.jpackage.test.TKit; -import jdk.jpackage.test.PackageTest; -import jdk.jpackage.test.PackageType; -import jdk.jpackage.test.Functional; import jdk.jpackage.test.Annotations.Test; import jdk.jpackage.test.Annotations.Parameter; -import jdk.jpackage.test.PackageTest; import jdk.jpackage.test.JPackageCommand; import jdk.jpackage.test.JavaTool; import jdk.jpackage.test.Executor; @@ -45,7 +36,7 @@ import jdk.jpackage.test.Executor; * @library ../helpers * @key jpackagePlatformPackage * @build jdk.jpackage.test.* - * @modules jdk.incubator.jpackage/jdk.incubator.jpackage.internal + * @modules jdk.jpackage/jdk.jpackage.internal * @compile RuntimeImageTest.java * @run main/othervm/timeout=1400 -Xmx512m jdk.jpackage.test.Main * --jpt-run=RuntimeImageTest