8215398: -Xlog option usage => Invalid decorator '\temp\app_cds.log'.
authorhseigel
Wed, 02 Jan 2019 10:35:33 -0500
changeset 53122 883a1a80a6dc
parent 53121 4c4651aba203
child 53123 96ce82319e82
8215398: -Xlog option usage => Invalid decorator '\temp\app_cds.log'. Summary: On Windows, do not treat ':' as a delimeter when it's in a string such as "C:..." Reviewed-by: dholmes, sspitsyn
src/hotspot/share/logging/logConfiguration.cpp
test/hotspot/jtreg/serviceability/logging/TestFullNames.java
--- a/src/hotspot/share/logging/logConfiguration.cpp	Wed Jan 02 16:05:13 2019 +0100
+++ b/src/hotspot/share/logging/logConfiguration.cpp	Wed Jan 02 10:35:33 2019 -0500
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 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
@@ -338,6 +338,15 @@
 
     // Find the next colon or quote
     char* next = strpbrk(str, ":\"");
+#ifdef _WINDOWS
+    // Skip over Windows paths such as "C:\..."
+    // Handle both C:\... and file=C:\..."
+    if (next != NULL && next[0] == ':' && next[1] == '\\') {
+      if (next == str + 1 || (strncmp(str, "file=", 5) == 0)) {
+        next = strpbrk(next + 1, ":\"");
+      }
+    }
+#endif
     while (next != NULL && *next == '"') {
       char* end_quote = strchr(next + 1, '"');
       if (end_quote == NULL) {
@@ -553,7 +562,7 @@
   out->print_cr("\t Log messages tagged with 'gc' tag up to 'debug' level to file 'gc.txt' with no decorations.");
   out->cr();
 
-  out->print_cr(" -Xlog:gc=trace:file=gctrace.txt:uptimemillis,pids:filecount=5,filesize=1m");
+  out->print_cr(" -Xlog:gc=trace:file=gctrace.txt:uptimemillis,pid:filecount=5,filesize=1m");
   out->print_cr("\t Log messages tagged with 'gc' tag up to 'trace' level to a rotating fileset of 5 files of size 1MB,");
   out->print_cr("\t using the base name 'gctrace.txt', with 'uptimemillis' and 'pid' decorations.");
   out->cr();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/serviceability/logging/TestFullNames.java	Wed Jan 02 10:35:33 2019 -0500
@@ -0,0 +1,74 @@
+/*
+ * 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.
+ */
+
+/*
+ * @test TestFullNames
+ * @summary Ensure proper parsing of unquoted full output names for -Xlog arguments.
+ * @bug 8215398
+ * @modules java.base/jdk.internal.misc
+ * @library /test/lib
+ */
+
+import java.io.File;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+import jdk.test.lib.Asserts;
+import jdk.test.lib.process.ProcessTools;
+import jdk.test.lib.process.OutputAnalyzer;
+
+public class TestFullNames {
+
+    public static void main(String[] args) throws Exception {
+        // Ensure log files can be specified with full path.
+        // On windows, this means that the file name will contain
+        // a colon ('C:\log.txt' for example), which is used to
+        // separate -Xlog: options (-Xlog:tags:filename:decorators).
+        // Try to log to a file in our current directory, using its absolute path.
+        String baseName = "testfile.log";
+        Path filePath = Paths.get(baseName).toAbsolutePath();
+        String fileName = filePath.toString();
+        File file = filePath.toFile();
+
+        // In case the file already exists, attempt to delete it before running the test
+        file.delete();
+
+        // Test full pathnames without quotes.
+        String[] validOutputs = new String[] {
+            "file=" + fileName,
+            fileName
+        };
+        for (String logOutput : validOutputs) {
+            // Run with logging=trace on stdout so that we can verify the log configuration afterwards.
+            ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-Xlog:logging=trace",
+                                                                      "-Xlog:all=trace:" + logOutput,
+                                                                      "-version");
+            OutputAnalyzer output = new OutputAnalyzer(pb.start());
+            output.shouldHaveExitValue(0);
+            Asserts.assertTrue(file.exists());
+            file.deleteOnExit(); // Clean up after test
+            output.shouldMatch("\\[logging *\\].*" + baseName); // Expect to see the log output listed
+        }
+    }
+}
+