4858457: File.getCanonicalPath() throws IOException when invoked with "nul" (win)
Reviewed-by: alanb
--- 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);
+ }
+ }
}
}
}