RFR: 8352480: Don't follow symlinks in additional content for app images [v3]

Alexey Semenyuk asemenyuk at openjdk.org
Wed May 7 22:49:54 UTC 2025


On Wed, 7 May 2025 02:07:03 GMT, Alexander Matveev <almatvee at openjdk.org> wrote:

>> - Symbolic links will not be followed for `--app-content` on all platforms.
>> - Added test to cover this case.
>> - `MacHelper` updated to use "cp -R" instead of "cp -r" when unpacking DMG, since "cp -r" on macOS is not documented option and when used `cp` will follow symbolic links which breaks test. "cp -R" does not follow symbolic links.
>
> Alexander Matveev has updated the pull request incrementally with one additional commit since the last revision:
> 
>   8352480: [macos] Don't follow symlinks in additional content for app images [v5]

test/jdk/tools/jpackage/share/AppContentTest.java line 116:

> 114:     private static Path getAppContentPath(JPackageCommand cmd, Path name) {
> 115:         Path contentDir = cmd.appLayout().contentDirectory();
> 116:         // Links are always created in "Resources"

> Links are always created in "Resources"

All additional content on macOS is created in the "Resources" directory. On Linux there is no such requirement.

The return value of `getAppContentPath()` is not supposed to depend on the additional content type; the new "name" parameter doesn't make sense to me.

test/jdk/tools/jpackage/share/AppContentTest.java line 147:

> 145: 
> 146:         private static Path copyAppContentPath(Path appContentPath) throws IOException {
> 147:             Path appContentArg = TKit.createTempDirectory("app-content").resolve("Resources");

This is a redundant change

test/jdk/tools/jpackage/share/AppContentTest.java line 149:

> 147:             Path appContentArg = TKit.createTempDirectory("app-content").resolve("Resources");
> 148:             var srcPath = TKit.TEST_SRC_ROOT.resolve(appContentPath);
> 149:             Path dstPath = appContentArg.resolve(srcPath.getFileName());

This is a redundant change

test/jdk/tools/jpackage/share/AppContentTest.java line 164:

> 162:         private static List<Path> initAppContentPaths(List<Path> appContentPaths) {
> 163:             boolean copy = (copyInResources || appContentPaths.stream()
> 164:                             .anyMatch(s -> s.toString().contains("Link")));

`s.toString().contains("Link")` is a lousy way to detect if the path is a symlink. "s" can be an absolute path (to the local OpenJDK repo) that may have a "Link" substring in one of path components, like "/home/BLink/my-projects/open/test/jdk/tools/jpackage/non-existant". The test will fail, and we will have a very hard time figuring out the cause. I'd fix it by narrowing the scope from the full path to the filename; create a dedicated function for detecting if the given path is supposed to be a symlink instead of repeating `.toString().contains("Link")`:

private static boolean isSymlinkPath(Path v) {
    return v.getFileName().toString().contains("Link");
}

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/24974#discussion_r2077510440
PR Review Comment: https://git.openjdk.org/jdk/pull/24974#discussion_r2077512476
PR Review Comment: https://git.openjdk.org/jdk/pull/24974#discussion_r2077512103
PR Review Comment: https://git.openjdk.org/jdk/pull/24974#discussion_r2077542387


More information about the core-libs-dev mailing list