src/jdk.jfr/share/classes/jdk/jfr/internal/SecuritySupport.java
author mgronlun
Tue, 27 Nov 2018 18:14:27 +0100
changeset 52698 ca6b58b8ffc5
parent 52334 a181612f0715
child 57360 5d043a159d5c
child 58240 046533575954
permissions -rw-r--r--
8214287: SpecJbb2005StressModule got uncaught exception Reviewed-by: egahlin, jwilhelm
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
        }
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 interface RunnableWithCheckedException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   177
        public void run() throws Exception;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   178
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   179
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   180
    private interface CallableWithoutCheckException<T> {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   181
        public T call();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   182
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   183
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   184
    private static <U> U doPrivilegedIOWithReturn(Callable<U> function) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   185
        try {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   186
            return AccessController.doPrivileged(new PrivilegedExceptionAction<U>() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   187
                @Override
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   188
                public U run() throws Exception {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   189
                    return function.call();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   190
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   191
            }, null);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   192
        } catch (PrivilegedActionException e) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   193
            Throwable t = e.getCause();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   194
            if (t instanceof IOException) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   195
                throw (IOException) t;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   196
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   197
            throw new IOException("Unexpected error during I/O operation. " + t.getMessage(), t);
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
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   201
    private static void doPriviligedIO(RunnableWithCheckedException function) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   202
        doPrivilegedIOWithReturn(() -> {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   203
            function.run();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   204
            return null;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   205
        });
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   206
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   207
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   208
    private static void doPrivileged(Runnable function, Permission... perms) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   209
        AccessController.doPrivileged(new PrivilegedAction<Void>() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   210
            @Override
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   211
            public Void run() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   212
                function.run();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   213
                return null;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   214
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   215
        }, null, perms);
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
    private static void doPrivileged(Runnable function) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   219
        AccessController.doPrivileged(new PrivilegedAction<Void>() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   220
            @Override
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   221
            public Void run() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   222
                function.run();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   223
                return null;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   224
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   225
        });
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   226
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   227
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   228
    private static <T> T doPrivilegedWithReturn(CallableWithoutCheckException<T> function, Permission... perms) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   229
        return AccessController.doPrivileged(new PrivilegedAction<T>() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   230
            @Override
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   231
            public T run() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   232
                return function.call();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   233
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   234
        }, null, perms);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   235
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   236
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   237
    public static List<SafePath> getPredefinedJFCFiles() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   238
        List<SafePath> list = new ArrayList<>();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   239
        try {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   240
            Iterator<Path> pathIterator = doPrivilegedIOWithReturn(() -> {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   241
                return Files.newDirectoryStream(JFC_DIRECTORY.toPath(), "*").iterator();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   242
            });
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   243
            while (pathIterator.hasNext()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   244
                Path path = pathIterator.next();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   245
                if (path.toString().endsWith(".jfc")) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   246
                    list.add(new SafePath(path));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   247
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   248
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   249
        } catch (IOException ioe) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   250
            Logger.log(LogTag.JFR, LogLevel.WARN, "Could not access .jfc-files in " + JFC_DIRECTORY + ", " + ioe.getMessage());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   251
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   252
        return list;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   253
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   254
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   255
    static void makeVisibleToJFR(Class<?> clazz) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   256
        Module classModule = clazz.getModule();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   257
        Modules.addReads(JFR_MODULE, classModule);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   258
        if (clazz.getPackage() != null) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   259
            String packageName = clazz.getPackage().getName();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   260
            Modules.addExports(classModule, packageName, JFR_MODULE);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   261
            Modules.addOpens(classModule, packageName, JFR_MODULE);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   262
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   263
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   264
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   265
    /**
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   266
     * Adds a qualified export of the internal.jdk.jfr.internal.handlers package
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   267
     * (for EventHandler)
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   268
     */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   269
    static void addHandlerExport(Class<?> clazz) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   270
        Modules.addExports(JFR_MODULE, Utils.HANDLERS_PACKAGE_NAME, clazz.getModule());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   271
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   272
52698
ca6b58b8ffc5 8214287: SpecJbb2005StressModule got uncaught exception
mgronlun
parents: 52334
diff changeset
   273
    static void addEventsExport(Class<?> clazz) {
ca6b58b8ffc5 8214287: SpecJbb2005StressModule got uncaught exception
mgronlun
parents: 52334
diff changeset
   274
        Modules.addExports(JFR_MODULE, Utils.EVENTS_PACKAGE_NAME, clazz.getModule());
ca6b58b8ffc5 8214287: SpecJbb2005StressModule got uncaught exception
mgronlun
parents: 52334
diff changeset
   275
    }
ca6b58b8ffc5 8214287: SpecJbb2005StressModule got uncaught exception
mgronlun
parents: 52334
diff changeset
   276
ca6b58b8ffc5 8214287: SpecJbb2005StressModule got uncaught exception
mgronlun
parents: 52334
diff changeset
   277
    static void addInstrumentExport(Class<?> clazz) {
ca6b58b8ffc5 8214287: SpecJbb2005StressModule got uncaught exception
mgronlun
parents: 52334
diff changeset
   278
        Modules.addExports(JFR_MODULE, Utils.INSTRUMENT_PACKAGE_NAME, clazz.getModule());
ca6b58b8ffc5 8214287: SpecJbb2005StressModule got uncaught exception
mgronlun
parents: 52334
diff changeset
   279
    }
ca6b58b8ffc5 8214287: SpecJbb2005StressModule got uncaught exception
mgronlun
parents: 52334
diff changeset
   280
ca6b58b8ffc5 8214287: SpecJbb2005StressModule got uncaught exception
mgronlun
parents: 52334
diff changeset
   281
    static void addReadEdge(Class<?> clazz) {
ca6b58b8ffc5 8214287: SpecJbb2005StressModule got uncaught exception
mgronlun
parents: 52334
diff changeset
   282
        Modules.addReads(clazz.getModule(), JFR_MODULE);
ca6b58b8ffc5 8214287: SpecJbb2005StressModule got uncaught exception
mgronlun
parents: 52334
diff changeset
   283
    }
ca6b58b8ffc5 8214287: SpecJbb2005StressModule got uncaught exception
mgronlun
parents: 52334
diff changeset
   284
52334
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 52015
diff changeset
   285
    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
   286
        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
   287
    }
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 52015
diff changeset
   288
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 52015
diff changeset
   289
    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
   290
        doPrivileged(() ->  MetadataRepository.getInstance().registerMirror(eventClass), new FlightRecorderPermission(Utils.REGISTER_EVENT));
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   291
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   292
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   293
    static boolean getBooleanProperty(String propertyName) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   294
        return doPrivilegedWithReturn(() -> Boolean.getBoolean(propertyName), new PropertyPermission(propertyName, "read"));
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
    private static SafePath getPathInProperty(String prop, String subPath) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   298
        return doPrivilegedWithReturn(() -> {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   299
            String path = System.getProperty(prop);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   300
            if (path == null) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   301
                return null;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   302
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   303
            File file = subPath == null ? new File(path) : new File(path, subPath);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   304
            return new SafePath(file.getAbsolutePath());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   305
        }, new PropertyPermission("*", "read"));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   306
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   307
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   308
    // Called by JVM during initialization of JFR
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   309
    static Thread createRecorderThread(ThreadGroup systemThreadGroup, ClassLoader contextClassLoader) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   310
        // The thread should have permission = new Permission[0], and not "modifyThreadGroup" and "modifyThread" on the stack,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   311
        // 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
   312
        Thread thread = doPrivilegedWithReturn(() -> new Thread(systemThreadGroup, "JFR Recorder Thread"), new RuntimePermission("modifyThreadGroup"), new RuntimePermission("modifyThread"));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   313
        doPrivileged(() -> thread.setContextClassLoader(contextClassLoader), new RuntimePermission("setContextClassLoader"), new RuntimePermission("modifyThread"));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   314
        return thread;
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 void registerShutdownHook(Thread shutdownHook) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   318
        doPrivileged(() -> Runtime.getRuntime().addShutdownHook(shutdownHook), new RuntimePermission("shutdownHooks"));
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 void setUncaughtExceptionHandler(Thread thread, Thread.UncaughtExceptionHandler eh) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   322
        doPrivileged(() -> thread.setUncaughtExceptionHandler(eh), new RuntimePermission("modifyThread"));
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
    static void moveReplace(SafePath from, SafePath to) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   326
        doPrivilegedIOWithReturn(() -> Files.move(from.toPath(), to.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
    static void clearDirectory(SafePath safePath) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   330
        doPriviligedIO(() -> Files.walkFileTree(safePath.toPath(), new DirectoryCleaner()));
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 toRealPath(SafePath safePath) throws Exception {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   334
        return new SafePath(doPrivilegedIOWithReturn(() -> safePath.toPath().toRealPath()));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   335
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   336
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   337
    static boolean existDirectory(SafePath directory) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   338
        return doPrivilegedIOWithReturn(() -> Files.exists(directory.toPath()));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   339
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   340
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   341
    static RandomAccessFile createRandomAccessFile(SafePath path) throws Exception {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   342
        return doPrivilegedIOWithReturn(() -> new RandomAccessFile(path.toPath().toFile(), "rw"));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   343
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   344
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   345
    public static InputStream newFileInputStream(SafePath safePath) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   346
        return doPrivilegedIOWithReturn(() -> Files.newInputStream(safePath.toPath()));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   347
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   348
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   349
    public static long getFileSize(SafePath safePath) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   350
        return doPrivilegedIOWithReturn(() -> Files.size(safePath.toPath()));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   351
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   352
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   353
    static SafePath createDirectories(SafePath safePath) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   354
        Path p = doPrivilegedIOWithReturn(() -> Files.createDirectories(safePath.toPath()));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   355
        return new SafePath(p);
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 boolean exists(SafePath safePath) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   359
        return doPrivilegedIOWithReturn(() -> Files.exists(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 boolean isDirectory(SafePath safePath) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   363
        return doPrivilegedIOWithReturn(() -> Files.isDirectory(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 void delete(SafePath localPath) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   367
        doPriviligedIO(() -> Files.delete(localPath.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 boolean isWritable(SafePath safePath) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   371
        return doPrivilegedIOWithReturn(() -> Files.isWritable(safePath.toPath()));
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 deleteOnExit(SafePath safePath) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   375
        doPrivileged(() -> safePath.toPath().toFile().deleteOnExit());
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 ReadableByteChannel newFileChannelToRead(SafePath safePath) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   379
        return doPrivilegedIOWithReturn(() -> FileChannel.open(safePath.toPath(), StandardOpenOption.READ));
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
    public static InputStream getResourceAsStream(String name) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   383
        return doPrivilegedIOWithReturn(() -> SecuritySupport.class.getResourceAsStream(name));
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
    public static Reader newFileReader(SafePath safePath) throws FileNotFoundException, IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   387
        return doPrivilegedIOWithReturn(() -> Files.newBufferedReader(safePath.toPath()));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   388
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   389
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   390
    static void touch(SafePath path) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   391
        doPriviligedIO(() -> new RandomAccessFile(path.toPath().toFile(), "rw").close());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   392
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   393
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   394
    static void setAccessible(Method method) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   395
        doPrivileged(() -> method.setAccessible(true), new ReflectPermission("suppressAccessChecks"));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   396
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   397
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   398
    static void setAccessible(Field field) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   399
        doPrivileged(() -> field.setAccessible(true), new ReflectPermission("suppressAccessChecks"));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   400
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   401
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   402
    static void setAccessible(Constructor<?> constructor) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   403
        doPrivileged(() -> constructor.setAccessible(true), new ReflectPermission("suppressAccessChecks"));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   404
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   405
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   406
    static void ensureClassIsInitialized(Class<?> clazz) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   407
        unsafe.ensureClassInitialized(clazz);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   408
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   409
52015
821bfc24d750 8181443: Replace usages of jdk.internal.misc.Unsafe with MethodHandles.Lookup.defineClass
mchung
parents: 50113
diff changeset
   410
    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
   411
        return AccessController.doPrivileged(new PrivilegedAction<>() {
821bfc24d750 8181443: Replace usages of jdk.internal.misc.Unsafe with MethodHandles.Lookup.defineClass
mchung
parents: 50113
diff changeset
   412
            @Override
821bfc24d750 8181443: Replace usages of jdk.internal.misc.Unsafe with MethodHandles.Lookup.defineClass
mchung
parents: 50113
diff changeset
   413
            public Class<?> run() {
821bfc24d750 8181443: Replace usages of jdk.internal.misc.Unsafe with MethodHandles.Lookup.defineClass
mchung
parents: 50113
diff changeset
   414
                try {
821bfc24d750 8181443: Replace usages of jdk.internal.misc.Unsafe with MethodHandles.Lookup.defineClass
mchung
parents: 50113
diff changeset
   415
                    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
   416
                } catch (IllegalAccessException e) {
821bfc24d750 8181443: Replace usages of jdk.internal.misc.Unsafe with MethodHandles.Lookup.defineClass
mchung
parents: 50113
diff changeset
   417
                    throw new InternalError(e);
821bfc24d750 8181443: Replace usages of jdk.internal.misc.Unsafe with MethodHandles.Lookup.defineClass
mchung
parents: 50113
diff changeset
   418
                }
821bfc24d750 8181443: Replace usages of jdk.internal.misc.Unsafe with MethodHandles.Lookup.defineClass
mchung
parents: 50113
diff changeset
   419
            }
821bfc24d750 8181443: Replace usages of jdk.internal.misc.Unsafe with MethodHandles.Lookup.defineClass
mchung
parents: 50113
diff changeset
   420
        });
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   421
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   422
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   423
    static Thread createThreadWitNoPermissions(String threadName, Runnable runnable) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   424
        return doPrivilegedWithReturn(() -> new Thread(runnable, threadName), new Permission[0]);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   425
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   426
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   427
    static void setDaemonThread(Thread t, boolean daeomn) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   428
      doPrivileged(()-> t.setDaemon(daeomn), new RuntimePermission("modifyThread"));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   429
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   430
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   431
    public static SafePath getAbsolutePath(SafePath path) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   432
        return new SafePath(doPrivilegedIOWithReturn((()-> path.toPath().toAbsolutePath())));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   433
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   434
}