From 89de010c1cbfd289a166865efde45443266cd1ad Mon Sep 17 00:00:00 2001 From: chegar Date: Mon, 23 Aug 2010 21:59:13 +0100 Subject: [PATCH] 6977851: NPE from FileURLConnection.connect Reviewed-by: michaelm --- .../www/protocol/file/FileURLConnection.java | 9 ++- .../protocol/file/DirPermissionDenied.java | 59 +++++++++++++++++++ .../www/protocol/file/DirPermissionDenied.sh | 41 +++++++++++++ 3 files changed, 106 insertions(+), 3 deletions(-) create mode 100644 test/sun/net/www/protocol/file/DirPermissionDenied.java create mode 100644 test/sun/net/www/protocol/file/DirPermissionDenied.sh diff --git a/src/share/classes/sun/net/www/protocol/file/FileURLConnection.java b/src/share/classes/sun/net/www/protocol/file/FileURLConnection.java index 3298546e7..787282b82 100644 --- a/src/share/classes/sun/net/www/protocol/file/FileURLConnection.java +++ b/src/share/classes/sun/net/www/protocol/file/FileURLConnection.java @@ -59,7 +59,7 @@ public class FileURLConnection extends URLConnection { String filename; boolean isDirectory = false; boolean exists = false; - List files; + List files; long length = -1; long lastModified = 0; @@ -81,7 +81,10 @@ public class FileURLConnection extends URLConnection { filename = file.toString(); isDirectory = file.isDirectory(); if (isDirectory) { - files = (List) Arrays.asList(file.list()); + String[] fileList = file.list(); + if (fileList == null) + throw new FileNotFoundException(filename + " exists, but is not accessible"); + files = Arrays.asList(fileList); } else { is = new BufferedInputStream(new FileInputStream(filename)); @@ -197,7 +200,7 @@ public class FileURLConnection extends URLConnection { Collections.sort(files, Collator.getInstance()); for (int i = 0 ; i < files.size() ; i++) { - String fileName = (String)files.get(i); + String fileName = files.get(i); buf.append(fileName); buf.append("\n"); } diff --git a/test/sun/net/www/protocol/file/DirPermissionDenied.java b/test/sun/net/www/protocol/file/DirPermissionDenied.java new file mode 100644 index 000000000..7ffe3a1d6 --- /dev/null +++ b/test/sun/net/www/protocol/file/DirPermissionDenied.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2010, 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. + */ + +import java.net.URL; +import java.net.URLConnection; +import java.io.IOException; + +public class DirPermissionDenied { + public static void main(String[] args) throws Exception { + URL url = new URL("file:" + args[0]); + + try { + URLConnection uc = url.openConnection(); + uc.connect(); + } catch (IOException e) { + // OK + } catch (Exception e) { + throw new RuntimeException("Failed " + e); + } + + try { + URLConnection uc = url.openConnection(); + uc.getInputStream(); + } catch (IOException e) { + // OK + } catch (Exception e) { + throw new RuntimeException("Failed " + e); + } + + try { + URLConnection uc = url.openConnection(); + uc.getContentLengthLong(); + } catch (IOException e) { + // OK + } catch (Exception e) { + throw new RuntimeException("Failed " + e); + } + } +} diff --git a/test/sun/net/www/protocol/file/DirPermissionDenied.sh b/test/sun/net/www/protocol/file/DirPermissionDenied.sh new file mode 100644 index 000000000..67930b02b --- /dev/null +++ b/test/sun/net/www/protocol/file/DirPermissionDenied.sh @@ -0,0 +1,41 @@ +# +# Copyright (c) 2010, 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 +# @bug 6977851 +# @summary NPE from FileURLConnection.connect +# @build DirPermissionDenied +# @run shell DirPermissionDenied.sh + +TESTDIR="${TESTCLASSES}/DirPermissionDeniedDirectory" +echo ${TESTDIR} + +rm -rf ${TESTDIR} +mkdir -p ${TESTDIR} +chmod 333 ${TESTDIR} + +$TESTJAVA/bin/java -classpath $TESTCLASSES DirPermissionDenied ${TESTDIR} +result=$? +rm -rf ${TESTDIR} +exit $result -- GitLab