src/jdk.jpackage/share/classes/jdk/jpackage/internal/DeployParams.java
branchJDK-8200758-branch
changeset 57119 b3dda8d77d8a
parent 57106 ea870b9ce89a
child 57150 fa68c2ab636d
--- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/DeployParams.java	Tue Jan 29 09:38:31 2019 -0500
+++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/DeployParams.java	Tue Jan 29 09:40:14 2019 -0500
@@ -27,6 +27,8 @@
 
 import java.io.File;
 import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.InvalidPathException;
 import java.text.MessageFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -291,40 +293,47 @@
                         null : baseDir.getAbsolutePath(), path);
     }
 
-    static void validateAppName(String s) throws PackagerException {
-        if (s == null || s.length() == 0) {
-            // empty or null string - there is no unsupported char
-            return;
+    static void validateName(String s, boolean forApp)
+            throws PackagerException {
+        
+        String exceptionKey = forApp ?
+            "ERR_InvalidAppName" : "ERR_InvalidSLName";
+        
+        if (s == null) {
+            if (forApp) {
+                return;
+            } else {
+                throw new PackagerException(exceptionKey, s);
+            }
         }
-
-        int last = s.length() - 1;
-
-        char fc = s.charAt(0);
-        char lc = s.charAt(last);
-
-        // illegal to end in backslash escape char
-        if (lc == '\\') {
-            throw new PackagerException("ERR_InvalidCharacterInArgument", "--name");
+        if (s.length() == 0 || s.charAt(s.length() - 1) == '\\') {
+            throw new PackagerException(exceptionKey, s);
+        }
+        try {
+            // name must be valid path element for this file system
+            Path p = (new File(s)).toPath();
+            // and it must be a single name element in a path
+            if (p.getNameCount() != 1) {
+                throw new PackagerException(exceptionKey, s);
+            }
+        } catch (InvalidPathException ipe) {
+            throw new PackagerException(ipe, exceptionKey, s);
         }
 
         for (int i = 0; i < s.length(); i++) {
             char a = s.charAt(i);
             // We check for ASCII codes first which we accept. If check fails,
             // check if it is acceptable extended ASCII or unicode character.
-            if (a < ' ' || a > '~' || a == '%') {
-                // Reject '%', whitespaces and ISO Control.
+            if (a < ' ' || a > '~') {
                 // Accept anything else including special chars like copyright
                 // symbols. Note: space will be included by ASCII check above,
-                // but other whitespace like tabs or new line will be ignored.
-                if (Character.isISOControl(a) ||
-                        Character.isWhitespace(a) || a == '%') {
-                    throw new PackagerException(
-                            "ERR_InvalidCharacterInArgument", "--name");
+                // but other whitespace like tabs or new line will be rejected.
+                if (Character.isISOControl(a)  ||
+                        Character.isWhitespace(a)) {
+                    throw new PackagerException(exceptionKey, s);
                 }
-            }
-            if (a == '"') {
-                throw new PackagerException(
-                        "ERR_InvalidCharacterInArgument", "--name");
+            } else if (a == '"' || a == '%') {
+                throw new PackagerException(exceptionKey, s);
             }
         }
     }
@@ -397,7 +406,7 @@
 
         String name = (String)bundlerArguments.get(
                 Arguments.CLIOptions.NAME.getId());
-        validateAppName(name);
+        validateName(name, true);
 
         // Validate app image if set
         String appImage = (String)bundlerArguments.get(