diff --git a/src/java.base/share/classes/jdk/internal/logger/BootstrapLogger.java b/src/java.base/share/classes/jdk/internal/logger/BootstrapLogger.java index f351b52968d..a4c9e4baf63 100644 --- a/src/java.base/share/classes/jdk/internal/logger/BootstrapLogger.java +++ b/src/java.base/share/classes/jdk/internal/logger/BootstrapLogger.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,9 +25,6 @@ package jdk.internal.logger; -import java.security.AccessControlContext; -import java.security.AccessController; -import java.security.PrivilegedAction; import java.util.HashMap; import java.util.Iterator; import java.util.Map; @@ -131,15 +128,8 @@ public final class BootstrapLogger implements Logger, PlatformLogger.Bridge, @Override public Thread newThread(Runnable r) { ExecutorService owner = getExecutor(); - @SuppressWarnings("removal") - Thread thread = AccessController.doPrivileged(new PrivilegedAction() { - @Override - public Thread run() { - Thread t = InnocuousThread.newThread(new BootstrapMessageLoggerTask(owner, r)); - t.setName("BootstrapMessageLoggerTask-"+t.getName()); - return t; - } - }, null, new RuntimePermission("enableContextClassLoaderOverride")); + Thread thread = InnocuousThread.newThread(new BootstrapMessageLoggerTask(owner, r)); + thread.setName("BootstrapMessageLoggerTask-" + thread.getName()); thread.setDaemon(true); return thread; } @@ -269,8 +259,6 @@ public final class BootstrapLogger implements Logger, PlatformLogger.Bridge, // the parameters etc... we need to store the context of the // caller who logged the message - so that we can reuse it when // we finally log the message. - @SuppressWarnings("removal") - final AccessControlContext acc; // The next event in the queue LogEvent next; @@ -279,7 +267,6 @@ public final class BootstrapLogger implements Logger, PlatformLogger.Bridge, private LogEvent(BootstrapLogger bootstrap, Level level, ResourceBundle bundle, String msg, Throwable thrown, Object[] params) { - this.acc = AccessController.getContext(); this.timeMillis = System.currentTimeMillis(); this.nanoAdjustment = VM.getNanoTimeAdjustment(timeMillis); this.level = level; @@ -298,7 +285,6 @@ public final class BootstrapLogger implements Logger, PlatformLogger.Bridge, private LogEvent(BootstrapLogger bootstrap, Level level, Supplier msgSupplier, Throwable thrown, Object[] params) { - this.acc = AccessController.getContext(); this.timeMillis = System.currentTimeMillis(); this.nanoAdjustment = VM.getNanoTimeAdjustment(timeMillis); this.level = level; @@ -319,7 +305,6 @@ public final class BootstrapLogger implements Logger, PlatformLogger.Bridge, String sourceClass, String sourceMethod, ResourceBundle bundle, String msg, Throwable thrown, Object[] params) { - this.acc = AccessController.getContext(); this.timeMillis = System.currentTimeMillis(); this.nanoAdjustment = VM.getNanoTimeAdjustment(timeMillis); this.level = null; @@ -340,7 +325,6 @@ public final class BootstrapLogger implements Logger, PlatformLogger.Bridge, String sourceClass, String sourceMethod, Supplier msgSupplier, Throwable thrown, Object[] params) { - this.acc = AccessController.getContext(); this.timeMillis = System.currentTimeMillis(); this.nanoAdjustment = VM.getNanoTimeAdjustment(timeMillis); this.level = null; @@ -444,20 +428,12 @@ public final class BootstrapLogger implements Logger, PlatformLogger.Bridge, Objects.requireNonNull(level), Objects.requireNonNull(msgSupplier), null, null); } - @SuppressWarnings("removal") + static void log(LogEvent log, Logger logger) { - final SecurityManager sm = System.getSecurityManager(); // not sure we can actually use lambda here. We may need to create // an anonymous class. Although if we reach here, then it means // the VM is booted. - if (sm == null || log.acc == null) { - BootstrapExecutors.submit(() -> log.log(logger)); - } else { - BootstrapExecutors.submit(() -> - AccessController.doPrivileged((PrivilegedAction) () -> { - log.log(logger); return null; - }, log.acc)); - } + BootstrapExecutors.submit(() -> log.log(logger)); } // non default methods from PlatformLogger.Bridge interface @@ -510,20 +486,9 @@ public final class BootstrapLogger implements Logger, PlatformLogger.Bridge, Objects.requireNonNull(level), sourceClass, sourceMethod, msgSupplier, thrown, null); } - @SuppressWarnings("removal") + static void log(LogEvent log, PlatformLogger.Bridge logger) { - final SecurityManager sm = System.getSecurityManager(); - if (sm == null || log.acc == null) { - BootstrapExecutors.submit(() -> log.log(logger)); - } else { - // not sure we can actually use lambda here. We may need to create - // an anonymous class. Although if we reach here, then it means - // the VM is booted. - BootstrapExecutors.submit(() -> - AccessController.doPrivileged((PrivilegedAction) () -> { - log.log(logger); return null; - }, log.acc)); - } + BootstrapExecutors.submit(() -> log.log(logger)); } static void log(LogEvent event) { @@ -897,37 +862,32 @@ public final class BootstrapLogger implements Logger, PlatformLogger.Bridge, // We do not want this field to get initialized if VM.isBooted() is false. @SuppressWarnings("removal") private static final class DetectBackend { - static final LoggingBackend detectedBackend; - static { - detectedBackend = AccessController.doPrivileged(new PrivilegedAction() { - @Override - public LoggingBackend run() { - final Iterator iterator = - ServiceLoader.load(LoggerFinder.class, ClassLoader.getSystemClassLoader()) - .iterator(); - if (iterator.hasNext()) { - return LoggingBackend.CUSTOM; // Custom Logger Provider is registered - } - // No custom logger provider: we will be using the default - // backend. - final Iterator iterator2 = - ServiceLoader.loadInstalled(DefaultLoggerFinder.class) - .iterator(); - if (iterator2.hasNext()) { - // LoggingProviderImpl is registered. The default - // implementation is java.util.logging - String cname = System.getProperty("java.util.logging.config.class"); - String fname = System.getProperty("java.util.logging.config.file"); - return (cname != null || fname != null) - ? LoggingBackend.JUL_WITH_CONFIG - : LoggingBackend.JUL_DEFAULT; - } else { - // SimpleConsoleLogger is used - return LoggingBackend.NONE; - } - } - }); + static final LoggingBackend detectedBackend = detectBackend(); + static LoggingBackend detectBackend() { + final Iterator iterator = + ServiceLoader.load(LoggerFinder.class, ClassLoader.getSystemClassLoader()) + .iterator(); + if (iterator.hasNext()) { + return LoggingBackend.CUSTOM; // Custom Logger Provider is registered + } + // No custom logger provider: we will be using the default + // backend. + final Iterator iterator2 = + ServiceLoader.loadInstalled(DefaultLoggerFinder.class) + .iterator(); + if (iterator2.hasNext()) { + // LoggingProviderImpl is registered. The default + // implementation is java.util.logging + String cname = System.getProperty("java.util.logging.config.class"); + String fname = System.getProperty("java.util.logging.config.file"); + return (cname != null || fname != null) + ? LoggingBackend.JUL_WITH_CONFIG + : LoggingBackend.JUL_DEFAULT; + } else { + // SimpleConsoleLogger is used + return LoggingBackend.NONE; + } } } diff --git a/src/java.base/share/classes/jdk/internal/logger/DefaultLoggerFinder.java b/src/java.base/share/classes/jdk/internal/logger/DefaultLoggerFinder.java index 1d077f1531c..348b131b3b9 100644 --- a/src/java.base/share/classes/jdk/internal/logger/DefaultLoggerFinder.java +++ b/src/java.base/share/classes/jdk/internal/logger/DefaultLoggerFinder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -36,8 +36,6 @@ import java.util.Objects; import java.lang.System.LoggerFinder; import java.lang.System.Logger; import java.lang.ref.ReferenceQueue; -import java.security.AccessController; -import java.security.PrivilegedAction; import java.util.Collection; import java.util.ResourceBundle; @@ -70,7 +68,7 @@ import java.util.ResourceBundle; * that provides the necessary configuration. * * @apiNote Programmers are not expected to call this class directly. - * Instead they should rely on the static methods defined by {@link + * Instead, they should rely on the static methods defined by {@link * java.lang.System java.lang.System} or {@link sun.util.logging.PlatformLogger * sun.util.logging.PlatformLogger}. * @@ -81,30 +79,12 @@ import java.util.ResourceBundle; */ public class DefaultLoggerFinder extends LoggerFinder { - static final RuntimePermission LOGGERFINDER_PERMISSION = - new RuntimePermission("loggerFinder"); - /** * Creates a new instance of DefaultLoggerFinder. - * @throws SecurityException if the calling code does not have the - * {@code RuntimePermission("loggerFinder")} */ protected DefaultLoggerFinder() { - this(checkPermission()); } - private DefaultLoggerFinder(Void unused) { - // nothing to do. - } - - private static Void checkPermission() { - @SuppressWarnings("removal") - final SecurityManager sm = System.getSecurityManager(); - if (sm != null) { - sm.checkPermission(LOGGERFINDER_PERMISSION); - } - return null; - } // SharedLoggers is a default cache of loggers used when JUL is not // present - in that case we use instances of SimpleConsoleLogger which @@ -139,23 +119,14 @@ public class DefaultLoggerFinder extends LoggerFinder { static final SharedLoggers application = new SharedLoggers(); } - @SuppressWarnings("removal") public static boolean isSystem(Module m) { - return AccessController.doPrivileged(new PrivilegedAction<>() { - @Override - public Boolean run() { - // returns true if moduleCL is the platform class loader - // or one of its ancestors. - return VM.isSystemDomainLoader(m.getClassLoader()); - } - }); + return VM.isSystemDomainLoader(m.getClassLoader()); } @Override public final Logger getLogger(String name, Module module) { Objects.requireNonNull(name, "name"); Objects.requireNonNull(module, "module"); - checkPermission(); return demandLoggerFor(name, module); } @@ -176,11 +147,8 @@ public class DefaultLoggerFinder extends LoggerFinder { * @param name The name of the logger. * @param module The module on behalf of which the logger is created. * @return A {@link Logger logger} suitable for the application usage. - * @throws SecurityException if the calling code does not have the - * {@code RuntimePermission("loggerFinder")}. */ protected Logger demandLoggerFor(String name, Module module) { - checkPermission(); if (isSystem(module)) { return SharedLoggers.system.get(SimpleConsoleLogger::makeSimpleLogger, name); } else { diff --git a/src/java.base/share/classes/jdk/internal/logger/LazyLoggers.java b/src/java.base/share/classes/jdk/internal/logger/LazyLoggers.java index 2c624962876..885e2e8c4d7 100644 --- a/src/java.base/share/classes/jdk/internal/logger/LazyLoggers.java +++ b/src/java.base/share/classes/jdk/internal/logger/LazyLoggers.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,8 +25,6 @@ package jdk.internal.logger; -import java.security.AccessController; -import java.security.PrivilegedAction; import java.util.function.BiFunction; import java.lang.System.LoggerFinder; import java.lang.System.Logger; @@ -44,9 +42,6 @@ import sun.util.logging.PlatformLogger; */ public final class LazyLoggers { - static final RuntimePermission LOGGERFINDER_PERMISSION = - new RuntimePermission("loggerFinder"); - private LazyLoggers() { throw new InternalError(); } @@ -341,7 +336,6 @@ public final class LazyLoggers { // Do not expose this outside of this package. private static volatile LoggerFinder provider; - @SuppressWarnings("removal") private static LoggerFinder accessLoggerFinder() { LoggerFinder prov = provider; if (prov == null) { @@ -350,10 +344,7 @@ public final class LazyLoggers { // the result. // This is just an optimization to avoid the cost of calling // doPrivileged every time. - final SecurityManager sm = System.getSecurityManager(); - prov = sm == null ? LoggerFinder.getLoggerFinder() : - AccessController.doPrivileged( - (PrivilegedAction)LoggerFinder::getLoggerFinder); + prov = LoggerFinder.getLoggerFinder(); if (prov instanceof TemporaryLoggerFinder) return prov; provider = prov; } @@ -403,17 +394,9 @@ public final class LazyLoggers { * @param module module on behalf of which the logger is created * @return The logger returned by the LoggerFinder. */ - @SuppressWarnings("removal") static Logger getLoggerFromFinder(String name, Module module) { - final SecurityManager sm = System.getSecurityManager(); - if (sm == null) { - return accessLoggerFinder().getLogger(name, module); - } else { - return AccessController.doPrivileged((PrivilegedAction) - () -> {return accessLoggerFinder().getLogger(name, module);}, - null, LOGGERFINDER_PERMISSION); - } - } + return accessLoggerFinder().getLogger(name, module); + } /** * Returns a (possibly lazy) Logger for the caller. diff --git a/src/java.base/share/classes/jdk/internal/logger/LoggerFinderLoader.java b/src/java.base/share/classes/jdk/internal/logger/LoggerFinderLoader.java index 932de4ef554..36edb918712 100644 --- a/src/java.base/share/classes/jdk/internal/logger/LoggerFinderLoader.java +++ b/src/java.base/share/classes/jdk/internal/logger/LoggerFinderLoader.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,12 +24,8 @@ */ package jdk.internal.logger; -import java.io.FilePermission; import java.lang.System.Logger; import java.lang.System.LoggerFinder; -import java.security.AccessController; -import java.security.Permission; -import java.security.PrivilegedAction; import java.util.Iterator; import java.util.Locale; import java.util.ServiceConfigurationError; @@ -37,9 +33,6 @@ import java.util.ServiceLoader; import java.util.function.BooleanSupplier; import jdk.internal.vm.annotation.Stable; -import sun.security.util.SecurityConstants; -import sun.security.action.GetBooleanAction; -import sun.security.action.GetPropertyAction; /** * Helper class used to load the {@link java.lang.System.LoggerFinder}. @@ -47,13 +40,6 @@ import sun.security.action.GetPropertyAction; public final class LoggerFinderLoader { private static volatile System.LoggerFinder service; private static final Object lock = new int[0]; - static final Permission CLASSLOADER_PERMISSION = - SecurityConstants.GET_CLASSLOADER_PERMISSION; - static final Permission READ_PERMISSION = - new FilePermission("<>", - SecurityConstants.FILE_READ_ACTION); - public static final RuntimePermission LOGGERFINDER_PERMISSION = - new RuntimePermission("loggerFinder"); // This is used to control how the LoggerFinderLoader handles // errors when instantiating the LoggerFinder provider. @@ -63,7 +49,7 @@ public final class LoggerFinderLoader { // DEBUG => Do not fail, use plain default (simple logger) implementation, // prints warning and exception stack trace on console. // QUIET => Do not fail and stay silent. - private static enum ErrorPolicy { ERROR, WARNING, DEBUG, QUIET }; + private static enum ErrorPolicy { ERROR, WARNING, DEBUG, QUIET } // This class is static and cannot be instantiated. private LoggerFinderLoader() { @@ -107,8 +93,7 @@ public final class LoggerFinderLoader { // Get configuration error policy private static ErrorPolicy configurationErrorPolicy() { - String errorPolicy = - GetPropertyAction.privilegedGetProperty("jdk.logger.finder.error"); + String errorPolicy = System.getProperty("jdk.logger.finder.error"); if (errorPolicy == null || errorPolicy.isEmpty()) { return ErrorPolicy.WARNING; } @@ -122,25 +107,12 @@ public final class LoggerFinderLoader { // Whether multiple provider should be considered as an error. // This is further submitted to the configuration error policy. private static boolean ensureSingletonProvider() { - return GetBooleanAction.privilegedGetProperty - ("jdk.logger.finder.singleton"); + return Boolean.getBoolean("jdk.logger.finder.singleton"); } - @SuppressWarnings("removal") private static Iterator findLoggerFinderProviders() { - final Iterator iterator; - if (System.getSecurityManager() == null) { - iterator = ServiceLoader.load(System.LoggerFinder.class, + return ServiceLoader.load(System.LoggerFinder.class, ClassLoader.getSystemClassLoader()).iterator(); - } else { - final PrivilegedAction> pa = - () -> ServiceLoader.load(System.LoggerFinder.class, - ClassLoader.getSystemClassLoader()).iterator(); - iterator = AccessController.doPrivileged(pa, null, - LOGGERFINDER_PERMISSION, CLASSLOADER_PERMISSION, - READ_PERMISSION); - } - return iterator; } public static final class TemporaryLoggerFinder extends LoggerFinder { @@ -219,25 +191,10 @@ public final class LoggerFinderLoader { return result; } - @SuppressWarnings("removal") private static System.LoggerFinder loadDefaultImplementation() { - final SecurityManager sm = System.getSecurityManager(); - final Iterator iterator; - if (sm == null) { - iterator = ServiceLoader.loadInstalled(DefaultLoggerFinder.class).iterator(); - } else { - // We use limited do privileged here - the minimum set of - // permissions required to 'see' the META-INF/services resources - // seems to be CLASSLOADER_PERMISSION and READ_PERMISSION. - // Note that do privileged is required because - // otherwise the SecurityManager will prevent the ServiceLoader - // from seeing the installed provider. - PrivilegedAction> pa = () -> - ServiceLoader.loadInstalled(DefaultLoggerFinder.class).iterator(); - iterator = AccessController.doPrivileged(pa, null, - LOGGERFINDER_PERMISSION, CLASSLOADER_PERMISSION, - READ_PERMISSION); - } + final Iterator iterator = + ServiceLoader.loadInstalled(DefaultLoggerFinder.class).iterator(); + DefaultLoggerFinder result = null; try { // Iterator iterates with the access control context stored @@ -256,11 +213,6 @@ public final class LoggerFinderLoader { } public static System.LoggerFinder getLoggerFinder() { - @SuppressWarnings("removal") - final SecurityManager sm = System.getSecurityManager(); - if (sm != null) { - sm.checkPermission(LOGGERFINDER_PERMISSION); - } return service(); } diff --git a/src/java.base/share/classes/jdk/internal/logger/SimpleConsoleLogger.java b/src/java.base/share/classes/jdk/internal/logger/SimpleConsoleLogger.java index 317e475d1a8..664ffaf7356 100644 --- a/src/java.base/share/classes/jdk/internal/logger/SimpleConsoleLogger.java +++ b/src/java.base/share/classes/jdk/internal/logger/SimpleConsoleLogger.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,8 +29,6 @@ import java.io.PrintStream; import java.io.PrintWriter; import java.io.StringWriter; import java.lang.StackWalker.StackFrame; -import java.security.AccessController; -import java.security.PrivilegedAction; import java.time.ZonedDateTime; import java.util.Optional; import java.util.MissingResourceException; @@ -39,7 +37,6 @@ import java.util.function.Function; import java.lang.System.Logger; import java.util.function.Predicate; import java.util.function.Supplier; -import sun.security.action.GetPropertyAction; import sun.util.logging.PlatformLogger; import sun.util.logging.PlatformLogger.ConfigurableBridge.LoggerConfiguration; @@ -56,8 +53,7 @@ public class SimpleConsoleLogger extends LoggerConfiguration PlatformLogger.toPlatformLevel(DEFAULT_LEVEL); static Level getDefaultLevel() { - String levelName = GetPropertyAction - .privilegedGetProperty("jdk.system.logger.level", "INFO"); + String levelName = System.getProperty("jdk.system.logger.level", "INFO"); try { return Level.valueOf(levelName); } catch (IllegalArgumentException iae) { @@ -202,18 +198,9 @@ public class SimpleConsoleLogger extends LoggerConfiguration /* * CallerFinder is a stateful predicate. */ - @SuppressWarnings("removal") static final class CallerFinder implements Predicate { - private static final StackWalker WALKER; - static { - final PrivilegedAction action = new PrivilegedAction<>() { - @Override - public StackWalker run() { - return StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE); - } - }; - WALKER = AccessController.doPrivileged(action); - } + private static final StackWalker WALKER = + StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE); /** * Returns StackFrame of the caller's frame. @@ -439,8 +426,7 @@ public class SimpleConsoleLogger extends LoggerConfiguration // Make it easier to wrap Logger... private static final String[] skips; static { - String additionalPkgs = - GetPropertyAction.privilegedGetProperty("jdk.logger.packages"); + String additionalPkgs = System.getProperty("jdk.logger.packages"); skips = additionalPkgs == null ? new String[0] : additionalPkgs.split(","); } @@ -499,7 +485,7 @@ public class SimpleConsoleLogger extends LoggerConfiguration // jdk/test/java/lang/invoke/lambda/LogGeneratedClassesTest.java // to fail - because that test has a testcase which somehow references // PlatformLogger and counts the number of generated lambda classes. - String format = GetPropertyAction.privilegedGetProperty(key); + String format = System.getProperty(key); if (format == null && defaultPropertyGetter != null) { format = defaultPropertyGetter.apply(key); diff --git a/src/java.logging/share/classes/java/util/logging/ConsoleHandler.java b/src/java.logging/share/classes/java/util/logging/ConsoleHandler.java index 13a6d294e74..cab4805b9e7 100644 --- a/src/java.logging/share/classes/java/util/logging/ConsoleHandler.java +++ b/src/java.logging/share/classes/java/util/logging/ConsoleHandler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -78,7 +78,7 @@ public class ConsoleHandler extends StreamHandler { // configure with specific defaults for ConsoleHandler super(Level.INFO, new SimpleFormatter(), null); - setOutputStreamPrivileged(System.err); + setOutputStream(System.err); } /** diff --git a/src/java.logging/share/classes/java/util/logging/FileHandler.java b/src/java.logging/share/classes/java/util/logging/FileHandler.java index b56f53adbb3..3c36a21516c 100644 --- a/src/java.logging/share/classes/java/util/logging/FileHandler.java +++ b/src/java.logging/share/classes/java/util/logging/FileHandler.java @@ -43,8 +43,6 @@ import java.nio.file.LinkOption; import java.nio.file.NoSuchFileException; import java.nio.file.Path; import java.nio.file.Paths; -import java.security.AccessController; -import java.security.PrivilegedAction; import java.util.HashSet; import java.util.Set; @@ -267,7 +265,6 @@ public class FileHandler extends StreamHandler { * @throws NullPointerException if pattern property is an empty String. */ public FileHandler() throws IOException { - checkPermission(); configure(); // pattern will have been set by configure. check that it's not // empty. @@ -293,10 +290,9 @@ public class FileHandler extends StreamHandler { * @throws IllegalArgumentException if pattern is an empty string */ public FileHandler(String pattern) throws IOException { - if (pattern.length() < 1 ) { + if (pattern.isEmpty()) { throw new IllegalArgumentException(); } - checkPermission(); configure(); this.pattern = pattern; this.limit = 0; @@ -323,10 +319,9 @@ public class FileHandler extends StreamHandler { * @throws IllegalArgumentException if pattern is an empty string */ public FileHandler(String pattern, boolean append) throws IOException { - if (pattern.length() < 1 ) { + if (pattern.isEmpty()) { throw new IllegalArgumentException(); } - checkPermission(); configure(); this.pattern = pattern; this.limit = 0; @@ -357,10 +352,9 @@ public class FileHandler extends StreamHandler { * @throws IllegalArgumentException if pattern is an empty string */ public FileHandler(String pattern, int limit, int count) throws IOException { - if (limit < 0 || count < 1 || pattern.length() < 1) { + if (limit < 0 || count < 1 || pattern.isEmpty()) { throw new IllegalArgumentException(); } - checkPermission(); configure(); this.pattern = pattern; this.limit = limit; @@ -425,10 +419,9 @@ public class FileHandler extends StreamHandler { */ public FileHandler(String pattern, long limit, int count, boolean append) throws IOException { - if (limit < 0 || count < 1 || pattern.length() < 1) { + if (limit < 0 || count < 1 || pattern.isEmpty()) { throw new IllegalArgumentException(); } - checkPermission(); configure(); this.pattern = pattern; this.limit = limit; @@ -451,7 +444,6 @@ public class FileHandler extends StreamHandler { */ private void openFiles() throws IOException { LogManager manager = LogManager.getLogManager(); - manager.checkPermission(); if (count < 1) { throw new IllegalArgumentException("file count = " + count); } @@ -481,7 +473,7 @@ public class FileHandler extends StreamHandler { // Now try to lock that filename. // Because some systems (e.g., Solaris) can only do file locks // between processes (and not within a process), we first check - // if we ourself already have the file locked. + // if we ourselves already have the file locked. synchronized(locks) { if (locks.contains(lockFileName)) { // We already own this lock, for a different FileHandler @@ -616,7 +608,7 @@ public class FileHandler extends StreamHandler { * @param generation the generation number to distinguish rotated logs * @param unique a unique number to resolve conflicts * @return the generated File - * @throws IOException + * @throws IOException if an I/O error occurs */ private File generate(String pattern, int generation, int unique) throws IOException @@ -696,7 +688,7 @@ public class FileHandler extends StreamHandler { if (unique > 0 && !sawu) { word = word.append('.').append(unique); } - if (word.length() > 0) { + if (!word.isEmpty()) { String n = word.toString(); Path p = prev == null ? Paths.get(n) : prev.resolveSibling(n); result = result == null ? p : result.resolve(p); @@ -714,21 +706,7 @@ public class FileHandler extends StreamHandler { /** * Rotate the set of output files */ - private void rotate() { - if (tryUseLock()) { - try { - rotate0(); - } finally { - unlock(); - } - } else { - synchronized (this) { - rotate0(); - } - } - } - - private void rotate0() { + private synchronized void rotate() { Level oldLevel = getLevel(); setLevel(Level.OFF); @@ -761,40 +739,14 @@ public class FileHandler extends StreamHandler { * silently ignored and is not published */ @Override - public void publish(LogRecord record) { - if (tryUseLock()) { - try { - publish0(record); - } finally { - unlock(); - } - } else { - synchronized (this) { - publish0(record); - } - } - - } - @SuppressWarnings("removal") - private void publish0(LogRecord record) { + public synchronized void publish(LogRecord record) { if (!isLoggable(record)) { return; } super.publish(record); flush(); if (limit > 0 && (meter.written >= limit || meter.written < 0)) { - // We performed access checks in the "init" method to make sure - // we are only initialized from trusted code. So we assume - // it is OK to write the target files, even if we are - // currently being called from untrusted code. - // So it is safe to raise privilege here. - AccessController.doPrivileged(new PrivilegedAction() { - @Override - public Object run() { - rotate(); - return null; - } - }); + rotate(); } } @@ -802,21 +754,7 @@ public class FileHandler extends StreamHandler { * Close all the files. */ @Override - public void close() { - if (tryUseLock()) { - try { - close0(); - } finally { - unlock(); - } - } else { - synchronized (this) { - close0(); - } - } - } - - private void close0() throws SecurityException { + public synchronized void close() { super.close(); // Unlock any lock file. if (lockFileName == null) { diff --git a/src/java.logging/share/classes/java/util/logging/Handler.java b/src/java.logging/share/classes/java/util/logging/Handler.java index e5fbc131de6..7b93e517e97 100644 --- a/src/java.logging/share/classes/java/util/logging/Handler.java +++ b/src/java.logging/share/classes/java/util/logging/Handler.java @@ -28,9 +28,6 @@ package java.util.logging; import java.util.Objects; import java.io.UnsupportedEncodingException; -import java.security.AccessController; -import java.security.PrivilegedAction; -import java.util.concurrent.locks.ReentrantLock; /** * A {@code Handler} object takes log messages from a {@code Logger} and @@ -52,6 +49,8 @@ import java.util.concurrent.locks.ReentrantLock; public abstract class Handler { private static final int offValue = Level.OFF.intValue(); + + // ensure log manager is initialized private final LogManager manager = LogManager.getLogManager(); // We're using volatile here to avoid synchronizing getters, which @@ -66,7 +65,6 @@ public abstract class Handler { private volatile Level logLevel = Level.ALL; private volatile ErrorManager errorManager = new ErrorManager(); private volatile String encoding; - private final ReentrantLock lock; /** * Default constructor. The resulting {@code Handler} has a log @@ -74,19 +72,7 @@ public abstract class Handler { * {@code Filter}. A default {@code ErrorManager} instance is installed * as the {@code ErrorManager}. */ - protected Handler() { - lock = initLocking(); - } - - private ReentrantLock initLocking() { - Class clazz = this.getClass(); - ClassLoader loader = clazz.getClassLoader(); - if (loader != null && loader != ClassLoader.getPlatformClassLoader()) { - return null; - } else { - return new ReentrantLock(); - } - } + protected Handler() { } /** * Package-private constructor for chaining from subclass constructors @@ -100,7 +86,6 @@ public abstract class Handler { * nor found in LogManager configuration properties * @param specifiedFormatter if not null, this is the formatter to configure */ - @SuppressWarnings("removal") Handler(Level defaultLevel, Formatter defaultFormatter, Formatter specifiedFormatter) { this(); @@ -111,38 +96,23 @@ public abstract class Handler { final Level level = manager.getLevelProperty(cname + ".level", defaultLevel); final Filter filter = manager.getFilterProperty(cname + ".filter", null); final Formatter formatter = specifiedFormatter == null - ? manager.getFormatterProperty(cname + ".formatter", defaultFormatter) - : specifiedFormatter; + ? manager.getFormatterProperty(cname + ".formatter", defaultFormatter) + : specifiedFormatter; final String encoding = manager.getStringProperty(cname + ".encoding", null); - AccessController.doPrivileged(new PrivilegedAction() { - @Override - public Void run() { - setLevel(level); - setFilter(filter); - setFormatter(formatter); - try { - setEncoding(encoding); - } catch (Exception ex) { - try { - setEncoding(null); - } catch (Exception ex2) { - // doing a setEncoding with null should always work. - // assert false; - } - } - return null; + setLevel(level); + setFilter(filter); + setFormatter(formatter); + try { + setEncoding(encoding); + } catch (Exception ex) { + try { + setEncoding(null); + } catch (Exception ex2) { + // doing a setEncoding with null should always work. + // assert false; } - }, null, LogManager.controlPermission); - } - - boolean tryUseLock() { - if (lock == null) return false; - lock.lock(); - return true; - } - void unlock() { - lock.unlock(); + } } /** @@ -183,22 +153,7 @@ public abstract class Handler { * * @param newFormatter the {@code Formatter} to use (may not be null) */ - public void setFormatter(Formatter newFormatter) { - if (tryUseLock()) { - try { - setFormatter0(newFormatter); - } finally { - unlock(); - } - } else { - synchronized (this) { - setFormatter0(newFormatter); - } - } - } - - private void setFormatter0(Formatter newFormatter) throws SecurityException { - checkPermission(); + public synchronized void setFormatter(Formatter newFormatter) { formatter = Objects.requireNonNull(newFormatter); } @@ -221,24 +176,8 @@ public abstract class Handler { * @throws UnsupportedEncodingException if the named encoding is * not supported. */ - public void setEncoding(String encoding) + public synchronized void setEncoding(String encoding) throws java.io.UnsupportedEncodingException { - if (tryUseLock()) { - try { - setEncoding0(encoding); - } finally { - unlock(); - } - } else { - synchronized (this) { - setEncoding0(encoding); - } - } - } - - private void setEncoding0(String encoding) - throws SecurityException, java.io.UnsupportedEncodingException { - checkPermission(); if (encoding != null) { try { if(!java.nio.charset.Charset.isSupported(encoding)) { @@ -270,22 +209,7 @@ public abstract class Handler { * * @param newFilter a {@code Filter} object (may be null) */ - public void setFilter(Filter newFilter) { - if (tryUseLock()) { - try { - setFilter0(newFilter); - } finally { - unlock(); - } - } else { - synchronized (this) { - setFilter0(newFilter); - } - } - } - - private void setFilter0(Filter newFilter) throws SecurityException { - checkPermission(); + public synchronized void setFilter(Filter newFilter) { filter = newFilter; } @@ -306,22 +230,7 @@ public abstract class Handler { * * @param em the new ErrorManager */ - public void setErrorManager(ErrorManager em) { - if (tryUseLock()) { - try { - setErrorManager0(em); - } finally { - unlock(); - } - } else { - synchronized (this) { - setErrorManager0(em); - } - } - } - - private void setErrorManager0(ErrorManager em) { - checkPermission(); + public synchronized void setErrorManager(ErrorManager em) { if (em == null) { throw new NullPointerException(); } @@ -334,7 +243,6 @@ public abstract class Handler { * @return the ErrorManager for this Handler */ public ErrorManager getErrorManager() { - checkPermission(); return errorManager; } @@ -366,25 +274,10 @@ public abstract class Handler { * * @param newLevel the new value for the log level */ - public void setLevel(Level newLevel) { - if (tryUseLock()) { - try { - setLevel0(newLevel); - } finally { - unlock(); - } - } else { - synchronized (this) { - setLevel0(newLevel); - } - } - } - - private void setLevel0(Level newLevel) throws SecurityException { + public synchronized void setLevel(Level newLevel) { if (newLevel == null) { throw new NullPointerException(); } - checkPermission(); logLevel = newLevel; } @@ -426,10 +319,4 @@ public abstract class Handler { return filter.isLoggable(record); } - // Package-private support method for security checks. - // We check that the caller has appropriate security privileges - // to update Handler state and if not throw a SecurityException. - void checkPermission() throws SecurityException { - manager.checkPermission(); - } } diff --git a/src/java.logging/share/classes/java/util/logging/Level.java b/src/java.logging/share/classes/java/util/logging/Level.java index 4a0f876d86d..ac9a6cae374 100644 --- a/src/java.logging/share/classes/java/util/logging/Level.java +++ b/src/java.logging/share/classes/java/util/logging/Level.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,8 +29,6 @@ import java.io.Serial; import java.lang.ref.Reference; import java.lang.ref.ReferenceQueue; import java.lang.ref.WeakReference; -import java.security.AccessController; -import java.security.PrivilegedAction; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -620,9 +618,7 @@ public class Level implements java.io.Serializable { } private static void registerWithClassLoader(Level customLevel) { - PrivilegedAction pa = customLevel.getClass()::getClassLoader; - @SuppressWarnings("removal") - final ClassLoader cl = AccessController.doPrivileged(pa); + final ClassLoader cl = customLevel.getClass().getClassLoader(); CUSTOM_LEVEL_CLV.computeIfAbsent(cl, (c, v) -> new ArrayList<>()) .add(customLevel); } diff --git a/src/java.logging/share/classes/java/util/logging/LogManager.java b/src/java.logging/share/classes/java/util/logging/LogManager.java index 59ab4bfcbce..0b7a854dddf 100644 --- a/src/java.logging/share/classes/java/util/logging/LogManager.java +++ b/src/java.logging/share/classes/java/util/logging/LogManager.java @@ -27,7 +27,6 @@ package java.util.logging; import java.io.*; import java.util.*; -import java.security.*; import java.lang.ref.ReferenceQueue; import java.lang.ref.WeakReference; import java.util.concurrent.ConcurrentHashMap; @@ -39,8 +38,6 @@ import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collectors; import java.util.stream.Stream; -import jdk.internal.access.JavaAWTAccess; -import jdk.internal.access.SharedSecrets; import sun.util.logging.internal.LoggingProviderImpl; import static jdk.internal.logger.DefaultLoggerFinder.isSystem; @@ -218,39 +215,36 @@ public class LogManager { Collections.synchronizedMap(new IdentityHashMap<>()); // The global LogManager object - @SuppressWarnings("removal") - private static final LogManager manager = AccessController.doPrivileged( - new PrivilegedAction() { - @Override - public LogManager run() { - LogManager mgr = null; - String cname = null; - try { - cname = System.getProperty("java.util.logging.manager"); - if (cname != null) { - try { - @SuppressWarnings("deprecation") - Object tmp = ClassLoader.getSystemClassLoader() - .loadClass(cname).newInstance(); - mgr = (LogManager) tmp; - } catch (ClassNotFoundException ex) { - @SuppressWarnings("deprecation") - Object tmp = Thread.currentThread() - .getContextClassLoader().loadClass(cname).newInstance(); - mgr = (LogManager) tmp; - } - } - } catch (Exception ex) { - System.err.println("Could not load Logmanager \"" + cname + "\""); - ex.printStackTrace(); - } - if (mgr == null) { - mgr = new LogManager(); - } - return mgr; + private static final LogManager manager = initLogManager(); + private static LogManager initLogManager() { + LogManager mgr = null; + String cname = null; + try { + cname = System.getProperty("java.util.logging.manager"); + if (cname != null) { + try { + @SuppressWarnings("deprecation") + Object tmp = ClassLoader.getSystemClassLoader() + .loadClass(cname).newInstance(); + mgr = (LogManager) tmp; + } catch (ClassNotFoundException ex) { + @SuppressWarnings("deprecation") + Object tmp = Thread.currentThread() + .getContextClassLoader().loadClass(cname).newInstance(); + mgr = (LogManager) tmp; } - }); + } + } catch (Exception ex) { + System.err.println("Could not load Logmanager \"" + cname + "\""); + ex.printStackTrace(); + } + if (mgr == null) { + mgr = new LogManager(); + } + return mgr; + } + // This private class is used as a shutdown hook. // It does a "reset" to close all open handlers. @@ -290,11 +284,6 @@ public class LogManager { * retrieved by calling LogManager.getLogManager. */ protected LogManager() { - this(checkSubclassPermissions()); - } - - private LogManager(Void checked) { - // Add a shutdown hook to close the global handlers. try { Runtime.getRuntime().addShutdownHook(new Cleaner()); @@ -304,20 +293,6 @@ public class LogManager { } } - private static Void checkSubclassPermissions() { - @SuppressWarnings("removal") - final SecurityManager sm = System.getSecurityManager(); - if (sm != null) { - // These permission will be checked in the LogManager constructor, - // in order to register the Cleaner() thread as a shutdown hook. - // Check them here to avoid the penalty of constructing the object - // etc... - sm.checkPermission(new RuntimePermission("shutdownHooks")); - sm.checkPermission(new RuntimePermission("setContextClassLoader")); - } - return null; - } - /** * Lazy initialization: if this instance of manager is the global * manager then this method will read the initial configuration and @@ -380,40 +355,33 @@ public class LogManager { // We use initializedCalled to break the recursion. initializedCalled = true; try { - AccessController.doPrivileged(new PrivilegedAction() { - @Override - public Object run() { - assert rootLogger == null; - assert initializedCalled && !initializationDone; + assert rootLogger == null; + assert initializedCalled && !initializationDone; - // create root logger before reading primordial - // configuration - to ensure that it will be added - // before the global logger, and not after. - final Logger root = owner.rootLogger = owner.new RootLogger(); + // create root logger before reading primordial + // configuration - to ensure that it will be added + // before the global logger, and not after. + final Logger root = owner.rootLogger = owner.new RootLogger(); - // Read configuration. - owner.readPrimordialConfiguration(); + // Read configuration. + owner.readPrimordialConfiguration(); - // Create and retain Logger for the root of the namespace. - owner.addLogger(root); + // Create and retain Logger for the root of the namespace. + owner.addLogger(root); - // Initialize level if not yet initialized - if (!root.isLevelInitialized()) { - root.setLevel(defaultLevel); - } + // Initialize level if not yet initialized + if (!root.isLevelInitialized()) { + root.setLevel(defaultLevel); + } - // Adding the global Logger. - // Do not call Logger.getGlobal() here as this might trigger - // subtle inter-dependency issues. - @SuppressWarnings("deprecation") - final Logger global = Logger.global; + // Adding the global Logger. + // Do not call Logger.getGlobal() here as this might trigger + // subtle inter-dependency issues. + @SuppressWarnings("deprecation") final Logger global = Logger.global; - // Make sure the global logger will be registered in the - // global manager - owner.addLogger(global); - return null; - } - }); + // Make sure the global logger will be registered in the + // global manager + owner.addLogger(global); } finally { initializationDone = true; } @@ -461,29 +429,6 @@ public class LogManager { // Loggers are isolated from each AppContext. private LoggerContext getUserContext() { LoggerContext context = null; - - @SuppressWarnings("removal") - SecurityManager sm = System.getSecurityManager(); - JavaAWTAccess javaAwtAccess = SharedSecrets.getJavaAWTAccess(); - if (sm != null && javaAwtAccess != null) { - // for each applet, it has its own LoggerContext isolated from others - final Object ecx = javaAwtAccess.getAppletContext(); - if (ecx != null) { - synchronized (javaAwtAccess) { - // find the AppContext of the applet code - // will be null if we are in the main app context. - if (contextsMap == null) { - contextsMap = new WeakHashMap<>(); - } - context = contextsMap.get(ecx); - if (context == null) { - // Create a new LoggerContext for the applet. - context = new LoggerContext(); - contextsMap.put(ecx, context); - } - } - } - } // for standalone app, return userContext return context != null ? context : userContext; } @@ -552,7 +497,6 @@ public class LogManager { return demandSystemLogger(name, resourceBundleName, module); } - @SuppressWarnings("removal") Logger demandSystemLogger(String name, String resourceBundleName, Module module) { // Add a system logger in the system context's namespace final Logger sysLogger = getSystemContext() @@ -578,14 +522,7 @@ public class LogManager { // LogManager will set the sysLogger's handlers via LogManager.addLogger method. if (logger != sysLogger) { // if logger already exists we merge the two logger configurations. - final Logger l = logger; - AccessController.doPrivileged(new PrivilegedAction() { - @Override - public Void run() { - l.mergeWithSystemLogger(sysLogger); - return null; - } - }); + logger.mergeWithSystemLogger(sysLogger); } return sysLogger; } @@ -801,7 +738,7 @@ public class LogManager { // the logger's level is already initialized Level level = owner.getLevelProperty(name + ".level", null); if (level != null && !logger.isLevelInitialized()) { - doSetLevel(logger, level); + logger.setLevel(level); } // instantiation of the handler is done in the LogManager.addLogger @@ -826,7 +763,7 @@ public class LogManager { } if (parent != null) { - doSetParent(logger, parent); + logger.setParent(parent); } // Walk over the children and tell them we are their new parent. node.walkAndSetParent(logger); @@ -855,22 +792,15 @@ public class LogManager { // If logger.getUseParentHandlers() returns 'true' and any of the logger's // parents have levels or handlers defined, make sure they are instantiated. - @SuppressWarnings("removal") private void processParentHandlers(final Logger logger, final String name, Predicate visited) { final LogManager owner = getOwner(); - AccessController.doPrivileged(new PrivilegedAction() { - @Override - public Void run() { - if (logger != owner.rootLogger) { - boolean useParent = owner.getBooleanProperty(name + ".useParentHandlers", true); - if (!useParent) { - logger.setUseParentHandlers(false); - } - } - return null; + if (logger != owner.rootLogger) { + boolean useParent = owner.getBooleanProperty(name + ".useParentHandlers", true); + if (!useParent) { + logger.setUseParentHandlers(false); } - }); + } int ix = 1; for (;;) { @@ -898,7 +828,7 @@ public class LogManager { return root; } LogNode node = root; - while (name.length() > 0) { + while (!name.isEmpty()) { int ix = name.indexOf('.'); String head; if (ix > 0) { @@ -961,21 +891,10 @@ public class LogManager { } // Add new per logger handlers. - // We need to raise privilege here. All our decisions will - // be made based on the logging configuration, which can - // only be modified by trusted code. - @SuppressWarnings("removal") private void loadLoggerHandlers(final Logger logger, final String name, - final String handlersPropertyName) - { - AccessController.doPrivileged(new PrivilegedAction() { - @Override - public Void run() { - setLoggerHandlers(logger, name, handlersPropertyName, - createLoggerHandlers(name, handlersPropertyName)); - return null; - } - }); + final String handlersPropertyName) { + setLoggerHandlers(logger, name, handlersPropertyName, + createLoggerHandlers(name, handlersPropertyName)); } private void setLoggerHandlers(final Logger logger, final String name, @@ -1228,45 +1147,6 @@ public class LogManager { && configurationLock.isHeldByCurrentThread(); } - // Private method to set a level on a logger. - // If necessary, we raise privilege before doing the call. - @SuppressWarnings("removal") - private static void doSetLevel(final Logger logger, final Level level) { - SecurityManager sm = System.getSecurityManager(); - if (sm == null) { - // There is no security manager, so things are easy. - logger.setLevel(level); - return; - } - // There is a security manager. Raise privilege before - // calling setLevel. - AccessController.doPrivileged(new PrivilegedAction() { - @Override - public Object run() { - logger.setLevel(level); - return null; - }}); - } - - // Private method to set a parent on a logger. - // If necessary, we raise privilege before doing the setParent call. - @SuppressWarnings("removal") - private static void doSetParent(final Logger logger, final Logger parent) { - SecurityManager sm = System.getSecurityManager(); - if (sm == null) { - // There is no security manager, so things are easy. - logger.setParent(parent); - return; - } - // There is a security manager. Raise privilege before - // calling setParent. - AccessController.doPrivileged(new PrivilegedAction() { - @Override - public Object run() { - logger.setParent(parent); - return null; - }}); - } /** * Method to find a named logger. @@ -1350,7 +1230,6 @@ public class LogManager { * @throws IOException if there are IO problems reading the configuration. */ public void readConfiguration() throws IOException { - checkPermission(); // if a configuration class is specified, load it and use it. String cname = System.getProperty("java.util.logging.config.class"); @@ -1383,7 +1262,7 @@ public class LogManager { } } - String getConfigurationFileName() throws IOException { + String getConfigurationFileName() { String fname = System.getProperty("java.util.logging.config.file"); if (fname == null) { fname = System.getProperty("java.home"); @@ -1413,7 +1292,6 @@ public class LogManager { */ public void reset() { - checkPermission(); List persistent; @@ -1518,7 +1396,7 @@ public class LogManager { String word = hands.substring(ix, end); ix = end+1; word = word.trim(); - if (word.length() == 0) { + if (word.isEmpty()) { continue; } result.add(word); @@ -1553,7 +1431,6 @@ public class LogManager { * {@linkplain java.util.Properties properties file} format. */ public void readConfiguration(InputStream ins) throws IOException { - checkPermission(); // We don't want reset() and readConfiguration() to run // in parallel. @@ -1857,7 +1734,6 @@ public class LogManager { */ public void updateConfiguration(Function> mapper) throws IOException { - checkPermission(); ensureLogManagerInitialized(); drainLoggerRefQueueBounded(); @@ -2054,7 +1930,6 @@ public class LogManager { public void updateConfiguration(InputStream ins, Function> mapper) throws IOException { - checkPermission(); ensureLogManagerInitialized(); drainLoggerRefQueueBounded(); @@ -2410,16 +2285,6 @@ public class LogManager { } } - static final Permission controlPermission = - new LoggingPermission("control", null); - - void checkPermission() { - @SuppressWarnings("removal") - SecurityManager sm = System.getSecurityManager(); - if (sm != null) - sm.checkPermission(controlPermission); - } - /** * Does nothing. * @@ -2456,7 +2321,7 @@ public class LogManager { if (logger == null) { node.walkAndSetParent(parent); } else { - doSetParent(logger, parent); + logger.setParent(parent); } } } @@ -2590,19 +2455,8 @@ public class LogManager { */ public LogManager addConfigurationListener(Runnable listener) { final Runnable r = Objects.requireNonNull(listener); - checkPermission(); - @SuppressWarnings("removal") - final SecurityManager sm = System.getSecurityManager(); - @SuppressWarnings("removal") - final AccessControlContext acc = - sm == null ? null : AccessController.getContext(); - final PrivilegedAction pa = - acc == null ? null : () -> { r.run() ; return null; }; - @SuppressWarnings("removal") - final Runnable pr = - acc == null ? r : () -> AccessController.doPrivileged(pa, acc); // Will do nothing if already registered. - listeners.putIfAbsent(r, pr); + listeners.putIfAbsent(r, r); return this; } @@ -2618,7 +2472,6 @@ public class LogManager { */ public void removeConfigurationListener(Runnable listener) { final Runnable key = Objects.requireNonNull(listener); - checkPermission(); listeners.remove(key); } @@ -2652,8 +2505,7 @@ public class LogManager { * behalf of system and application classes. */ private static final class LoggingProviderAccess - implements LoggingProviderImpl.LogManagerAccess, - PrivilegedAction { + implements LoggingProviderImpl.LogManagerAccess { private LoggingProviderAccess() { } @@ -2684,11 +2536,6 @@ public class LogManager { } Objects.requireNonNull(name); Objects.requireNonNull(module); - @SuppressWarnings("removal") - SecurityManager sm = System.getSecurityManager(); - if (sm != null) { - sm.checkPermission(controlPermission); - } if (isSystem(module)) { return manager.demandSystemLogger(name, Logger.SYSTEM_LOGGER_RB_NAME, module); @@ -2697,23 +2544,15 @@ public class LogManager { } } - @Override - public Void run() { + private void init() { LoggingProviderImpl.setLogManagerAccess(INSTANCE); - return null; } static final LoggingProviderAccess INSTANCE = new LoggingProviderAccess(); } static { - initStatic(); - } - - @SuppressWarnings("removal") - private static void initStatic() { - AccessController.doPrivileged(LoggingProviderAccess.INSTANCE, null, - controlPermission); + LoggingProviderAccess.INSTANCE.init(); } } diff --git a/src/java.logging/share/classes/java/util/logging/LogRecord.java b/src/java.logging/share/classes/java/util/logging/LogRecord.java index 9605d348e68..43d196cd538 100644 --- a/src/java.logging/share/classes/java/util/logging/LogRecord.java +++ b/src/java.logging/share/classes/java/util/logging/LogRecord.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,8 +28,6 @@ import java.time.Instant; import java.util.*; import java.util.concurrent.atomic.AtomicLong; import java.io.*; -import java.security.AccessController; -import java.security.PrivilegedAction; import java.time.Clock; import java.util.function.Predicate; import static jdk.internal.logger.SurrogateLogger.isFilteredFrame; @@ -767,14 +765,10 @@ public class LogRecord implements java.io.Serializable { /* * CallerFinder is a stateful predicate. */ - @SuppressWarnings("removal") static final class CallerFinder implements Predicate { - private static final StackWalker WALKER; - static { - final PrivilegedAction action = - () -> StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE); - WALKER = AccessController.doPrivileged(action); - } + private static final StackWalker WALKER = + StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE); + /** * Returns StackFrame of the caller's frame. diff --git a/src/java.logging/share/classes/java/util/logging/Logger.java b/src/java.logging/share/classes/java/util/logging/Logger.java index 3f192ba9612..f40e419c2ca 100644 --- a/src/java.logging/share/classes/java/util/logging/Logger.java +++ b/src/java.logging/share/classes/java/util/logging/Logger.java @@ -26,8 +26,6 @@ package java.util.logging; import java.lang.ref.WeakReference; -import java.security.AccessController; -import java.security.PrivilegedAction; import java.util.ArrayList; import java.util.Iterator; import java.util.Locale; @@ -579,7 +577,7 @@ public class Logger { // should never come here throw new InternalError("invalid logger merge"); } - checkPermission(); + ensureManagerInitialized(); final ConfigurationData cfg = config; if (cfg != system.config) { config = cfg.merge(system); @@ -614,13 +612,12 @@ public class Logger { this.manager = manager; } - private void checkPermission() throws SecurityException { + private void ensureManagerInitialized() { if (!anonymous) { if (manager == null) { // Complete initialization of the global Logger. manager = LogManager.getLogManager(); } - manager.checkPermission(); } } @@ -633,17 +630,8 @@ public class Logger { // These system loggers only set the resource bundle to the given // resource bundle name (rather than the default system resource bundle). private static class SystemLoggerHelper { - static boolean disableCallerCheck = getBooleanProperty("sun.util.logging.disableCallerCheck"); - private static boolean getBooleanProperty(final String key) { - @SuppressWarnings("removal") - String s = AccessController.doPrivileged(new PrivilegedAction() { - @Override - public String run() { - return System.getProperty(key); - } - }); - return Boolean.parseBoolean(s); - } + static boolean disableCallerCheck = + Boolean.getBoolean("sun.util.logging.disableCallerCheck"); } private static Logger demandLogger(String name, String resourceBundleName, Class caller) { @@ -930,7 +918,7 @@ public class Logger { * @param newFilter a filter object (may be null) */ public void setFilter(Filter newFilter) { - checkPermission(); + ensureManagerInitialized(); config.setFilter(newFilter); } @@ -1990,7 +1978,7 @@ public class Logger { * @param newLevel the new value for the log level (may be null) */ public void setLevel(Level newLevel) { - checkPermission(); + ensureManagerInitialized(); synchronized (treeLock) { config.setLevelObject(newLevel); updateEffectiveLevel(); @@ -2047,7 +2035,7 @@ public class Logger { */ public void addHandler(Handler handler) { Objects.requireNonNull(handler); - checkPermission(); + ensureManagerInitialized(); config.addHandler(handler); } @@ -2059,7 +2047,7 @@ public class Logger { * @param handler a logging Handler */ public void removeHandler(Handler handler) { - checkPermission(); + ensureManagerInitialized(); if (handler == null) { return; } @@ -2091,7 +2079,7 @@ public class Logger { * logger's parent. */ public void setUseParentHandlers(boolean useParentHandlers) { - checkPermission(); + ensureManagerInitialized(); config.setUseParentHandlers(useParentHandlers); } @@ -2187,11 +2175,8 @@ public class Logger { try { // We are called by an unnamed module: try with the // unnamed module class loader: - PrivilegedAction getModuleClassLoader = - () -> callerModule.getClassLoader(); - @SuppressWarnings("removal") - ClassLoader moduleCL = - AccessController.doPrivileged(getModuleClassLoader); + ClassLoader moduleCL = callerModule.getClassLoader(); + // moduleCL can be null if the logger is created by a class // appended to the bootclasspath. // If moduleCL is null we would use cl, but we already tried @@ -2267,7 +2252,7 @@ public class Logger { setCallerModuleRef(callerModule); if (isSystemLogger && (callerModule != null && !isSystem(callerModule))) { - checkPermission(); + ensureManagerInitialized(); } if (name.equals(SYSTEM_LOGGER_RB_NAME)) { @@ -2300,7 +2285,7 @@ public class Logger { * @since 1.8 */ public void setResourceBundle(ResourceBundle bundle) { - checkPermission(); + ensureManagerInitialized(); // Will throw NPE if bundle is null. final String baseName = bundle.getBaseBundleName(); @@ -2359,11 +2344,7 @@ public class Logger { throw new NullPointerException(); } - // check permission for all loggers, including anonymous loggers - if (manager == null) { - manager = LogManager.getLogManager(); - } - manager.checkPermission(); + ensureManagerInitialized(); doSetParent(parent); } diff --git a/src/java.logging/share/classes/java/util/logging/LoggingPermission.java b/src/java.logging/share/classes/java/util/logging/LoggingPermission.java index 0784bf863eb..c48d5ba9f06 100644 --- a/src/java.logging/share/classes/java/util/logging/LoggingPermission.java +++ b/src/java.logging/share/classes/java/util/logging/LoggingPermission.java @@ -26,7 +26,6 @@ package java.util.logging; -import java.security.*; /** * This class is for logging permissions. Currently there is only one diff --git a/src/java.logging/share/classes/java/util/logging/MemoryHandler.java b/src/java.logging/share/classes/java/util/logging/MemoryHandler.java index f7d67b4cca2..bd585fe5694 100644 --- a/src/java.logging/share/classes/java/util/logging/MemoryHandler.java +++ b/src/java.logging/share/classes/java/util/logging/MemoryHandler.java @@ -178,21 +178,7 @@ public class MemoryHandler extends Handler { * silently ignored and is not published */ @Override - public void publish(LogRecord record) { - if (tryUseLock()) { - try { - publish0(record); - } finally { - unlock(); - } - } else { - synchronized (this) { - publish0(record); - } - } - } - - private void publish0(LogRecord record) { + public synchronized void publish(LogRecord record) { if (!isLoggable(record)) { return; } @@ -214,21 +200,7 @@ public class MemoryHandler extends Handler { *

