src/jdk.jfr/share/classes/jdk/jfr/internal/SecuritySupport.java
author cito
Sat, 26 Jan 2019 15:47:50 +0900
changeset 58240 046533575954
parent 52698 ca6b58b8ffc5
child 58249 e17143e28542
child 58863 c16ac7a2eba4
permissions -rw-r--r--
8216565: Specifying the same path creates a new directory in JFR.configure Reviewed-by: ysuenaga, egahlin
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     1
/*
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     2
 * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     4
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    10
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    15
 * accompanied this code).
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    16
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    20
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    23
 * questions.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    24
 */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    25
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    26
package jdk.jfr.internal;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    27
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    28
import java.io.File;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    29
import java.io.FileNotFoundException;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    30
import java.io.IOException;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    31
import java.io.InputStream;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    32
import java.io.RandomAccessFile;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    33
import java.io.Reader;
52015
821bfc24d750 8181443: Replace usages of jdk.internal.misc.Unsafe with MethodHandles.Lookup.defineClass
mchung
parents: 50113
diff changeset
    34
import java.lang.invoke.MethodHandles;
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    35
import java.lang.reflect.Constructor;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    36
import java.lang.reflect.Field;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    37
import java.lang.reflect.Method;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    38
import java.lang.reflect.ReflectPermission;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    39
import java.nio.channels.FileChannel;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    40
import java.nio.channels.ReadableByteChannel;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    41
import java.nio.file.FileVisitResult;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    42
import java.nio.file.Files;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    43
import java.nio.file.Path;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    44
import java.nio.file.Paths;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    45
import java.nio.file.SimpleFileVisitor;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    46
import java.nio.file.StandardOpenOption;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    47
import java.nio.file.attribute.BasicFileAttributes;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    48
import java.security.AccessControlContext;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    49
import java.security.AccessController;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    50
import java.security.Permission;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    51
import java.security.PrivilegedAction;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    52
import java.security.PrivilegedActionException;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    53
import java.security.PrivilegedExceptionAction;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    54
import java.util.ArrayList;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    55
import java.util.Iterator;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    56
import java.util.List;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    57
import java.util.Objects;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    58
import java.util.PropertyPermission;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    59
import java.util.concurrent.Callable;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    60
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    61
import jdk.internal.misc.Unsafe;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    62
import jdk.internal.module.Modules;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    63
import jdk.jfr.Event;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    64
import jdk.jfr.FlightRecorder;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    65
import jdk.jfr.FlightRecorderListener;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    66
import jdk.jfr.FlightRecorderPermission;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    67
import jdk.jfr.Recording;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    68
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    69
/**
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    70
 * Contains JFR code that does
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    71
 * {@link AccessController#doPrivileged(PrivilegedAction)}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    72
 */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    73
