7169884: LogManager checks do not work correctly for sub-types

Reviewed-by: mchung, ahgross
This commit is contained in:
Alan Bateman 2012-09-08 20:31:42 +01:00
parent 1e5b3e3ded
commit c6f43f3599
6 changed files with 36 additions and 35 deletions

View File

@ -220,7 +220,7 @@ public class FileHandler extends StreamHandler {
* @exception NullPointerException if pattern property is an empty String. * @exception NullPointerException if pattern property is an empty String.
*/ */
public FileHandler() throws IOException, SecurityException { public FileHandler() throws IOException, SecurityException {
checkAccess(); checkPermission();
configure(); configure();
openFiles(); openFiles();
} }
@ -246,7 +246,7 @@ public class FileHandler extends StreamHandler {
if (pattern.length() < 1 ) { if (pattern.length() < 1 ) {
throw new IllegalArgumentException(); throw new IllegalArgumentException();
} }
checkAccess(); checkPermission();
configure(); configure();
this.pattern = pattern; this.pattern = pattern;
this.limit = 0; this.limit = 0;
@ -278,7 +278,7 @@ public class FileHandler extends StreamHandler {
if (pattern.length() < 1 ) { if (pattern.length() < 1 ) {
throw new IllegalArgumentException(); throw new IllegalArgumentException();
} }
checkAccess(); checkPermission();
configure(); configure();
this.pattern = pattern; this.pattern = pattern;
this.limit = 0; this.limit = 0;
@ -315,7 +315,7 @@ public class FileHandler extends StreamHandler {
if (limit < 0 || count < 1 || pattern.length() < 1) { if (limit < 0 || count < 1 || pattern.length() < 1) {
throw new IllegalArgumentException(); throw new IllegalArgumentException();
} }
checkAccess(); checkPermission();
configure(); configure();
this.pattern = pattern; this.pattern = pattern;
this.limit = limit; this.limit = limit;
@ -354,7 +354,7 @@ public class FileHandler extends StreamHandler {
if (limit < 0 || count < 1 || pattern.length() < 1) { if (limit < 0 || count < 1 || pattern.length() < 1) {
throw new IllegalArgumentException(); throw new IllegalArgumentException();
} }
checkAccess(); checkPermission();
configure(); configure();
this.pattern = pattern; this.pattern = pattern;
this.limit = limit; this.limit = limit;
@ -367,7 +367,7 @@ public class FileHandler extends StreamHandler {
// configured instance variables. // configured instance variables.
private void openFiles() throws IOException { private void openFiles() throws IOException {
LogManager manager = LogManager.getLogManager(); LogManager manager = LogManager.getLogManager();
manager.checkAccess(); manager.checkPermission();
if (count < 1) { if (count < 1) {
throw new IllegalArgumentException("file count = " + count); throw new IllegalArgumentException("file count = " + count);
} }

View File

@ -111,7 +111,7 @@ public abstract class Handler {
* the caller does not have <tt>LoggingPermission("control")</tt>. * the caller does not have <tt>LoggingPermission("control")</tt>.
*/ */
public void setFormatter(Formatter newFormatter) throws SecurityException { public void setFormatter(Formatter newFormatter) throws SecurityException {
checkAccess(); checkPermission();
// Check for a null pointer: // Check for a null pointer:
newFormatter.getClass(); newFormatter.getClass();
formatter = newFormatter; formatter = newFormatter;
@ -140,7 +140,7 @@ public abstract class Handler {
*/ */
public void setEncoding(String encoding) public void setEncoding(String encoding)
throws SecurityException, java.io.UnsupportedEncodingException { throws SecurityException, java.io.UnsupportedEncodingException {
checkAccess(); checkPermission();
if (encoding != null) { if (encoding != null) {
try { try {
if(!java.nio.charset.Charset.isSupported(encoding)) { if(!java.nio.charset.Charset.isSupported(encoding)) {
@ -175,7 +175,7 @@ public abstract class Handler {
* the caller does not have <tt>LoggingPermission("control")</tt>. * the caller does not have <tt>LoggingPermission("control")</tt>.
*/ */
public void setFilter(Filter newFilter) throws SecurityException { public void setFilter(Filter newFilter) throws SecurityException {
checkAccess(); checkPermission();
filter = newFilter; filter = newFilter;
} }
@ -199,7 +199,7 @@ public abstract class Handler {
* the caller does not have <tt>LoggingPermission("control")</tt>. * the caller does not have <tt>LoggingPermission("control")</tt>.
*/ */
public void setErrorManager(ErrorManager em) { public void setErrorManager(ErrorManager em) {
checkAccess(); checkPermission();
if (em == null) { if (em == null) {
throw new NullPointerException(); throw new NullPointerException();
} }
@ -213,7 +213,7 @@ public abstract class Handler {
* the caller does not have <tt>LoggingPermission("control")</tt>. * the caller does not have <tt>LoggingPermission("control")</tt>.
*/ */
public ErrorManager getErrorManager() { public ErrorManager getErrorManager() {
checkAccess(); checkPermission();
return errorManager; return errorManager;
} }
@ -253,7 +253,7 @@ public abstract class Handler {
if (newLevel == null) { if (newLevel == null) {
throw new NullPointerException(); throw new NullPointerException();
} }
checkAccess(); checkPermission();
logLevel = newLevel; logLevel = newLevel;
} }
@ -296,9 +296,9 @@ public abstract class Handler {
// If "sealed" is true, we check that the caller has // If "sealed" is true, we check that the caller has
// appropriate security privileges to update Handler // appropriate security privileges to update Handler
// state and if not throw a SecurityException. // state and if not throw a SecurityException.
void checkAccess() throws SecurityException { void checkPermission() throws SecurityException {
if (sealed) { if (sealed) {
manager.checkAccess(); manager.checkPermission();
} }
} }
} }

View File

@ -314,7 +314,7 @@ public class LogManager {
*/ */
public void addPropertyChangeListener(PropertyChangeListener l) throws SecurityException { public void addPropertyChangeListener(PropertyChangeListener l) throws SecurityException {
PropertyChangeListener listener = Objects.requireNonNull(l); PropertyChangeListener listener = Objects.requireNonNull(l);
checkAccess(); checkPermission();
synchronized (listenerMap) { synchronized (listenerMap) {
// increment the registration count if already registered // increment the registration count if already registered
Integer value = listenerMap.get(listener); Integer value = listenerMap.get(listener);
@ -338,7 +338,7 @@ public class LogManager {
* the caller does not have LoggingPermission("control"). * the caller does not have LoggingPermission("control").
*/ */
public void removePropertyChangeListener(PropertyChangeListener l) throws SecurityException { public void removePropertyChangeListener(PropertyChangeListener l) throws SecurityException {
checkAccess(); checkPermission();
if (l != null) { if (l != null) {
PropertyChangeListener listener = l; PropertyChangeListener listener = l;
synchronized (listenerMap) { synchronized (listenerMap) {
@ -793,7 +793,7 @@ public class LogManager {
* @exception IOException if there are IO problems reading the configuration. * @exception IOException if there are IO problems reading the configuration.
*/ */
public void readConfiguration() throws IOException, SecurityException { public void readConfiguration() throws IOException, SecurityException {
checkAccess(); checkPermission();
// if a configuration class is specified, load it and use it. // if a configuration class is specified, load it and use it.
String cname = System.getProperty("java.util.logging.config.class"); String cname = System.getProperty("java.util.logging.config.class");
@ -851,7 +851,7 @@ public class LogManager {
*/ */
public void reset() throws SecurityException { public void reset() throws SecurityException {
checkAccess(); checkPermission();
synchronized (this) { synchronized (this) {
props = new Properties(); props = new Properties();
// Since we are doing a reset we no longer want to initialize // Since we are doing a reset we no longer want to initialize
@ -936,7 +936,7 @@ public class LogManager {
* @exception IOException if there are problems reading from the stream. * @exception IOException if there are problems reading from the stream.
*/ */
public void readConfiguration(InputStream ins) throws IOException, SecurityException { public void readConfiguration(InputStream ins) throws IOException, SecurityException {
checkAccess(); checkPermission();
reset(); reset();
// Load the properties // Load the properties
@ -1113,8 +1113,13 @@ public class LogManager {
loadLoggerHandlers(rootLogger, null, "handlers"); loadLoggerHandlers(rootLogger, null, "handlers");
} }
private final Permission controlPermission = new LoggingPermission("control", null);
private Permission ourPermission = new LoggingPermission("control", null); void checkPermission() {
SecurityManager sm = System.getSecurityManager();
if (sm != null)
sm.checkPermission(controlPermission);
}
/** /**
* Check that the current context is trusted to modify the logging * Check that the current context is trusted to modify the logging
@ -1127,11 +1132,7 @@ public class LogManager {
* the caller does not have LoggingPermission("control"). * the caller does not have LoggingPermission("control").
*/ */
public void checkAccess() throws SecurityException { public void checkAccess() throws SecurityException {
SecurityManager sm = System.getSecurityManager(); checkPermission();
if (sm == null) {
return;
}
sm.checkPermission(ourPermission);
} }
// Nested class to represent a node in our tree of named loggers. // Nested class to represent a node in our tree of named loggers.

View File

@ -276,13 +276,13 @@ public class Logger {
this.manager = manager; this.manager = manager;
} }
private void checkAccess() throws SecurityException { private void checkPermission() throws SecurityException {
if (!anonymous) { if (!anonymous) {
if (manager == null) { if (manager == null) {
// Complete initialization of the global Logger. // Complete initialization of the global Logger.
manager = LogManager.getLogManager(); manager = LogManager.getLogManager();
} }
manager.checkAccess(); manager.checkPermission();
} }
} }
@ -482,7 +482,7 @@ public class Logger {
* the caller does not have LoggingPermission("control"). * the caller does not have LoggingPermission("control").
*/ */
public void setFilter(Filter newFilter) throws SecurityException { public void setFilter(Filter newFilter) throws SecurityException {
checkAccess(); checkPermission();
filter = newFilter; filter = newFilter;
} }
@ -1168,7 +1168,7 @@ public class Logger {
* the caller does not have LoggingPermission("control"). * the caller does not have LoggingPermission("control").
*/ */
public void setLevel(Level newLevel) throws SecurityException { public void setLevel(Level newLevel) throws SecurityException {
checkAccess(); checkPermission();
synchronized (treeLock) { synchronized (treeLock) {
levelObject = newLevel; levelObject = newLevel;
updateEffectiveLevel(); updateEffectiveLevel();
@ -1223,7 +1223,7 @@ public class Logger {
public void addHandler(Handler handler) throws SecurityException { public void addHandler(Handler handler) throws SecurityException {
// Check for null handler // Check for null handler
handler.getClass(); handler.getClass();
checkAccess(); checkPermission();
handlers.add(handler); handlers.add(handler);
} }
@ -1237,7 +1237,7 @@ public class Logger {
* the caller does not have LoggingPermission("control"). * the caller does not have LoggingPermission("control").
*/ */
public void removeHandler(Handler handler) throws SecurityException { public void removeHandler(Handler handler) throws SecurityException {
checkAccess(); checkPermission();
if (handler == null) { if (handler == null) {
return; return;
} }
@ -1265,7 +1265,7 @@ public class Logger {
* the caller does not have LoggingPermission("control"). * the caller does not have LoggingPermission("control").
*/ */
public void setUseParentHandlers(boolean useParentHandlers) { public void setUseParentHandlers(boolean useParentHandlers) {
checkAccess(); checkPermission();
this.useParentHandlers = useParentHandlers; this.useParentHandlers = useParentHandlers;
} }
@ -1420,7 +1420,7 @@ public class Logger {
if (parent == null) { if (parent == null) {
throw new NullPointerException(); throw new NullPointerException();
} }
manager.checkAccess(); manager.checkPermission();
doSetParent(parent); doSetParent(parent);
} }

View File

@ -238,7 +238,7 @@ public class MemoryHandler extends Handler {
throw new NullPointerException(); throw new NullPointerException();
} }
LogManager manager = LogManager.getLogManager(); LogManager manager = LogManager.getLogManager();
checkAccess(); checkPermission();
pushLevel = newLevel; pushLevel = newLevel;
} }

View File

@ -249,7 +249,7 @@ public class StreamHandler extends Handler {
} }
private synchronized void flushAndClose() throws SecurityException { private synchronized void flushAndClose() throws SecurityException {
checkAccess(); checkPermission();
if (writer != null) { if (writer != null) {
try { try {
if (!doneHeader) { if (!doneHeader) {