# HG changeset patch # User sundar # Date 1566389299 -19800 # Node ID 182f94955cfbbdad7e2f22193956395912c6317b # Parent 40006c0ada9137fb4cae4c6ed48b27dbcb1806f8 8220700: jlink generated launcher script needs quoting to avoid parameter expansion Reviewed-by: mchung, alanb, sgehwolf diff -r 40006c0ada91 -r 182f94955cfb src/jdk.jlink/share/classes/jdk/tools/jlink/builder/DefaultImageBuilder.java --- a/src/jdk.jlink/share/classes/jdk/tools/jlink/builder/DefaultImageBuilder.java Wed Aug 21 00:08:35 2019 +0200 +++ b/src/jdk.jlink/share/classes/jdk/tools/jlink/builder/DefaultImageBuilder.java Wed Aug 21 17:38:19 2019 +0530 @@ -300,7 +300,7 @@ sb.append("$DIR/java $JLINK_VM_OPTIONS -m ") .append(module).append('/') .append(mainClassName) - .append(" $@\n"); + .append(" \"$@\"\n"); try (BufferedWriter writer = Files.newBufferedWriter(cmd, StandardCharsets.ISO_8859_1, diff -r 40006c0ada91 -r 182f94955cfb test/jdk/tools/jlink/basic/BasicTest.java --- a/test/jdk/tools/jlink/basic/BasicTest.java Wed Aug 21 00:08:35 2019 +0200 +++ b/test/jdk/tools/jlink/basic/BasicTest.java Wed Aug 21 17:38:19 2019 +0530 @@ -100,7 +100,6 @@ runJmod(classes.toString(), TEST_MODULE, true); runJlink(image, TEST_MODULE, "--launcher", "bar=" + TEST_MODULE); execute(image, "bar"); - Files.delete(jmods.resolve(TEST_MODULE + ".jmod")); image = Paths.get("myimage2"); @@ -108,7 +107,28 @@ // specify main class in --launcher command line runJlink(image, TEST_MODULE, "--launcher", "bar2=" + TEST_MODULE + "/jdk.test.Test"); execute(image, "bar2"); + Files.delete(jmods.resolve(TEST_MODULE + ".jmod")); + image = Paths.get("myadder"); + runJmod(classes.toString(), TEST_MODULE, false /* no ModuleMainClass! */); + // specify main class in --launcher command line + runJlink(image, TEST_MODULE, "--launcher", "adder=" + TEST_MODULE + "/jdk.test.Adder"); + addAndCheck(image, "adder"); + } + + private void addAndCheck(Path image, String scriptName) throws Throwable { + String cmd = image.resolve("bin").resolve(scriptName).toString(); + OutputAnalyzer analyzer; + if (System.getProperty("os.name").startsWith("Windows")) { + analyzer = ProcessTools.executeProcess("sh.exe", cmd, "12", "8", "7", "--", "foo bar"); + } else { + analyzer = ProcessTools.executeProcess(cmd, "12", "8", "7", "--", "foo bar"); + } + if (analyzer.getExitValue() != 27) { + throw new AssertionError("Image invocation failed: expected 27, rc=" + analyzer.getExitValue()); + } + // last argument contains space and should be properly quoted. + analyzer.stdoutShouldContain("Num args: 5"); } private void execute(Path image, String scriptName) throws Throwable { diff -r 40006c0ada91 -r 182f94955cfb test/jdk/tools/jlink/basic/src/test/jdk/test/Adder.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/jdk/tools/jlink/basic/src/test/jdk/test/Adder.java Wed Aug 21 17:38:19 2019 +0530 @@ -0,0 +1,45 @@ +/** + * Copyright (c) 2019, 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. + */ + +package jdk.test; + +import java.util.Arrays; + +public class Adder { + public static void main(String[] args) { + System.out.println(Adder.class + " ..."); + System.out.println("Num args: " + args.length); + System.out.println("args list: " + Arrays.asList(args)); + int sum = 0; + // Only add arguments upto "--". The remaining argument(s) are for + // testing quoting. + for (String arg: args) { + System.out.println(arg); + if ("--".equals(arg)) { + break; + } + sum += Integer.parseInt(arg); + } + System.exit(sum); // checked by the test + } +}