Merge
This commit is contained in:
commit
f03cbcc678
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2000, 2004, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -179,6 +179,12 @@ class HttpsURLConnection extends HttpURLConnection
|
|||||||
throw new IllegalArgumentException(
|
throw new IllegalArgumentException(
|
||||||
"no SSLSocketFactory specified");
|
"no SSLSocketFactory specified");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SecurityManager sm = System.getSecurityManager();
|
||||||
|
if (sm != null) {
|
||||||
|
sm.checkSetFactory();
|
||||||
|
}
|
||||||
|
|
||||||
sslSocketFactory = sf;
|
sslSocketFactory = sf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2000, 2009, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -25,6 +25,7 @@
|
|||||||
package java.awt;
|
package java.awt;
|
||||||
|
|
||||||
import java.awt.event.KeyEvent;
|
import java.awt.event.KeyEvent;
|
||||||
|
import sun.awt.AppContext;
|
||||||
import java.awt.event.InputEvent;
|
import java.awt.event.InputEvent;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
@ -66,9 +67,6 @@ import java.lang.reflect.Field;
|
|||||||
public class AWTKeyStroke implements Serializable {
|
public class AWTKeyStroke implements Serializable {
|
||||||
static final long serialVersionUID = -6430539691155161871L;
|
static final long serialVersionUID = -6430539691155161871L;
|
||||||
|
|
||||||
private static Map cache;
|
|
||||||
private static AWTKeyStroke cacheKey;
|
|
||||||
private static Constructor ctor = getCtor(AWTKeyStroke.class);
|
|
||||||
private static Map modifierKeywords;
|
private static Map modifierKeywords;
|
||||||
/**
|
/**
|
||||||
* Associates VK_XXX (as a String) with code (as Integer). This is
|
* Associates VK_XXX (as a String) with code (as Integer). This is
|
||||||
@ -77,6 +75,25 @@ public class AWTKeyStroke implements Serializable {
|
|||||||
*/
|
*/
|
||||||
private static VKCollection vks;
|
private static VKCollection vks;
|
||||||
|
|
||||||
|
//A key for the collection of AWTKeyStrokes within AppContext.
|
||||||
|
private static Object APP_CONTEXT_CACHE_KEY = new Object();
|
||||||
|
//A key withing the cache
|
||||||
|
private static AWTKeyStroke APP_CONTEXT_KEYSTROKE_KEY = new AWTKeyStroke();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Reads keystroke class from AppContext and if null, puts there the
|
||||||
|
* AWTKeyStroke class.
|
||||||
|
* Must be called under locked AWTKeyStro
|
||||||
|
*/
|
||||||
|
private static Class getAWTKeyStrokeClass() {
|
||||||
|
Class clazz = (Class)AppContext.getAppContext().get(AWTKeyStroke.class);
|
||||||
|
if (clazz == null) {
|
||||||
|
clazz = AWTKeyStroke.class;
|
||||||
|
AppContext.getAppContext().put(AWTKeyStroke.class, AWTKeyStroke.class);
|
||||||
|
}
|
||||||
|
return clazz;
|
||||||
|
}
|
||||||
|
|
||||||
private char keyChar = KeyEvent.CHAR_UNDEFINED;
|
private char keyChar = KeyEvent.CHAR_UNDEFINED;
|
||||||
private int keyCode = KeyEvent.VK_UNDEFINED;
|
private int keyCode = KeyEvent.VK_UNDEFINED;
|
||||||
private int modifiers;
|
private int modifiers;
|
||||||
@ -164,9 +181,12 @@ public class AWTKeyStroke implements Serializable {
|
|||||||
if (subclass == null) {
|
if (subclass == null) {
|
||||||
throw new IllegalArgumentException("subclass cannot be null");
|
throw new IllegalArgumentException("subclass cannot be null");
|
||||||
}
|
}
|
||||||
if (AWTKeyStroke.ctor.getDeclaringClass().equals(subclass)) {
|
synchronized (AWTKeyStroke.class) {
|
||||||
// Already registered
|
Class keyStrokeClass = (Class)AppContext.getAppContext().get(AWTKeyStroke.class);
|
||||||
return;
|
if (keyStrokeClass != null && keyStrokeClass.equals(subclass)){
|
||||||
|
// Already registered
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (!AWTKeyStroke.class.isAssignableFrom(subclass)) {
|
if (!AWTKeyStroke.class.isAssignableFrom(subclass)) {
|
||||||
throw new ClassCastException("subclass is not derived from AWTKeyStroke");
|
throw new ClassCastException("subclass is not derived from AWTKeyStroke");
|
||||||
@ -197,9 +217,9 @@ public class AWTKeyStroke implements Serializable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
synchronized (AWTKeyStroke.class) {
|
synchronized (AWTKeyStroke.class) {
|
||||||
AWTKeyStroke.ctor = ctor;
|
AppContext.getAppContext().put(AWTKeyStroke.class, subclass);
|
||||||
cache = null;
|
AppContext.getAppContext().remove(APP_CONTEXT_CACHE_KEY);
|
||||||
cacheKey = null;
|
AppContext.getAppContext().remove(APP_CONTEXT_KEYSTROKE_KEY);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -229,13 +249,19 @@ public class AWTKeyStroke implements Serializable {
|
|||||||
private static synchronized AWTKeyStroke getCachedStroke
|
private static synchronized AWTKeyStroke getCachedStroke
|
||||||
(char keyChar, int keyCode, int modifiers, boolean onKeyRelease)
|
(char keyChar, int keyCode, int modifiers, boolean onKeyRelease)
|
||||||
{
|
{
|
||||||
|
Map cache = (Map)AppContext.getAppContext().get(APP_CONTEXT_CACHE_KEY);
|
||||||
|
AWTKeyStroke cacheKey = (AWTKeyStroke)AppContext.getAppContext().get(APP_CONTEXT_KEYSTROKE_KEY);
|
||||||
|
|
||||||
if (cache == null) {
|
if (cache == null) {
|
||||||
cache = new HashMap();
|
cache = new HashMap();
|
||||||
|
AppContext.getAppContext().put(APP_CONTEXT_CACHE_KEY, cache);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cacheKey == null) {
|
if (cacheKey == null) {
|
||||||
try {
|
try {
|
||||||
cacheKey = (AWTKeyStroke)ctor.newInstance((Object[]) null);
|
Class clazz = getAWTKeyStrokeClass();
|
||||||
|
cacheKey = (AWTKeyStroke)getCtor(clazz).newInstance((Object[]) null);
|
||||||
|
AppContext.getAppContext().put(APP_CONTEXT_KEYSTROKE_KEY, cacheKey);
|
||||||
} catch (InstantiationException e) {
|
} catch (InstantiationException e) {
|
||||||
assert(false);
|
assert(false);
|
||||||
} catch (IllegalAccessException e) {
|
} catch (IllegalAccessException e) {
|
||||||
@ -253,9 +279,8 @@ public class AWTKeyStroke implements Serializable {
|
|||||||
if (stroke == null) {
|
if (stroke == null) {
|
||||||
stroke = cacheKey;
|
stroke = cacheKey;
|
||||||
cache.put(stroke, stroke);
|
cache.put(stroke, stroke);
|
||||||
cacheKey = null;
|
AppContext.getAppContext().remove(APP_CONTEXT_KEYSTROKE_KEY);
|
||||||
}
|
}
|
||||||
|
|
||||||
return stroke;
|
return stroke;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -44,10 +44,9 @@ package java.io;
|
|||||||
*/
|
*/
|
||||||
public abstract class InputStream implements Closeable {
|
public abstract class InputStream implements Closeable {
|
||||||
|
|
||||||
// SKIP_BUFFER_SIZE is used to determine the size of skipBuffer
|
// MAX_SKIP_BUFFER_SIZE is used to determine the maximum buffer size to
|
||||||
private static final int SKIP_BUFFER_SIZE = 2048;
|
// use when skipping.
|
||||||
// skipBuffer is initialized in skip(long), if needed.
|
private static final int MAX_SKIP_BUFFER_SIZE = 2048;
|
||||||
private static byte[] skipBuffer;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reads the next byte of data from the input stream. The value byte is
|
* Reads the next byte of data from the input stream. The value byte is
|
||||||
@ -212,18 +211,15 @@ public abstract class InputStream implements Closeable {
|
|||||||
|
|
||||||
long remaining = n;
|
long remaining = n;
|
||||||
int nr;
|
int nr;
|
||||||
if (skipBuffer == null)
|
|
||||||
skipBuffer = new byte[SKIP_BUFFER_SIZE];
|
|
||||||
|
|
||||||
byte[] localSkipBuffer = skipBuffer;
|
|
||||||
|
|
||||||
if (n <= 0) {
|
if (n <= 0) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int size = (int)Math.min(MAX_SKIP_BUFFER_SIZE, remaining);
|
||||||
|
byte[] skipBuffer = new byte[size];
|
||||||
while (remaining > 0) {
|
while (remaining > 0) {
|
||||||
nr = read(localSkipBuffer, 0,
|
nr = read(skipBuffer, 0, (int)Math.min(size, remaining));
|
||||||
(int) Math.min(SKIP_BUFFER_SIZE, remaining));
|
|
||||||
if (nr < 0) {
|
if (nr < 0) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -347,6 +347,9 @@ class HttpsURLConnection extends HttpURLConnection
|
|||||||
* @param sf the SSL socket factory
|
* @param sf the SSL socket factory
|
||||||
* @throws IllegalArgumentException if the <code>SSLSocketFactory</code>
|
* @throws IllegalArgumentException if the <code>SSLSocketFactory</code>
|
||||||
* parameter is null.
|
* parameter is null.
|
||||||
|
* @throws SecurityException if a security manager exists and its
|
||||||
|
* <code>checkSetFactory</code> method does not allow
|
||||||
|
* a socket factory to be specified.
|
||||||
* @see #getSSLSocketFactory()
|
* @see #getSSLSocketFactory()
|
||||||
*/
|
*/
|
||||||
public void setSSLSocketFactory(SSLSocketFactory sf) {
|
public void setSSLSocketFactory(SSLSocketFactory sf) {
|
||||||
@ -355,6 +358,10 @@ class HttpsURLConnection extends HttpURLConnection
|
|||||||
"no SSLSocketFactory specified");
|
"no SSLSocketFactory specified");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SecurityManager sm = System.getSecurityManager();
|
||||||
|
if (sm != null) {
|
||||||
|
sm.checkSetFactory();
|
||||||
|
}
|
||||||
sslSocketFactory = sf;
|
sslSocketFactory = sf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -538,7 +538,7 @@ public abstract class SSLEngine {
|
|||||||
* If this <code>SSLEngine</code> has not yet started its initial
|
* If this <code>SSLEngine</code> has not yet started its initial
|
||||||
* handshake, this method will automatically start the handshake.
|
* handshake, this method will automatically start the handshake.
|
||||||
* <P>
|
* <P>
|
||||||
* This method will attempt to produce one SSL/TLS packet, and will
|
* This method will attempt to produce SSL/TLS records, and will
|
||||||
* consume as much source data as possible, but will never consume
|
* consume as much source data as possible, but will never consume
|
||||||
* more than the sum of the bytes remaining in each buffer. Each
|
* more than the sum of the bytes remaining in each buffer. Each
|
||||||
* <code>ByteBuffer</code>'s position is updated to reflect the
|
* <code>ByteBuffer</code>'s position is updated to reflect the
|
||||||
|
@ -41,13 +41,14 @@ public class ResourceManager {
|
|||||||
|
|
||||||
/* default maximum number of udp sockets per VM
|
/* default maximum number of udp sockets per VM
|
||||||
* when a security manager is enabled.
|
* when a security manager is enabled.
|
||||||
* The default is 1024 which is high enough to be useful
|
* The default is 25 which is high enough to be useful
|
||||||
* but low enough to be well below the maximum number
|
* but low enough to be well below the maximum number
|
||||||
* of port numbers actually available on all OSes for
|
* of port numbers actually available on all OSes
|
||||||
* such sockets (5000 on some versions of windows)
|
* when multiplied by the maximum feasible number of VM processes
|
||||||
|
* that could practically be spawned.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
private static final int DEFAULT_MAX_SOCKETS = 1024;
|
private static final int DEFAULT_MAX_SOCKETS = 25;
|
||||||
private static final int maxSockets;
|
private static final int maxSockets;
|
||||||
private static final AtomicInteger numSockets;
|
private static final AtomicInteger numSockets;
|
||||||
|
|
||||||
|
@ -38,13 +38,23 @@ import java.rmi.server.ServerNotActiveException;
|
|||||||
import java.rmi.registry.Registry;
|
import java.rmi.registry.Registry;
|
||||||
import java.rmi.server.RMIClientSocketFactory;
|
import java.rmi.server.RMIClientSocketFactory;
|
||||||
import java.rmi.server.RMIServerSocketFactory;
|
import java.rmi.server.RMIServerSocketFactory;
|
||||||
|
import java.security.AccessControlContext;
|
||||||
|
import java.security.AccessController;
|
||||||
|
import java.security.CodeSource;
|
||||||
|
import java.security.Policy;
|
||||||
import java.security.PrivilegedActionException;
|
import java.security.PrivilegedActionException;
|
||||||
|
import java.security.PrivilegedExceptionAction;
|
||||||
|
import java.security.PermissionCollection;
|
||||||
|
import java.security.Permissions;
|
||||||
|
import java.security.ProtectionDomain;
|
||||||
import java.text.MessageFormat;
|
import java.text.MessageFormat;
|
||||||
|
import sun.rmi.server.LoaderHandler;
|
||||||
import sun.rmi.server.UnicastServerRef;
|
import sun.rmi.server.UnicastServerRef;
|
||||||
import sun.rmi.server.UnicastServerRef2;
|
import sun.rmi.server.UnicastServerRef2;
|
||||||
import sun.rmi.transport.LiveRef;
|
import sun.rmi.transport.LiveRef;
|
||||||
import sun.rmi.transport.ObjectTable;
|
import sun.rmi.transport.ObjectTable;
|
||||||
import sun.rmi.transport.Target;
|
import sun.rmi.transport.Target;
|
||||||
|
import sun.security.action.GetPropertyAction;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A "registry" exists on every node that allows RMI connections to
|
* A "registry" exists on every node that allows RMI connections to
|
||||||
@ -325,6 +335,19 @@ public class RegistryImpl extends java.rmi.server.RemoteServer
|
|||||||
URL[] urls = sun.misc.URLClassPath.pathToURLs(envcp);
|
URL[] urls = sun.misc.URLClassPath.pathToURLs(envcp);
|
||||||
ClassLoader cl = new URLClassLoader(urls);
|
ClassLoader cl = new URLClassLoader(urls);
|
||||||
|
|
||||||
|
String codebaseProperty = null;
|
||||||
|
String prop = java.security.AccessController.doPrivileged(
|
||||||
|
new GetPropertyAction("java.rmi.server.codebase"));
|
||||||
|
if (prop != null && prop.trim().length() > 0) {
|
||||||
|
codebaseProperty = prop;
|
||||||
|
}
|
||||||
|
URL[] codebaseURLs = null;
|
||||||
|
if (codebaseProperty != null) {
|
||||||
|
codebaseURLs = sun.misc.URLClassPath.pathToURLs(codebaseProperty);
|
||||||
|
} else {
|
||||||
|
codebaseURLs = new URL[0];
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Fix bugid 4242317: Classes defined by this class loader should
|
* Fix bugid 4242317: Classes defined by this class loader should
|
||||||
* be annotated with the value of the "java.rmi.server.codebase"
|
* be annotated with the value of the "java.rmi.server.codebase"
|
||||||
@ -334,11 +357,19 @@ public class RegistryImpl extends java.rmi.server.RemoteServer
|
|||||||
|
|
||||||
Thread.currentThread().setContextClassLoader(cl);
|
Thread.currentThread().setContextClassLoader(cl);
|
||||||
|
|
||||||
int regPort = Registry.REGISTRY_PORT;
|
final int regPort = (args.length >= 1) ? Integer.parseInt(args[0])
|
||||||
if (args.length >= 1) {
|
: Registry.REGISTRY_PORT;
|
||||||
regPort = Integer.parseInt(args[0]);
|
try {
|
||||||
|
registry = AccessController.doPrivileged(
|
||||||
|
new PrivilegedExceptionAction<RegistryImpl>() {
|
||||||
|
public RegistryImpl run() throws RemoteException {
|
||||||
|
return new RegistryImpl(regPort);
|
||||||
|
}
|
||||||
|
}, getAccessControlContext(codebaseURLs));
|
||||||
|
} catch (PrivilegedActionException ex) {
|
||||||
|
throw (RemoteException) ex.getException();
|
||||||
}
|
}
|
||||||
registry = new RegistryImpl(regPort);
|
|
||||||
// prevent registry from exiting
|
// prevent registry from exiting
|
||||||
while (true) {
|
while (true) {
|
||||||
try {
|
try {
|
||||||
@ -358,4 +389,48 @@ public class RegistryImpl extends java.rmi.server.RemoteServer
|
|||||||
}
|
}
|
||||||
System.exit(1);
|
System.exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generates an AccessControlContext from several URLs.
|
||||||
|
* The approach used here is taken from the similar method
|
||||||
|
* getAccessControlContext() in the sun.applet.AppletPanel class.
|
||||||
|
*/
|
||||||
|
private static AccessControlContext getAccessControlContext(URL[] urls) {
|
||||||
|
// begin with permissions granted to all code in current policy
|
||||||
|
PermissionCollection perms = AccessController.doPrivileged(
|
||||||
|
new java.security.PrivilegedAction<PermissionCollection>() {
|
||||||
|
public PermissionCollection run() {
|
||||||
|
CodeSource codesource = new CodeSource(null,
|
||||||
|
(java.security.cert.Certificate[]) null);
|
||||||
|
Policy p = java.security.Policy.getPolicy();
|
||||||
|
if (p != null) {
|
||||||
|
return p.getPermissions(codesource);
|
||||||
|
} else {
|
||||||
|
return new Permissions();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Anyone can connect to the registry and the registry can connect
|
||||||
|
* to and possibly download stubs from anywhere. Downloaded stubs and
|
||||||
|
* related classes themselves are more tightly limited by RMI.
|
||||||
|
*/
|
||||||
|
perms.add(new SocketPermission("*", "connect,accept"));
|
||||||
|
|
||||||
|
perms.add(new RuntimePermission("accessClassInPackage.sun.*"));
|
||||||
|
|
||||||
|
// add permissions required to load from codebase URL path
|
||||||
|
LoaderHandler.addPermissionsForURLs(urls, perms, false);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Create an AccessControlContext that consists of a single
|
||||||
|
* protection domain with only the permissions calculated above.
|
||||||
|
*/
|
||||||
|
ProtectionDomain pd = new ProtectionDomain(
|
||||||
|
new CodeSource((urls.length > 0 ? urls[0] : null),
|
||||||
|
(java.security.cert.Certificate[]) null),
|
||||||
|
perms);
|
||||||
|
return new AccessControlContext(new ProtectionDomain[] { pd });
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1031,9 +1031,9 @@ public final class LoaderHandler {
|
|||||||
* loader. A given permission is only added to the collection if
|
* loader. A given permission is only added to the collection if
|
||||||
* it is not already implied by the collection.
|
* it is not already implied by the collection.
|
||||||
*/
|
*/
|
||||||
private static void addPermissionsForURLs(URL[] urls,
|
public static void addPermissionsForURLs(URL[] urls,
|
||||||
PermissionCollection perms,
|
PermissionCollection perms,
|
||||||
boolean forLoader)
|
boolean forLoader)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < urls.length; i++) {
|
for (int i = 0; i < urls.length; i++) {
|
||||||
URL url = urls[i];
|
URL url = urls[i];
|
||||||
|
@ -390,6 +390,12 @@ public class UnicastServerRef extends UnicastRef
|
|||||||
ObjectInput in;
|
ObjectInput in;
|
||||||
try {
|
try {
|
||||||
in = call.getInputStream();
|
in = call.getInputStream();
|
||||||
|
try {
|
||||||
|
Class<?> clazz = Class.forName("sun.rmi.transport.DGCImpl_Skel");
|
||||||
|
if (clazz.isAssignableFrom(skel.getClass())) {
|
||||||
|
((MarshalInputStream)in).useCodebaseOnly();
|
||||||
|
}
|
||||||
|
} catch (ClassNotFoundException ignore) { }
|
||||||
hash = in.readLong();
|
hash = in.readLong();
|
||||||
} catch (Exception readEx) {
|
} catch (Exception readEx) {
|
||||||
throw new UnmarshalException("error unmarshalling call header",
|
throw new UnmarshalException("error unmarshalling call header",
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1996, 2009, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -69,12 +69,38 @@ class AppOutputStream extends OutputStream {
|
|||||||
// check if the Socket is invalid (error or closed)
|
// check if the Socket is invalid (error or closed)
|
||||||
c.checkWrite();
|
c.checkWrite();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* By default, we counter chosen plaintext issues on CBC mode
|
||||||
|
* ciphersuites in SSLv3/TLS1.0 by sending one byte of application
|
||||||
|
* data in the first record of every payload, and the rest in
|
||||||
|
* subsequent record(s). Note that the issues have been solved in
|
||||||
|
* TLS 1.1 or later.
|
||||||
|
*
|
||||||
|
* It is not necessary to split the very first application record of
|
||||||
|
* a freshly negotiated TLS session, as there is no previous
|
||||||
|
* application data to guess. To improve compatibility, we will not
|
||||||
|
* split such records.
|
||||||
|
*
|
||||||
|
* This avoids issues in the outbound direction. For a full fix,
|
||||||
|
* the peer must have similar protections.
|
||||||
|
*/
|
||||||
|
boolean isFirstRecordOfThePayload = true;
|
||||||
|
|
||||||
// Always flush at the end of each application level record.
|
// Always flush at the end of each application level record.
|
||||||
// This lets application synchronize read and write streams
|
// This lets application synchronize read and write streams
|
||||||
// however they like; if we buffered here, they couldn't.
|
// however they like; if we buffered here, they couldn't.
|
||||||
try {
|
try {
|
||||||
do {
|
do {
|
||||||
int howmuch = Math.min(len, r.availableDataBytes());
|
int howmuch;
|
||||||
|
if (isFirstRecordOfThePayload && c.needToSplitPayload()) {
|
||||||
|
howmuch = Math.min(0x01, r.availableDataBytes());
|
||||||
|
} else {
|
||||||
|
howmuch = Math.min(len, r.availableDataBytes());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isFirstRecordOfThePayload && howmuch != 0) {
|
||||||
|
isFirstRecordOfThePayload = false;
|
||||||
|
}
|
||||||
|
|
||||||
// NOTE: *must* call c.writeRecord() even for howmuch == 0
|
// NOTE: *must* call c.writeRecord() even for howmuch == 0
|
||||||
if (howmuch > 0) {
|
if (howmuch > 0) {
|
||||||
|
@ -112,6 +112,11 @@ final class CipherBox {
|
|||||||
*/
|
*/
|
||||||
private SecureRandom random;
|
private SecureRandom random;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Is the cipher of CBC mode?
|
||||||
|
*/
|
||||||
|
private final boolean isCBCMode;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fixed masks of various block size, as the initial decryption IVs
|
* Fixed masks of various block size, as the initial decryption IVs
|
||||||
* for TLS 1.1 or later.
|
* for TLS 1.1 or later.
|
||||||
@ -128,6 +133,7 @@ final class CipherBox {
|
|||||||
private CipherBox() {
|
private CipherBox() {
|
||||||
this.protocolVersion = ProtocolVersion.DEFAULT;
|
this.protocolVersion = ProtocolVersion.DEFAULT;
|
||||||
this.cipher = null;
|
this.cipher = null;
|
||||||
|
this.isCBCMode = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -148,6 +154,7 @@ final class CipherBox {
|
|||||||
random = JsseJce.getSecureRandom();
|
random = JsseJce.getSecureRandom();
|
||||||
}
|
}
|
||||||
this.random = random;
|
this.random = random;
|
||||||
|
this.isCBCMode = bulkCipher.isCBCMode;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* RFC 4346 recommends two algorithms used to generated the
|
* RFC 4346 recommends two algorithms used to generated the
|
||||||
@ -694,4 +701,12 @@ final class CipherBox {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Does the cipher use CBC mode?
|
||||||
|
*
|
||||||
|
* @return true if the cipher use CBC mode, false otherwise.
|
||||||
|
*/
|
||||||
|
boolean isCBCMode() {
|
||||||
|
return isCBCMode;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -420,10 +420,16 @@ final class CipherSuite implements Comparable<CipherSuite> {
|
|||||||
// exportable under 512/40 bit rules
|
// exportable under 512/40 bit rules
|
||||||
final boolean exportable;
|
final boolean exportable;
|
||||||
|
|
||||||
|
// Is the cipher algorithm of Cipher Block Chaining (CBC) mode?
|
||||||
|
final boolean isCBCMode;
|
||||||
|
|
||||||
BulkCipher(String transformation, int keySize,
|
BulkCipher(String transformation, int keySize,
|
||||||
int expandedKeySize, int ivSize, boolean allowed) {
|
int expandedKeySize, int ivSize, boolean allowed) {
|
||||||
this.transformation = transformation;
|
this.transformation = transformation;
|
||||||
this.algorithm = transformation.split("/")[0];
|
String[] splits = transformation.split("/");
|
||||||
|
this.algorithm = splits[0];
|
||||||
|
this.isCBCMode =
|
||||||
|
splits.length <= 1 ? false : "CBC".equalsIgnoreCase(splits[1]);
|
||||||
this.description = this.algorithm + "/" + (keySize << 3);
|
this.description = this.algorithm + "/" + (keySize << 3);
|
||||||
this.keySize = keySize;
|
this.keySize = keySize;
|
||||||
this.ivSize = ivSize;
|
this.ivSize = ivSize;
|
||||||
@ -436,7 +442,10 @@ final class CipherSuite implements Comparable<CipherSuite> {
|
|||||||
BulkCipher(String transformation, int keySize,
|
BulkCipher(String transformation, int keySize,
|
||||||
int ivSize, boolean allowed) {
|
int ivSize, boolean allowed) {
|
||||||
this.transformation = transformation;
|
this.transformation = transformation;
|
||||||
this.algorithm = transformation.split("/")[0];
|
String[] splits = transformation.split("/");
|
||||||
|
this.algorithm = splits[0];
|
||||||
|
this.isCBCMode =
|
||||||
|
splits.length <= 1 ? false : "CBC".equalsIgnoreCase(splits[1]);
|
||||||
this.description = this.algorithm + "/" + (keySize << 3);
|
this.description = this.algorithm + "/" + (keySize << 3);
|
||||||
this.keySize = keySize;
|
this.keySize = keySize;
|
||||||
this.ivSize = ivSize;
|
this.ivSize = ivSize;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2003, 2007, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -46,6 +46,7 @@ import sun.misc.HexDumpEncoder;
|
|||||||
*/
|
*/
|
||||||
final class EngineOutputRecord extends OutputRecord {
|
final class EngineOutputRecord extends OutputRecord {
|
||||||
|
|
||||||
|
private SSLEngineImpl engine;
|
||||||
private EngineWriter writer;
|
private EngineWriter writer;
|
||||||
|
|
||||||
private boolean finishedMsg = false;
|
private boolean finishedMsg = false;
|
||||||
@ -62,6 +63,7 @@ final class EngineOutputRecord extends OutputRecord {
|
|||||||
*/
|
*/
|
||||||
EngineOutputRecord(byte type, SSLEngineImpl engine) {
|
EngineOutputRecord(byte type, SSLEngineImpl engine) {
|
||||||
super(type, recordSize(type));
|
super(type, recordSize(type));
|
||||||
|
this.engine = engine;
|
||||||
writer = engine.writer;
|
writer = engine.writer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -227,11 +229,50 @@ final class EngineOutputRecord extends OutputRecord {
|
|||||||
* implementations are fragile and don't like to see empty
|
* implementations are fragile and don't like to see empty
|
||||||
* records, so this increases robustness.
|
* records, so this increases robustness.
|
||||||
*/
|
*/
|
||||||
int length = Math.min(ea.getAppRemaining(), maxDataSize);
|
if (ea.getAppRemaining() == 0) {
|
||||||
if (length == 0) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* By default, we counter chosen plaintext issues on CBC mode
|
||||||
|
* ciphersuites in SSLv3/TLS1.0 by sending one byte of application
|
||||||
|
* data in the first record of every payload, and the rest in
|
||||||
|
* subsequent record(s). Note that the issues have been solved in
|
||||||
|
* TLS 1.1 or later.
|
||||||
|
*
|
||||||
|
* It is not necessary to split the very first application record of
|
||||||
|
* a freshly negotiated TLS session, as there is no previous
|
||||||
|
* application data to guess. To improve compatibility, we will not
|
||||||
|
* split such records.
|
||||||
|
*
|
||||||
|
* Because of the compatibility, we'd better produce no more than
|
||||||
|
* SSLSession.getPacketBufferSize() net data for each wrap. As we
|
||||||
|
* need a one-byte record at first, the 2nd record size should be
|
||||||
|
* equal to or less than Record.maxDataSizeMinusOneByteRecord.
|
||||||
|
*
|
||||||
|
* This avoids issues in the outbound direction. For a full fix,
|
||||||
|
* the peer must have similar protections.
|
||||||
|
*/
|
||||||
|
int length;
|
||||||
|
if (engine.needToSplitPayload(writeCipher, protocolVersion)) {
|
||||||
|
write(ea, writeMAC, writeCipher, 0x01);
|
||||||
|
ea.resetLim(); // reset application data buffer limit
|
||||||
|
length = Math.min(ea.getAppRemaining(),
|
||||||
|
maxDataSizeMinusOneByteRecord);
|
||||||
|
} else {
|
||||||
|
length = Math.min(ea.getAppRemaining(), maxDataSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Don't bother to really write empty records.
|
||||||
|
if (length > 0) {
|
||||||
|
write(ea, writeMAC, writeCipher, length);
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
void write(EngineArgs ea, MAC writeMAC, CipherBox writeCipher,
|
||||||
|
int length) throws IOException {
|
||||||
/*
|
/*
|
||||||
* Copy out existing buffer values.
|
* Copy out existing buffer values.
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1996, 2010, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -67,6 +67,23 @@ interface Record {
|
|||||||
+ maxPadding // padding
|
+ maxPadding // padding
|
||||||
+ trailerSize; // MAC
|
+ trailerSize; // MAC
|
||||||
|
|
||||||
|
static final boolean enableCBCProtection =
|
||||||
|
Debug.getBooleanProperty("jsse.enableCBCProtection", true);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For CBC protection in SSL3/TLS1, we break some plaintext into two
|
||||||
|
* packets. Max application data size for the second packet.
|
||||||
|
*/
|
||||||
|
static final int maxDataSizeMinusOneByteRecord =
|
||||||
|
maxDataSize // max data size
|
||||||
|
- ( // max one byte record size
|
||||||
|
headerSize // header
|
||||||
|
+ maxIVLength // iv
|
||||||
|
+ 1 // one byte data
|
||||||
|
+ maxPadding // padding
|
||||||
|
+ trailerSize // MAC
|
||||||
|
);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The maximum large record size.
|
* The maximum large record size.
|
||||||
*
|
*
|
||||||
|
@ -308,6 +308,11 @@ final public class SSLEngineImpl extends SSLEngine {
|
|||||||
private Object unwrapLock;
|
private Object unwrapLock;
|
||||||
Object writeLock;
|
Object writeLock;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Is it the first application record to write?
|
||||||
|
*/
|
||||||
|
private boolean isFirstAppOutputRecord = true;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Class and subclass dynamic debugging support
|
* Class and subclass dynamic debugging support
|
||||||
*/
|
*/
|
||||||
@ -612,6 +617,9 @@ final public class SSLEngineImpl extends SSLEngine {
|
|||||||
|
|
||||||
// See comment above.
|
// See comment above.
|
||||||
oldCipher.dispose();
|
oldCipher.dispose();
|
||||||
|
|
||||||
|
// reset the flag of the first application record
|
||||||
|
isFirstAppOutputRecord = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1286,9 +1294,35 @@ final public class SSLEngineImpl extends SSLEngine {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* turn off the flag of the first application record if we really
|
||||||
|
* consumed at least byte.
|
||||||
|
*/
|
||||||
|
if (isFirstAppOutputRecord && ea.deltaApp() > 0) {
|
||||||
|
isFirstAppOutputRecord = false;
|
||||||
|
}
|
||||||
|
|
||||||
return hsStatus;
|
return hsStatus;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Need to split the payload except the following cases:
|
||||||
|
*
|
||||||
|
* 1. protocol version is TLS 1.1 or later;
|
||||||
|
* 2. bulk cipher does not use CBC mode, including null bulk cipher suites.
|
||||||
|
* 3. the payload is the first application record of a freshly
|
||||||
|
* negotiated TLS session.
|
||||||
|
* 4. the CBC protection is disabled;
|
||||||
|
*
|
||||||
|
* More details, please refer to
|
||||||
|
* EngineOutputRecord.write(EngineArgs, MAC, CipherBox).
|
||||||
|
*/
|
||||||
|
boolean needToSplitPayload(CipherBox cipher, ProtocolVersion protocol) {
|
||||||
|
return (protocol.v <= ProtocolVersion.TLS10.v) &&
|
||||||
|
cipher.isCBCMode() && !isFirstAppOutputRecord &&
|
||||||
|
Record.enableCBCProtection;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Non-application OutputRecords go through here.
|
* Non-application OutputRecords go through here.
|
||||||
*/
|
*/
|
||||||
|
@ -369,6 +369,11 @@ final public class SSLSocketImpl extends BaseSSLSocketImpl {
|
|||||||
/* Class and subclass dynamic debugging support */
|
/* Class and subclass dynamic debugging support */
|
||||||
private static final Debug debug = Debug.getInstance("ssl");
|
private static final Debug debug = Debug.getInstance("ssl");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Is it the first application record to write?
|
||||||
|
*/
|
||||||
|
private boolean isFirstAppOutputRecord = true;
|
||||||
|
|
||||||
//
|
//
|
||||||
// CONSTRUCTORS AND INITIALIZATION CODE
|
// CONSTRUCTORS AND INITIALIZATION CODE
|
||||||
//
|
//
|
||||||
@ -802,8 +807,35 @@ final public class SSLSocketImpl extends BaseSSLSocketImpl {
|
|||||||
if (connectionState < cs_ERROR) {
|
if (connectionState < cs_ERROR) {
|
||||||
checkSequenceNumber(writeMAC, r.contentType());
|
checkSequenceNumber(writeMAC, r.contentType());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// turn off the flag of the first application record
|
||||||
|
if (isFirstAppOutputRecord &&
|
||||||
|
r.contentType() == Record.ct_application_data) {
|
||||||
|
isFirstAppOutputRecord = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Need to split the payload except the following cases:
|
||||||
|
*
|
||||||
|
* 1. protocol version is TLS 1.1 or later;
|
||||||
|
* 2. bulk cipher does not use CBC mode, including null bulk cipher suites.
|
||||||
|
* 3. the payload is the first application record of a freshly
|
||||||
|
* negotiated TLS session.
|
||||||
|
* 4. the CBC protection is disabled;
|
||||||
|
*
|
||||||
|
* More details, please refer to AppOutputStream.write(byte[], int, int).
|
||||||
|
*/
|
||||||
|
boolean needToSplitPayload() {
|
||||||
|
writeLock.lock();
|
||||||
|
try {
|
||||||
|
return (protocolVersion.v <= ProtocolVersion.TLS10.v) &&
|
||||||
|
writeCipher.isCBCMode() && !isFirstAppOutputRecord &&
|
||||||
|
Record.enableCBCProtection;
|
||||||
|
} finally {
|
||||||
|
writeLock.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Read an application data record. Alerts and handshake
|
* Read an application data record. Alerts and handshake
|
||||||
@ -2030,6 +2062,9 @@ final public class SSLSocketImpl extends BaseSSLSocketImpl {
|
|||||||
|
|
||||||
// See comment above.
|
// See comment above.
|
||||||
oldCipher.dispose();
|
oldCipher.dispose();
|
||||||
|
|
||||||
|
// reset the flag of the first application record
|
||||||
|
isFirstAppOutputRecord = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1112,11 +1112,14 @@ void unpacker::read_Utf8_values(entry* cpMap, int len) {
|
|||||||
uint size3 = suffix * 3;
|
uint size3 = suffix * 3;
|
||||||
if (suffix == 0) continue; // done with empty string
|
if (suffix == 0) continue; // done with empty string
|
||||||
chars.malloc(size3);
|
chars.malloc(size3);
|
||||||
|
CHECK;
|
||||||
byte* chp = chars.ptr;
|
byte* chp = chars.ptr;
|
||||||
band saved_band = cp_Utf8_big_chars;
|
band saved_band = cp_Utf8_big_chars;
|
||||||
cp_Utf8_big_chars.readData(suffix);
|
cp_Utf8_big_chars.readData(suffix);
|
||||||
|
CHECK;
|
||||||
for (int j = 0; j < suffix; j++) {
|
for (int j = 0; j < suffix; j++) {
|
||||||
unsigned short ch = cp_Utf8_big_chars.getInt();
|
unsigned short ch = cp_Utf8_big_chars.getInt();
|
||||||
|
CHECK;
|
||||||
chp = store_Utf8_char(chp, ch);
|
chp = store_Utf8_char(chp, ch);
|
||||||
}
|
}
|
||||||
chars.realloc(chp - chars.ptr);
|
chars.realloc(chp - chars.ptr);
|
||||||
@ -1134,10 +1137,12 @@ void unpacker::read_Utf8_values(entry* cpMap, int len) {
|
|||||||
CHECK;
|
CHECK;
|
||||||
int prevlen = 0; // previous string length (in chars)
|
int prevlen = 0; // previous string length (in chars)
|
||||||
tmallocs.add(bigbuf.ptr); // free after this block
|
tmallocs.add(bigbuf.ptr); // free after this block
|
||||||
|
CHECK;
|
||||||
cp_Utf8_prefix.rewind();
|
cp_Utf8_prefix.rewind();
|
||||||
for (i = 0; i < len; i++) {
|
for (i = 0; i < len; i++) {
|
||||||
bytes& chars = allsuffixes[i];
|
bytes& chars = allsuffixes[i];
|
||||||
int prefix = (i < PREFIX_SKIP_2)? 0: cp_Utf8_prefix.getInt();
|
int prefix = (i < PREFIX_SKIP_2)? 0: cp_Utf8_prefix.getInt();
|
||||||
|
CHECK;
|
||||||
int suffix = (int)chars.len;
|
int suffix = (int)chars.len;
|
||||||
byte* fillp;
|
byte* fillp;
|
||||||
// by induction, the buffer is already filled with the prefix
|
// by induction, the buffer is already filled with the prefix
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001, 2008, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -52,7 +52,7 @@ void* must_malloc(size_t size) {
|
|||||||
if (msize >= 0 && msize < sizeof(int))
|
if (msize >= 0 && msize < sizeof(int))
|
||||||
msize = sizeof(int); // see 0xbaadf00d below
|
msize = sizeof(int); // see 0xbaadf00d below
|
||||||
#endif
|
#endif
|
||||||
void* ptr = (msize > PSIZE_MAX) ? null : malloc(msize);
|
void* ptr = (msize > PSIZE_MAX || msize <= 0) ? null : malloc(msize);
|
||||||
if (ptr != null) {
|
if (ptr != null) {
|
||||||
memset(ptr, 0, size);
|
memset(ptr, 0, size);
|
||||||
} else {
|
} else {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001, 2008, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -33,7 +33,7 @@ void mtrace(char c, void* ptr, size_t size);
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// overflow management
|
// overflow management
|
||||||
#define OVERFLOW ((size_t)-1)
|
#define OVERFLOW ((uint)-1)
|
||||||
#define PSIZE_MAX (OVERFLOW/2) /* normal size limit */
|
#define PSIZE_MAX (OVERFLOW/2) /* normal size limit */
|
||||||
|
|
||||||
inline size_t scale_size(size_t size, size_t scale) {
|
inline size_t scale_size(size_t size, size_t scale) {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -284,7 +284,7 @@ Java_sun_java2d_loops_TransformHelper_Transform
|
|||||||
TransformHelperFunc *pHelperFunc;
|
TransformHelperFunc *pHelperFunc;
|
||||||
TransformInterpFunc *pInterpFunc;
|
TransformInterpFunc *pInterpFunc;
|
||||||
jdouble xorig, yorig;
|
jdouble xorig, yorig;
|
||||||
jint numedges;
|
jlong numedges;
|
||||||
jint *pEdges;
|
jint *pEdges;
|
||||||
jint edgebuf[2 + MAXEDGES * 2];
|
jint edgebuf[2 + MAXEDGES * 2];
|
||||||
union {
|
union {
|
||||||
@ -379,19 +379,44 @@ Java_sun_java2d_loops_TransformHelper_Transform
|
|||||||
}
|
}
|
||||||
Region_IntersectBounds(&clipInfo, &dstInfo.bounds);
|
Region_IntersectBounds(&clipInfo, &dstInfo.bounds);
|
||||||
|
|
||||||
numedges = (dstInfo.bounds.y2 - dstInfo.bounds.y1);
|
numedges = (((jlong) dstInfo.bounds.y2) - ((jlong) dstInfo.bounds.y1));
|
||||||
if (numedges > MAXEDGES) {
|
if (numedges <= 0) {
|
||||||
pEdges = malloc((2 + 2 * numedges) * sizeof (*pEdges));
|
pEdges = NULL;
|
||||||
if (pEdges == NULL) {
|
} else if (!JNU_IsNull(env, edgeArray)) {
|
||||||
SurfaceData_InvokeUnlock(env, dstOps, &dstInfo);
|
/*
|
||||||
SurfaceData_InvokeUnlock(env, srcOps, &srcInfo);
|
* Ideally Java should allocate an array large enough, but if
|
||||||
/* edgeArray should already contain zeros for min/maxy */
|
* we ever have a miscommunication about the number of edge
|
||||||
return;
|
* lines, or if the Java array calculation should overflow to
|
||||||
}
|
* a positive number and succeed in allocating an array that
|
||||||
|
* is too small, we need to verify that it can still hold the
|
||||||
|
* number of integers that we plan to store to be safe.
|
||||||
|
*/
|
||||||
|
jsize edgesize = (*env)->GetArrayLength(env, edgeArray);
|
||||||
|
/* (edgesize/2 - 1) should avoid any overflow or underflow. */
|
||||||
|
pEdges = (((edgesize / 2) - 1) >= numedges)
|
||||||
|
? (*env)->GetPrimitiveArrayCritical(env, edgeArray, NULL)
|
||||||
|
: NULL;
|
||||||
|
} else if (numedges > MAXEDGES) {
|
||||||
|
/* numedges variable (jlong) can be at most ((1<<32)-1) */
|
||||||
|
/* memsize can overflow a jint, but not a jlong */
|
||||||
|
jlong memsize = ((numedges * 2) + 2) * sizeof(*pEdges);
|
||||||
|
pEdges = (memsize == ((size_t) memsize))
|
||||||
|
? malloc((size_t) memsize)
|
||||||
|
: NULL;
|
||||||
} else {
|
} else {
|
||||||
pEdges = edgebuf;
|
pEdges = edgebuf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pEdges == NULL) {
|
||||||
|
if (numedges > 0) {
|
||||||
|
JNU_ThrowInternalError(env, "Unable to allocate edge list");
|
||||||
|
}
|
||||||
|
SurfaceData_InvokeUnlock(env, dstOps, &dstInfo);
|
||||||
|
SurfaceData_InvokeUnlock(env, srcOps, &srcInfo);
|
||||||
|
/* edgeArray should already contain zeros for min/maxy */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Transform_GetInfo(env, itxform, &itxInfo);
|
Transform_GetInfo(env, itxform, &itxInfo);
|
||||||
|
|
||||||
if (!Region_IsEmpty(&clipInfo)) {
|
if (!Region_IsEmpty(&clipInfo)) {
|
||||||
@ -500,14 +525,14 @@ Java_sun_java2d_loops_TransformHelper_Transform
|
|||||||
} else {
|
} else {
|
||||||
pEdges[0] = pEdges[1] = 0;
|
pEdges[0] = pEdges[1] = 0;
|
||||||
}
|
}
|
||||||
SurfaceData_InvokeUnlock(env, dstOps, &dstInfo);
|
|
||||||
SurfaceData_InvokeUnlock(env, srcOps, &srcInfo);
|
|
||||||
if (!JNU_IsNull(env, edgeArray)) {
|
if (!JNU_IsNull(env, edgeArray)) {
|
||||||
(*env)->SetIntArrayRegion(env, edgeArray, 0, 2+numedges*2, pEdges);
|
(*env)->ReleasePrimitiveArrayCritical(env, edgeArray, pEdges, 0);
|
||||||
}
|
} else if (pEdges != edgebuf) {
|
||||||
if (pEdges != edgebuf) {
|
|
||||||
free(pEdges);
|
free(pEdges);
|
||||||
}
|
}
|
||||||
|
SurfaceData_InvokeUnlock(env, dstOps, &dstInfo);
|
||||||
|
SurfaceData_InvokeUnlock(env, srcOps, &srcInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -60,10 +60,11 @@ final class ProcessImpl extends Process {
|
|||||||
throws IOException
|
throws IOException
|
||||||
{
|
{
|
||||||
if (append) {
|
if (append) {
|
||||||
|
String path = f.getPath();
|
||||||
SecurityManager sm = System.getSecurityManager();
|
SecurityManager sm = System.getSecurityManager();
|
||||||
if (sm != null)
|
if (sm != null)
|
||||||
sm.checkWrite(f.getPath());
|
sm.checkWrite(path);
|
||||||
long handle = openForAtomicAppend(f.getPath());
|
long handle = openForAtomicAppend(path);
|
||||||
final FileDescriptor fd = new FileDescriptor();
|
final FileDescriptor fd = new FileDescriptor();
|
||||||
fdAccess.setHandle(fd, handle);
|
fdAccess.setHandle(fd, handle);
|
||||||
return AccessController.doPrivileged(
|
return AccessController.doPrivileged(
|
||||||
|
@ -355,7 +355,7 @@ void AwtWindow::RepositionSecurityWarning(JNIEnv *env)
|
|||||||
RECT rect;
|
RECT rect;
|
||||||
CalculateWarningWindowBounds(env, &rect);
|
CalculateWarningWindowBounds(env, &rect);
|
||||||
|
|
||||||
::SetWindowPos(warningWindow, IsAlwaysOnTop() ? HWND_TOPMOST : GetHWnd(),
|
::SetWindowPos(warningWindow, IsAlwaysOnTop() ? HWND_TOPMOST : HWND_NOTOPMOST,
|
||||||
rect.left, rect.top,
|
rect.left, rect.top,
|
||||||
rect.right - rect.left, rect.bottom - rect.top,
|
rect.right - rect.left, rect.bottom - rect.top,
|
||||||
SWP_ASYNCWINDOWPOS | SWP_NOACTIVATE |
|
SWP_ASYNCWINDOWPOS | SWP_NOACTIVATE |
|
||||||
@ -835,7 +835,7 @@ void AwtWindow::StartSecurityAnimation(AnimationKind kind)
|
|||||||
|
|
||||||
if (securityAnimationKind == akShow) {
|
if (securityAnimationKind == akShow) {
|
||||||
::SetWindowPos(warningWindow,
|
::SetWindowPos(warningWindow,
|
||||||
IsAlwaysOnTop() ? HWND_TOPMOST : GetHWnd(),
|
IsAlwaysOnTop() ? HWND_TOPMOST : HWND_NOTOPMOST,
|
||||||
0, 0, 0, 0,
|
0, 0, 0, 0,
|
||||||
SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE |
|
SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE |
|
||||||
SWP_SHOWWINDOW | SWP_NOOWNERZORDER);
|
SWP_SHOWWINDOW | SWP_NOOWNERZORDER);
|
||||||
|
@ -1,10 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* @test
|
* @test
|
||||||
* @build TestThread Traffic Handler ServerHandler ServerThread ClientThread
|
* @build TestThread Traffic Handler ServerHandler ServerThread ClientThread
|
||||||
* @run main/othervm/timeout=140 main
|
* @run main/othervm/timeout=140 -Djsse.enableCBCProtection=false main
|
||||||
*
|
|
||||||
* SunJSSE does not support dynamic system properties, no way to re-use
|
|
||||||
* system properties in samevm/agentvm mode.
|
|
||||||
* @summary Make sure that different configurations of SSL sockets work
|
* @summary Make sure that different configurations of SSL sockets work
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -29,6 +29,8 @@
|
|||||||
* This is a simple hack to test a bunch of conditions and check
|
* This is a simple hack to test a bunch of conditions and check
|
||||||
* their return codes.
|
* their return codes.
|
||||||
*
|
*
|
||||||
|
* @run main/othervm -Djsse.enableCBCProtection=false CheckStatus
|
||||||
|
*
|
||||||
* @author Brad Wetmore
|
* @author Brad Wetmore
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2004, 2006, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -30,6 +30,8 @@
|
|||||||
* This is to test larger buffer arrays, and make sure the maximum
|
* This is to test larger buffer arrays, and make sure the maximum
|
||||||
* is being passed.
|
* is being passed.
|
||||||
*
|
*
|
||||||
|
* @run main/othervm -Djsse.enableCBCProtection=false LargeBufs
|
||||||
|
*
|
||||||
* @author Brad R. Wetmore
|
* @author Brad R. Wetmore
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -27,10 +27,7 @@
|
|||||||
* @bug 6388456
|
* @bug 6388456
|
||||||
* @summary Need adjustable TLS max record size for interoperability
|
* @summary Need adjustable TLS max record size for interoperability
|
||||||
* with non-compliant
|
* with non-compliant
|
||||||
* @run main/othervm LargePacket
|
* @run main/othervm -Djsse.enableCBCProtection=false LargePacket
|
||||||
*
|
|
||||||
* SunJSSE does not support dynamic system properties, no way to re-use
|
|
||||||
* system properties in samevm/agentvm mode.
|
|
||||||
*
|
*
|
||||||
* @author Xuelei Fan
|
* @author Xuelei Fan
|
||||||
*/
|
*/
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
# @test
|
# @test
|
||||||
# @bug 4990825
|
# @bug 4990825 7092186
|
||||||
# @run shell/timeout=90 jstatdExternalRegistry.sh
|
# @run shell/timeout=90 jstatdExternalRegistry.sh
|
||||||
# @summary Test functionality of 'jstatd -p<port>&' with an external RMI registry
|
# @summary Test functionality of 'jstatd -p<port>&' with an external RMI registry
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user