--- old/src/share/classes/java/util/logging/StreamHandler.java 2013-12-18 17:42:56.464375274 +0100 +++ new/src/share/classes/java/util/logging/StreamHandler.java 2013-12-18 17:42:56.387376734 +0100 @@ -27,6 +27,8 @@ package java.util.logging; import java.io.*; +import java.security.AccessController; +import java.security.PrivilegedAction; /** * Stream based logging Handler. @@ -77,35 +79,11 @@ private boolean doneHeader; private volatile Writer writer; - // Private method to configure a StreamHandler from LogManager - // properties and/or default values as specified in the class - // javadoc. - private void configure() { - LogManager manager = LogManager.getLogManager(); - String cname = getClass().getName(); - - setLevel(manager.getLevelProperty(cname +".level", Level.INFO)); - setFilter(manager.getFilterProperty(cname +".filter", null)); - setFormatter(manager.getFormatterProperty(cname +".formatter", new SimpleFormatter())); - try { - setEncoding(manager.getStringProperty(cname +".encoding", null)); - } catch (Exception ex) { - try { - setEncoding(null); - } catch (Exception ex2) { - // doing a setEncoding with null should always work. - // assert false; - } - } - } - /** * Create a StreamHandler, with no current output stream. */ public StreamHandler() { - sealed = false; - configure(); - sealed = true; + configure(null); } /** @@ -116,11 +94,11 @@ * @param formatter Formatter to be used to format output */ public StreamHandler(OutputStream out, Formatter formatter) { - sealed = false; - configure(); - setFormatter(formatter); - setOutputStream(out); - sealed = true; + if (formatter == null) { + throw new NullPointerException(); + } + configure(formatter); + setOutputStreamPrivileged(out); } /** @@ -301,4 +279,17 @@ public synchronized void close() throws SecurityException { flushAndClose(); } + + // Package-private support for setting OutputStream + // with elevated privilege. + + final void setOutputStreamPrivileged(final OutputStream out) { + AccessController.doPrivileged(new PrivilegedAction() { + @Override + public Void run() { + setOutputStream(out); + return null; + } + }, null, LogManager.controlPermission); + } }