Skip to content

Commit

Permalink
8310933: Copying from runtime image to application image should not f…
Browse files Browse the repository at this point in the history
…ollow symlinks
  • Loading branch information
sashamatveev committed Oct 30, 2023
1 parent 9123961 commit c6626ec
Show file tree
Hide file tree
Showing 4 changed files with 119 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
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;
Expand Down Expand Up @@ -596,8 +597,8 @@ static void copyPredefinedRuntimeImage(Map<String, ? super Object> params,

// copy whole runtime, need to skip jmods and src.zip
final List<String> 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<Path> modulePath = MODULE_PATH.fetchFrom(params);
Expand Down
8 changes: 7 additions & 1 deletion test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TKit.java
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -695,6 +695,12 @@ public static void assertDirectoryExists(Path path) {
"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",
Expand Down
107 changes: 107 additions & 0 deletions test/jdk/tools/jpackage/share/RuntimeImageSymbolicLinksTest.java
Original file line number Diff line number Diff line change
@@ -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);
}

}
13 changes: 2 additions & 11 deletions test/jdk/tools/jpackage/share/RuntimeImageTest.java
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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;
Expand All @@ -45,7 +36,7 @@
* @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
Expand Down

0 comments on commit c6626ec

Please sign in to comment.