public final class SecuritySupport {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    74
    private final static Unsafe unsafe = Unsafe.getUnsafe();
52015
821bfc24d750 8181443: Replace usages of jdk.internal.misc.Unsafe with MethodHandles.Lookup.defineClass
mchung
parents: 50113
diff changeset
    75
    private final static MethodHandles.Lookup LOOKUP = MethodHandles.lookup();
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    76
    private final static Module JFR_MODULE = Event.class.getModule();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    77
    public  final static SafePath JFC_DIRECTORY = getPathInProperty("java.home", "lib/jfr");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    78
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    79
    static final SafePath USER_HOME = getPathInProperty("user.home", null);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    80
    static final SafePath JAVA_IO_TMPDIR = getPathInProperty("java.io.tmpdir", null);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    81
52698
ca6b58b8ffc5 8214287: SpecJbb2005StressModule got uncaught exception
mgronlun
parents: 52334
diff changeset
    82
    static {
ca6b58b8ffc5 8214287: SpecJbb2005StressModule got uncaught exception
mgronlun
parents: 52334
diff changeset
    83
        // ensure module java.base can read module jdk.jfr as early as possible
ca6b58b8ffc5 8214287: SpecJbb2005StressModule got uncaught exception
mgronlun
parents: 52334
diff changeset
    84
        addReadEdge(Object.class);
ca6b58b8ffc5 8214287: SpecJbb2005StressModule got uncaught exception
mgronlun
parents: 52334
diff changeset
    85
        addHandlerExport(Object.class);
ca6b58b8ffc5 8214287: SpecJbb2005StressModule got uncaught exception
mgronlun
parents: 52334
diff changeset
    86
        addEventsExport(Object.class);
ca6b58b8ffc5 8214287: SpecJbb2005StressModule got uncaught exception
mgronlun
parents: 52334
diff changeset
    87
        addInstrumentExport(Object.class);
ca6b58b8ffc5 8214287: SpecJbb2005StressModule got uncaught exception
mgronlun
parents: 52334
diff changeset
    88
    }
ca6b58b8ffc5 8214287: SpecJbb2005StressModule got uncaught exception
mgronlun
parents: 52334
diff changeset
    89
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    90
    final static class SecureRecorderListener implements FlightRecorderListener {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    91
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    92
        private final AccessControlContext context;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    93
        private final FlightRecorderListener changeListener;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    94
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    95
        SecureRecorderListener(AccessControlContext context, FlightRecorderListener changeListener) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    96
            this.context = Objects.requireNonNull(context);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    97
            this.changeListener = Objects.requireNonNull(changeListener);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    98
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    99
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   100
        @Override
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   101
        public void recordingStateChanged(Recording recording) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   102
            AccessController.doPrivileged((PrivilegedAction<Void>) () -> {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   103
                try {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   104
                    changeListener.recordingStateChanged(recording);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   105
                } catch (Throwable t) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   106
                    // Prevent malicious user to propagate exception callback in the wrong context
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   107
                    Logger.log(LogTag.JFR, LogLevel.WARN, "Unexpected exception in listener " + changeListener.getClass()+ " at recording state change");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   108
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   109
                return null;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   110
            }, context);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   111
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   112
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   113
        @Override
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   114
        public void recorderInitialized(FlightRecorder recorder) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   115
            AccessController.doPrivileged((PrivilegedAction<Void>) () -> {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   116
                try  {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   117
                    changeListener.recorderInitialized(recorder);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   118
                } catch (Throwable t) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   119
                    // Prevent malicious user to propagate exception callback in the wrong context
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   120
                    Logger.log(LogTag.JFR, LogLevel.WARN, "Unexpected exception in listener " + changeListener.getClass()+ " when initializing FlightRecorder");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   121
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   122
                return null;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   123
            }, context);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   124
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   125
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   126
        public FlightRecorderListener getChangeListener() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   127
            return changeListener;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   128
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   129
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   130
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   131
    private static final class DirectoryCleaner extends SimpleFileVisitor<Path> {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   132
        @Override
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   133
        public FileVisitResult visitFile(Path path, BasicFileAttributes attrs) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   134
            Files.delete(path);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   135
            return FileVisitResult.CONTINUE;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   136
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   137
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   138
        @Override
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   139
        public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   140
            if (exc != null) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   141
                throw exc;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   142
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   143
            Files.delete(dir);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   144
            return FileVisitResult.CONTINUE;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   145
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   146
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   147
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   148
    /**
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   149
     * Path created by the default file provider,and not
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   150
     * a malicious provider.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   151
     *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   152
     */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   153
    public static final class SafePath {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   154
        private final Path path;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   155
        private final String text;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   156
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   157
        public SafePath(Path p) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   158
            // sanitize
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   159
            text = p.toString();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   160
            path = Paths.get(text);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   161
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   162
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   163
        public SafePath(String path) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   164
            this(Paths.get(path));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   165
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   166
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   167
        public Path toPath() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   168
            return path;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   169
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   170
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   171
        public String toString() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   172
            return text;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   173
        }
58240
046533575954 8216565: Specifying the same path creates a new directory in JFR.configure
cito
parents: 52698
diff changeset
   174
046533575954 8216565: Specifying the same path creates a new directory in JFR.configure
cito
parents: 52698
diff changeset
   175
        @Override
046533575954 8216565: Specifying the same path creates a new directory in JFR.configure
cito
parents: 52698
diff changeset
   176
        public boolean equals(Object other) {
046533575954 8216565: Specifying the same path creates a new directory in JFR.configure
cito
parents: 52698
diff changeset
   177
            if(other != null && other instanceof SafePath){
046533575954 8216565: Specifying the same path creates a new directory in JFR.configure
cito
parents: 52698
diff changeset
   178
                return this.toPath().equals(((SafePath) other).toPath());
046533575954 8216565: Specifying the same path creates a new directory in JFR.configure
cito
parents: 52698
diff changeset
   179
            }
046533575954 8216565: Specifying the same path creates a new directory in JFR.configure
cito
parents: 52698
diff changeset
   180
            return false;
046533575954 8216565: Specifying the same path creates a new directory in JFR.configure
cito
parents: 52698
diff changeset
   181
        }
046533575954 8216565: Specifying the same path creates a new directory in JFR.configure
cito
parents: 52698
diff changeset
   182
046533575954 8216565: Specifying the same path creates a new directory in JFR.configure
cito
parents: 52698
diff changeset
   183
        @Override
046533575954 8216565: Specifying the same path creates a new directory in JFR.configure
cito
parents: 52698
diff changeset
   184
        public int hashCode() {
046533575954 8216565: Specifying the same path creates a new directory in JFR.configure
cito
parents: 52698
diff changeset
   185
            return this.toPath().hashCode();
046533575954 8216565: Specifying the same path creates a new directory in JFR.configure
cito
parents: 52698
diff changeset
   186
        }
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   187
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   188
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   189
    private interface RunnableWithCheckedException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   190
        public void run() throws Exception;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   191
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   192
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   193
    private interface CallableWithoutCheckException<T> {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   194
        public T call();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   195
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   196
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   197
    private static <U> U doPrivilegedIOWithReturn(Callable<U> function) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   198
        try {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   199
            return AccessController.doPrivileged(new PrivilegedExceptionAction<U>() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   200
                @Override
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   201
                public U run() throws Exception {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   202
                    return function.call();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   203
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   204
            }, null);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   205
        } catch (PrivilegedActionException e) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   206
            Throwable t = e.getCause();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   207
            if (t instanceof IOException) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   208
                throw (IOException) t;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   209
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   210
            throw new IOException("Unexpected error during I/O operation. " + t.getMessage(), t);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   211
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   212
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   213
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   214
    private static void doPriviligedIO(RunnableWithCheckedException function) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   215
        doPrivilegedIOWithReturn(() -> {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   216
            function.run();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   217
            return null;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   218
        });
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   219
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   220
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   221
    private static void doPrivileged(Runnable function, Permission... perms) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   222
        AccessController.doPrivileged(new PrivilegedAction<Void>() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   223
            @Override
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   224
            public Void run() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   225
                function.run();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   226
                return null;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   227
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   228
        }, null, perms);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   229
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   230
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   231
    private static void doPrivileged(Runnable function) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   232
        AccessController.doPrivileged(new PrivilegedAction<Void>() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   233
            @Override
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   234
            public Void run() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   235
                function.run();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   236
                return null;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   237
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   238
        });
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   239
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   240
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   241
    private static <T> T doPrivilegedWithReturn(CallableWithoutCheckException<T> function, Permission... perms) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   242
        return AccessController.doPrivileged(new PrivilegedAction<T>() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   243
            @Override
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   244
            public T run() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   245
                return function.call();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   246
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   247
        }, null, perms);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   248
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   249
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   250
    public static List<SafePath> getPredefinedJFCFiles() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   251
        List<SafePath> list = new ArrayList<>();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   252
        try {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   253
            Iterator<Path> pathIterator = doPrivilegedIOWithReturn(() -> {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   254
                return Files.newDirectoryStream(JFC_DIRECTORY.toPath(), "*").iterator();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   255
            });
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   256
            while (pathIterator.hasNext()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   257
                Path path = pathIterator.next();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   258
                if (path.toString().endsWith(".jfc")) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   259
                    list.add(new SafePath(path));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   260
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   261
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   262
        } catch (IOException ioe) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   263
            Logger.log(LogTag.JFR, LogLevel.WARN, "Could not access .jfc-files in " + JFC_DIRECTORY + ", " + ioe.getMessage());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   264
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   265
        return list;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   266
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   267
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   268
    static void makeVisibleToJFR(Class<?> clazz) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   269
        Module classModule = clazz.getModule();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   270
        Modules.addReads(JFR_MODULE, classModule);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   271
        if (clazz.getPackage() != null) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   272
            String packageName = clazz.getPackage().getName();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   273
            Modules.addExports(classModule, packageName, JFR_MODULE);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   274
            Modules.addOpens(classModule, packageName, JFR_MODULE);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   275
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   276
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   277
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   278
    /**
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   279
     * Adds a qualified export of the internal.jdk.jfr.internal.handlers package
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   280
     * (for EventHandler)
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   281
     */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   282
    static void addHandlerExport(Class<?> clazz) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   283
        Modules.addExports(JFR_MODULE, Utils.HANDLERS_PACKAGE_NAME, clazz.getModule());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   284
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   285
52698
ca6b58b8ffc5 8214287: SpecJbb2005StressModule got uncaught exception
mgronlun
parents: 52334
diff changeset
   286
    static void addEventsExport(Class<?> clazz) {
ca6b58b8ffc5 8214287: SpecJbb2005StressModule got uncaught exception
mgronlun
parents: 52334
diff changeset
   287
        Modules.addExports(JFR_MODULE, Utils.EVENTS_PACKAGE_NAME, clazz.getModule());
ca6b58b8ffc5 8214287: SpecJbb2005StressModule got uncaught exception
mgronlun
parents: 52334
diff changeset
   288
    }
ca6b58b8ffc5 8214287: SpecJbb2005StressModule got uncaught exception
mgronlun
parents: 52334
diff changeset
   289
ca6b58b8ffc5 8214287: SpecJbb2005StressModule got uncaught exception
mgronlun
parents: 52334
diff changeset
   290
    static void addInstrumentExport(Class<?> clazz) {
ca6b58b8ffc5 8214287: SpecJbb2005StressModule got uncaught exception
mgronlun
parents: 52334
diff changeset
   291
        Modules.addExports(JFR_MODULE, Utils.INSTRUMENT_PACKAGE_NAME, clazz.getModule());
ca6b58b8ffc5 8214287: SpecJbb2005StressModule got uncaught exception
mgronlun
parents: 52334
diff changeset
   292
    }
ca6b58b8ffc5 8214287: SpecJbb2005StressModule got uncaught exception
mgronlun
parents: 52334
diff changeset
   293
ca6b58b8ffc5 8214287: SpecJbb2005StressModule got uncaught exception
mgronlun
parents: 52334
diff changeset
   294
    static void addReadEdge(Class<?> clazz) {
ca6b58b8ffc5 8214287: SpecJbb2005StressModule got uncaught exception
mgronlun
parents: 52334
diff changeset
   295
        Modules.addReads(clazz.getModule(), JFR_MODULE);
ca6b58b8ffc5 8214287: SpecJbb2005StressModule got uncaught exception
mgronlun
parents: 52334
diff changeset
   296
    }
ca6b58b8ffc5 8214287: SpecJbb2005StressModule got uncaught exception
mgronlun
parents: 52334
diff changeset
   297
52334
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 52015
diff changeset
   298
    public static void registerEvent(Class<? extends jdk.internal.event.Event> eventClass) {
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 52015
diff changeset
   299
        doPrivileged(() ->  MetadataRepository.getInstance().register(eventClass), new FlightRecorderPermission(Utils.REGISTER_EVENT));
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 52015
diff changeset
   300
    }
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 52015
diff changeset
   301
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 52015
diff changeset
   302
    public static void registerMirror(Class<? extends Event> eventClass) {
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 52015
diff changeset
   303
        doPrivileged(() ->  MetadataRepository.getInstance().registerMirror(eventClass), new FlightRecorderPermission(Utils.REGISTER_EVENT));
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   304
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   305
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   306
    static boolean getBooleanProperty(String propertyName) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   307
        return doPrivilegedWithReturn(() -> Boolean.getBoolean(propertyName), new PropertyPermission(propertyName, "read"));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   308
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   309
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   310
    private static SafePath getPathInProperty(String prop, String subPath) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   311
        return doPrivilegedWithReturn(() -> {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   312
            String path = System.getProperty(prop);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   313
            if (path == null) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   314
                return null;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   315
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   316
            File file = subPath == null ? new File(path) : new File(path, subPath);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   317
            return new SafePath(file.getAbsolutePath());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   318
        }, new PropertyPermission("*", "read"));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   319
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   320
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   321
    // Called by JVM during initialization of JFR
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   322
    static Thread createRecorderThread(ThreadGroup systemThreadGroup, ClassLoader contextClassLoader) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   323
        // The thread should have permission = new Permission[0], and not "modifyThreadGroup" and "modifyThread" on the stack,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   324
        // but it's hard circumvent if we are going to pass in system thread group in the constructor
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   325
        Thread thread = doPrivilegedWithReturn(() -> new Thread(systemThreadGroup, "JFR Recorder Thread"), new RuntimePermission("modifyThreadGroup"), new RuntimePermission("modifyThread"));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   326
        doPrivileged(() -> thread.setContextClassLoader(contextClassLoader), new RuntimePermission("setContextClassLoader"), new RuntimePermission("modifyThread"));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   327
        return thread;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   328
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   329
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   330
    static void registerShutdownHook(Thread shutdownHook) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   331
        doPrivileged(() -> Runtime.getRuntime().addShutdownHook(shutdownHook), new RuntimePermission("shutdownHooks"));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   332
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   333
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   334
    static void setUncaughtExceptionHandler(Thread thread, Thread.UncaughtExceptionHandler eh) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   335
        doPrivileged(() -> thread.setUncaughtExceptionHandler(eh), new RuntimePermission("modifyThread"));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   336
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   337
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   338
    static void moveReplace(SafePath from, SafePath to) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   339
        doPrivilegedIOWithReturn(() -> Files.move(from.toPath(), to.toPath()));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   340
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   341
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   342
    static void clearDirectory(SafePath safePath) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   343
        doPriviligedIO(() -> Files.walkFileTree(safePath.toPath(), new DirectoryCleaner()));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   344
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   345
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   346
    static SafePath toRealPath(SafePath safePath) throws Exception {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   347
        return new SafePath(doPrivilegedIOWithReturn(() -> safePath.toPath().toRealPath()));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   348
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   349
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   350
    static boolean existDirectory(SafePath directory) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   351
        return doPrivilegedIOWithReturn(() -> Files.exists(directory.toPath()));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   352
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   353
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   354
    static RandomAccessFile createRandomAccessFile(SafePath path) throws Exception {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   355
        return doPrivilegedIOWithReturn(() -> new RandomAccessFile(path.toPath().toFile(), "rw"));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   356
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   357
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   358
    public static InputStream newFileInputStream(SafePath safePath) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   359
        return doPrivilegedIOWithReturn(() -> Files.newInputStream(safePath.toPath()));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   360
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   361
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   362
    public static long getFileSize(SafePath safePath) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   363
        return doPrivilegedIOWithReturn(() -> Files.size(safePath.toPath()));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   364
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   365
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   366
    static SafePath createDirectories(SafePath safePath) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   367
        Path p = doPrivilegedIOWithReturn(() -> Files.createDirectories(safePath.toPath()));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   368
        return new SafePath(p);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   369
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   370
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   371
    public static boolean exists(SafePath safePath) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   372
        return doPrivilegedIOWithReturn(() -> Files.exists(safePath.toPath()));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   373
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   374
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   375
    public static boolean isDirectory(SafePath safePath) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   376
        return doPrivilegedIOWithReturn(() -> Files.isDirectory(safePath.toPath()));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   377
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   378
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   379
    static void delete(SafePath localPath) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   380
        doPriviligedIO(() -> Files.delete(localPath.toPath()));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   381
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   382
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   383
    static boolean isWritable(SafePath safePath) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   384
        return doPrivilegedIOWithReturn(() -> Files.isWritable(safePath.toPath()));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   385
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   386
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   387
    static void deleteOnExit(SafePath safePath) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   388
        doPrivileged(() -> safePath.toPath().toFile().deleteOnExit());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   389
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   390
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   391
    static ReadableByteChannel newFileChannelToRead(SafePath safePath) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   392
        return doPrivilegedIOWithReturn(() -> FileChannel.open(safePath.toPath(), StandardOpenOption.READ));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   393
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   394
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   395
    public static InputStream getResourceAsStream(String name) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   396
        return doPrivilegedIOWithReturn(() -> SecuritySupport.class.getResourceAsStream(name));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   397
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   398
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   399
    public static Reader newFileReader(SafePath safePath) throws FileNotFoundException, IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   400
        return doPrivilegedIOWithReturn(() -> Files.newBufferedReader(safePath.toPath()));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   401
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   402
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   403
    static void touch(SafePath path) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   404
        doPriviligedIO(() -> new RandomAccessFile(path.toPath().toFile(), "rw").close());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   405
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   406
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   407
    static void setAccessible(Method method) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   408
        doPrivileged(() -> method.setAccessible(true), new ReflectPermission("suppressAccessChecks"));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   409
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   410
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   411
    static void setAccessible(Field field) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   412
        doPrivileged(() -> field.setAccessible(true), new ReflectPermission("suppressAccessChecks"));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   413
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   414
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   415
    static void setAccessible(Constructor<?> constructor) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   416
        doPrivileged(() -> constructor.setAccessible(true), new ReflectPermission("suppressAccessChecks"));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   417
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   418
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   419
    static void ensureClassIsInitialized(Class<?> clazz) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   420
        unsafe.ensureClassInitialized(clazz);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   421
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   422
52015
821bfc24d750 8181443: Replace usages of jdk.internal.misc.Unsafe with MethodHandles.Lookup.defineClass
mchung
parents: 50113
diff changeset
   423
    static Class<?> defineClass(Class<?> lookupClass, byte[] bytes) {
821bfc24d750 8181443: Replace usages of jdk.internal.misc.Unsafe with MethodHandles.Lookup.defineClass
mchung
parents: 50113
diff changeset
   424
        return AccessController.doPrivileged(new PrivilegedAction<>() {
821bfc24d750 8181443: Replace usages of jdk.internal.misc.Unsafe with MethodHandles.Lookup.defineClass
mchung
parents: 50113
diff changeset
   425
            @Override
821bfc24d750 8181443: Replace usages of jdk.internal.misc.Unsafe with MethodHandles.Lookup.defineClass
mchung
parents: 50113
diff changeset
   426
            public Class<?> run() {
821bfc24d750 8181443: Replace usages of jdk.internal.misc.Unsafe with MethodHandles.Lookup.defineClass
mchung
parents: 50113
diff changeset
   427
                try {
821bfc24d750 8181443: Replace usages of jdk.internal.misc.Unsafe with MethodHandles.Lookup.defineClass
mchung
parents: 50113
diff changeset
   428
                    return MethodHandles.privateLookupIn(lookupClass, LOOKUP).defineClass(bytes);
821bfc24d750 8181443: Replace usages of jdk.internal.misc.Unsafe with MethodHandles.Lookup.defineClass
mchung
parents: 50113
diff changeset
   429
                } catch (IllegalAccessException e) {
821bfc24d750 8181443: Replace usages of jdk.internal.misc.Unsafe with MethodHandles.Lookup.defineClass
mchung
parents: 50113
diff changeset
   430
                    throw new InternalError(e);
821bfc24d750 8181443: Replace usages of jdk.internal.misc.Unsafe with MethodHandles.Lookup.defineClass
mchung
parents: 50113
diff changeset
   431
                }
821bfc24d750 8181443: Replace usages of jdk.internal.misc.Unsafe with MethodHandles.Lookup.defineClass
mchung
parents: 50113
diff changeset
   432
            }
821bfc24d750 8181443: Replace usages of jdk.internal.misc.Unsafe with MethodHandles.Lookup.defineClass
mchung
parents: 50113
diff changeset
   433
        });
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   434
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   435
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   436
    static Thread createThreadWitNoPermissions(String threadName, Runnable runnable) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   437
        return doPrivilegedWithReturn(() -> new Thread(runnable, threadName), new Permission[0]);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   438
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   439
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   440
    static void setDaemonThread(Thread t, boolean daeomn) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   441
      doPrivileged(()-> t.setDaemon(daeomn), new RuntimePermission("modifyThread"));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   442
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   443
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   444
    public static SafePath getAbsolutePath(SafePath path) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   445
        return new SafePath(doPrivilegedIOWithReturn((()-> path.toPath().toAbsolutePath())));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   446
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   447
}