Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_jdk
提交
e06c9d77
D
dragonwell8_jdk
项目概览
openanolis
/
dragonwell8_jdk
通知
4
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
dragonwell8_jdk
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
e06c9d77
编写于
2月 25, 2013
作者:
E
ewendeli
浏览文件
操作
浏览文件
下载
差异文件
Merge
上级
4b661ae5
98c5c8c7
变更
106
展开全部
隐藏空白更改
内联
并排
Showing
106 changed file
with
3660 addition
and
1146 deletion
+3660
-1146
src/share/bin/jli_util.h
src/share/bin/jli_util.h
+1
-1
src/share/bin/parse_manifest.c
src/share/bin/parse_manifest.c
+9
-6
src/share/classes/com/sun/beans/finder/MethodFinder.java
src/share/classes/com/sun/beans/finder/MethodFinder.java
+5
-2
src/share/classes/com/sun/crypto/provider/DHKeyAgreement.java
...share/classes/com/sun/crypto/provider/DHKeyAgreement.java
+5
-0
src/share/classes/com/sun/java/util/jar/pack/BandStructure.java
...are/classes/com/sun/java/util/jar/pack/BandStructure.java
+2
-1
src/share/classes/com/sun/java/util/jar/pack/ConstantPool.java
...hare/classes/com/sun/java/util/jar/pack/ConstantPool.java
+2
-0
src/share/classes/com/sun/java/util/jar/pack/NativeUnpack.java
...hare/classes/com/sun/java/util/jar/pack/NativeUnpack.java
+4
-0
src/share/classes/com/sun/java/util/jar/pack/PackerImpl.java
src/share/classes/com/sun/java/util/jar/pack/PackerImpl.java
+2
-2
src/share/classes/com/sun/java/util/jar/pack/UnpackerImpl.java
...hare/classes/com/sun/java/util/jar/pack/UnpackerImpl.java
+3
-3
src/share/classes/com/sun/jmx/mbeanserver/ClassLoaderRepositorySupport.java
...com/sun/jmx/mbeanserver/ClassLoaderRepositorySupport.java
+2
-0
src/share/classes/com/sun/jmx/mbeanserver/Introspector.java
src/share/classes/com/sun/jmx/mbeanserver/Introspector.java
+6
-2
src/share/classes/com/sun/jmx/mbeanserver/JmxMBeanServer.java
...share/classes/com/sun/jmx/mbeanserver/JmxMBeanServer.java
+10
-0
src/share/classes/com/sun/jmx/mbeanserver/MBeanInstantiator.java
...re/classes/com/sun/jmx/mbeanserver/MBeanInstantiator.java
+30
-4
src/share/classes/com/sun/jmx/mbeanserver/MBeanSupport.java
src/share/classes/com/sun/jmx/mbeanserver/MBeanSupport.java
+2
-0
src/share/classes/java/awt/Dialog.java
src/share/classes/java/awt/Dialog.java
+48
-8
src/share/classes/java/awt/EventQueue.java
src/share/classes/java/awt/EventQueue.java
+15
-4
src/share/classes/java/awt/TextComponent.java
src/share/classes/java/awt/TextComponent.java
+7
-18
src/share/classes/java/awt/Window.java
src/share/classes/java/awt/Window.java
+1
-1
src/share/classes/java/io/ObjectInputStream.java
src/share/classes/java/io/ObjectInputStream.java
+6
-0
src/share/classes/java/lang/Class.java
src/share/classes/java/lang/Class.java
+30
-20
src/share/classes/java/lang/invoke/MethodHandleNatives.java
src/share/classes/java/lang/invoke/MethodHandleNatives.java
+2
-0
src/share/classes/java/lang/invoke/MethodHandleProxies.java
src/share/classes/java/lang/invoke/MethodHandleProxies.java
+67
-21
src/share/classes/java/lang/management/ManagementFactory.java
...share/classes/java/lang/management/ManagementFactory.java
+9
-9
src/share/classes/java/lang/reflect/Proxy.java
src/share/classes/java/lang/reflect/Proxy.java
+145
-9
src/share/classes/java/net/InetSocketAddress.java
src/share/classes/java/net/InetSocketAddress.java
+182
-90
src/share/classes/java/util/concurrent/ThreadPoolExecutor.java
...hare/classes/java/util/concurrent/ThreadPoolExecutor.java
+104
-68
src/share/classes/java/util/jar/JarFile.java
src/share/classes/java/util/jar/JarFile.java
+11
-9
src/share/classes/java/util/logging/Level.java
src/share/classes/java/util/logging/Level.java
+218
-37
src/share/classes/java/util/logging/LogManager.java
src/share/classes/java/util/logging/LogManager.java
+356
-175
src/share/classes/java/util/logging/Logger.java
src/share/classes/java/util/logging/Logger.java
+72
-6
src/share/classes/java/util/logging/Logging.java
src/share/classes/java/util/logging/Logging.java
+6
-4
src/share/classes/java/util/logging/LoggingProxyImpl.java
src/share/classes/java/util/logging/LoggingProxyImpl.java
+8
-3
src/share/classes/java/util/logging/SimpleFormatter.java
src/share/classes/java/util/logging/SimpleFormatter.java
+1
-1
src/share/classes/javax/management/modelmbean/RequiredModelMBean.java
...asses/javax/management/modelmbean/RequiredModelMBean.java
+172
-53
src/share/classes/javax/swing/JTable.java
src/share/classes/javax/swing/JTable.java
+5
-9
src/share/classes/javax/swing/RepaintManager.java
src/share/classes/javax/swing/RepaintManager.java
+98
-69
src/share/classes/javax/swing/UIDefaults.java
src/share/classes/javax/swing/UIDefaults.java
+2
-0
src/share/classes/javax/swing/plaf/nimbus/NimbusLookAndFeel.java
...re/classes/javax/swing/plaf/nimbus/NimbusLookAndFeel.java
+6
-1
src/share/classes/sun/applet/AppletPanel.java
src/share/classes/sun/applet/AppletPanel.java
+30
-32
src/share/classes/sun/awt/AWTAccessor.java
src/share/classes/sun/awt/AWTAccessor.java
+8
-0
src/share/classes/sun/awt/AppContext.java
src/share/classes/sun/awt/AppContext.java
+30
-9
src/share/classes/sun/awt/image/ByteComponentRaster.java
src/share/classes/sun/awt/image/ByteComponentRaster.java
+50
-20
src/share/classes/sun/awt/image/ByteInterleavedRaster.java
src/share/classes/sun/awt/image/ByteInterleavedRaster.java
+1
-28
src/share/classes/sun/awt/image/ShortComponentRaster.java
src/share/classes/sun/awt/image/ShortComponentRaster.java
+49
-20
src/share/classes/sun/awt/image/ShortInterleavedRaster.java
src/share/classes/sun/awt/image/ShortInterleavedRaster.java
+1
-28
src/share/classes/sun/misc/JavaAWTAccess.java
src/share/classes/sun/misc/JavaAWTAccess.java
+8
-0
src/share/classes/sun/net/httpserver/ChunkedInputStream.java
src/share/classes/sun/net/httpserver/ChunkedInputStream.java
+11
-3
src/share/classes/sun/net/www/http/ChunkedInputStream.java
src/share/classes/sun/net/www/http/ChunkedInputStream.java
+9
-0
src/share/classes/sun/nio/ch/DatagramChannelImpl.java
src/share/classes/sun/nio/ch/DatagramChannelImpl.java
+9
-9
src/share/classes/sun/reflect/misc/ReflectUtil.java
src/share/classes/sun/reflect/misc/ReflectUtil.java
+27
-0
src/share/classes/sun/rmi/transport/proxy/CGIHandler.java
src/share/classes/sun/rmi/transport/proxy/CGIHandler.java
+10
-7
src/share/classes/sun/rmi/transport/proxy/HttpInputStream.java
...hare/classes/sun/rmi/transport/proxy/HttpInputStream.java
+8
-5
src/share/classes/sun/security/pkcs11/P11KeyAgreement.java
src/share/classes/sun/security/pkcs11/P11KeyAgreement.java
+9
-0
src/share/classes/sun/security/ssl/CipherBox.java
src/share/classes/sun/security/ssl/CipherBox.java
+159
-47
src/share/classes/sun/security/ssl/CipherSuite.java
src/share/classes/sun/security/ssl/CipherSuite.java
+16
-7
src/share/classes/sun/security/ssl/ClientHandshaker.java
src/share/classes/sun/security/ssl/ClientHandshaker.java
+8
-5
src/share/classes/sun/security/ssl/DHClientKeyExchange.java
src/share/classes/sun/security/ssl/DHClientKeyExchange.java
+14
-5
src/share/classes/sun/security/ssl/DHCrypt.java
src/share/classes/sun/security/ssl/DHCrypt.java
+73
-14
src/share/classes/sun/security/ssl/EngineInputRecord.java
src/share/classes/sun/security/ssl/EngineInputRecord.java
+135
-57
src/share/classes/sun/security/ssl/EngineOutputRecord.java
src/share/classes/sun/security/ssl/EngineOutputRecord.java
+2
-2
src/share/classes/sun/security/ssl/HandshakeMessage.java
src/share/classes/sun/security/ssl/HandshakeMessage.java
+13
-1
src/share/classes/sun/security/ssl/InputRecord.java
src/share/classes/sun/security/ssl/InputRecord.java
+154
-24
src/share/classes/sun/security/ssl/MAC.java
src/share/classes/sun/security/ssl/MAC.java
+38
-13
src/share/classes/sun/security/ssl/OutputRecord.java
src/share/classes/sun/security/ssl/OutputRecord.java
+2
-2
src/share/classes/sun/security/ssl/RSAClientKeyExchange.java
src/share/classes/sun/security/ssl/RSAClientKeyExchange.java
+2
-2
src/share/classes/sun/security/ssl/SSLEngineImpl.java
src/share/classes/sun/security/ssl/SSLEngineImpl.java
+3
-23
src/share/classes/sun/security/ssl/SSLSocketImpl.java
src/share/classes/sun/security/ssl/SSLSocketImpl.java
+3
-19
src/share/classes/sun/security/ssl/ServerHandshaker.java
src/share/classes/sun/security/ssl/ServerHandshaker.java
+10
-8
src/share/classes/sun/security/ssl/SignatureAndHashAlgorithm.java
...e/classes/sun/security/ssl/SignatureAndHashAlgorithm.java
+2
-2
src/share/classes/sun/security/util/DerIndefLenConverter.java
...share/classes/sun/security/util/DerIndefLenConverter.java
+4
-0
src/share/classes/sun/security/util/DisabledAlgorithmConstraints.java
...asses/sun/security/util/DisabledAlgorithmConstraints.java
+1
-1
src/share/classes/sun/security/util/KeyUtil.java
src/share/classes/sun/security/util/KeyUtil.java
+204
-0
src/share/classes/sun/security/util/UntrustedCertificates.java
...hare/classes/sun/security/util/UntrustedCertificates.java
+107
-1
src/share/lib/security/java.security-linux
src/share/lib/security/java.security-linux
+26
-2
src/share/lib/security/java.security-macosx
src/share/lib/security/java.security-macosx
+28
-2
src/share/lib/security/java.security-solaris
src/share/lib/security/java.security-solaris
+26
-2
src/share/lib/security/java.security-windows
src/share/lib/security/java.security-windows
+26
-2
src/share/native/com/sun/java/util/jar/pack/bands.cpp
src/share/native/com/sun/java/util/jar/pack/bands.cpp
+4
-0
src/share/native/com/sun/java/util/jar/pack/bands.h
src/share/native/com/sun/java/util/jar/pack/bands.h
+2
-2
src/share/native/com/sun/java/util/jar/pack/jni.cpp
src/share/native/com/sun/java/util/jar/pack/jni.cpp
+38
-15
src/share/native/com/sun/java/util/jar/pack/unpack.cpp
src/share/native/com/sun/java/util/jar/pack/unpack.cpp
+29
-5
src/share/native/sun/awt/image/awt_parseImage.c
src/share/native/sun/awt/image/awt_parseImage.c
+105
-5
src/share/native/sun/awt/image/awt_parseImage.h
src/share/native/sun/awt/image/awt_parseImage.h
+1
-0
src/share/native/sun/awt/medialib/safe_alloc.h
src/share/native/sun/awt/medialib/safe_alloc.h
+5
-0
src/share/native/sun/awt/splashscreen/splashscreen_jpeg.c
src/share/native/sun/awt/splashscreen/splashscreen_jpeg.c
+4
-0
src/solaris/classes/sun/nio/ch/sctp/SctpChannelImpl.java
src/solaris/classes/sun/nio/ch/sctp/SctpChannelImpl.java
+11
-3
src/solaris/classes/sun/nio/ch/sctp/SctpMultiChannelImpl.java
...solaris/classes/sun/nio/ch/sctp/SctpMultiChannelImpl.java
+12
-4
src/solaris/native/sun/nio/ch/DatagramChannelImpl.c
src/solaris/native/sun/nio/ch/DatagramChannelImpl.c
+1
-8
src/solaris/native/sun/nio/ch/sctp/SctpChannelImpl.c
src/solaris/native/sun/nio/ch/sctp/SctpChannelImpl.c
+7
-20
src/windows/bin/java_md.c
src/windows/bin/java_md.c
+40
-5
src/windows/classes/sun/awt/windows/WComponentPeer.java
src/windows/classes/sun/awt/windows/WComponentPeer.java
+5
-4
src/windows/classes/sun/awt/windows/WEmbeddedFrame.java
src/windows/classes/sun/awt/windows/WEmbeddedFrame.java
+8
-5
src/windows/native/sun/nio/ch/DatagramChannelImpl.c
src/windows/native/sun/nio/ch/DatagramChannelImpl.c
+2
-8
src/windows/native/sun/windows/awt_TextComponent.cpp
src/windows/native/sun/windows/awt_TextComponent.cpp
+10
-12
src/windows/native/sun/windows/awt_TextComponent.h
src/windows/native/sun/windows/awt_TextComponent.h
+1
-2
test/Makefile
test/Makefile
+1
-0
test/java/nio/channels/DatagramChannel/SendToUnresolved.java
test/java/nio/channels/DatagramChannel/SendToUnresolved.java
+1
-1
test/java/rmi/server/RMIClassLoader/loadProxyClasses/security.policy
...mi/server/RMIClassLoader/loadProxyClasses/security.policy
+1
-0
test/java/rmi/testlibrary/JavaVM.java
test/java/rmi/testlibrary/JavaVM.java
+39
-0
test/java/util/logging/CustomLogManager.java
test/java/util/logging/CustomLogManager.java
+177
-0
test/java/util/logging/CustomLogManagerTest.java
test/java/util/logging/CustomLogManagerTest.java
+63
-0
test/java/util/logging/SimpleLogManager.java
test/java/util/logging/SimpleLogManager.java
+113
-0
test/javax/management/remote/mandatory/subjectDelegation/SubjectDelegation2Test.java
...e/mandatory/subjectDelegation/SubjectDelegation2Test.java
+3
-3
test/javax/management/remote/mandatory/subjectDelegation/SubjectDelegation3Test.java
...e/mandatory/subjectDelegation/SubjectDelegation3Test.java
+3
-3
test/sun/security/mscapi/ShortRSAKeyWithinTLS.java
test/sun/security/mscapi/ShortRSAKeyWithinTLS.java
+3
-3
test/tools/launcher/ToolsOpts.java
test/tools/launcher/ToolsOpts.java
+1
-0
未找到文件。
src/share/bin/jli_util.h
浏览文件 @
e06c9d77
...
...
@@ -66,7 +66,7 @@ int JLI_GetStdArgc();
#include <io.h>
#define JLI_StrCaseCmp(p1, p2) stricmp((p1), (p2))
#define JLI_StrNCaseCmp(p1, p2, p3) strnicmp((p1), (p2), (p3))
#define JLI_Snprintf _snprintf
int
JLI_Snprintf
(
char
*
buffer
,
size_t
size
,
const
char
*
format
,
...);
void
JLI_CmdToArgs
(
char
*
cmdline
);
#define JLI_Lseek _lseeki64
#else
/* NIXES */
...
...
src/share/bin/parse_manifest.c
浏览文件 @
e06c9d77
...
...
@@ -569,9 +569,9 @@ JLI_ParseManifest(char *jarfile, manifest_info *info)
#ifdef O_BINARY
|
O_BINARY
/* use binary mode on windows */
#endif
))
==
-
1
)
))
==
-
1
)
{
return
(
-
1
);
}
info
->
manifest_version
=
NULL
;
info
->
main_class
=
NULL
;
info
->
jre_version
=
NULL
;
...
...
@@ -618,15 +618,17 @@ JLI_JarUnpackFile(const char *jarfile, const char *filename, int *size) {
zentry
entry
;
void
*
data
=
NULL
;
fd
=
open
(
jarfile
,
O_RDONLY
if
((
fd
=
open
(
jarfile
,
O_RDONLY
#ifdef O_LARGEFILE
|
O_LARGEFILE
/* large file mode */
#endif
#ifdef O_BINARY
|
O_BINARY
/* use binary mode on windows */
#endif
);
if
(
fd
!=
-
1
&&
find_file
(
fd
,
&
entry
,
filename
)
==
0
)
{
))
==
-
1
)
{
return
NULL
;
}
if
(
find_file
(
fd
,
&
entry
,
filename
)
==
0
)
{
data
=
inflate_file
(
fd
,
&
entry
,
size
);
}
close
(
fd
);
...
...
@@ -671,8 +673,9 @@ JLI_ManifestIterate(const char *jarfile, attribute_closure ac, void *user_data)
#ifdef O_BINARY
|
O_BINARY
/* use binary mode on windows */
#endif
))
==
-
1
)
))
==
-
1
)
{
return
(
-
1
);
}
if
(
rc
=
find_file
(
fd
,
&
entry
,
manifest_name
)
!=
0
)
{
close
(
fd
);
...
...
src/share/classes/com/sun/beans/finder/MethodFinder.java
浏览文件 @
e06c9d77
...
...
@@ -66,11 +66,14 @@ public final class MethodFinder extends AbstractFinder<Method> {
Signature
signature
=
new
Signature
(
type
,
name
,
args
);
Method
method
=
CACHE
.
get
(
signature
);
if
(
method
!=
null
)
{
boolean
cached
=
method
!=
null
;
if
(
cached
&&
isPackageAccessible
(
method
.
getDeclaringClass
()))
{
return
method
;
}
method
=
findAccessibleMethod
(
new
MethodFinder
(
name
,
args
).
find
(
type
.
getMethods
()));
CACHE
.
put
(
signature
,
method
);
if
(!
cached
)
{
CACHE
.
put
(
signature
,
method
);
}
return
method
;
}
...
...
src/share/classes/com/sun/crypto/provider/DHKeyAgreement.java
浏览文件 @
e06c9d77
...
...
@@ -41,6 +41,8 @@ import javax.crypto.ShortBufferException;
import
javax.crypto.SecretKey
;
import
javax.crypto.spec.*
;
import
sun.security.util.KeyUtil
;
/**
* This class implements the Diffie-Hellman key agreement protocol between
* any number of parties.
...
...
@@ -200,6 +202,9 @@ extends KeyAgreementSpi {
throw
new
InvalidKeyException
(
"Incompatible parameters"
);
}
// validate the Diffie-Hellman public key
KeyUtil
.
validate
(
dhPubKey
);
// store the y value
this
.
y
=
dhPubKey
.
getY
();
...
...
src/share/classes/com/sun/java/util/jar/pack/BandStructure.java
浏览文件 @
e06c9d77
...
...
@@ -1000,7 +1000,6 @@ class BandStructure {
/** Write a constant pool reference. */
public
void
putRef
(
Entry
e
)
{
assert
(
index
!=
null
);
addValue
(
encodeRefOrNull
(
e
,
index
));
}
public
void
putRef
(
Entry
e
,
Index
index
)
{
...
...
@@ -1052,6 +1051,8 @@ class BandStructure {
int
encodeRef
(
Entry
e
,
Index
ix
)
{
if
(
ix
==
null
)
throw
new
RuntimeException
(
"null index for "
+
e
.
stringValue
());
int
coding
=
ix
.
indexOf
(
e
);
if
(
verbose
>
2
)
Utils
.
log
.
fine
(
"putRef "
+
coding
+
" => "
+
e
);
...
...
src/share/classes/com/sun/java/util/jar/pack/ConstantPool.java
浏览文件 @
e06c9d77
...
...
@@ -1405,6 +1405,8 @@ class ConstantPool {
/** Index of all CP entries of a given tag and class. */
public
Index
getMemberIndex
(
byte
tag
,
ClassEntry
classRef
)
{
if
(
classRef
==
null
)
throw
new
RuntimeException
(
"missing class reference for "
+
tagName
(
tag
));
if
(
indexByTagAndClass
==
null
)
indexByTagAndClass
=
new
Index
[
CONSTANT_Limit
][];
Index
allClasses
=
getIndexByTag
(
CONSTANT_Class
);
...
...
src/share/classes/com/sun/java/util/jar/pack/NativeUnpack.java
浏览文件 @
e06c9d77
...
...
@@ -109,6 +109,10 @@ class NativeUnpack {
return
(
p200
==
null
)?
null
:
p200
.
_nunp
;
}
private
synchronized
long
getUnpackerPtr
()
{
return
unpackerPtr
;
}
// Callback from the unpacker engine to get more data.
private
long
readInputFn
(
ByteBuffer
pbuf
,
long
minlen
)
throws
IOException
{
if
(
in
==
null
)
return
0
;
// nothing is readable
...
...
src/share/classes/com/sun/java/util/jar/pack/PackerImpl.java
浏览文件 @
e06c9d77
...
...
@@ -83,7 +83,7 @@ public class PackerImpl extends TLGlobals implements Pack200.Packer {
* @param out an OutputStream
* @exception IOException if an error is encountered.
*/
public
void
pack
(
JarFile
in
,
OutputStream
out
)
throws
IOException
{
public
synchronized
void
pack
(
JarFile
in
,
OutputStream
out
)
throws
IOException
{
assert
(
Utils
.
currentInstance
.
get
()
==
null
);
TimeZone
tz
=
(
props
.
getBoolean
(
Utils
.
PACK_DEFAULT_TIMEZONE
))
?
null
...
...
@@ -118,7 +118,7 @@ public class PackerImpl extends TLGlobals implements Pack200.Packer {
* @param out an OutputStream
* @exception IOException if an error is encountered.
*/
public
void
pack
(
JarInputStream
in
,
OutputStream
out
)
throws
IOException
{
public
synchronized
void
pack
(
JarInputStream
in
,
OutputStream
out
)
throws
IOException
{
assert
(
Utils
.
currentInstance
.
get
()
==
null
);
TimeZone
tz
=
(
props
.
getBoolean
(
Utils
.
PACK_DEFAULT_TIMEZONE
))
?
null
:
TimeZone
.
getDefault
();
...
...
src/share/classes/com/sun/java/util/jar/pack/UnpackerImpl.java
浏览文件 @
e06c9d77
/*
* Copyright (c) 2003, 201
1
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2003, 201
2
, 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
...
...
@@ -106,7 +106,7 @@ public class UnpackerImpl extends TLGlobals implements Pack200.Unpacker {
* @param out a JarOutputStream.
* @exception IOException if an error is encountered.
*/
public
void
unpack
(
InputStream
in
,
JarOutputStream
out
)
throws
IOException
{
public
synchronized
void
unpack
(
InputStream
in
,
JarOutputStream
out
)
throws
IOException
{
if
(
in
==
null
)
{
throw
new
NullPointerException
(
"null input"
);
}
...
...
@@ -151,7 +151,7 @@ public class UnpackerImpl extends TLGlobals implements Pack200.Unpacker {
* @param out a JarOutputStream.
* @exception IOException if an error is encountered.
*/
public
void
unpack
(
File
in
,
JarOutputStream
out
)
throws
IOException
{
public
synchronized
void
unpack
(
File
in
,
JarOutputStream
out
)
throws
IOException
{
if
(
in
==
null
)
{
throw
new
NullPointerException
(
"null input"
);
}
...
...
src/share/classes/com/sun/jmx/mbeanserver/ClassLoaderRepositorySupport.java
浏览文件 @
e06c9d77
...
...
@@ -36,6 +36,7 @@ import java.util.logging.Level;
import
javax.management.ObjectName
;
import
javax.management.loading.PrivateClassLoader
;
import
sun.reflect.misc.ReflectUtil
;
/**
* This class keeps the list of Class Loaders registered in the MBean Server.
...
...
@@ -192,6 +193,7 @@ final class ClassLoaderRepositorySupport
final
ClassLoader
without
,
final
ClassLoader
stop
)
throws
ClassNotFoundException
{
ReflectUtil
.
checkPackageAccess
(
className
);
final
int
size
=
list
.
length
;
for
(
int
i
=
0
;
i
<
size
;
i
++)
{
try
{
...
...
src/share/classes/com/sun/jmx/mbeanserver/Introspector.java
浏览文件 @
e06c9d77
...
...
@@ -54,6 +54,8 @@ import java.lang.reflect.Array;
import
java.lang.reflect.InvocationTargetException
;
import
javax.management.AttributeNotFoundException
;
import
javax.management.openmbean.CompositeData
;
import
sun.reflect.misc.MethodUtil
;
import
sun.reflect.misc.ReflectUtil
;
/**
* This class contains the methods for performing all the tests needed to verify
...
...
@@ -526,8 +528,10 @@ public class Introspector {
// to locate method
readMethod
=
SimpleIntrospector
.
getReadMethod
(
clazz
,
element
);
}
if
(
readMethod
!=
null
)
return
readMethod
.
invoke
(
complex
);
if
(
readMethod
!=
null
)
{
ReflectUtil
.
checkPackageAccess
(
readMethod
.
getDeclaringClass
());
return
MethodUtil
.
invoke
(
readMethod
,
complex
,
new
Class
[
0
]);
}
throw
new
AttributeNotFoundException
(
"Could not find the getter method for the property "
+
...
...
src/share/classes/com/sun/jmx/mbeanserver/JmxMBeanServer.java
浏览文件 @
e06c9d77
...
...
@@ -51,6 +51,7 @@ import javax.management.MBeanPermission;
import
javax.management.MBeanRegistrationException
;
import
javax.management.MBeanServer
;
import
javax.management.MBeanServerDelegate
;
import
javax.management.MBeanServerPermission
;
import
javax.management.NotCompliantMBeanException
;
import
javax.management.NotificationFilter
;
import
javax.management.NotificationListener
;
...
...
@@ -1409,6 +1410,8 @@ public final class JmxMBeanServer
// Default is true.
final
boolean
fairLock
=
DEFAULT_FAIR_LOCK_POLICY
;
checkNewMBeanServerPermission
();
// This constructor happens to disregard the value of the interceptors
// flag - that is, it always uses the default value - false.
// This is admitedly a bug, but we chose not to fix it for now
...
...
@@ -1494,4 +1497,11 @@ public final class JmxMBeanServer
}
}
private
static
void
checkNewMBeanServerPermission
()
{
SecurityManager
sm
=
System
.
getSecurityManager
();
if
(
sm
!=
null
)
{
Permission
perm
=
new
MBeanServerPermission
(
"newMBeanServer"
);
sm
.
checkPermission
(
perm
);
}
}
}
src/share/classes/com/sun/jmx/mbeanserver/MBeanInstantiator.java
浏览文件 @
e06c9d77
...
...
@@ -32,11 +32,13 @@ import java.io.IOException;
import
java.io.ObjectInputStream
;
import
java.lang.reflect.Constructor
;
import
java.lang.reflect.InvocationTargetException
;
import
java.security.Permission
;
import
java.util.Map
;
import
java.util.logging.Level
;
import
javax.management.InstanceNotFoundException
;
import
javax.management.MBeanException
;
import
javax.management.MBeanPermission
;
import
javax.management.NotCompliantMBeanException
;
import
javax.management.ObjectName
;
import
javax.management.OperationsException
;
...
...
@@ -44,7 +46,7 @@ import javax.management.ReflectionException;
import
javax.management.RuntimeErrorException
;
import
javax.management.RuntimeMBeanException
;
import
javax.management.RuntimeOperationsException
;
import
sun.reflect.misc.ConstructorUtil
;
import
sun.reflect.misc.ReflectUtil
;
/**
...
...
@@ -56,7 +58,6 @@ import sun.reflect.misc.ReflectUtil;
* @since 1.5
*/
public
class
MBeanInstantiator
{
private
final
ModifiableClassLoaderRepository
clr
;
// private MetaData meta = null;
...
...
@@ -88,6 +89,7 @@ public class MBeanInstantiator {
"Exception occurred during object instantiation"
);
}
ReflectUtil
.
checkPackageAccess
(
className
);
try
{
if
(
clr
==
null
)
throw
new
ClassNotFoundException
(
className
);
theClass
=
clr
.
loadClass
(
className
);
...
...
@@ -162,6 +164,7 @@ public class MBeanInstantiator {
continue
;
}
ReflectUtil
.
checkPackageAccess
(
signature
[
i
]);
// Ok we do not have a primitive type ! We need to build
// the signature of the method
//
...
...
@@ -205,6 +208,9 @@ public class MBeanInstantiator {
*/
public
Object
instantiate
(
Class
<?>
theClass
)
throws
ReflectionException
,
MBeanException
{
checkMBeanPermission
(
theClass
,
null
,
null
,
"instantiate"
);
Object
moi
;
...
...
@@ -260,6 +266,9 @@ public class MBeanInstantiator {
public
Object
instantiate
(
Class
<?>
theClass
,
Object
params
[],
String
signature
[],
ClassLoader
loader
)
throws
ReflectionException
,
MBeanException
{
checkMBeanPermission
(
theClass
,
null
,
null
,
"instantiate"
);
// Instantiate the new object
// ------------------------------
...
...
@@ -407,6 +416,8 @@ public class MBeanInstantiator {
throw
new
RuntimeOperationsException
(
new
IllegalArgumentException
(),
"Null className passed in parameter"
);
}
ReflectUtil
.
checkPackageAccess
(
className
);
Class
<?>
theClass
;
if
(
loaderName
==
null
)
{
// Load the class using the agent class loader
...
...
@@ -619,13 +630,13 @@ public class MBeanInstantiator {
**/
static
Class
<?>
loadClass
(
String
className
,
ClassLoader
loader
)
throws
ReflectionException
{
Class
<?>
theClass
;
if
(
className
==
null
)
{
throw
new
RuntimeOperationsException
(
new
IllegalArgumentException
(
"The class name cannot be null"
),
"Exception occurred during object instantiation"
);
}
ReflectUtil
.
checkPackageAccess
(
className
);
try
{
if
(
loader
==
null
)
loader
=
MBeanInstantiator
.
class
.
getClassLoader
();
...
...
@@ -676,6 +687,7 @@ public class MBeanInstantiator {
// We need to load the class through the class
// loader of the target object.
//
ReflectUtil
.
checkPackageAccess
(
signature
[
i
]);
tab
[
i
]
=
Class
.
forName
(
signature
[
i
],
false
,
aLoader
);
}
}
catch
(
ClassNotFoundException
e
)
{
...
...
@@ -701,7 +713,7 @@ public class MBeanInstantiator {
private
Constructor
<?>
findConstructor
(
Class
<?>
c
,
Class
<?>[]
params
)
{
try
{
return
c
.
getConstructor
(
params
);
return
ConstructorUtil
.
getConstructor
(
c
,
params
);
}
catch
(
Exception
e
)
{
return
null
;
}
...
...
@@ -715,4 +727,18 @@ public class MBeanInstantiator {
char
.
class
,
boolean
.
class
})
primitiveClasses
.
put
(
c
.
getName
(),
c
);
}
private
static
void
checkMBeanPermission
(
Class
<?>
clazz
,
String
member
,
ObjectName
objectName
,
String
actions
)
{
SecurityManager
sm
=
System
.
getSecurityManager
();
if
(
clazz
!=
null
&&
sm
!=
null
)
{
Permission
perm
=
new
MBeanPermission
(
clazz
.
getName
(),
member
,
objectName
,
actions
);
sm
.
checkPermission
(
perm
);
}
}
}
src/share/classes/com/sun/jmx/mbeanserver/MBeanSupport.java
浏览文件 @
e06c9d77
...
...
@@ -38,6 +38,7 @@ import javax.management.NotCompliantMBeanException;
import
javax.management.ObjectName
;
import
javax.management.ReflectionException
;
import
com.sun.jmx.mbeanserver.MXBeanMappingFactory
;
import
sun.reflect.misc.ReflectUtil
;
/**
* Base class for MBeans. There is one instance of this class for
...
...
@@ -131,6 +132,7 @@ public abstract class MBeanSupport<M>
" is not an instance of "
+
mbeanInterfaceType
.
getName
();
throw
new
NotCompliantMBeanException
(
msg
);
}
ReflectUtil
.
checkPackageAccess
(
mbeanInterfaceType
);
this
.
resource
=
resource
;
MBeanIntrospector
<
M
>
introspector
=
getMBeanIntrospector
();
this
.
perInterface
=
introspector
.
getPerInterface
(
mbeanInterfaceType
);
...
...
src/share/classes/java/awt/Dialog.java
浏览文件 @
e06c9d77
...
...
@@ -39,6 +39,7 @@ import sun.awt.PeerEvent;
import
sun.awt.util.IdentityArrayList
;
import
sun.awt.util.IdentityLinkedList
;
import
sun.security.util.SecurityConstants
;
import
java.security.AccessControlException
;
/**
* A Dialog is a top-level window with a title and a border
...
...
@@ -128,6 +129,8 @@ public class Dialog extends Window {
*/
boolean
undecorated
=
false
;
private
transient
boolean
initialized
=
false
;
/**
* Modal dialogs block all input to some top-level windows.
* Whether a particular window is blocked depends on dialog's type
...
...
@@ -671,6 +674,7 @@ public class Dialog extends Window {
this
.
title
=
title
;
setModalityType
(
modalityType
);
SunToolkit
.
checkAndSetPolicy
(
this
);
initialized
=
true
;
}
/**
...
...
@@ -722,6 +726,7 @@ public class Dialog extends Window {
this
.
title
=
title
;
setModalityType
(
modalityType
);
SunToolkit
.
checkAndSetPolicy
(
this
);
initialized
=
true
;
}
/**
...
...
@@ -851,12 +856,9 @@ public class Dialog extends Window {
if
(
modalityType
==
type
)
{
return
;
}
if
(
type
==
ModalityType
.
TOOLKIT_MODAL
)
{
SecurityManager
sm
=
System
.
getSecurityManager
();
if
(
sm
!=
null
)
{
sm
.
checkPermission
(
SecurityConstants
.
AWT
.
TOOLKIT_MODALITY_PERMISSION
);
}
}
checkModalityPermission
(
type
);
modalityType
=
type
;
modal
=
(
modalityType
!=
ModalityType
.
MODELESS
);
}
...
...
@@ -1025,6 +1027,11 @@ public class Dialog extends Window {
*/
@Deprecated
public
void
show
()
{
if
(!
initialized
)
{
throw
new
IllegalStateException
(
"The dialog component "
+
"has not been initialized properly"
);
}
beforeFirstShow
=
false
;
if
(!
isModal
())
{
conditionalShow
(
null
,
null
);
...
...
@@ -1600,18 +1607,51 @@ public class Dialog extends Window {
}
}
private
void
checkModalityPermission
(
ModalityType
mt
)
{
if
(
mt
==
ModalityType
.
TOOLKIT_MODAL
)
{
SecurityManager
sm
=
System
.
getSecurityManager
();
if
(
sm
!=
null
)
{
sm
.
checkPermission
(
SecurityConstants
.
AWT
.
TOOLKIT_MODALITY_PERMISSION
);
}
}
}
private
void
readObject
(
ObjectInputStream
s
)
throws
ClassNotFoundException
,
IOException
,
HeadlessException
{
GraphicsEnvironment
.
checkHeadless
();
s
.
defaultReadObject
();
java
.
io
.
ObjectInputStream
.
GetField
fields
=
s
.
readFields
();
ModalityType
localModalityType
=
(
ModalityType
)
fields
.
get
(
"modalityType"
,
null
);
try
{
checkModalityPermission
(
localModalityType
);
}
catch
(
AccessControlException
ace
)
{
localModalityType
=
DEFAULT_MODALITY_TYPE
;
}
// in 1.5 or earlier modalityType was absent, so use "modal" instead
if
(
modalityType
==
null
)
{
if
(
localModalityType
==
null
)
{
this
.
modal
=
fields
.
get
(
"modal"
,
false
);
setModal
(
modal
);
}
else
{
this
.
modalityType
=
localModalityType
;
}
this
.
resizable
=
fields
.
get
(
"resizable"
,
true
);
this
.
undecorated
=
fields
.
get
(
"undecorated"
,
false
);
this
.
title
=
(
String
)
fields
.
get
(
"title"
,
""
);
blockedWindows
=
new
IdentityArrayList
<>();
SunToolkit
.
checkAndSetPolicy
(
this
);
initialized
=
true
;
}
/*
...
...
src/share/classes/java/awt/EventQueue.java
浏览文件 @
e06c9d77
...
...
@@ -194,7 +194,8 @@ public class EventQueue {
}
public
void
removeSourceEvents
(
EventQueue
eventQueue
,
Object
source
,
boolean
removeAllEvents
)
{
boolean
removeAllEvents
)
{
eventQueue
.
removeSourceEvents
(
source
,
removeAllEvents
);
}
public
boolean
noEvents
(
EventQueue
eventQueue
)
{
...
...
@@ -203,6 +204,11 @@ public class EventQueue {
public
void
wakeup
(
EventQueue
eventQueue
,
boolean
isShutdown
)
{
eventQueue
.
wakeup
(
isShutdown
);
}
public
void
invokeAndWait
(
Object
source
,
Runnable
r
)
throws
InterruptedException
,
InvocationTargetException
{
EventQueue
.
invokeAndWait
(
source
,
r
);
}
});
}
...
...
@@ -1245,8 +1251,14 @@ public class EventQueue {
* @since 1.2
*/
public
static
void
invokeAndWait
(
Runnable
runnable
)
throws
InterruptedException
,
InvocationTargetException
{
throws
InterruptedException
,
InvocationTargetException
{
invokeAndWait
(
Toolkit
.
getDefaultToolkit
(),
runnable
);
}
static
void
invokeAndWait
(
Object
source
,
Runnable
runnable
)
throws
InterruptedException
,
InvocationTargetException
{
if
(
EventQueue
.
isDispatchThread
())
{
throw
new
Error
(
"Cannot call invokeAndWait from the event dispatcher thread"
);
}
...
...
@@ -1255,8 +1267,7 @@ public class EventQueue {
Object
lock
=
new
AWTInvocationLock
();
InvocationEvent
event
=
new
InvocationEvent
(
Toolkit
.
getDefaultToolkit
(),
runnable
,
lock
,
true
);
new
InvocationEvent
(
source
,
runnable
,
lock
,
true
);
synchronized
(
lock
)
{
Toolkit
.
getEventQueue
().
postEvent
(
event
);
...
...
src/share/classes/java/awt/TextComponent.java
浏览文件 @
e06c9d77
...
...
@@ -109,12 +109,6 @@ public class TextComponent extends Component implements Accessible {
// the background color of non-editable TextComponents.
boolean
backgroundSetByClientCode
=
false
;
/**
* True if this <code>TextComponent</code> has access
* to the System clipboard.
*/
transient
private
boolean
canAccessClipboard
;
transient
protected
TextListener
textListener
;
/*
...
...
@@ -139,7 +133,6 @@ public class TextComponent extends Component implements Accessible {
GraphicsEnvironment
.
checkHeadless
();
this
.
text
=
(
text
!=
null
)
?
text
:
""
;
setCursor
(
Cursor
.
getPredefinedCursor
(
Cursor
.
TEXT_CURSOR
));
checkSystemClipboardAccess
();
}
private
void
enableInputMethodsIfNecessary
()
{
...
...
@@ -734,17 +727,14 @@ public class TextComponent extends Component implements Accessible {
/**
* Assigns a valid value to the canAccessClipboard instance variable.
*/
private
void
checkSystemClipboardAccess
()
{
canAccessClipboard
=
true
;
private
boolean
canAccessClipboard
()
{
SecurityManager
sm
=
System
.
getSecurityManager
();
if
(
sm
!=
null
)
{
try
{
sm
.
checkSystemClipboardAccess
();
}
catch
(
SecurityException
e
)
{
canAccessClipboard
=
false
;
}
}
if
(
sm
==
null
)
return
true
;
try
{
sm
.
checkSystemClipboardAccess
();
return
true
;
}
catch
(
SecurityException
e
)
{}
return
false
;
}
/*
...
...
@@ -827,7 +817,6 @@ public class TextComponent extends Component implements Accessible {
}
}
enableInputMethodsIfNecessary
();
checkSystemClipboardAccess
();
}
...
...
src/share/classes/java/awt/Window.java
浏览文件 @
e06c9d77
...
...
@@ -1206,7 +1206,7 @@ public class Window extends Container implements Accessible {
}
else
{
try
{
EventQueue
.
invokeAndWait
(
action
);
EventQueue
.
invokeAndWait
(
this
,
action
);
}
catch
(
InterruptedException
e
)
{
System
.
err
.
println
(
"Disposal was interrupted:"
);
...
...
src/share/classes/java/io/ObjectInputStream.java
浏览文件 @
e06c9d77
...
...
@@ -1752,6 +1752,12 @@ public class ObjectInputStream
ObjectStreamClass
desc
=
readClassDesc
(
false
);
desc
.
checkDeserialize
();
Class
<?>
cl
=
desc
.
forClass
();
if
(
cl
==
String
.
class
||
cl
==
Class
.
class
||
cl
==
ObjectStreamClass
.
class
)
{
throw
new
InvalidClassException
(
"invalid class descriptor"
);
}
Object
obj
;
try
{
obj
=
desc
.
isInstantiable
()
?
desc
.
newInstance
()
:
null
;
...
...
src/share/classes/java/lang/Class.java
浏览文件 @
e06c9d77
...
...
@@ -63,7 +63,9 @@ import sun.reflect.generics.repository.ConstructorRepository;
import
sun.reflect.generics.scope.ClassScope
;
import
sun.security.util.SecurityConstants
;
import
java.lang.annotation.Annotation
;
import
java.lang.reflect.Proxy
;
import
sun.reflect.annotation.*
;
import
sun.reflect.misc.ReflectUtil
;
/**
* Instances of the class {@code Class} represent classes and
...
...
@@ -250,11 +252,11 @@ public final
ClassLoader
loader
)
throws
ClassNotFoundException
{
if
(
loader
==
null
)
{
if
(
sun
.
misc
.
VM
.
isSystemDomainLoader
(
loader
)
)
{
SecurityManager
sm
=
System
.
getSecurityManager
();
if
(
sm
!=
null
)
{
ClassLoader
ccl
=
ClassLoader
.
getCallerClassLoader
();
if
(
ccl
!=
null
)
{
if
(
!
sun
.
misc
.
VM
.
isSystemDomainLoader
(
ccl
)
)
{
sm
.
checkPermission
(
SecurityConstants
.
GET_CLASSLOADER_PERMISSION
);
}
...
...
@@ -319,7 +321,7 @@ public final
throws
InstantiationException
,
IllegalAccessException
{
if
(
System
.
getSecurityManager
()
!=
null
)
{
checkMemberAccess
(
Member
.
PUBLIC
,
ClassLoader
.
getCallerClassLoader
());
checkMemberAccess
(
Member
.
PUBLIC
,
ClassLoader
.
getCallerClassLoader
()
,
false
);
}
return
newInstance0
();
}
...
...
@@ -1299,7 +1301,7 @@ public final
// be very careful not to change the stack depth of this
// checkMemberAccess call for security reasons
// see java.lang.SecurityManager.checkMemberAccess
checkMemberAccess
(
Member
.
PUBLIC
,
ClassLoader
.
getCallerClassLoader
());
checkMemberAccess
(
Member
.
PUBLIC
,
ClassLoader
.
getCallerClassLoader
()
,
false
);
// Privileged so this implementation can look at DECLARED classes,
// something the caller might not have privilege to do. The code here
...
...
@@ -1374,7 +1376,7 @@ public final
// be very careful not to change the stack depth of this
// checkMemberAccess call for security reasons
// see java.lang.SecurityManager.checkMemberAccess
checkMemberAccess
(
Member
.
PUBLIC
,
ClassLoader
.
getCallerClassLoader
());
checkMemberAccess
(
Member
.
PUBLIC
,
ClassLoader
.
getCallerClassLoader
()
,
true
);
return
copyFields
(
privateGetPublicFields
(
null
));
}
...
...
@@ -1425,7 +1427,7 @@ public final
// be very careful not to change the stack depth of this
// checkMemberAccess call for security reasons
// see java.lang.SecurityManager.checkMemberAccess
checkMemberAccess
(
Member
.
PUBLIC
,
ClassLoader
.
getCallerClassLoader
());
checkMemberAccess
(
Member
.
PUBLIC
,
ClassLoader
.
getCallerClassLoader
()
,
true
);
return
copyMethods
(
privateGetPublicMethods
());
}
...
...
@@ -1474,7 +1476,7 @@ public final
// be very careful not to change the stack depth of this
// checkMemberAccess call for security reasons
// see java.lang.SecurityManager.checkMemberAccess
checkMemberAccess
(
Member
.
PUBLIC
,
ClassLoader
.
getCallerClassLoader
());
checkMemberAccess
(
Member
.
PUBLIC
,
ClassLoader
.
getCallerClassLoader
()
,
true
);
return
copyConstructors
(
privateGetDeclaredConstructors
(
true
));
}
...
...
@@ -1533,7 +1535,7 @@ public final
// be very careful not to change the stack depth of this
// checkMemberAccess call for security reasons
// see java.lang.SecurityManager.checkMemberAccess
checkMemberAccess
(
Member
.
PUBLIC
,
ClassLoader
.
getCallerClassLoader
());
checkMemberAccess
(
Member
.
PUBLIC
,
ClassLoader
.
getCallerClassLoader
()
,
true
);
Field
field
=
getField0
(
name
);
if
(
field
==
null
)
{
throw
new
NoSuchFieldException
(
name
);
...
...
@@ -1618,7 +1620,7 @@ public final
// be very careful not to change the stack depth of this
// checkMemberAccess call for security reasons
// see java.lang.SecurityManager.checkMemberAccess
checkMemberAccess
(
Member
.
PUBLIC
,
ClassLoader
.
getCallerClassLoader
());
checkMemberAccess
(
Member
.
PUBLIC
,
ClassLoader
.
getCallerClassLoader
()
,
true
);
Method
method
=
getMethod0
(
name
,
parameterTypes
);
if
(
method
==
null
)
{
throw
new
NoSuchMethodException
(
getName
()
+
"."
+
name
+
argumentTypesToString
(
parameterTypes
));
...
...
@@ -1672,7 +1674,7 @@ public final
// be very careful not to change the stack depth of this
// checkMemberAccess call for security reasons
// see java.lang.SecurityManager.checkMemberAccess
checkMemberAccess
(
Member
.
PUBLIC
,
ClassLoader
.
getCallerClassLoader
());
checkMemberAccess
(
Member
.
PUBLIC
,
ClassLoader
.
getCallerClassLoader
()
,
true
);
return
getConstructor0
(
parameterTypes
,
Member
.
PUBLIC
);
}
...
...
@@ -1714,7 +1716,7 @@ public final
// be very careful not to change the stack depth of this
// checkMemberAccess call for security reasons
// see java.lang.SecurityManager.checkMemberAccess
checkMemberAccess
(
Member
.
DECLARED
,
ClassLoader
.
getCallerClassLoader
());
checkMemberAccess
(
Member
.
DECLARED
,
ClassLoader
.
getCallerClassLoader
()
,
false
);
return
getDeclaredClasses0
();
}
...
...
@@ -1758,7 +1760,7 @@ public final
// be very careful not to change the stack depth of this
// checkMemberAccess call for security reasons
// see java.lang.SecurityManager.checkMemberAccess
checkMemberAccess
(
Member
.
DECLARED
,
ClassLoader
.
getCallerClassLoader
());
checkMemberAccess
(
Member
.
DECLARED
,
ClassLoader
.
getCallerClassLoader
()
,
true
);
return
copyFields
(
privateGetDeclaredFields
(
false
));
}
...
...
@@ -1806,7 +1808,7 @@ public final
// be very careful not to change the stack depth of this
// checkMemberAccess call for security reasons
// see java.lang.SecurityManager.checkMemberAccess
checkMemberAccess
(
Member
.
DECLARED
,
ClassLoader
.
getCallerClassLoader
());
checkMemberAccess
(
Member
.
DECLARED
,
ClassLoader
.
getCallerClassLoader
()
,
true
);
return
copyMethods
(
privateGetDeclaredMethods
(
false
));
}
...
...
@@ -1851,7 +1853,7 @@ public final
// be very careful not to change the stack depth of this
// checkMemberAccess call for security reasons
// see java.lang.SecurityManager.checkMemberAccess
checkMemberAccess
(
Member
.
DECLARED
,
ClassLoader
.
getCallerClassLoader
());
checkMemberAccess
(
Member
.
DECLARED
,
ClassLoader
.
getCallerClassLoader
()
,
true
);
return
copyConstructors
(
privateGetDeclaredConstructors
(
false
));
}
...
...
@@ -1895,7 +1897,7 @@ public final
// be very careful not to change the stack depth of this
// checkMemberAccess call for security reasons
// see java.lang.SecurityManager.checkMemberAccess
checkMemberAccess
(
Member
.
DECLARED
,
ClassLoader
.
getCallerClassLoader
());
checkMemberAccess
(
Member
.
DECLARED
,
ClassLoader
.
getCallerClassLoader
()
,
true
);
Field
field
=
searchFields
(
privateGetDeclaredFields
(
false
),
name
);
if
(
field
==
null
)
{
throw
new
NoSuchFieldException
(
name
);
...
...
@@ -1950,7 +1952,7 @@ public final
// be very careful not to change the stack depth of this
// checkMemberAccess call for security reasons
// see java.lang.SecurityManager.checkMemberAccess
checkMemberAccess
(
Member
.
DECLARED
,
ClassLoader
.
getCallerClassLoader
());
checkMemberAccess
(
Member
.
DECLARED
,
ClassLoader
.
getCallerClassLoader
()
,
true
);
Method
method
=
searchMethods
(
privateGetDeclaredMethods
(
false
),
name
,
parameterTypes
);
if
(
method
==
null
)
{
throw
new
NoSuchMethodException
(
getName
()
+
"."
+
name
+
argumentTypesToString
(
parameterTypes
));
...
...
@@ -2000,7 +2002,7 @@ public final
// be very careful not to change the stack depth of this
// checkMemberAccess call for security reasons
// see java.lang.SecurityManager.checkMemberAccess
checkMemberAccess
(
Member
.
DECLARED
,
ClassLoader
.
getCallerClassLoader
());
checkMemberAccess
(
Member
.
DECLARED
,
ClassLoader
.
getCallerClassLoader
()
,
true
);
return
getConstructor0
(
parameterTypes
,
Member
.
DECLARED
);
}
...
...
@@ -2170,18 +2172,26 @@ public final
* <p> Default policy: allow all clients access with normal Java access
* control.
*/
private
void
checkMemberAccess
(
int
which
,
ClassLoader
ccl
)
{
private
void
checkMemberAccess
(
int
which
,
ClassLoader
ccl
,
boolean
checkProxyInterfaces
)
{
SecurityManager
s
=
System
.
getSecurityManager
();
if
(
s
!=
null
)
{
s
.
checkMemberAccess
(
this
,
which
);
ClassLoader
cl
=
getClassLoader0
();
if
(
sun
.
reflect
.
misc
.
ReflectUtil
.
needsPackageAccessCheck
(
ccl
,
cl
))
{
if
(
ReflectUtil
.
needsPackageAccessCheck
(
ccl
,
cl
))
{
String
name
=
this
.
getName
();
int
i
=
name
.
lastIndexOf
(
'.'
);
if
(
i
!=
-
1
)
{
s
.
checkPackageAccess
(
name
.
substring
(
0
,
i
));
// skip the package access check on a proxy class in default proxy package
String
pkg
=
name
.
substring
(
0
,
i
);
if
(!
Proxy
.
isProxyClass
(
this
)
||
!
pkg
.
equals
(
ReflectUtil
.
PROXY_PACKAGE
))
{
s
.
checkPackageAccess
(
pkg
);
}
}
}
// check package access on the proxy interfaces
if
(
checkProxyInterfaces
&&
Proxy
.
isProxyClass
(
this
))
{
ReflectUtil
.
checkProxyPackageAccess
(
ccl
,
this
.
getInterfaces
());
}
}
}
...
...
src/share/classes/java/lang/invoke/MethodHandleNatives.java
浏览文件 @
e06c9d77
...
...
@@ -476,6 +476,8 @@ class MethodHandleNatives {
case
"getProxyClass"
:
case
"newProxyInstance"
:
return
defc
==
java
.
lang
.
reflect
.
Proxy
.
class
;
case
"asInterfaceInstance"
:
return
defc
==
java
.
lang
.
invoke
.
MethodHandleProxies
.
class
;
case
"getBundle"
:
case
"clearCache"
:
return
defc
==
java
.
util
.
ResourceBundle
.
class
;
...
...
src/share/classes/java/lang/invoke/MethodHandleProxies.java
浏览文件 @
e06c9d77
...
...
@@ -26,8 +26,12 @@
package
java.lang.invoke
;
import
java.lang.reflect.*
;
import
java.security.AccessController
;
import
java.security.PrivilegedAction
;
import
sun.invoke.WrapperInstance
;
import
java.util.ArrayList
;
import
sun.reflect.Reflection
;
import
sun.reflect.misc.ReflectUtil
;
/**
* This class consists exclusively of static methods that help adapt
...
...
@@ -137,6 +141,21 @@ public class MethodHandleProxies {
<
T
>
T
asInterfaceInstance
(
final
Class
<
T
>
intfc
,
final
MethodHandle
target
)
{
if
(!
intfc
.
isInterface
()
||
!
Modifier
.
isPublic
(
intfc
.
getModifiers
()))
throw
new
IllegalArgumentException
(
"not a public interface: "
+
intfc
.
getName
());
final
MethodHandle
mh
;
if
(
System
.
getSecurityManager
()
!=
null
)
{
final
int
CALLER_FRAME
=
2
;
// 0: Reflection, 1: asInterfaceInstance, 2: caller
final
Class
<?>
caller
=
Reflection
.
getCallerClass
(
CALLER_FRAME
);
final
ClassLoader
ccl
=
caller
!=
null
?
caller
.
getClassLoader
()
:
null
;
ReflectUtil
.
checkProxyPackageAccess
(
ccl
,
intfc
);
mh
=
ccl
!=
null
?
bindCaller
(
target
,
caller
)
:
target
;
}
else
{
mh
=
target
;
}
ClassLoader
proxyLoader
=
intfc
.
getClassLoader
();
if
(
proxyLoader
==
null
)
{
ClassLoader
cl
=
Thread
.
currentThread
().
getContextClassLoader
();
// avoid use of BCP
proxyLoader
=
cl
!=
null
?
cl
:
ClassLoader
.
getSystemClassLoader
();
}
final
Method
[]
methods
=
getSingleNameMethods
(
intfc
);
if
(
methods
==
null
)
throw
new
IllegalArgumentException
(
"not a single-method interface: "
+
intfc
.
getName
());
...
...
@@ -144,31 +163,58 @@ public class MethodHandleProxies {
for
(
int
i
=
0
;
i
<
methods
.
length
;
i
++)
{
Method
sm
=
methods
[
i
];
MethodType
smMT
=
MethodType
.
methodType
(
sm
.
getReturnType
(),
sm
.
getParameterTypes
());
MethodHandle
checkTarget
=
target
.
asType
(
smMT
);
// make throw WMT
MethodHandle
checkTarget
=
mh
.
asType
(
smMT
);
// make throw WMT
checkTarget
=
checkTarget
.
asType
(
checkTarget
.
type
().
changeReturnType
(
Object
.
class
));
vaTargets
[
i
]
=
checkTarget
.
asSpreader
(
Object
[].
class
,
smMT
.
parameterCount
());
}
return
intfc
.
cast
(
Proxy
.
newProxyInstance
(
intfc
.
getClassLoader
(),
new
Class
<?>[]{
intfc
,
WrapperInstance
.
class
},
new
InvocationHandler
()
{
private
Object
getArg
(
String
name
)
{
if
((
Object
)
name
==
"getWrapperInstanceTarget"
)
return
target
;
if
((
Object
)
name
==
"getWrapperInstanceType"
)
return
intfc
;
throw
new
AssertionError
();
final
InvocationHandler
ih
=
new
InvocationHandler
()
{
private
Object
getArg
(
String
name
)
{
if
((
Object
)
name
==
"getWrapperInstanceTarget"
)
return
target
;
if
((
Object
)
name
==
"getWrapperInstanceType"
)
return
intfc
;
throw
new
AssertionError
();
}
public
Object
invoke
(
Object
proxy
,
Method
method
,
Object
[]
args
)
throws
Throwable
{
for
(
int
i
=
0
;
i
<
methods
.
length
;
i
++)
{
if
(
method
.
equals
(
methods
[
i
]))
return
vaTargets
[
i
].
invokeExact
(
args
);
}
public
Object
invoke
(
Object
proxy
,
Method
method
,
Object
[]
args
)
throws
Throwable
{
for
(
int
i
=
0
;
i
<
methods
.
length
;
i
++)
{
if
(
method
.
equals
(
methods
[
i
]))
return
vaTargets
[
i
].
invokeExact
(
args
);
}
if
(
method
.
getDeclaringClass
()
==
WrapperInstance
.
class
)
return
getArg
(
method
.
getName
());
if
(
isObjectMethod
(
method
))
return
callObjectMethod
(
proxy
,
method
,
args
);
throw
new
InternalError
(
"bad proxy method: "
+
method
);
}
}));
if
(
method
.
getDeclaringClass
()
==
WrapperInstance
.
class
)
return
getArg
(
method
.
getName
());
if
(
isObjectMethod
(
method
))
return
callObjectMethod
(
proxy
,
method
,
args
);
throw
new
InternalError
(
"bad proxy method: "
+
method
);
}
};
final
Object
proxy
;
if
(
System
.
getSecurityManager
()
!=
null
)
{
// sun.invoke.WrapperInstance is a restricted interface not accessible
// by any non-null class loader.
final
ClassLoader
loader
=
proxyLoader
;
proxy
=
AccessController
.
doPrivileged
(
new
PrivilegedAction
<
Object
>()
{
public
Object
run
()
{
return
Proxy
.
newProxyInstance
(
loader
,
new
Class
<?>[]{
intfc
,
WrapperInstance
.
class
},
ih
);
}
});
}
else
{
proxy
=
Proxy
.
newProxyInstance
(
proxyLoader
,
new
Class
<?>[]{
intfc
,
WrapperInstance
.
class
},
ih
);
}
return
intfc
.
cast
(
proxy
);
}
private
static
MethodHandle
bindCaller
(
MethodHandle
target
,
Class
<?>
hostClass
)
{
MethodHandle
cbmh
=
MethodHandleImpl
.
bindCaller
(
target
,
hostClass
);
if
(
target
.
isVarargsCollector
())
{
MethodType
type
=
cbmh
.
type
();
int
arity
=
type
.
parameterCount
();
return
cbmh
.
asVarargsCollector
(
type
.
parameterType
(
arity
-
1
));
}
return
cbmh
;
}
/**
...
...
src/share/classes/java/lang/management/ManagementFactory.java
浏览文件 @
e06c9d77
...
...
@@ -802,20 +802,20 @@ public class ManagementFactory {
*/
private
static
void
addMXBean
(
final
MBeanServer
mbs
,
final
PlatformManagedObject
pmo
)
{
// Make DynamicMBean out of MXBean by wrapping it with a StandardMBean
final
DynamicMBean
dmbean
;
if
(
pmo
instanceof
DynamicMBean
)
{
dmbean
=
DynamicMBean
.
class
.
cast
(
pmo
);
}
else
if
(
pmo
instanceof
NotificationEmitter
)
{
dmbean
=
new
StandardEmitterMBean
(
pmo
,
null
,
true
,
(
NotificationEmitter
)
pmo
);
}
else
{
dmbean
=
new
StandardMBean
(
pmo
,
null
,
true
);
}
try
{
AccessController
.
doPrivileged
(
new
PrivilegedExceptionAction
<
Void
>()
{
public
Void
run
()
throws
InstanceAlreadyExistsException
,
MBeanRegistrationException
,
NotCompliantMBeanException
{
final
DynamicMBean
dmbean
;
if
(
pmo
instanceof
DynamicMBean
)
{
dmbean
=
DynamicMBean
.
class
.
cast
(
pmo
);
}
else
if
(
pmo
instanceof
NotificationEmitter
)
{
dmbean
=
new
StandardEmitterMBean
(
pmo
,
null
,
true
,
(
NotificationEmitter
)
pmo
);
}
else
{
dmbean
=
new
StandardMBean
(
pmo
,
null
,
true
);
}
mbs
.
registerMBean
(
dmbean
,
pmo
.
getObjectName
());
return
null
;
}
...
...
src/share/classes/java/lang/reflect/Proxy.java
浏览文件 @
e06c9d77
...
...
@@ -27,6 +27,9 @@ package java.lang.reflect;
import
java.lang.ref.Reference
;
import
java.lang.ref.WeakReference
;
import
java.security.AccessController
;
import
java.security.Permission
;
import
java.security.PrivilegedAction
;
import
java.util.Arrays
;
import
java.util.Collections
;
import
java.util.HashMap
;
...
...
@@ -36,6 +39,9 @@ import java.util.Set;
import
java.util.List
;
import
java.util.WeakHashMap
;
import
sun.misc.ProxyGenerator
;
import
sun.reflect.Reflection
;
import
sun.reflect.misc.ReflectUtil
;
import
sun.security.util.SecurityConstants
;
/**
* {@code Proxy} provides static methods for creating dynamic proxy
...
...
@@ -265,9 +271,69 @@ public class Proxy implements java.io.Serializable {
* @param h the invocation handler for this proxy instance
*/
protected
Proxy
(
InvocationHandler
h
)
{
doNewInstanceCheck
();
this
.
h
=
h
;
}
private
static
class
ProxyAccessHelper
{
// The permission is implementation specific.
static
final
Permission
PROXY_PERMISSION
=
new
ReflectPermission
(
"proxyConstructorNewInstance"
);
// These system properties are defined to provide a short-term
// workaround if customers need to disable the new security checks.
static
final
boolean
allowNewInstance
;
static
final
boolean
allowNullLoader
;
static
{
allowNewInstance
=
getBooleanProperty
(
"sun.reflect.proxy.allowsNewInstance"
);
allowNullLoader
=
getBooleanProperty
(
"sun.reflect.proxy.allowsNullLoader"
);
}
private
static
boolean
getBooleanProperty
(
final
String
key
)
{
String
s
=
AccessController
.
doPrivileged
(
new
PrivilegedAction
<
String
>()
{
public
String
run
()
{
return
System
.
getProperty
(
key
);
}
});
return
Boolean
.
valueOf
(
s
);
}
static
boolean
needsNewInstanceCheck
(
Class
<?>
proxyClass
)
{
if
(!
Proxy
.
isProxyClass
(
proxyClass
)
||
allowNewInstance
)
{
return
false
;
}
if
(
proxyClass
.
getName
().
startsWith
(
ReflectUtil
.
PROXY_PACKAGE
+
"."
))
{
// all proxy interfaces are public
return
false
;
}
for
(
Class
<?>
intf
:
proxyClass
.
getInterfaces
())
{
if
(!
Modifier
.
isPublic
(
intf
.
getModifiers
()))
{
return
true
;
}
}
return
false
;
}
}
/*
* Access check on a proxy class that implements any non-public interface.
*
* @throws SecurityException if a security manager exists, and
* the caller does not have the permission.
*/
private
void
doNewInstanceCheck
()
{
SecurityManager
sm
=
System
.
getSecurityManager
();
Class
<?>
proxyClass
=
this
.
getClass
();
if
(
sm
!=
null
&&
ProxyAccessHelper
.
needsNewInstanceCheck
(
proxyClass
))
{
try
{
sm
.
checkPermission
(
ProxyAccessHelper
.
PROXY_PERMISSION
);
}
catch
(
SecurityException
e
)
{
throw
new
SecurityException
(
"Not allowed to construct a Proxy "
+
"instance that implements a non-public interface"
,
e
);
}
}
}
/**
* Returns the {@code java.lang.Class} object for a proxy class
* given a class loader and an array of interfaces. The proxy class
...
...
@@ -346,6 +412,51 @@ public class Proxy implements java.io.Serializable {
Class
<?>...
interfaces
)
throws
IllegalArgumentException
{
return
getProxyClass0
(
loader
,
interfaces
);
// stack walk magic: do not refactor
}
private
static
void
checkProxyLoader
(
ClassLoader
ccl
,
ClassLoader
loader
)
{
SecurityManager
sm
=
System
.
getSecurityManager
();
if
(
sm
!=
null
)
{
if
(
loader
==
null
&&
ccl
!=
null
)
{
if
(!
ProxyAccessHelper
.
allowNullLoader
)
{
sm
.
checkPermission
(
SecurityConstants
.
GET_CLASSLOADER_PERMISSION
);
}
}
}
}
/*
* Generate a proxy class (caller-sensitive).
*
* To define a proxy class, it performs the access checks as in
* Class.forName (VM will invoke ClassLoader.checkPackageAccess):
* 1. "getClassLoader" permission check if loader == null
* 2. checkPackageAccess on the interfaces it implements
*
* To get a constructor and new instance of a proxy class, it performs
* the package access check on the interfaces it implements
* as in Class.getConstructor.
*
* If an interface is non-public, the proxy class must be defined by
* the defining loader of the interface. If the caller's class loader
* is not the same as the defining loader of the interface, the VM
* will throw IllegalAccessError when the generated proxy class is
* being defined via the defineClass0 method.
*/
private
static
Class
<?>
getProxyClass0
(
ClassLoader
loader
,
Class
<?>...
interfaces
)
{
SecurityManager
sm
=
System
.
getSecurityManager
();
if
(
sm
!=
null
)
{
final
int
CALLER_FRAME
=
3
;
// 0: Reflection, 1: getProxyClass0 2: Proxy 3: caller
final
Class
<?>
caller
=
Reflection
.
getCallerClass
(
CALLER_FRAME
);
final
ClassLoader
ccl
=
caller
.
getClassLoader
();
checkProxyLoader
(
ccl
,
loader
);
ReflectUtil
.
checkProxyPackageAccess
(
ccl
,
interfaces
);
}
if
(
interfaces
.
length
>
65535
)
{
throw
new
IllegalArgumentException
(
"interface limit exceeded"
);
}
...
...
@@ -497,8 +608,9 @@ public class Proxy implements java.io.Serializable {
}
}
if
(
proxyPkg
==
null
)
{
// if no non-public proxy interfaces,
proxyPkg
=
""
;
// use the unnamed package
if
(
proxyPkg
==
null
)
{
// if no non-public proxy interfaces, use com.sun.proxy package
proxyPkg
=
ReflectUtil
.
PROXY_PACKAGE
+
"."
;
}
{
...
...
@@ -598,19 +710,43 @@ public class Proxy implements java.io.Serializable {
/*
* Look up or generate the designated proxy class.
*/
Class
<?>
cl
=
getProxyClass
(
loader
,
interfaces
);
Class
<?>
cl
=
getProxyClass
0
(
loader
,
interfaces
);
// stack walk magic: do not refactor
/*
* Invoke its constructor with the designated invocation handler.
*/
try
{
Constructor
<?>
cons
=
cl
.
getConstructor
(
constructorParams
);
return
cons
.
newInstance
(
new
Object
[]
{
h
});
}
catch
(
NoSuchMethodException
|
IllegalAccessException
|
InstantiationException
|
InvocationTargetException
e
)
{
final
Constructor
<?>
cons
=
cl
.
getConstructor
(
constructorParams
);
final
InvocationHandler
ih
=
h
;
SecurityManager
sm
=
System
.
getSecurityManager
();
if
(
sm
!=
null
&&
ProxyAccessHelper
.
needsNewInstanceCheck
(
cl
))
{
// create proxy instance with doPrivilege as the proxy class may
// implement non-public interfaces that requires a special permission
return
AccessController
.
doPrivileged
(
new
PrivilegedAction
<
Object
>()
{
public
Object
run
()
{
return
newInstance
(
cons
,
ih
);
}
});
}
else
{
return
newInstance
(
cons
,
ih
);
}
}
catch
(
NoSuchMethodException
e
)
{
throw
new
InternalError
(
e
.
toString
(),
e
);
}
}
private
static
Object
newInstance
(
Constructor
<?>
cons
,
InvocationHandler
h
)
{
try
{
return
cons
.
newInstance
(
new
Object
[]
{
h
}
);
}
catch
(
IllegalAccessException
|
InstantiationException
e
)
{
throw
new
InternalError
(
e
.
toString
(),
e
);
}
catch
(
InvocationTargetException
e
)
{
Throwable
t
=
e
.
getCause
();
if
(
t
instanceof
RuntimeException
)
{
throw
(
RuntimeException
)
t
;
}
else
{
throw
new
InternalError
(
t
.
toString
(),
t
);
}
}
}
...
...
src/share/classes/java/net/InetSocketAddress.java
浏览文件 @
e06c9d77
/*
* Copyright (c) 2000, 20
07
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2000, 20
12
, 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,9 +24,12 @@
*/
package
java.net
;
import
java.io.ObjectInputStream
;
import
java.io.IOException
;
import
java.io.InvalidObjectException
;
import
java.io.ObjectInputStream
;
import
java.io.ObjectOutputStream
;
import
java.io.ObjectStreamException
;
import
java.io.ObjectStreamField
;
/**
*
...
...
@@ -46,23 +49,105 @@ import java.io.InvalidObjectException;
* @see java.net.ServerSocket
* @since 1.4
*/
public
class
InetSocketAddress
extends
SocketAddress
{
/* The hostname of the Socket Address
* @serial
*/
private
String
hostname
=
null
;
/* The IP address of the Socket Address
* @serial
*/
private
InetAddress
addr
=
null
;
/* The port number of the Socket Address
* @serial
*/
private
int
port
;
public
class
InetSocketAddress
extends
SocketAddress
{
// Private implementation class pointed to by all public methods.
private
static
class
InetSocketAddressHolder
{
// The hostname of the Socket Address
private
String
hostname
;
// The IP address of the Socket Address
private
InetAddress
addr
;
// The port number of the Socket Address
private
int
port
;
private
InetSocketAddressHolder
(
String
hostname
,
InetAddress
addr
,
int
port
)
{
this
.
hostname
=
hostname
;
this
.
addr
=
addr
;
this
.
port
=
port
;
}
private
int
getPort
()
{
return
port
;
}
private
InetAddress
getAddress
()
{
return
addr
;
}
private
String
getHostName
()
{
if
(
hostname
!=
null
)
return
hostname
;
if
(
addr
!=
null
)
return
addr
.
getHostName
();
return
null
;
}
private
String
getHostString
()
{
if
(
hostname
!=
null
)
return
hostname
;
if
(
addr
!=
null
)
{
if
(
addr
.
hostName
!=
null
)
return
addr
.
hostName
;
else
return
addr
.
getHostAddress
();
}
return
null
;
}
private
boolean
isUnresolved
()
{
return
addr
==
null
;
}
@Override
public
String
toString
()
{
if
(
isUnresolved
())
{
return
hostname
+
":"
+
port
;
}
else
{
return
addr
.
toString
()
+
":"
+
port
;
}
}
@Override
public
final
boolean
equals
(
Object
obj
)
{
if
(
obj
==
null
||
!(
obj
instanceof
InetSocketAddressHolder
))
return
false
;
InetSocketAddressHolder
that
=
(
InetSocketAddressHolder
)
obj
;
boolean
sameIP
;
if
(
addr
!=
null
)
sameIP
=
addr
.
equals
(
that
.
addr
);
else
if
(
hostname
!=
null
)
sameIP
=
(
that
.
addr
==
null
)
&&
hostname
.
equalsIgnoreCase
(
that
.
hostname
);
else
sameIP
=
(
that
.
addr
==
null
)
&&
(
that
.
hostname
==
null
);
return
sameIP
&&
(
port
==
that
.
port
);
}
@Override
public
final
int
hashCode
()
{
if
(
addr
!=
null
)
return
addr
.
hashCode
()
+
port
;
if
(
hostname
!=
null
)
return
hostname
.
toLowerCase
().
hashCode
()
+
port
;
return
port
;
}
}
private
final
transient
InetSocketAddressHolder
holder
;
private
static
final
long
serialVersionUID
=
5076001401234631237L
;
private
InetSocketAddress
()
{
private
static
int
checkPort
(
int
port
)
{
if
(
port
<
0
||
port
>
0xFFFF
)
throw
new
IllegalArgumentException
(
"port out of range:"
+
port
);
return
port
;
}
private
static
String
checkHost
(
String
hostname
)
{
if
(
hostname
==
null
)
throw
new
IllegalArgumentException
(
"hostname can't be null"
);
return
hostname
;
}
/**
...
...
@@ -97,14 +182,10 @@ public class InetSocketAddress extends SocketAddress {
* range of valid port values.
*/
public
InetSocketAddress
(
InetAddress
addr
,
int
port
)
{
if
(
port
<
0
||
port
>
0xFFFF
)
{
throw
new
IllegalArgumentException
(
"port out of range:"
+
port
);
}
this
.
port
=
port
;
if
(
addr
==
null
)
this
.
addr
=
InetAddress
.
anyLocalAddress
();
else
this
.
addr
=
addr
;
holder
=
new
InetSocketAddressHolder
(
null
,
addr
==
null
?
InetAddress
.
anyLocalAddress
()
:
addr
,
checkPort
(
port
));
}
/**
...
...
@@ -132,19 +213,20 @@ public class InetSocketAddress extends SocketAddress {
* @see #isUnresolved()
*/
public
InetSocketAddress
(
String
hostname
,
int
port
)
{
if
(
port
<
0
||
port
>
0xFFFF
)
{
throw
new
IllegalArgumentException
(
"port out of range:"
+
port
);
}
if
(
hostname
==
null
)
{
throw
new
IllegalArgumentException
(
"hostname can't be null"
);
}
checkHost
(
hostname
);
InetAddress
addr
=
null
;
String
host
=
null
;
try
{
addr
=
InetAddress
.
getByName
(
hostname
);
}
catch
(
UnknownHostException
e
)
{
this
.
hostname
=
hostname
;
addr
=
null
;
host
=
hostname
;
}
this
.
port
=
port
;
holder
=
new
InetSocketAddressHolder
(
host
,
addr
,
checkPort
(
port
));
}
// private constructor for creating unresolved instances
private
InetSocketAddress
(
int
port
,
String
hostname
)
{
holder
=
new
InetSocketAddressHolder
(
hostname
,
null
,
port
);
}
/**
...
...
@@ -169,31 +251,67 @@ public class InetSocketAddress extends SocketAddress {
* @since 1.5
*/
public
static
InetSocketAddress
createUnresolved
(
String
host
,
int
port
)
{
if
(
port
<
0
||
port
>
0xFFFF
)
{
throw
new
IllegalArgumentException
(
"port out of range:"
+
port
);
}
if
(
host
==
null
)
{
throw
new
IllegalArgumentException
(
"hostname can't be null"
);
}
InetSocketAddress
s
=
new
InetSocketAddress
();
s
.
port
=
port
;
s
.
hostname
=
host
;
s
.
addr
=
null
;
return
s
;
return
new
InetSocketAddress
(
checkPort
(
port
),
checkHost
(
host
));
}
private
void
readObject
(
ObjectInputStream
s
)
throws
IOException
,
ClassNotFoundException
{
s
.
defaultReadObject
();
/**
* @serialField hostname String
* @serialField addr InetAddress
* @serialField port int
*/
private
static
final
ObjectStreamField
[]
serialPersistentFields
=
{
new
ObjectStreamField
(
"hostname"
,
String
.
class
),
new
ObjectStreamField
(
"addr"
,
InetAddress
.
class
),
new
ObjectStreamField
(
"port"
,
int
.
class
)};
private
void
writeObject
(
ObjectOutputStream
out
)
throws
IOException
{
// Don't call defaultWriteObject()
ObjectOutputStream
.
PutField
pfields
=
out
.
putFields
();
pfields
.
put
(
"hostname"
,
holder
.
hostname
);
pfields
.
put
(
"addr"
,
holder
.
addr
);
pfields
.
put
(
"port"
,
holder
.
port
);
out
.
writeFields
();
}
// Check that our invariants are satisfied
if
(
port
<
0
||
port
>
0xFFFF
)
{
throw
new
InvalidObjectException
(
"port out of range:"
+
port
);
}
private
void
readObject
(
ObjectInputStream
in
)
throws
IOException
,
ClassNotFoundException
{
// Don't call defaultReadObject()
ObjectInputStream
.
GetField
oisFields
=
in
.
readFields
();
final
String
oisHostname
=
(
String
)
oisFields
.
get
(
"hostname"
,
null
);
final
InetAddress
oisAddr
=
(
InetAddress
)
oisFields
.
get
(
"addr"
,
null
);
final
int
oisPort
=
oisFields
.
get
(
"port"
,
-
1
);
if
(
hostname
==
null
&&
addr
==
null
)
{
// Check that our invariants are satisfied
checkPort
(
oisPort
);
if
(
oisHostname
==
null
&&
oisAddr
==
null
)
throw
new
InvalidObjectException
(
"hostname and addr "
+
"can't both be null"
);
InetSocketAddressHolder
h
=
new
InetSocketAddressHolder
(
oisHostname
,
oisAddr
,
oisPort
);
UNSAFE
.
putObject
(
this
,
FIELDS_OFFSET
,
h
);
}
private
void
readObjectNoData
()
throws
ObjectStreamException
{
throw
new
InvalidObjectException
(
"Stream data required"
);
}
private
static
final
long
FIELDS_OFFSET
;
private
static
final
sun
.
misc
.
Unsafe
UNSAFE
;
static
{
try
{
sun
.
misc
.
Unsafe
unsafe
=
sun
.
misc
.
Unsafe
.
getUnsafe
();
FIELDS_OFFSET
=
unsafe
.
objectFieldOffset
(
InetSocketAddress
.
class
.
getDeclaredField
(
"holder"
));
UNSAFE
=
unsafe
;
}
catch
(
ReflectiveOperationException
e
)
{
throw
new
Error
(
e
);
}
}
...
...
@@ -203,7 +321,7 @@ public class InetSocketAddress extends SocketAddress {
* @return the port number.
*/
public
final
int
getPort
()
{
return
port
;
return
holder
.
getPort
()
;
}
/**
...
...
@@ -213,7 +331,7 @@ public class InetSocketAddress extends SocketAddress {
* @return the InetAdress or <code>null</code> if it is unresolved.
*/
public
final
InetAddress
getAddress
()
{
return
addr
;
return
holder
.
getAddress
()
;
}
/**
...
...
@@ -224,31 +342,19 @@ public class InetSocketAddress extends SocketAddress {
* @return the hostname part of the address.
*/
public
final
String
getHostName
()
{
if
(
hostname
!=
null
)
return
hostname
;
if
(
addr
!=
null
)
return
addr
.
getHostName
();
return
null
;
return
holder
.
getHostName
();
}
/**
* Returns the hostname, or the String form of the address if it
* doesn't have a hostname (it was created using a literal).
* This has the benefit of <b>not</b> attempti
m
g a reverse lookup.
* This has the benefit of <b>not</b> attempti
n
g a reverse lookup.
*
* @return the hostname, or String representation of the address.
* @since 1.7
*/
public
final
String
getHostString
()
{
if
(
hostname
!=
null
)
return
hostname
;
if
(
addr
!=
null
)
{
if
(
addr
.
hostName
!=
null
)
return
addr
.
hostName
;
else
return
addr
.
getHostAddress
();
}
return
null
;
return
holder
.
getHostString
();
}
/**
...
...
@@ -258,7 +364,7 @@ public class InetSocketAddress extends SocketAddress {
* an <code>InetAddress</code>.
*/
public
final
boolean
isUnresolved
()
{
return
addr
==
null
;
return
holder
.
isUnresolved
()
;
}
/**
...
...
@@ -269,12 +375,9 @@ public class InetSocketAddress extends SocketAddress {
*
* @return a string representation of this object.
*/
@Override
public
String
toString
()
{
if
(
isUnresolved
())
{
return
hostname
+
":"
+
port
;
}
else
{
return
addr
.
toString
()
+
":"
+
port
;
}
return
holder
.
toString
();
}
/**
...
...
@@ -297,19 +400,11 @@ public class InetSocketAddress extends SocketAddress {
* <code>false</code> otherwise.
* @see java.net.InetAddress#equals(java.lang.Object)
*/
@Override
public
final
boolean
equals
(
Object
obj
)
{
if
(
obj
==
null
||
!(
obj
instanceof
InetSocketAddress
))
return
false
;
InetSocketAddress
sockAddr
=
(
InetSocketAddress
)
obj
;
boolean
sameIP
=
false
;
if
(
this
.
addr
!=
null
)
sameIP
=
this
.
addr
.
equals
(
sockAddr
.
addr
);
else
if
(
this
.
hostname
!=
null
)
sameIP
=
(
sockAddr
.
addr
==
null
)
&&
this
.
hostname
.
equalsIgnoreCase
(
sockAddr
.
hostname
);
else
sameIP
=
(
sockAddr
.
addr
==
null
)
&&
(
sockAddr
.
hostname
==
null
);
return
sameIP
&&
(
this
.
port
==
sockAddr
.
port
);
return
holder
.
equals
(((
InetSocketAddress
)
obj
).
holder
);
}
/**
...
...
@@ -317,11 +412,8 @@ public class InetSocketAddress extends SocketAddress {
*
* @return a hash code value for this socket address.
*/
@Override
public
final
int
hashCode
()
{
if
(
addr
!=
null
)
return
addr
.
hashCode
()
+
port
;
if
(
hostname
!=
null
)
return
hostname
.
toLowerCase
().
hashCode
()
+
port
;
return
port
;
return
holder
.
hashCode
();
}
}
src/share/classes/java/util/concurrent/ThreadPoolExecutor.java
浏览文件 @
e06c9d77
...
...
@@ -34,8 +34,10 @@
*/
package
java.util.concurrent
;
import
java.util.concurrent.locks.*
;
import
java.util.concurrent.atomic.*
;
import
java.util.concurrent.locks.AbstractQueuedSynchronizer
;
import
java.util.concurrent.locks.Condition
;
import
java.util.concurrent.locks.ReentrantLock
;
import
java.util.concurrent.atomic.AtomicInteger
;
import
java.util.*
;
/**
...
...
@@ -491,10 +493,15 @@ public class ThreadPoolExecutor extends AbstractExecutorService {
* policy limiting the number of threads. Even though it is not
* treated as an error, failure to create threads may result in
* new tasks being rejected or existing ones remaining stuck in
* the queue. On the other hand, no special precautions exist to
* handle OutOfMemoryErrors that might be thrown while trying to
* create threads, since there is generally no recourse from
* within this class.
* the queue.
*
* We go further and preserve pool invariants even in the face of
* errors such as OutOfMemoryError, that might be thrown while
* trying to create threads. Such errors are rather common due to
* the need to allocate a native stack in Thread#start, and users
* will want to perform clean pool shutdown to clean up. There
* will likely be enough memory available for the cleanup code to
* complete without encountering yet another OutOfMemoryError.
*/
private
volatile
ThreadFactory
threadFactory
;
...
...
@@ -568,9 +575,13 @@ public class ThreadPoolExecutor extends AbstractExecutorService {
* task execution. This protects against interrupts that are
* intended to wake up a worker thread waiting for a task from
* instead interrupting a task being run. We implement a simple
* non-reentrant mutual exclusion lock rather than use ReentrantLock
* because we do not want worker tasks to be able to reacquire the
* lock when they invoke pool control methods like setCorePoolSize.
* non-reentrant mutual exclusion lock rather than use
* ReentrantLock because we do not want worker tasks to be able to
* reacquire the lock when they invoke pool control methods like
* setCorePoolSize. Additionally, to suppress interrupts until
* the thread actually starts running tasks, we initialize lock
* state to a negative value, and clear it upon start (in
* runWorker).
*/
private
final
class
Worker
extends
AbstractQueuedSynchronizer
...
...
@@ -594,6 +605,7 @@ public class ThreadPoolExecutor extends AbstractExecutorService {
* @param firstTask the first task (null if none)
*/
Worker
(
Runnable
firstTask
)
{
setState
(-
1
);
// inhibit interrupts until runWorker
this
.
firstTask
=
firstTask
;
this
.
thread
=
getThreadFactory
().
newThread
(
this
);
}
...
...
@@ -609,7 +621,7 @@ public class ThreadPoolExecutor extends AbstractExecutorService {
// The value 1 represents the locked state.
protected
boolean
isHeldExclusively
()
{
return
getState
()
==
1
;
return
getState
()
!=
0
;
}
protected
boolean
tryAcquire
(
int
unused
)
{
...
...
@@ -630,6 +642,16 @@ public class ThreadPoolExecutor extends AbstractExecutorService {
public
boolean
tryLock
()
{
return
tryAcquire
(
1
);
}
public
void
unlock
()
{
release
(
1
);
}
public
boolean
isLocked
()
{
return
isHeldExclusively
();
}
void
interruptIfStarted
()
{
Thread
t
;
if
(
getState
()
>=
0
&&
(
t
=
thread
)
!=
null
&&
!
t
.
isInterrupted
())
{
try
{
t
.
interrupt
();
}
catch
(
SecurityException
ignore
)
{
}
}
}
}
/*
...
...
@@ -728,12 +750,8 @@ public class ThreadPoolExecutor extends AbstractExecutorService {
final
ReentrantLock
mainLock
=
this
.
mainLock
;
mainLock
.
lock
();
try
{
for
(
Worker
w
:
workers
)
{
try
{
w
.
thread
.
interrupt
();
}
catch
(
SecurityException
ignore
)
{
}
}
for
(
Worker
w
:
workers
)
w
.
interruptIfStarted
();
}
finally
{
mainLock
.
unlock
();
}
...
...
@@ -790,19 +808,6 @@ public class ThreadPoolExecutor extends AbstractExecutorService {
private
static
final
boolean
ONLY_ONE
=
true
;
/**
* Ensures that unless the pool is stopping, the current thread
* does not have its interrupt set. This requires a double-check
* of state in case the interrupt was cleared concurrently with a
* shutdownNow -- if so, the interrupt is re-enabled.
*/
private
void
clearInterruptsForTaskRun
()
{
if
(
runStateLessThan
(
ctl
.
get
(),
STOP
)
&&
Thread
.
interrupted
()
&&
runStateAtLeast
(
ctl
.
get
(),
STOP
))
Thread
.
currentThread
().
interrupt
();
}
/*
* Misc utilities, most of which are also exported to
* ScheduledThreadPoolExecutor
...
...
@@ -862,12 +867,13 @@ public class ThreadPoolExecutor extends AbstractExecutorService {
* Checks if a new worker can be added with respect to current
* pool state and the given bound (either core or maximum). If so,
* the worker count is adjusted accordingly, and, if possible, a
* new worker is created and started running firstTask as its
* new worker is created and started
,
running firstTask as its
* first task. This method returns false if the pool is stopped or
* eligible to shut down. It also returns false if the thread
* factory fails to create a thread when asked, which requires a
* backout of workerCount, and a recheck for termination, in case
* the existence of this worker was holding up termination.
* factory fails to create a thread when asked. If the thread
* creation fails, either due to the thread factory returning
* null, or due to an exception (typically OutOfMemoryError in
* Thread#start), we roll back cleanly.
*
* @param firstTask the task the new thread should run first (or
* null if none). Workers are created with an initial first task
...
...
@@ -910,46 +916,65 @@ public class ThreadPoolExecutor extends AbstractExecutorService {
}
}
Worker
w
=
new
Worker
(
firstTask
);
Thread
t
=
w
.
thread
;
boolean
workerStarted
=
false
;
boolean
workerAdded
=
false
;
Worker
w
=
null
;
try
{
final
ReentrantLock
mainLock
=
this
.
mainLock
;
w
=
new
Worker
(
firstTask
);
final
Thread
t
=
w
.
thread
;
if
(
t
!=
null
)
{
mainLock
.
lock
();
try
{
// Recheck while holding lock.
// Back out on ThreadFactory failure or if
// shut down before lock acquired.
int
c
=
ctl
.
get
();
int
rs
=
runStateOf
(
c
);
if
(
rs
<
SHUTDOWN
||
(
rs
==
SHUTDOWN
&&
firstTask
==
null
))
{
if
(
t
.
isAlive
())
// precheck that t is startable
throw
new
IllegalThreadStateException
();
workers
.
add
(
w
);
int
s
=
workers
.
size
();
if
(
s
>
largestPoolSize
)
largestPoolSize
=
s
;
workerAdded
=
true
;
}
}
finally
{
mainLock
.
unlock
();
}
if
(
workerAdded
)
{
t
.
start
();
workerStarted
=
true
;
}
}
}
finally
{
if
(!
workerStarted
)
addWorkerFailed
(
w
);
}
return
workerStarted
;
}
/**
* Rolls back the worker thread creation.
* - removes worker from workers, if present
* - decrements worker count
* - rechecks for termination, in case the existence of this
* worker was holding up termination
*/
private
void
addWorkerFailed
(
Worker
w
)
{
final
ReentrantLock
mainLock
=
this
.
mainLock
;
mainLock
.
lock
();
try
{
// Recheck while holding lock.
// Back out on ThreadFactory failure or if
// shut down before lock acquired.
int
c
=
ctl
.
get
();
int
rs
=
runStateOf
(
c
);
if
(
t
==
null
||
(
rs
>=
SHUTDOWN
&&
!
(
rs
==
SHUTDOWN
&&
firstTask
==
null
)))
{
decrementWorkerCount
();
tryTerminate
();
return
false
;
}
workers
.
add
(
w
);
int
s
=
workers
.
size
();
if
(
s
>
largestPoolSize
)
largestPoolSize
=
s
;
if
(
w
!=
null
)
workers
.
remove
(
w
);
decrementWorkerCount
();
tryTerminate
();
}
finally
{
mainLock
.
unlock
();
}
t
.
start
();
// It is possible (but unlikely) for a thread to have been
// added to workers, but not yet started, during transition to
// STOP, which could result in a rare missed interrupt,
// because Thread.interrupt is not guaranteed to have any effect
// on a non-yet-started Thread (see Thread#interrupt).
if
(
runStateOf
(
ctl
.
get
())
==
STOP
&&
!
t
.
isInterrupted
())
t
.
interrupt
();
return
true
;
}
/**
...
...
@@ -1096,15 +1121,25 @@ public class ThreadPoolExecutor extends AbstractExecutorService {
* @param w the worker
*/
final
void
runWorker
(
Worker
w
)
{
Thread
wt
=
Thread
.
currentThread
();
Runnable
task
=
w
.
firstTask
;
w
.
firstTask
=
null
;
w
.
unlock
();
// allow interrupts
boolean
completedAbruptly
=
true
;
try
{
while
(
task
!=
null
||
(
task
=
getTask
())
!=
null
)
{
w
.
lock
();
clearInterruptsForTaskRun
();
// If pool is stopping, ensure thread is interrupted;
// if not, ensure thread is not interrupted. This
// requires a recheck in second case to deal with
// shutdownNow race while clearing interrupt
if
((
runStateAtLeast
(
ctl
.
get
(),
STOP
)
||
(
Thread
.
interrupted
()
&&
runStateAtLeast
(
ctl
.
get
(),
STOP
)))
&&
!
wt
.
isInterrupted
())
wt
.
interrupt
();
try
{
beforeExecute
(
w
.
thread
,
task
);
beforeExecute
(
w
t
,
task
);
Throwable
thrown
=
null
;
try
{
task
.
run
();
...
...
@@ -2064,3 +2099,4 @@ public class ThreadPoolExecutor extends AbstractExecutorService {
}
}
}
src/share/classes/java/util/jar/JarFile.java
浏览文件 @
e06c9d77
...
...
@@ -34,6 +34,7 @@ import java.security.CodeSigner;
import
java.security.cert.Certificate
;
import
java.security.AccessController
;
import
java.security.CodeSource
;
import
sun.misc.IOUtils
;
import
sun.security.action.GetPropertyAction
;
import
sun.security.util.ManifestEntryVerifier
;
import
sun.misc.SharedSecrets
;
...
...
@@ -334,6 +335,9 @@ class JarFile extends ZipFile {
if
(
names
!=
null
)
{
for
(
int
i
=
0
;
i
<
names
.
length
;
i
++)
{
JarEntry
e
=
getJarEntry
(
names
[
i
]);
if
(
e
==
null
)
{
throw
new
JarException
(
"corrupted jar file"
);
}
if
(!
e
.
isDirectory
())
{
if
(
mev
==
null
)
{
mev
=
new
ManifestEntryVerifier
...
...
@@ -353,6 +357,10 @@ class JarFile extends ZipFile {
// treat the jar file as being unsigned
jv
=
null
;
verify
=
false
;
if
(
JarVerifier
.
debug
!=
null
)
{
JarVerifier
.
debug
.
println
(
"jarfile parsing error!"
);
ex
.
printStackTrace
();
}
}
// if after initializing the verifier we have nothing
...
...
@@ -380,11 +388,9 @@ class JarFile extends ZipFile {
* META-INF files.
*/
private
byte
[]
getBytes
(
ZipEntry
ze
)
throws
IOException
{
byte
[]
b
=
new
byte
[(
int
)
ze
.
getSize
()];
try
(
DataInputStream
is
=
new
DataInputStream
(
super
.
getInputStream
(
ze
)))
{
is
.
readFully
(
b
,
0
,
b
.
length
);
try
(
InputStream
is
=
super
.
getInputStream
(
ze
))
{
return
IOUtils
.
readFully
(
is
,
(
int
)
ze
.
getSize
(),
true
);
}
return
b
;
}
/**
...
...
@@ -540,11 +546,7 @@ class JarFile extends ZipFile {
if
(!
isKnownNotToHaveSpecialAttributes
())
{
JarEntry
manEntry
=
getManEntry
();
if
(
manEntry
!=
null
)
{
byte
[]
b
=
new
byte
[(
int
)
manEntry
.
getSize
()];
try
(
DataInputStream
dis
=
new
DataInputStream
(
super
.
getInputStream
(
manEntry
)))
{
dis
.
readFully
(
b
,
0
,
b
.
length
);
}
byte
[]
b
=
getBytes
(
manEntry
);
if
(
match
(
CLASSPATH_CHARS
,
b
,
CLASSPATH_LASTOCC
,
CLASSPATH_OPTOSFT
))
hasClassPathAttribute
=
true
;
if
(
match
(
PROFILE_CHARS
,
b
,
PROFILE_LASTOCC
,
PROFILE_OPTOSFT
))
...
...
src/share/classes/java/util/logging/Level.java
浏览文件 @
e06c9d77
...
...
@@ -24,6 +24,10 @@
*/
package
java.util.logging
;
import
java.util.ArrayList
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.ResourceBundle
;
/**
...
...
@@ -59,7 +63,6 @@ import java.util.ResourceBundle;
*/
public
class
Level
implements
java
.
io
.
Serializable
{
private
static
java
.
util
.
ArrayList
<
Level
>
known
=
new
java
.
util
.
ArrayList
<>();
private
static
String
defaultBundle
=
"sun.util.logging.resources.logging"
;
/**
...
...
@@ -77,6 +80,9 @@ public class Level implements java.io.Serializable {
*/
private
final
String
resourceBundleName
;
// localized level name
private
String
localizedLevelName
;
/**
* OFF is a special level that can be used to turn off logging.
* This level is initialized to <CODE>Integer.MAX_VALUE</CODE>.
...
...
@@ -202,9 +208,8 @@ public class Level implements java.io.Serializable {
this
.
name
=
name
;
this
.
value
=
value
;
this
.
resourceBundleName
=
resourceBundleName
;
synchronized
(
Level
.
class
)
{
known
.
add
(
this
);
}
this
.
localizedLevelName
=
resourceBundleName
==
null
?
name
:
null
;
KnownLevel
.
add
(
this
);
}
/**
...
...
@@ -236,12 +241,76 @@ public class Level implements java.io.Serializable {
* @return localized name
*/
public
String
getLocalizedName
()
{
return
getLocalizedLevelName
();
}
// package-private getLevelName() is used by the implementation
// instead of getName() to avoid calling the subclass's version
final
String
getLevelName
()
{
return
this
.
name
;
}
final
synchronized
String
getLocalizedLevelName
()
{
if
(
localizedLevelName
!=
null
)
{
return
localizedLevelName
;
}
try
{
ResourceBundle
rb
=
ResourceBundle
.
getBundle
(
resourceBundleName
);
return
rb
.
getString
(
name
);
localizedLevelName
=
rb
.
getString
(
name
);
}
catch
(
Exception
ex
)
{
return
name
;
localizedLevelName
=
name
;
}
return
localizedLevelName
;
}
// Returns a mirrored Level object that matches the given name as
// specified in the Level.parse method. Returns null if not found.
//
// It returns the same Level object as the one returned by Level.parse
// method if the given name is a non-localized name or integer.
//
// If the name is a localized name, findLevel and parse method may
// return a different level value if there is a custom Level subclass
// that overrides Level.getLocalizedName() to return a different string
// than what's returned by the default implementation.
//
static
Level
findLevel
(
String
name
)
{
if
(
name
==
null
)
{
throw
new
NullPointerException
();
}
KnownLevel
level
;
// Look for a known Level with the given non-localized name.
level
=
KnownLevel
.
findByName
(
name
);
if
(
level
!=
null
)
{
return
level
.
mirroredLevel
;
}
// Now, check if the given name is an integer. If so,
// first look for a Level with the given value and then
// if necessary create one.
try
{
int
x
=
Integer
.
parseInt
(
name
);
level
=
KnownLevel
.
findByValue
(
x
);
if
(
level
==
null
)
{
// add new Level
Level
levelObject
=
new
Level
(
name
,
x
);
level
=
KnownLevel
.
findByValue
(
x
);
}
return
level
.
mirroredLevel
;
}
catch
(
NumberFormatException
ex
)
{
// Not an integer.
// Drop through.
}
level
=
KnownLevel
.
findByLocalizedLevelName
(
name
);
if
(
level
!=
null
)
{
return
level
.
mirroredLevel
;
}
return
null
;
}
/**
...
...
@@ -268,21 +337,15 @@ public class Level implements java.io.Serializable {
// Serialization magic to prevent "doppelgangers".
// This is a performance optimization.
private
Object
readResolve
()
{
synchronized
(
Level
.
class
)
{
for
(
int
i
=
0
;
i
<
known
.
size
();
i
++)
{
Level
other
=
known
.
get
(
i
);
if
(
this
.
name
.
equals
(
other
.
name
)
&&
this
.
value
==
other
.
value
&&
(
this
.
resourceBundleName
==
other
.
resourceBundleName
||
(
this
.
resourceBundleName
!=
null
&&
this
.
resourceBundleName
.
equals
(
other
.
resourceBundleName
))))
{
return
other
;
}
}
// Woops. Whoever sent us this object knows
// about a new log level. Add it to our list.
known
.
add
(
this
);
return
this
;
KnownLevel
o
=
KnownLevel
.
matches
(
this
);
if
(
o
!=
null
)
{
return
o
.
levelObject
;
}
// Woops. Whoever sent us this object knows
// about a new log level. Add it to our list.
Level
level
=
new
Level
(
this
.
name
,
this
.
value
,
this
.
resourceBundleName
);
return
level
;
}
/**
...
...
@@ -296,6 +359,7 @@ public class Level implements java.io.Serializable {
* <li> "SEVERE"
* <li> "1000"
* </ul>
*
* @param name string to be parsed
* @throws NullPointerException if the name is null
* @throws IllegalArgumentException if the value is not valid.
...
...
@@ -315,12 +379,12 @@ public class Level implements java.io.Serializable {
// Check that name is not null.
name
.
length
();
KnownLevel
level
;
// Look for a known Level with the given non-localized name.
for
(
int
i
=
0
;
i
<
known
.
size
();
i
++)
{
Level
l
=
known
.
get
(
i
);
if
(
name
.
equals
(
l
.
name
))
{
return
l
;
}
level
=
KnownLevel
.
findByName
(
name
);
if
(
level
!=
null
)
{
return
level
.
levelObject
;
}
// Now, check if the given name is an integer. If so,
...
...
@@ -328,14 +392,13 @@ public class Level implements java.io.Serializable {
// if necessary create one.
try
{
int
x
=
Integer
.
parseInt
(
name
);
for
(
int
i
=
0
;
i
<
known
.
size
();
i
++)
{
Level
l
=
known
.
get
(
i
);
if
(
l
.
value
==
x
)
{
return
l
;
}
level
=
KnownLevel
.
findByValue
(
x
);
if
(
level
==
null
)
{
// add new Level
Level
levelObject
=
new
Level
(
name
,
x
)
;
level
=
KnownLevel
.
findByValue
(
x
);
}
// Create a new Level.
return
new
Level
(
name
,
x
);
return
level
.
levelObject
;
}
catch
(
NumberFormatException
ex
)
{
// Not an integer.
// Drop through.
...
...
@@ -344,11 +407,9 @@ public class Level implements java.io.Serializable {
// Finally, look for a known level with the given localized name,
// in the current default locale.
// This is relatively expensive, but not excessively so.
for
(
int
i
=
0
;
i
<
known
.
size
();
i
++)
{
Level
l
=
known
.
get
(
i
);
if
(
name
.
equals
(
l
.
getLocalizedName
()))
{
return
l
;
}
level
=
KnownLevel
.
findByLocalizedName
(
name
);
if
(
level
!=
null
)
{
return
level
.
levelObject
;
}
// OK, we've tried everything and failed
...
...
@@ -375,4 +436,124 @@ public class Level implements java.io.Serializable {
public
int
hashCode
()
{
return
this
.
value
;
}
// KnownLevel class maintains the global list of all known levels.
// The API allows multiple custom Level instances of the same name/value
// be created. This class provides convenient methods to find a level
// by a given name, by a given value, or by a given localized name.
//
// KnownLevel wraps the following Level objects:
// 1. levelObject: standard Level object or custom Level object
// 2. mirroredLevel: Level object representing the level specified in the
// logging configuration.
//
// Level.getName, Level.getLocalizedName, Level.getResourceBundleName methods
// are non-final but the name and resource bundle name are parameters to
// the Level constructor. Use the mirroredLevel object instead of the
// levelObject to prevent the logging framework to execute foreign code
// implemented by untrusted Level subclass.
//
// Implementation Notes:
// If Level.getName, Level.getLocalizedName, Level.getResourceBundleName methods
// were final, the following KnownLevel implementation can be removed.
// Future API change should take this into consideration.
static
final
class
KnownLevel
{
private
static
Map
<
String
,
List
<
KnownLevel
>>
nameToLevels
=
new
HashMap
<>();
private
static
Map
<
Integer
,
List
<
KnownLevel
>>
intToLevels
=
new
HashMap
<>();
final
Level
levelObject
;
// instance of Level class or Level subclass
final
Level
mirroredLevel
;
// instance of Level class
KnownLevel
(
Level
l
)
{
this
.
levelObject
=
l
;
if
(
l
.
getClass
()
==
Level
.
class
)
{
this
.
mirroredLevel
=
l
;
}
else
{
this
.
mirroredLevel
=
new
Level
(
l
.
name
,
l
.
value
,
l
.
resourceBundleName
);
}
}
static
synchronized
void
add
(
Level
l
)
{
// the mirroredLevel object is always added to the list
// before the custom Level instance
KnownLevel
o
=
new
KnownLevel
(
l
);
List
<
KnownLevel
>
list
=
nameToLevels
.
get
(
l
.
name
);
if
(
list
==
null
)
{
list
=
new
ArrayList
<>();
nameToLevels
.
put
(
l
.
name
,
list
);
}
list
.
add
(
o
);
list
=
intToLevels
.
get
(
l
.
value
);
if
(
list
==
null
)
{
list
=
new
ArrayList
<>();
intToLevels
.
put
(
l
.
value
,
list
);
}
list
.
add
(
o
);
}
// Returns a KnownLevel with the given non-localized name.
static
synchronized
KnownLevel
findByName
(
String
name
)
{
List
<
KnownLevel
>
list
=
nameToLevels
.
get
(
name
);
if
(
list
!=
null
)
{
return
list
.
get
(
0
);
}
return
null
;
}
// Returns a KnownLevel with the given value.
static
synchronized
KnownLevel
findByValue
(
int
value
)
{
List
<
KnownLevel
>
list
=
intToLevels
.
get
(
value
);
if
(
list
!=
null
)
{
return
list
.
get
(
0
);
}
return
null
;
}
// Returns a KnownLevel with the given localized name matching
// by calling the Level.getLocalizedLevelName() method (i.e. found
// from the resourceBundle associated with the Level object).
// This method does not call Level.getLocalizedName() that may
// be overridden in a subclass implementation
static
synchronized
KnownLevel
findByLocalizedLevelName
(
String
name
)
{
for
(
List
<
KnownLevel
>
levels
:
nameToLevels
.
values
())
{
for
(
KnownLevel
l
:
levels
)
{
String
lname
=
l
.
levelObject
.
getLocalizedLevelName
();
if
(
name
.
equals
(
lname
))
{
return
l
;
}
}
}
return
null
;
}
// Returns a KnownLevel with the given localized name matching
// by calling the Level.getLocalizedName() method
static
synchronized
KnownLevel
findByLocalizedName
(
String
name
)
{
for
(
List
<
KnownLevel
>
levels
:
nameToLevels
.
values
())
{
for
(
KnownLevel
l
:
levels
)
{
String
lname
=
l
.
levelObject
.
getLocalizedName
();
if
(
name
.
equals
(
lname
))
{
return
l
;
}
}
}
return
null
;
}
static
synchronized
KnownLevel
matches
(
Level
l
)
{
List
<
KnownLevel
>
list
=
nameToLevels
.
get
(
l
.
name
);
if
(
list
!=
null
)
{
for
(
KnownLevel
level
:
list
)
{
Level
other
=
level
.
mirroredLevel
;
if
(
l
.
value
==
other
.
value
&&
(
l
.
resourceBundleName
==
other
.
resourceBundleName
||
(
l
.
resourceBundleName
!=
null
&&
l
.
resourceBundleName
.
equals
(
other
.
resourceBundleName
))))
{
return
level
;
}
}
}
return
null
;
}
}
}
src/share/classes/java/util/logging/LogManager.java
浏览文件 @
e06c9d77
此差异已折叠。
点击以展开。
src/share/classes/java/util/logging/Logger.java
浏览文件 @
e06c9d77
...
...
@@ -314,6 +314,40 @@ public class Logger {
}
}
// Until all JDK code converted to call sun.util.logging.PlatformLogger
// (see 7054233), we need to determine if Logger.getLogger is to add
// a system logger or user logger.
//
// As an interim solution, if the immediate caller whose caller loader is
// null, we assume it's a system logger and add it to the system context.
// 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
)
{
String
s
=
AccessController
.
doPrivileged
(
new
PrivilegedAction
<
String
>()
{
public
String
run
()
{
return
System
.
getProperty
(
key
);
}
});
return
Boolean
.
valueOf
(
s
);
}
}
private
static
Logger
demandLogger
(
String
name
,
String
resourceBundleName
)
{
LogManager
manager
=
LogManager
.
getLogManager
();
SecurityManager
sm
=
System
.
getSecurityManager
();
if
(
sm
!=
null
&&
!
SystemLoggerHelper
.
disableCallerCheck
)
{
// 0: Reflection 1: Logger.demandLogger 2: Logger.getLogger 3: caller
final
int
SKIP_FRAMES
=
3
;
Class
<?>
caller
=
sun
.
reflect
.
Reflection
.
getCallerClass
(
SKIP_FRAMES
);
if
(
caller
.
getClassLoader
()
==
null
)
{
return
manager
.
demandSystemLogger
(
name
,
resourceBundleName
);
}
}
return
manager
.
demandLogger
(
name
,
resourceBundleName
);
}
/**
* Find or create a logger for a named subsystem. If a logger has
* already been created with the given name it is returned. Otherwise
...
...
@@ -355,8 +389,7 @@ public class Logger {
// would throw an IllegalArgumentException in the second call
// because the wrapper would result in an attempt to replace
// the existing "resourceBundleForFoo" with null.
LogManager
manager
=
LogManager
.
getLogManager
();
return
manager
.
demandLogger
(
name
);
return
demandLogger
(
name
,
null
);
}
/**
...
...
@@ -403,8 +436,7 @@ public class Logger {
// Synchronization is not required here. All synchronization for
// adding a new Logger object is handled by LogManager.addLogger().
public
static
Logger
getLogger
(
String
name
,
String
resourceBundleName
)
{
LogManager
manager
=
LogManager
.
getLogManager
();
Logger
result
=
manager
.
demandLogger
(
name
);
Logger
result
=
demandLogger
(
name
,
resourceBundleName
);
// MissingResourceException or IllegalArgumentException can be
// thrown by setupResourceInfo().
...
...
@@ -412,6 +444,17 @@ public class Logger {
return
result
;
}
// package-private
// Add a platform logger to the system context.
// i.e. caller of sun.util.logging.PlatformLogger.getLogger
static
Logger
getPlatformLogger
(
String
name
)
{
LogManager
manager
=
LogManager
.
getLogManager
();
// all loggers in the system context will default to
// the system logger's resource bundle
Logger
result
=
manager
.
demandSystemLogger
(
name
,
SYSTEM_LOGGER_RB_NAME
);
return
result
;
}
/**
* Create an anonymous Logger. The newly created Logger is not
...
...
@@ -564,7 +607,7 @@ public class Logger {
private
void
doLog
(
LogRecord
lr
)
{
lr
.
setLoggerName
(
name
);
String
ebname
=
getEffectiveResourceBundleName
();
if
(
ebname
!=
null
)
{
if
(
ebname
!=
null
&&
!
ebname
.
equals
(
SYSTEM_LOGGER_RB_NAME
)
)
{
lr
.
setResourceBundleName
(
ebname
);
lr
.
setResourceBundle
(
findResourceBundle
(
ebname
));
}
...
...
@@ -1547,6 +1590,23 @@ public class Logger {
// May also return null if we can't find the resource bundle and
// there is no suitable previous cached value.
static
final
String
SYSTEM_LOGGER_RB_NAME
=
"sun.util.logging.resources.logging"
;
private
static
ResourceBundle
findSystemResourceBundle
(
final
Locale
locale
)
{
// the resource bundle is in a restricted package
return
AccessController
.
doPrivileged
(
new
PrivilegedAction
<
ResourceBundle
>()
{
public
ResourceBundle
run
()
{
try
{
return
ResourceBundle
.
getBundle
(
SYSTEM_LOGGER_RB_NAME
,
locale
,
ClassLoader
.
getSystemClassLoader
());
}
catch
(
MissingResourceException
e
)
{
throw
new
InternalError
(
e
.
toString
());
}
}
});
}
private
synchronized
ResourceBundle
findResourceBundle
(
String
name
)
{
// Return a null bundle for a null name.
if
(
name
==
null
)
{
...
...
@@ -1561,6 +1621,13 @@ public class Logger {
return
catalog
;
}
if
(
name
.
equals
(
SYSTEM_LOGGER_RB_NAME
))
{
catalog
=
findSystemResourceBundle
(
currentLocale
);
catalogName
=
name
;
catalogLocale
=
currentLocale
;
return
catalog
;
}
// Use the thread's context ClassLoader. If there isn't one,
// use the SystemClassloader.
ClassLoader
cl
=
Thread
.
currentThread
().
getContextClassLoader
();
...
...
@@ -1577,7 +1644,6 @@ public class Logger {
// ClassLoader. Drop through.
}
// Fall back to searching up the call stack and trying each
// calling ClassLoader.
for
(
int
ix
=
0
;
;
ix
++)
{
...
...
src/share/classes/java/util/logging/Logging.java
浏览文件 @
e06c9d77
...
...
@@ -34,7 +34,7 @@ import java.util.ArrayList;
*
* The <tt>LoggingMXBean</tt> interface provides a standard
* method for management access to the individual
*
java.util.Logger
objects available at runtime.
*
{@code Logger}
objects available at runtime.
*
* @author Ron Mann
* @author Mandy Chung
...
...
@@ -75,7 +75,7 @@ class Logging implements LoggingMXBean {
if
(
level
==
null
)
{
return
EMPTY_STRING
;
}
else
{
return
level
.
getName
();
return
level
.
get
Level
Name
();
}
}
...
...
@@ -85,7 +85,6 @@ class Logging implements LoggingMXBean {
}
Logger
logger
=
logManager
.
getLogger
(
loggerName
);
if
(
logger
==
null
)
{
throw
new
IllegalArgumentException
(
"Logger "
+
loggerName
+
"does not exist"
);
...
...
@@ -94,7 +93,10 @@ class Logging implements LoggingMXBean {
Level
level
=
null
;
if
(
levelName
!=
null
)
{
// parse will throw IAE if logLevel is invalid
level
=
Level
.
parse
(
levelName
);
level
=
Level
.
findLevel
(
levelName
);
if
(
level
==
null
)
{
throw
new
IllegalArgumentException
(
"Unknown level \""
+
levelName
+
"\""
);
}
}
logger
.
setLevel
(
level
);
...
...
src/share/classes/java/util/logging/LoggingProxyImpl.java
浏览文件 @
e06c9d77
...
...
@@ -37,7 +37,8 @@ class LoggingProxyImpl implements LoggingProxy {
@Override
public
Object
getLogger
(
String
name
)
{
return
Logger
.
getLogger
(
name
);
// always create a platform logger with the resource bundle name
return
Logger
.
getPlatformLogger
(
name
);
}
@Override
...
...
@@ -92,12 +93,16 @@ class LoggingProxyImpl implements LoggingProxy {
@Override
public
Object
parseLevel
(
String
levelName
)
{
return
Level
.
parse
(
levelName
);
Level
level
=
Level
.
findLevel
(
levelName
);
if
(
level
==
null
)
{
throw
new
IllegalArgumentException
(
"Unknown level \""
+
levelName
+
"\""
);
}
return
level
;
}
@Override
public
String
getLevelName
(
Object
level
)
{
return
((
Level
)
level
).
getName
();
return
((
Level
)
level
).
get
Level
Name
();
}
@Override
...
...
src/share/classes/java/util/logging/SimpleFormatter.java
浏览文件 @
e06c9d77
...
...
@@ -162,7 +162,7 @@ public class SimpleFormatter extends Formatter {
dat
,
source
,
record
.
getLoggerName
(),
record
.
getLevel
().
getLocalizedName
(),
record
.
getLevel
().
getLocalized
Level
Name
(),
message
,
throwable
);
}
...
...
src/share/classes/javax/management/modelmbean/RequiredModelMBean.java
浏览文件 @
e06c9d77
/*
* Copyright (c) 2000, 20
08
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2000, 20
12
, 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
...
...
@@ -39,11 +39,13 @@ import java.io.PrintStream;
import
java.lang.reflect.InvocationTargetException
;
import
java.lang.reflect.Method
;
import
java.security.AccessControlContext
;
import
java.security.AccessController
;
import
java.security.PrivilegedAction
;
import
java.util.Date
;
import
java.util.HashMap
;
import
java.util.HashSet
;
import
java.util.Iterator
;
import
java.util.logging.Level
;
import
java.util.Map
;
import
java.util.Set
;
...
...
@@ -78,6 +80,8 @@ import javax.management.RuntimeErrorException;
import
javax.management.RuntimeOperationsException
;
import
javax.management.ServiceNotFoundException
;
import
javax.management.loading.ClassLoaderRepository
;
import
sun.misc.JavaSecurityAccess
;
import
sun.misc.SharedSecrets
;
import
sun.reflect.misc.MethodUtil
;
import
sun.reflect.misc.ReflectUtil
;
...
...
@@ -138,6 +142,9 @@ public class RequiredModelMBean
private
boolean
registered
=
false
;
private
transient
MBeanServer
server
=
null
;
private
final
static
JavaSecurityAccess
javaSecurityAccess
=
SharedSecrets
.
getJavaSecurityAccess
();
final
private
AccessControlContext
acc
=
AccessController
.
getContext
();
/*************************************/
/* constructors */
/*************************************/
...
...
@@ -1025,10 +1032,31 @@ public class RequiredModelMBean
if
(
opClassName
!=
null
)
{
try
{
final
ClassLoader
targetClassLoader
=
targetObject
.
getClass
().
getClassLoader
();
targetClass
=
Class
.
forName
(
opClassName
,
false
,
targetClassLoader
);
AccessControlContext
stack
=
AccessController
.
getContext
();
final
Object
obj
=
targetObject
;
final
String
className
=
opClassName
;
final
ClassNotFoundException
[]
caughtException
=
new
ClassNotFoundException
[
1
];
targetClass
=
javaSecurityAccess
.
doIntersectionPrivilege
(
new
PrivilegedAction
<
Class
<?>>()
{
@Override
public
Class
<?>
run
()
{
try
{
ReflectUtil
.
checkPackageAccess
(
className
);
final
ClassLoader
targetClassLoader
=
obj
.
getClass
().
getClassLoader
();
return
Class
.
forName
(
className
,
false
,
targetClassLoader
);
}
catch
(
ClassNotFoundException
e
)
{
caughtException
[
0
]
=
e
;
}
return
null
;
}
},
stack
,
acc
);
if
(
caughtException
[
0
]
!=
null
)
{
throw
caughtException
[
0
];
}
}
catch
(
ClassNotFoundException
e
)
{
final
String
msg
=
"class for invoke "
+
opName
+
" not found"
;
...
...
@@ -1061,9 +1089,9 @@ public class RequiredModelMBean
return
result
;
}
private
static
Method
resolveMethod
(
Class
<?>
targetClass
,
private
Method
resolveMethod
(
Class
<?>
targetClass
,
String
opMethodName
,
String
[]
sig
)
final
String
[]
sig
)
throws
ReflectionException
{
final
boolean
tracing
=
MODELMBEAN_LOGGER
.
isLoggable
(
Level
.
FINER
);
...
...
@@ -1078,30 +1106,45 @@ public class RequiredModelMBean
if
(
sig
==
null
)
argClasses
=
null
;
else
{
final
AccessControlContext
stack
=
AccessController
.
getContext
();
final
ReflectionException
[]
caughtException
=
new
ReflectionException
[
1
];
final
ClassLoader
targetClassLoader
=
targetClass
.
getClassLoader
();
argClasses
=
new
Class
<?>[
sig
.
length
];
for
(
int
i
=
0
;
i
<
sig
.
length
;
i
++)
{
if
(
tracing
)
{
MODELMBEAN_LOGGER
.
logp
(
Level
.
FINER
,
RequiredModelMBean
.
class
.
getName
(),
"resolveMethod"
,
"resolve type "
+
sig
[
i
]);
}
argClasses
[
i
]
=
(
Class
<?>)
primitiveClassMap
.
get
(
sig
[
i
]);
if
(
argClasses
[
i
]
==
null
)
{
try
{
argClasses
[
i
]
=
Class
.
forName
(
sig
[
i
],
false
,
targetClassLoader
);
}
catch
(
ClassNotFoundException
e
)
{
javaSecurityAccess
.
doIntersectionPrivilege
(
new
PrivilegedAction
<
Void
>()
{
@Override
public
Void
run
()
{
for
(
int
i
=
0
;
i
<
sig
.
length
;
i
++)
{
if
(
tracing
)
{
MODELMBEAN_LOGGER
.
logp
(
Level
.
FINER
,
RequiredModelMBean
.
class
.
getName
(),
"resolveMethod"
,
"class not found"
);
RequiredModelMBean
.
class
.
getName
(),
"resolveMethod"
,
"resolve type "
+
sig
[
i
]);
}
argClasses
[
i
]
=
(
Class
<?>)
primitiveClassMap
.
get
(
sig
[
i
]);
if
(
argClasses
[
i
]
==
null
)
{
try
{
ReflectUtil
.
checkPackageAccess
(
sig
[
i
]);
argClasses
[
i
]
=
Class
.
forName
(
sig
[
i
],
false
,
targetClassLoader
);
}
catch
(
ClassNotFoundException
e
)
{
if
(
tracing
)
{
MODELMBEAN_LOGGER
.
logp
(
Level
.
FINER
,
RequiredModelMBean
.
class
.
getName
(),
"resolveMethod"
,
"class not found"
);
}
final
String
msg
=
"Parameter class not found"
;
caughtException
[
0
]
=
new
ReflectionException
(
e
,
msg
);
}
}
final
String
msg
=
"Parameter class not found"
;
throw
new
ReflectionException
(
e
,
msg
);
}
return
null
;
}
},
stack
,
acc
);
if
(
caughtException
[
0
]
!=
null
)
{
throw
caughtException
[
0
];
}
}
...
...
@@ -1133,7 +1176,7 @@ public class RequiredModelMBean
/* Find a method in RequiredModelMBean as determined by the given
parameters. Return null if there is none, or if the parameters
exclude using it. Called from invoke. */
private
static
Method
findRMMBMethod
(
String
opMethodName
,
private
Method
findRMMBMethod
(
String
opMethodName
,
Object
targetObjectField
,
String
opClassName
,
String
[]
sig
)
{
...
...
@@ -1155,19 +1198,29 @@ public class RequiredModelMBean
if
(
opClassName
==
null
)
targetClass
=
rmmbClass
;
else
{
try
{
final
ClassLoader
targetClassLoader
=
rmmbClass
.
getClassLoader
();
targetClass
=
Class
.
forName
(
opClassName
,
false
,
targetClassLoader
);
if
(!
rmmbClass
.
isAssignableFrom
(
targetClass
))
return
null
;
}
catch
(
ClassNotFoundException
e
)
{
return
null
;
}
AccessControlContext
stack
=
AccessController
.
getContext
();
final
String
className
=
opClassName
;
targetClass
=
javaSecurityAccess
.
doIntersectionPrivilege
(
new
PrivilegedAction
<
Class
<?>>()
{
@Override
public
Class
<?>
run
()
{
try
{
ReflectUtil
.
checkPackageAccess
(
className
);
final
ClassLoader
targetClassLoader
=
rmmbClass
.
getClassLoader
();
Class
clz
=
Class
.
forName
(
className
,
false
,
targetClassLoader
);
if
(!
rmmbClass
.
isAssignableFrom
(
clz
))
return
null
;
return
clz
;
}
catch
(
ClassNotFoundException
e
)
{
return
null
;
}
}
},
stack
,
acc
);
}
try
{
return
resolveMethod
(
targetClass
,
opMethodName
,
sig
)
;
return
targetClass
!=
null
?
resolveMethod
(
targetClass
,
opMethodName
,
sig
)
:
null
;
}
catch
(
ReflectionException
e
)
{
return
null
;
}
...
...
@@ -1177,12 +1230,35 @@ public class RequiredModelMBean
* Invoke the given method, and throw the somewhat unpredictable
* appropriate exception if the method itself gets an exception.
*/
private
Object
invokeMethod
(
String
opName
,
Method
method
,
Object
targetObject
,
Object
[]
opArgs
)
private
Object
invokeMethod
(
String
opName
,
final
Method
method
,
final
Object
targetObject
,
final
Object
[]
opArgs
)
throws
MBeanException
,
ReflectionException
{
try
{
ReflectUtil
.
checkPackageAccess
(
method
.
getDeclaringClass
());
return
MethodUtil
.
invoke
(
method
,
targetObject
,
opArgs
);
final
Throwable
[]
caughtException
=
new
Throwable
[
1
];
AccessControlContext
stack
=
AccessController
.
getContext
();
Object
rslt
=
javaSecurityAccess
.
doIntersectionPrivilege
(
new
PrivilegedAction
<
Object
>()
{
@Override
public
Object
run
()
{
try
{
ReflectUtil
.
checkPackageAccess
(
method
.
getDeclaringClass
());
return
MethodUtil
.
invoke
(
method
,
targetObject
,
opArgs
);
}
catch
(
InvocationTargetException
e
)
{
caughtException
[
0
]
=
e
;
}
catch
(
IllegalAccessException
e
)
{
caughtException
[
0
]
=
e
;
}
return
null
;
}
},
stack
,
acc
);
if
(
caughtException
[
0
]
!=
null
)
{
if
(
caughtException
[
0
]
instanceof
Exception
)
{
throw
(
Exception
)
caughtException
[
0
];
}
else
if
(
caughtException
[
0
]
instanceof
Error
)
{
throw
(
Error
)
caughtException
[
0
];
}
}
return
rslt
;
}
catch
(
RuntimeErrorException
ree
)
{
throw
new
RuntimeOperationsException
(
ree
,
"RuntimeException occurred in RequiredModelMBean "
+
...
...
@@ -1567,7 +1643,7 @@ public class RequiredModelMBean
}
// make sure response class matches type field
String
respType
=
attrInfo
.
getType
();
final
String
respType
=
attrInfo
.
getType
();
if
(
response
!=
null
)
{
String
responseClass
=
response
.
getClass
().
getName
();
if
(!
respType
.
equals
(
responseClass
))
{
...
...
@@ -1590,9 +1666,31 @@ public class RequiredModelMBean
// inequality may come from type subclassing
boolean
subtype
;
try
{
ClassLoader
cl
=
response
.
getClass
().
getClassLoader
();
Class
<?>
c
=
Class
.
forName
(
respType
,
true
,
cl
);
final
Class
respClass
=
response
.
getClass
();
final
Exception
[]
caughException
=
new
Exception
[
1
];
AccessControlContext
stack
=
AccessController
.
getContext
();
Class
c
=
javaSecurityAccess
.
doIntersectionPrivilege
(
new
PrivilegedAction
<
Class
<?>>()
{
@Override
public
Class
<?>
run
()
{
try
{
ReflectUtil
.
checkPackageAccess
(
respType
);
ClassLoader
cl
=
respClass
.
getClassLoader
();
return
Class
.
forName
(
respType
,
true
,
cl
);
}
catch
(
Exception
e
)
{
caughException
[
0
]
=
e
;
}
return
null
;
}
},
stack
,
acc
);
if
(
caughException
[
0
]
!=
null
)
{
throw
caughException
[
0
];
}
subtype
=
c
.
isInstance
(
response
);
}
catch
(
Exception
e
)
{
subtype
=
false
;
...
...
@@ -2745,16 +2843,37 @@ public class RequiredModelMBean
return
MBeanServerFactory
.
getClassLoaderRepository
(
server
);
}
private
Class
<?>
loadClass
(
String
className
)
private
Class
<?>
loadClass
(
final
String
className
)
throws
ClassNotFoundException
{
try
{
return
Class
.
forName
(
className
);
}
catch
(
ClassNotFoundException
e
)
{
final
ClassLoaderRepository
clr
=
getClassLoaderRepository
();
if
(
clr
==
null
)
throw
new
ClassNotFoundException
(
className
);
return
clr
.
loadClass
(
className
);
AccessControlContext
stack
=
AccessController
.
getContext
();
final
ClassNotFoundException
[]
caughtException
=
new
ClassNotFoundException
[
1
];
Class
c
=
javaSecurityAccess
.
doIntersectionPrivilege
(
new
PrivilegedAction
<
Class
<?>>()
{
@Override
public
Class
<?>
run
()
{
try
{
ReflectUtil
.
checkPackageAccess
(
className
);
return
Class
.
forName
(
className
);
}
catch
(
ClassNotFoundException
e
)
{
final
ClassLoaderRepository
clr
=
getClassLoaderRepository
();
try
{
if
(
clr
==
null
)
throw
new
ClassNotFoundException
(
className
);
return
clr
.
loadClass
(
className
);
}
catch
(
ClassNotFoundException
ex
)
{
caughtException
[
0
]
=
ex
;
}
}
return
null
;
}
},
stack
,
acc
);
if
(
caughtException
[
0
]
!=
null
)
{
throw
caughtException
[
0
];
}
return
c
;
}
...
...
src/share/classes/javax/swing/JTable.java
浏览文件 @
e06c9d77
...
...
@@ -781,15 +781,11 @@ public class JTable extends JComponent implements TableModelListener, Scrollable
scrollPane
.
getCorner
(
JScrollPane
.
UPPER_TRAILING_CORNER
);
if
(
corner
==
null
||
corner
instanceof
UIResource
){
corner
=
null
;
Object
componentClass
=
UIManager
.
get
(
"Table.scrollPaneCornerComponent"
);
if
(
componentClass
instanceof
Class
){
try
{
corner
=
(
Component
)
((
Class
)
componentClass
).
newInstance
();
}
catch
(
Exception
e
)
{
// just ignore and don't set corner
}
try
{
corner
=
(
Component
)
UIManager
.
get
(
"Table.scrollPaneCornerComponent"
);
}
catch
(
Exception
e
)
{
// just ignore and don't set corner
}
scrollPane
.
setCorner
(
JScrollPane
.
UPPER_TRAILING_CORNER
,
corner
);
...
...
src/share/classes/javax/swing/RepaintManager.java
浏览文件 @
e06c9d77
...
...
@@ -27,11 +27,12 @@ package javax.swing;
import
java.awt.*
;
import
java.awt.event.*
;
import
java.awt.peer.ComponentPeer
;
import
java.awt.peer.ContainerPeer
;
import
java.awt.image.VolatileImage
;
import
java.security.AccessControlContext
;
import
java.security.AccessController
;
import
java.security.PrivilegedAction
;
import
java.util.*
;
import
java.util.concurrent.atomic.AtomicInteger
;
import
java.applet.*
;
import
sun.awt.AWTAccessor
;
...
...
@@ -39,6 +40,8 @@ import sun.awt.AppContext;
import
sun.awt.DisplayChangedListener
;
import
sun.awt.SunToolkit
;
import
sun.java2d.SunGraphicsEnvironment
;
import
sun.misc.JavaSecurityAccess
;
import
sun.misc.SharedSecrets
;
import
sun.security.action.GetPropertyAction
;
import
com.sun.java.swing.SwingUtilities3
;
...
...
@@ -176,6 +179,9 @@ public class RepaintManager
*/
private
final
ProcessingRunnable
processingRunnable
;
private
final
static
JavaSecurityAccess
javaSecurityAccess
=
SharedSecrets
.
getJavaSecurityAccess
();
static
{
volatileImageBufferEnabled
=
"true"
.
equals
(
AccessController
.
...
...
@@ -548,13 +554,26 @@ public class RepaintManager
// This is called from the toolkit thread when awt needs to run a
// Runnable before we paint.
//
void
nativeQueueSurfaceDataRunnable
(
AppContext
appContext
,
Component
c
,
Runnable
r
)
{
void
nativeQueueSurfaceDataRunnable
(
AppContext
appContext
,
final
Component
c
,
final
Runnable
r
)
{
synchronized
(
this
)
{
if
(
runnableList
==
null
)
{
runnableList
=
new
LinkedList
<
Runnable
>();
}
runnableList
.
add
(
r
);
runnableList
.
add
(
new
Runnable
()
{
public
void
run
()
{
AccessControlContext
stack
=
AccessController
.
getContext
();
AccessControlContext
acc
=
AWTAccessor
.
getComponentAccessor
().
getAccessControlContext
(
c
);
javaSecurityAccess
.
doIntersectionPrivilege
(
new
PrivilegedAction
<
Void
>()
{
public
Void
run
()
{
r
.
run
();
return
null
;
}
},
stack
,
acc
);
}
});
}
scheduleProcessingRunnable
(
appContext
);
}
...
...
@@ -652,9 +671,9 @@ public class RepaintManager
* @see #addInvalidComponent
*/
public
void
validateInvalidComponents
()
{
java
.
util
.
List
<
Component
>
ic
;
final
java
.
util
.
List
<
Component
>
ic
;
synchronized
(
this
)
{
if
(
invalidComponents
==
null
)
{
if
(
invalidComponents
==
null
)
{
return
;
}
ic
=
invalidComponents
;
...
...
@@ -662,7 +681,17 @@ public class RepaintManager
}
int
n
=
ic
.
size
();
for
(
int
i
=
0
;
i
<
n
;
i
++)
{
ic
.
get
(
i
).
validate
();
final
Component
c
=
ic
.
get
(
i
);
AccessControlContext
stack
=
AccessController
.
getContext
();
AccessControlContext
acc
=
AWTAccessor
.
getComponentAccessor
().
getAccessControlContext
(
c
);
javaSecurityAccess
.
doIntersectionPrivilege
(
new
PrivilegedAction
<
Void
>()
{
public
Void
run
()
{
c
.
validate
();
return
null
;
}
},
stack
,
acc
);
}
}
...
...
@@ -740,78 +769,78 @@ public class RepaintManager
paintDirtyRegions
(
tmpDirtyComponents
);
}
private
void
paintDirtyRegions
(
Map
<
Component
,
Rectangle
>
tmpDirtyComponents
){
int
i
,
count
;
java
.
util
.
List
<
Component
>
roots
;
Component
dirtyComponent
;
count
=
tmpDirtyComponents
.
size
();
if
(
count
==
0
)
{
private
void
paintDirtyRegions
(
final
Map
<
Component
,
Rectangle
>
tmpDirtyComponents
)
{
if
(
tmpDirtyComponents
.
isEmpty
())
{
return
;
}
Rectangle
rect
;
int
localBoundsX
=
0
;
int
localBoundsY
=
0
;
int
localBoundsH
;
int
localBoundsW
;
roots
=
new
ArrayList
<
Component
>(
count
);
final
java
.
util
.
List
<
Component
>
roots
=
new
ArrayList
<
Component
>(
tmpDirtyComponents
.
size
());
for
(
Component
dirty
:
tmpDirtyComponents
.
keySet
())
{
collectDirtyComponents
(
tmpDirtyComponents
,
dirty
,
roots
);
}
count
=
roots
.
size
(
);
final
AtomicInteger
count
=
new
AtomicInteger
(
roots
.
size
()
);
painting
=
true
;
try
{
for
(
i
=
0
;
i
<
count
;
i
++)
{
dirtyComponent
=
roots
.
get
(
i
);
rect
=
tmpDirtyComponents
.
get
(
dirtyComponent
);
// Sometimes when RepaintManager is changed during the painting
// we may get null here, see #6995769 for details
if
(
rect
==
null
)
{
continue
;
}
localBoundsH
=
dirtyComponent
.
getHeight
();
localBoundsW
=
dirtyComponent
.
getWidth
();
SwingUtilities
.
computeIntersection
(
localBoundsX
,
localBoundsY
,
localBoundsW
,
localBoundsH
,
rect
);
if
(
dirtyComponent
instanceof
JComponent
)
{
((
JComponent
)
dirtyComponent
).
paintImmediately
(
rect
.
x
,
rect
.
y
,
rect
.
width
,
rect
.
height
);
}
else
if
(
dirtyComponent
.
isShowing
())
{
Graphics
g
=
JComponent
.
safelyGetGraphics
(
dirtyComponent
,
dirtyComponent
);
// If the Graphics goes away, it means someone disposed of
// the window, don't do anything.
if
(
g
!=
null
)
{
g
.
setClip
(
rect
.
x
,
rect
.
y
,
rect
.
width
,
rect
.
height
);
try
{
dirtyComponent
.
paint
(
g
);
}
finally
{
g
.
dispose
();
for
(
int
j
=
0
;
j
<
count
.
get
();
j
++)
{
final
int
i
=
j
;
final
Component
dirtyComponent
=
roots
.
get
(
j
);
AccessControlContext
stack
=
AccessController
.
getContext
();
AccessControlContext
acc
=
AWTAccessor
.
getComponentAccessor
().
getAccessControlContext
(
dirtyComponent
);
javaSecurityAccess
.
doIntersectionPrivilege
(
new
PrivilegedAction
<
Void
>()
{
public
Void
run
()
{
Rectangle
rect
=
tmpDirtyComponents
.
get
(
dirtyComponent
);
// Sometimes when RepaintManager is changed during the painting
// we may get null here, see #6995769 for details
if
(
rect
==
null
)
{
return
null
;
}
int
localBoundsH
=
dirtyComponent
.
getHeight
();
int
localBoundsW
=
dirtyComponent
.
getWidth
();
SwingUtilities
.
computeIntersection
(
0
,
0
,
localBoundsW
,
localBoundsH
,
rect
);
if
(
dirtyComponent
instanceof
JComponent
)
{
((
JComponent
)
dirtyComponent
).
paintImmediately
(
rect
.
x
,
rect
.
y
,
rect
.
width
,
rect
.
height
);
}
else
if
(
dirtyComponent
.
isShowing
())
{
Graphics
g
=
JComponent
.
safelyGetGraphics
(
dirtyComponent
,
dirtyComponent
);
// If the Graphics goes away, it means someone disposed of
// the window, don't do anything.
if
(
g
!=
null
)
{
g
.
setClip
(
rect
.
x
,
rect
.
y
,
rect
.
width
,
rect
.
height
);
try
{
dirtyComponent
.
paint
(
g
);
}
finally
{
g
.
dispose
();
}
}
}
// If the repaintRoot has been set, service it now and
// remove any components that are children of repaintRoot.
if
(
repaintRoot
!=
null
)
{
adjustRoots
(
repaintRoot
,
roots
,
i
+
1
);
count
.
set
(
roots
.
size
());
paintManager
.
isRepaintingRoot
=
true
;
repaintRoot
.
paintImmediately
(
0
,
0
,
repaintRoot
.
getWidth
(),
repaintRoot
.
getHeight
());
paintManager
.
isRepaintingRoot
=
false
;
// Only service repaintRoot once.
repaintRoot
=
null
;
}
return
null
;
}
}
// If the repaintRoot has been set, service it now and
// remove any components that are children of repaintRoot.
if
(
repaintRoot
!=
null
)
{
adjustRoots
(
repaintRoot
,
roots
,
i
+
1
);
count
=
roots
.
size
();
paintManager
.
isRepaintingRoot
=
true
;
repaintRoot
.
paintImmediately
(
0
,
0
,
repaintRoot
.
getWidth
(),
repaintRoot
.
getHeight
());
paintManager
.
isRepaintingRoot
=
false
;
// Only service repaintRoot once.
repaintRoot
=
null
;
}
},
stack
,
acc
);
}
}
finally
{
painting
=
false
;
...
...
src/share/classes/javax/swing/UIDefaults.java
浏览文件 @
e06c9d77
...
...
@@ -677,6 +677,8 @@ public class UIDefaults extends Hashtable<Object,Object>
try
{
String
className
=
(
String
)
get
(
uiClassID
);
if
(
className
!=
null
)
{
ReflectUtil
.
checkPackageAccess
(
className
);
Class
cls
=
(
Class
)
get
(
className
);
if
(
cls
==
null
)
{
if
(
uiClassLoader
==
null
)
{
...
...
src/share/classes/javax/swing/plaf/nimbus/NimbusLookAndFeel.java
浏览文件 @
e06c9d77
...
...
@@ -159,7 +159,12 @@ public class NimbusLookAndFeel extends SynthLookAndFeel {
// Store Table ScrollPane Corner Component
uiDefaults
.
put
(
"Table.scrollPaneCornerComponent"
,
TableScrollPaneCorner
.
class
);
new
UIDefaults
.
ActiveValue
()
{
@Override
public
Object
createValue
(
UIDefaults
table
)
{
return
new
TableScrollPaneCorner
();
}
});
// Setup the settings for ToolBarSeparator which is custom
// installed for Nimbus
...
...
src/share/classes/sun/applet/AppletPanel.java
浏览文件 @
e06c9d77
...
...
@@ -45,6 +45,7 @@ import java.util.*;
import
java.util.Collections
;
import
java.util.Locale
;
import
java.util.WeakHashMap
;
import
sun.awt.AWTAccessor
;
import
sun.awt.AppContext
;
import
sun.awt.EmbeddedFrame
;
import
sun.awt.SunToolkit
;
...
...
@@ -448,12 +449,12 @@ abstract class AppletPanel extends Panel implements AppletStub, Runnable {
// to avoid deadlock.
try
{
final
AppletPanel
p
=
this
;
EventQueue
.
invokeAndWait
(
new
Runnable
()
{
p
ublic
void
run
()
{
p
.
validate
();
}
}
);
Runnable
r
=
new
Runnable
()
{
public
void
run
()
{
p
.
validate
();
}
};
AWTAccessor
.
getEventQueueAccessor
().
invokeAndWait
(
applet
,
r
);
}
catch
(
InterruptedException
ie
)
{
}
...
...
@@ -478,18 +479,19 @@ abstract class AppletPanel extends Panel implements AppletStub, Runnable {
try
{
final
AppletPanel
p
=
this
;
final
Applet
a
=
applet
;
EventQueue
.
invokeAndWait
(
new
Runnable
()
{
public
void
run
()
{
p
.
validate
();
a
.
setVisible
(
true
);
// Fix for BugTraq ID 4041703.
// Set the default focus for an applet.
if
(
hasInitialFocus
())
setDefaultFocus
();
Runnable
r
=
new
Runnable
()
{
public
void
run
()
{
p
.
validate
();
a
.
setVisible
(
true
);
// Fix for BugTraq ID 4041703.
// Set the default focus for an applet.
if
(
hasInitialFocus
())
{
setDefaultFocus
();
}
});
}
};
AWTAccessor
.
getEventQueueAccessor
().
invokeAndWait
(
applet
,
r
);
}
catch
(
InterruptedException
ie
)
{
}
...
...
@@ -512,13 +514,12 @@ abstract class AppletPanel extends Panel implements AppletStub, Runnable {
// to avoid deadlock.
try
{
final
Applet
a
=
applet
;
EventQueue
.
invokeAndWait
(
new
Runnable
()
{
public
void
run
()
{
a
.
setVisible
(
false
);
}
});
Runnable
r
=
new
Runnable
()
{
public
void
run
()
{
a
.
setVisible
(
false
);
}
};
AWTAccessor
.
getEventQueueAccessor
().
invokeAndWait
(
applet
,
r
);
}
catch
(
InterruptedException
ie
)
{
}
...
...
@@ -570,17 +571,14 @@ abstract class AppletPanel extends Panel implements AppletStub, Runnable {
}
status
=
APPLET_DISPOSE
;
try
{
try
{
final
Applet
a
=
applet
;
EventQueue
.
invokeAndWait
(
new
Runnable
()
{
public
void
run
()
{
Runnable
r
=
new
Runnable
()
{
public
void
run
()
{
remove
(
a
);
}
});
};
AWTAccessor
.
getEventQueueAccessor
().
invokeAndWait
(
applet
,
r
);
}
catch
(
InterruptedException
ie
)
{
...
...
src/share/classes/sun/awt/AWTAccessor.java
浏览文件 @
e06c9d77
...
...
@@ -34,6 +34,8 @@ import java.awt.event.InputEvent;
import
java.awt.event.KeyEvent
;
import
java.awt.geom.Point2D
;
import
java.awt.peer.ComponentPeer
;
import
java.lang.reflect.InvocationTargetException
;
import
java.security.AccessControlContext
;
import
java.io.File
;
...
...
@@ -476,6 +478,12 @@ public final class AWTAccessor {
* appeared.
*/
void
wakeup
(
EventQueue
eventQueue
,
boolean
isShutdown
);
/**
* Static in EventQueue
*/
void
invokeAndWait
(
Object
source
,
Runnable
r
)
throws
InterruptedException
,
InvocationTargetException
;
}
/*
...
...
src/share/classes/sun/awt/AppContext.java
浏览文件 @
e06c9d77
...
...
@@ -327,21 +327,27 @@ public final class AppContext {
// Before we return the main "system" AppContext, check to
// see if there's an AWTSecurityManager installed. If so,
// allow it to choose the AppContext to return.
SecurityManager
securityManager
=
System
.
getSecurityManager
();
if
((
securityManager
!=
null
)
&&
(
securityManager
instanceof
AWTSecurityManager
))
{
AWTSecurityManager
awtSecMgr
=
(
AWTSecurityManager
)
securityManager
;
AppContext
secAppContext
=
awtSecMgr
.
getAppContext
();
if
(
secAppContext
!=
null
)
{
appContext
=
secAppContext
;
// Return what we're told
}
AppContext
secAppContext
=
getExecutionAppContext
();
if
(
secAppContext
!=
null
)
{
appContext
=
secAppContext
;
// Return what we're told
}
}
return
appContext
;
}
private
final
static
AppContext
getExecutionAppContext
()
{
SecurityManager
securityManager
=
System
.
getSecurityManager
();
if
((
securityManager
!=
null
)
&&
(
securityManager
instanceof
AWTSecurityManager
))
{
AWTSecurityManager
awtSecMgr
=
(
AWTSecurityManager
)
securityManager
;
AppContext
secAppContext
=
awtSecMgr
.
getAppContext
();
return
secAppContext
;
// Return what we're told
}
return
null
;
}
/**
* Returns the main ("system") AppContext.
*
...
...
@@ -806,6 +812,21 @@ public final class AppContext {
public
boolean
isMainAppContext
()
{
return
(
numAppContexts
.
get
()
==
1
);
}
public
Object
getContext
()
{
return
getAppContext
();
}
public
Object
getExecutionContext
()
{
return
getExecutionAppContext
();
}
public
Object
get
(
Object
context
,
Object
key
)
{
return
((
AppContext
)
context
).
get
(
key
);
}
public
void
put
(
Object
context
,
Object
key
,
Object
value
)
{
((
AppContext
)
context
).
put
(
key
,
value
);
}
public
void
remove
(
Object
context
,
Object
key
)
{
((
AppContext
)
context
).
remove
(
key
);
}
});
}
}
...
...
src/share/classes/sun/awt/image/ByteComponentRaster.java
浏览文件 @
e06c9d77
...
...
@@ -198,7 +198,7 @@ public class ByteComponentRaster extends SunWritableRaster {
}
this
.
bandOffset
=
this
.
dataOffsets
[
0
];
verify
(
false
);
verify
();
}
/**
...
...
@@ -857,38 +857,68 @@ public class ByteComponentRaster extends SunWritableRaster {
}
/**
* Verify that the layout parameters are consistent with
* the data. If strictCheck
* is false, this method will check for ArrayIndexOutOfBounds conditions. If
* strictCheck is true, this method will check for additional error
* conditions such as line wraparound (width of a line greater than
* the scanline stride).
* @return String Error string, if the layout is incompatible with
* the data. Otherwise returns null.
* Verify that the layout parameters are consistent with the data.
*
* The method verifies whether scanline stride and pixel stride do not
* cause an integer overflow during calculation of a position of the pixel
* in data buffer. It also verifies whether the data buffer has enough data
* to correspond the raster layout attributes.
*
* @throws RasterFormatException if an integer overflow is detected,
* or if data buffer has not enough capacity.
*/
private
void
verify
(
boolean
strictCheck
)
{
// Make sure data for Raster is in a legal range
for
(
int
i
=
0
;
i
<
dataOffsets
.
length
;
i
++)
{
protected
final
void
verify
()
{
for
(
int
i
=
0
;
i
<
dataOffsets
.
length
;
i
++)
{
if
(
dataOffsets
[
i
]
<
0
)
{
throw
new
RasterFormatException
(
"Data offsets for band "
+
i
+
"("
+
dataOffsets
[
i
]+
") must be >= 0"
);
throw
new
RasterFormatException
(
"Data offsets for band "
+
i
+
"("
+
dataOffsets
[
i
]
+
") must be >= 0"
);
}
}
int
maxSize
=
0
;
int
size
;
for
(
int
i
=
0
;
i
<
numDataElements
;
i
++)
{
size
=
(
height
-
1
)*
scanlineStride
+
(
width
-
1
)*
pixelStride
+
dataOffsets
[
i
];
// we can be sure that width and height are greater than 0
if
(
scanlineStride
<
0
||
scanlineStride
>
(
Integer
.
MAX_VALUE
/
height
))
{
// integer overflow
throw
new
RasterFormatException
(
"Incorrect scanline stride: "
+
scanlineStride
);
}
int
lastScanOffset
=
(
height
-
1
)
*
scanlineStride
;
if
(
pixelStride
<
0
||
pixelStride
>
(
Integer
.
MAX_VALUE
/
width
))
{
// integer overflow
throw
new
RasterFormatException
(
"Incorrect pixel stride: "
+
pixelStride
);
}
int
lastPixelOffset
=
(
width
-
1
)
*
pixelStride
;
if
(
lastPixelOffset
>
(
Integer
.
MAX_VALUE
-
lastScanOffset
))
{
// integer overflow
throw
new
RasterFormatException
(
"Incorrect raster attributes"
);
}
lastPixelOffset
+=
lastScanOffset
;
for
(
int
i
=
0
;
i
<
numDataElements
;
i
++)
{
size
=
lastPixelOffset
+
dataOffsets
[
i
];
if
(
dataOffsets
[
i
]
>
(
Integer
.
MAX_VALUE
-
lastPixelOffset
))
{
throw
new
RasterFormatException
(
"Incorrect band offset: "
+
dataOffsets
[
i
]);
}
if
(
size
>
maxSize
)
{
maxSize
=
size
;
}
}
if
(
data
.
length
<
maxSize
)
{
throw
new
RasterFormatException
(
"Data array too small (should be "
+
maxSize
+
" )"
);
throw
new
RasterFormatException
(
"Data array too small (should be "
+
maxSize
+
" )"
);
}
}
...
...
src/share/classes/sun/awt/image/ByteInterleavedRaster.java
浏览文件 @
e06c9d77
...
...
@@ -250,7 +250,7 @@ public class ByteInterleavedRaster extends ByteComponentRaster {
}
}
verify
(
false
);
verify
();
}
/**
...
...
@@ -1292,33 +1292,6 @@ public class ByteInterleavedRaster extends ByteComponentRaster {
return
createCompatibleWritableRaster
(
width
,
height
);
}
/**
* Verify that the layout parameters are consistent with
* the data. If strictCheck
* is false, this method will check for ArrayIndexOutOfBounds conditions. If
* strictCheck is true, this method will check for additional error
* conditions such as line wraparound (width of a line greater than
* the scanline stride).
* @return String Error string, if the layout is incompatible with
* the data. Otherwise returns null.
*/
private
void
verify
(
boolean
strictCheck
)
{
int
maxSize
=
0
;
int
size
;
for
(
int
i
=
0
;
i
<
numDataElements
;
i
++)
{
size
=
(
height
-
1
)*
scanlineStride
+
(
width
-
1
)*
pixelStride
+
dataOffsets
[
i
];
if
(
size
>
maxSize
)
{
maxSize
=
size
;
}
}
if
(
data
.
length
<
maxSize
)
{
throw
new
RasterFormatException
(
"Data array too small (should be "
+
maxSize
+
" )"
);
}
}
public
String
toString
()
{
return
new
String
(
"ByteInterleavedRaster: width = "
+
width
+
" height = "
+
height
...
...
src/share/classes/sun/awt/image/ShortComponentRaster.java
浏览文件 @
e06c9d77
...
...
@@ -198,7 +198,7 @@ public class ShortComponentRaster extends SunWritableRaster {
}
this
.
bandOffset
=
this
.
dataOffsets
[
0
];
verify
(
false
);
verify
();
}
/**
...
...
@@ -791,38 +791,67 @@ public class ShortComponentRaster extends SunWritableRaster {
}
/**
* Verify that the layout parameters are consistent with
* the data. If strictCheck
* is false, this method will check for ArrayIndexOutOfBounds conditions. If
* strictCheck is true, this method will check for additional error
* conditions such as line wraparound (width of a line greater than
* the scanline stride).
* @return String Error string, if the layout is incompatible with
* the data. Otherwise returns null.
* Verify that the layout parameters are consistent with the data.
*
* The method verifies whether scanline stride and pixel stride do not
* cause an integer overflow during calculation of a position of the pixel
* in data buffer. It also verifies whether the data buffer has enough data
* to correspond the raster layout attributes.
*
* @throws RasterFormatException if an integer overflow is detected,
* or if data buffer has not enough capacity.
*/
private
void
verify
(
boolean
strictCheck
)
{
// Make sure data for Raster is in a legal range
for
(
int
i
=
0
;
i
<
dataOffsets
.
length
;
i
++)
{
protected
final
void
verify
()
{
for
(
int
i
=
0
;
i
<
dataOffsets
.
length
;
i
++)
{
if
(
dataOffsets
[
i
]
<
0
)
{
throw
new
RasterFormatException
(
"Data offsets for band "
+
i
+
"("
+
dataOffsets
[
i
]+
") must be >= 0"
);
throw
new
RasterFormatException
(
"Data offsets for band "
+
i
+
"("
+
dataOffsets
[
i
]
+
") must be >= 0"
);
}
}
int
maxSize
=
0
;
int
size
;
for
(
int
i
=
0
;
i
<
numDataElements
;
i
++)
{
size
=
(
height
-
1
)*
scanlineStride
+
(
width
-
1
)*
pixelStride
+
dataOffsets
[
i
];
// we can be sure that width and height are greater than 0
if
(
scanlineStride
<
0
||
scanlineStride
>
(
Integer
.
MAX_VALUE
/
height
))
{
// integer overflow
throw
new
RasterFormatException
(
"Incorrect scanline stride: "
+
scanlineStride
);
}
int
lastScanOffset
=
(
height
-
1
)
*
scanlineStride
;
if
(
pixelStride
<
0
||
pixelStride
>
(
Integer
.
MAX_VALUE
/
width
))
{
// integer overflow
throw
new
RasterFormatException
(
"Incorrect pixel stride: "
+
pixelStride
);
}
int
lastPixelOffset
=
(
width
-
1
)
*
pixelStride
;
if
(
lastPixelOffset
>
(
Integer
.
MAX_VALUE
-
lastScanOffset
))
{
// integer overflow
throw
new
RasterFormatException
(
"Incorrect raster attributes"
);
}
lastPixelOffset
+=
lastScanOffset
;
for
(
int
i
=
0
;
i
<
numDataElements
;
i
++)
{
size
=
lastPixelOffset
+
dataOffsets
[
i
];
if
(
dataOffsets
[
i
]
>
(
Integer
.
MAX_VALUE
-
lastPixelOffset
))
{
throw
new
RasterFormatException
(
"Incorrect band offset: "
+
dataOffsets
[
i
]);
}
if
(
size
>
maxSize
)
{
maxSize
=
size
;
}
}
if
(
data
.
length
<
maxSize
)
{
throw
new
RasterFormatException
(
"Data array too small (should be "
+
maxSize
+
" )"
);
throw
new
RasterFormatException
(
"Data array too small (should be "
+
maxSize
+
" )"
);
}
}
...
...
src/share/classes/sun/awt/image/ShortInterleavedRaster.java
浏览文件 @
e06c9d77
...
...
@@ -171,7 +171,7 @@ public class ShortInterleavedRaster extends ShortComponentRaster {
sampleModel
);
}
this
.
bandOffset
=
this
.
dataOffsets
[
0
];
verify
(
false
);
verify
();
}
/**
...
...
@@ -762,33 +762,6 @@ public class ShortInterleavedRaster extends ShortComponentRaster {
return
createCompatibleWritableRaster
(
width
,
height
);
}
/**
* Verify that the layout parameters are consistent with
* the data. If strictCheck
* is false, this method will check for ArrayIndexOutOfBounds conditions. If
* strictCheck is true, this method will check for additional error
* conditions such as line wraparound (width of a line greater than
* the scanline stride).
* @return String Error string, if the layout is incompatible with
* the data. Otherwise returns null.
*/
private
void
verify
(
boolean
strictCheck
)
{
int
maxSize
=
0
;
int
size
;
for
(
int
i
=
0
;
i
<
numDataElements
;
i
++)
{
size
=
(
height
-
1
)*
scanlineStride
+
(
width
-
1
)*
pixelStride
+
dataOffsets
[
i
];
if
(
size
>
maxSize
)
{
maxSize
=
size
;
}
}
if
(
data
.
length
<
maxSize
)
{
throw
new
RasterFormatException
(
"Data array too small (should be "
+
maxSize
+
" )"
);
}
}
public
String
toString
()
{
return
new
String
(
"ShortInterleavedRaster: width = "
+
width
+
" height = "
+
height
...
...
src/share/classes/sun/misc/JavaAWTAccess.java
浏览文件 @
e06c9d77
...
...
@@ -26,6 +26,14 @@
package
sun.misc
;
public
interface
JavaAWTAccess
{
public
Object
getContext
();
public
Object
getExecutionContext
();
public
Object
get
(
Object
context
,
Object
key
);
public
void
put
(
Object
context
,
Object
key
,
Object
value
);
public
void
remove
(
Object
context
,
Object
key
);
// convenience methods whose context is the object returned by getContext()
public
Object
get
(
Object
key
);
public
void
put
(
Object
key
,
Object
value
);
public
void
remove
(
Object
key
);
...
...
src/share/classes/sun/net/httpserver/ChunkedInputStream.java
浏览文件 @
e06c9d77
...
...
@@ -41,8 +41,12 @@ class ChunkedInputStream extends LeftOverInputStream {
private
boolean
needToReadHeader
=
true
;
static
char
CR
=
'\r'
;
static
char
LF
=
'\n'
;
final
static
char
CR
=
'\r'
;
final
static
char
LF
=
'\n'
;
/*
* Maximum chunk header size of 2KB + 2 bytes for CRLF
*/
private
final
static
int
MAX_CHUNK_HEADER_SIZE
=
2050
;
private
int
numeric
(
char
[]
arr
,
int
nchars
)
throws
IOException
{
assert
arr
.
length
>=
nchars
;
...
...
@@ -73,10 +77,14 @@ class ChunkedInputStream extends LeftOverInputStream {
char
[]
len_arr
=
new
char
[
16
];
int
len_size
=
0
;
boolean
end_of_len
=
false
;
int
read
=
0
;
while
((
c
=
in
.
read
())!=
-
1
)
{
char
ch
=
(
char
)
c
;
if
(
len_size
==
len_arr
.
length
-
1
)
{
read
++;
if
((
len_size
==
len_arr
.
length
-
1
)
||
(
read
>
MAX_CHUNK_HEADER_SIZE
))
{
throw
new
IOException
(
"invalid chunk header"
);
}
if
(
gotCR
)
{
...
...
src/share/classes/sun/net/www/http/ChunkedInputStream.java
浏览文件 @
e06c9d77
...
...
@@ -125,6 +125,11 @@ class ChunkedInputStream extends InputStream implements Hurryable {
*/
private
boolean
closed
;
/*
* Maximum chunk header size of 2KB + 2 bytes for CRLF
*/
private
final
static
int
MAX_CHUNK_HEADER_SIZE
=
2050
;
/**
* State to indicate that next field should be :-
* chunk-size [ chunk-extension ] CRLF
...
...
@@ -290,6 +295,10 @@ class ChunkedInputStream extends InputStream implements Hurryable {
break
;
}
pos
++;
if
((
pos
-
rawPos
)
>=
MAX_CHUNK_HEADER_SIZE
)
{
error
=
true
;
throw
new
IOException
(
"Chunk header too long"
);
}
}
if
(
pos
>=
rawCount
)
{
return
;
...
...
src/share/classes/sun/nio/ch/DatagramChannelImpl.java
浏览文件 @
e06c9d77
...
...
@@ -421,7 +421,7 @@ class DatagramChannelImpl
synchronized
(
writeLock
)
{
ensureOpen
();
InetSocketAddress
isa
=
(
InetSocketAddress
)
target
;
InetSocketAddress
isa
=
Net
.
checkAddress
(
target
)
;
InetAddress
ia
=
isa
.
getAddress
();
if
(
ia
==
null
)
throw
new
IOException
(
"Target address not resolved"
);
...
...
@@ -432,9 +432,9 @@ class DatagramChannelImpl
SecurityManager
sm
=
System
.
getSecurityManager
();
if
(
sm
!=
null
)
{
if
(
ia
.
isMulticastAddress
())
{
sm
.
checkMulticast
(
i
sa
.
getAddress
()
);
sm
.
checkMulticast
(
i
a
);
}
else
{
sm
.
checkConnect
(
i
sa
.
getAddress
()
.
getHostAddress
(),
sm
.
checkConnect
(
i
a
.
getHostAddress
(),
isa
.
getPort
());
}
}
...
...
@@ -454,7 +454,7 @@ class DatagramChannelImpl
return
0
;
writerThread
=
NativeThread
.
current
();
do
{
n
=
send
(
fd
,
src
,
target
);
n
=
send
(
fd
,
src
,
isa
);
}
while
((
n
==
IOStatus
.
INTERRUPTED
)
&&
isOpen
());
synchronized
(
stateLock
)
{
...
...
@@ -471,7 +471,7 @@ class DatagramChannelImpl
}
}
private
int
send
(
FileDescriptor
fd
,
ByteBuffer
src
,
SocketAddress
target
)
private
int
send
(
FileDescriptor
fd
,
ByteBuffer
src
,
Inet
SocketAddress
target
)
throws
IOException
{
if
(
src
instanceof
DirectBuffer
)
...
...
@@ -502,7 +502,7 @@ class DatagramChannelImpl
}
private
int
sendFromNativeBuffer
(
FileDescriptor
fd
,
ByteBuffer
bb
,
SocketAddress
target
)
Inet
SocketAddress
target
)
throws
IOException
{
int
pos
=
bb
.
position
();
...
...
@@ -514,7 +514,7 @@ class DatagramChannelImpl
int
written
;
try
{
written
=
send0
(
preferIPv6
,
fd
,
((
DirectBuffer
)
bb
).
address
()
+
pos
,
rem
,
target
);
rem
,
target
.
getAddress
(),
target
.
getPort
()
);
}
catch
(
PortUnreachableException
pue
)
{
if
(
isConnected
())
throw
pue
;
...
...
@@ -1116,8 +1116,8 @@ class DatagramChannelImpl
boolean
connected
)
throws
IOException
;
private
native
int
send0
(
boolean
preferIPv6
,
FileDescriptor
fd
,
long
address
,
int
len
,
SocketAddress
sa
)
private
native
int
send0
(
boolean
preferIPv6
,
FileDescriptor
fd
,
long
address
,
int
len
,
InetAddress
addr
,
int
port
)
throws
IOException
;
static
{
...
...
src/share/classes/sun/reflect/misc/ReflectUtil.java
浏览文件 @
e06c9d77
...
...
@@ -178,4 +178,31 @@ public final class ReflectUtil {
return
!
isAncestor
(
from
,
to
);
}
/**
* Access check on the interfaces that a proxy class implements and throw
* {@code SecurityException} if it accesses a restricted package.
*
* @param ccl the caller's class loader
* @param interfaces the list of interfaces that a proxy class implements
*
* @see Proxy#checkProxyAccess
*/
public
static
void
checkProxyPackageAccess
(
ClassLoader
ccl
,
Class
<?>...
interfaces
)
{
SecurityManager
sm
=
System
.
getSecurityManager
();
if
(
sm
!=
null
)
{
for
(
Class
<?>
intf
:
interfaces
)
{
ClassLoader
cl
=
intf
.
getClassLoader
();
if
(
needsPackageAccessCheck
(
ccl
,
cl
))
{
checkPackageAccess
(
intf
);
}
}
}
}
// Note that bytecode instrumentation tools may exclude 'sun.*'
// classes but not generated proxy classes and so keep it in com.sun.*
public
static
final
String
PROXY_PACKAGE
=
"com.sun.proxy"
;
}
src/share/classes/sun/rmi/transport/proxy/CGIHandler.java
浏览文件 @
e06c9d77
...
...
@@ -153,7 +153,7 @@ public final class CGIHandler {
returnServerError
(
e
.
getMessage
());
}
else
returnClientError
(
"invalid command
: "
+
command
);
returnClientError
(
"invalid command
."
);
}
catch
(
Exception
e
)
{
returnServerError
(
"internal error: "
+
e
.
getMessage
());
}
...
...
@@ -225,7 +225,7 @@ final class CGIForwardCommand implements CGICommandHandler {
try
{
port
=
Integer
.
parseInt
(
param
);
}
catch
(
NumberFormatException
e
)
{
throw
new
CGIClientException
(
"invalid port number
: "
+
param
);
throw
new
CGIClientException
(
"invalid port number
."
);
}
if
(
port
<=
0
||
port
>
0xFFFF
)
throw
new
CGIClientException
(
"invalid port: "
+
port
);
...
...
@@ -293,11 +293,14 @@ final class CGIForwardCommand implements CGICommandHandler {
"unexpected EOF reading server response"
);
if
(
line
.
toLowerCase
().
startsWith
(
key
))
{
// if contentLengthFound is true
// we should probably do something here
responseContentLength
=
Integer
.
parseInt
(
line
.
substring
(
key
.
length
()).
trim
());
contentLengthFound
=
true
;
if
(
contentLengthFound
)
{
throw
new
CGIServerException
(
"Multiple Content-length entries found."
);
}
else
{
responseContentLength
=
Integer
.
parseInt
(
line
.
substring
(
key
.
length
()).
trim
());
contentLengthFound
=
true
;
}
}
}
while
((
line
.
length
()
!=
0
)
&&
(
line
.
charAt
(
0
)
!=
'\r'
)
&&
(
line
.
charAt
(
0
)
!=
'\n'
));
...
...
src/share/classes/sun/rmi/transport/proxy/HttpInputStream.java
浏览文件 @
e06c9d77
...
...
@@ -70,11 +70,14 @@ class HttpInputStream extends FilterInputStream {
throw
new
EOFException
();
if
(
line
.
toLowerCase
().
startsWith
(
key
))
{
// if contentLengthFound is true
// we should probably do something here
bytesLeft
=
Integer
.
parseInt
(
line
.
substring
(
key
.
length
()).
trim
());
contentLengthFound
=
true
;
if
(
contentLengthFound
)
{
throw
new
IOException
(
"Multiple Content-length entries found."
);
}
else
{
bytesLeft
=
Integer
.
parseInt
(
line
.
substring
(
key
.
length
()).
trim
());
contentLengthFound
=
true
;
}
}
// The idea here is to go past the first blank line.
...
...
src/share/classes/sun/security/pkcs11/P11KeyAgreement.java
浏览文件 @
e06c9d77
...
...
@@ -37,6 +37,7 @@ import javax.crypto.spec.*;
import
static
sun
.
security
.
pkcs11
.
TemplateManager
.*;
import
sun.security.pkcs11.wrapper.*
;
import
static
sun
.
security
.
pkcs11
.
wrapper
.
PKCS11Constants
.*;
import
sun.security.util.KeyUtil
;
/**
* KeyAgreement implementation class. This class currently supports
...
...
@@ -134,6 +135,10 @@ final class P11KeyAgreement extends KeyAgreementSpi {
BigInteger
p
,
g
,
y
;
if
(
key
instanceof
DHPublicKey
)
{
DHPublicKey
dhKey
=
(
DHPublicKey
)
key
;
// validate the Diffie-Hellman public key
KeyUtil
.
validate
(
dhKey
);
y
=
dhKey
.
getY
();
DHParameterSpec
params
=
dhKey
.
getParams
();
p
=
params
.
getP
();
...
...
@@ -145,6 +150,10 @@ final class P11KeyAgreement extends KeyAgreementSpi {
try
{
DHPublicKeySpec
spec
=
kf
.
engineGetKeySpec
(
key
,
DHPublicKeySpec
.
class
);
// validate the Diffie-Hellman public key
KeyUtil
.
validate
(
spec
);
y
=
spec
.
getY
();
p
=
spec
.
getP
();
g
=
spec
.
getG
();
...
...
src/share/classes/sun/security/ssl/CipherBox.java
浏览文件 @
e06c9d77
/*
* Copyright (c) 1996, 201
1
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1996, 201
3
, 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
...
...
@@ -392,7 +392,8 @@ final class CipherBox {
* uniformly use the bad_record_mac alert to hide the specific type of
* the error.
*/
int
decrypt
(
byte
[]
buf
,
int
offset
,
int
len
)
throws
BadPaddingException
{
int
decrypt
(
byte
[]
buf
,
int
offset
,
int
len
,
int
tagLen
)
throws
BadPaddingException
{
if
(
cipher
==
null
)
{
return
len
;
}
...
...
@@ -416,9 +417,10 @@ final class CipherBox {
System
.
out
);
}
catch
(
IOException
e
)
{
}
}
if
(
blockSize
!=
0
)
{
newLen
=
removePadding
(
buf
,
offset
,
newLen
,
blockSize
,
protocolVersion
);
newLen
=
removePadding
(
buf
,
offset
,
newLen
,
tagLen
,
blockSize
,
protocolVersion
);
if
(
protocolVersion
.
v
>=
ProtocolVersion
.
TLS11
.
v
)
{
if
(
newLen
<
blockSize
)
{
...
...
@@ -448,7 +450,7 @@ final class CipherBox {
*
* @see decrypt(byte[], int, int)
*/
int
decrypt
(
ByteBuffer
bb
)
throws
BadPaddingException
{
int
decrypt
(
ByteBuffer
bb
,
int
tagLen
)
throws
BadPaddingException
{
int
len
=
bb
.
remaining
();
...
...
@@ -471,7 +473,6 @@ final class CipherBox {
}
if
(
debug
!=
null
&&
Debug
.
isOn
(
"plaintext"
))
{
bb
.
position
(
pos
);
try
{
HexDumpEncoder
hd
=
new
HexDumpEncoder
();
...
...
@@ -479,7 +480,8 @@ final class CipherBox {
"Padded plaintext after DECRYPTION: len = "
+
newLen
);
hd
.
encodeBuffer
(
bb
,
System
.
out
);
hd
.
encodeBuffer
(
(
ByteBuffer
)
bb
.
duplicate
().
position
(
pos
),
System
.
out
);
}
catch
(
IOException
e
)
{
}
}
...
...
@@ -488,7 +490,8 @@ final class CipherBox {
*/
if
(
blockSize
!=
0
)
{
bb
.
position
(
pos
);
newLen
=
removePadding
(
bb
,
blockSize
,
protocolVersion
);
newLen
=
removePadding
(
bb
,
tagLen
,
blockSize
,
protocolVersion
);
if
(
protocolVersion
.
v
>=
ProtocolVersion
.
TLS11
.
v
)
{
if
(
newLen
<
blockSize
)
{
...
...
@@ -590,6 +593,65 @@ final class CipherBox {
return
newlen
;
}
/*
* A constant-time check of the padding.
*
* NOTE that we are checking both the padding and the padLen bytes here.
*
* The caller MUST ensure that the len parameter is a positive number.
*/
private
static
int
[]
checkPadding
(
byte
[]
buf
,
int
offset
,
int
len
,
byte
pad
)
{
if
(
len
<=
0
)
{
throw
new
RuntimeException
(
"padding len must be positive"
);
}
// An array of hits is used to prevent Hotspot optimization for
// the purpose of a constant-time check.
int
[]
results
=
{
0
,
0
};
// {missed #, matched #}
for
(
int
i
=
0
;
i
<=
256
;)
{
for
(
int
j
=
0
;
j
<
len
&&
i
<=
256
;
j
++,
i
++)
{
// j <= i
if
(
buf
[
offset
+
j
]
!=
pad
)
{
results
[
0
]++;
// mismatched padding data
}
else
{
results
[
1
]++;
// matched padding data
}
}
}
return
results
;
}
/*
* A constant-time check of the padding.
*
* NOTE that we are checking both the padding and the padLen bytes here.
*
* The caller MUST ensure that the bb parameter has remaining.
*/
private
static
int
[]
checkPadding
(
ByteBuffer
bb
,
byte
pad
)
{
if
(!
bb
.
hasRemaining
())
{
throw
new
RuntimeException
(
"hasRemaining() must be positive"
);
}
// An array of hits is used to prevent Hotspot optimization for
// the purpose of a constant-time check.
int
[]
results
=
{
0
,
0
};
// {missed #, matched #}
bb
.
mark
();
for
(
int
i
=
0
;
i
<=
256
;
bb
.
reset
())
{
for
(;
bb
.
hasRemaining
()
&&
i
<=
256
;
i
++)
{
if
(
bb
.
get
()
!=
pad
)
{
results
[
0
]++;
// mismatched padding data
}
else
{
results
[
1
]++;
// matched padding data
}
}
}
return
results
;
}
/*
* Typical TLS padding format for a 64 bit block cipher is as follows:
...
...
@@ -602,86 +664,95 @@ final class CipherBox {
* as it makes the data a multiple of the block size
*/
private
static
int
removePadding
(
byte
[]
buf
,
int
offset
,
int
len
,
int
blockSize
,
ProtocolVersion
protocolVersion
)
throws
BadPaddingException
{
int
tagLen
,
int
blockSize
,
ProtocolVersion
protocolVersion
)
throws
BadPaddingException
{
// last byte is length byte (i.e. actual padding length - 1)
int
padOffset
=
offset
+
len
-
1
;
int
pad
=
buf
[
padOffset
]
&
0x0ff
;
int
newlen
=
len
-
(
pad
+
1
);
if
(
newlen
<
0
)
{
throw
new
BadPaddingException
(
"Padding length invalid: "
+
pad
);
int
padLen
=
buf
[
padOffset
]
&
0xFF
;
int
newLen
=
len
-
(
padLen
+
1
);
if
((
newLen
-
tagLen
)
<
0
)
{
// If the buffer is not long enough to contain the padding plus
// a MAC tag, do a dummy constant-time padding check.
//
// Note that it is a dummy check, so we won't care about what is
// the actual padding data.
checkPadding
(
buf
,
offset
,
len
,
(
byte
)(
padLen
&
0xFF
));
throw
new
BadPaddingException
(
"Invalid Padding length: "
+
padLen
);
}
// The padding data should be filled with the padding length value.
int
[]
results
=
checkPadding
(
buf
,
offset
+
newLen
,
padLen
+
1
,
(
byte
)(
padLen
&
0xFF
));
if
(
protocolVersion
.
v
>=
ProtocolVersion
.
TLS10
.
v
)
{
for
(
int
i
=
1
;
i
<=
pad
;
i
++)
{
int
val
=
buf
[
padOffset
-
i
]
&
0xff
;
if
(
val
!=
pad
)
{
throw
new
BadPaddingException
(
"Invalid TLS padding: "
+
val
);
}
if
(
results
[
0
]
!=
0
)
{
// padding data has invalid bytes
throw
new
BadPaddingException
(
"Invalid TLS padding data"
);
}
}
else
{
// SSLv3
// SSLv3 requires 0 <= length byte < block size
// some implementations do 1 <= length byte <= block size,
// so accept that as well
// v3 does not require any particular value for the other bytes
if
(
pad
>
blockSize
)
{
throw
new
BadPaddingException
(
"Invalid SSLv3 padding
: "
+
pad
);
if
(
pad
Len
>
blockSize
)
{
throw
new
BadPaddingException
(
"Invalid SSLv3 padding
"
);
}
}
return
new
l
en
;
return
new
L
en
;
}
/*
* Position/limit is equal the removed padding.
*/
private
static
int
removePadding
(
ByteBuffer
bb
,
int
blockSize
,
ProtocolVersion
protocolVersion
)
throws
BadPaddingException
{
int
tagLen
,
int
blockSize
,
ProtocolVersion
protocolVersion
)
throws
BadPaddingException
{
int
len
=
bb
.
remaining
();
int
offset
=
bb
.
position
();
// last byte is length byte (i.e. actual padding length - 1)
int
padOffset
=
offset
+
len
-
1
;
int
pad
=
bb
.
get
(
padOffset
)
&
0x0ff
;
int
newlen
=
len
-
(
pad
+
1
);
if
(
newlen
<
0
)
{
throw
new
BadPaddingException
(
"Padding length invalid: "
+
pad
);
int
padLen
=
bb
.
get
(
padOffset
)
&
0xFF
;
int
newLen
=
len
-
(
padLen
+
1
);
if
((
newLen
-
tagLen
)
<
0
)
{
// If the buffer is not long enough to contain the padding plus
// a MAC tag, do a dummy constant-time padding check.
//
// Note that it is a dummy check, so we won't care about what is
// the actual padding data.
checkPadding
(
bb
.
duplicate
(),
(
byte
)(
padLen
&
0xFF
));
throw
new
BadPaddingException
(
"Invalid Padding length: "
+
padLen
);
}
/
*
* We could zero the padding area, but not much useful
* information there.
*/
/
/ The padding data should be filled with the padding length value.
int
[]
results
=
checkPadding
(
(
ByteBuffer
)
bb
.
duplicate
().
position
(
offset
+
newLen
),
(
byte
)(
padLen
&
0xFF
));
if
(
protocolVersion
.
v
>=
ProtocolVersion
.
TLS10
.
v
)
{
bb
.
put
(
padOffset
,
(
byte
)
0
);
// zero the padding.
for
(
int
i
=
1
;
i
<=
pad
;
i
++)
{
int
val
=
bb
.
get
(
padOffset
-
i
)
&
0xff
;
if
(
val
!=
pad
)
{
throw
new
BadPaddingException
(
"Invalid TLS padding: "
+
val
);
}
if
(
results
[
0
]
!=
0
)
{
// padding data has invalid bytes
throw
new
BadPaddingException
(
"Invalid TLS padding data"
);
}
}
else
{
// SSLv3
// SSLv3 requires 0 <= length byte < block size
// some implementations do 1 <= length byte <= block size,
// so accept that as well
// v3 does not require any particular value for the other bytes
if
(
pad
>
blockSize
)
{
throw
new
BadPaddingException
(
"Invalid SSLv3 padding
: "
+
pad
);
if
(
pad
Len
>
blockSize
)
{
throw
new
BadPaddingException
(
"Invalid SSLv3 padding
"
);
}
}
/*
* Reset buffer limit to remove padding.
*/
bb
.
position
(
offset
+
new
l
en
);
bb
.
limit
(
offset
+
new
l
en
);
bb
.
position
(
offset
+
new
L
en
);
bb
.
limit
(
offset
+
new
L
en
);
return
new
l
en
;
return
new
L
en
;
}
/*
...
...
@@ -708,4 +779,45 @@ final class CipherBox {
boolean
isCBCMode
()
{
return
isCBCMode
;
}
/**
* Is the cipher null?
*
* @return true if the cipher is null, false otherwise.
*/
boolean
isNullCipher
()
{
return
cipher
==
null
;
}
/**
* Sanity check the length of a fragment before decryption.
*
* In CBC mode, check that the fragment length is one or multiple times
* of the block size of the cipher suite, and is at least one (one is the
* smallest size of padding in CBC mode) bigger than the tag size of the
* MAC algorithm except the explicit IV size for TLS 1.1 or later.
*
* In non-CBC mode, check that the fragment length is not less than the
* tag size of the MAC algorithm.
*
* @return true if the length of a fragment matches above requirements
*/
boolean
sanityCheck
(
int
tagLen
,
int
fragmentLen
)
{
if
(!
isCBCMode
)
{
return
fragmentLen
>=
tagLen
;
}
if
((
fragmentLen
%
blockSize
)
==
0
)
{
int
minimal
=
tagLen
+
1
;
minimal
=
(
minimal
>=
blockSize
)
?
minimal
:
blockSize
;
if
(
protocolVersion
.
v
>=
ProtocolVersion
.
TLS11
.
v
)
{
minimal
+=
blockSize
;
// plus the size of the explicit IV
}
return
(
fragmentLen
>=
minimal
);
}
return
false
;
}
}
src/share/classes/sun/security/ssl/CipherSuite.java
浏览文件 @
e06c9d77
/*
* Copyright (c) 2002, 201
2
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2002, 201
3
, 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
...
...
@@ -549,9 +549,18 @@ final class CipherSuite implements Comparable<CipherSuite> {
// size of the MAC value (and MAC key) in bytes
final
int
size
;
MacAlg
(
String
name
,
int
size
)
{
// block size of the underlying hash algorithm
final
int
hashBlockSize
;
// minimal padding size of the underlying hash algorithm
final
int
minimalPaddingSize
;
MacAlg
(
String
name
,
int
size
,
int
hashBlockSize
,
int
minimalPaddingSize
)
{
this
.
name
=
name
;
this
.
size
=
size
;
this
.
hashBlockSize
=
hashBlockSize
;
this
.
minimalPaddingSize
=
minimalPaddingSize
;
}
/**
...
...
@@ -596,11 +605,11 @@ final class CipherSuite implements Comparable<CipherSuite> {
new
BulkCipher
(
CIPHER_AES
,
32
,
16
,
true
);
// MACs
final
static
MacAlg
M_NULL
=
new
MacAlg
(
"NULL"
,
0
);
final
static
MacAlg
M_MD5
=
new
MacAlg
(
"MD5"
,
16
);
final
static
MacAlg
M_SHA
=
new
MacAlg
(
"SHA"
,
20
);
final
static
MacAlg
M_SHA256
=
new
MacAlg
(
"SHA256"
,
32
);
final
static
MacAlg
M_SHA384
=
new
MacAlg
(
"SHA384"
,
48
);
final
static
MacAlg
M_NULL
=
new
MacAlg
(
"NULL"
,
0
,
0
,
0
);
final
static
MacAlg
M_MD5
=
new
MacAlg
(
"MD5"
,
16
,
64
,
9
);
final
static
MacAlg
M_SHA
=
new
MacAlg
(
"SHA"
,
20
,
64
,
9
);
final
static
MacAlg
M_SHA256
=
new
MacAlg
(
"SHA256"
,
32
,
64
,
9
);
final
static
MacAlg
M_SHA384
=
new
MacAlg
(
"SHA384"
,
48
,
128
,
17
);
/**
* PRFs (PseudoRandom Function) from TLS specifications.
...
...
src/share/classes/sun/security/ssl/ClientHandshaker.java
浏览文件 @
e06c9d77
...
...
@@ -129,9 +129,8 @@ final class ClientHandshaker extends Handshaker {
*/
@Override
void
processMessage
(
byte
type
,
int
messageLen
)
throws
IOException
{
if
(
state
>
type
&&
(
type
!=
HandshakeMessage
.
ht_hello_request
&&
state
!=
HandshakeMessage
.
ht_client_hello
))
{
if
(
state
>=
type
&&
(
type
!=
HandshakeMessage
.
ht_hello_request
))
{
throw
new
SSLProtocolException
(
"Handshake message sequence violation, "
+
type
);
}
...
...
@@ -194,8 +193,12 @@ final class ClientHandshaker extends Handshaker {
}
break
;
case
K_DH_ANON:
this
.
serverKeyExchange
(
new
DH_ServerKeyExchange
(
try
{
this
.
serverKeyExchange
(
new
DH_ServerKeyExchange
(
input
,
protocolVersion
));
}
catch
(
GeneralSecurityException
e
)
{
throwSSLException
(
"Server key"
,
e
);
}
break
;
case
K_DHE_DSS:
case
K_DHE_RSA:
...
...
@@ -921,7 +924,7 @@ final class ClientHandshaker extends Handshaker {
case
K_DHE_RSA:
case
K_DHE_DSS:
case
K_DH_ANON:
preMasterSecret
=
dh
.
getAgreedSecret
(
serverDH
);
preMasterSecret
=
dh
.
getAgreedSecret
(
serverDH
,
true
);
break
;
case
K_ECDHE_RSA:
case
K_ECDHE_ECDSA:
...
...
src/share/classes/sun/security/ssl/DHClientKeyExchange.java
浏览文件 @
e06c9d77
/*
* Copyright (c) 1997, 20
07
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 20
12
, 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,7 +29,7 @@ package sun.security.ssl;
import
java.io.IOException
;
import
java.io.PrintStream
;
import
java.math.BigInteger
;
import
javax.net.ssl.SSLHandshakeException
;
/*
* Message used by clients to send their Diffie-Hellman public
...
...
@@ -51,7 +51,7 @@ final class DHClientKeyExchange extends HandshakeMessage {
private
byte
dh_Yc
[];
// 1 to 2^16 -1 bytes
BigInteger
getClientPublicKey
()
{
return
new
BigInteger
(
1
,
dh_Yc
);
return
dh_Yc
==
null
?
null
:
new
BigInteger
(
1
,
dh_Yc
);
}
/*
...
...
@@ -73,7 +73,14 @@ final class DHClientKeyExchange extends HandshakeMessage {
* but that's what the protocol spec requires.)
*/
DHClientKeyExchange
(
HandshakeInStream
input
)
throws
IOException
{
dh_Yc
=
input
.
getBytes16
();
if
(
input
.
available
()
>=
2
)
{
dh_Yc
=
input
.
getBytes16
();
}
else
{
// currently, we don't support cipher suites that requires
// implicit public key of client.
throw
new
SSLHandshakeException
(
"Unsupported implicit client DiffieHellman public key"
);
}
}
@Override
...
...
@@ -87,7 +94,9 @@ final class DHClientKeyExchange extends HandshakeMessage {
@Override
void
send
(
HandshakeOutStream
s
)
throws
IOException
{
s
.
putBytes16
(
dh_Yc
);
if
(
dh_Yc
!=
null
&&
dh_Yc
.
length
!=
0
)
{
s
.
putBytes16
(
dh_Yc
);
}
}
@Override
...
...
src/share/classes/sun/security/ssl/DHCrypt.java
浏览文件 @
e06c9d77
/*
* Copyright (c) 1996, 20
08
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1996, 20
12
, 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,12 +28,15 @@ package sun.security.ssl;
import
java.math.BigInteger
;
import
java.security.*
;
import
java.io.IOException
;
import
javax.net.ssl.SSLHandshakeException
;
import
javax.crypto.SecretKey
;
import
javax.crypto.KeyAgreement
;
import
javax.crypto.interfaces.DHPublicKey
;
import
javax.crypto.spec.*
;
import
sun.security.util.KeyUtil
;
/**
* This class implements the Diffie-Hellman key exchange algorithm.
* D-H means combining your private key with your partners public key to
...
...
@@ -54,7 +57,8 @@ import javax.crypto.spec.*;
* . if we are server, call DHCrypt(keyLength,random). This generates
* an ephemeral keypair of the request length.
* . if we are client, call DHCrypt(modulus, base, random). This
* generates an ephemeral keypair using the parameters specified by the server.
* generates an ephemeral keypair using the parameters specified by
* the server.
* . send parameters and public value to remote peer
* . receive peers ephemeral public key
* . call getAgreedSecret() to calculate the shared secret
...
...
@@ -83,6 +87,9 @@ final class DHCrypt {
// public component of our key, X = (g ^ x) mod p
private
BigInteger
publicValue
;
// X (aka y)
// the times to recove from failure if public key validation
private
static
int
MAX_FAILOVER_TIMES
=
2
;
/**
* Generate a Diffie-Hellman keypair of the specified size.
*/
...
...
@@ -90,9 +97,12 @@ final class DHCrypt {
try
{
KeyPairGenerator
kpg
=
JsseJce
.
getKeyPairGenerator
(
"DiffieHellman"
);
kpg
.
initialize
(
keyLength
,
random
);
KeyPair
kp
=
kpg
.
generateKeyPair
();
privateKey
=
kp
.
getPrivate
();
DHPublicKeySpec
spec
=
getDHPublicKeySpec
(
kp
.
getPublic
());
DHPublicKeySpec
spec
=
generateDHPublicKeySpec
(
kpg
);
if
(
spec
==
null
)
{
throw
new
RuntimeException
(
"Could not generate DH keypair"
);
}
publicValue
=
spec
.
getY
();
modulus
=
spec
.
getP
();
base
=
spec
.
getG
();
...
...
@@ -115,20 +125,25 @@ final class DHCrypt {
KeyPairGenerator
kpg
=
JsseJce
.
getKeyPairGenerator
(
"DiffieHellman"
);
DHParameterSpec
params
=
new
DHParameterSpec
(
modulus
,
base
);
kpg
.
initialize
(
params
,
random
);
KeyPair
kp
=
kpg
.
generateKeyPair
();
privateKey
=
kp
.
getPrivate
();
DHPublicKeySpec
spec
=
getDHPublicKeySpec
(
kp
.
getPublic
());
DHPublicKeySpec
spec
=
generateDHPublicKeySpec
(
kpg
);
if
(
spec
==
null
)
{
throw
new
RuntimeException
(
"Could not generate DH keypair"
);
}
publicValue
=
spec
.
getY
();
}
catch
(
GeneralSecurityException
e
)
{
throw
new
RuntimeException
(
"Could not generate DH keypair"
,
e
);
}
}
static
DHPublicKeySpec
getDHPublicKeySpec
(
PublicKey
key
)
{
if
(
key
instanceof
DHPublicKey
)
{
DHPublicKey
dhKey
=
(
DHPublicKey
)
key
;
DHParameterSpec
params
=
dhKey
.
getParams
();
return
new
DHPublicKeySpec
(
dhKey
.
getY
(),
params
.
getP
(),
params
.
getG
());
return
new
DHPublicKeySpec
(
dhKey
.
getY
(),
params
.
getP
(),
params
.
getG
());
}
try
{
KeyFactory
factory
=
JsseJce
.
getKeyFactory
(
"DH"
);
...
...
@@ -166,17 +181,32 @@ final class DHCrypt {
* <P>It is illegal to call this member function if the private key
* has not been set (or generated).
*
* @param peerPublicKey the peer's public key.
* @returns the secret, which is an unsigned big-endian integer
* the same size as the Diffie-Hellman modulus.
* @param peerPublicKey the peer's public key.
* @param keyIsValidated whether the {@code peerPublicKey} has beed
* validated
* @return the secret, which is an unsigned big-endian integer
* the same size as the Diffie-Hellman modulus.
*/
SecretKey
getAgreedSecret
(
BigInteger
peerPublicValue
)
{
SecretKey
getAgreedSecret
(
BigInteger
peerPublicValue
,
boolean
keyIsValidated
)
throws
IOException
{
try
{
KeyFactory
kf
=
JsseJce
.
getKeyFactory
(
"DiffieHellman"
);
DHPublicKeySpec
spec
=
new
DHPublicKeySpec
(
peerPublicValue
,
modulus
,
base
);
PublicKey
publicKey
=
kf
.
generatePublic
(
spec
);
KeyAgreement
ka
=
JsseJce
.
getKeyAgreement
(
"DiffieHellman"
);
// validate the Diffie-Hellman public key
if
(!
keyIsValidated
&&
!
KeyUtil
.
isOracleJCEProvider
(
ka
.
getProvider
().
getName
()))
{
try
{
KeyUtil
.
validate
(
spec
);
}
catch
(
InvalidKeyException
ike
)
{
// prefer handshake_failure alert to internal_error alert
throw
new
SSLHandshakeException
(
ike
.
getMessage
());
}
}
ka
.
init
(
privateKey
);
ka
.
doPhase
(
publicKey
,
true
);
return
ka
.
generateSecret
(
"TlsPremasterSecret"
);
...
...
@@ -185,4 +215,33 @@ final class DHCrypt {
}
}
// Generate and validate DHPublicKeySpec
private
DHPublicKeySpec
generateDHPublicKeySpec
(
KeyPairGenerator
kpg
)
throws
GeneralSecurityException
{
boolean
doExtraValiadtion
=
(!
KeyUtil
.
isOracleJCEProvider
(
kpg
.
getProvider
().
getName
()));
for
(
int
i
=
0
;
i
<=
MAX_FAILOVER_TIMES
;
i
++)
{
KeyPair
kp
=
kpg
.
generateKeyPair
();
privateKey
=
kp
.
getPrivate
();
DHPublicKeySpec
spec
=
getDHPublicKeySpec
(
kp
.
getPublic
());
// validate the Diffie-Hellman public key
if
(
doExtraValiadtion
)
{
try
{
KeyUtil
.
validate
(
spec
);
}
catch
(
InvalidKeyException
ivke
)
{
if
(
i
==
MAX_FAILOVER_TIMES
)
{
throw
ivke
;
}
// otherwise, ignore the exception and try the next one
continue
;
}
}
return
spec
;
}
return
null
;
}
}
src/share/classes/sun/security/ssl/EngineInputRecord.java
浏览文件 @
e06c9d77
此差异已折叠。
点击以展开。
src/share/classes/sun/security/ssl/EngineOutputRecord.java
浏览文件 @
e06c9d77
/*
* Copyright (c) 2003, 201
2
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2003, 201
3
, 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
...
...
@@ -118,7 +118,7 @@ final class EngineOutputRecord extends OutputRecord {
throws
IOException
{
if
(
signer
.
MAClen
()
!=
0
)
{
byte
[]
hash
=
signer
.
compute
(
contentType
(),
bb
);
byte
[]
hash
=
signer
.
compute
(
contentType
(),
bb
,
false
);
/*
* position was advanced to limit in compute above.
...
...
src/share/classes/sun/security/ssl/HandshakeMessage.java
浏览文件 @
e06c9d77
...
...
@@ -41,12 +41,14 @@ import javax.security.auth.x500.X500Principal;
import
javax.crypto.KeyGenerator
;
import
javax.crypto.SecretKey
;
import
javax.crypto.spec.DHPublicKeySpec
;
import
javax.net.ssl.*
;
import
sun.security.internal.spec.TlsPrfParameterSpec
;
import
sun.security.ssl.CipherSuite.*
;
import
static
sun
.
security
.
ssl
.
CipherSuite
.
PRF
.*;
import
sun.security.util.KeyUtil
;
/**
* Many data structures are involved in the handshake messages. These
...
...
@@ -712,6 +714,7 @@ class DH_ServerKeyExchange extends ServerKeyExchange
this
.
protocolVersion
=
protocolVersion
;
this
.
preferableSignatureAlgorithm
=
null
;
// The DH key has been validated in the constructor of DHCrypt.
setValues
(
obj
);
signature
=
null
;
}
...
...
@@ -728,6 +731,7 @@ class DH_ServerKeyExchange extends ServerKeyExchange
this
.
protocolVersion
=
protocolVersion
;
// The DH key has been validated in the constructor of DHCrypt.
setValues
(
obj
);
Signature
sig
;
...
...
@@ -754,7 +758,8 @@ class DH_ServerKeyExchange extends ServerKeyExchange
* DH_anon key exchange
*/
DH_ServerKeyExchange
(
HandshakeInStream
input
,
ProtocolVersion
protocolVersion
)
throws
IOException
{
ProtocolVersion
protocolVersion
)
throws
IOException
,
GeneralSecurityException
{
this
.
protocolVersion
=
protocolVersion
;
this
.
preferableSignatureAlgorithm
=
null
;
...
...
@@ -762,6 +767,10 @@ class DH_ServerKeyExchange extends ServerKeyExchange
dh_p
=
input
.
getBytes16
();
dh_g
=
input
.
getBytes16
();
dh_Ys
=
input
.
getBytes16
();
KeyUtil
.
validate
(
new
DHPublicKeySpec
(
new
BigInteger
(
1
,
dh_Ys
),
new
BigInteger
(
1
,
dh_p
),
new
BigInteger
(
1
,
dh_g
)));
signature
=
null
;
}
...
...
@@ -782,6 +791,9 @@ class DH_ServerKeyExchange extends ServerKeyExchange
dh_p
=
input
.
getBytes16
();
dh_g
=
input
.
getBytes16
();
dh_Ys
=
input
.
getBytes16
();
KeyUtil
.
validate
(
new
DHPublicKeySpec
(
new
BigInteger
(
1
,
dh_Ys
),
new
BigInteger
(
1
,
dh_p
),
new
BigInteger
(
1
,
dh_g
)));
// read the signature and hash algorithm
if
(
protocolVersion
.
v
>=
ProtocolVersion
.
TLS12
.
v
)
{
...
...
src/share/classes/sun/security/ssl/InputRecord.java
浏览文件 @
e06c9d77
此差异已折叠。
点击以展开。
src/share/classes/sun/security/ssl/MAC.java
浏览文件 @
e06c9d77
此差异已折叠。
点击以展开。
src/share/classes/sun/security/ssl/OutputRecord.java
浏览文件 @
e06c9d77
/*
* Copyright (c) 1996, 201
2
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1996, 201
3
, 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
...
...
@@ -205,7 +205,7 @@ class OutputRecord extends ByteArrayOutputStream implements Record {
}
if
(
signer
.
MAClen
()
!=
0
)
{
byte
[]
hash
=
signer
.
compute
(
contentType
,
buf
,
headerSize
,
count
-
headerSize
);
headerSize
,
count
-
headerSize
,
false
);
write
(
hash
);
}
}
...
...
src/share/classes/sun/security/ssl/RSAClientKeyExchange.java
浏览文件 @
e06c9d77
...
...
@@ -34,7 +34,7 @@ import javax.crypto.*;
import
javax.net.ssl.*
;
import
sun.security.internal.spec.TlsRsaPremasterSecretParameterSpec
;
import
sun.security.util.Key
Length
;
import
sun.security.util.Key
Util
;
/**
* This is the client key exchange message (CLIENT --> SERVER) used with
...
...
@@ -191,7 +191,7 @@ final class RSAClientKeyExchange extends HandshakeMessage {
"unable to get the plaintext of the premaster secret"
);
}
int
keySize
=
Key
Length
.
getKeySize
(
secretKey
);
int
keySize
=
Key
Util
.
getKeySize
(
secretKey
);
if
(
keySize
>
0
&&
keySize
!=
384
)
{
// 384 = 48 * 8
if
(
debug
!=
null
&&
Debug
.
isOn
(
"handshake"
))
{
System
.
out
.
println
(
...
...
src/share/classes/sun/security/ssl/SSLEngineImpl.java
浏览文件 @
e06c9d77
/*
* Copyright (c) 2003, 201
2
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2003, 201
3
, 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
...
...
@@ -958,35 +958,15 @@ final public class SSLEngineImpl extends SSLEngine {
* throw a fatal alert if the integrity check fails.
*/
try
{
decryptedBB
=
inputRecord
.
decrypt
(
readCipher
,
readBB
);
decryptedBB
=
inputRecord
.
decrypt
(
read
MAC
,
read
Cipher
,
readBB
);
}
catch
(
BadPaddingException
e
)
{
// RFC 2246 states that decryption_failed should be used
// for this purpose. However, that allows certain attacks,
// so we just send bad record MAC. We also need to make
// sure to always check the MAC to avoid a timing attack
// for the same issue. See paper by Vaudenay et al.
//
// rewind the BB if necessary.
readBB
.
rewind
();
inputRecord
.
checkMAC
(
readMAC
,
readBB
);
// use the same alert types as for MAC failure below
byte
alertType
=
(
inputRecord
.
contentType
()
==
Record
.
ct_handshake
)
?
Alerts
.
alert_handshake_failure
:
Alerts
.
alert_bad_record_mac
;
fatal
(
alertType
,
"Invalid padding"
,
e
);
fatal
(
alertType
,
e
.
getMessage
()
,
e
);
}
if
(!
inputRecord
.
checkMAC
(
readMAC
,
decryptedBB
))
{
if
(
inputRecord
.
contentType
()
==
Record
.
ct_handshake
)
{
fatal
(
Alerts
.
alert_handshake_failure
,
"bad handshake record MAC"
);
}
else
{
fatal
(
Alerts
.
alert_bad_record_mac
,
"bad record MAC"
);
}
}
// if (!inputRecord.decompress(c))
// fatal(Alerts.alert_decompression_failure,
...
...
src/share/classes/sun/security/ssl/SSLSocketImpl.java
浏览文件 @
e06c9d77
此差异已折叠。
点击以展开。
src/share/classes/sun/security/ssl/ServerHandshaker.java
浏览文件 @
e06c9d77
此差异已折叠。
点击以展开。
src/share/classes/sun/security/ssl/SignatureAndHashAlgorithm.java
浏览文件 @
e06c9d77
...
...
@@ -38,7 +38,7 @@ import java.util.Collection;
import
java.util.Collections
;
import
java.util.ArrayList
;
import
sun.security.util.Key
Length
;
import
sun.security.util.Key
Util
;
/**
* Signature and hash algorithm.
...
...
@@ -274,7 +274,7 @@ final class SignatureAndHashAlgorithm {
* If key size is less than 512, the digest length should be
* less than or equal to 20 bytes.
*/
int
keySize
=
Key
Length
.
getKeySize
(
signingKey
);
int
keySize
=
Key
Util
.
getKeySize
(
signingKey
);
if
(
keySize
>=
768
)
{
maxDigestLength
=
HashAlgorithm
.
SHA512
.
length
;
}
else
if
((
keySize
>=
512
)
&&
(
keySize
<
768
))
{
...
...
src/share/classes/sun/security/util/DerIndefLenConverter.java
浏览文件 @
e06c9d77
...
...
@@ -325,6 +325,10 @@ class DerIndefLenConverter {
}
}
if
(
unresolved
!=
0
)
{
throw
new
IOException
(
"not all indef len BER resolved"
);
}
newData
=
new
byte
[
dataSize
+
numOfTotalLenBytes
+
unused
];
dataPos
=
0
;
newDataPos
=
0
;
index
=
0
;
...
...
src/share/classes/sun/security/util/DisabledAlgorithmConstraints.java
浏览文件 @
e06c9d77
此差异已折叠。
点击以展开。
src/share/classes/sun/security/util/Key
Length
.java
→
src/share/classes/sun/security/util/Key
Util
.java
浏览文件 @
e06c9d77
此差异已折叠。
点击以展开。
src/share/classes/sun/security/util/UntrustedCertificates.java
浏览文件 @
e06c9d77
此差异已折叠。
点击以展开。
src/share/lib/security/java.security-linux
浏览文件 @
e06c9d77
此差异已折叠。
点击以展开。
src/share/lib/security/java.security-macosx
浏览文件 @
e06c9d77
此差异已折叠。
点击以展开。
src/share/lib/security/java.security-solaris
浏览文件 @
e06c9d77
此差异已折叠。
点击以展开。
src/share/lib/security/java.security-windows
浏览文件 @
e06c9d77
此差异已折叠。
点击以展开。
src/share/native/com/sun/java/util/jar/pack/bands.cpp
浏览文件 @
e06c9d77
此差异已折叠。
点击以展开。
src/share/native/com/sun/java/util/jar/pack/bands.h
浏览文件 @
e06c9d77
此差异已折叠。
点击以展开。
src/share/native/com/sun/java/util/jar/pack/jni.cpp
浏览文件 @
e06c9d77
此差异已折叠。
点击以展开。
src/share/native/com/sun/java/util/jar/pack/unpack.cpp
浏览文件 @
e06c9d77
此差异已折叠。
点击以展开。
src/share/native/sun/awt/image/awt_parseImage.c
浏览文件 @
e06c9d77
此差异已折叠。
点击以展开。
src/share/native/sun/awt/image/awt_parseImage.h
浏览文件 @
e06c9d77
此差异已折叠。
点击以展开。
src/share/native/sun/awt/medialib/safe_alloc.h
浏览文件 @
e06c9d77
此差异已折叠。
点击以展开。
src/share/native/sun/awt/splashscreen/splashscreen_jpeg.c
浏览文件 @
e06c9d77
此差异已折叠。
点击以展开。
src/solaris/classes/sun/nio/ch/sctp/SctpChannelImpl.java
浏览文件 @
e06c9d77
此差异已折叠。
点击以展开。
src/solaris/classes/sun/nio/ch/sctp/SctpMultiChannelImpl.java
浏览文件 @
e06c9d77
此差异已折叠。
点击以展开。
src/solaris/native/sun/nio/ch/DatagramChannelImpl.c
浏览文件 @
e06c9d77
此差异已折叠。
点击以展开。
src/solaris/native/sun/nio/ch/sctp/SctpChannelImpl.c
浏览文件 @
e06c9d77
此差异已折叠。
点击以展开。
src/windows/bin/java_md.c
浏览文件 @
e06c9d77
此差异已折叠。
点击以展开。
src/windows/classes/sun/awt/windows/WComponentPeer.java
浏览文件 @
e06c9d77
此差异已折叠。
点击以展开。
src/windows/classes/sun/awt/windows/WEmbeddedFrame.java
浏览文件 @
e06c9d77
此差异已折叠。
点击以展开。
src/windows/native/sun/nio/ch/DatagramChannelImpl.c
浏览文件 @
e06c9d77
此差异已折叠。
点击以展开。
src/windows/native/sun/windows/awt_TextComponent.cpp
浏览文件 @
e06c9d77
此差异已折叠。
点击以展开。
src/windows/native/sun/windows/awt_TextComponent.h
浏览文件 @
e06c9d77
此差异已折叠。
点击以展开。
test/Makefile
浏览文件 @
e06c9d77
此差异已折叠。
点击以展开。
test/java/nio/channels/DatagramChannel/SendToUnresolved.java
浏览文件 @
e06c9d77
此差异已折叠。
点击以展开。
test/java/rmi/server/RMIClassLoader/loadProxyClasses/security.policy
浏览文件 @
e06c9d77
此差异已折叠。
点击以展开。
test/java/rmi/testlibrary/JavaVM.java
浏览文件 @
e06c9d77
此差异已折叠。
点击以展开。
test/java/util/logging/CustomLogManager.java
0 → 100644
浏览文件 @
e06c9d77
此差异已折叠。
点击以展开。
test/java/util/logging/CustomLogManagerTest.java
0 → 100644
浏览文件 @
e06c9d77
此差异已折叠。
点击以展开。
test/java/util/logging/SimpleLogManager.java
0 → 100644
浏览文件 @
e06c9d77
此差异已折叠。
点击以展开。
test/javax/management/remote/mandatory/subjectDelegation/SubjectDelegation2Test.java
浏览文件 @
e06c9d77
此差异已折叠。
点击以展开。
test/javax/management/remote/mandatory/subjectDelegation/SubjectDelegation3Test.java
浏览文件 @
e06c9d77
此差异已折叠。
点击以展开。
test/sun/security/mscapi/ShortRSAKeyWithinTLS.java
浏览文件 @
e06c9d77
此差异已折叠。
点击以展开。
test/tools/launcher/ToolsOpts.java
浏览文件 @
e06c9d77
此差异已折叠。
点击以展开。
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录