8220700: jlink generated launcher script needs quoting to avoid parameter expansion
authorsundar
Wed, 21 Aug 2019 17:38:19 +0530
changeset 57821 182f94955cfb
parent 57819 40006c0ada91
child 57822 df3397f95387
8220700: jlink generated launcher script needs quoting to avoid parameter expansion Reviewed-by: mchung, alanb, sgehwolf
src/jdk.jlink/share/classes/jdk/tools/jlink/builder/DefaultImageBuilder.java
test/jdk/tools/jlink/basic/BasicTest.java
test/jdk/tools/jlink/basic/src/test/jdk/test/Adder.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,
--- 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 {
--- /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
+    }
+}