diff -r 2c3cc4b01880 -r c16ac7a2eba4 src/jdk.jfr/share/classes/jdk/jfr/internal/SecuritySupport.java --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/SecuritySupport.java Wed Oct 30 16:14:56 2019 +0100 +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/SecuritySupport.java Wed Oct 30 19:43:52 2019 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 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 @@ -38,6 +38,7 @@ import java.lang.reflect.ReflectPermission; import java.nio.channels.FileChannel; import java.nio.channels.ReadableByteChannel; +import java.nio.file.DirectoryStream; import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; @@ -65,6 +66,7 @@ import jdk.jfr.FlightRecorderListener; import jdk.jfr.FlightRecorderPermission; import jdk.jfr.Recording; +import jdk.jfr.internal.consumer.FileAccess; /** * Contains JFR code that does @@ -75,7 +77,7 @@ private final static MethodHandles.Lookup LOOKUP = MethodHandles.lookup(); private final static Module JFR_MODULE = Event.class.getModule(); public final static SafePath JFC_DIRECTORY = getPathInProperty("java.home", "lib/jfr"); - + public final static FileAccess PRIVILIGED = new Privileged(); static final SafePath USER_HOME = getPathInProperty("user.home", null); static final SafePath JAVA_IO_TMPDIR = getPathInProperty("java.io.tmpdir", null); @@ -150,7 +152,7 @@ * a malicious provider. * */ - public static final class SafePath { + public static final class SafePath implements Comparable { private final Path path; private final String text; @@ -168,11 +170,20 @@ return path; } + public File toFile() { + return path.toFile(); + } + public String toString() { return text; } @Override + public int compareTo(SafePath that) { + return that.text.compareTo(this.text); + } + + @Override public boolean equals(Object other) { if(other != null && other instanceof SafePath){ return this.toPath().equals(((SafePath) other).toPath()); @@ -303,6 +314,10 @@ doPrivileged(() -> MetadataRepository.getInstance().registerMirror(eventClass), new FlightRecorderPermission(Utils.REGISTER_EVENT)); } + public static void setProperty(String propertyName, String value) { + doPrivileged(() -> System.setProperty(propertyName, value), new PropertyPermission(propertyName, "write")); + } + static boolean getBooleanProperty(String propertyName) { return doPrivilegedWithReturn(() -> Boolean.getBoolean(propertyName), new PropertyPermission(propertyName, "read")); } @@ -343,7 +358,7 @@ doPriviligedIO(() -> Files.walkFileTree(safePath.toPath(), new DirectoryCleaner())); } - static SafePath toRealPath(SafePath safePath) throws Exception { + static SafePath toRealPath(SafePath safePath) throws IOException { return new SafePath(doPrivilegedIOWithReturn(() -> safePath.toPath().toRealPath())); } @@ -369,7 +384,8 @@ } public static boolean exists(SafePath safePath) throws IOException { - return doPrivilegedIOWithReturn(() -> Files.exists(safePath.toPath())); + // Files.exist(path) is allocation intensive + return doPrivilegedIOWithReturn(() -> safePath.toPath().toFile().exists()); } public static boolean isDirectory(SafePath safePath) throws IOException { @@ -421,7 +437,7 @@ } static Class defineClass(Class lookupClass, byte[] bytes) { - return AccessController.doPrivileged(new PrivilegedAction<>() { + return AccessController.doPrivileged(new PrivilegedAction>() { @Override public Class run() { try { @@ -433,7 +449,7 @@ }); } - static Thread createThreadWitNoPermissions(String threadName, Runnable runnable) { + public static Thread createThreadWitNoPermissions(String threadName, Runnable runnable) { return doPrivilegedWithReturn(() -> new Thread(runnable, threadName), new Permission[0]); } @@ -444,4 +460,32 @@ public static SafePath getAbsolutePath(SafePath path) throws IOException { return new SafePath(doPrivilegedIOWithReturn((()-> path.toPath().toAbsolutePath()))); } + + private final static class Privileged extends FileAccess { + @Override + public RandomAccessFile openRAF(File f, String mode) throws IOException { + return doPrivilegedIOWithReturn( () -> new RandomAccessFile(f, mode)); + } + + @Override + public DirectoryStream newDirectoryStream(Path directory) throws IOException { + return doPrivilegedIOWithReturn( () -> Files.newDirectoryStream(directory)); + } + + @Override + public String getAbsolutePath(File f) throws IOException { + return doPrivilegedIOWithReturn( () -> f.getAbsolutePath()); + } + @Override + public long length(File f) throws IOException { + return doPrivilegedIOWithReturn( () -> f.length()); + } + + @Override + public long fileSize(Path p) throws IOException { + return doPrivilegedIOWithReturn( () -> Files.size(p)); + } + } + + }