src/jdk.jfr/share/classes/jdk/jfr/internal/SecuritySupport.java
author egahlin
Wed, 31 Oct 2018 02:10:21 +0100
changeset 52334 a181612f0715
parent 52015 821bfc24d750
child 52698 ca6b58b8ffc5
permissions -rw-r--r--
8203629: Produce events in the JDK without a dependency on jdk.jfr Reviewed-by: mgronlun
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
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    82
    final static class SecureRecorderListener implements FlightRecorderListener {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    83
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    84
        private final AccessControlContext context;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    85
        private final FlightRecorderListener changeListener;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    86
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    87
        SecureRecorderListener(AccessControlContext context, FlightRecorderListener changeListener) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    88
            this.context = Objects.requireNonNull(context);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    89
            this.changeListener = Objects.requireNonNull(changeListener);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    90
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    91
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    92
        @Override
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    93
        public void recordingStateChanged(Recording recording) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    94
            AccessController.doPrivileged((PrivilegedAction<Void>) () -> {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    95
                try {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    96
                    changeListener.recordingStateChanged(recording);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    97
                } catch (Throwable t) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    98
                    // Prevent malicious user to propagate exception callback in the wrong context
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    99
                    Logger.log(LogTag.JFR, LogLevel.WARN, "Unexpected exception in listener " + changeListener.getClass()+ " at recording state change");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   100
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   101
                return null;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   102
            }, context);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   103
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   104
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   105
        @Override
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   106
        public void recorderInitialized(FlightRecorder recorder) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   107
            AccessController.doPrivileged((PrivilegedAction<Void>) () -> {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   108
                try  {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   109
                    changeListener.recorderInitialized(recorder);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   110
                } catch (Throwable t) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   111
                    // Prevent malicious user to propagate exception callback in the wrong context
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   112
                    Logger.log(LogTag.JFR, LogLevel.WARN, "Unexpected exception in listener " + changeListener.getClass()+ " when initializing FlightRecorder");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   113
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   114
                return null;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   115
            }, context);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   116
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   117
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   118
        public FlightRecorderListener getChangeListener() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   119
            return changeListener;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   120
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   121
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   122
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   123
    private static final class DirectoryCleaner extends SimpleFileVisitor<Path> {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   124
        @Override
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   125
        public FileVisitResult visitFile(Path path, BasicFileAttributes attrs) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   126
            Files.delete(path);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   127
            return FileVisitResult.CONTINUE;
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
        @Override
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   131
        public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   132
            if (exc != null) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   133
                throw exc;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   134
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   135
            Files.delete(dir);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   136
            return FileVisitResult.CONTINUE;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   137
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   138
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   139
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   140
    /**
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   141
     * Path created by the default file provider,and not
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   142
     * a malicious provider.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   143
     *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   144
     */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   145
    public static final class SafePath {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   146
        private final Path path;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   147
        private final String text;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   148
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   149
        public SafePath(Path p) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   150
            // sanitize
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   151
            text = p.toString();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   152
            path = Paths.get(text);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   153
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   154
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   155
        public SafePath(String path) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   156
            this(Paths.get(path));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   157
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   158
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   159
        public Path toPath() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   160
            return path;
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 String toString() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   164
            return text;
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
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   168
    private interface RunnableWithCheckedException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   169
        public void run() throws Exception;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   170
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   171
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   172
    private interface CallableWithoutCheckException<T> {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   173
        public T call();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   174
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   175
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   176
    private static <U> U doPrivilegedIOWithReturn(Callable<U> function) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   177
        try {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   178
            return AccessController.doPrivileged(new PrivilegedExceptionAction<U>() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   179
                @Override
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   180
                public U run() throws Exception {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   181
                    return function.call();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   182
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   183
            }, null);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   184
        } catch (PrivilegedActionException e) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   185
            Throwable t = e.getCause();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   186
            if (t instanceof IOException) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   187
                throw (IOException) t;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   188
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   189
            throw new IOException("Unexpected error during I/O operation. " + t.getMessage(), t);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   190
        }
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 static void doPriviligedIO(RunnableWithCheckedException function) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   194
        doPrivilegedIOWithReturn(() -> {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   195
            function.run();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   196
            return null;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   197
        });
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   198
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   199
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   200
    private static void doPrivileged(Runnable function, Permission... perms) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   201
        AccessController.doPrivileged(new PrivilegedAction<Void>() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   202
            @Override
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   203
            public Void run() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   204
                function.run();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   205
                return null;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   206
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   207
        }, null, perms);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   208
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   209
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   210
    private static void doPrivileged(Runnable function) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   211
        AccessController.doPrivileged(new PrivilegedAction<Void>() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   212
            @Override
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   213
            public Void run() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   214
                function.run();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   215
                return null;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   216
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   217
        });
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
    private static <T> T doPrivilegedWithReturn(CallableWithoutCheckException<T> function, Permission... perms) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   221
        return AccessController.doPrivileged(new PrivilegedAction<T>() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   222
            @Override
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   223
            public T run() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   224
                return function.call();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   225
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   226
        }, null, perms);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   227
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   228
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   229
    public static List<SafePath> getPredefinedJFCFiles() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   230
        List<SafePath> list = new ArrayList<>();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   231
        try {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   232
            Iterator<Path> pathIterator = doPrivilegedIOWithReturn(() -> {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   233
                return Files.newDirectoryStream(JFC_DIRECTORY.toPath(), "*").iterator();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   234
            });
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   235
            while (pathIterator.hasNext()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   236
                Path path = pathIterator.next();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   237
                if (path.toString().endsWith(".jfc")) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   238
                    list.add(new SafePath(path));
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
        } catch (IOException ioe) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   242
            Logger.log(LogTag.JFR, LogLevel.WARN, "Could not access .jfc-files in " + JFC_DIRECTORY + ", " + ioe.getMessage());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   243
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   244
        return list;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   245
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   246
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   247
    static void makeVisibleToJFR(Class<?> clazz) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   248
        Module classModule = clazz.getModule();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   249
        Modules.addReads(JFR_MODULE, classModule);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   250
        if (clazz.getPackage() != null) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   251
            String packageName = clazz.getPackage().getName();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   252
            Modules.addExports(classModule, packageName, JFR_MODULE);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   253
            Modules.addOpens(classModule, packageName, JFR_MODULE);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   254
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   255
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   256
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   257
    /**
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   258
     * Adds a qualified export of the internal.jdk.jfr.internal.handlers package
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   259
     * (for EventHandler)
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   260
     */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   261
    static void addHandlerExport(Class<?> clazz) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   262
        Modules.addExports(JFR_MODULE, Utils.HANDLERS_PACKAGE_NAME, clazz.getModule());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   263
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   264
52334
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 52015
diff changeset
   265
    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
   266
        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
   267
    }
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 52015
diff changeset
   268
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 52015
diff changeset
   269
    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
   270
        doPrivileged(() ->  MetadataRepository.getInstance().registerMirror(eventClass), new FlightRecorderPermission(Utils.REGISTER_EVENT));
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   271
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   272
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   273
    static boolean getBooleanProperty(String propertyName) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   274
        return doPrivilegedWithReturn(() -> Boolean.getBoolean(propertyName), new PropertyPermission(propertyName, "read"));
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
    private static SafePath getPathInProperty(String prop, String subPath) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   278
        return doPrivilegedWithReturn(() -> {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   279
            String path = System.getProperty(prop);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   280
            if (path == null) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   281
                return null;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   282
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   283
            File file = subPath == null ? new File(path) : new File(path, subPath);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   284
            return new SafePath(file.getAbsolutePath());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   285
        }, new PropertyPermission("*", "read"));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   286
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   287
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   288
    // Called by JVM during initialization of JFR
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   289
    static Thread createRecorderThread(ThreadGroup systemThreadGroup, ClassLoader contextClassLoader) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   290
        // The thread should have permission = new Permission[0], and not "modifyThreadGroup" and "modifyThread" on the stack,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   291
        // 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
   292
        Thread thread = doPrivilegedWithReturn(() -> new Thread(systemThreadGroup, "JFR Recorder Thread"), new RuntimePermission("modifyThreadGroup"), new RuntimePermission("modifyThread"));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   293
        doPrivileged(() -> thread.setContextClassLoader(contextClassLoader), new RuntimePermission("setContextClassLoader"), new RuntimePermission("modifyThread"));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   294
        return thread;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   295
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   296
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   297
    static void registerShutdownHook(Thread shutdownHook) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   298
        doPrivileged(() -> Runtime.getRuntime().addShutdownHook(shutdownHook), new RuntimePermission("shutdownHooks"));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   299
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   300
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   301
    static void setUncaughtExceptionHandler(Thread thread, Thread.UncaughtExceptionHandler eh) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   302
        doPrivileged(() -> thread.setUncaughtExceptionHandler(eh), new RuntimePermission("modifyThread"));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   303
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   304
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   305
    static void moveReplace(SafePath from, SafePath to) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   306
        doPrivilegedIOWithReturn(() -> Files.move(from.toPath(), to.toPath()));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   307
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   308
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   309
    static void clearDirectory(SafePath safePath) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   310
        doPriviligedIO(() -> Files.walkFileTree(safePath.toPath(), new DirectoryCleaner()));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   311
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   312
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   313
    static SafePath toRealPath(SafePath safePath) throws Exception {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   314
        return new SafePath(doPrivilegedIOWithReturn(() -> safePath.toPath().toRealPath()));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   315
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   316
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   317
    static boolean existDirectory(SafePath directory) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   318
        return doPrivilegedIOWithReturn(() -> Files.exists(directory.toPath()));
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
    static RandomAccessFile createRandomAccessFile(SafePath path) throws Exception {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   322
        return doPrivilegedIOWithReturn(() -> new RandomAccessFile(path.toPath().toFile(), "rw"));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   323
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   324
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   325
    public static InputStream newFileInputStream(SafePath safePath) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   326
        return doPrivilegedIOWithReturn(() -> Files.newInputStream(safePath.toPath()));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   327
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   328
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   329
    public static long getFileSize(SafePath safePath) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   330
        return doPrivilegedIOWithReturn(() -> Files.size(safePath.toPath()));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   331
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   332
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   333
    static SafePath createDirectories(SafePath safePath) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   334
        Path p = doPrivilegedIOWithReturn(() -> Files.createDirectories(safePath.toPath()));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   335
        return new SafePath(p);
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
    public static boolean exists(SafePath safePath) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   339
        return doPrivilegedIOWithReturn(() -> Files.exists(safePath.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
    public static boolean isDirectory(SafePath safePath) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   343
        return doPrivilegedIOWithReturn(() -> Files.isDirectory(safePath.toPath()));
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 void delete(SafePath localPath) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   347
        doPriviligedIO(() -> Files.delete(localPath.toPath()));
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 isWritable(SafePath safePath) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   351
        return doPrivilegedIOWithReturn(() -> Files.isWritable(safePath.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 void deleteOnExit(SafePath safePath) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   355
        doPrivileged(() -> safePath.toPath().toFile().deleteOnExit());
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
    static ReadableByteChannel newFileChannelToRead(SafePath safePath) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   359
        return doPrivilegedIOWithReturn(() -> FileChannel.open(safePath.toPath(), StandardOpenOption.READ));
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 InputStream getResourceAsStream(String name) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   363
        return doPrivilegedIOWithReturn(() -> SecuritySupport.class.getResourceAsStream(name));
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
    public static Reader newFileReader(SafePath safePath) throws FileNotFoundException, IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   367
        return doPrivilegedIOWithReturn(() -> Files.newBufferedReader(safePath.toPath()));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   368
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   369
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   370
    static void touch(SafePath path) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   371
        doPriviligedIO(() -> new RandomAccessFile(path.toPath().toFile(), "rw").close());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   372
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   373
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   374
    static void setAccessible(Method method) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   375
        doPrivileged(() -> method.setAccessible(true), new ReflectPermission("suppressAccessChecks"));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   376
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   377
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   378
    static void setAccessible(Field field) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   379
        doPrivileged(() -> field.setAccessible(true), new ReflectPermission("suppressAccessChecks"));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   380
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   381
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   382
    static void setAccessible(Constructor<?> constructor) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   383
        doPrivileged(() -> constructor.setAccessible(true), new ReflectPermission("suppressAccessChecks"));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   384
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   385
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   386
    static void ensureClassIsInitialized(Class<?> clazz) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   387
        unsafe.ensureClassInitialized(clazz);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   388
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   389
52015
821bfc24d750 8181443: Replace usages of jdk.internal.misc.Unsafe with MethodHandles.Lookup.defineClass
mchung
parents: 50113
diff changeset
   390
    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
   391
        return AccessController.doPrivileged(new PrivilegedAction<>() {
821bfc24d750 8181443: Replace usages of jdk.internal.misc.Unsafe with MethodHandles.Lookup.defineClass
mchung
parents: 50113
diff changeset
   392
            @Override
821bfc24d750 8181443: Replace usages of jdk.internal.misc.Unsafe with MethodHandles.Lookup.defineClass
mchung
parents: 50113
diff changeset
   393
            public Class<?> run() {
821bfc24d750 8181443: Replace usages of jdk.internal.misc.Unsafe with MethodHandles.Lookup.defineClass
mchung
parents: 50113
diff changeset
   394
                try {
821bfc24d750 8181443: Replace usages of jdk.internal.misc.Unsafe with MethodHandles.Lookup.defineClass
mchung
parents: 50113
diff changeset
   395
                    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
   396
                } catch (IllegalAccessException e) {
821bfc24d750 8181443: Replace usages of jdk.internal.misc.Unsafe with MethodHandles.Lookup.defineClass
mchung
parents: 50113
diff changeset
   397
                    throw new InternalError(e);
821bfc24d750 8181443: Replace usages of jdk.internal.misc.Unsafe with MethodHandles.Lookup.defineClass
mchung
parents: 50113
diff changeset
   398
                }
821bfc24d750 8181443: Replace usages of jdk.internal.misc.Unsafe with MethodHandles.Lookup.defineClass
mchung
parents: 50113
diff changeset
   399
            }
821bfc24d750 8181443: Replace usages of jdk.internal.misc.Unsafe with MethodHandles.Lookup.defineClass
mchung
parents: 50113
diff changeset
   400
        });
50113
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 Thread createThreadWitNoPermissions(String threadName, Runnable runnable) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   404
        return doPrivilegedWithReturn(() -> new Thread(runnable, threadName), new Permission[0]);
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 setDaemonThread(Thread t, boolean daeomn) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   408
      doPrivileged(()-> t.setDaemon(daeomn), new RuntimePermission("modifyThread"));
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
    public static SafePath getAbsolutePath(SafePath path) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   412
        return new SafePath(doPrivilegedIOWithReturn((()-> path.toPath().toAbsolutePath())));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   413
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   414
}