* The buffer is then cleared. */ - public void push() { - if (tryUseLock()) { - try { - push0(); - } finally { - unlock(); - } - } else { - synchronized (this) { - push0(); - } - } - } - - private void push0() { + public synchronized void push() { for (int i = 0; i < count; i++) { int ix = (start+i)%buffer.length; LogRecord record = buffer[ix]; @@ -267,25 +239,10 @@ public class MemoryHandler extends Handler { * * @param newLevel the new value of the {@code pushLevel} */ - public void setPushLevel(Level newLevel) { - if (tryUseLock()) { - try { - setPushLevel0(newLevel); - } finally { - unlock(); - } - } else { - synchronized (this) { - setPushLevel0(newLevel); - } - } - } - - private void setPushLevel0(Level newLevel) throws SecurityException { + public synchronized void setPushLevel(Level newLevel) { if (newLevel == null) { throw new NullPointerException(); } - checkPermission(); pushLevel = newLevel; } diff --git a/src/java.logging/share/classes/java/util/logging/SocketHandler.java b/src/java.logging/share/classes/java/util/logging/SocketHandler.java index 570e074cd9d..380cc20add4 100644 --- a/src/java.logging/share/classes/java/util/logging/SocketHandler.java +++ b/src/java.logging/share/classes/java/util/logging/SocketHandler.java @@ -146,28 +146,14 @@ public class SocketHandler extends StreamHandler { sock = new Socket(host, port); OutputStream out = sock.getOutputStream(); BufferedOutputStream bout = new BufferedOutputStream(out); - setOutputStreamPrivileged(bout); + setOutputStream(bout); } /** * Close this output stream. */ @Override - public void close() { - if (tryUseLock()) { - try { - close0(); - } finally { - unlock(); - } - } else { - synchronized (this) { - close0(); - } - } - } - - private void close0() throws SecurityException { + public synchronized void close() { super.close(); if (sock != null) { try { @@ -186,21 +172,7 @@ public class SocketHandler extends StreamHandler { * silently ignored and is not published */ @Override - public void publish(LogRecord record) { - if (tryUseLock()) { - try { - publish0(record); - } finally { - unlock(); - } - } else { - synchronized (this) { - publish0(record); - } - } - } - - private void publish0(LogRecord record) { + public synchronized void publish(LogRecord record) { if (!isLoggable(record)) { return; } diff --git a/src/java.logging/share/classes/java/util/logging/StreamHandler.java b/src/java.logging/share/classes/java/util/logging/StreamHandler.java index 9dfcf293041..31cb6605fbc 100644 --- a/src/java.logging/share/classes/java/util/logging/StreamHandler.java +++ b/src/java.logging/share/classes/java/util/logging/StreamHandler.java @@ -27,8 +27,6 @@ package java.util.logging; import java.io.*; -import java.security.AccessController; -import java.security.PrivilegedAction; import java.util.Objects; /** @@ -99,7 +97,7 @@ public class StreamHandler extends Handler { // configure with default level but use specified formatter super(Level.INFO, null, Objects.requireNonNull(formatter)); - setOutputStreamPrivileged(out); + setOutputStream(out); } /** @@ -120,21 +118,7 @@ public class StreamHandler extends Handler { * * @param out New output stream. May not be null. */ - protected void setOutputStream(OutputStream out) { - if (tryUseLock()) { - try { - setOutputStream0(out); - } finally { - unlock(); - } - } else { - synchronized (this) { - setOutputStream0(out); - } - } - } - - private void setOutputStream0(OutputStream out) throws SecurityException { + protected synchronized void setOutputStream(OutputStream out) { if (out == null) { throw new NullPointerException(); } @@ -167,22 +151,8 @@ public class StreamHandler extends Handler { * not supported. */ @Override - public void setEncoding(String encoding) + public synchronized void setEncoding(String encoding) throws java.io.UnsupportedEncodingException { - if (tryUseLock()) { - try { - setEncoding0(encoding); - } finally { - unlock(); - } - } else { - synchronized (this) { - setEncoding0(encoding); - } - } - } - private void setEncoding0(String encoding) - throws SecurityException, java.io.UnsupportedEncodingException { super.setEncoding(encoding); if (output == null) { return; @@ -214,22 +184,8 @@ public class StreamHandler extends Handler { * silently ignored and is not published */ @Override - public void publish(LogRecord record) { - if (tryUseLock()) { - try { - publish0(record); - } finally { - unlock(); - } - } else { - synchronized (this) { - publish0(record); - } - } - } - - private void publish0(LogRecord record) { - if (!isLoggable(record)) { + public synchronized void publish(LogRecord record) { + if (!isLoggable(record)) { return; } String msg; @@ -280,21 +236,7 @@ public class StreamHandler extends Handler { * Flush any buffered messages. */ @Override - public void flush() { - if (tryUseLock()) { - try { - flush0(); - } finally { - unlock(); - } - } else { - synchronized (this) { - flush0(); - } - } - } - - private void flush0() { + public synchronized void flush() { Writer writer = this.writer; if (writer != null) { try { @@ -307,8 +249,7 @@ public class StreamHandler extends Handler { } } - private void flushAndClose() throws SecurityException { - checkPermission(); + private void flushAndClose() { Writer writer = this.writer; if (writer != null) { try { @@ -338,30 +279,8 @@ public class StreamHandler extends Handler { * "tail" string. */ @Override - public void close() { - if (tryUseLock()) { - try { - flushAndClose(); - } finally { - unlock(); - } - } else { - synchronized (this) { - flushAndClose(); - } - } + public synchronized void close() { + flushAndClose(); } - // Package-private support for setting OutputStream - // with elevated privilege. - @SuppressWarnings("removal") - final void setOutputStreamPrivileged(final OutputStream out) { - AccessController.doPrivileged(new PrivilegedAction() { - @Override - public Void run() { - setOutputStream(out); - return null; - } - }, null, LogManager.controlPermission); - } } diff --git a/src/java.logging/share/classes/sun/util/logging/internal/LoggingProviderImpl.java b/src/java.logging/share/classes/sun/util/logging/internal/LoggingProviderImpl.java index 27a42dea3b5..8cccb6e23fa 100644 --- a/src/java.logging/share/classes/sun/util/logging/internal/LoggingProviderImpl.java +++ b/src/java.logging/share/classes/sun/util/logging/internal/LoggingProviderImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,8 +26,6 @@ package sun.util.logging.internal; -import java.security.AccessController; -import java.security.PrivilegedAction; import java.util.ResourceBundle; import java.util.function.Supplier; import java.lang.System.LoggerFinder; @@ -35,7 +33,6 @@ import java.lang.System.Logger; import java.util.Objects; import java.util.logging.LogManager; import jdk.internal.logger.DefaultLoggerFinder; -import java.util.logging.LoggingPermission; import sun.util.logging.PlatformLogger; import sun.util.logging.PlatformLogger.ConfigurableBridge.LoggerConfiguration; @@ -77,15 +74,9 @@ import sun.util.logging.PlatformLogger.ConfigurableBridge.LoggerConfiguration; * */ public final class LoggingProviderImpl extends DefaultLoggerFinder { - static final RuntimePermission LOGGERFINDER_PERMISSION = - new RuntimePermission("loggerFinder"); - private static final LoggingPermission LOGGING_CONTROL_PERMISSION = - new LoggingPermission("control", null); /** * Creates a new instance of LoggingProviderImpl. - * @throws SecurityException if the calling code does not have the - * {@code RuntimePermission("loggerFinder")}. */ public LoggingProviderImpl() { } @@ -147,13 +138,13 @@ public final class LoggingProviderImpl extends DefaultLoggerFinder { } @Override - public void log(sun.util.logging.PlatformLogger.Level level, Supplier msgSuppier) { - julLogger.log(toJUL(level), msgSuppier); + public void log(sun.util.logging.PlatformLogger.Level level, Supplier msgSupplier) { + julLogger.log(toJUL(level), msgSupplier); } @Override - public void log(sun.util.logging.PlatformLogger.Level level, Throwable thrown, Supplier msgSuppier) { - julLogger.log(toJUL(level), thrown, msgSuppier); + public void log(sun.util.logging.PlatformLogger.Level level, Throwable thrown, Supplier msgSupplier) { + julLogger.log(toJUL(level), thrown, msgSupplier); } @Override @@ -403,18 +394,10 @@ public final class LoggingProviderImpl extends DefaultLoggerFinder { * @param module the module for which the logger should be created. * @return a Logger suitable for use in the given module. */ - @SuppressWarnings("removal") private static java.util.logging.Logger demandJULLoggerFor(final String name, Module module) { final LogManager manager = LogManager.getLogManager(); - final SecurityManager sm = System.getSecurityManager(); - if (sm == null) { - return logManagerAccess.demandLoggerFor(manager, name, module); - } else { - final PrivilegedAction pa = - () -> logManagerAccess.demandLoggerFor(manager, name, module); - return AccessController.doPrivileged(pa, null, LOGGING_CONTROL_PERMISSION); - } + return logManagerAccess.demandLoggerFor(manager, name, module); } /** @@ -425,16 +408,9 @@ public final class LoggingProviderImpl extends DefaultLoggerFinder { * corresponding java.util.logging.Logger backend}. * * @return {@inheritDoc} - * @throws SecurityException if the calling code doesn't have the - * {@code RuntimePermission("loggerFinder")}. */ @Override protected Logger demandLoggerFor(String name, Module module) { - @SuppressWarnings("removal") - final SecurityManager sm = System.getSecurityManager(); - if (sm != null) { - sm.checkPermission(LOGGERFINDER_PERMISSION); - } return JULWrapper.of(demandJULLoggerFor(name,module)); } @@ -445,25 +421,17 @@ public final class LoggingProviderImpl extends DefaultLoggerFinder { // Hook for tests public static LogManagerAccess getLogManagerAccess() { - @SuppressWarnings("removal") - final SecurityManager sm = System.getSecurityManager(); - if (sm != null) { - sm.checkPermission(LOGGING_CONTROL_PERMISSION); - } - // Triggers initialization of accessJulLogger if not set. + // Triggers initialization of logManagerAccess if not set. + LogManagerAccess logManagerAccess = LoggingProviderImpl.logManagerAccess; if (logManagerAccess == null) LogManager.getLogManager(); + logManagerAccess = LoggingProviderImpl.logManagerAccess; return logManagerAccess; } private static volatile LogManagerAccess logManagerAccess; - public static void setLogManagerAccess(LogManagerAccess accesLoggers) { - @SuppressWarnings("removal") - final SecurityManager sm = System.getSecurityManager(); - if (sm != null) { - sm.checkPermission(LOGGING_CONTROL_PERMISSION); - } - logManagerAccess = accesLoggers; + public static void setLogManagerAccess(LogManagerAccess accessLoggers) { + logManagerAccess = accessLoggers; } }