--- old/src/share/classes/java/util/logging/StreamHandler.java 2013-12-19 16:45:27.319496812 +0100 +++ new/src/share/classes/java/util/logging/StreamHandler.java 2013-12-19 16:45:27.243498215 +0100 @@ -27,6 +27,9 @@ package java.util.logging; import java.io.*; +import java.security.AccessController; +import java.security.PrivilegedAction; +import java.util.Objects; /** * Stream based logging Handler. @@ -77,35 +80,12 @@ 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 with specific defaults for StreamHandler + super(Level.INFO, new SimpleFormatter(), null); } /** @@ -116,11 +96,19 @@ * @param formatter Formatter to be used to format output */ public StreamHandler(OutputStream out, Formatter formatter) { - sealed = false; - configure(); - setFormatter(formatter); - setOutputStream(out); - sealed = true; + // configure with default level but use specified formatter + super(Level.INFO, null, Objects.requireNonNull(formatter)); + + setOutputStreamPrivileged(out); + } + + /** + * @see Handler#Handler(Level, Formatter, Formatter) + */ + StreamHandler(Level defaultLevel, + Formatter defaultFormatter, + Formatter specifiedFormatter) { + super(defaultLevel, defaultFormatter, specifiedFormatter); } /** @@ -301,4 +289,16 @@ 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); + } }