8310933: Copying from runtime image to application image should not follow symlinks
Reviewed-by: asemenyuk
This commit is contained in:
parent
d3534b08b5
commit
1ca2cfafdd
@ -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<T> extends BundlerParamInfo<T> {
|
||||
|
||||
// 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);
|
||||
|
@ -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",
|
||||
|
107
test/jdk/tools/jpackage/share/RuntimeImageSymbolicLinksTest.java
Normal file
107
test/jdk/tools/jpackage/share/RuntimeImageSymbolicLinksTest.java
Normal file
@ -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);
|
||||
}
|
||||
|
||||
}
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user