4858457: File.getCanonicalPath() throws IOException when invoked with "nul" (win)
authordxu
Thu, 15 Aug 2013 12:36:50 -0700
changeset 19418 bb4ae810197e
parent 19417 1961620638ea
child 19419 67b5c7d91daa
4858457: File.getCanonicalPath() throws IOException when invoked with "nul" (win) Reviewed-by: alanb
jdk/src/windows/native/java/io/canonicalize_md.c
jdk/test/java/io/File/WinDeviceName.java
--- a/jdk/src/windows/native/java/io/canonicalize_md.c	Thu Aug 15 19:56:53 2013 +0100
+++ b/jdk/src/windows/native/java/io/canonicalize_md.c	Thu Aug 15 12:36:50 2013 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2013, 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
@@ -179,6 +179,10 @@
 wdots(WCHAR *start)
 {
     WCHAR *p = start;
+    // Skip "\\.\" prefix
+    if (wcslen(p) > 4 && !wcsncmp(p, L"\\\\.\\", 4))
+        p = p + 4;
+
     while (*p) {
         if ((p = wcschr(p, L'.')) == NULL) // find next occurence of '.'
             return 0; // no more dots
--- a/jdk/test/java/io/File/WinDeviceName.java	Thu Aug 15 19:56:53 2013 +0100
+++ b/jdk/test/java/io/File/WinDeviceName.java	Thu Aug 15 12:36:50 2013 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2013, 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
@@ -22,11 +22,12 @@
  */
 
 /* @test
-   @bug 6176051
-   @summary Check isFile's handling of Windows device names
+   @bug 6176051 4858457
+   @summary Check whether reserved names are handled correctly on Windows
  */
 
 import java.io.File;
+import java.io.IOException;
 
 public class WinDeviceName {
     private static String devnames[] = {
@@ -35,22 +36,38 @@
         "LPT3", "LPT4", "LPT5", "LPT6", "LPT7", "LPT8", "LPT9",
         "CLOCK$"
     };
-    public static void main(String[] args) throws Exception {
+    public static void main(String[] args) {
         String osName = System.getProperty("os.name");
         if (!osName.startsWith("Windows")) {
             return;
         }
+
         for (int i = 0; i < devnames.length; i++) {
-            if (new File(devnames[i]).isFile() ||
-                new File(devnames[i] + ".txt").isFile()) {
-                if ("CLOCK$".equals(devnames[i]) &&
-                    (osName.startsWith("Windows 9") ||
-                     osName.startsWith("Windows Me"))) {
-                    //"CLOCK$" is a reserved device name for NT
-                    continue;
+            String names[] = { devnames[i], devnames[i] + ".TXT",
+                               devnames[i].toLowerCase(),
+                               devnames[i].toLowerCase() + ".txt" };
+
+            for (String name : names) {
+                File f = new File(name);
+                if (f.isFile()) {
+                    if ("CLOCK$".equals(devnames[i]) &&
+                        (osName.startsWith("Windows 9") ||
+                         osName.startsWith("Windows Me"))) {
+                        //"CLOCK$" is a reserved device name for NT
+                        continue;
+                    }
+                    throw new RuntimeException("isFile() returns true for " +
+                            "Device name " + devnames[i]);
                 }
-                throw new Exception("isFile() returns true for Device name "
-                                    +  devnames[i]);
+
+                if (!"CLOCK$".equals(devnames[i])) {
+                    try {
+                        System.out.println((new File(name)).getCanonicalPath());
+                    } catch(IOException ie) {
+                        throw new RuntimeException("Fail to get canonical " +
+                                "path for " + name);
+                    }
+                }
             }
         }
     }