提交 f9cc3a10 编写于 作者: A andrew

8235909: File.exists throws AccessControlException for invalid paths when a...

8235909: File.exists throws AccessControlException for invalid paths when a SecurityManager is installed
Summary: Backport of JDK-8213429 missed handling the "<<ALL FILES>>" special case
Reviewed-by: mbalao
上级 926663de
...@@ -46,8 +46,11 @@ import sun.security.util.SecurityConstants; ...@@ -46,8 +46,11 @@ import sun.security.util.SecurityConstants;
* the file separator character, <code>File.separatorChar</code>) indicates * the file separator character, <code>File.separatorChar</code>) indicates
* all the files and directories contained in that directory. A pathname * all the files and directories contained in that directory. A pathname
* that ends with "/-" indicates (recursively) all files * that ends with "/-" indicates (recursively) all files
* and subdirectories contained in that directory. A pathname consisting of * and subdirectories contained in that directory. Such a pathname is called
* the special token "&lt;&lt;ALL FILES&gt;&gt;" matches <b>any</b> file. * a wildcard pathname. Otherwise, it's a simple pathname.
* <P>
* A pathname consisting of the special token {@literal "<<ALL FILES>>"}
* matches <b>any</b> file.
* <P> * <P>
* Note: A pathname consisting of a single "*" indicates all the files * Note: A pathname consisting of a single "*" indicates all the files
* in the current directory, while a pathname consisting of a single "-" * in the current directory, while a pathname consisting of a single "-"
...@@ -80,7 +83,7 @@ import sun.security.util.SecurityConstants; ...@@ -80,7 +83,7 @@ import sun.security.util.SecurityConstants;
* <P> * <P>
* Be careful when granting FilePermissions. Think about the implications * Be careful when granting FilePermissions. Think about the implications
* of granting read and especially write access to various files and * of granting read and especially write access to various files and
* directories. The "&lt;&lt;ALL FILES&gt;&gt;" permission with write action is * directories. The {@literal "<<ALL FILES>>"} permission with write action is
* especially dangerous. This grants permission to write to the entire * especially dangerous. This grants permission to write to the entire
* file system. One thing this effectively allows is replacement of the * file system. One thing this effectively allows is replacement of the
* system binary, including the JVM runtime environment. * system binary, including the JVM runtime environment.
...@@ -156,6 +159,7 @@ public final class FilePermission extends Permission implements Serializable { ...@@ -156,6 +159,7 @@ public final class FilePermission extends Permission implements Serializable {
private transient String cpath; private transient String cpath;
private transient boolean allFiles; // whether this is <<ALL FILES>>
private transient boolean invalid; // whether input path is invalid private transient boolean invalid; // whether input path is invalid
// static Strings used by init(int mask) // static Strings used by init(int mask)
...@@ -207,6 +211,7 @@ public final class FilePermission extends Permission implements Serializable { ...@@ -207,6 +211,7 @@ public final class FilePermission extends Permission implements Serializable {
this.mask = mask; this.mask = mask;
if (cpath.equals("<<ALL FILES>>")) { if (cpath.equals("<<ALL FILES>>")) {
allFiles = true;
directory = true; directory = true;
recursive = true; recursive = true;
cpath = ""; cpath = "";
...@@ -335,6 +340,23 @@ public final class FilePermission extends Permission implements Serializable { ...@@ -335,6 +340,23 @@ public final class FilePermission extends Permission implements Serializable {
* "/tmp/*" encompasses all files in the "/tmp" directory, * "/tmp/*" encompasses all files in the "/tmp" directory,
* including the one named "foo". * including the one named "foo".
* </ul> * </ul>
* <P>
* Precisely, a simple pathname implies another simple pathname
* if and only if they are equal. A simple pathname never implies
* a wildcard pathname. A wildcard pathname implies another wildcard
* pathname if and only if all simple pathnames implied by the latter
* are implied by the former. A wildcard pathname implies a simple
* pathname if and only if
* <ul>
* <li>if the wildcard flag is "*", the simple pathname's path
* must be right inside the wildcard pathname's path.
* <li>if the wildcard flag is "-", the simple pathname's path
* must be recursively inside the wildcard pathname's path.
* </ul>
* <P>
* {@literal "<<ALL FILES>>"} implies every other pathname. No pathname,
* except for {@literal "<<ALL FILES>>"} itself, implies
* {@literal "<<ALL FILES>>"}.
* *
* @param p the permission to check against. * @param p the permission to check against.
* *
...@@ -366,9 +388,15 @@ public final class FilePermission extends Permission implements Serializable { ...@@ -366,9 +388,15 @@ public final class FilePermission extends Permission implements Serializable {
if (this == that) { if (this == that) {
return true; return true;
} }
if (allFiles) {
return true;
}
if (this.invalid || that.invalid) { if (this.invalid || that.invalid) {
return false; return false;
} }
if (that.allFiles) {
return false;
}
if (this.directory) { if (this.directory) {
if (this.recursive) { if (this.recursive) {
// make sure that.path is longer then path so // make sure that.path is longer then path so
...@@ -415,6 +443,10 @@ public final class FilePermission extends Permission implements Serializable { ...@@ -415,6 +443,10 @@ public final class FilePermission extends Permission implements Serializable {
* Checks two FilePermission objects for equality. Checks that <i>obj</i> is * Checks two FilePermission objects for equality. Checks that <i>obj</i> is
* a FilePermission, and has the same pathname and actions as this object. * a FilePermission, and has the same pathname and actions as this object.
* *
* @implNote More specifically, two pathnames are the same if and only if
* they have the same wildcard flag and their
* {@code npath} are equal. Or they are both {@literal "<<ALL FILES>>"}.
*
* @param obj the object we are testing for equality with this object. * @param obj the object we are testing for equality with this object.
* @return <code>true</code> if obj is a FilePermission, and has the same * @return <code>true</code> if obj is a FilePermission, and has the same
* pathname and actions as this FilePermission object, * pathname and actions as this FilePermission object,
...@@ -433,6 +465,7 @@ public final class FilePermission extends Permission implements Serializable { ...@@ -433,6 +465,7 @@ public final class FilePermission extends Permission implements Serializable {
return false; return false;
} }
return (this.mask == that.mask) && return (this.mask == that.mask) &&
(this.allFiles == that.allFiles) &&
this.cpath.equals(that.cpath) && this.cpath.equals(that.cpath) &&
(this.directory == that.directory) && (this.directory == that.directory) &&
(this.recursive == that.recursive); (this.recursive == that.recursive);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册