Merge
authorlana
Wed, 08 Apr 2009 15:40:56 -0700
changeset 1180e3b4eb55a696
parent 1179 a33222e53611
parent 1016 d1c43d1f5676
child 1181 e61d93fc8ed1
Merge
make/common/shared/Compiler.gmk
make/jprt.config
src/share/classes/sun/misc/JavaIODeleteOnExitAccess.java
     1.1 --- a/.hgtags	Thu Apr 02 10:16:53 2009 -0700
     1.2 +++ b/.hgtags	Wed Apr 08 15:40:56 2009 -0700
     1.3 @@ -24,3 +24,7 @@
     1.4  b4ac413b1f129eeef0acab3f31081c1b7dfe3b27 jdk7-b47
     1.5  5fbd9ea7def17186693b6f7099b5d0dc73903eee jdk7-b48
     1.6  8311105ea7a3db7bcbcb2b696459127c7f2297a4 jdk7-b49
     1.7 +58ba2cd5a25053684ec53205d95edeeaa0006f13 jdk7-b50
     1.8 +fea0898259ae41c73620b1815aa48f036216155c jdk7-b51
     1.9 +bcbeadb4a5d759b29e876ee2c83401e91ff22f60 jdk7-b52
    1.10 +a2033addca678f9e4c0d92ffa1e389171cc9321d jdk7-b53
     2.1 --- a/THIRD_PARTY_README	Thu Apr 02 10:16:53 2009 -0700
     2.2 +++ b/THIRD_PARTY_README	Wed Apr 08 15:40:56 2009 -0700
     2.3 @@ -61,6 +61,28 @@
     2.4  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     2.5  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
     2.6  THE POSSIBILITY OF SUCH DAMAGE.
     2.7 +
     2.8 +%% This notice is provided with respect to littlecms, which may be included with this software:  
     2.9 +
    2.10 +Little cms
    2.11 +Copyright (C) 1998-2004 Marti Maria
    2.12 +
    2.13 +Permission is hereby granted, free of charge, to any person obtaining a copy of
    2.14 +this software and associated documentation files (the "Software"), to deal in
    2.15 +the Software without restriction, including without limitation the rights to
    2.16 +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
    2.17 +the Software, and to permit persons to whom the Software is furnished to do so,
    2.18 +subject to the following conditions:
    2.19 +
    2.20 +The above copyright notice and this permission notice shall be included in all
    2.21 +copies or substantial portions of the Software.
    2.22 +
    2.23 +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    2.24 +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
    2.25 +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
    2.26 +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
    2.27 +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
    2.28 +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
    2.29  %% This notice is provided with respect to zlib 1.1.3, which may be included with this software:   
    2.30  
    2.31  Acknowledgments:
    2.32 @@ -115,16 +137,6 @@
    2.33  The name and trademarks of copyright holders may NOT be used in advertising or publicity pertaining to the software without specific, written prior permission. Title to copyright in this software and any associated documentation will at all times remain with copyright holders.
    2.34  ____________________________________
    2.35  This formulation of W3C's notice and license became active on August 14 1998 so as to improve compatibility with GPL. This version ensures that W3C software licensing terms are no more restrictive than GPL and consequently W3C software may be distributed in GPL packages. See the older formulation for the policy prior to this date. Please see our Copyright FAQ for common questions about using materials from our site, including specific terms and conditions for packages like libwww, Amaya, and Jigsaw. Other questions about this notice can be directed to site-policy@w3.org.
    2.36    2.37 -%% This notice is provided with respect to jscheme.jar, which may be included with this software: 
    2.38 -Software License Agreement
    2.39 -Copyright © 1998-2002 by Peter Norvig. 
    2.40 -Permission is granted to anyone to use this software, in source or object code form, on any computer system, and to modify, compile, decompile, run, and redistribute it to anyone else, subject to the following restrictions: 
    2.41 -1.The author makes no warranty of any kind, either expressed or implied, about the suitability of this software for any purpose.
    2.42 -2.The author accepts no liability of any kind for damages or other consequences of the use of this software, even if they arise from defects in the software.
    2.43 -3.The origin of this software must not be misrepresented, either by explicit claim or by omission.
    2.44 -4.Altered versions must be plainly marked as such, and must not be misrepresented as being the original software. Altered versions may be distributed in packages under other licenses (such as the GNU license). 
    2.45 -If you find this software useful, it would be nice if you let me (peter@norvig.com) know about it, and nicer still if you send me modifications that you are willing to share. However, you are not required to do so.
    2.46  
    2.47  
    2.48  %% This notice is provided with respect to PC/SC Lite for Suse Linux v. 1.1.1, which may be included with this software: 
     3.1 --- a/make/com/sun/jmx/Makefile	Thu Apr 02 10:16:53 2009 -0700
     3.2 +++ b/make/com/sun/jmx/Makefile	Wed Apr 08 15:40:56 2009 -0700
     3.3 @@ -41,7 +41,15 @@
     3.4  # Note : some targets are double colon rules and some single colon rules
     3.5  # within common included gmk files : that is why the following for loop
     3.6  # has been duplicated.
     3.7 -SUBDIRS = snmp
     3.8 +
     3.9 +# When building the openjdk, build snmp only if importing binary plugs,
    3.10 +ifdef OPENJDK
    3.11 +  ifeq ($(IMPORT_BINARY_PLUGS),true)
    3.12 +    SUBDIRS = snmp
    3.13 +  endif
    3.14 +else
    3.15 +  SUBDIRS = snmp
    3.16 +endif
    3.17  
    3.18  all build:
    3.19  	$(SUBDIRS-loop)
     4.1 --- a/make/common/Defs-linux.gmk	Thu Apr 02 10:16:53 2009 -0700
     4.2 +++ b/make/common/Defs-linux.gmk	Wed Apr 08 15:40:56 2009 -0700
     4.3 @@ -94,6 +94,9 @@
     4.4      OPTIMIZATION_LEVEL = LOWER
     4.5    endif
     4.6  endif
     4.7 +ifndef FASTDEBUG_OPTIMIZATION_LEVEL
     4.8 +  FASTDEBUG_OPTIMIZATION_LEVEL = LOWER
     4.9 +endif
    4.10  
    4.11  CC_OPT/NONE     = 
    4.12  CC_OPT/LOWER    = -O2
    4.13 @@ -116,6 +119,14 @@
    4.14  CFLAGS_REQUIRED         =  $(CFLAGS_REQUIRED_$(ARCH))
    4.15  LDFLAGS_COMMON          += $(LDFLAGS_COMMON_$(ARCH))
    4.16  
    4.17 +# If this is a --hash-style=gnu system, use --hash-style=both
    4.18 +#   The gnu .hash section won't work on some Linux systems like SuSE 10.
    4.19 +_HAS_HASH_STYLE_GNU:=$(shell $(CC) -dumpspecs | $(GREP) -- '--hash-style=gnu')
    4.20 +ifneq ($(_HAS_HASH_STYLE_GNU),)
    4.21 +  LDFLAGS_HASH_STYLE = -Wl,--hash-style=both
    4.22 +endif
    4.23 +LDFLAGS_COMMON          += $(LDFLAGS_HASH_STYLE)
    4.24 +
    4.25  #
    4.26  # Selection of warning messages
    4.27  #
    4.28 @@ -165,8 +176,8 @@
    4.29  
    4.30  # FASTDEBUG: Optimize the code in the -g versions, gives us a faster debug java
    4.31  ifeq ($(FASTDEBUG), true)
    4.32 -  CFLAGS_DBG    += $(CC_OPT/LOWER)
    4.33 -  CXXFLAGS_DBG	+= $(CC_OPT/LOWER)
    4.34 +  CFLAGS_DBG    += $(CC_OPT/$(FASTDEBUG_OPTIMIZATION_LEVEL))
    4.35 +  CXXFLAGS_DBG	+= $(CC_OPT/$(FASTDEBUG_OPTIMIZATION_LEVEL))
    4.36  endif
    4.37  
    4.38  CPPFLAGS_COMMON = -D$(ARCH) -DARCH='"$(ARCH)"' -DLINUX $(VERSION_DEFINES) \
     5.1 --- a/make/common/Defs-solaris.gmk	Thu Apr 02 10:16:53 2009 -0700
     5.2 +++ b/make/common/Defs-solaris.gmk	Wed Apr 08 15:40:56 2009 -0700
     5.3 @@ -93,6 +93,9 @@
     5.4      OPTIMIZATION_LEVEL = LOWER
     5.5    endif
     5.6  endif
     5.7 +ifndef FASTDEBUG_OPTIMIZATION_LEVEL
     5.8 +  FASTDEBUG_OPTIMIZATION_LEVEL = LOWER
     5.9 +endif
    5.10  
    5.11  #
    5.12  # If -Xa is in CFLAGS_COMMON it will end up ahead of $(CC_OPT) for the
    5.13 @@ -143,8 +146,8 @@
    5.14  #        Performance/size of files should be about the same, maybe smaller.
    5.15  #
    5.16  ifeq ($(FASTDEBUG), true)
    5.17 -  CFLAGS_DEBUG_OPTION    = -g  $(CC_OPT/LOWER)
    5.18 -  CXXFLAGS_DEBUG_OPTION  = -g0 $(CXX_OPT/LOWER)
    5.19 +  CFLAGS_DEBUG_OPTION    = -g  $(CC_OPT/$(FASTDEBUG_OPTIMIZATION_LEVEL))
    5.20 +  CXXFLAGS_DEBUG_OPTION  = -g0 $(CXX_OPT/$(FASTDEBUG_OPTIMIZATION_LEVEL))
    5.21  endif
    5.22  
    5.23  CFLAGS_COMMON   = -L$(OBJDIR)
     6.1 --- a/make/common/Defs-windows.gmk	Thu Apr 02 10:16:53 2009 -0700
     6.2 +++ b/make/common/Defs-windows.gmk	Wed Apr 08 15:40:56 2009 -0700
     6.3 @@ -70,7 +70,6 @@
     6.4  #     not to be REBASEd, see deploy/make/common/Release.gmk.
     6.5  #     msvcrt.dll, msvcrnn.dll [msvcr71 or msvcr80 or msvcr90] : Microsoft runtimes
     6.6  MS_RUNTIME_LIBRARIES = msvcrt.dll
     6.7 -MSVCRNN_DLL =
     6.8  ifeq ($(ARCH_DATA_MODEL), 32)
     6.9    ifeq ($(COMPILER_VERSION), VS2003)
    6.10      MSVCRNN_DLL = msvcr71.dll
    6.11 @@ -89,6 +88,13 @@
    6.12    endif
    6.13  endif
    6.14  
    6.15 +ifeq ($(ARCH_DATA_MODEL), 64)
    6.16 +  ifeq ($(COMPILER_VERSION), VS2008)
    6.17 +    MSVCRNN_DLL = msvcr90.dll
    6.18 +    MSVCPNN_DLL = msvcp90.dll
    6.19 +    MS_RUNTIME_LIBRARIES += $(MSVCRNN_DLL)
    6.20 +  endif
    6.21 +endif
    6.22  
    6.23  EXTRA_LFLAGS += /LIBPATH:$(DXSDK_LIB_PATH)
    6.24  
    6.25 @@ -105,6 +111,9 @@
    6.26      OPTIMIZATION_LEVEL = LOWER
    6.27    endif
    6.28  endif
    6.29 +ifndef FASTDEBUG_OPTIMIZATION_LEVEL
    6.30 +  FASTDEBUG_OPTIMIZATION_LEVEL = LOWER
    6.31 +endif
    6.32  
    6.33  ifeq ($(CC_VERSION),msvc)
    6.34    # Visual Studio .NET 2003 or VS2003 compiler option definitions:
    6.35 @@ -345,16 +354,11 @@
    6.36  CFLAGS_COMMON += $(COMPILER_WARNINGS_TO_IGNORE:%=-wd%)
    6.37  
    6.38  #
    6.39 -# Add warnings and extra on 64bit issues
    6.40 -#
    6.41 -ifeq ($(ARCH_DATA_MODEL), 64)
    6.42 -  CFLAGS_COMMON += -Wp64 
    6.43 -endif
    6.44 -
    6.45 -#
    6.46  # Treat compiler warnings as errors, if requested
    6.47  #
    6.48  CFLAGS_COMMON += -W$(COMPILER_WARNING_LEVEL)
    6.49 +# Turn off security warnings about using the standard C library function strcpy
    6.50 +CFLAGS_COMMON += -D _CRT_SECURE_NO_DEPRECATE
    6.51  ifeq ($(COMPILER_WARNINGS_FATAL),true)
    6.52    CFLAGS_COMMON += -WX
    6.53  endif
     7.1 --- a/make/common/Defs.gmk	Thu Apr 02 10:16:53 2009 -0700
     7.2 +++ b/make/common/Defs.gmk	Wed Apr 08 15:40:56 2009 -0700
     7.3 @@ -145,6 +145,11 @@
     7.4  #     2. ALT_BINARY_PLUGS_PATH overrides all locations of classes and libraries
     7.5  #     3. ALT_BUILD_BINARY_PLUGS_PATH is used to find a ALT_BINARY_PLUGS_PATH
     7.6  #     4. ALT_CLOSED_JDK_IMPORT_PATH is used to locate classes and libraries
     7.7 +#   Note: If any of the ALT_ variables are modified here, it is assumed
     7.8 +#         that the build should be done with IMPORT_BINARY_PLUGS=true as
     7.9 +#         well.  Otherwise the default will be IMPORT_BINARY_PLUGS=false.
    7.10 +#         Lastly, setting IMPORT_BINARY_PLUGS=false on the command line
    7.11 +#         will override this logic, and plugs will not be imported.
    7.12  #
    7.13  
    7.14  # Always needed, defines the name of the imported/exported jarfile
    7.15 @@ -155,9 +160,11 @@
    7.16      CLOSED_JDK_IMPORT_PATH = $(ALT_CLOSED_JDK_IMPORT_PATH)
    7.17      BINARY_PLUGS_PATH = $(CLOSED_JDK_IMPORT_PATH)
    7.18      BINARY_PLUGS_JARFILE = $(CLOSED_JDK_IMPORT_PATH)/jre/lib/rt.jar
    7.19 +    IMPORT_BINARY_PLUGS=true
    7.20    endif
    7.21    ifdef ALT_BUILD_BINARY_PLUGS_PATH
    7.22      BUILD_BINARY_PLUGS_PATH = $(ALT_BUILD_BINARY_PLUGS_PATH)
    7.23 +    IMPORT_BINARY_PLUGS=true
    7.24    else
    7.25      BUILD_BINARY_PLUGS_PATH = $(SLASH_JAVA)/re/jdk/$(JDK_VERSION)/promoted/latest/openjdk/binaryplugs
    7.26    endif
    7.27 @@ -166,9 +173,11 @@
    7.28    ifdef ALT_BINARY_PLUGS_PATH
    7.29      BINARY_PLUGS_PATH  = $(ALT_BINARY_PLUGS_PATH)
    7.30      BINARY_PLUGS_JARFILE = $(BINARY_PLUGS_PATH)/jre/lib/$(BINARY_PLUGS_JARNAME)
    7.31 +    IMPORT_BINARY_PLUGS=true
    7.32    endif
    7.33    ifdef ALT_BINARY_PLUGS_JARFILE
    7.34      BINARY_PLUGS_JARFILE = $(ALT_BINARY_PLUGS_JARFILE)
    7.35 +    IMPORT_BINARY_PLUGS=true
    7.36    endif
    7.37  endif # OPENJDK
    7.38  
     8.1 --- a/make/common/shared/Compiler-gcc.gmk	Thu Apr 02 10:16:53 2009 -0700
     8.2 +++ b/make/common/shared/Compiler-gcc.gmk	Wed Apr 08 15:40:56 2009 -0700
     8.3 @@ -27,8 +27,6 @@
     8.4  # GCC Compiler settings
     8.5  #
     8.6  
     8.7 -COMPILER_NAME=GCC
     8.8 -
     8.9  ifeq ($(PLATFORM), windows)
    8.10  
    8.11    # Settings specific to Windows, pretty stale, hasn't been used
    8.12 @@ -68,24 +66,6 @@
    8.13    else
    8.14      CXX            = $(COMPILER_PATH)g++
    8.15    endif
    8.16 -  ifneq ("$(findstring sparc,$(ARCH))", "")
    8.17 -    # sparc or sparcv9
    8.18 -    REQUIRED_CC_VER = 4.0
    8.19 -    REQUIRED_GCC_VER = 4.0.*
    8.20 -  else
    8.21 -    REQUIRED_CC_VER = 3.2
    8.22 -    ifeq ($(ARCH_DATA_MODEL), 32)
    8.23 -      REQUIRED_GCC_VER = 3.2.1*
    8.24 -      REQUIRED_GCC_VER_INT = 3.2.1-7a
    8.25 -    else
    8.26 -      ifeq ($(ARCH), amd64)
    8.27 -        REQUIRED_GCC_VER = 3.2.*
    8.28 -      endif
    8.29 -      ifeq ($(ARCH), ia64)
    8.30 -        REQUIRED_GCC_VER = 2.9[56789].*
    8.31 -      endif
    8.32 -    endif
    8.33 -  endif
    8.34    # Option used to create a shared library
    8.35    SHARED_LIBRARY_FLAG = -shared -mimpure-text
    8.36    SUN_COMP_VER := $(shell $(CC) --verbose 2>&1 )
    8.37 @@ -98,21 +78,17 @@
    8.38    CC             = $(COMPILER_PATH)gcc
    8.39    CPP            = $(COMPILER_PATH)gcc -E
    8.40    CXX            = $(COMPILER_PATH)g++
    8.41 -  REQUIRED_CC_VER = 3.2
    8.42  
    8.43    # Option used to create a shared library
    8.44    SHARED_LIBRARY_FLAG = -G
    8.45 -  # But gcc is still needed no matter what on 32bit
    8.46 -  ifeq ($(ARCH_DATA_MODEL), 32)
    8.47 -    REQUIRED_GCC_VER = 2.95
    8.48 -    GCC =$(GCC_COMPILER_PATH)gcc
    8.49 -    _GCC_VER :=$(shell $(GCC) -dumpversion 2>&1 )
    8.50 -    GCC_VER  :=$(call GetVersion,"$(_GCC_VER)")
    8.51 -  endif
    8.52 -
    8.53 +  
    8.54  endif
    8.55  
    8.56  # Get gcc version
    8.57  _CC_VER :=$(shell $(CC) -dumpversion 2>&1 )
    8.58  CC_VER  :=$(call GetVersion,"$(_CC_VER)")
    8.59  
    8.60 +# Name of compiler
    8.61 +COMPILER_NAME = GCC$(call MajorVersion,$(CC_VER))
    8.62 +COMPILER_VERSION = $(COMPILER_NAME)
    8.63 +
     9.1 --- a/make/common/shared/Compiler-msvc.gmk	Thu Apr 02 10:16:53 2009 -0700
     9.2 +++ b/make/common/shared/Compiler-msvc.gmk	Wed Apr 08 15:40:56 2009 -0700
     9.3 @@ -41,8 +41,6 @@
     9.4    # Fill in unknown values
     9.5    COMPILER_NAME=Unknown MSVC Compiler
     9.6    COMPILER_VERSION=
     9.7 -  REQUIRED_CC_VER=
     9.8 -  REQUIRED_LINK_VER=
     9.9    
    9.10    # unset any GNU Make settings of MFLAGS and MAKEFLAGS which may mess up nmake
    9.11    NMAKE          = MFLAGS= MAKEFLAGS= $(COMPILER_PATH)nmake -nologo
    9.12 @@ -56,8 +54,6 @@
    9.13      CC_MAJORVER :=$(call MajorVersion,$(CC_VER))
    9.14      ifeq ($(CC_MAJORVER), 13)
    9.15        # This should be: CC_VER=13.10.3077 LINK_VER=7.10.3077
    9.16 -      REQUIRED_CC_VER = 13.10.3077
    9.17 -      REQUIRED_LINK_VER = 7.10.3077
    9.18        COMPILER_NAME=Visual Studio .NET 2003 Professional C++
    9.19        COMPILER_VERSION=VS2003
    9.20        REBASE     = $(COMPILER_PATH)../../Common7/Tools/Bin/rebase
    9.21 @@ -67,9 +63,6 @@
    9.22        endif
    9.23      endif
    9.24      ifeq ($(CC_MAJORVER), 14)
    9.25 -      # This should be: CC_VER=14.00.50727.42 LINK_VER=8.00.50727.42
    9.26 -      REQUIRED_CC_VER = 14.00.50727.42
    9.27 -      REQUIRED_LINK_VER = 8.00.50727.42
    9.28        COMPILER_NAME=Visual Studio 8
    9.29        COMPILER_VERSION=VS2005
    9.30        REBASE     = $(COMPILER_PATH)../../Common8/Tools/Bin/rebase
    9.31 @@ -80,9 +73,6 @@
    9.32        endif
    9.33      endif
    9.34      ifeq ($(CC_MAJORVER), 15)
    9.35 -      # This should be: CC_VER=15.00.21022.08 LINK_VER=9.00.21022.08
    9.36 -      REQUIRED_CC_VER = 15.00.21022.08
    9.37 -      REQUIRED_LINK_VER = 9.00.21022.08
    9.38        COMPILER_NAME=Visual Studio 9
    9.39        COMPILER_VERSION=VS2008
    9.40        #rebase and midl moved out of Visual Studio into the SDK:
    9.41 @@ -99,14 +89,6 @@
    9.42      CC_MAJORVER :=$(call MajorVersion,$(CC_VER))
    9.43      CC_MINORVER :=$(call MinorVersion,$(CC_VER))
    9.44      CC_MICROVER :=$(call MicroVersion,$(CC_VER))
    9.45 -    ifeq ($(ARCH), ia64)
    9.46 -      REQUIRED_CC_VER = 13.00.9337.7
    9.47 -      REQUIRED_LINK_VER = 7.00.9337.7
    9.48 -    endif
    9.49 -    ifeq ($(ARCH), amd64)
    9.50 -      REQUIRED_CC_VER = 14.00.40310.41
    9.51 -      REQUIRED_LINK_VER = 8.00.40310.39
    9.52 -    endif
    9.53      ifeq ($(CC_MAJORVER), 13)
    9.54        ifeq ($(ARCH), ia64)
    9.55          # This should be: CC_VER=13.00.9337.7 LINK_VER=7.00.9337.7
    9.56 @@ -130,6 +112,12 @@
    9.57          endif
    9.58        endif
    9.59      endif
    9.60 +    ifeq ($(CC_MAJORVER), 15)
    9.61 +      COMPILER_NAME=Microsoft Windows SDK with Visual Studio 9 (6001.18000.367)
    9.62 +      COMPILER_VERSION=VS2008
    9.63 +      RC = $(MSSDK61)/Bin/X64/rc.exe
    9.64 +      MT = $(MSSDK61)/Bin/X64/mt.exe
    9.65 +    endif
    9.66      # This will cause problems if ALT_COMPILER_PATH is defined to ""
    9.67      # which is a directive to use the PATH.
    9.68      REBASE         = $(COMPILER_PATH)../REBASE
    10.1 --- a/make/common/shared/Compiler-sun.gmk	Thu Apr 02 10:16:53 2009 -0700
    10.2 +++ b/make/common/shared/Compiler-sun.gmk	Wed Apr 08 15:40:56 2009 -0700
    10.3 @@ -27,32 +27,20 @@
    10.4  # Sun Studio Compiler settings
    10.5  #
    10.6  
    10.7 -COMPILER_NAME=Sun Studio
    10.8 -
    10.9  # Sun Studio Compiler settings specific to Solaris
   10.10  ifeq ($(PLATFORM), solaris)
   10.11 -  COMPILER_VERSION=SS12
   10.12 -  REQUIRED_CC_VER=5.9
   10.13    CC             = $(COMPILER_PATH)cc
   10.14    CPP            = $(COMPILER_PATH)cc -E
   10.15    CXX            = $(COMPILER_PATH)CC
   10.16    LINT           = $(COMPILER_PATH)lint
   10.17    # Option used to create a shared library
   10.18    SHARED_LIBRARY_FLAG = -G
   10.19 -  # But gcc is still needed no matter what on 32bit
   10.20 -  ifeq ($(ARCH_DATA_MODEL), 32)
   10.21 -    REQUIRED_GCC_VER = 2.95
   10.22 -    GCC =$(GCC_COMPILER_PATH)gcc
   10.23 -    _GCC_VER :=$(shell $(GCC) -dumpversion 2>&1 )
   10.24 -    GCC_VER  :=$(call GetVersion,"$(_GCC_VER)")
   10.25 -  endif
   10.26 +  GCC =$(GCC_COMPILER_PATH)gcc
   10.27  endif
   10.28  
   10.29  # Sun Studio Compiler settings specific to Linux
   10.30  ifeq ($(PLATFORM), linux)
   10.31    # This has not been tested
   10.32 -  COMPILER_VERSION=SS12
   10.33 -  REQUIRED_CC_VER=5.9
   10.34    CC             = $(COMPILER_PATH)cc
   10.35    CPP            = $(COMPILER_PATH)cc -E
   10.36    CXX            = $(COMPILER_PATH)CC
   10.37 @@ -74,6 +62,18 @@
   10.38  _CC_VER :=$(shell $(CC) -V 2>&1 | $(HEAD) -n 1)
   10.39  CC_VER  :=$(call GetVersion,"$(_CC_VER)")
   10.40  
   10.41 +# Name of compilers being used
   10.42 +COMPILER_VERSION-5.7  = SS10
   10.43 +COMPILER_NAME-5.7     = Sun Studio 10
   10.44 +COMPILER_VERSION-5.8  = SS11
   10.45 +COMPILER_NAME-5.8     = Sun Studio 11
   10.46 +COMPILER_VERSION-5.9  = SS12
   10.47 +COMPILER_NAME-5.9     = Sun Studio 12
   10.48 +COMPILER_VERSION-5.10 = SS13
   10.49 +COMPILER_NAME-5.10    = Sun Studio 13
   10.50 +COMPILER_VERSION      = $(COMPILER_VERSION-$(CC_VER))
   10.51 +COMPILER_NAME         = $(COMPILER_NAME-$(CC_VER))
   10.52 +
   10.53  # Arch specific settings (determines type of .o files and instruction set)
   10.54  #  Starting in SS12 (5.9), the arch options changed.
   10.55  #  The assembler /usr/ccs/bin/as wants older SS11 (5.8) style options.
    11.1 --- a/make/common/shared/Compiler.gmk	Thu Apr 02 10:16:53 2009 -0700
    11.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    11.3 @@ -1,47 +0,0 @@
    11.4 -#
    11.5 -# Copyright 2005 Sun Microsystems, Inc.  All Rights Reserved.
    11.6 -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    11.7 -#
    11.8 -# This code is free software; you can redistribute it and/or modify it
    11.9 -# under the terms of the GNU General Public License version 2 only, as
   11.10 -# published by the Free Software Foundation.  Sun designates this
   11.11 -# particular file as subject to the "Classpath" exception as provided
   11.12 -# by Sun in the LICENSE file that accompanied this code.
   11.13 -#
   11.14 -# This code is distributed in the hope that it will be useful, but WITHOUT
   11.15 -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   11.16 -# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
   11.17 -# version 2 for more details (a copy is included in the LICENSE file that
   11.18 -# accompanied this code).
   11.19 -#
   11.20 -# You should have received a copy of the GNU General Public License version
   11.21 -# 2 along with this work; if not, write to the Free Software Foundation,
   11.22 -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
   11.23 -#
   11.24 -# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
   11.25 -# CA 95054 USA or visit www.sun.com if you need additional information or
   11.26 -# have any questions.
   11.27 -#
   11.28 -
   11.29 -#
   11.30 -# Compiler settings for all platforms and the default compiler for each.
   11.31 -#
   11.32 -
   11.33 -# Windows uses Microsoft compilers by default
   11.34 -ifeq ($(PLATFORM), windows)
   11.35 -  override CC_VERSION = msvc
   11.36 -endif
   11.37 -
   11.38 -# Solaris uses Sun Studio compilers by default
   11.39 -ifeq ($(PLATFORM), solaris)
   11.40 -  override CC_VERSION = sun
   11.41 -endif
   11.42 -
   11.43 -# Linux uses GNU compilers by default
   11.44 -ifeq ($(PLATFORM), linux)
   11.45 -  override CC_VERSION = gcc
   11.46 -endif
   11.47 -
   11.48 -# Get the compiler specific settings
   11.49 -include $(JDK_MAKE_SHARED_DIR)/Compiler-$(CC_VERSION).gmk
   11.50 -
    12.1 --- a/make/common/shared/Defs-java.gmk	Thu Apr 02 10:16:53 2009 -0700
    12.2 +++ b/make/common/shared/Defs-java.gmk	Wed Apr 08 15:40:56 2009 -0700
    12.3 @@ -59,7 +59,15 @@
    12.4      ADD_CLIENT_VM_OPTION = true
    12.5    endif
    12.6  endif
    12.7 -JAVA_JVM_FLAGS =
    12.8 +
    12.9 +# Options for hotspot to turn off printing of options with fastdebug version
   12.10 +#   and creating the hotspot.log file.
   12.11 +JAVA_HOTSPOT_DISABLE_PRINT_VMOPTIONS = \
   12.12 +   -XX:-PrintVMOptions -XX:+UnlockDiagnosticVMOptions -XX:-LogVMOutput
   12.13 +
   12.14 +# JVM options
   12.15 +JAVA_JVM_FLAGS = $(JAVA_HOTSPOT_DISABLE_PRINT_VMOPTIONS)
   12.16 +
   12.17  ifeq ($(ADD_CLIENT_VM_OPTION), true)
   12.18    JAVA_JVM_FLAGS += -client
   12.19  endif
   12.20 @@ -129,6 +137,9 @@
   12.21  # Needed for javah
   12.22  JAVAHFLAGS += -bootclasspath $(CLASSBINDIR)
   12.23  
   12.24 +# Needed for JAVADOC and BOOT_JAVACFLAGS
   12.25 +NO_PROPRIETARY_API_WARNINGS = -XDignore.symbol.file=true
   12.26 +
   12.27  # Langtools
   12.28  ifdef LANGTOOLS_DIST
   12.29    JAVAC_JAR   = $(LANGTOOLS_DIST)/bootstrap/lib/javac.jar
   12.30 @@ -192,6 +203,8 @@
   12.31  BOOT_JAVACFLAGS  += -encoding ascii
   12.32  BOOT_JAR_JFLAGS += $(JAR_JFLAGS)
   12.33  
   12.34 +BOOT_JAVACFLAGS  += $(NO_PROPRIETARY_API_WARNINGS)
   12.35 +
   12.36  BOOT_JAVA_CMD      = $(BOOTDIR)/bin/java $(JAVA_TOOLS_FLAGS)
   12.37  BOOT_JAVAC_CMD     = $(BOOTDIR)/bin/javac $(JAVAC_JVM_FLAGS) $(BOOT_JAVACFLAGS)
   12.38  BOOT_JAR_CMD       = $(BOOTDIR)/bin/jar
    13.1 --- a/make/common/shared/Defs-solaris.gmk	Thu Apr 02 10:16:53 2009 -0700
    13.2 +++ b/make/common/shared/Defs-solaris.gmk	Wed Apr 08 15:40:56 2009 -0700
    13.3 @@ -91,14 +91,14 @@
    13.4  ifneq "$(origin ALT_COMPILER_PATH)" "undefined"
    13.5    COMPILER_PATH :=$(call PrefixPath,$(ALT_COMPILER_PATH))
    13.6  else
    13.7 -  # Careful here, COMPILER_VERSION may not be defined yet (see Compiler.gmk)
    13.8 +  # Careful here, REQUIRED_COMPILER_VERSION may not be defined yet (see Defs-versions.gmk)
    13.9    # If the place where we keep a set of Sun Studio compilers doesn't exist,
   13.10    #  try and use /opt/SUNWspro, the default location for the SS compilers.
   13.11    #  (DirExists checks for this path twice, an automount double check)
   13.12    _SUNSTUDIO_SET_ROOT=$(JDK_DEVTOOLS_DIR)/$(ARCH_FAMILY)/SUNWspro
   13.13    SUNSTUDIO_SET_ROOT:=$(call DirExists,$(_SUNSTUDIO_SET_ROOT),$(_SUNSTUDIO_SET_ROOT),)
   13.14    ifneq ($(SUNSTUDIO_SET_ROOT),)
   13.15 -    COMPILER_PATH =$(SUNSTUDIO_SET_ROOT)/$(COMPILER_VERSION)/bin/
   13.16 +    COMPILER_PATH =$(SUNSTUDIO_SET_ROOT)/$(REQUIRED_COMPILER_VERSION)/bin/
   13.17    else
   13.18      COMPILER_PATH =/opt/SUNWspro/bin/
   13.19    endif
    14.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    14.2 +++ b/make/common/shared/Defs-versions.gmk	Wed Apr 08 15:40:56 2009 -0700
    14.3 @@ -0,0 +1,199 @@
    14.4 +#
    14.5 +# Copyright 2009 Sun Microsystems, Inc.  All Rights Reserved.
    14.6 +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    14.7 +#
    14.8 +# This code is free software; you can redistribute it and/or modify it
    14.9 +# under the terms of the GNU General Public License version 2 only, as
   14.10 +# published by the Free Software Foundation.  Sun designates this
   14.11 +# particular file as subject to the "Classpath" exception as provided
   14.12 +# by Sun in the LICENSE file that accompanied this code.
   14.13 +#
   14.14 +# This code is distributed in the hope that it will be useful, but WITHOUT
   14.15 +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   14.16 +# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
   14.17 +# version 2 for more details (a copy is included in the LICENSE file that
   14.18 +# accompanied this code).
   14.19 +#
   14.20 +# You should have received a copy of the GNU General Public License version
   14.21 +# 2 along with this work; if not, write to the Free Software Foundation,
   14.22 +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
   14.23 +#
   14.24 +# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
   14.25 +# CA 95054 USA or visit www.sun.com if you need additional information or
   14.26 +# have any questions.
   14.27 +#
   14.28 +
   14.29 +#
   14.30 +# WARNING: This file is shared with other workspaces.
   14.31 +#
   14.32 +
   14.33 +# This file needs these set: CC_VERSION, PLATFORM, ARCH_FAMILY, and ARCH_DATA_MODEL.
   14.34 +
   14.35 +##########################################################################
   14.36 +#
   14.37 +# List of JDK official minimum, expected, or required versions:
   14.38 +#
   14.39 +# REQUIRED_ALSA_VERSION
   14.40 +#   Linux only: The ALSA sound library version expected.
   14.41 +#
   14.42 +# REQUIRED_ANT_VER
   14.43 +#   The minimum 'ant' version.
   14.44 +#
   14.45 +# REQUIRED_BOOT_VER
   14.46 +#   The minimum boot jdk version.
   14.47 +#
   14.48 +# REQUIRED_CC_VER
   14.49 +#   The primary C compiler version expected.
   14.50 +#
   14.51 +# REQUIRED_COMPILER_NAME
   14.52 +#   The long descriptive name of the compiler we should use
   14.53 +#
   14.54 +# REQUIRED_COMPILER_VERSION
   14.55 +#   The one word name that identifies the compilers being used.
   14.56 +#
   14.57 +# REQUIRED_CYGWIN_VER
   14.58 +#   Windows only: If CYGWIN is used, the minimum CYGWIN version.
   14.59 +#
   14.60 +# REQUIRED_DXSDK_VER
   14.61 +#   Windows only: The version of DirectX SDK expected.
   14.62 +#
   14.63 +# REQUIRED_FREE_SPACE
   14.64 +#   The minimum disk space needed as determined by running 'du -sk' on a fully
   14.65 +#   built workspace.
   14.66 +#
   14.67 +# REQUIRED_FREETYPE_VERSION
   14.68 +#   If we are using freetype, the freetype version expected.
   14.69 +#
   14.70 +# REQUIRED_GCC_VER
   14.71 +#   Solaris and Linux only. The required version of gcc/g++ for the plugin.
   14.72 +#
   14.73 +# REQUIRED_LINK_VER
   14.74 +#   Windows only: The version of link.exe expected.
   14.75 +#
   14.76 +# REQUIRED_MAKE_VER
   14.77 +#   The minimum version of GNU make.
   14.78 +#
   14.79 +# REQUIRED_MKS_VER
   14.80 +#   Windows only: If MKS used instead of CYGWIN, the minimum version of MKS.
   14.81 +#
   14.82 +# REQUIRED_OS_VARIANT_NAME
   14.83 +#   The OS variation name required.
   14.84 +#     Solaris: Solaris or OpenSolaris
   14.85 +#     Windows: Windows2000, WindowsXP, Windows2003, etc.
   14.86 +#     Linux: Fedora, RedHat, SuSE, Ubuntu, etc.
   14.87 +#
   14.88 +# REQUIRED_OS_VARIANT_VERSION
   14.89 +#   The version number associated with the above OS variant name.
   14.90 +#     Solaris: output of uname -r
   14.91 +#     Windows: 5.0 for Windows2000, 5.1 for WindowsXP, 5.2 for Windows2003, etc.
   14.92 +#     Linux: number for the variant, e.g. 9 for Fedora 9
   14.93 +#
   14.94 +# REQUIRED_OS_VERSION
   14.95 +#   The formal OS version number.
   14.96 +#     Solaris & Windows: same as REQUIRED_OS_VARIANT_VERSION
   14.97 +#     Linux: the kernel version, or output of uname -r
   14.98 +#
   14.99 +# REQUIRED_UNZIP_VER
  14.100 +#   The minimum version of unzip.
  14.101 +#
  14.102 +# REQUIRED_ZIP_VER
  14.103 +#   The minimum version of unzip.
  14.104 +#
  14.105 +###########
  14.106 +#
  14.107 +# Differences in the build platform from these versions may trigger warnings
  14.108 +#   messages during the sanity checking when building the JDK.
  14.109 +#
  14.110 +# When building the OpenJDK most of these required or expected  versions are 
  14.111 +#  ignored or allowed to vary widely to accomodate the many build situations
  14.112 +#  of the OpenJDK.
  14.113 +#
  14.114 +##########################################################################
  14.115 +
  14.116 +# Solaris specific
  14.117 +ifeq ($(PLATFORM), solaris)
  14.118 +  REQUIRED_OS_VERSION         = 5.10
  14.119 +  REQUIRED_OS_VARIANT_NAME    = Solaris
  14.120 +  REQUIRED_OS_VARIANT_VERSION = $(REQUIRED_OS_VERSION)
  14.121 +  ifeq ($(ARCH_FAMILY), sparc)
  14.122 +    REQUIRED_FREE_SPACE       = 1300000
  14.123 +  else
  14.124 +    REQUIRED_FREE_SPACE       = 1040000
  14.125 +  endif
  14.126 +  REQUIRED_COMPILER_NAME      = Sun Studio 12
  14.127 +  REQUIRED_COMPILER_VERSION   = SS12
  14.128 +  ifeq ($(CC_VERSION),sun)
  14.129 +    REQUIRED_CC_VER           = 5.9
  14.130 +  endif
  14.131 +  ifeq ($(CC_VERSION),gcc)
  14.132 +    REQUIRED_CC_VER           = 3.4.3
  14.133 +  endif
  14.134 +  REQUIRED_GCC_VER            = 2.95.2
  14.135 +endif
  14.136 +
  14.137 +# Linux specific
  14.138 +ifeq ($(PLATFORM), linux)
  14.139 +  REQUIRED_OS_VERSION         = 2.6
  14.140 +  REQUIRED_OS_VARIANT_NAME    = Fedora
  14.141 +  REQUIRED_OS_VARIANT_VERSION = 9
  14.142 +  REQUIRED_FREE_SPACE         = 1460000
  14.143 +  REQUIRED_ALSA_VERSION       = 0.9.1
  14.144 +  REQUIRED_COMPILER_NAME      = GCC4
  14.145 +  REQUIRED_COMPILER_VERSION   = GCC4
  14.146 +  REQUIRED_GCC_VER            = 2.95
  14.147 +  ifeq ($(CC_VERSION),gcc)
  14.148 +    REQUIRED_CC_VER           = 4.3.0
  14.149 +  endif
  14.150 +  ifeq ($(CC_VERSION),sun)
  14.151 +    REQUIRED_CC_VER           = 5.9
  14.152 +  endif
  14.153 +endif
  14.154 +
  14.155 +# Windows specific
  14.156 +ifeq ($(PLATFORM), windows)
  14.157 +  ifeq ($(ARCH_DATA_MODEL),64)
  14.158 +    REQUIRED_OS_VERSION       = 5.2
  14.159 +    REQUIRED_OS_VARIANT_NAME  = Windows2003
  14.160 +  else
  14.161 +    REQUIRED_OS_VERSION       = 5.1
  14.162 +    REQUIRED_OS_VARIANT_NAME  = WindowsXP
  14.163 +  endif
  14.164 +  REQUIRED_OS_VARIANT_VERSION = $(REQUIRED_OS_VERSION)
  14.165 +  REQUIRED_CYGWIN_VER         = 4.0
  14.166 +  REQUIRED_MKS_VER            = 6.1
  14.167 +  REQUIRED_FREE_SPACE         = 500000
  14.168 +  REQUIRED_DXSDK_VER          = 0x0900
  14.169 +  ifeq ($(CC_VERSION),msvc)
  14.170 +    ifeq ($(ARCH_DATA_MODEL), 32)
  14.171 +      REQUIRED_COMPILER_NAME    = Visual Studio 9
  14.172 +      REQUIRED_COMPILER_VERSION = VS2008
  14.173 +      REQUIRED_CC_VER           = 15.00.21022.08
  14.174 +      REQUIRED_LINK_VER         = 9.00.21022.08
  14.175 +    else
  14.176 +      ifeq ($(ARCH), ia64)
  14.177 +        REQUIRED_COMPILER_NAME    = Microsoft Platform SDK - November 2001 Edition
  14.178 +        REQUIRED_COMPILER_VERSION = VS2003
  14.179 +        REQUIRED_CC_VER           = 13.00.9337.7
  14.180 +        REQUIRED_LINK_VER         = 7.00.9337.7
  14.181 +      endif
  14.182 +      ifeq ($(ARCH), amd64)
  14.183 +        REQUIRED_COMPILER_NAME    = Microsoft Windows SDK with Visual Studio 9 (6001.18000.367)
  14.184 +        REQUIRED_COMPILER_VERSION = VS2008
  14.185 +        REQUIRED_CC_VER           = 15.00.21022.08
  14.186 +        REQUIRED_LINK_VER         = 9.00.21022.08
  14.187 +      endif
  14.188 +    endif
  14.189 +  endif
  14.190 +  ifeq ($(CC_VERSION),gcc)
  14.191 +    REQUIRED_CC_VER           = 3.4.3
  14.192 +  endif
  14.193 +endif
  14.194 +
  14.195 +# Generic
  14.196 +REQUIRED_ANT_VER          = 1.6.3
  14.197 +REQUIRED_BOOT_VER         = 1.5
  14.198 +REQUIRED_FREETYPE_VERSION = 2.3.0
  14.199 +REQUIRED_MAKE_VER         = 3.78
  14.200 +REQUIRED_UNZIP_VER        = 5.12
  14.201 +REQUIRED_ZIP_VER          = 2.2
  14.202 +
    15.1 --- a/make/common/shared/Defs-windows.gmk	Thu Apr 02 10:16:53 2009 -0700
    15.2 +++ b/make/common/shared/Defs-windows.gmk	Wed Apr 08 15:40:56 2009 -0700
    15.3 @@ -136,10 +136,7 @@
    15.4  UNIXCOMMAND_PATH:=$(call AltCheckSpaces,UNIXCOMMAND_PATH)
    15.5  
    15.6  # Get version of MKS or CYGWIN
    15.7 -ifdef USING_CYGWIN
    15.8 -_CYGWIN_VER :=$(shell $(UNAME))
    15.9 -CYGWIN_VER  :=$(call GetVersion,$(_CYGWIN_VER))
   15.10 -else # MKS
   15.11 +ifndef USING_CYGWIN
   15.12  _MKS_VER :=$(shell $(MKSINFO) 2>&1 | $(GREP) Release | $(TAIL) -1 | $(SED) -e 's@.*\(Release.*\)@\1@')
   15.13  MKS_VER  :=$(call GetVersion,$(_MKS_VER))
   15.14  # At this point, we can re-define FullPath to use DOSNAME_CMD
   15.15 @@ -202,6 +199,7 @@
   15.16  endif
   15.17  ifeq ($(ARCH_DATA_MODEL), 32)
   15.18    _program_files     :=$(call FullPath,$(xPROGRAMFILES))
   15.19 +  _program_files32   :=$(_program_files)
   15.20  else
   15.21    ifdef PROGRAMW6432
   15.22      xPROGRAMW6432    :="$(subst \,/,$(PROGRAMW6432))"
   15.23 @@ -255,39 +253,51 @@
   15.24        _vs90tools     :=$(call FullPath,$(xVS90COMNTOOLS))
   15.25      endif
   15.26      ifneq ($(_vs90tools),)
   15.27 -      _msvc_dir :=$(_vs90tools)/../../Vc
   15.28 -      _redist_sdk   :=$(_msvc_dir)/../SDK/v3.5/Bin
   15.29 -    endif
   15.30 -    ifdef VS80COMNTOOLS  # /Common/Tools directory, use ../../Vc
   15.31 -      xVS80COMNTOOLS :="$(subst \,/,$(VS80COMNTOOLS))"
   15.32 -      _vs80tools     :=$(call FullPath,$(xVS80COMNTOOLS))
   15.33 -    endif
   15.34 -    ifneq ($(_vs80tools),)
   15.35 -      _msvc_dir :=$(_vs80tools)/../../Vc
   15.36 -      _redist_sdk   :=$(_msvc_dir)/../SDK/v2.0/Bin
   15.37 -    endif
   15.38 -    ifdef VS71COMNTOOLS  # /Common/Tools directory, use ../../Vc7
   15.39 -      xVS71COMNTOOLS :="$(subst \,/,$(VS71COMNTOOLS))"
   15.40 -      _vs71tools     :=$(call FullPath,$(xVS71COMNTOOLS))
   15.41 -    endif
   15.42 -    ifneq ($(_vs71tools),)
   15.43 -      _msvc_dir :=$(_vs71tools)/../../Vc7
   15.44 -      _redist_sdk    :=$(_vs71tools)/../..
   15.45 +      _msvc_dir   :=$(_vs90tools)/../../Vc
   15.46 +    else
   15.47 +      ifdef VS80COMNTOOLS  # /Common/Tools directory, use ../../Vc
   15.48 +        xVS80COMNTOOLS :="$(subst \,/,$(VS80COMNTOOLS))"
   15.49 +        _vs80tools     :=$(call FullPath,$(xVS80COMNTOOLS))
   15.50 +      endif
   15.51 +      ifneq ($(_vs80tools),)
   15.52 +        _msvc_dir   :=$(_vs80tools)/../../Vc
   15.53 +      else
   15.54 +        ifdef VS71COMNTOOLS  # /Common/Tools directory, use ../../Vc7
   15.55 +          xVS71COMNTOOLS :="$(subst \,/,$(VS71COMNTOOLS))"
   15.56 +          _vs71tools     :=$(call FullPath,$(xVS71COMNTOOLS))
   15.57 +        endif
   15.58 +        ifneq ($(_vs71tools),)
   15.59 +          _msvc_dir   :=$(_vs71tools)/../../Vc7
   15.60 +        endif
   15.61 +      endif
   15.62      endif
   15.63    endif
   15.64    ifneq ($(_msvc_dir),)
   15.65      _compiler_bin :=$(_msvc_dir)/Bin
   15.66 -    _ms_sdk       :=$(_msvc_dir)/PlatformSDK
   15.67 +    # Assume PlatformSDK is in VS71 (will be empty if VS90)
   15.68 +    _ms_sdk       :=$(call FullPath,$(_msvc_dir)/PlatformSDK)
   15.69 +    # Assume VS90, then VS80, then VS71
   15.70 +    _redist_sdk   :=$(call FullPath,$(_msvc_dir)/../SDK/v3.5/Bin)
   15.71 +    ifeq ($(_redist_sdk),)
   15.72 +      _redist_sdk   :=$(call FullPath,$(_msvc_dir)/../SDK/v2.0/Bin)
   15.73 +      ifeq ($(_redist_sdk),)
   15.74 +        _redist_sdk   :=$(call FullPath,$(_msvc_dir)/../SDK/v1.1/Bin)
   15.75 +      endif
   15.76 +    endif
   15.77    endif
   15.78  endif
   15.79  
   15.80  # The Microsoft Platform SDK installed by itself
   15.81  ifneq ($(_program_files),)
   15.82 -  xPSDK  :="$(_program_files)/Microsoft Platform SDK"
   15.83 -  _psdk  :=$(call FullPath,$(xPSDK))
   15.84 +  _PSDK :="$(_program_files)/Microsoft SDKs/Windows/v6.1/"
   15.85 +  _psdk :=$(call FullPath,$(xMSSDK61))
   15.86    ifeq ($(_psdk),)
   15.87 -    xPSDK  :="$(_program_files)/Microsoft SDK"
   15.88 -    _psdk :=$(call FullPath,$(xMSSDK))
   15.89 +    xPSDK  :="$(_program_files)/Microsoft Platform SDK"
   15.90 +    _psdk  :=$(call FullPath,$(xPSDK))
   15.91 +    ifeq ($(_psdk),)
   15.92 +      xPSDK  :="$(_program_files)/Microsoft SDK"
   15.93 +      _psdk :=$(call FullPath,$(xMSSDK))
   15.94 +    endif
   15.95    endif
   15.96  endif
   15.97  
   15.98 @@ -308,13 +318,22 @@
   15.99  
  15.100  # Compilers for 64bit are from SDK
  15.101  ifeq ($(ARCH_DATA_MODEL), 64)
  15.102 -  ifneq ($(_ms_sdk),)
  15.103 -    ifeq ($(ARCH), ia64)
  15.104 -      _compiler_bin :=$(_ms_sdk)/Bin/Win64
  15.105 -    endif
  15.106 -    ifeq ($(ARCH), amd64)
  15.107 -      _compiler_bin :=$(_ms_sdk)/Bin/Win64/x86/$(ARCH)
  15.108 -      _redist_sdk   :=$(_ms_sdk)/redist/win64/AMD64
  15.109 +  xVS2008 :="$(_program_files32)/Microsoft Visual Studio 9.0/"
  15.110 +  VS2008 :=$(call FullPath,$(xVS2008))
  15.111 +  ifneq ($(VS2008),)
  15.112 +    _compiler_bin :=$(VS2008)/VC/Bin/$(ARCH)
  15.113 +    xMSSDK61      :="$(_program_files)/Microsoft SDKs/Windows/v6.1/"
  15.114 +    MSSDK61       :=$(call FullPath,$(xMSSDK61))
  15.115 +    _redist_sdk   :=$(VS2008)/VC/redist/x86/Microsoft.VC90.CRT
  15.116 +  else
  15.117 +    ifneq ($(_ms_sdk),)
  15.118 +      ifeq ($(ARCH), ia64)
  15.119 +        _compiler_bin :=$(_ms_sdk)/Bin/Win64
  15.120 +      endif
  15.121 +      ifeq ($(ARCH), amd64)
  15.122 +        _compiler_bin :=$(_ms_sdk)/Bin/Win64/x86/$(ARCH)
  15.123 +        _redist_sdk   :=$(_ms_sdk)/redist/win64/AMD64
  15.124 +      endif
  15.125      endif
  15.126    endif
  15.127  endif
  15.128 @@ -417,70 +436,39 @@
  15.129    _BOOTDIR2  =$(USRJDKINSTANCES_PATH)/jdk$(PREVIOUS_JDK_VERSION)
  15.130  endif
  15.131  
  15.132 -# See if SDK area has a msvcrt.dll file, directory may exist w/o msvcr* files
  15.133 -_REDIST_SDK_EXISTS := $(shell \
  15.134 -	if [ -f "$(_redist_sdk)/msvcrt.dll" ]; then \
  15.135 -	  echo "true"; \
  15.136 -	else \
  15.137 -	  echo "false"; \
  15.138 -	fi)
  15.139 -_REDISTNN_SDK_EXISTS := $(shell \
  15.140 -	if [ -f "$(_redist_sdk)/$(MSVCRNN_DLL)" ]; then \
  15.141 -	  echo "true"; \
  15.142 -	else \
  15.143 -	  echo "false"; \
  15.144 -	fi)
  15.145 +# 32 bit always needs 2 runtimes, 64 bit usually does too
  15.146  
  15.147 -# 32 bit needs 2 runtimes
  15.148 +# MSVCRT_DLL_PATH: location of msvcrt.dll that will be re-distributed
  15.149 +ifdef ALT_MSVCRT_DLL_PATH
  15.150 +  xALT_MSVCRT_DLL_PATH :="$(subst \,/,$(ALT_MSVCRT_DLL_PATH))"
  15.151 +  MSVCRT_DLL_PATH      :=$(call FullPath,$(xALT_MSVCRT_DLL_PATH))
  15.152 +else
  15.153 +  MSVCRT_DLL_PATH :=$(call FullPath,$(_system_root)/system32/)
  15.154 +endif
  15.155 +MSVCRT_DLL_PATH:=$(call AltCheckSpaces,MSVCRT_DLL_PATH)
  15.156 +MSVCRT_DLL_PATH:=$(call AltCheckValue,MSVCRT_DLL_PATH)
  15.157 +
  15.158 +# 32bit always needs the MSVCRNN runtime, 64bit does when using VS2008
  15.159  ifeq ($(ARCH_DATA_MODEL), 32)
  15.160 +  _NEEDS_MSVCRNN = true
  15.161 +else
  15.162 +  ifeq ($(VS2008),)
  15.163 +    _NEEDS_MSVCRNN = false
  15.164 +  else
  15.165 +    _NEEDS_MSVCRNN = true
  15.166 +  endif
  15.167 +endif
  15.168  
  15.169 -  # MSVCRT_DLL_PATH: location of msvcrt.dll that will be re-distributed
  15.170 -  ifdef ALT_MSVCRT_DLL_PATH
  15.171 -    xALT_MSVCRT_DLL_PATH :="$(subst \,/,$(ALT_MSVCRT_DLL_PATH))"
  15.172 -    MSVCRT_DLL_PATH      :=$(call FullPath,$(xALT_MSVCRT_DLL_PATH))
  15.173 -  else
  15.174 -    ifeq ($(_REDIST_SDK_EXISTS), true)
  15.175 -      xREDIST_DIR   :=$(_redist_sdk)
  15.176 -    else
  15.177 -      xREDIST_DIR   :=$(_system_root)/system32
  15.178 -    endif
  15.179 -    MSVCRT_DLL_PATH :=$(call FullPath,$(xREDIST_DIR))
  15.180 -  endif
  15.181 -  MSVCRT_DLL_PATH:=$(call AltCheckSpaces,MSVCRT_DLL_PATH)
  15.182 -  MSVCRT_DLL_PATH:=$(call AltCheckValue,MSVCRT_DLL_PATH)
  15.183 -  
  15.184 +ifeq ($(_NEEDS_MSVCRNN), true)
  15.185    # MSVCRNN_DLL_PATH: location of msvcrnn.dll that will be re-distributed
  15.186    ifdef ALT_MSVCRNN_DLL_PATH
  15.187      xALT_MSVCRNN_DLL_PATH :="$(subst \,/,$(ALT_MSVCRNN_DLL_PATH))"
  15.188      MSVCRNN_DLL_PATH      :=$(call FullPath,$(xALT_MSVCRNN_DLL_PATH))
  15.189    else
  15.190 -    ifeq ($(_REDISTNN_SDK_EXISTS), true)
  15.191 -      xREDISTNN_DIR  :=$(_redist_sdk)
  15.192 -    else
  15.193 -      xREDISTNN_DIR  :=$(_system_root)/system32
  15.194 -    endif
  15.195 -    MSVCRNN_DLL_PATH :=$(call FullPath,$(xREDISTNN_DIR))
  15.196 +    MSVCRNN_DLL_PATH :=$(_redist_sdk)
  15.197    endif
  15.198    MSVCRNN_DLL_PATH :=$(call AltCheckSpaces,MSVCRNN_DLL_PATH)
  15.199    MSVCRNN_DLL_PATH:=$(call AltCheckValue,MSVCRNN_DLL_PATH)
  15.200 -  
  15.201 -else
  15.202 -
  15.203 -  # MSVCRT_DLL_PATH: location of msvcrt.dll that will be re-distributed
  15.204 -  ifdef ALT_MSVCRT_DLL_PATH
  15.205 -    xALT_MSVCRT_DLL_PATH :="$(subst \,/,$(ALT_MSVCRT_DLL_PATH))"
  15.206 -    MSVCRT_DLL_PATH      :=$(call FullPath,$(xALT_MSVCRT_DLL_PATH))
  15.207 -  else
  15.208 -    ifeq ($(_REDIST_SDK_EXISTS), true)
  15.209 -      xREDIST_DIR   :=$(_redist_sdk)
  15.210 -    else
  15.211 -      xREDIST_DIR   :=$(_system_root)/SysWOW64
  15.212 -    endif
  15.213 -    MSVCRT_DLL_PATH  :=$(call FullPath,$(xREDIST_DIR))
  15.214 -  endif
  15.215 -  MSVCRT_DLL_PATH:=$(call AltCheckSpaces,MSVCRT_DLL_PATH)
  15.216 -  MSVCRT_DLL_PATH:=$(call AltCheckValue,MSVCRT_DLL_PATH)
  15.217 -  
  15.218  endif
  15.219  
  15.220  # DXSDK_PATH: path to Microsoft DirectX SDK Include and Lib
  15.221 @@ -539,7 +527,7 @@
  15.222    xALT_INSTALL_MSIVAL2 :="$(subst \,/,$(ALT_INSTALL_MSIVAL2))"
  15.223    INSTALL_MSIVAL2      :=$(call FullPath,$(xALT_INSTALL_MSIVAL2))
  15.224  else
  15.225 -  INSTALL_MSIVAL2      :=$(_program_files)/MsiVal2
  15.226 +  INSTALL_MSIVAL2      :=$(_program_files32)/MsiVal2
  15.227  endif
  15.228  INSTALL_MSIVAL2:=$(call AltCheckSpaces,INSTALL_MSIVAL2)
  15.229  
    16.1 --- a/make/common/shared/Defs.gmk	Thu Apr 02 10:16:53 2009 -0700
    16.2 +++ b/make/common/shared/Defs.gmk	Wed Apr 08 15:40:56 2009 -0700
    16.3 @@ -116,9 +116,9 @@
    16.4    fi)
    16.5  endef
    16.6  
    16.7 -# Given a line of text, get the major.minor version number from it
    16.8 +# Given a line of text, get the version number from it
    16.9  define GetVersion
   16.10 -$(shell echo $1 | sed -e 's@[^1-9]*\([1-9][0-9]*\.[0-9][0-9]*\).*@\1@' )
   16.11 +$(shell echo $1 | sed -e 's@[^0-9]*\([0-9][0-9]*\.[0-9][.0-9]*\).*@\1@' )
   16.12  endef
   16.13  
   16.14  # Given a major.minor.micro version, return the major, minor, or micro number
   16.15 @@ -133,26 +133,26 @@
   16.16  endef
   16.17  
   16.18  # Macro that returns missing, same, newer, or older $1=version $2=required
   16.19 -#  (currently does not check the micro number)
   16.20  define CheckVersions
   16.21  $(shell \
   16.22    if [ "$1" = "" -o "$2" = "" ]; then \
   16.23      echo missing; \
   16.24 +  elif [ "$1" = "$2" ]; then \
   16.25 +    echo same; \
   16.26 +  elif [ $(call MajorVersion,$1) -lt $(call MajorVersion,$2) ] ; then \
   16.27 +    echo older; \
   16.28 +  elif [ $(call MajorVersion,$1) -gt $(call MajorVersion,$2) ] ; then \
   16.29 +    echo newer; \
   16.30 +  elif [ $(call MinorVersion,$1) -lt $(call MinorVersion,$2) ]; then \
   16.31 +    echo older; \
   16.32 +  elif [ $(call MinorVersion,$1) -gt $(call MinorVersion,$2) ]; then \
   16.33 +    echo newer; \
   16.34 +  elif [ $(call MicroVersion,$1) -lt $(call MicroVersion,$2) ]; then \
   16.35 +    echo older; \
   16.36 +  elif [ $(call MicroVersion,$1) -gt $(call MicroVersion,$2) ]; then \
   16.37 +    echo newer; \
   16.38    else \
   16.39 -    if [ "$1" = "$2" ]; then \
   16.40 -      echo same; \
   16.41 -    else \
   16.42 -      if [ $(call MajorVersion,$1) -lt $(call MajorVersion,$2) ] ; then \
   16.43 -        echo older; \
   16.44 -      else \
   16.45 -	if [ $(call MajorVersion,$1) -eq $(call MajorVersion,$2) -a \
   16.46 -	     $(call MinorVersion,$1) -lt $(call MinorVersion,$2) ]; then \
   16.47 -          echo older; \
   16.48 -        else \
   16.49 -          echo newer; \
   16.50 -        fi; \
   16.51 -      fi; \
   16.52 -    fi; \
   16.53 +    echo same; \
   16.54    fi)
   16.55  endef
   16.56  
   16.57 @@ -558,6 +558,24 @@
   16.58    COPYRIGHT_YEAR = $(shell $(DATE) '+%Y')
   16.59  endif
   16.60  
   16.61 -# Get shared compiler settings
   16.62 -include $(JDK_MAKE_SHARED_DIR)/Compiler.gmk
   16.63 +# Windows uses Microsoft compilers by default
   16.64 +ifeq ($(PLATFORM), windows)
   16.65 +  override CC_VERSION = msvc
   16.66 +endif
   16.67  
   16.68 +# Solaris uses Sun Studio compilers by default
   16.69 +ifeq ($(PLATFORM), solaris)
   16.70 +  override CC_VERSION = sun
   16.71 +endif
   16.72 +
   16.73 +# Linux uses GNU compilers by default
   16.74 +ifeq ($(PLATFORM), linux)
   16.75 +  override CC_VERSION = gcc
   16.76 +endif
   16.77 +
   16.78 +# Get the REQUIRED versions (needs CC_VERSION set)
   16.79 +include $(JDK_MAKE_SHARED_DIR)/Defs-versions.gmk
   16.80 +
   16.81 +# Get the compiler specific settings
   16.82 +include $(JDK_MAKE_SHARED_DIR)/Compiler-$(CC_VERSION).gmk
   16.83 +
    17.1 --- a/make/common/shared/Platform.gmk	Thu Apr 02 10:16:53 2009 -0700
    17.2 +++ b/make/common/shared/Platform.gmk	Wed Apr 08 15:40:56 2009 -0700
    17.3 @@ -51,9 +51,6 @@
    17.4  #     USER                        login name of user (minus blanks)
    17.5  #     PLATFORM                    windows, solaris, or linux
    17.6  #     VARIANT                     OPT or DBG, OPT is the default
    17.7 -#     OS_NAME                     solaris, linux, or nt
    17.8 -#     OS_VERSION                  specific version of os, 5.10, 2.4.9-e.3, etc.
    17.9 -#     OS_VENDOR                   company name
   17.10  #     TEMP_DISK                   /tmp or C:/temp
   17.11  #     ARCH_DATA_MODEL             32 or 64
   17.12  #     ARCH                        sparc, sparcv9, i586, amd64, or ia64
   17.13 @@ -72,29 +69,11 @@
   17.14  #     ISA_DIR                     solaris only: /sparcv9 or /amd64
   17.15  #     LIBARCH32                   solaris only: sparc or i386
   17.16  #     LIBARCH64                   solaris only: sparcv9 or amd64
   17.17 -#     REQUIRED_WINDOWS_VERSION    windows only: specific version of windows 
   17.18  #     USING_CYGWIN                windows only: true or false
   17.19 -#     WINDOWS_NT_VERSION_STRING   windows only: long version name
   17.20 -#     REQUIRED_OS_VERSION         required OS version, e.g. 5.10, 2.4
   17.21 -#     REQUIRED_FREE_SPACE         minimum disk space needed for outputdir
   17.22  #     ISHIELD_TEMP_MIN            windows only: minimum disk space in temp area
   17.23 -#     REQUIRED_ZIP_VER            required version of zip
   17.24 -#     REQUIRED_UNZIP_VER          required version of unzip
   17.25 -#     REQUIRED_DXSDK_VER          windows only: required version of DirectX
   17.26 -#     LINUX_VERSION_INFO          linux only: location of linux release file
   17.27 -#     REQUIRED_LINUX_VER          linux only: required version of linux
   17.28 -#     REQUIRED_LINUX_FULLVER      linux only: required full version of linux
   17.29 -#     REQUIRED_ALSA_VERSION       linux only: required version of ALSA
   17.30 -#     REQUIRED_FREETYPE_VERSION   openjdk only: required version of freetype 
   17.31  
   17.32  SYSTEM_UNAME := $(shell uname)
   17.33  
   17.34 -# Normal boot jdk is previous release, but a hard requirement is a 1.5 boot
   17.35 -REQUIRED_BOOT_VER = 1.5
   17.36 -
   17.37 -# If we are using freetype, this is the required version
   17.38 -REQUIRED_FREETYPE_VERSION=2.3.0
   17.39 -
   17.40  #
   17.41  # Prune out all known SCM (Source Code Management) directories
   17.42  # so they will not be included when copying directory trees
   17.43 @@ -113,8 +92,6 @@
   17.44  # Platform settings specific to Solaris
   17.45  ifeq ($(SYSTEM_UNAME), SunOS)
   17.46    PLATFORM = solaris
   17.47 -  OS_NAME = solaris
   17.48 -  OS_VERSION := $(shell uname -r)
   17.49    # Solaris sparc build can be either 32-bit or 64-bit.
   17.50    #   Default to 32, but allow explicit setting to 32 or 64.
   17.51    ifndef ARCH_DATA_MODEL
   17.52 @@ -166,16 +143,6 @@
   17.53    endif
   17.54    # Suffix for file bundles used in previous release
   17.55    BUNDLE_FILE_SUFFIX=.tar
   17.56 -  OS_VENDOR = Sun Microsystems
   17.57 -  # Required Solaris version
   17.58 -  REQUIRED_OS_VERSION = 5.10
   17.59 -  # Minimum disk space needed as determined by running 'du -sk' on 
   17.60 -  #    a fully built workspace.
   17.61 -  ifeq ($(ARCH_FAMILY), sparc)
   17.62 -    REQUIRED_FREE_SPACE=1300000
   17.63 -  else
   17.64 -    REQUIRED_FREE_SPACE=1040000
   17.65 -  endif
   17.66    # How much RAM does this machine have:
   17.67    MB_OF_MEMORY=$(shell /etc/prtconf | fgrep 'Memory size:' | expand | cut -d' ' -f3)
   17.68  endif
   17.69 @@ -183,8 +150,6 @@
   17.70  # Platform settings specific to Linux
   17.71  ifeq ($(SYSTEM_UNAME), Linux)
   17.72    PLATFORM = linux
   17.73 -  OS_NAME = linux
   17.74 -  OS_VERSION := $(shell uname -r)
   17.75    # Arch and OS name/version
   17.76    mach := $(shell uname -m)
   17.77    archExpr = case "$(mach)" in \
   17.78 @@ -242,32 +207,6 @@
   17.79  
   17.80    # Suffix for file bundles used in previous release
   17.81    BUNDLE_FILE_SUFFIX=.tar.gz
   17.82 -  # Minimum disk space needed as determined by running 'du -sk' on 
   17.83 -  #    a fully built workspace.
   17.84 -  REQUIRED_FREE_SPACE=1460000
   17.85 -  LINUX_VERSION_INFO = /etc/redhat-release
   17.86 -  OS_VENDOR = Red Hat
   17.87 -  ifeq ($(ARCH_DATA_MODEL), 32)
   17.88 -    REQUIRED_LINUX_VER = Advanced Server
   17.89 -    REQUIRED_LINUX_FULLVER = Advanced Server release 2.1AS
   17.90 -    REQUIRED_OS_VERSION = 2.4.9-e.3
   17.91 -  else
   17.92 -    ifeq ($(ARCH), amd64)
   17.93 -      LINUX_VERSION_INFO = /etc/SuSE-release
   17.94 -      OS_VENDOR = SuSE Enterprise
   17.95 -      REQUIRED_LINUX_VER = 8.1
   17.96 -      REQUIRED_LINUX_FULLVER = $(REQUIRED_LINUX_VER) SLSE AMD64
   17.97 -      REQUIRED_OS_VERSION = 2.4.19-SMP
   17.98 -    else
   17.99 -      REQUIRED_LINUX_VER = Advanced Server
  17.100 -      REQUIRED_LINUX_FULLVER = Advanced Server release 2.1AS 64 bit
  17.101 -      REQUIRED_OS_VERSION = 2.4.19-SMP
  17.102 -    endif
  17.103 -  endif
  17.104 -  ifneq ($(ARCH), ia64)
  17.105 -    # ALSA 0.9.1 and above
  17.106 -    REQUIRED_ALSA_VERSION = ^((0[.]9[.][1-9])|(1[.]0[.][0-9]))[0-9]*
  17.107 -  endif
  17.108    # How much RAM does this machine have:
  17.109    MB_OF_MEMORY := $(shell free -m | fgrep Mem: | awk '{print $$2;}' )
  17.110  endif
  17.111 @@ -275,34 +214,34 @@
  17.112  # Windows with and without CYGWIN will be slightly different
  17.113  ifeq ($(SYSTEM_UNAME), Windows_NT)
  17.114    PLATFORM = windows
  17.115 -  OS_VERSION := $(shell uname -r)
  17.116 -  WINDOWS_NT_VERSION_STRING=Windows_NT
  17.117 -  REQUIRED_MKS_VER=6.1
  17.118  endif
  17.119  ifneq (,$(findstring CYGWIN,$(SYSTEM_UNAME)))
  17.120    PLATFORM = windows
  17.121 -  OS_VERSION := 5
  17.122    USING_CYGWIN = true
  17.123    export USING_CYGWIN
  17.124 -  WINDOWS_NT_VERSION_STRING=CYGWIN_NT
  17.125 -  REQUIRED_CYGWIN_VER=4.0
  17.126  endif
  17.127  
  17.128  # Platform settings specific to Windows
  17.129  ifeq ($(PLATFORM), windows)
  17.130 -  OS_NAME = nt
  17.131 -  REQUIRED_OS_VERSION=5
  17.132    # Windows builds default to the appropriate for the underlaying
  17.133    # architecture.
  17.134    # Temporary disk area
  17.135    TEMP_DISK=C:/temp
  17.136    # GNU Make or MKS overrides $(PROCESSOR_ARCHITECTURE) to always
  17.137    # return "x86". Use the first word of $(PROCESSOR_IDENTIFIER) instead.
  17.138 +  PROC_ARCH:=$(word 1, $(PROCESSOR_IDENTIFIER))
  17.139 +  PROC_ARCH:=$(subst x86,X86,$(PROC_ARCH))
  17.140 +  PROC_ARCH:=$(subst Intel64,X64,$(PROC_ARCH))
  17.141 +  PROC_ARCH:=$(subst em64t,X64,$(PROC_ARCH))
  17.142 +  PROC_ARCH:=$(subst EM64T,X64,$(PROC_ARCH))
  17.143 +  PROC_ARCH:=$(subst amd64,X64,$(PROC_ARCH))
  17.144 +  PROC_ARCH:=$(subst AMD64,X64,$(PROC_ARCH))
  17.145 +  PROC_ARCH:=$(subst ia64,IA64,$(PROC_ARCH))
  17.146    ifndef ARCH_DATA_MODEL
  17.147 -    ifeq ($(word 1, $(PROCESSOR_IDENTIFIER)),ia64)
  17.148 +    ifeq ($(PROC_ARCH),IA64)
  17.149        ARCH_DATA_MODEL=64
  17.150      else
  17.151 -      ifeq ($(word 1, $(PROCESSOR_IDENTIFIER)),AMD64)
  17.152 +      ifeq ($(PROC_ARCH),X64)
  17.153          ARCH_DATA_MODEL=64
  17.154        else
  17.155          ARCH_DATA_MODEL=32
  17.156 @@ -314,18 +253,17 @@
  17.157      # If the user wants to perform a cross compile build then they must
  17.158      # - set ARCH_DATA_MODEL=64 and either
  17.159      #      + set ARCH to ia64 or amd64, or
  17.160 -    REQUIRED_WINDOWS_VERSION=Server 2003 Enterprise x64 Edition
  17.161 -    ifeq ($(word 1, $(PROCESSOR_IDENTIFIER)), AMD64)
  17.162 +    ifeq ($(PROC_ARCH),X64)
  17.163        ARCH=amd64
  17.164      else
  17.165 -      ARCH=ia64
  17.166 +      ifeq ($(PROC_ARCH),IA64)
  17.167 +        ARCH=ia64
  17.168 +      endif
  17.169      endif
  17.170      LIBARCH=$(ARCH)
  17.171      # Value of Java os.arch property
  17.172      ARCHPROP=$(LIBARCH)
  17.173    else
  17.174 -    REQUIRED_WINDOWS_VERSION=2000 or Unknown
  17.175 -    #REQUIRED_WINDOWS_VERSION=XP Professional
  17.176      # LIBARCH is used to preserve the jre/lib/i386 directory name for 32-bit intel
  17.177      ARCH=i586
  17.178      LIBARCH=i386
  17.179 @@ -364,14 +302,9 @@
  17.180    ARCH_VM_SUBDIR=jre/bin
  17.181    # Suffix for file bundles used in previous release
  17.182    BUNDLE_FILE_SUFFIX=.tar
  17.183 -  # Minimum disk space needed as determined by running 'du -sk' on 
  17.184 -  #    a fully built workspace.
  17.185 -  REQUIRED_FREE_SPACE=500000
  17.186    # ISHIELD_TEMP_MIN is the difference of an empty C:\TEMP vs. one after a
  17.187    #     bundles build on windows.
  17.188    ISHIELD_TEMP_MIN=250000
  17.189 -  REQUIRED_DXSDK_VER = 0x0900
  17.190 -  OS_VENDOR = Microsoft
  17.191    # How much RAM does this machine have:
  17.192    ifeq ($(JDK_HAS_MEM_INFO),)
  17.193      ifeq ($(USING_CYGWIN),true)
  17.194 @@ -410,10 +343,6 @@
  17.195    endif
  17.196  endif
  17.197  
  17.198 -REQUIRED_ZIP_VER = 2.2
  17.199 -REQUIRED_UNZIP_VER = 5.12
  17.200 -REQUIRED_MAKE_VER = 3.78
  17.201 -
  17.202  # Unix type settings (same for all unix platforms)
  17.203  ifneq ($(PLATFORM), windows)
  17.204    # Temporary disk area
    18.1 --- a/make/common/shared/Sanity-Settings.gmk	Thu Apr 02 10:16:53 2009 -0700
    18.2 +++ b/make/common/shared/Sanity-Settings.gmk	Wed Apr 08 15:40:56 2009 -0700
    18.3 @@ -97,7 +97,7 @@
    18.4  endif
    18.5  ifeq ($(PLATFORM),windows)
    18.6    ALL_SETTINGS+=$(call addAltSetting,MSVCRT_DLL_PATH)
    18.7 -  ifeq ($(ARCH_DATA_MODEL), 32)
    18.8 +  ifneq ($(MSVCRNN_DLL),)
    18.9      ALL_SETTINGS+=$(call addAltSetting,MSVCRNN_DLL_PATH)
   18.10    endif
   18.11    ALL_SETTINGS+=$(call addAltSetting,MSDEVTOOLS_PATH)
   18.12 @@ -167,8 +167,6 @@
   18.13  ifeq ($(PLATFORM),windows)
   18.14    ALL_SETTINGS+=$(call addRequiredSetting,PROCESSOR_ARCHITECTURE)
   18.15    ALL_SETTINGS+=$(call addRequiredSetting,PROCESSOR_IDENTIFIER)
   18.16 -  ALL_SETTINGS+=$(call addRequiredSetting,WINDOWS_VERSION)
   18.17 -  ALL_SETTINGS+=$(call addRequiredSetting,WINDOWS_NT_VERSION_STRING)
   18.18    ifdef USING_CYGWIN
   18.19      ALL_SETTINGS+=$(call addRequiredSetting,USING_CYGWIN)
   18.20      ALL_SETTINGS+=$(call addRequiredVersionSetting,CYGWIN_VER)
   18.21 @@ -179,13 +177,11 @@
   18.22    endif
   18.23  endif
   18.24  ifeq ($(PLATFORM),linux)
   18.25 -  ALL_SETTINGS+=$(call addRequiredSetting,LINUX_VERSION)
   18.26 -  ifneq ($(ARCH), ia64)
   18.27 -    ALL_SETTINGS+=$(call addRequiredSetting,ALSA_VERSION)
   18.28 -  endif
   18.29 +  ALL_SETTINGS+=$(call addRequiredSetting,ALSA_VERSION)
   18.30  endif
   18.31  ALL_SETTINGS+=$(call addRequiredVersionSetting,OS_VERSION)
   18.32 -ALL_SETTINGS+=$(call addRequiredSetting,OS_NAME)
   18.33 +ALL_SETTINGS+=$(call addOptionalSetting,OS_VARIANT_NAME)
   18.34 +ALL_SETTINGS+=$(call addOptionalSetting,OS_VARIANT_VERSION)
   18.35  ALL_SETTINGS+=$(call addRequiredSetting,TEMP_FREE_SPACE)
   18.36  ALL_SETTINGS+=$(call addRequiredSetting,FREE_SPACE)
   18.37  ALL_SETTINGS+=$(call addRequiredSetting,MB_OF_MEMORY)
   18.38 @@ -249,6 +245,7 @@
   18.39    ALL_SETTINGS+=$(call addAltSetting,FREETYPE_HEADERS_PATH)
   18.40    ALL_SETTINGS+=$(call addAltSetting,FREETYPE_LIB_PATH)
   18.41    ALL_SETTINGS+=$(call addHeading,OPENJDK Import Binary Plug Settings)
   18.42 +  ALL_SETTINGS+=$(call addOptionalSetting,IMPORT_BINARY_PLUGS)
   18.43    ALL_SETTINGS+=$(call addAltSetting,BINARY_PLUGS_JARFILE)
   18.44    ALL_SETTINGS+=$(call addAltSetting,BINARY_PLUGS_PATH)
   18.45    ALL_SETTINGS+=$(call addAltSetting,BUILD_BINARY_PLUGS_PATH)
    19.1 --- a/make/common/shared/Sanity.gmk	Thu Apr 02 10:16:53 2009 -0700
    19.2 +++ b/make/common/shared/Sanity.gmk	Wed Apr 08 15:40:56 2009 -0700
    19.3 @@ -38,60 +38,106 @@
    19.4  SANITY_FILES =  $(ERROR_FILE) $(WARNING_FILE) $(MESSAGE_FILE)
    19.5  
    19.6  # How to say "The Release Engineering people use this"
    19.7 -THE_OFFICIAL_USES=The official $(PLATFORM) builds use
    19.8 +THE_OFFICIAL_USES=The official builds on $(PLATFORM) use
    19.9  
   19.10  # How to say "You are using:"
   19.11  YOU_ARE_USING=You appear to be using
   19.12  
   19.13 +# Error message
   19.14 +define SanityError
   19.15 +$(ECHO) "ERROR: $1\n" >> $(ERROR_FILE)
   19.16 +endef
   19.17 +
   19.18 +# Warning message
   19.19 +define SanityWarning
   19.20 +$(ECHO) "WARNING: $1\n" >> $(WARNING_FILE)
   19.21 +endef
   19.22 +
   19.23 +# Official version error message: name version required_version
   19.24 +define OfficialErrorMessage
   19.25 +$(call SanityError,\
   19.26 +$(THE_OFFICIAL_USES) $1 $3. Your $1 $(if $2,undefined,$2) will not work.)
   19.27 +endef
   19.28 +
   19.29 +# Official version warning message: name version required_version
   19.30 +define OfficialWarningMessage
   19.31 +$(call SanityWarning,\
   19.32 +$(THE_OFFICIAL_USES) $1 $3. $(YOU_ARE_USING) $1 $2.)
   19.33 +endef
   19.34 +
   19.35 +
   19.36  # Settings and rules to validate the JDK build environment.
   19.37  
   19.38  ifeq ($(PLATFORM), solaris)
   19.39    FREE_SPACE := $(shell $(DF) -b $(OUTPUTDIR) | $(TAIL) -1 | $(NAWK) '{print $$2;}')
   19.40    TEMP_FREE_SPACE := $(shell $(DF) -b $(TEMP_DISK) | $(TAIL) -1 | $(NAWK) '{print $$2;}')
   19.41 +  # What kind of system we are using (Variations are Solaris and OpenSolaris)
   19.42 +  OS_VERSION := $(shell uname -r)
   19.43 +  OS_VARIANT_NAME := $(strip $(shell head -1 /etc/release | awk '{print $$1;}') )
   19.44 +  OS_VARIANT_VERSION := $(OS_VERSION)
   19.45    REQ_PATCH_LIST = $(JDK_TOPDIR)/make/PatchList.solaris
   19.46    ifeq ($(ARCH_FAMILY), sparc)
   19.47      PATCH_POSITION = $$4
   19.48    else
   19.49      PATCH_POSITION = $$6
   19.50    endif
   19.51 +  ifndef OPENJDK
   19.52 +    _GCC_VER :=$(shell $(GCC) -dumpversion 2>&1 )
   19.53 +    GCC_VER  :=$(call GetVersion,"$(_GCC_VER)")
   19.54 +  endif
   19.55  endif
   19.56  
   19.57  ifeq ($(PLATFORM), linux)
   19.58    FREE_SPACE := $(shell $(DF) --sync -kP $(OUTPUTDIR) | $(TAIL) -1 | $(NAWK) '{print $$4;}')
   19.59    TEMP_FREE_SPACE := $(shell $(DF) --sync -kP $(TEMP_DISK) | $(TAIL) -1 | $(NAWK) '{print $$4;}')
   19.60 -  ifeq ($(ARCH), amd64)
   19.61 -    LINUX_VERSION := $(shell \
   19.62 -        if [ -r "$(LINUX_VERSION_INFO)" ] ; then \
   19.63 -          $(CAT) $(LINUX_VERSION_INFO) | $(TAIL) -1 | $(NAWK) '{ print $$3; }';\
   19.64 -        else \
   19.65 -          $(ECHO) "Unknown linux"; \
   19.66 -        fi )
   19.67 -  else
   19.68 -    LINUX_VERSION := $(shell \
   19.69 -        if [ -r "$(LINUX_VERSION_INFO)" ] ; then \
   19.70 -          $(NAWK) '{ print $$4" "$$5; }' $(LINUX_VERSION_INFO) ; \
   19.71 -        else \
   19.72 -          $(ECHO) "Unknown linux"; \
   19.73 -        fi )
   19.74 -  endif
   19.75 -  ifneq ($(ARCH), ia64)
   19.76 -    # dummy program that outputs ALSA's version (created in target sane-alsa-versioncheck)
   19.77 -    ALSA_VERSION_CHECK = $(TEMPDIR)/alsaversioncheck
   19.78 -    ALSA_VERSION = `if [ -f "$(ALSA_VERSION_CHECK)" ] ; then $(ALSA_VERSION_CHECK) ; fi`
   19.79 -  endif
   19.80 +  # What kind of system we are using (Variation is the Linux vendor)
   19.81 +  OS_VERSION := $(shell uname -r)
   19.82 +  OS_VARIANT_NAME := $(shell \
   19.83 +    if [ -f /etc/fedora-release ] ; then \
   19.84 +      echo "Fedora"; \
   19.85 +    elif [ -f /etc/redhat-release ] ; then \
   19.86 +      echo "RedHat"; \
   19.87 +    elif [ -f /etc/SuSE-release ] ; then \
   19.88 +      echo "SuSE"; \
   19.89 +    else \
   19.90 +      echo "Unknown"; \
   19.91 +    fi)
   19.92 +  OS_VARIANT_VERSION := $(shell \
   19.93 +    if [ "$(OS_VARIANT_NAME)" = "Fedora" ] ; then \
   19.94 +      $(CAT) /etc/fedora-release | $(HEAD) -1 | $(NAWK) '{ print $$3; }' ; \
   19.95 +    fi)
   19.96 +  ALSA_INCLUDE=/usr/include/alsa/version.h
   19.97 +  ALSA_LIBRARY=/usr/lib/libasound.so
   19.98 +  _ALSA_VERSION := $(shell $(EGREP) SND_LIB_VERSION_STR $(ALSA_INCLUDE) | \
   19.99 +           $(SED) -e 's@.*\"\(.*\)\".*@\1@' )
  19.100 +  ALSA_VERSION := $(call GetVersion,$(_ALSA_VERSION))
  19.101  endif
  19.102  
  19.103  ifeq ($(PLATFORM), windows)
  19.104    FREE_SPACE := $(shell $(DF) -kP $(OUTPUTDIR) | $(TAIL) -1 | $(NAWK) '{print $$4;}')
  19.105    TEMP_FREE_SPACE := $(shell $(DF) -kP $(TEMP_DISK) | $(TAIL) -1 | $(NAWK) '{print $$4;}')
  19.106 -  # Localized systeminfo has localized labels, but not localized values.
  19.107 -  _WINDOWS_VERSION := \
  19.108 -    $(shell systeminfo 2> $(DEV_NULL) | grep 'Microsoft' | grep 'Windows' | \
  19.109 -	 cut -d':' -f2)
  19.110 -  ifeq ($(_WINDOWS_VERSION),)
  19.111 -    _WINDOWS_VERSION := Windows 2000 or Unknown (no systeminfo utility)
  19.112 +  # Windows 2000 is 5.0, Windows XP is 5.1, Windows 2003 is 5.2
  19.113 +  #    Assume 5.0 (Windows 2000) if systeminfo does not help
  19.114 +  WINDOWS_MAPPING-5.0 := Windows2000
  19.115 +  WINDOWS_MAPPING-5.1 := WindowsXP
  19.116 +  WINDOWS_MAPPING-5.2 := Windows2003
  19.117 +  # What kind of system we are using (Variation is the common name)
  19.118 +  _OS_VERSION := \
  19.119 +    $(shell systeminfo 2> $(DEV_NULL) | \
  19.120 +            egrep '^OS Version:' | \
  19.121 +            awk '{print $$3;}' )
  19.122 +  ifeq ($(_OS_VERSION),)
  19.123 +    OS_VERSION = 5.0
  19.124 +  else
  19.125 +    OS_VERSION = $(call MajorVersion,$(_OS_VERSION)).$(call MinorVersion,$(_OS_VERSION))
  19.126    endif
  19.127 -  WINDOWS_VERSION := $(strip $(_WINDOWS_VERSION))
  19.128 +  OS_VARIANT_NAME := $(WINDOWS_MAPPING-$(OS_VERSION))
  19.129 +  OS_VARIANT_VERSION := $(OS_VERSION)
  19.130 +  ifdef USING_CYGWIN
  19.131 +    # CYGWIN version
  19.132 +    _CYGWIN_VER := $(SYSTEM_UNAME)
  19.133 +    CYGWIN_VER  :=$(call GetVersion,$(_CYGWIN_VER))
  19.134 +  endif
  19.135    DXSDK_VER := $(shell $(EGREP) DIRECT3D_VERSION $(DXSDK_INCLUDE_PATH)/d3d9.h 2>&1 | \
  19.136      $(EGREP) "\#define" | $(NAWK) '{print $$3}')
  19.137  endif
  19.138 @@ -106,7 +152,6 @@
  19.139  UNZIP_VER  :=$(call GetVersion,"$(_UNZIP_VER)")
  19.140  BOOT_VER   :=$(call GetVersion,"$(_BOOT_VER)")
  19.141  
  19.142 -REQUIRED_ANT_VER := 1.6.3
  19.143  _ANT_VER:=$(shell $(ANT) -version 2>&1 )
  19.144  ANT_VER:=$(call GetVersion,"$(_ANT_VER)")
  19.145  
  19.146 @@ -167,7 +212,6 @@
  19.147  	sane-compiler \
  19.148  	sane-link \
  19.149  	sane-cacerts \
  19.150 -	sane-alsa-versioncheck \
  19.151  	sane-alsa-headers \
  19.152  	sane-ant_version \
  19.153  	sane-zip_version \
  19.154 @@ -239,35 +283,29 @@
  19.155  #         generate a fatal sanity error, and a warning about the official
  19.156  #         build platform just becomes clutter.
  19.157  ######################################################
  19.158 -OS_CHECK :=$(call CheckVersions,$(OS_VERSION),$(REQUIRED_OS_VERSION))
  19.159 +ifndef OPENJDK
  19.160 +  OS_VERSION_CHECK := \
  19.161 +    $(call CheckVersions,$(OS_VERSION),$(REQUIRED_OS_VERSION))
  19.162 +  ifeq ($(OS_VARIANT_NAME),$(REQUIRED_OS_VARIANT_NAME))
  19.163 +    OS_VARIANT_VERSION_CHECK := \
  19.164 +      $(call CheckVersions,$(OS_VARIANT_VERSION),$(REQUIRED_OS_VARIANT_VERSION))
  19.165 +  endif
  19.166 +endif
  19.167  sane-os_version:: sane-arch_data_model sane-memory_check sane-locale sane-os_patch_level
  19.168  ifndef OPENJDK
  19.169 -	@if [ "$(OS_CHECK)" = "missing" ]; then \
  19.170 -	  $(ECHO) "ERROR: The $(PLATFORM) OS version is undefined (Try: uname -r). \n" \
  19.171 -	    "" >> $(ERROR_FILE) ; \
  19.172 -	fi
  19.173 -	@if [ "$(OS_CHECK)" != "same" ]; then \
  19.174 -	  $(ECHO) "WARNING: $(THE_OFFICIAL_USES) OS version $(REQUIRED_OS_VERSION). \n" \
  19.175 -	    "        $(YOU_ARE_USING) OS version $(OS_VERSION). \n" \
  19.176 -	    "" >> $(WARNING_FILE) ; \
  19.177 -	fi
  19.178 -  ifeq ($(PLATFORM), windows)
  19.179 -	@if [ "$(findstring $(REQUIRED_WINDOWS_VERSION),$(WINDOWS_VERSION))" = "" ]; then \
  19.180 -	    $(ECHO) "WARNING: $(YOU_ARE_USING) an unknown version of Windows. \n" \
  19.181 -	      "        The required version is $(REQUIRED_WINDOWS_VERSION). \n" \
  19.182 -	      "        $(YOU_ARE_USING) $(WINDOWS_VERSION) \n" \
  19.183 -	      "" >> $(WARNING_FILE) ; \
  19.184 -	fi
  19.185 -  endif # windows
  19.186 -  ifeq ($(PLATFORM), linux)
  19.187 -	@if [ `$(ECHO) "$(LINUX_VERSION)" | $(EGREP) -c '$(REQUIRED_LINUX_VER)'` -ne 1 ]; then \
  19.188 -	  $(ECHO) "WARNING: The build is being done on Linux $(LINUX_VERSION). \n" \
  19.189 -	    "        $(THE_OFFICIAL_USES) Linux $(REQUIRED_LINUX_VER), \n" \
  19.190 -	    "        specifically Linux $(REQUIRED_LINUX_FULLVER). \n" \
  19.191 -	    "        The version found was '$(OS_VERSION)'. \n" \
  19.192 -	    "" >> $(WARNING_FILE) ; \
  19.193 -	fi
  19.194 -  endif # linux
  19.195 +  ifneq ($(OS_VARIANT_NAME),$(REQUIRED_OS_VARIANT_NAME))
  19.196 +    ifeq ($(OS_VERSION_CHECK),missing)
  19.197 +	@$(call OfficialErrorMessage,OS version,$(OS_VERSION),$(REQUIRED_OS_VERSION))
  19.198 +    endif
  19.199 +    ifneq ($(OS_VERSION_CHECK),same)
  19.200 +	@$(call OfficialWarningMessage,OS version,$(OS_VERSION),$(REQUIRED_OS_VERSION))
  19.201 +    endif
  19.202 +	@$(call OfficialWarningMessage,OS variant,$(OS_VARIANT_NAME),$(REQUIRED_OS_VARIANT_NAME))
  19.203 +  else
  19.204 +    ifneq ($(OS_VARIANT_VERSION_CHECK),same)
  19.205 +	@$(call OfficialWarningMessage,$(OS_VARIANT_NAME) version,$(OS_VARIANT_VERSION),$(REQUIRED_OS_VARIANT_VERSION))
  19.206 +    endif
  19.207 +  endif
  19.208  endif # OPENJDK
  19.209  
  19.210  ifeq ($(PLATFORM), windows)
  19.211 @@ -308,16 +346,12 @@
  19.212    CYGWIN_CHECK :=$(call CheckVersions,$(CYGWIN_VER),$(REQUIRED_CYGWIN_VER))
  19.213  sane-cygwin:
  19.214    ifdef USING_CYGWIN
  19.215 -	@if [ "$(CYGWIN_CHECK)" = "missing" ]; then \
  19.216 -	  $(ECHO) "ERROR: The CYGWIN version is undefined. \n" \
  19.217 -	    "      $(THE_OFFICIAL_USES) CYGWIN $(REQUIRED_CYGWIN_VER). \n" \
  19.218 -	    "" >> $(ERROR_FILE) ; \
  19.219 -	fi
  19.220 -	@if [ "$(CYGWIN_CHECK)" = "older" ]; then \
  19.221 -	  $(ECHO) "ERROR: The build cannot be done on CYGWIN $(CYGWIN_VER). \n" \
  19.222 -	    "      Use CYGWIN $(REQUIRED_CYGWIN_VER) or higher. \n" \
  19.223 -	    "" >> $(ERROR_FILE) ; \
  19.224 -	fi
  19.225 +    ifeq ($(CYGWIN_CHECK),missing)
  19.226 +	@$(call OfficialErrorMessage,CYGWIN version,$(CYGWIN_VER),$(REQUIRED_CYGWIN_VER))
  19.227 +    endif
  19.228 +    ifeq ($(CYGWIN_CHECK),older)
  19.229 +	@$(call OfficialWarningMessage,CYGWIN version,$(CYGWIN_VER),$(REQUIRED_CYGWIN_VER))
  19.230 +    endif
  19.231    endif
  19.232  endif
  19.233  
  19.234 @@ -345,16 +379,12 @@
  19.235      MKS_CHECK :=$(call CheckVersions,$(MKS_VER),$(REQUIRED_MKS_VER))
  19.236  sane-mks:
  19.237    ifndef USING_CYGWIN
  19.238 -	@if [ "$(MKS_CHECK)" = "missing" ]; then \
  19.239 -	  $(ECHO) "ERROR: The MKS version is undefined. \n" \
  19.240 -	    "      $(THE_OFFICIAL_USES) MKS $(REQUIRED_MKS_VER). \n" \
  19.241 -	    "" >> $(ERROR_FILE) ; \
  19.242 -	fi
  19.243 -	@if [ "$(MKS_CHECK)" = "older" ]; then \
  19.244 -	  $(ECHO) "ERROR: The build cannot be done on MKS $(MKS_VER). \n" \
  19.245 -	    "      Use MKS $(REQUIRED_MKS_VER) or higher. \n" \
  19.246 -	    "" >> $(ERROR_FILE) ; \
  19.247 -	fi
  19.248 +    ifeq ($(MKS_CHECK),missing)
  19.249 +	@$(call OfficialErrorMessage,MKS version,$(MKS_VER),$(REQUIRED_MKS_VER))
  19.250 +    endif
  19.251 +    ifeq ($(MKS_CHECK),older)
  19.252 +	@$(call OfficialErrorMessage,MKS version,$(MKS_VER),$(REQUIRED_MKS_VER))
  19.253 +    endif
  19.254    endif
  19.255  endif
  19.256  
  19.257 @@ -472,13 +502,15 @@
  19.258  ######################################################
  19.259  ifdef OPENJDK
  19.260  sane-binary-plugs:
  19.261 +  ifeq ($(IMPORT_BINARY_PLUGS),true)
  19.262  	@if [ ! -d "$(BINARY_PLUGS_PATH)" ]; then \
  19.263 -	  $(ECHO) "ERROR: Can't locate pre-built libraries. \n" \
  19.264 +	  $(ECHO) "WARNING: Can't locate pre-built libraries. \n" \
  19.265  	    "      Please check your access to \n" \
  19.266  	    "          $(BINARY_PLUGS_PATH) \n" \
  19.267  	    "      and/or check your value of ALT_BINARY_PLUGS_PATH. \n" \
  19.268 -	   "" >> $(ERROR_FILE); \
  19.269 +	   "" >> $(WARNING_FILE); \
  19.270  	fi
  19.271 +  endif
  19.272  endif
  19.273  
  19.274  ######################################################
  19.275 @@ -834,7 +866,7 @@
  19.276  	    "      and/or check your value of ALT_MSVCRT_DLL_PATH. \n" \
  19.277  	    "" >> $(ERROR_FILE) ; \
  19.278  	fi
  19.279 -  ifeq ($(ARCH_DATA_MODEL), 32)
  19.280 +  ifneq ($(MSVCRNN_DLL),)
  19.281  	@if [ ! -r "$(MSVCRNN_DLL_PATH)/$(MSVCRNN_DLL)" ]; then \
  19.282  	  $(ECHO) "ERROR: You do not have access to $(MSVCRNN_DLL). \n" \
  19.283  	    "      Please check your access to \n" \
  19.284 @@ -1284,8 +1316,8 @@
  19.285  	fi
  19.286  	@if [ "$(LINK_CHECK)" != "same" ]; then \
  19.287  	  $(ECHO) "WARNING: To build Java 2 SDK $(JDK_VERSION) you need : \n" \
  19.288 -	    "      $(COMPILER_VERSION) - link.exe version \"$(REQUIRED_LINK_VER)\" \n" \
  19.289 -	      "      Specifically the $(COMPILER_NAME) link.exe. \n " \
  19.290 +	    "      $(REQUIRED_COMPILER_VERSION) - link.exe version \"$(REQUIRED_LINK_VER)\" \n" \
  19.291 +	      "      Specifically the $(REQUIRED_COMPILER_NAME) link.exe. \n " \
  19.292  	    "      $(YOU_ARE_USING) Linker version \"$(LINK_VER)\" \n" \
  19.293  	    "" >> $(WARNING_FILE) ; \
  19.294  	fi
  19.295 @@ -1295,11 +1327,6 @@
  19.296  # Check the compiler version(s)
  19.297  ######################################################
  19.298  CC_CHECK  :=$(call CheckVersions,$(CC_VER),$(REQUIRED_CC_VER))
  19.299 -ifeq ($(PLATFORM), solaris)
  19.300 -  ifeq ($(ARCH_DATA_MODEL), 32)
  19.301 -    GCC_CHECK :=$(call CheckVersions,$(GCC_VER),$(REQUIRED_GCC_VER))
  19.302 -  endif
  19.303 -endif
  19.304  sane-compiler: sane-link
  19.305  	@if [ "$(CC_CHECK)" = "missing" ]; then \
  19.306  	  $(ECHO) "ERROR: The Compiler version is undefined. \n" \
  19.307 @@ -1307,69 +1334,36 @@
  19.308  	fi
  19.309  ifndef OPENJDK
  19.310  	@if [ "$(CC_CHECK)" != "same" ]; then \
  19.311 -	      $(ECHO) "WARNING: The $(PLATFORM) compiler is not version $(COMPILER_VERSION) $(REQUIRED_CC_VER) \n" \
  19.312 -	      "      Specifically the $(COMPILER_NAME) compiler. \n " \
  19.313 -	      "      $(YOU_ARE_USING) compiler version: $(CC_VER) \n" \
  19.314 +	      $(ECHO) "WARNING: The $(PLATFORM) compiler is not version $(REQUIRED_COMPILER_VERSION) $(REQUIRED_CC_VER) \n" \
  19.315 +	      "      Specifically the $(REQUIRED_COMPILER_NAME) compiler. \n " \
  19.316 +	      "      $(YOU_ARE_USING) $(COMPILER_VERSION): $(CC_VER) \n" \
  19.317  	      "      The compiler was obtained from the following location: \n" \
  19.318  	      "          $(COMPILER_PATH) \n" \
  19.319  	      "" >> $(WARNING_FILE) ; \
  19.320           fi
  19.321 -  ifdef GCC_CHECK
  19.322 -	  @if [ "$(GCC_CHECK)" != "same" ]; then \
  19.323 -	      $(ECHO) "WARNING: The $(PLATFORM) GCC compiler must be version $(REQUIRED_GCC_VER) \n" \
  19.324 -	      "      $(YOU_ARE_USING) compiler version: $(GCC_VER) \n" \
  19.325 -	      "      The compiler was obtained from the following location: \n" \
  19.326 -	      "          $(GCC_COMPILER_PATH) \n" \
  19.327 -	      "      Please change your compiler. \n" \
  19.328 -	      "" >> $(WARNING_FILE) ; \
  19.329 -	  fi
  19.330 -  endif
  19.331 -  ifeq ($(PLATFORM), windows)
  19.332 -    ifeq ($(ARCH_DATA_MODEL), 64)
  19.333 -      ifneq ($(COMPILER_VERSION), VS2005)
  19.334 -	@$(ECHO) "WARNING: Should be using VS2005 compiler on 64bit platform. \n" \
  19.335 -	    "" >> $(WARNING_FILE)
  19.336 -      endif
  19.337 -    endif
  19.338 -  endif
  19.339  endif
  19.340  
  19.341  ######################################################
  19.342  # Check that ALSA headers and libs are installed and 
  19.343  # that the header has the right version. We only
  19.344 -# need /usr/include/alsa/*.h and /usr/lib/libasound.so
  19.345 +# need /usr/include/alsa/version.h and /usr/lib/libasound.so
  19.346  ######################################################
  19.347  
  19.348 -ifdef ALSA_VERSION_CHECK
  19.349 -$(ALSA_VERSION_CHECK): $(ALSA_VERSION_CHECK).c
  19.350 -	@$(prep-target)
  19.351 -	@$(CC) -lasound -o $@ $<
  19.352 -
  19.353 -$(ALSA_VERSION_CHECK).c:
  19.354 -	@$(prep-target)
  19.355 -	@$(ECHO) "#include <alsa/asoundlib.h>\n" \
  19.356 -		 "#include <stdio.h>\n" \
  19.357 -		 "int main(int argc, char** argv) {\n" \
  19.358 -		 "  printf(\"%s\", SND_LIB_VERSION_STR);\n" \
  19.359 -		 "  return 0;\n" \
  19.360 -		 "}\n" \
  19.361 -                    > $@
  19.362 +ifdef REQUIRED_ALSA_VERSION
  19.363 +  ALSA_CHECK := $(call CheckVersions,$(ALSA_VERSION),$(REQUIRED_ALSA_VERSION))
  19.364  endif
  19.365 -
  19.366 -sane-alsa-versioncheck: $(ALSA_VERSION_CHECK)
  19.367 -sane-alsa-headers: sane-alsa-versioncheck
  19.368 -ifdef ALSA_VERSION_CHECK
  19.369 -	@if [ -f "$(ALSA_VERSION_CHECK)" ]; then \
  19.370 -	  if [ `$(ALSA_VERSION_CHECK) | $(EGREP) -c '$(REQUIRED_ALSA_VERSION)'` -ne 1 ] ; then \
  19.371 -	    $(ECHO) "ERROR: The ALSA version must be 0.9.1 or higher. \n" \
  19.372 -	      "      You have the following ALSA version installed: $(ALSA_VERSION) \n" \
  19.373 +sane-alsa-headers:
  19.374 +ifdef REQUIRED_ALSA_VERSION
  19.375 +        if [ "$(ALSA_CHECK)" != "same" -a "$(ALSA_CHECK)" != "newer"  ] ; then \
  19.376 +	    $(ECHO) "ERROR: The ALSA version must be $(REQUIRED_ALSA_VERSION) or higher. \n" \
  19.377 +	      "      You have the following ALSA version installed: $${alsa_version) \n" \
  19.378  	      "      Please reinstall ALSA (drivers and lib). You can download \n" \
  19.379  	      "      the source distribution from http://www.alsa-project.org \n" \
  19.380  	      "      or go to http://www.freshrpms.net/docs/alsa/ for precompiled RPM packages. \n" \
  19.381  	      "" >> $(ERROR_FILE) ; \
  19.382  	  fi \
  19.383  	else \
  19.384 -	  $(ECHO) "ERROR: You seem to not have installed ALSA 0.9.1 or higher. \n" \
  19.385 +	  $(ECHO) "ERROR: You seem to not have installed ALSA $(REQUIRED_ALSA_VERSION) or higher. \n" \
  19.386  	  "      Please install ALSA (drivers and lib). You can download the \n" \
  19.387  	  "      source distribution from http://www.alsa-project.org or go to \n" \
  19.388  	  "      http://www.freshrpms.net/docs/alsa/ for precompiled RPM packages. \n" \
  19.389 @@ -1384,7 +1378,7 @@
  19.390  ######################################################
  19.391  # dump out the variable settings...
  19.392  ######################################################
  19.393 -sane-settings:: sane-alsa-versioncheck
  19.394 +sane-settings::
  19.395  	@$(ECHO)  >> $(MESSAGE_FILE)
  19.396  	@$(ECHO) $(ALL_SETTINGS)  >> $(MESSAGE_FILE)
  19.397  	@$(ECHO)  >> $(MESSAGE_FILE)
  19.398 @@ -1453,8 +1447,8 @@
  19.399  ifeq ($(PLATFORM), solaris)
  19.400    ifndef OPENJDK
  19.401      @if [ -r $(GCC_COMPILER_PATH) ]; then \
  19.402 -	  if [ ! "$(GCC_VER)" = 2.95.2 ]; then \
  19.403 -	    $(ECHO) "ERROR: The Solaris GCC compiler version must be 2.95.2. \n" \
  19.404 +	  if [ ! "$(GCC_VER)" = $(REQUIRED_GCC_VERSION) ]; then \
  19.405 +	    $(ECHO) "ERROR: The Solaris GCC compiler version must be $(REQUIRED_GCC_VERSION). \n" \
  19.406  	      "      You are using the following compiler version: $(GCC_VER) \n" \
  19.407  	      "      The compiler was obtained from the following location: \n" \
  19.408  	      "          $(GCC_COMPILER_PATH) \n" \
    20.1 --- a/make/docs/Makefile	Thu Apr 02 10:16:53 2009 -0700
    20.2 +++ b/make/docs/Makefile	Wed Apr 08 15:40:56 2009 -0700
    20.3 @@ -1,5 +1,5 @@
    20.4  #
    20.5 -# Copyright 1997-2008 Sun Microsystems, Inc.  All Rights Reserved.
    20.6 +# Copyright 1997-2009 Sun Microsystems, Inc.  All Rights Reserved.
    20.7  # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    20.8  #
    20.9  # This code is free software; you can redistribute it and/or modify it
   20.10 @@ -45,6 +45,7 @@
   20.11  DOCSTMPDIR          = $(TEMPDIR)/doctmp
   20.12  
   20.13  COMMON_JAVADOCFLAGS =					\
   20.14 +		$(NO_PROPRIETARY_API_WARNINGS)		\
   20.15  		-source 1.5				\
   20.16  		-quiet					\
   20.17                  -use					\
   20.18 @@ -203,6 +204,9 @@
   20.19  JDI_HEADER      = "Java Debug Interface"
   20.20  # JDI_PKGS is located in NON_CORE_PKGS.gmk
   20.21  
   20.22 +# Variables used by security components
   20.23 +SECURITYAPI_JAVADOCBOTTOM = '<font size="-1"><a href="http://bugs.sun.com/services/bugreport/index.jsp">Report a bug or request a feature.</a><br>Copyright $(THIS_YEAR) Sun Microsystems, Inc. All Rights Reserved. Use is subject to license terms.</font>'
   20.24 +
   20.25  #
   20.26  # Variables used by JAAS target
   20.27  #
   20.28 @@ -220,6 +224,7 @@
   20.29                     -windowtitle $(JAAS_WINDOWTITLE)              \
   20.30                     -doctitle $(JAAS_DOCTITLE)                    \
   20.31                     -header $(JAAS_JAVADOCHEADER)                 \
   20.32 +                   -bottom $(SECURITYAPI_JAVADOCBOTTOM)                      \
   20.33                     -linkoffline ../../../../../api $(DOCSDIR)/api/	 \
   20.34                     -overview $(TOPDIR)/src/share/classes/com/sun/security/auth/jaas-overview.html
   20.35  JAAS_WINDOWTITLE = "Java Authentication and Authorization Service "
   20.36 @@ -242,6 +247,7 @@
   20.37                     -windowtitle $(JGSS_WINDOWTITLE)             \
   20.38                     -doctitle $(JGSS_DOCTITLE)                   \
   20.39                     -header $(JGSS_JAVADOCHEADER)                \
   20.40 +                   -bottom $(SECURITYAPI_JAVADOCBOTTOM)                      \
   20.41                     -linkoffline ../../../../../api $(DOCSDIR)/api/ \
   20.42                     -overview $(JGSS_SOURCEPATH)/com/sun/security/jgss/jgss-overview.html
   20.43  
   20.44 @@ -265,6 +271,7 @@
   20.45                     -windowtitle $(SMARTCARDIO_WINDOWTITLE)             \
   20.46                     -doctitle $(SMARTCARDIO_DOCTITLE)                   \
   20.47                     -header $(SMARTCARDIO_JAVADOCHEADER)                \
   20.48 +                   -bottom $(SECURITYAPI_JAVADOCBOTTOM)                      \
   20.49                     -linkoffline ../../../../../api $(DOCSDIR)/api/
   20.50  
   20.51  SMARTCARDIO_WINDOWTITLE = "Java Smart Card I/O"
    21.1 --- a/make/java/fdlibm/Makefile	Thu Apr 02 10:16:53 2009 -0700
    21.2 +++ b/make/java/fdlibm/Makefile	Wed Apr 08 15:40:56 2009 -0700
    21.3 @@ -45,6 +45,7 @@
    21.4  ifeq ($(PLATFORM),windows)
    21.5    # Turn all optimizations off
    21.6    OPTIMIZATION_LEVEL = NONE
    21.7 +  FASTDEBUG_OPTIMIZATION_LEVEL = NONE
    21.8    OTHER_CFLAGS =
    21.9    CPPFLAGS_DBG += -DLOGGING
   21.10  endif
   21.11 @@ -56,6 +57,7 @@
   21.12  ifeq ($(PLATFORM),linux)
   21.13    # Turn all optimizations off
   21.14    OPTIMIZATION_LEVEL = NONE
   21.15 +  FASTDEBUG_OPTIMIZATION_LEVEL = NONE
   21.16  endif
   21.17  
   21.18  #
    22.1 --- a/make/java/java/FILES_java.gmk	Thu Apr 02 10:16:53 2009 -0700
    22.2 +++ b/make/java/java/FILES_java.gmk	Wed Apr 08 15:40:56 2009 -0700
    22.3 @@ -449,7 +449,6 @@
    22.4      sun/misc/Service.java \
    22.5      sun/misc/JavaLangAccess.java \
    22.6      sun/misc/JavaIOAccess.java \
    22.7 -    sun/misc/JavaIODeleteOnExitAccess.java \
    22.8      sun/misc/JavaIOFileDescriptorAccess.java \
    22.9      sun/misc/JavaNioAccess.java
   22.10  
    23.1 --- a/make/java/management/Makefile	Thu Apr 02 10:16:53 2009 -0700
    23.2 +++ b/make/java/management/Makefile	Wed Apr 08 15:40:56 2009 -0700
    23.3 @@ -46,6 +46,8 @@
    23.4  #
    23.5  include FILES_c.gmk
    23.6  
    23.7 +# We don't need snmp here.
    23.8 +AUTO_JAVA_PRUNE = snmp
    23.9  AUTO_FILES_JAVA_DIRS = java/lang/management com/sun/management sun/management
   23.10  
   23.11  include Exportedfiles.gmk
    24.1 --- a/make/java/nio/FILES_java.gmk	Thu Apr 02 10:16:53 2009 -0700
    24.2 +++ b/make/java/nio/FILES_java.gmk	Wed Apr 08 15:40:56 2009 -0700
    24.3 @@ -220,6 +220,8 @@
    24.4  	sun/nio/ch/Util.java \
    24.5  	\
    24.6  	sun/nio/cs/AbstractCharsetProvider.java \
    24.7 +	sun/nio/cs/ArrayDecoder.java \
    24.8 +	sun/nio/cs/ArrayEncoder.java \
    24.9  	sun/nio/cs/FastCharsetProvider.java \
   24.10  	sun/nio/cs/HistoricallyNamedCharset.java \
   24.11  	sun/nio/cs/ISO_8859_1.java \
    25.1 --- a/make/java/redist/Makefile	Thu Apr 02 10:16:53 2009 -0700
    25.2 +++ b/make/java/redist/Makefile	Wed Apr 08 15:40:56 2009 -0700
    25.3 @@ -251,9 +251,11 @@
    25.4  #
    25.5  ifdef OPENJDK
    25.6  
    25.7 -include $(BUILDDIR)/common/internal/BinaryPlugs.gmk
    25.8 +  ifeq ($(IMPORT_BINARY_PLUGS),true)
    25.9 +    include $(BUILDDIR)/common/internal/BinaryPlugs.gmk
   25.10  
   25.11 -build: import-binary-plugs
   25.12 +    build: import-binary-plugs
   25.13 +  endif
   25.14  
   25.15  else # !OPENJDK
   25.16  
    26.1 --- a/make/javax/management/Makefile	Thu Apr 02 10:16:53 2009 -0700
    26.2 +++ b/make/javax/management/Makefile	Wed Apr 08 15:40:56 2009 -0700
    26.3 @@ -35,6 +35,7 @@
    26.4  #
    26.5  # Files to compile
    26.6  #
    26.7 +AUTO_JAVA_PRUNE = snmp
    26.8  AUTO_FILES_JAVA_DIRS = javax/management com/sun/jmx com/sun/management/jmx 
    26.9  
   26.10  #
    27.1 --- a/make/javax/swing/beaninfo/SwingBeans.gmk	Thu Apr 02 10:16:53 2009 -0700
    27.2 +++ b/make/javax/swing/beaninfo/SwingBeans.gmk	Wed Apr 08 15:40:56 2009 -0700
    27.3 @@ -47,7 +47,7 @@
    27.4  LOCAL_JAVADOC   = $(JAVADOC_CMD) $(JAVADOCFLAGS)
    27.5  # get the absolute path to the jar command.
    27.6  PREFIX          = 1.2
    27.7 -JAVADOCFLAGS    = $(LANGUAGE_VERSION)
    27.8 +JAVADOCFLAGS    = $(NO_PROPRIETARY_API_WARNINGS) $(LANGUAGE_VERSION)
    27.9  SWINGPKG        = javax/swing
   27.10  LOCAL_JAVAC_FLAGS = $(OTHER_JAVACFLAGS)
   27.11  
    28.1 --- a/make/jdk_generic_profile.sh	Thu Apr 02 10:16:53 2009 -0700
    28.2 +++ b/make/jdk_generic_profile.sh	Wed Apr 08 15:40:56 2009 -0700
    28.3 @@ -174,7 +174,8 @@
    28.4     
    28.5    # Check CYGWIN (should have already been done)
    28.6    #   Assumption here is that you are in a shell window via cygwin.
    28.7 -  if [ "$(echo ${PROCESSOR_IDENTIFIER} | fgrep AMD64)" != "" ] ; then
    28.8 +  proc_arch=`echo "$(PROCESSOR_IDENTIFIER)" | expand | cut -d' ' -f1 | sed -e 's@x86@X86@g' -e 's@Intel64@X64@g' -e 's@em64t@X64@g' -e 's@EM64T@X64@g' -e 's@amd64@X64@g' -e 's@AMD64@X64@g' -e 's@ia64@IA64@g'`
    28.9 +  if [ "${proc_arch}" = "X64" ] ; then
   28.10      windows_arch=amd64
   28.11    else
   28.12      windows_arch=i586
    29.1 --- a/make/jprt.config	Thu Apr 02 10:16:53 2009 -0700
    29.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    29.3 @@ -1,363 +0,0 @@
    29.4 -#!echo "This is not a shell script"
    29.5 -#############################################################################
    29.6 -#
    29.7 -# Copyright 2006-2008 Sun Microsystems, Inc.  All Rights Reserved.
    29.8 -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    29.9 -#
   29.10 -# This code is free software; you can redistribute it and/or modify it
   29.11 -# under the terms of the GNU General Public License version 2 only, as
   29.12 -# published by the Free Software Foundation.  Sun designates this
   29.13 -# particular file as subject to the "Classpath" exception as provided
   29.14 -# by Sun in the LICENSE file that accompanied this code.
   29.15 -#
   29.16 -# This code is distributed in the hope that it will be useful, but WITHOUT
   29.17 -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   29.18 -# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
   29.19 -# version 2 for more details (a copy is included in the LICENSE file that
   29.20 -# accompanied this code).
   29.21 -#
   29.22 -# You should have received a copy of the GNU General Public License version
   29.23 -# 2 along with this work; if not, write to the Free Software Foundation,
   29.24 -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
   29.25 -#
   29.26 -# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
   29.27 -# CA 95054 USA or visit www.sun.com if you need additional information or
   29.28 -# have any questions.
   29.29 -#
   29.30 -#############################################################################
   29.31 -#
   29.32 -# JPRT shell configuration for building.
   29.33 -#
   29.34 -# Input environment variables:
   29.35 -#    ALT_BOOTDIR
   29.36 -#    ALT_SLASH_JAVA
   29.37 -#    ALT_JDK_IMPORT_PATH
   29.38 -#    OPENJDK
   29.39 -#    Windows Only:
   29.40 -#      PATH
   29.41 -#      VS71COMNTOOLS
   29.42 -#      PROCESSOR_IDENTIFIER
   29.43 -#      ROOTDIR
   29.44 -#
   29.45 -# Output variable settings:
   29.46 -#    make            Full path to GNU make
   29.47 -#    compiler_path   Path to compiler bin directory
   29.48 -#    compiler_name   Unique name of this compiler
   29.49 -#
   29.50 -# Output environment variables:
   29.51 -#    PATH
   29.52 -#    ALT_COMPILER_PATH
   29.53 -#    OPENJDK only:
   29.54 -#      ALT_CLOSED_JDK_IMPORT_PATH
   29.55 -#      ALT_JDK_DEVTOOLS_DIR
   29.56 -#    Windows Only:
   29.57 -#      ALT_MSDEVTOOLS_PATH
   29.58 -#      ALT_DEVTOOLS_PATH (To avoid the C:/UTILS default)
   29.59 -#      LIB
   29.60 -#      INCLUDE
   29.61 -#
   29.62 -# After JDK6, most settings will be found via ALT_SLASH_JAVA or
   29.63 -#   by way of other system environment variables. If this was JDK5
   29.64 -#   or an older JDK, you might need to export more ALT_* variables.
   29.65 -#
   29.66 -# On Windows AMD64, if MSSDK is not set, assumes Platform SDK is installed at:
   29.67 -#          C:/Program Files/Microsoft Platform SDK
   29.68 -#
   29.69 -#############################################################################
   29.70 -
   29.71 -#############################################################################
   29.72 -# Error
   29.73 -error() # message
   29.74 -{
   29.75 -  echo "ERROR: $1"
   29.76 -  exit 6
   29.77 -}
   29.78 -# Directory must exist
   29.79 -dirMustExist() # dir name
   29.80 -{
   29.81 -  if [ ! -d "$1" ] ; then
   29.82 -    error "Directory for $2 does not exist: $1"
   29.83 -  fi
   29.84 -}
   29.85 -# File must exist
   29.86 -fileMustExist() # dir name
   29.87 -{
   29.88 -  if [ ! -f "$1" ] ; then
   29.89 -    error "File for $2 does not exist: $1"
   29.90 -  fi
   29.91 -}
   29.92 -#############################################################################
   29.93 -
   29.94 -# Should be set by JPRT as the 3 basic inputs
   29.95 -bootdir="${ALT_BOOTDIR}"
   29.96 -slashjava="${ALT_SLASH_JAVA}"
   29.97 -jdk_import="${ALT_JDK_IMPORT_PATH}"
   29.98 -
   29.99 -# The /java/devtools items
  29.100 -jdk_devtools="${slashjava}/devtools"
  29.101 -share="${jdk_devtools}/share"
  29.102 -
  29.103 -# Needed for langtools, maybe other parts of the build
  29.104 -ANT_HOME="${share}/ant/latest"
  29.105 -export ANT_HOME
  29.106 -
  29.107 -# The 3 bin directories in common to all platforms
  29.108 -sharebin="${share}/bin"
  29.109 -antbin="${ANT_HOME}/bin"
  29.110 -
  29.111 -# Check input
  29.112 -dirMustExist "${bootdir}"         ALT_BOOTDIR
  29.113 -dirMustExist "${slashjava}"       ALT_SLASH_JAVA
  29.114 -dirMustExist "${jdk_import}"      ALT_JDK_IMPORT_PATH
  29.115 -dirMustExist "${ANT_HOME}"        ANT_HOME
  29.116 -
  29.117 -# Use the JDK import for now (FIXME: use the binary plugs?)
  29.118 -if [ "${OPENJDK}" = true ] ; then
  29.119 -  ALT_CLOSED_JDK_IMPORT_PATH="${jdk_import}"
  29.120 -  export ALT_CLOSED_JDK_IMPORT_PATH
  29.121 -fi
  29.122 -
  29.123 -# Uses 'uname -s', but only expect SunOS or Linux, assume Windows otherwise.
  29.124 -osname=`uname -s`
  29.125 -if [ "${osname}" = SunOS ] ; then
  29.126 -   
  29.127 -    # SOLARIS: Sparc or X86
  29.128 -    osarch=`uname -p`
  29.129 -    if [ "${osarch}" = sparc ] ; then
  29.130 -	solaris_arch=sparc
  29.131 -    else
  29.132 -	solaris_arch=i386
  29.133 -    fi
  29.134 -
  29.135 -    # Get the compilers into path (make sure it matches ALT setting)
  29.136 -    if [ "${JPRT_SOLARIS_COMPILER_NAME}" != "" ] ; then
  29.137 -        compiler_name=${JPRT_SOLARIS_COMPILER_NAME}
  29.138 -    else
  29.139 -	compiler_name=SS12
  29.140 -    fi
  29.141 -    compiler_path=${jdk_devtools}/${solaris_arch}/SUNWspro/${compiler_name}/bin
  29.142 -    ALT_COMPILER_PATH="${compiler_path}"
  29.143 -    export ALT_COMPILER_PATH
  29.144 -    dirMustExist "${compiler_path}" ALT_COMPILER_PATH
  29.145 -    path4sdk=${compiler_path}:${sharebin}:${antbin}
  29.146 -
  29.147 -    # Add basic solaris system paths
  29.148 -    path4sdk=${path4sdk}:/usr/ccs/bin:/usr/ccs/lib:/usr/bin:/bin:/usr/sfw/bin
  29.149 -
  29.150 -    # Get the previous JDK to be used to bootstrap the build
  29.151 -    path4sdk=${bootdir}/bin:${path4sdk}
  29.152 -
  29.153 -    # Find GNU make
  29.154 -    make=/usr/sfw/bin/gmake
  29.155 -    if [ ! -f ${make} ] ; then
  29.156 -	make=/opt/sfw/bin/gmake
  29.157 -	if [ ! -f ${make} ] ; then
  29.158 -	    make=${jdk_devtools}/${solaris_arch}/bin/gnumake
  29.159 -        fi 
  29.160 -    fi
  29.161 -    fileMustExist "${make}" make
  29.162 -
  29.163 -    # File creation mask
  29.164 -    umask 002
  29.165 -
  29.166 -elif [ "${osname}" = Linux ] ; then
  29.167 -   
  29.168 -    # LINUX: X86, AMD64
  29.169 -    osarch=`uname -m`
  29.170 -    if [ "${osarch}" = i686 ] ; then
  29.171 -	linux_arch=i586
  29.172 -    elif [ "${osarch}" = x86_64 ] ; then
  29.173 -	linux_arch=amd64
  29.174 -    fi
  29.175 -
  29.176 -    # Get the compilers into path (make sure it matches ALT setting)
  29.177 -    compiler_path=/usr/bin
  29.178 -    compiler_name=usr_bin
  29.179 -    ALT_COMPILER_PATH="${compiler_path}"
  29.180 -    export ALT_COMPILER_PATH
  29.181 -    dirMustExist "${compiler_path}" ALT_COMPILER_PATH
  29.182 -    path4sdk=${compiler_path}:${sharebin}:${antbin}
  29.183 -    
  29.184 -    # Add basic paths
  29.185 -    path4sdk=${path4sdk}:/usr/bin:/bin:/usr/sbin:/sbin
  29.186 -
  29.187 -    # Get the previous JDK to be used to bootstrap the build
  29.188 -    path4sdk=${bootdir}/bin:${path4sdk}
  29.189 -    
  29.190 -    # Find GNU make
  29.191 -    make=/usr/bin/make
  29.192 -    fileMustExist "${make}" make
  29.193 -
  29.194 -    umask 002
  29.195 -   
  29.196 -    # Linux platform may be old, use motif files from the devtools area
  29.197 -    if [ "${OPENJDK}" = true ] ; then
  29.198 -      ALT_JDK_DEVTOOLS_DIR="${jdk_devtools}"
  29.199 -      export ALT_JDK_DEVTOOLS_DIR
  29.200 -    fi
  29.201 -
  29.202 -
  29.203 -else
  29.204 -
  29.205 -    # Windows: Differs on CYGWIN vs. MKS, and the compiler available.
  29.206 -    #   Also, blanks in pathnames gives GNU make headaches, so anything placed
  29.207 -    #   in any ALT_* variable should be the short windows dosname.
  29.208 -   
  29.209 -    # WINDOWS: Install and use MKS or CYGWIN (should have already been done)
  29.210 -    #   Assumption here is that you are in a shell window via MKS or cygwin.
  29.211 -    #   MKS install should have defined the environment variable ROOTDIR.
  29.212 -    #   We also need to figure out which one we have: X86, AMD64
  29.213 -    if [ "`echo ${PROCESSOR_IDENTIFIER} | fgrep AMD64`" != "" ] ; then
  29.214 -	windows_arch=amd64
  29.215 -    else
  29.216 -	windows_arch=i586
  29.217 -    fi
  29.218 -    
  29.219 -    # We need to determine if we are running a CYGWIN shell or an MKS shell
  29.220 -    #    (if uname isn't available, then it will be unix_toolset=unknown)
  29.221 -    unix_toolset=unknown
  29.222 -    if [ "`uname -a | fgrep Cygwin`" = "" -a -d "${ROOTDIR}" ] ; then
  29.223 -        # We kind of assume ROOTDIR is where MKS is and it's ok
  29.224 -        unix_toolset=MKS
  29.225 -        mkshome=`dosname -s "${ROOTDIR}"`
  29.226 -	# Utility to convert to short pathnames without spaces
  29.227 -	dosname="${mkshome}/mksnt/dosname -s"
  29.228 -        # Most unix utilities are in the mksnt directory of ROOTDIR
  29.229 -        unixcommand_path="${mkshome}/mksnt"
  29.230 -        path4sdk="${sharebin};${antbin};${unixcommand_path}"
  29.231 -        dirMustExist "${unixcommand_path}" ALT_UNIXCOMMAND_PATH
  29.232 -	devtools_path="${jdk_devtools}/win32/bin"
  29.233 -	path4sdk="${devtools_path};${path4sdk}"
  29.234 -	# Normally this need not be set, but on Windows it's default is C:/UTILS
  29.235 -        ALT_DEVTOOLS_PATH="${devtools_path}"
  29.236 -	export ALT_DEVTOOLS_PATH
  29.237 -        dirMustExist "${devtools_path}" ALT_DEVTOOLS_PATH
  29.238 -        # Find GNU make
  29.239 -        make="${devtools_path}/gnumake.exe"
  29.240 -        fileMustExist "${make}" make
  29.241 -    elif [ "`uname -a | fgrep Cygwin`" != "" -a -f /bin/cygpath ] ; then
  29.242 -        # For CYGWIN, uname will have "Cygwin" in it, and /bin/cygpath should exist
  29.243 -        unix_toolset=CYGWIN
  29.244 -	# Utility to convert to short pathnames without spaces
  29.245 -	dosname="/usr/bin/cygpath -a -m -s"
  29.246 -        # Most unix utilities are in the /usr/bin
  29.247 -        unixcommand_path="/usr/bin"
  29.248 -        path4sdk="${sharebin};${antbin};${unixcommand_path}"
  29.249 -        dirMustExist "${unixcommand_path}" ALT_UNIXCOMMAND_PATH
  29.250 -        # Find GNU make
  29.251 -        make="${unixcommand_path}/make.exe"
  29.252 -        fileMustExist "${make}" make
  29.253 -    else
  29.254 -      echo "WARNING: Cannot figure out if this is MKS or CYGWIN"
  29.255 -    fi
  29.256 -
  29.257 -    # WINDOWS: Compiler setup (nasty part)
  29.258 -    #   NOTE: You can use vcvars32.bat to set PATH, LIB, and INCLUDE.
  29.259 -    #   NOTE: CYGWIN has a link.exe too, make sure the compilers are first
  29.260 -    if [ "${windows_arch}" = i586 ] ; then
  29.261 -        # 32bit Windows compiler settings
  29.262 -        # VisualStudio .NET 2003 VC++ 7.1 (VS71COMNTOOLS should be defined)
  29.263 -        vs_root=`${dosname} "${VS71COMNTOOLS}/../.."`
  29.264 -        # Fill in PATH, LIB, and INCLUDE (unset all others to make sure)
  29.265 -        msdev_root="${vs_root}/Common7/Tools"
  29.266 -        msdevtools_path="${msdev_root}/bin"
  29.267 -        vc7_root="${vs_root}/Vc7"
  29.268 -        compiler_path="${vc7_root}/bin"
  29.269 -        compiler_name=VS2003
  29.270 -        platform_sdk="${vc7_root}/PlatformSDK"
  29.271 -        # LIB and INCLUDE must use ; as a separator
  29.272 -        include4sdk="${vc7_root}/atlmfc/include"
  29.273 -        include4sdk="${include4sdk};${vc7_root}/include"
  29.274 -        include4sdk="${include4sdk};${platform_sdk}/include/prerelease"
  29.275 -        include4sdk="${include4sdk};${platform_sdk}/include"
  29.276 -        include4sdk="${include4sdk};${vs_root}/SDK/v1.1/include"
  29.277 -        lib4sdk="${vc7_root}/atlmfc/lib"
  29.278 -        lib4sdk="${lib4sdk};${vc7_root}/lib"
  29.279 -        lib4sdk="${lib4sdk};${platform_sdk}/lib/prerelease"
  29.280 -        lib4sdk="${lib4sdk};${platform_sdk}/lib"
  29.281 -        lib4sdk="${lib4sdk};${vs_root}/SDK/v1.1/lib"
  29.282 -        # Search path and DLL locating path
  29.283 -        #   WARNING: CYGWIN has a link.exe too, make sure compilers are first
  29.284 -        path4sdk="${vs_root}/Common7/Tools/bin;${path4sdk}"
  29.285 -	path4sdk="${vs_root}/SDK/v1.1/bin;${path4sdk}"
  29.286 -        path4sdk="${vs_root}/Common7/Tools;${path4sdk}"
  29.287 -	path4sdk="${vs_root}/Common7/Tools/bin/prerelease;${path4sdk}"
  29.288 -        path4sdk="${vs_root}/Common7/IDE;${path4sdk}"
  29.289 -	path4sdk="${compiler_path};${path4sdk}"
  29.290 -    elif [ "${windows_arch}" = amd64 ] ; then
  29.291 -        # AMD64 64bit Windows compiler settings
  29.292 -	if [ "${MSSDK}" != "" ] ; then
  29.293 -	    platform_sdk="${MSSDK}"
  29.294 -	else
  29.295 -	    platform_sdk=`${dosname} "C:/Program Files/Microsoft Platform SDK/"`
  29.296 -	fi
  29.297 -	compiler_path="${platform_sdk}/Bin/win64/x86/AMD64"
  29.298 -        compiler_name=VS2005_PSDK
  29.299 -	msdevtools_path="${platform_sdk}/Bin"
  29.300 -        # LIB and INCLUDE must use ; as a separator
  29.301 -        include4sdk="${platform_sdk}/Include"
  29.302 -	include4sdk="${include4sdk};${platform_sdk}/Include/crt/sys"
  29.303 -	include4sdk="${include4sdk};${platform_sdk}/Include/mfc"
  29.304 -	include4sdk="${include4sdk};${platform_sdk}/Include/atl"
  29.305 -	include4sdk="${include4sdk};${platform_sdk}/Include/crt"
  29.306 -        lib4sdk="${platform_sdk}/Lib/AMD64"
  29.307 -        lib4sdk="${lib4sdk};${platform_sdk}/Lib/AMD64/atlmfc"
  29.308 -        # Search path and DLL locating path
  29.309 -        #   WARNING: CYGWIN has a link.exe too, make sure compilers are first
  29.310 -        path4sdk="${platform_sdk}/bin;${path4sdk}"
  29.311 -        path4sdk="${compiler_path};${path4sdk}"
  29.312 -    fi
  29.313 -    # Export LIB and INCLUDE
  29.314 -    unset lib
  29.315 -    unset Lib
  29.316 -    LIB="${lib4sdk}"
  29.317 -    export LIB
  29.318 -    unset include
  29.319 -    unset Include
  29.320 -    INCLUDE="${include4sdk}"
  29.321 -    export INCLUDE
  29.322 -    # Set the ALT variable
  29.323 -    ALT_COMPILER_PATH=`${dosname} "${compiler_path}"`
  29.324 -    export ALT_COMPILER_PATH
  29.325 -    dirMustExist "${compiler_path}" ALT_COMPILER_PATH
  29.326 -    ALT_MSDEVTOOLS_PATH=`${dosname} "${msdevtools_path}"`
  29.327 -    export ALT_MSDEVTOOLS_PATH
  29.328 -    dirMustExist "${msdevtools_path}" ALT_MSDEVTOOLS_PATH
  29.329 -    
  29.330 -    # WINDOWS: Get the previous JDK to be used to bootstrap the build
  29.331 -    path4sdk="${bootdir}/bin;${path4sdk}"
  29.332 -
  29.333 -    # Turn all \\ into /, remove duplicates and trailing /
  29.334 -    slash_path="`echo ${path4sdk} | sed -e 's@\\\\@/@g' -e 's@//@/@g' -e 's@/$@@' -e 's@/;@;@g'`"
  29.335 -    
  29.336 -    # For windows, it's hard to know where the system is, so we just add this
  29.337 -    #    to PATH.
  29.338 -    path4sdk="${slash_path};${PATH}"
  29.339 -    
  29.340 -    # Convert path4sdk to cygwin style
  29.341 -    if [ "${unix_toolset}" = CYGWIN ] ; then
  29.342 -	path4sdk="`/usr/bin/cygpath -p ${path4sdk}`"
  29.343 -    fi
  29.344 -
  29.345 -    # Set special windows ALT variables
  29.346 -    ALT_ISHIELDDIR="C:/ishield802"
  29.347 -    export ALT_ISHIELDDIR
  29.348 -
  29.349 -    # Sponsors binaries
  29.350 -    ALT_SPONSOR1DIR=C:/sponsor_binaries
  29.351 -    export ALT_SPONSOR1DIR
  29.352 -    ALT_SPONSOR2DIR=C:/sponsor_binaries 
  29.353 -    export ALT_SPONSOR2DIR
  29.354 -
  29.355 -fi
  29.356 -
  29.357 -# Export PATH setting
  29.358 -PATH="${path4sdk}"
  29.359 -export PATH
  29.360 -
  29.361 -# Things we need to unset
  29.362 -unset LD_LIBRARY_PATH
  29.363 -unset LD_LIBRARY_PATH_32
  29.364 -unset LD_LIBRARY_PATH_64
  29.365 -unset JAVA_HOME
  29.366 -
    30.1 --- a/make/jprt.properties	Thu Apr 02 10:16:53 2009 -0700
    30.2 +++ b/make/jprt.properties	Wed Apr 08 15:40:56 2009 -0700
    30.3 @@ -53,6 +53,19 @@
    30.4  
    30.5  # Standard list of jprt test targets for this workspace
    30.6  jprt.test.targets=*-*-*-jvm98
    30.7 +jprt.regression.test.targets=  \
    30.8 +   *-*-*-java/lang,            \
    30.9 +   *-*-*-java/security,        \
   30.10 +   *-*-*-java/text,            \
   30.11 +   *-*-*-java/util
   30.12 +
   30.13 +#jprt.regression.test.targets=   \
   30.14 +#   *-*-*-java/awt,       \
   30.15 +#   *-*-*-java/beans,     \
   30.16 +#   *-*-*-java/io,        \
   30.17 +#   *-*-*-java/net,       \
   30.18 +#   *-*-*-java/nio,       \
   30.19 +#   *-*-*-java/rmi,       \
   30.20  
   30.21  # Directories needed to build
   30.22  jprt.bundle.exclude.src.dirs=build
    31.1 --- a/make/sun/management/Makefile	Thu Apr 02 10:16:53 2009 -0700
    31.2 +++ b/make/sun/management/Makefile	Wed Apr 08 15:40:56 2009 -0700
    31.3 @@ -35,7 +35,16 @@
    31.4  
    31.5  all build:: properties aclfile jmxremotefiles
    31.6  
    31.7 -SUBDIRS = snmp jmxremote
    31.8 +# When building the openjdk, build snmp only if importing binary plugs,
    31.9 +ifdef OPENJDK
   31.10 +  ifeq ($(IMPORT_BINARY_PLUGS),true)
   31.11 +    SUBDIRS = snmp
   31.12 +  endif
   31.13 +else
   31.14 +  SUBDIRS = snmp
   31.15 +endif
   31.16 +SUBDIRS += jmxremote
   31.17 + 
   31.18  all build clean clobber::
   31.19  	$(SUBDIRS-loop)
   31.20  
    32.1 --- a/src/share/classes/com/sun/servicetag/resources/register.html	Thu Apr 02 10:16:53 2009 -0700
    32.2 +++ b/src/share/classes/com/sun/servicetag/resources/register.html	Wed Apr 08 15:40:56 2009 -0700
    32.3 @@ -68,7 +68,7 @@
    32.4            <table width="708" border="0" cellspacing="0" cellpadding="3">
    32.5              <tr valign="top">
    32.6                <td width="126" height="35">
    32.7 -              <form name="form1" method="post" action="@@REGISTRATION_URL@@" enctype="text/xml">
    32.8 +              <form name="form1" method="post" action="@@REGISTRATION_URL@@">
    32.9                  <input type="hidden" name="servicetag_payload" value="@@REGISTRATION_PAYLOAD@@">
   32.10                  <input type="submit" name="Submit"border="0" class="buttonblue" onmouseover="this.style.color='#fbe249';" onmouseout="this.style.color='#FFF';"  value="Register My JDK">
   32.11                </form></td>
    33.1 --- a/src/share/classes/com/sun/servicetag/resources/register_ja.html	Thu Apr 02 10:16:53 2009 -0700
    33.2 +++ b/src/share/classes/com/sun/servicetag/resources/register_ja.html	Wed Apr 08 15:40:56 2009 -0700
    33.3 @@ -62,7 +62,7 @@
    33.4            <p class="style1">å¿…è¦ã«ãªã‚‹ã®ã¯ã€Sun 開発者å‘ã‘ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¾ãŸã¯ãã®ä»–ã® Sun オンラインアカウントã ã‘ã§ã™ã€‚ ã¾ã ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãŒãªã„å ´åˆã¯ã€ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®ä½œæˆãŒæ±‚ã‚られã¾ã™ã€‚ </p>
    33.5            <table width="708" border="0" cellspacing="0" cellpadding="3">
    33.6              <tr valign="top">
    33.7 -              <td width="126" height="35"><form name="form1" method="post" action="@@REGISTRATION_URL@@" enctype="text/xml">
    33.8 +              <td width="126" height="35"><form name="form1" method="post" action="@@REGISTRATION_URL@@">
    33.9  			  <input type="hidden" name="servicetag_payload" value="@@REGISTRATION_PAYLOAD@@">
   33.10                  <input type="submit" name="Submit"border="0" class="buttonblue" onmouseover="this.style.color='#fbe249';" onmouseout="this.style.color='#FFF';"  value="JDK 製å“登録">
   33.11                </form></td>
    34.1 --- a/src/share/classes/com/sun/servicetag/resources/register_zh_CN.html	Thu Apr 02 10:16:53 2009 -0700
    34.2 +++ b/src/share/classes/com/sun/servicetag/resources/register_zh_CN.html	Wed Apr 08 15:40:56 2009 -0700
    34.3 @@ -63,7 +63,7 @@
    34.4  <p class="style1">您需è¦å…·æœ‰ Sun å¼€å‘者网络或其他 Sun è”机å¸æˆ·ã€‚如果您没有,系统将æ示您创建一个。 </p>
    34.5            <table width="708" border="0" cellspacing="0" cellpadding="3">
    34.6              <tr valign="top">
    34.7 -              <td width="126" height="35"><form name="form1" method="post" action="@@REGISTRATION_URL@@" enctype="text/xml">
    34.8 +              <td width="126" height="35"><form name="form1" method="post" action="@@REGISTRATION_URL@@">
    34.9  			  <input type="hidden" name="servicetag_payload" value="@@REGISTRATION_PAYLOAD@@">
   34.10  <input type="submit" name="Submit"border="0" class="buttonblue" onmouseover="this.style.color='#fbe249';" onmouseout="this.style.color='#FFF';"  value="注册我的 JDK">
   34.11                </form></td>
    35.1 --- a/src/share/classes/java/io/Console.java	Thu Apr 02 10:16:53 2009 -0700
    35.2 +++ b/src/share/classes/java/io/Console.java	Wed Apr 08 15:40:56 2009 -0700
    35.3 @@ -503,6 +503,21 @@
    35.4  
    35.5      // Set up JavaIOAccess in SharedSecrets
    35.6      static {
    35.7 +
    35.8 +        // Add a shutdown hook to restore console's echo state should
    35.9 +        // it be necessary.
   35.10 +        sun.misc.SharedSecrets.getJavaLangAccess()
   35.11 +            .registerShutdownHook(0 /* shutdown hook invocation order */,
   35.12 +                new Runnable() {
   35.13 +                    public void run() {
   35.14 +                        try {
   35.15 +                            if (echoOff) {
   35.16 +                                echo(true);
   35.17 +                            }
   35.18 +                        } catch (IOException x) { }
   35.19 +                    }
   35.20 +                });
   35.21 +
   35.22          sun.misc.SharedSecrets.setJavaIOAccess(new sun.misc.JavaIOAccess() {
   35.23              public Console console() {
   35.24                  if (istty()) {
   35.25 @@ -513,20 +528,6 @@
   35.26                  return null;
   35.27              }
   35.28  
   35.29 -            // Add a shutdown hook to restore console's echo state should
   35.30 -            // it be necessary.
   35.31 -            public Runnable consoleRestoreHook() {
   35.32 -                return new Runnable() {
   35.33 -                    public void run() {
   35.34 -                        try {
   35.35 -                            if (echoOff) {
   35.36 -                                echo(true);
   35.37 -                            }
   35.38 -                        } catch (IOException x) {}
   35.39 -                    }
   35.40 -                };
   35.41 -            }
   35.42 -
   35.43              public Charset charset() {
   35.44                  // This method is called in sun.security.util.Password,
   35.45                  // cons already exists when this method is called
    36.1 --- a/src/share/classes/java/io/DeleteOnExitHook.java	Thu Apr 02 10:16:53 2009 -0700
    36.2 +++ b/src/share/classes/java/io/DeleteOnExitHook.java	Wed Apr 08 15:40:56 2009 -0700
    36.3 @@ -34,17 +34,18 @@
    36.4   */
    36.5  
    36.6  class DeleteOnExitHook {
    36.7 -    private static DeleteOnExitHook instance = null;
    36.8 +    static {
    36.9 +         sun.misc.SharedSecrets.getJavaLangAccess()
   36.10 +             .registerShutdownHook(2 /* Shutdown hook invocation order */,
   36.11 +                 new Runnable() {
   36.12 +                     public void run() {
   36.13 +                        runHooks();
   36.14 +                     }
   36.15 +                 });
   36.16 +    }
   36.17  
   36.18      private static LinkedHashSet<String> files = new LinkedHashSet<String>();
   36.19  
   36.20 -    static DeleteOnExitHook hook() {
   36.21 -        if (instance == null)
   36.22 -            instance = new DeleteOnExitHook();
   36.23 -
   36.24 -        return instance;
   36.25 -    }
   36.26 -
   36.27      private DeleteOnExitHook() {}
   36.28  
   36.29      static synchronized void add(String file) {
   36.30 @@ -54,7 +55,7 @@
   36.31          files.add(file);
   36.32      }
   36.33  
   36.34 -    void run() {
   36.35 +    static void runHooks() {
   36.36          LinkedHashSet<String> theFiles;
   36.37  
   36.38          synchronized (DeleteOnExitHook.class) {
    37.1 --- a/src/share/classes/java/io/File.java	Thu Apr 02 10:16:53 2009 -0700
    37.2 +++ b/src/share/classes/java/io/File.java	Wed Apr 08 15:40:56 2009 -0700
    37.3 @@ -2147,18 +2147,6 @@
    37.4      /** use serialVersionUID from JDK 1.0.2 for interoperability */
    37.5      private static final long serialVersionUID = 301077366599181567L;
    37.6  
    37.7 -    // Set up JavaIODeleteOnExitAccess in SharedSecrets
    37.8 -    // Added here as DeleteOnExitHook is package-private and SharedSecrets cannot easily access it.
    37.9 -    static {
   37.10 -        sun.misc.SharedSecrets.setJavaIODeleteOnExitAccess(
   37.11 -            new sun.misc.JavaIODeleteOnExitAccess() {
   37.12 -                public void run() {
   37.13 -                    DeleteOnExitHook.hook().run();
   37.14 -                }
   37.15 -            }
   37.16 -        );
   37.17 -    }
   37.18 -
   37.19      // -- Integration with java.nio.file --
   37.20  
   37.21      private volatile transient Path filePath;
    38.1 --- a/src/share/classes/java/lang/ApplicationShutdownHooks.java	Thu Apr 02 10:16:53 2009 -0700
    38.2 +++ b/src/share/classes/java/lang/ApplicationShutdownHooks.java	Wed Apr 08 15:40:56 2009 -0700
    38.3 @@ -34,19 +34,19 @@
    38.4   * @see java.lang.Runtime#removeShutdownHook
    38.5   */
    38.6  
    38.7 -class ApplicationShutdownHooks implements Runnable {
    38.8 -    private static ApplicationShutdownHooks instance = null;
    38.9 +class ApplicationShutdownHooks {
   38.10 +    static {
   38.11 +        Shutdown.add(1 /* shutdown hook invocation order */,
   38.12 +            new Runnable() {
   38.13 +                public void run() {
   38.14 +                    runHooks();
   38.15 +                }
   38.16 +            });
   38.17 +    }
   38.18  
   38.19      /* The set of registered hooks */
   38.20      private static IdentityHashMap<Thread, Thread> hooks = new IdentityHashMap<Thread, Thread>();
   38.21  
   38.22 -    static synchronized ApplicationShutdownHooks hook() {
   38.23 -        if (instance == null)
   38.24 -            instance = new ApplicationShutdownHooks();
   38.25 -
   38.26 -        return instance;
   38.27 -    }
   38.28 -
   38.29      private ApplicationShutdownHooks() {}
   38.30  
   38.31      /* Add a new shutdown hook.  Checks the shutdown state and the hook itself,
   38.32 @@ -82,7 +82,7 @@
   38.33       * to run in. Hooks are run concurrently and this method waits for
   38.34       * them to finish.
   38.35       */
   38.36 -    public void run() {
   38.37 +    static void runHooks() {
   38.38          Collection<Thread> threads;
   38.39          synchronized(ApplicationShutdownHooks.class) {
   38.40              threads = hooks.keySet();
    39.1 --- a/src/share/classes/java/lang/Class.java	Thu Apr 02 10:16:53 2009 -0700
    39.2 +++ b/src/share/classes/java/lang/Class.java	Wed Apr 08 15:40:56 2009 -0700
    39.3 @@ -3059,14 +3059,12 @@
    39.4      }
    39.5  
    39.6  
    39.7 -    private static Annotation[] EMPTY_ANNOTATIONS_ARRAY = new Annotation[0];
    39.8 -
    39.9      /**
   39.10       * @since 1.5
   39.11       */
   39.12      public Annotation[] getAnnotations() {
   39.13          initAnnotationsIfNecessary();
   39.14 -        return annotations.values().toArray(EMPTY_ANNOTATIONS_ARRAY);
   39.15 +        return AnnotationParser.toArray(annotations);
   39.16      }
   39.17  
   39.18      /**
   39.19 @@ -3074,7 +3072,7 @@
   39.20       */
   39.21      public Annotation[] getDeclaredAnnotations()  {
   39.22          initAnnotationsIfNecessary();
   39.23 -        return declaredAnnotations.values().toArray(EMPTY_ANNOTATIONS_ARRAY);
   39.24 +        return AnnotationParser.toArray(declaredAnnotations);
   39.25      }
   39.26  
   39.27      // Annotations cache
    40.1 --- a/src/share/classes/java/lang/Shutdown.java	Thu Apr 02 10:16:53 2009 -0700
    40.2 +++ b/src/share/classes/java/lang/Shutdown.java	Wed Apr 08 15:40:56 2009 -0700
    40.3 @@ -25,8 +25,6 @@
    40.4  
    40.5  package java.lang;
    40.6  
    40.7 -import java.util.ArrayList;
    40.8 -
    40.9  
   40.10  /**
   40.11   * Package-private utility class containing data structures and logic
   40.12 @@ -47,8 +45,13 @@
   40.13      /* Should we run all finalizers upon exit? */
   40.14      private static boolean runFinalizersOnExit = false;
   40.15  
   40.16 -    /* The set of registered, wrapped hooks, or null if there aren't any */
   40.17 -    private static ArrayList<Runnable> hooks = new ArrayList<Runnable>();
   40.18 +    // The system shutdown hooks are registered with a predefined slot.
   40.19 +    // The list of shutdown hooks is as follows:
   40.20 +    // (0) Console restore hook
   40.21 +    // (1) Application hooks
   40.22 +    // (2) DeleteOnExit hook
   40.23 +    private static final int MAX_SYSTEM_HOOKS = 10;
   40.24 +    private static final Runnable[] hooks = new Runnable[MAX_SYSTEM_HOOKS];
   40.25  
   40.26      /* The preceding static fields are protected by this lock */
   40.27      private static class Lock { };
   40.28 @@ -68,33 +71,18 @@
   40.29      /* Add a new shutdown hook.  Checks the shutdown state and the hook itself,
   40.30       * but does not do any security checks.
   40.31       */
   40.32 -    static void add(Runnable hook) {
   40.33 +    static void add(int slot, Runnable hook) {
   40.34          synchronized (lock) {
   40.35              if (state > RUNNING)
   40.36                  throw new IllegalStateException("Shutdown in progress");
   40.37  
   40.38 -            hooks.add(hook);
   40.39 +            if (hooks[slot] != null)
   40.40 +                throw new InternalError("Shutdown hook at slot " + slot + " already registered");
   40.41 +
   40.42 +            hooks[slot] = hook;
   40.43          }
   40.44      }
   40.45  
   40.46 -
   40.47 -    /* Remove a previously-registered hook.  Like the add method, this method
   40.48 -     * does not do any security checks.
   40.49 -     */
   40.50 -    static boolean remove(Runnable hook) {
   40.51 -        synchronized (lock) {
   40.52 -            if (state > RUNNING)
   40.53 -                throw new IllegalStateException("Shutdown in progress");
   40.54 -            if (hook == null) throw new NullPointerException();
   40.55 -            if (hooks == null) {
   40.56 -                return false;
   40.57 -            } else {
   40.58 -                return hooks.remove(hook);
   40.59 -            }
   40.60 -        }
   40.61 -    }
   40.62 -
   40.63 -
   40.64      /* Run all registered shutdown hooks
   40.65       */
   40.66      private static void runHooks() {
   40.67 @@ -103,7 +91,7 @@
   40.68           */
   40.69          for (Runnable hook : hooks) {
   40.70              try {
   40.71 -                hook.run();
   40.72 +                if (hook != null) hook.run();
   40.73              } catch(Throwable t) {
   40.74                  if (t instanceof ThreadDeath) {
   40.75                      ThreadDeath td = (ThreadDeath)t;
    41.1 --- a/src/share/classes/java/lang/StringCoding.java	Thu Apr 02 10:16:53 2009 -0700
    41.2 +++ b/src/share/classes/java/lang/StringCoding.java	Wed Apr 08 15:40:56 2009 -0700
    41.3 @@ -1,5 +1,5 @@
    41.4  /*
    41.5 - * Copyright 2000-2008 Sun Microsystems, Inc.  All Rights Reserved.
    41.6 + * Copyright 2000-2009 Sun Microsystems, Inc.  All Rights Reserved.
    41.7   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    41.8   *
    41.9   * This code is free software; you can redistribute it and/or modify it
   41.10 @@ -25,13 +25,10 @@
   41.11  
   41.12  package java.lang;
   41.13  
   41.14 -import java.io.CharConversionException;
   41.15  import java.io.UnsupportedEncodingException;
   41.16  import java.lang.ref.SoftReference;
   41.17  import java.nio.ByteBuffer;
   41.18  import java.nio.CharBuffer;
   41.19 -import java.nio.BufferOverflowException;
   41.20 -import java.nio.BufferUnderflowException;
   41.21  import java.nio.charset.Charset;
   41.22  import java.nio.charset.CharsetDecoder;
   41.23  import java.nio.charset.CharsetEncoder;
   41.24 @@ -39,11 +36,12 @@
   41.25  import java.nio.charset.CoderResult;
   41.26  import java.nio.charset.CodingErrorAction;
   41.27  import java.nio.charset.IllegalCharsetNameException;
   41.28 -import java.nio.charset.MalformedInputException;
   41.29  import java.nio.charset.UnsupportedCharsetException;
   41.30  import java.util.Arrays;
   41.31  import sun.misc.MessageUtils;
   41.32  import sun.nio.cs.HistoricallyNamedCharset;
   41.33 +import sun.nio.cs.ArrayDecoder;
   41.34 +import sun.nio.cs.ArrayEncoder;
   41.35  
   41.36  /**
   41.37   * Utility class for string encoding and decoding.
   41.38 @@ -74,10 +72,8 @@
   41.39  
   41.40      // Trim the given byte array to the given length
   41.41      //
   41.42 -    private static byte[] safeTrim(byte[] ba, int len, Charset cs) {
   41.43 -        if (len == ba.length
   41.44 -            && (System.getSecurityManager() == null
   41.45 -                || cs.getClass().getClassLoader0() == null))
   41.46 +    private static byte[] safeTrim(byte[] ba, int len, Charset cs, boolean isTrusted) {
   41.47 +        if (len == ba.length && (isTrusted || System.getSecurityManager() == null))
   41.48              return ba;
   41.49          else
   41.50              return Arrays.copyOf(ba, len);
   41.51 @@ -85,10 +81,9 @@
   41.52  
   41.53      // Trim the given char array to the given length
   41.54      //
   41.55 -    private static char[] safeTrim(char[] ca, int len, Charset cs) {
   41.56 -        if (len == ca.length
   41.57 -            && (System.getSecurityManager() == null
   41.58 -                || cs.getClass().getClassLoader0() == null))
   41.59 +    private static char[] safeTrim(char[] ca, int len,
   41.60 +                                   Charset cs, boolean isTrusted) {
   41.61 +        if (len == ca.length && (isTrusted || System.getSecurityManager() == null))
   41.62              return ca;
   41.63          else
   41.64              return Arrays.copyOf(ca, len);
   41.65 @@ -128,6 +123,7 @@
   41.66          private final String requestedCharsetName;
   41.67          private final Charset cs;
   41.68          private final CharsetDecoder cd;
   41.69 +        private final boolean isTrusted;
   41.70  
   41.71          private StringDecoder(Charset cs, String rcn) {
   41.72              this.requestedCharsetName = rcn;
   41.73 @@ -135,6 +131,7 @@
   41.74              this.cd = cs.newDecoder()
   41.75                  .onMalformedInput(CodingErrorAction.REPLACE)
   41.76                  .onUnmappableCharacter(CodingErrorAction.REPLACE);
   41.77 +            this.isTrusted = (cs.getClass().getClassLoader0() == null);
   41.78          }
   41.79  
   41.80          String charsetName() {
   41.81 @@ -152,24 +149,28 @@
   41.82              char[] ca = new char[en];
   41.83              if (len == 0)
   41.84                  return ca;
   41.85 -            cd.reset();
   41.86 -            ByteBuffer bb = ByteBuffer.wrap(ba, off, len);
   41.87 -            CharBuffer cb = CharBuffer.wrap(ca);
   41.88 -            try {
   41.89 -                CoderResult cr = cd.decode(bb, cb, true);
   41.90 -                if (!cr.isUnderflow())
   41.91 -                    cr.throwException();
   41.92 -                cr = cd.flush(cb);
   41.93 -                if (!cr.isUnderflow())
   41.94 -                    cr.throwException();
   41.95 -            } catch (CharacterCodingException x) {
   41.96 -                // Substitution is always enabled,
   41.97 -                // so this shouldn't happen
   41.98 -                throw new Error(x);
   41.99 +            if (cd instanceof ArrayDecoder) {
  41.100 +                int clen = ((ArrayDecoder)cd).decode(ba, off, len, ca);
  41.101 +                return safeTrim(ca, clen, cs, isTrusted);
  41.102 +            } else {
  41.103 +                cd.reset();
  41.104 +                ByteBuffer bb = ByteBuffer.wrap(ba, off, len);
  41.105 +                CharBuffer cb = CharBuffer.wrap(ca);
  41.106 +                try {
  41.107 +                    CoderResult cr = cd.decode(bb, cb, true);
  41.108 +                    if (!cr.isUnderflow())
  41.109 +                        cr.throwException();
  41.110 +                    cr = cd.flush(cb);
  41.111 +                    if (!cr.isUnderflow())
  41.112 +                        cr.throwException();
  41.113 +                } catch (CharacterCodingException x) {
  41.114 +                    // Substitution is always enabled,
  41.115 +                    // so this shouldn't happen
  41.116 +                    throw new Error(x);
  41.117 +                }
  41.118 +                return safeTrim(ca, cb.position(), cs, isTrusted);
  41.119              }
  41.120 -            return safeTrim(ca, cb.position(), cs);
  41.121          }
  41.122 -
  41.123      }
  41.124  
  41.125      static char[] decode(String charsetName, byte[] ba, int off, int len)
  41.126 @@ -193,8 +194,57 @@
  41.127      }
  41.128  
  41.129      static char[] decode(Charset cs, byte[] ba, int off, int len) {
  41.130 -        StringDecoder sd = new StringDecoder(cs, cs.name());
  41.131 -        return sd.decode(Arrays.copyOfRange(ba, off, off + len), 0, len);
  41.132 +        // (1)We never cache the "external" cs, the only benefit of creating
  41.133 +        // an additional StringDe/Encoder object to wrap it is to share the
  41.134 +        // de/encode() method. These SD/E objects are short-lifed, the young-gen
  41.135 +        // gc should be able to take care of them well. But the best approash
  41.136 +        // is still not to generate them if not really necessary.
  41.137 +        // (2)The defensive copy of the input byte/char[] has a big performance
  41.138 +        // impact, as well as the outgoing result byte/char[]. Need to do the
  41.139 +        // optimization check of (sm==null && classLoader0==null) for both.
  41.140 +        // (3)getClass().getClassLoader0() is expensive
  41.141 +        // (4)There might be a timing gap in isTrusted setting. getClassLoader0()
  41.142 +        // is only chcked (and then isTrusted gets set) when (SM==null). It is
  41.143 +        // possible that the SM==null for now but then SM is NOT null later
  41.144 +        // when safeTrim() is invoked...the "safe" way to do is to redundant
  41.145 +        // check (... && (isTrusted || SM == null || getClassLoader0())) in trim
  41.146 +        // but it then can be argued that the SM is null when the opertaion
  41.147 +        // is started...
  41.148 +        CharsetDecoder cd = cs.newDecoder();
  41.149 +        int en = scale(len, cd.maxCharsPerByte());
  41.150 +        char[] ca = new char[en];
  41.151 +        if (len == 0)
  41.152 +            return ca;
  41.153 +        boolean isTrusted = false;
  41.154 +        if (System.getSecurityManager() != null) {
  41.155 +            if (!(isTrusted = (cs.getClass().getClassLoader0() == null))) {
  41.156 +                ba =  Arrays.copyOfRange(ba, off, off + len);
  41.157 +                off = 0;
  41.158 +            }
  41.159 +        }
  41.160 +        if (cd instanceof ArrayDecoder) {
  41.161 +            int clen = ((ArrayDecoder)cd).decode(ba, off, len, ca);
  41.162 +            return safeTrim(ca, clen, cs, isTrusted);
  41.163 +        } else {
  41.164 +            cd.onMalformedInput(CodingErrorAction.REPLACE)
  41.165 +              .onUnmappableCharacter(CodingErrorAction.REPLACE)
  41.166 +              .reset();
  41.167 +            ByteBuffer bb = ByteBuffer.wrap(ba, off, len);
  41.168 +            CharBuffer cb = CharBuffer.wrap(ca);
  41.169 +            try {
  41.170 +                CoderResult cr = cd.decode(bb, cb, true);
  41.171 +                if (!cr.isUnderflow())
  41.172 +                    cr.throwException();
  41.173 +                cr = cd.flush(cb);
  41.174 +                if (!cr.isUnderflow())
  41.175 +                    cr.throwException();
  41.176 +            } catch (CharacterCodingException x) {
  41.177 +                // Substitution is always enabled,
  41.178 +                // so this shouldn't happen
  41.179 +                throw new Error(x);
  41.180 +            }
  41.181 +            return safeTrim(ca, cb.position(), cs, isTrusted);
  41.182 +        }
  41.183      }
  41.184  
  41.185      static char[] decode(byte[] ba, int off, int len) {
  41.186 @@ -218,14 +268,12 @@
  41.187          }
  41.188      }
  41.189  
  41.190 -
  41.191 -
  41.192 -
  41.193      // -- Encoding --
  41.194      private static class StringEncoder {
  41.195          private Charset cs;
  41.196          private CharsetEncoder ce;
  41.197          private final String requestedCharsetName;
  41.198 +        private final boolean isTrusted;
  41.199  
  41.200          private StringEncoder(Charset cs, String rcn) {
  41.201              this.requestedCharsetName = rcn;
  41.202 @@ -233,6 +281,7 @@
  41.203              this.ce = cs.newEncoder()
  41.204                  .onMalformedInput(CodingErrorAction.REPLACE)
  41.205                  .onUnmappableCharacter(CodingErrorAction.REPLACE);
  41.206 +            this.isTrusted = (cs.getClass().getClassLoader0() == null);
  41.207          }
  41.208  
  41.209          String charsetName() {
  41.210 @@ -250,23 +299,27 @@
  41.211              byte[] ba = new byte[en];
  41.212              if (len == 0)
  41.213                  return ba;
  41.214 -
  41.215 -            ce.reset();
  41.216 -            ByteBuffer bb = ByteBuffer.wrap(ba);
  41.217 -            CharBuffer cb = CharBuffer.wrap(ca, off, len);
  41.218 -            try {
  41.219 -                CoderResult cr = ce.encode(cb, bb, true);
  41.220 -                if (!cr.isUnderflow())
  41.221 -                    cr.throwException();
  41.222 -                cr = ce.flush(bb);
  41.223 -                if (!cr.isUnderflow())
  41.224 -                    cr.throwException();
  41.225 -            } catch (CharacterCodingException x) {
  41.226 -                // Substitution is always enabled,
  41.227 -                // so this shouldn't happen
  41.228 -                throw new Error(x);
  41.229 +            if (ce instanceof ArrayEncoder) {
  41.230 +                int blen = ((ArrayEncoder)ce).encode(ca, off, len, ba);
  41.231 +                return safeTrim(ba, blen, cs, isTrusted);
  41.232 +            } else {
  41.233 +                ce.reset();
  41.234 +                ByteBuffer bb = ByteBuffer.wrap(ba);
  41.235 +                CharBuffer cb = CharBuffer.wrap(ca, off, len);
  41.236 +                try {
  41.237 +                    CoderResult cr = ce.encode(cb, bb, true);
  41.238 +                    if (!cr.isUnderflow())
  41.239 +                        cr.throwException();
  41.240 +                    cr = ce.flush(bb);
  41.241 +                    if (!cr.isUnderflow())
  41.242 +                        cr.throwException();
  41.243 +                } catch (CharacterCodingException x) {
  41.244 +                    // Substitution is always enabled,
  41.245 +                    // so this shouldn't happen
  41.246 +                    throw new Error(x);
  41.247 +                }
  41.248 +                return safeTrim(ba, bb.position(), cs, isTrusted);
  41.249              }
  41.250 -            return safeTrim(ba, bb.position(), cs);
  41.251          }
  41.252      }
  41.253  
  41.254 @@ -291,8 +344,39 @@
  41.255      }
  41.256  
  41.257      static byte[] encode(Charset cs, char[] ca, int off, int len) {
  41.258 -        StringEncoder se = new StringEncoder(cs, cs.name());
  41.259 -        return se.encode(Arrays.copyOfRange(ca, off, off + len), 0, len);
  41.260 +        CharsetEncoder ce = cs.newEncoder();
  41.261 +        int en = scale(len, ce.maxBytesPerChar());
  41.262 +        byte[] ba = new byte[en];
  41.263 +        if (len == 0)
  41.264 +            return ba;
  41.265 +        boolean isTrusted = false;
  41.266 +        if (System.getSecurityManager() != null) {
  41.267 +            if (!(isTrusted = (cs.getClass().getClassLoader0() == null))) {
  41.268 +                ca =  Arrays.copyOfRange(ca, off, off + len);
  41.269 +                off = 0;
  41.270 +            }
  41.271 +        }
  41.272 +        if (ce instanceof ArrayEncoder) {
  41.273 +            int blen = ((ArrayEncoder)ce).encode(ca, off, len, ba);
  41.274 +            return safeTrim(ba, blen, cs, isTrusted);
  41.275 +        } else {
  41.276 +            ce.onMalformedInput(CodingErrorAction.REPLACE)
  41.277 +              .onUnmappableCharacter(CodingErrorAction.REPLACE)
  41.278 +              .reset();
  41.279 +            ByteBuffer bb = ByteBuffer.wrap(ba);
  41.280 +            CharBuffer cb = CharBuffer.wrap(ca, off, len);
  41.281 +            try {
  41.282 +                CoderResult cr = ce.encode(cb, bb, true);
  41.283 +                if (!cr.isUnderflow())
  41.284 +                    cr.throwException();
  41.285 +                cr = ce.flush(bb);
  41.286 +                if (!cr.isUnderflow())
  41.287 +                    cr.throwException();
  41.288 +            } catch (CharacterCodingException x) {
  41.289 +                throw new Error(x);
  41.290 +            }
  41.291 +            return safeTrim(ba, bb.position(), cs, isTrusted);
  41.292 +        }
  41.293      }
  41.294  
  41.295      static byte[] encode(char[] ca, int off, int len) {
    42.1 --- a/src/share/classes/java/lang/System.java	Thu Apr 02 10:16:53 2009 -0700
    42.2 +++ b/src/share/classes/java/lang/System.java	Wed Apr 08 15:40:56 2009 -0700
    42.3 @@ -34,7 +34,6 @@
    42.4  import java.nio.channels.Channel;
    42.5  import java.nio.channels.spi.SelectorProvider;
    42.6  import sun.nio.ch.Interruptible;
    42.7 -import sun.net.InetAddressCachePolicy;
    42.8  import sun.reflect.Reflection;
    42.9  import sun.security.util.SecurityConstants;
   42.10  import sun.reflect.annotation.AnnotationType;
   42.11 @@ -310,7 +309,6 @@
   42.12          }
   42.13  
   42.14          security = s;
   42.15 -        InetAddressCachePolicy.setIfNotSet(InetAddressCachePolicy.FOREVER);
   42.16      }
   42.17  
   42.18      /**
   42.19 @@ -1121,14 +1119,6 @@
   42.20          // Setup Java signal handlers for HUP, TERM, and INT (where available).
   42.21          Terminator.setup();
   42.22  
   42.23 -        // The order in with the hooks are added here is important as it
   42.24 -        // determines the order in which they are run.
   42.25 -        // (1)Console restore hook needs to be called first.
   42.26 -        // (2)Application hooks must be run before calling deleteOnExitHook.
   42.27 -        Shutdown.add(sun.misc.SharedSecrets.getJavaIOAccess().consoleRestoreHook());
   42.28 -        Shutdown.add(ApplicationShutdownHooks.hook());
   42.29 -        Shutdown.add(sun.misc.SharedSecrets.getJavaIODeleteOnExitAccess());
   42.30 -
   42.31          // Initialize any miscellenous operating system settings that need to be
   42.32          // set for the class libraries. Currently this is no-op everywhere except
   42.33          // for Windows where the process-wide error mode is set before the java.io
   42.34 @@ -1174,6 +1164,9 @@
   42.35              public void blockedOn(Thread t, Interruptible b) {
   42.36                  t.blockedOn(b);
   42.37              }
   42.38 +            public void registerShutdownHook(int slot, Runnable r) {
   42.39 +                Shutdown.add(slot, r);
   42.40 +            }
   42.41          });
   42.42      }
   42.43  
    43.1 --- a/src/share/classes/java/lang/Thread.java	Thu Apr 02 10:16:53 2009 -0700
    43.2 +++ b/src/share/classes/java/lang/Thread.java	Wed Apr 08 15:40:56 2009 -0700
    43.3 @@ -1,5 +1,5 @@
    43.4  /*
    43.5 - * Copyright 1994-2008 Sun Microsystems, Inc.  All Rights Reserved.
    43.6 + * Copyright 1994-2009 Sun Microsystems, Inc.  All Rights Reserved.
    43.7   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    43.8   *
    43.9   * This code is free software; you can redistribute it and/or modify it
    44.1 --- a/src/share/classes/java/lang/reflect/Constructor.java	Thu Apr 02 10:16:53 2009 -0700
    44.2 +++ b/src/share/classes/java/lang/reflect/Constructor.java	Wed Apr 08 15:40:56 2009 -0700
    44.3 @@ -626,13 +626,11 @@
    44.4          return (T) declaredAnnotations().get(annotationClass);
    44.5      }
    44.6  
    44.7 -    private static final Annotation[] EMPTY_ANNOTATION_ARRAY=new Annotation[0];
    44.8 -
    44.9      /**
   44.10       * @since 1.5
   44.11       */
   44.12      public Annotation[] getDeclaredAnnotations()  {
   44.13 -        return declaredAnnotations().values().toArray(EMPTY_ANNOTATION_ARRAY);
   44.14 +        return AnnotationParser.toArray(declaredAnnotations());
   44.15      }
   44.16  
   44.17      private transient Map<Class, Annotation> declaredAnnotations;
    45.1 --- a/src/share/classes/java/lang/reflect/Field.java	Thu Apr 02 10:16:53 2009 -0700
    45.2 +++ b/src/share/classes/java/lang/reflect/Field.java	Wed Apr 08 15:40:56 2009 -0700
    45.3 @@ -1018,13 +1018,11 @@
    45.4          return (T) declaredAnnotations().get(annotationClass);
    45.5      }
    45.6  
    45.7 -    private static final Annotation[] EMPTY_ANNOTATION_ARRAY=new Annotation[0];
    45.8 -
    45.9      /**
   45.10       * @since 1.5
   45.11       */
   45.12      public Annotation[] getDeclaredAnnotations()  {
   45.13 -        return declaredAnnotations().values().toArray(EMPTY_ANNOTATION_ARRAY);
   45.14 +        return AnnotationParser.toArray(declaredAnnotations());
   45.15      }
   45.16  
   45.17      private transient Map<Class, Annotation> declaredAnnotations;
    46.1 --- a/src/share/classes/java/lang/reflect/Method.java	Thu Apr 02 10:16:53 2009 -0700
    46.2 +++ b/src/share/classes/java/lang/reflect/Method.java	Wed Apr 08 15:40:56 2009 -0700
    46.3 @@ -705,13 +705,11 @@
    46.4          return (T) declaredAnnotations().get(annotationClass);
    46.5      }
    46.6  
    46.7 -    private static final Annotation[] EMPTY_ANNOTATION_ARRAY=new Annotation[0];
    46.8 -
    46.9      /**
   46.10       * @since 1.5
   46.11       */
   46.12      public Annotation[] getDeclaredAnnotations()  {
   46.13 -        return declaredAnnotations().values().toArray(EMPTY_ANNOTATION_ARRAY);
   46.14 +        return AnnotationParser.toArray(declaredAnnotations());
   46.15      }
   46.16  
   46.17      private transient Map<Class, Annotation> declaredAnnotations;
    47.1 --- a/src/share/classes/java/net/SocketPermission.java	Thu Apr 02 10:16:53 2009 -0700
    47.2 +++ b/src/share/classes/java/net/SocketPermission.java	Wed Apr 08 15:40:56 2009 -0700
    47.3 @@ -113,7 +113,6 @@
    47.4   * <p>Similarly, if the following permission:
    47.5   *
    47.6   * <pre>
    47.7 - *   p1 = new SocketPermission("puffin.eng.sun.com:7777", "connect,accept");
    47.8   *   p2 = new SocketPermission("localhost:1024-", "accept,connect,listen");
    47.9   * </pre>
   47.10   *
    48.1 --- a/src/share/classes/java/nio/file/SecureDirectoryStream.java	Thu Apr 02 10:16:53 2009 -0700
    48.2 +++ b/src/share/classes/java/nio/file/SecureDirectoryStream.java	Wed Apr 08 15:40:56 2009 -0700
    48.3 @@ -5,7 +5,7 @@
    48.4   * This code is free software; you can redistribute it and/or modify it
    48.5   * under the terms of the GNU General Public License version 2 only, as
    48.6   * published by the Free Software Foundation.  Sun designates this
    48.7 - * particular file as subject to the "Classname" exception as provided
    48.8 + * particular file as subject to the "Classpath" exception as provided
    48.9   * by Sun in the LICENSE file that accompanied this code.
   48.10   *
   48.11   * This code is distributed in the hope that it will be useful, but WITHOUT
    49.1 --- a/src/share/classes/java/security/Permission.java	Thu Apr 02 10:16:53 2009 -0700
    49.2 +++ b/src/share/classes/java/security/Permission.java	Wed Apr 08 15:40:56 2009 -0700
    49.3 @@ -1,5 +1,5 @@
    49.4  /*
    49.5 - * Copyright 1997-2003 Sun Microsystems, Inc.  All Rights Reserved.
    49.6 + * Copyright 1997-2009 Sun Microsystems, Inc.  All Rights Reserved.
    49.7   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    49.8   *
    49.9   * This code is free software; you can redistribute it and/or modify it
   49.10 @@ -214,18 +214,18 @@
   49.11      /**
   49.12       * Returns a string describing this Permission.  The convention is to
   49.13       * specify the class name, the permission name, and the actions in
   49.14 -     * the following format: '("ClassName" "name" "actions")'.
   49.15 +     * the following format: '("ClassName" "name" "actions")', or
   49.16 +     * '("ClassName" "name")' if actions list is null or empty.
   49.17       *
   49.18       * @return information about this Permission.
   49.19       */
   49.20 -
   49.21      public String toString() {
   49.22          String actions = getActions();
   49.23          if ((actions == null) || (actions.length() == 0)) { // OPTIONAL
   49.24 -            return "(" + getClass().getName() + " " + name + ")";
   49.25 +            return "(\"" + getClass().getName() + "\" \"" + name + "\")";
   49.26          } else {
   49.27 -            return "(" + getClass().getName() + " " + name + " " +
   49.28 -                actions + ")";
   49.29 +            return "(\"" + getClass().getName() + "\" \"" + name +
   49.30 +                 "\" \"" + actions + "\")";
   49.31          }
   49.32      }
   49.33  }
    50.1 --- a/src/share/classes/java/util/ArrayList.java	Thu Apr 02 10:16:53 2009 -0700
    50.2 +++ b/src/share/classes/java/util/ArrayList.java	Wed Apr 08 15:40:56 2009 -0700
    50.3 @@ -179,7 +179,6 @@
    50.4          modCount++;
    50.5          int oldCapacity = elementData.length;
    50.6          if (minCapacity > oldCapacity) {
    50.7 -            Object oldData[] = elementData;
    50.8              int newCapacity = (oldCapacity * 3)/2 + 1;
    50.9              if (newCapacity < minCapacity)
   50.10                  newCapacity = minCapacity;
    51.1 --- a/src/share/classes/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.java	Thu Apr 02 10:16:53 2009 -0700
    51.2 +++ b/src/share/classes/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.java	Wed Apr 08 15:40:56 2009 -0700
    51.3 @@ -1222,8 +1222,10 @@
    51.4          // The correctness of this depends on head being initialized
    51.5          // before tail and on head.next being accurate if the current
    51.6          // thread is first in queue.
    51.7 -        Node h, s;
    51.8 -        return (h = head) != tail &&
    51.9 +        Node t = tail; // Read fields in reverse initialization order
   51.10 +        Node h = head;
   51.11 +        Node s;
   51.12 +        return h != t &&
   51.13              ((s = h.next) == null || s.thread != Thread.currentThread());
   51.14      }
   51.15  
    52.1 --- a/src/share/classes/java/util/concurrent/locks/AbstractQueuedSynchronizer.java	Thu Apr 02 10:16:53 2009 -0700
    52.2 +++ b/src/share/classes/java/util/concurrent/locks/AbstractQueuedSynchronizer.java	Wed Apr 08 15:40:56 2009 -0700
    52.3 @@ -1445,8 +1445,10 @@
    52.4          // The correctness of this depends on head being initialized
    52.5          // before tail and on head.next being accurate if the current
    52.6          // thread is first in queue.
    52.7 -        Node h, s;
    52.8 -        return (h = head) != tail &&
    52.9 +        Node t = tail; // Read fields in reverse initialization order
   52.10 +        Node h = head;
   52.11 +        Node s;
   52.12 +        return h != t &&
   52.13              ((s = h.next) == null || s.thread != Thread.currentThread());
   52.14      }
   52.15  
    53.1 --- a/src/share/classes/java/util/regex/Matcher.java	Thu Apr 02 10:16:53 2009 -0700
    53.2 +++ b/src/share/classes/java/util/regex/Matcher.java	Wed Apr 08 15:40:56 2009 -0700
    53.3 @@ -1,5 +1,5 @@
    53.4  /*
    53.5 - * Copyright 1999-2008 Sun Microsystems, Inc.  All Rights Reserved.
    53.6 + * Copyright 1999-2009 Sun Microsystems, Inc.  All Rights Reserved.
    53.7   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    53.8   *
    53.9   * This code is free software; you can redistribute it and/or modify it
    54.1 --- a/src/share/classes/java/util/regex/Pattern.java	Thu Apr 02 10:16:53 2009 -0700
    54.2 +++ b/src/share/classes/java/util/regex/Pattern.java	Wed Apr 08 15:40:56 2009 -0700
    54.3 @@ -1,5 +1,5 @@
    54.4  /*
    54.5 - * Copyright 1999-2008 Sun Microsystems, Inc.  All Rights Reserved.
    54.6 + * Copyright 1999-2009 Sun Microsystems, Inc.  All Rights Reserved.
    54.7   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    54.8   *
    54.9   * This code is free software; you can redistribute it and/or modify it
   54.10 @@ -2567,7 +2567,8 @@
   54.11                  break;
   54.12              case '<':   // (?<xxx)  look behind
   54.13                  ch = read();
   54.14 -                if (Character.isLetter(ch)) {     // named captured group
   54.15 +                if (ASCII.isLower(ch) || ASCII.isUpper(ch) || ASCII.isDigit(ch)) {
   54.16 +                    // named captured group
   54.17                      String name = groupname(ch);
   54.18                      if (namedGroups().containsKey(name))
   54.19                          throw error("Named capturing group <" + name
    55.1 --- a/src/share/classes/sun/launcher/LauncherHelper.java	Thu Apr 02 10:16:53 2009 -0700
    55.2 +++ b/src/share/classes/sun/launcher/LauncherHelper.java	Wed Apr 08 15:40:56 2009 -0700
    55.3 @@ -1,6 +1,5 @@
    55.4 -
    55.5  /*
    55.6 - * Copyright 2007-2008 Sun Microsystems, Inc.  All Rights Reserved.
    55.7 + * Copyright 2007-2009 Sun Microsystems, Inc.  All Rights Reserved.
    55.8   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    55.9   *
   55.10   * This code is free software; you can redistribute it and/or modify it
   55.11 @@ -55,18 +54,24 @@
   55.12      INSTANCE;
   55.13      private static final String defaultBundleName =
   55.14              "sun.launcher.resources.launcher";
   55.15 -    private static ResourceBundle javarb =
   55.16 -            ResourceBundle.getBundle(defaultBundleName);
   55.17      private static final String MAIN_CLASS = "Main-Class";
   55.18  
   55.19      private static StringBuilder outBuf = new StringBuilder();
   55.20  
   55.21 +    private static ResourceBundle javarb = null;
   55.22 +    private static synchronized ResourceBundle getLauncherResourceBundle() {
   55.23 +        if (javarb == null) {
   55.24 +            javarb = ResourceBundle.getBundle(defaultBundleName);
   55.25 +        }
   55.26 +        return javarb;
   55.27 +    }
   55.28 +
   55.29      /**
   55.30       * A private helper method to get a localized message and also
   55.31       * apply any arguments that we might pass.
   55.32       */
   55.33      private static String getLocalizedMessage(String key, Object... args) {
   55.34 -        String msg = javarb.getString(key);
   55.35 +        String msg = getLauncherResourceBundle().getString(key);
   55.36          return (args != null) ? MessageFormat.format(msg, args) : msg;
   55.37      }
   55.38  
    56.1 --- a/src/share/classes/sun/management/Agent.java	Thu Apr 02 10:16:53 2009 -0700
    56.2 +++ b/src/share/classes/sun/management/Agent.java	Wed Apr 08 15:40:56 2009 -0700
    56.3 @@ -31,9 +31,9 @@
    56.4  import java.io.BufferedInputStream;
    56.5  import java.io.FileNotFoundException;
    56.6  import java.io.IOException;
    56.7 +import java.lang.reflect.InvocationTargetException;
    56.8  import java.text.MessageFormat;
    56.9  import java.util.Properties;
   56.10 -import java.util.Enumeration;
   56.11  import java.util.ResourceBundle;
   56.12  import java.util.MissingResourceException;
   56.13  import java.lang.management.ManagementFactory;
   56.14 @@ -41,7 +41,6 @@
   56.15  
   56.16  import javax.management.remote.JMXConnectorServer;
   56.17  
   56.18 -import sun.management.snmp.AdaptorBootstrap;
   56.19  import sun.management.jmxremote.ConnectorBootstrap;
   56.20  import static sun.management.AgentConfigurationError.*;
   56.21  import sun.misc.VMSupport;
   56.22 @@ -69,6 +68,9 @@
   56.23      private static final String LOCAL_CONNECTOR_ADDRESS_PROP =
   56.24          "com.sun.management.jmxremote.localConnectorAddress";
   56.25  
   56.26 +    private static final String SNMP_ADAPTOR_BOOTSTRAP_CLASS_NAME =
   56.27 +            "sun.management.snmp.AdaptorBootstrap";
   56.28 +
   56.29      // invoked by -javaagent or -Dcom.sun.management.agent.class
   56.30      public static void premain(String args) throws Exception {
   56.31          agentmain(args);
   56.32 @@ -128,7 +130,7 @@
   56.33  
   56.34          try {
   56.35              if (snmpPort != null) {
   56.36 -                AdaptorBootstrap.initialize(snmpPort, props);
   56.37 +                loadSnmpAgent(snmpPort, props);
   56.38              }
   56.39  
   56.40              /*
   56.41 @@ -204,6 +206,36 @@
   56.42          return mgmtProps;
   56.43      }
   56.44  
   56.45 +    private static void loadSnmpAgent(String snmpPort, Properties props) {
   56.46 +        try {
   56.47 +            // invoke the following through reflection:
   56.48 +            //     AdaptorBootstrap.initialize(snmpPort, props);
   56.49 +            final Class<?> adaptorClass =
   56.50 +                Class.forName(SNMP_ADAPTOR_BOOTSTRAP_CLASS_NAME,true,null);
   56.51 +            final Method initializeMethod =
   56.52 +                    adaptorClass.getMethod("initialize",
   56.53 +                        String.class, Properties.class);
   56.54 +            initializeMethod.invoke(null,snmpPort,props);
   56.55 +        } catch (ClassNotFoundException x) {
   56.56 +            // The SNMP packages are not present: throws an exception.
   56.57 +            throw new UnsupportedOperationException("Unsupported management property: " + SNMP_PORT,x);
   56.58 +        } catch (NoSuchMethodException x) {
   56.59 +            // should not happen...
   56.60 +            throw new UnsupportedOperationException("Unsupported management property: " + SNMP_PORT,x);
   56.61 +        } catch (InvocationTargetException x) {
   56.62 +            final Throwable cause = x.getCause();
   56.63 +            if (cause instanceof RuntimeException)
   56.64 +                throw (RuntimeException) cause;
   56.65 +            else if (cause instanceof Error)
   56.66 +                throw (Error) cause;
   56.67 +            // should not happen...
   56.68 +            throw new UnsupportedOperationException("Unsupported management property: " + SNMP_PORT,cause);
   56.69 +        } catch (IllegalAccessException x) {
   56.70 +            // should not happen...
   56.71 +            throw new UnsupportedOperationException("Unsupported management property: " + SNMP_PORT,x);
   56.72 +        }
   56.73 +    }
   56.74 +
   56.75      // read config file and initialize the properties
   56.76      private static void readConfiguration(String fname, Properties p) {
   56.77          if (fname == null) {
    57.1 --- a/src/share/classes/sun/misc/ClassLoaderUtil.java	Thu Apr 02 10:16:53 2009 -0700
    57.2 +++ b/src/share/classes/sun/misc/ClassLoaderUtil.java	Wed Apr 08 15:40:56 2009 -0700
    57.3 @@ -77,8 +77,6 @@
    57.4                  jarsClosed.clear();
    57.5              }
    57.6  
    57.7 -            System.out.println ("classLoader = " + classLoader);
    57.8 -            System.out.println ("SharedSecrets.getJavaNetAccess()="+SharedSecrets.getJavaNetAccess());
    57.9              URLClassPath ucp = SharedSecrets.getJavaNetAccess()
   57.10                                                  .getURLClassPath(classLoader);
   57.11              ArrayList loaders = ucp.loaders;
    58.1 --- a/src/share/classes/sun/misc/FloatingDecimal.java	Thu Apr 02 10:16:53 2009 -0700
    58.2 +++ b/src/share/classes/sun/misc/FloatingDecimal.java	Wed Apr 08 15:40:56 2009 -0700
    58.3 @@ -1867,10 +1867,16 @@
    58.4       * Grammar is compatible with hexadecimal floating-point constants
    58.5       * described in section 6.4.4.2 of the C99 specification.
    58.6       */
    58.7 -    private static Pattern hexFloatPattern = Pattern.compile(
    58.8 +    private static Pattern hexFloatPattern = null;
    58.9 +    private static synchronized Pattern getHexFloatPattern() {
   58.10 +        if (hexFloatPattern == null) {
   58.11 +           hexFloatPattern = Pattern.compile(
   58.12                     //1           234                   56                7                   8      9
   58.13                      "([-+])?0[xX](((\\p{XDigit}+)\\.?)|((\\p{XDigit}*)\\.(\\p{XDigit}+)))[pP]([-+])?(\\p{Digit}+)[fFdD]?"
   58.14                      );
   58.15 +        }
   58.16 +        return hexFloatPattern;
   58.17 +    }
   58.18  
   58.19      /*
   58.20       * Convert string s to a suitable floating decimal; uses the
   58.21 @@ -1880,7 +1886,7 @@
   58.22     static FloatingDecimal parseHexString(String s) {
   58.23          // Verify string is a member of the hexadecimal floating-point
   58.24          // string language.
   58.25 -        Matcher m = hexFloatPattern.matcher(s);
   58.26 +        Matcher m = getHexFloatPattern().matcher(s);
   58.27          boolean validInput = m.matches();
   58.28  
   58.29          if (!validInput) {
    59.1 --- a/src/share/classes/sun/misc/FormattedFloatingDecimal.java	Thu Apr 02 10:16:53 2009 -0700
    59.2 +++ b/src/share/classes/sun/misc/FormattedFloatingDecimal.java	Wed Apr 08 15:40:56 2009 -0700
    59.3 @@ -978,15 +978,6 @@
    59.4          return new String(result);
    59.5      }
    59.6  
    59.7 -    // This method should only ever be called if this object is constructed
    59.8 -    // without Form.DECIMAL_FLOAT because the perThreadBuffer is not large
    59.9 -    // enough to handle floating-point numbers of large precision.
   59.10 -    public String toJavaFormatString() {
   59.11 -        char result[] = (char[])(perThreadBuffer.get());
   59.12 -        int i = getChars(result);
   59.13 -        return new String(result, 0, i);
   59.14 -    }
   59.15 -
   59.16      // returns the exponent before rounding
   59.17      public int getExponent() {
   59.18          return decExponent - 1;
   59.19 @@ -1157,265 +1148,6 @@
   59.20              }
   59.21          };
   59.22  
   59.23 -    // This method should only ever be called if this object is constructed
   59.24 -    // without Form.DECIMAL_FLOAT because the perThreadBuffer is not large
   59.25 -    // enough to handle floating-point numbers of large precision.
   59.26 -    public void appendTo(Appendable buf) {
   59.27 -        char result[] = (char[])(perThreadBuffer.get());
   59.28 -        int i = getChars(result);
   59.29 -        if (buf instanceof StringBuilder)
   59.30 -            ((StringBuilder) buf).append(result, 0, i);
   59.31 -        else if (buf instanceof StringBuffer)
   59.32 -            ((StringBuffer) buf).append(result, 0, i);
   59.33 -        else
   59.34 -            assert false;
   59.35 -    }
   59.36 -
   59.37 -    public static FormattedFloatingDecimal
   59.38 -    readJavaFormatString( String in ) throws NumberFormatException {
   59.39 -        boolean isNegative = false;
   59.40 -        boolean signSeen   = false;
   59.41 -        int     decExp;
   59.42 -        char    c;
   59.43 -
   59.44 -    parseNumber:
   59.45 -        try{
   59.46 -            in = in.trim(); // don't fool around with white space.
   59.47 -                            // throws NullPointerException if null
   59.48 -            int l = in.length();
   59.49 -            if ( l == 0 ) throw new NumberFormatException("empty String");
   59.50 -            int i = 0;
   59.51 -            switch ( c = in.charAt( i ) ){
   59.52 -            case '-':
   59.53 -                isNegative = true;
   59.54 -                //FALLTHROUGH
   59.55 -            case '+':
   59.56 -                i++;
   59.57 -                signSeen = true;
   59.58 -            }
   59.59 -
   59.60 -            // Check for NaN and Infinity strings
   59.61 -            c = in.charAt(i);
   59.62 -            if(c == 'N' || c == 'I') { // possible NaN or infinity
   59.63 -                boolean potentialNaN = false;
   59.64 -                char targetChars[] = null;  // char arrary of "NaN" or "Infinity"
   59.65 -
   59.66 -                if(c == 'N') {
   59.67 -                    targetChars = notANumber;
   59.68 -                    potentialNaN = true;
   59.69 -                } else {
   59.70 -                    targetChars = infinity;
   59.71 -                }
   59.72 -
   59.73 -                // compare Input string to "NaN" or "Infinity"
   59.74 -                int j = 0;
   59.75 -                while(i < l && j < targetChars.length) {
   59.76 -                    if(in.charAt(i) == targetChars[j]) {
   59.77 -                        i++; j++;
   59.78 -                    }
   59.79 -                    else // something is amiss, throw exception
   59.80 -                        break parseNumber;
   59.81 -                }
   59.82 -
   59.83 -                // For the candidate string to be a NaN or infinity,
   59.84 -                // all characters in input string and target char[]
   59.85 -                // must be matched ==> j must equal targetChars.length
   59.86 -                // and i must equal l
   59.87 -                if( (j == targetChars.length) && (i == l) ) { // return NaN or infinity
   59.88 -                    return (potentialNaN ? new FormattedFloatingDecimal(Double.NaN) // NaN has no sign
   59.89 -                            : new FormattedFloatingDecimal(isNegative?
   59.90 -                                                  Double.NEGATIVE_INFINITY:
   59.91 -                                                  Double.POSITIVE_INFINITY)) ;
   59.92 -                }
   59.93 -                else { // something went wrong, throw exception
   59.94 -                    break parseNumber;
   59.95 -                }
   59.96 -
   59.97 -            } else if (c == '0')  { // check for hexadecimal floating-point number
   59.98 -                if (l > i+1 ) {
   59.99 -                    char ch = in.charAt(i+1);
  59.100 -                    if (ch == 'x' || ch == 'X' ) // possible hex string
  59.101 -                        return parseHexString(in);
  59.102 -                }
  59.103 -            }  // look for and process decimal floating-point string
  59.104 -
  59.105 -            char[] digits = new char[ l ];
  59.106 -            int    nDigits= 0;
  59.107 -            boolean decSeen = false;
  59.108 -            int decPt = 0;
  59.109 -            int nLeadZero = 0;
  59.110 -            int nTrailZero= 0;
  59.111 -        digitLoop:
  59.112 -            while ( i < l ){
  59.113 -                switch ( c = in.charAt( i ) ){
  59.114 -                case '0':
  59.115 -                    if ( nDigits > 0 ){
  59.116 -                        nTrailZero += 1;
  59.117 -                    } else {
  59.118 -                        nLeadZero += 1;
  59.119 -                    }
  59.120 -                    break; // out of switch.
  59.121 -                case '1':
  59.122 -                case '2':
  59.123 -                case '3':
  59.124 -                case '4':
  59.125 -                case '5':
  59.126 -                case '6':
  59.127 -                case '7':
  59.128 -                case '8':
  59.129 -                case '9':
  59.130 -                    while ( nTrailZero > 0 ){
  59.131 -                        digits[nDigits++] = '0';
  59.132 -                        nTrailZero -= 1;
  59.133 -                    }
  59.134 -                    digits[nDigits++] = c;
  59.135 -                    break; // out of switch.
  59.136 -                case '.':
  59.137 -                    if ( decSeen ){
  59.138 -                        // already saw one ., this is the 2nd.
  59.139 -                        throw new NumberFormatException("multiple points");
  59.140 -                    }
  59.141 -                    decPt = i;
  59.142 -                    if ( signSeen ){
  59.143 -                        decPt -= 1;
  59.144 -                    }
  59.145 -                    decSeen = true;
  59.146 -                    break; // out of switch.
  59.147 -                default:
  59.148 -                    break digitLoop;
  59.149 -                }
  59.150 -                i++;
  59.151 -            }
  59.152 -            /*
  59.153 -             * At this point, we've scanned all the digits and decimal
  59.154 -             * point we're going to see. Trim off leading and trailing
  59.155 -             * zeros, which will just confuse us later, and adjust
  59.156 -             * our initial decimal exponent accordingly.
  59.157 -             * To review:
  59.158 -             * we have seen i total characters.
  59.159 -             * nLeadZero of them were zeros before any other digits.
  59.160 -             * nTrailZero of them were zeros after any other digits.
  59.161 -             * if ( decSeen ), then a . was seen after decPt characters
  59.162 -             * ( including leading zeros which have been discarded )
  59.163 -             * nDigits characters were neither lead nor trailing
  59.164 -             * zeros, nor point
  59.165 -             */
  59.166 -            /*
  59.167 -             * special hack: if we saw no non-zero digits, then the
  59.168 -             * answer is zero!
  59.169 -             * Unfortunately, we feel honor-bound to keep parsing!
  59.170 -             */
  59.171 -            if ( nDigits == 0 ){
  59.172 -                digits = zero;
  59.173 -                nDigits = 1;
  59.174 -                if ( nLeadZero == 0 ){
  59.175 -                    // we saw NO DIGITS AT ALL,
  59.176 -                    // not even a crummy 0!
  59.177 -                    // this is not allowed.
  59.178 -                    break parseNumber; // go throw exception
  59.179 -                }
  59.180 -
  59.181 -            }
  59.182 -
  59.183 -            /* Our initial exponent is decPt, adjusted by the number of
  59.184 -             * discarded zeros. Or, if there was no decPt,
  59.185 -             * then its just nDigits adjusted by discarded trailing zeros.
  59.186 -             */
  59.187 -            if ( decSeen ){
  59.188 -                decExp = decPt - nLeadZero;
  59.189 -            } else {
  59.190 -                decExp = nDigits+nTrailZero;
  59.191 -            }
  59.192 -
  59.193 -            /*
  59.194 -             * Look for 'e' or 'E' and an optionally signed integer.
  59.195 -             */
  59.196 -            if ( (i < l) &&  (((c = in.charAt(i) )=='e') || (c == 'E') ) ){
  59.197 -                int expSign = 1;
  59.198 -                int expVal  = 0;
  59.199 -                int reallyBig = Integer.MAX_VALUE / 10;
  59.200 -                boolean expOverflow = false;
  59.201 -                switch( in.charAt(++i) ){
  59.202 -                case '-':
  59.203 -                    expSign = -1;
  59.204 -                    //FALLTHROUGH
  59.205 -                case '+':
  59.206 -                    i++;
  59.207 -                }
  59.208 -                int expAt = i;
  59.209 -            expLoop:
  59.210 -                while ( i < l  ){
  59.211 -                    if ( expVal >= reallyBig ){
  59.212 -                        // the next character will cause integer
  59.213 -                        // overflow.
  59.214 -                        expOverflow = true;
  59.215 -                    }
  59.216 -                    switch ( c = in.charAt(i++) ){
  59.217 -                    case '0':
  59.218 -                    case '1':
  59.219 -                    case '2':
  59.220 -                    case '3':
  59.221 -                    case '4':
  59.222 -                    case '5':
  59.223 -                    case '6':
  59.224 -                    case '7':
  59.225 -                    case '8':
  59.226 -                    case '9':
  59.227 -                        expVal = expVal*10 + ( (int)c - (int)'0' );
  59.228 -                        continue;
  59.229 -                    default:
  59.230 -                        i--;           // back up.
  59.231 -                        break expLoop; // stop parsing exponent.
  59.232 -                    }
  59.233 -                }
  59.234 -                int expLimit = bigDecimalExponent+nDigits+nTrailZero;
  59.235 -                if ( expOverflow || ( expVal > expLimit ) ){
  59.236 -                    //
  59.237 -                    // The intent here is to end up with
  59.238 -                    // infinity or zero, as appropriate.
  59.239 -                    // The reason for yielding such a small decExponent,
  59.240 -                    // rather than something intuitive such as
  59.241 -                    // expSign*Integer.MAX_VALUE, is that this value
  59.242 -                    // is subject to further manipulation in
  59.243 -                    // doubleValue() and floatValue(), and I don't want
  59.244 -                    // it to be able to cause overflow there!
  59.245 -                    // (The only way we can get into trouble here is for
  59.246 -                    // really outrageous nDigits+nTrailZero, such as 2 billion. )
  59.247 -                    //
  59.248 -                    decExp = expSign*expLimit;
  59.249 -                } else {
  59.250 -                    // this should not overflow, since we tested
  59.251 -                    // for expVal > (MAX+N), where N >= abs(decExp)
  59.252 -                    decExp = decExp + expSign*expVal;
  59.253 -                }
  59.254 -
  59.255 -                // if we saw something not a digit ( or end of string )
  59.256 -                // after the [Ee][+-], without seeing any digits at all
  59.257 -                // this is certainly an error. If we saw some digits,
  59.258 -                // but then some trailing garbage, that might be ok.
  59.259 -                // so we just fall through in that case.
  59.260 -                // HUMBUG
  59.261 -                if ( i == expAt )
  59.262 -                    break parseNumber; // certainly bad
  59.263 -            }
  59.264 -            /*
  59.265 -             * We parsed everything we could.
  59.266 -             * If there are leftovers, then this is not good input!
  59.267 -             */
  59.268 -            if ( i < l &&
  59.269 -                ((i != l - 1) ||
  59.270 -                (in.charAt(i) != 'f' &&
  59.271 -                 in.charAt(i) != 'F' &&
  59.272 -                 in.charAt(i) != 'd' &&
  59.273 -                 in.charAt(i) != 'D'))) {
  59.274 -                break parseNumber; // go throw exception
  59.275 -            }
  59.276 -
  59.277 -            return new FormattedFloatingDecimal( isNegative, decExp, digits, nDigits,  false, Integer.MAX_VALUE, Form.COMPATIBLE );
  59.278 -        } catch ( StringIndexOutOfBoundsException e ){ }
  59.279 -        throw new NumberFormatException("For input string: \"" + in + "\"");
  59.280 -    }
  59.281 -
  59.282      /*
  59.283       * Take a FormattedFloatingDecimal, which we presumably just scanned in,
  59.284       * and find out what its value is, as a double.
  59.285 @@ -2035,548 +1767,4 @@
  59.286      private static final char infinity[] = { 'I', 'n', 'f', 'i', 'n', 'i', 't', 'y' };
  59.287      private static final char notANumber[] = { 'N', 'a', 'N' };
  59.288      private static final char zero[] = { '0', '0', '0', '0', '0', '0', '0', '0' };
  59.289 -
  59.290 -
  59.291 -    /*
  59.292 -     * Grammar is compatible with hexadecimal floating-point constants
  59.293 -     * described in section 6.4.4.2 of the C99 specification.
  59.294 -     */
  59.295 -    private static Pattern hexFloatPattern = Pattern.compile(
  59.296 -                   //1           234                   56                7                   8      9
  59.297 -                    "([-+])?0[xX](((\\p{XDigit}+)\\.?)|((\\p{XDigit}*)\\.(\\p{XDigit}+)))[pP]([-+])?(\\p{Digit}+)[fFdD]?"
  59.298 -                    );
  59.299 -
  59.300 -    /*
  59.301 -     * Convert string s to a suitable floating decimal; uses the
  59.302 -     * double constructor and set the roundDir variable appropriately
  59.303 -     * in case the value is later converted to a float.
  59.304 -     */
  59.305 -   static FormattedFloatingDecimal parseHexString(String s) {
  59.306 -        // Verify string is a member of the hexadecimal floating-point
  59.307 -        // string language.
  59.308 -        Matcher m = hexFloatPattern.matcher(s);
  59.309 -        boolean validInput = m.matches();
  59.310 -
  59.311 -        if (!validInput) {
  59.312 -            // Input does not match pattern
  59.313 -            throw new NumberFormatException("For input string: \"" + s + "\"");
  59.314 -        } else { // validInput
  59.315 -            /*
  59.316 -             * We must isolate the sign, significand, and exponent
  59.317 -             * fields.  The sign value is straightforward.  Since
  59.318 -             * floating-point numbers are stored with a normalized
  59.319 -             * representation, the significand and exponent are
  59.320 -             * interrelated.
  59.321 -             *
  59.322 -             * After extracting the sign, we normalized the
  59.323 -             * significand as a hexadecimal value, calculating an
  59.324 -             * exponent adjust for any shifts made during
  59.325 -             * normalization.  If the significand is zero, the
  59.326 -             * exponent doesn't need to be examined since the output
  59.327 -             * will be zero.
  59.328 -             *
  59.329 -             * Next the exponent in the input string is extracted.
  59.330 -             * Afterwards, the significand is normalized as a *binary*
  59.331 -             * value and the input value's normalized exponent can be
  59.332 -             * computed.  The significand bits are copied into a
  59.333 -             * double significand; if the string has more logical bits
  59.334 -             * than can fit in a double, the extra bits affect the
  59.335 -             * round and sticky bits which are used to round the final
  59.336 -             * value.
  59.337 -             */
  59.338 -
  59.339 -            //  Extract significand sign
  59.340 -            String group1 = m.group(1);
  59.341 -            double sign = (( group1 == null ) || group1.equals("+"))? 1.0 : -1.0;
  59.342 -
  59.343 -
  59.344 -            //  Extract Significand magnitude
  59.345 -            /*
  59.346 -             * Based on the form of the significand, calculate how the
  59.347 -             * binary exponent needs to be adjusted to create a
  59.348 -             * normalized *hexadecimal* floating-point number; that
  59.349 -             * is, a number where there is one nonzero hex digit to
  59.350 -             * the left of the (hexa)decimal point.  Since we are
  59.351 -             * adjusting a binary, not hexadecimal exponent, the
  59.352 -             * exponent is adjusted by a multiple of 4.
  59.353 -             *
  59.354 -             * There are a number of significand scenarios to consider;
  59.355 -             * letters are used in indicate nonzero digits:
  59.356 -             *
  59.357 -             * 1. 000xxxx       =>      x.xxx   normalized
  59.358 -             *    increase exponent by (number of x's - 1)*4
  59.359 -             *
  59.360 -             * 2. 000xxx.yyyy =>        x.xxyyyy        normalized
  59.361 -             *    increase exponent by (number of x's - 1)*4
  59.362 -             *
  59.363 -             * 3. .000yyy  =>   y.yy    normalized
  59.364 -             *    decrease exponent by (number of zeros + 1)*4
  59.365 -             *
  59.366 -             * 4. 000.00000yyy => y.yy normalized
  59.367 -             *    decrease exponent by (number of zeros to right of point + 1)*4
  59.368 -             *
  59.369 -             * If the significand is exactly zero, return a properly
  59.370 -             * signed zero.
  59.371 -             */
  59.372 -
  59.373 -            String significandString =null;
  59.374 -            int signifLength = 0;
  59.375 -            int exponentAdjust = 0;
  59.376 -            {
  59.377 -                int leftDigits  = 0; // number of meaningful digits to
  59.378 -                                     // left of "decimal" point
  59.379 -                                     // (leading zeros stripped)
  59.380 -                int rightDigits = 0; // number of digits to right of
  59.381 -                                     // "decimal" point; leading zeros
  59.382 -                                     // must always be accounted for
  59.383 -                /*
  59.384 -                 * The significand is made up of either
  59.385 -                 *
  59.386 -                 * 1. group 4 entirely (integer portion only)
  59.387 -                 *
  59.388 -                 * OR
  59.389 -                 *
  59.390 -                 * 2. the fractional portion from group 7 plus any
  59.391 -                 * (optional) integer portions from group 6.
  59.392 -                 */
  59.393 -                String group4;
  59.394 -                if( (group4 = m.group(4)) != null) {  // Integer-only significand
  59.395 -                    // Leading zeros never matter on the integer portion
  59.396 -                    significandString = stripLeadingZeros(group4);
  59.397 -                    leftDigits = significandString.length();
  59.398 -                }
  59.399 -                else {
  59.400 -                    // Group 6 is the optional integer; leading zeros
  59.401 -                    // never matter on the integer portion
  59.402 -                    String group6 = stripLeadingZeros(m.group(6));
  59.403 -                    leftDigits = group6.length();
  59.404 -
  59.405 -                    // fraction
  59.406 -                    String group7 = m.group(7);
  59.407 -                    rightDigits = group7.length();
  59.408 -
  59.409 -                    // Turn "integer.fraction" into "integer"+"fraction"
  59.410 -                    significandString =
  59.411 -                        ((group6 == null)?"":group6) + // is the null
  59.412 -                        // check necessary?
  59.413 -                        group7;
  59.414 -                }
  59.415 -
  59.416 -                significandString = stripLeadingZeros(significandString);
  59.417 -                signifLength  = significandString.length();
  59.418 -
  59.419 -                /*
  59.420 -                 * Adjust exponent as described above
  59.421 -                 */
  59.422 -                if (leftDigits >= 1) {  // Cases 1 and 2
  59.423 -                    exponentAdjust = 4*(leftDigits - 1);
  59.424 -                } else {                // Cases 3 and 4
  59.425 -                    exponentAdjust = -4*( rightDigits - signifLength + 1);
  59.426 -                }
  59.427 -
  59.428 -                // If the significand is zero, the exponent doesn't
  59.429 -                // matter; return a properly signed zero.
  59.430 -
  59.431 -                if (signifLength == 0) { // Only zeros in input
  59.432 -                    return new FormattedFloatingDecimal(sign * 0.0);
  59.433 -                }
  59.434 -            }
  59.435 -
  59.436 -            //  Extract Exponent
  59.437 -            /*
  59.438 -             * Use an int to read in the exponent value; this should
  59.439 -             * provide more than sufficient range for non-contrived
  59.440 -             * inputs.  If reading the exponent in as an int does
  59.441 -             * overflow, examine the sign of the exponent and
  59.442 -             * significand to determine what to do.
  59.443 -             */
  59.444 -            String group8 = m.group(8);
  59.445 -            boolean positiveExponent = ( group8 == null ) || group8.equals("+");
  59.446 -            long unsignedRawExponent;
  59.447 -            try {
  59.448 -                unsignedRawExponent = Integer.parseInt(m.group(9));
  59.449 -            }
  59.450 -            catch (NumberFormatException e) {
  59.451 -                // At this point, we know the exponent is
  59.452 -                // syntactically well-formed as a sequence of
  59.453 -                // digits.  Therefore, if an NumberFormatException
  59.454 -                // is thrown, it must be due to overflowing int's
  59.455 -                // range.  Also, at this point, we have already
  59.456 -                // checked for a zero significand.  Thus the signs
  59.457 -                // of the exponent and significand determine the
  59.458 -                // final result:
  59.459 -                //
  59.460 -                //                      significand
  59.461 -                //                      +               -
  59.462 -                // exponent     +       +infinity       -infinity
  59.463 -                //              -       +0.0            -0.0
  59.464 -                return new FormattedFloatingDecimal(sign * (positiveExponent ?
  59.465 -                                                   Double.POSITIVE_INFINITY : 0.0));
  59.466 -            }
  59.467 -
  59.468 -            long rawExponent =
  59.469 -                (positiveExponent ? 1L : -1L) * // exponent sign
  59.470 -                unsignedRawExponent;            // exponent magnitude
  59.471 -
  59.472 -            // Calculate partially adjusted exponent
  59.473 -            long exponent = rawExponent + exponentAdjust ;
  59.474 -
  59.475 -            // Starting copying non-zero bits into proper position in
  59.476 -            // a long; copy explicit bit too; this will be masked
  59.477 -            // later for normal values.
  59.478 -
  59.479 -            boolean round = false;
  59.480 -            boolean sticky = false;
  59.481 -            int bitsCopied=0;
  59.482 -            int nextShift=0;
  59.483 -            long significand=0L;
  59.484 -            // First iteration is different, since we only copy
  59.485 -            // from the leading significand bit; one more exponent
  59.486 -            // adjust will be needed...
  59.487 -
  59.488 -            // IMPORTANT: make leadingDigit a long to avoid
  59.489 -            // surprising shift semantics!
  59.490 -            long leadingDigit = getHexDigit(significandString, 0);
  59.491 -
  59.492 -            /*
  59.493 -             * Left shift the leading digit (53 - (bit position of
  59.494 -             * leading 1 in digit)); this sets the top bit of the
  59.495 -             * significand to 1.  The nextShift value is adjusted
  59.496 -             * to take into account the number of bit positions of
  59.497 -             * the leadingDigit actually used.  Finally, the
  59.498 -             * exponent is adjusted to normalize the significand
  59.499 -             * as a binary value, not just a hex value.
  59.500 -             */
  59.501 -            if (leadingDigit == 1) {
  59.502 -                significand |= leadingDigit << 52;
  59.503 -                nextShift = 52 - 4;
  59.504 -                /* exponent += 0 */     }
  59.505 -            else if (leadingDigit <= 3) { // [2, 3]
  59.506 -                significand |= leadingDigit << 51;
  59.507 -                nextShift = 52 - 5;
  59.508 -                exponent += 1;
  59.509 -            }
  59.510 -            else if (leadingDigit <= 7) { // [4, 7]
  59.511 -                significand |= leadingDigit << 50;
  59.512 -                nextShift = 52 - 6;
  59.513 -                exponent += 2;
  59.514 -            }
  59.515 -            else if (leadingDigit <= 15) { // [8, f]
  59.516 -                significand |= leadingDigit << 49;
  59.517 -                nextShift = 52 - 7;
  59.518 -                exponent += 3;
  59.519 -            } else {
  59.520 -                throw new AssertionError("Result from digit converstion too large!");
  59.521 -            }
  59.522 -            // The preceding if-else could be replaced by a single
  59.523 -            // code block based on the high-order bit set in
  59.524 -            // leadingDigit.  Given leadingOnePosition,
  59.525 -
  59.526 -            // significand |= leadingDigit << (SIGNIFICAND_WIDTH - leadingOnePosition);
  59.527 -            // nextShift = 52 - (3 + leadingOnePosition);
  59.528 -            // exponent += (leadingOnePosition-1);
  59.529 -
  59.530 -
  59.531 -            /*
  59.532 -             * Now the exponent variable is equal to the normalized
  59.533 -             * binary exponent.  Code below will make representation
  59.534 -             * adjustments if the exponent is incremented after
  59.535 -             * rounding (includes overflows to infinity) or if the
  59.536 -             * result is subnormal.
  59.537 -             */
  59.538 -
  59.539 -            // Copy digit into significand until the significand can't
  59.540 -            // hold another full hex digit or there are no more input
  59.541 -            // hex digits.
  59.542 -            int i = 0;
  59.543 -            for(i = 1;
  59.544 -                i < signifLength && nextShift >= 0;
  59.545 -                i++) {
  59.546 -                long currentDigit = getHexDigit(significandString, i);
  59.547 -                significand |= (currentDigit << nextShift);
  59.548 -                nextShift-=4;
  59.549 -            }
  59.550 -
  59.551 -            // After the above loop, the bulk of the string is copied.
  59.552 -            // Now, we must copy any partial hex digits into the
  59.553 -            // significand AND compute the round bit and start computing
  59.554 -            // sticky bit.
  59.555 -
  59.556 -            if ( i < signifLength ) { // at least one hex input digit exists
  59.557 -                long currentDigit = getHexDigit(significandString, i);
  59.558 -
  59.559 -                // from nextShift, figure out how many bits need
  59.560 -                // to be copied, if any
  59.561 -                switch(nextShift) { // must be negative
  59.562 -                case -1:
  59.563 -                    // three bits need to be copied in; can
  59.564 -                    // set round bit
  59.565 -                    significand |= ((currentDigit & 0xEL) >> 1);
  59.566 -                    round = (currentDigit & 0x1L)  != 0L;
  59.567 -                    break;
  59.568 -
  59.569 -                case -2:
  59.570 -                    // two bits need to be copied in; can
  59.571 -                    // set round and start sticky
  59.572 -                    significand |= ((currentDigit & 0xCL) >> 2);
  59.573 -                    round = (currentDigit &0x2L)  != 0L;
  59.574 -                    sticky = (currentDigit & 0x1L) != 0;
  59.575 -                    break;
  59.576 -
  59.577 -                case -3:
  59.578 -                    // one bit needs to be copied in
  59.579 -                    significand |= ((currentDigit & 0x8L)>>3);
  59.580 -                    // Now set round and start sticky, if possible
  59.581 -                    round = (currentDigit &0x4L)  != 0L;
  59.582 -                    sticky = (currentDigit & 0x3L) != 0;
  59.583 -                    break;
  59.584 -
  59.585 -                case -4:
  59.586 -                    // all bits copied into significand; set
  59.587 -                    // round and start sticky
  59.588 -                    round = ((currentDigit & 0x8L) != 0);  // is top bit set?
  59.589 -                    // nonzeros in three low order bits?
  59.590 -                    sticky = (currentDigit & 0x7L) != 0;
  59.591 -                    break;
  59.592 -
  59.593 -                default:
  59.594 -                    throw new AssertionError("Unexpected shift distance remainder.");
  59.595 -                    // break;
  59.596 -                }
  59.597 -
  59.598 -                // Round is set; sticky might be set.
  59.599 -
  59.600 -                // For the sticky bit, it suffices to check the
  59.601 -                // current digit and test for any nonzero digits in
  59.602 -                // the remaining unprocessed input.
  59.603 -                i++;
  59.604 -                while(i < signifLength && !sticky) {
  59.605 -                    currentDigit =  getHexDigit(significandString,i);
  59.606 -                    sticky = sticky || (currentDigit != 0);
  59.607 -                    i++;
  59.608 -                }
  59.609 -
  59.610 -            }
  59.611 -            // else all of string was seen, round and sticky are
  59.612 -            // correct as false.
  59.613 -
  59.614 -
  59.615 -            // Check for overflow and update exponent accordingly.
  59.616 -
  59.617 -            if (exponent > DoubleConsts.MAX_EXPONENT) {         // Infinite result
  59.618 -                // overflow to properly signed infinity
  59.619 -                return new FormattedFloatingDecimal(sign * Double.POSITIVE_INFINITY);
  59.620 -            } else {  // Finite return value
  59.621 -                if (exponent <= DoubleConsts.MAX_EXPONENT && // (Usually) normal result
  59.622 -                    exponent >= DoubleConsts.MIN_EXPONENT) {
  59.623 -
  59.624 -                    // The result returned in this block cannot be a
  59.625 -                    // zero or subnormal; however after the
  59.626 -                    // significand is adjusted from rounding, we could
  59.627 -                    // still overflow in infinity.
  59.628 -
  59.629 -                    // AND exponent bits into significand; if the
  59.630 -                    // significand is incremented and overflows from
  59.631 -                    // rounding, this combination will update the
  59.632 -                    // exponent correctly, even in the case of
  59.633 -                    // Double.MAX_VALUE overflowing to infinity.
  59.634 -
  59.635 -                    significand = (( ((long)exponent +
  59.636 -                                      (long)DoubleConsts.EXP_BIAS) <<
  59.637 -                                     (DoubleConsts.SIGNIFICAND_WIDTH-1))
  59.638 -                                   & DoubleConsts.EXP_BIT_MASK) |
  59.639 -                        (DoubleConsts.SIGNIF_BIT_MASK & significand);
  59.640 -
  59.641 -                }  else  {  // Subnormal or zero
  59.642 -                    // (exponent < DoubleConsts.MIN_EXPONENT)
  59.643 -
  59.644 -                    if (exponent < (DoubleConsts.MIN_SUB_EXPONENT -1 )) {
  59.645 -                        // No way to round back to nonzero value
  59.646 -                        // regardless of significand if the exponent is
  59.647 -                        // less than -1075.
  59.648 -                        return new FormattedFloatingDecimal(sign * 0.0);
  59.649 -                    } else { //  -1075 <= exponent <= MIN_EXPONENT -1 = -1023
  59.650 -                        /*
  59.651 -                         * Find bit position to round to; recompute
  59.652 -                         * round and sticky bits, and shift
  59.653 -                         * significand right appropriately.
  59.654 -                         */
  59.655 -
  59.656 -                        sticky = sticky || round;
  59.657 -                        round = false;
  59.658 -
  59.659 -                        // Number of bits of significand to preserve is
  59.660 -                        // exponent - abs_min_exp +1
  59.661 -                        // check:
  59.662 -                        // -1075 +1074 + 1 = 0
  59.663 -                        // -1023 +1074 + 1 = 52
  59.664 -
  59.665 -                        int bitsDiscarded = 53 -
  59.666 -                            ((int)exponent - DoubleConsts.MIN_SUB_EXPONENT + 1);
  59.667 -                        assert bitsDiscarded >= 1 && bitsDiscarded <= 53;
  59.668 -
  59.669 -                        // What to do here:
  59.670 -                        // First, isolate the new round bit
  59.671 -                        round = (significand & (1L << (bitsDiscarded -1))) != 0L;
  59.672 -                        if (bitsDiscarded > 1) {
  59.673 -                            // create mask to update sticky bits; low
  59.674 -                            // order bitsDiscarded bits should be 1
  59.675 -                            long mask = ~((~0L) << (bitsDiscarded -1));
  59.676 -                            sticky = sticky || ((significand & mask) != 0L ) ;
  59.677 -                        }
  59.678 -
  59.679 -                        // Now, discard the bits
  59.680 -                        significand = significand >> bitsDiscarded;
  59.681 -
  59.682 -                        significand = (( ((long)(DoubleConsts.MIN_EXPONENT -1) + // subnorm exp.
  59.683 -                                          (long)DoubleConsts.EXP_BIAS) <<
  59.684 -                                         (DoubleConsts.SIGNIFICAND_WIDTH-1))
  59.685 -                                       & DoubleConsts.EXP_BIT_MASK) |
  59.686 -                            (DoubleConsts.SIGNIF_BIT_MASK & significand);
  59.687 -                    }
  59.688 -                }
  59.689 -
  59.690 -                // The significand variable now contains the currently
  59.691 -                // appropriate exponent bits too.
  59.692 -
  59.693 -                /*
  59.694 -                 * Determine if significand should be incremented;
  59.695 -                 * making this determination depends on the least
  59.696 -                 * significant bit and the round and sticky bits.
  59.697 -                 *
  59.698 -                 * Round to nearest even rounding table, adapted from
  59.699 -                 * table 4.7 in "Computer Arithmetic" by IsraelKoren.
  59.700 -                 * The digit to the left of the "decimal" point is the
  59.701 -                 * least significant bit, the digits to the right of
  59.702 -                 * the point are the round and sticky bits
  59.703 -                 *
  59.704 -                 * Number       Round(x)
  59.705 -                 * x0.00        x0.
  59.706 -                 * x0.01        x0.
  59.707 -                 * x0.10        x0.
  59.708 -                 * x0.11        x1. = x0. +1
  59.709 -                 * x1.00        x1.
  59.710 -                 * x1.01        x1.
  59.711 -                 * x1.10        x1. + 1
  59.712 -                 * x1.11        x1. + 1
  59.713 -                 */
  59.714 -                boolean incremented = false;
  59.715 -                boolean leastZero  = ((significand & 1L) == 0L);
  59.716 -                if( (  leastZero  && round && sticky ) ||
  59.717 -                    ((!leastZero) && round )) {
  59.718 -                    incremented = true;
  59.719 -                    significand++;
  59.720 -                }
  59.721 -
  59.722 -                FormattedFloatingDecimal fd = new FormattedFloatingDecimal(FpUtils.rawCopySign(
  59.723 -                                                                 Double.longBitsToDouble(significand),
  59.724 -                                                                 sign));
  59.725 -
  59.726 -                /*
  59.727 -                 * Set roundingDir variable field of fd properly so
  59.728 -                 * that the input string can be properly rounded to a
  59.729 -                 * float value.  There are two cases to consider:
  59.730 -                 *
  59.731 -                 * 1. rounding to double discards sticky bit
  59.732 -                 * information that would change the result of a float
  59.733 -                 * rounding (near halfway case between two floats)
  59.734 -                 *
  59.735 -                 * 2. rounding to double rounds up when rounding up
  59.736 -                 * would not occur when rounding to float.
  59.737 -                 *
  59.738 -                 * For former case only needs to be considered when
  59.739 -                 * the bits rounded away when casting to float are all
  59.740 -                 * zero; otherwise, float round bit is properly set
  59.741 -                 * and sticky will already be true.
  59.742 -                 *
  59.743 -                 * The lower exponent bound for the code below is the
  59.744 -                 * minimum (normalized) subnormal exponent - 1 since a
  59.745 -                 * value with that exponent can round up to the
  59.746 -                 * minimum subnormal value and the sticky bit
  59.747 -                 * information must be preserved (i.e. case 1).
  59.748 -                 */
  59.749 -                if ((exponent >= FloatConsts.MIN_SUB_EXPONENT-1) &&
  59.750 -                    (exponent <= FloatConsts.MAX_EXPONENT ) ){
  59.751 -                    // Outside above exponent range, the float value
  59.752 -                    // will be zero or infinity.
  59.753 -
  59.754 -                    /*
  59.755 -                     * If the low-order 28 bits of a rounded double
  59.756 -                     * significand are 0, the double could be a
  59.757 -                     * half-way case for a rounding to float.  If the
  59.758 -                     * double value is a half-way case, the double
  59.759 -                     * significand may have to be modified to round
  59.760 -                     * the the right float value (see the stickyRound
  59.761 -                     * method).  If the rounding to double has lost
  59.762 -                     * what would be float sticky bit information, the
  59.763 -                     * double significand must be incremented.  If the
  59.764 -                     * double value's significand was itself
  59.765 -                     * incremented, the float value may end up too
  59.766 -                     * large so the increment should be undone.
  59.767 -                     */
  59.768 -                    if ((significand & 0xfffffffL) ==  0x0L) {
  59.769 -                        // For negative values, the sign of the
  59.770 -                        // roundDir is the same as for positive values
  59.771 -                        // since adding 1 increasing the significand's
  59.772 -                        // magnitude and subtracting 1 decreases the
  59.773 -                        // significand's magnitude.  If neither round
  59.774 -                        // nor sticky is true, the double value is
  59.775 -                        // exact and no adjustment is required for a
  59.776 -                        // proper float rounding.
  59.777 -                        if( round || sticky) {
  59.778 -                            if (leastZero) { // prerounding lsb is 0
  59.779 -                                // If round and sticky were both true,
  59.780 -                                // and the least significant
  59.781 -                                // significand bit were 0, the rounded
  59.782 -                                // significand would not have its
  59.783 -                                // low-order bits be zero.  Therefore,
  59.784 -                                // we only need to adjust the
  59.785 -                                // significand if round XOR sticky is
  59.786 -                                // true.
  59.787 -                                if (round ^ sticky) {
  59.788 -                                    fd.roundDir =  1;
  59.789 -                                }
  59.790 -                            }
  59.791 -                            else { // prerounding lsb is 1
  59.792 -                                // If the prerounding lsb is 1 and the
  59.793 -                                // resulting significand has its
  59.794 -                                // low-order bits zero, the significand
  59.795 -                                // was incremented.  Here, we undo the
  59.796 -                                // increment, which will ensure the
  59.797 -                                // right guard and sticky bits for the
  59.798 -                                // float rounding.
  59.799 -                                if (round)
  59.800 -                                    fd.roundDir =  -1;
  59.801 -                            }
  59.802 -                        }
  59.803 -                    }
  59.804 -                }
  59.805 -
  59.806 -                fd.fromHex = true;
  59.807 -                return fd;
  59.808 -            }
  59.809 -        }
  59.810 -    }
  59.811 -
  59.812 -    /**
  59.813 -     * Return <code>s</code> with any leading zeros removed.
  59.814 -     */
  59.815 -    static String stripLeadingZeros(String s) {
  59.816 -        return  s.replaceFirst("^0+", "");
  59.817 -    }
  59.818 -
  59.819 -    /**
  59.820 -     * Extract a hexadecimal digit from position <code>position</code>
  59.821 -     * of string <code>s</code>.
  59.822 -     */
  59.823 -    static int getHexDigit(String s, int position) {
  59.824 -        int value = Character.digit(s.charAt(position), 16);
  59.825 -        if (value <= -1 || value >= 16) {
  59.826 -            throw new AssertionError("Unxpected failure of digit converstion of " +
  59.827 -                                     s.charAt(position));
  59.828 -        }
  59.829 -        return value;
  59.830 -    }
  59.831 -
  59.832 -
  59.833  }
    60.1 --- a/src/share/classes/sun/misc/JavaIOAccess.java	Thu Apr 02 10:16:53 2009 -0700
    60.2 +++ b/src/share/classes/sun/misc/JavaIOAccess.java	Wed Apr 08 15:40:56 2009 -0700
    60.3 @@ -29,6 +29,5 @@
    60.4  
    60.5  public interface JavaIOAccess {
    60.6      public Console console();
    60.7 -    public Runnable consoleRestoreHook();
    60.8      public Charset charset();
    60.9  }
    61.1 --- a/src/share/classes/sun/misc/JavaIODeleteOnExitAccess.java	Thu Apr 02 10:16:53 2009 -0700
    61.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    61.3 @@ -1,30 +0,0 @@
    61.4 -/*
    61.5 - * Copyright 2005 Sun Microsystems, Inc.  All Rights Reserved.
    61.6 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    61.7 - *
    61.8 - * This code is free software; you can redistribute it and/or modify it
    61.9 - * under the terms of the GNU General Public License version 2 only, as
   61.10 - * published by the Free Software Foundation.  Sun designates this
   61.11 - * particular file as subject to the "Classpath" exception as provided
   61.12 - * by Sun in the LICENSE file that accompanied this code.
   61.13 - *
   61.14 - * This code is distributed in the hope that it will be useful, but WITHOUT
   61.15 - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   61.16 - * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
   61.17 - * version 2 for more details (a copy is included in the LICENSE file that
   61.18 - * accompanied this code).
   61.19 - *
   61.20 - * You should have received a copy of the GNU General Public License version
   61.21 - * 2 along with this work; if not, write to the Free Software Foundation,
   61.22 - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
   61.23 - *
   61.24 - * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
   61.25 - * CA 95054 USA or visit www.sun.com if you need additional information or
   61.26 - * have any questions.
   61.27 - */
   61.28 -
   61.29 -package sun.misc;
   61.30 -
   61.31 -public interface JavaIODeleteOnExitAccess extends Runnable {
   61.32 -    public void run();
   61.33 -}
    62.1 --- a/src/share/classes/sun/misc/JavaLangAccess.java	Thu Apr 02 10:16:53 2009 -0700
    62.2 +++ b/src/share/classes/sun/misc/JavaLangAccess.java	Wed Apr 08 15:40:56 2009 -0700
    62.3 @@ -54,4 +54,7 @@
    62.4  
    62.5      /** Set thread's blocker field. */
    62.6      void blockedOn(Thread t, Interruptible b);
    62.7 +
    62.8 +    /** register shutdown hook */
    62.9 +    void registerShutdownHook(int slot, Runnable r);
   62.10  }
    63.1 --- a/src/share/classes/sun/misc/SharedSecrets.java	Thu Apr 02 10:16:53 2009 -0700
    63.2 +++ b/src/share/classes/sun/misc/SharedSecrets.java	Wed Apr 08 15:40:56 2009 -0700
    63.3 @@ -44,7 +44,6 @@
    63.4      private static JavaUtilJarAccess javaUtilJarAccess;
    63.5      private static JavaLangAccess javaLangAccess;
    63.6      private static JavaIOAccess javaIOAccess;
    63.7 -    private static JavaIODeleteOnExitAccess javaIODeleteOnExitAccess;
    63.8      private static JavaNetAccess javaNetAccess;
    63.9      private static JavaNioAccess javaNioAccess;
   63.10      private static JavaIOFileDescriptorAccess javaIOFileDescriptorAccess;
   63.11 @@ -103,17 +102,6 @@
   63.12          return javaIOAccess;
   63.13      }
   63.14  
   63.15 -    public static void setJavaIODeleteOnExitAccess(JavaIODeleteOnExitAccess jida) {
   63.16 -        javaIODeleteOnExitAccess = jida;
   63.17 -    }
   63.18 -
   63.19 -    public static JavaIODeleteOnExitAccess getJavaIODeleteOnExitAccess() {
   63.20 -        if (javaIODeleteOnExitAccess == null) {
   63.21 -            unsafe.ensureClassInitialized(File.class);
   63.22 -        }
   63.23 -        return javaIODeleteOnExitAccess;
   63.24 -    }
   63.25 -
   63.26      public static void setJavaIOFileDescriptorAccess(JavaIOFileDescriptorAccess jiofda) {
   63.27          javaIOFileDescriptorAccess = jiofda;
   63.28      }
    64.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    64.2 +++ b/src/share/classes/sun/nio/cs/ArrayDecoder.java	Wed Apr 08 15:40:56 2009 -0700
    64.3 @@ -0,0 +1,35 @@
    64.4 +/*
    64.5 + * Copyright 2009 Sun Microsystems, Inc.  All Rights Reserved.
    64.6 + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    64.7 + *
    64.8 + * This code is free software; you can redistribute it and/or modify it
    64.9 + * under the terms of the GNU General Public License version 2 only, as
   64.10 + * published by the Free Software Foundation.  Sun designates this
   64.11 + * particular file as subject to the "Classpath" exception as provided
   64.12 + * by Sun in the LICENSE file that accompanied this code.
   64.13 + *
   64.14 + * This code is distributed in the hope that it will be useful, but WITHOUT
   64.15 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   64.16 + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
   64.17 + * version 2 for more details (a copy is included in the LICENSE file that
   64.18 + * accompanied this code).
   64.19 + *
   64.20 + * You should have received a copy of the GNU General Public License version
   64.21 + * 2 along with this work; if not, write to the Free Software Foundation,
   64.22 + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
   64.23 + *
   64.24 + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
   64.25 + * CA 95054 USA or visit www.sun.com if you need additional information or
   64.26 + * have any questions.
   64.27 + */
   64.28 +
   64.29 +package sun.nio.cs;
   64.30 +
   64.31 +/*
   64.32 + * FastPath byte[]->char[] decoder, REPLACE on malformed or
   64.33 + * unmappable input.
   64.34 + */
   64.35 +
   64.36 +public interface ArrayDecoder {
   64.37 +    int decode(byte[] src, int off, int len, char[] dst);
   64.38 +}
    65.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    65.2 +++ b/src/share/classes/sun/nio/cs/ArrayEncoder.java	Wed Apr 08 15:40:56 2009 -0700
    65.3 @@ -0,0 +1,35 @@
    65.4 +/*
    65.5 + * Copyright 2009 Sun Microsystems, Inc.  All Rights Reserved.
    65.6 + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    65.7 + *
    65.8 + * This code is free software; you can redistribute it and/or modify it
    65.9 + * under the terms of the GNU General Public License version 2 only, as
   65.10 + * published by the Free Software Foundation.  Sun designates this
   65.11 + * particular file as subject to the "Classpath" exception as provided
   65.12 + * by Sun in the LICENSE file that accompanied this code.
   65.13 + *
   65.14 + * This code is distributed in the hope that it will be useful, but WITHOUT
   65.15 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   65.16 + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
   65.17 + * version 2 for more details (a copy is included in the LICENSE file that
   65.18 + * accompanied this code).
   65.19 + *
   65.20 + * You should have received a copy of the GNU General Public License version
   65.21 + * 2 along with this work; if not, write to the Free Software Foundation,
   65.22 + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
   65.23 + *
   65.24 + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
   65.25 + * CA 95054 USA or visit www.sun.com if you need additional information or
   65.26 + * have any questions.
   65.27 + */
   65.28 +
   65.29 +package sun.nio.cs;
   65.30 +
   65.31 +/*
   65.32 + * FastPath char[]->byte[] encoder, REPLACE on malformed input or
   65.33 + * unmappable input.
   65.34 + */
   65.35 +
   65.36 +public interface ArrayEncoder {
   65.37 +    int encode(char[] src, int off, int len, byte[] dst);
   65.38 +}
    66.1 --- a/src/share/classes/sun/nio/cs/ISO_8859_1.java	Thu Apr 02 10:16:53 2009 -0700
    66.2 +++ b/src/share/classes/sun/nio/cs/ISO_8859_1.java	Wed Apr 08 15:40:56 2009 -0700
    66.3 @@ -23,9 +23,6 @@
    66.4   * have any questions.
    66.5   */
    66.6  
    66.7 -/*
    66.8 - */
    66.9 -
   66.10  package sun.nio.cs;
   66.11  
   66.12  import java.nio.ByteBuffer;
   66.13 @@ -34,10 +31,7 @@
   66.14  import java.nio.charset.CharsetDecoder;
   66.15  import java.nio.charset.CharsetEncoder;
   66.16  import java.nio.charset.CoderResult;
   66.17 -import java.nio.charset.CharacterCodingException;
   66.18 -import java.nio.charset.MalformedInputException;
   66.19 -import java.nio.charset.UnmappableCharacterException;
   66.20 -
   66.21 +import java.util.Arrays;
   66.22  
   66.23  class ISO_8859_1
   66.24      extends Charset
   66.25 @@ -65,8 +59,8 @@
   66.26          return new Encoder(this);
   66.27      }
   66.28  
   66.29 -    private static class Decoder extends CharsetDecoder {
   66.30 -
   66.31 +    private static class Decoder extends CharsetDecoder
   66.32 +                                 implements ArrayDecoder {
   66.33          private Decoder(Charset cs) {
   66.34              super(cs, 1.0f, 1.0f);
   66.35          }
   66.36 @@ -127,10 +121,18 @@
   66.37                  return decodeBufferLoop(src, dst);
   66.38          }
   66.39  
   66.40 +        public int decode(byte[] src, int sp, int len, char[] dst) {
   66.41 +            if (len > dst.length)
   66.42 +                len = dst.length;
   66.43 +            int dp = 0;
   66.44 +            while (dp < len)
   66.45 +                dst[dp++] = (char)(src[sp++] & 0xff);
   66.46 +            return dp;
   66.47 +        }
   66.48      }
   66.49  
   66.50 -    private static class Encoder extends CharsetEncoder {
   66.51 -
   66.52 +    private static class Encoder extends CharsetEncoder
   66.53 +                                 implements ArrayEncoder {
   66.54          private Encoder(Charset cs) {
   66.55              super(cs, 1.0f, 1.0f);
   66.56          }
   66.57 @@ -139,6 +141,10 @@
   66.58              return c <= '\u00FF';
   66.59          }
   66.60  
   66.61 +        public boolean isLegalReplacement(byte[] repl) {
   66.62 +            return (repl.length == 1);  // we accept any byte value
   66.63 +        }
   66.64 +
   66.65          private final Surrogate.Parser sgp = new Surrogate.Parser();
   66.66  
   66.67          private CoderResult encodeArrayLoop(CharBuffer src,
   66.68 @@ -208,5 +214,31 @@
   66.69                  return encodeBufferLoop(src, dst);
   66.70          }
   66.71  
   66.72 +        private byte repl = (byte)'?';
   66.73 +        protected void implReplaceWith(byte[] newReplacement) {
   66.74 +            repl = newReplacement[0];
   66.75 +        }
   66.76 +
   66.77 +        public int encode(char[] src, int sp, int len, byte[] dst) {
   66.78 +            int dp = 0;
   66.79 +            int sl = sp + Math.min(len, dst.length);
   66.80 +            while (sp < sl) {
   66.81 +                char c = src[sp++];
   66.82 +                if (c <= '\u00FF') {
   66.83 +                    dst[dp++] = (byte)c;
   66.84 +                    continue;
   66.85 +                }
   66.86 +                if (Surrogate.isHigh(c) && sp < sl &&
   66.87 +                    Surrogate.isLow(src[sp])) {
   66.88 +                    if (len > dst.length) {
   66.89 +                        sl++;
   66.90 +                        len--;
   66.91 +                    }
   66.92 +                    sp++;
   66.93 +                }
   66.94 +                dst[dp++] = repl;
   66.95 +            }
   66.96 +            return dp;
   66.97 +        }
   66.98      }
   66.99  }
    67.1 --- a/src/share/classes/sun/nio/cs/SingleByte.java	Thu Apr 02 10:16:53 2009 -0700
    67.2 +++ b/src/share/classes/sun/nio/cs/SingleByte.java	Wed Apr 08 15:40:56 2009 -0700
    67.3 @@ -32,6 +32,7 @@
    67.4  import java.nio.charset.CharsetDecoder;
    67.5  import java.nio.charset.CharsetEncoder;
    67.6  import java.nio.charset.CoderResult;
    67.7 +import java.util.Arrays;
    67.8  import static sun.nio.cs.CharsetMapping.*;
    67.9  
   67.10  public class SingleByte
   67.11 @@ -45,7 +46,8 @@
   67.12          return cr;
   67.13      }
   67.14  
   67.15 -    public static class Decoder extends CharsetDecoder {
   67.16 +    final public static class Decoder extends CharsetDecoder
   67.17 +                                      implements ArrayDecoder {
   67.18          private final char[] b2c;
   67.19  
   67.20          public Decoder(Charset cs, char[] b2c) {
   67.21 @@ -108,9 +110,29 @@
   67.22          private final char decode(int b) {
   67.23              return b2c[b + 128];
   67.24          }
   67.25 +
   67.26 +        private char repl = '\uFFFD';
   67.27 +        protected void implReplaceWith(String newReplacement) {
   67.28 +            repl = newReplacement.charAt(0);
   67.29 +        }
   67.30 +
   67.31 +        public int decode(byte[] src, int sp, int len, char[] dst) {
   67.32 +            if (len > dst.length)
   67.33 +                len = dst.length;
   67.34 +            int dp = 0;
   67.35 +            while (dp < len) {
   67.36 +                dst[dp] = decode(src[sp++]);
   67.37 +                if (dst[dp] == UNMAPPABLE_DECODING) {
   67.38 +                    dst[dp] = repl;
   67.39 +                }
   67.40 +                dp++;
   67.41 +            }
   67.42 +            return dp;
   67.43 +        }
   67.44      }
   67.45  
   67.46 -    public static class Encoder extends CharsetEncoder {
   67.47 +    final public static class Encoder extends CharsetEncoder
   67.48 +                                      implements ArrayEncoder {
   67.49          private Surrogate.Parser sgp;
   67.50          private final char[] c2b;
   67.51          private final char[] c2bIndex;
   67.52 @@ -125,6 +147,11 @@
   67.53              return encode(c) != UNMAPPABLE_ENCODING;
   67.54          }
   67.55  
   67.56 +        public boolean isLegalReplacement(byte[] repl) {
   67.57 +            return ((repl.length == 1 && repl[0] == (byte)'?') ||
   67.58 +                    super.isLegalReplacement(repl));
   67.59 +        }
   67.60 +
   67.61          private CoderResult encodeArrayLoop(CharBuffer src, ByteBuffer dst) {
   67.62              char[] sa = src.array();
   67.63              int sp = src.arrayOffset() + src.position();
   67.64 @@ -200,6 +227,34 @@
   67.65                  return UNMAPPABLE_ENCODING;
   67.66              return c2b[index + (ch & 0xff)];
   67.67          }
   67.68 +
   67.69 +        private byte repl = (byte)'?';
   67.70 +        protected void implReplaceWith(byte[] newReplacement) {
   67.71 +            repl = newReplacement[0];
   67.72 +        }
   67.73 +
   67.74 +        public int encode(char[] src, int sp, int len, byte[] dst) {
   67.75 +            int dp = 0;
   67.76 +            int sl = sp + Math.min(len, dst.length);
   67.77 +            while (sp < sl) {
   67.78 +                char c = src[sp++];
   67.79 +                int b = encode(c);
   67.80 +                if (b != UNMAPPABLE_ENCODING) {
   67.81 +                    dst[dp++] = (byte)b;
   67.82 +                    continue;
   67.83 +                }
   67.84 +                if (Surrogate.isHigh(c) && sp < sl &&
   67.85 +                    Surrogate.isLow(src[sp])) {
   67.86 +                    if (len > dst.length) {
   67.87 +                        sl++;
   67.88 +                        len--;
   67.89 +                    }
   67.90 +                    sp++;
   67.91 +                }
   67.92 +                dst[dp++] = repl;
   67.93 +            }
   67.94 +            return dp;
   67.95 +        }
   67.96      }
   67.97  
   67.98      // init the c2b and c2bIndex tables from b2c.
    68.1 --- a/src/share/classes/sun/nio/cs/US_ASCII.java	Thu Apr 02 10:16:53 2009 -0700
    68.2 +++ b/src/share/classes/sun/nio/cs/US_ASCII.java	Wed Apr 08 15:40:56 2009 -0700
    68.3 @@ -31,10 +31,7 @@
    68.4  import java.nio.charset.CharsetDecoder;
    68.5  import java.nio.charset.CharsetEncoder;
    68.6  import java.nio.charset.CoderResult;
    68.7 -import java.nio.charset.CharacterCodingException;
    68.8 -import java.nio.charset.MalformedInputException;
    68.9 -import java.nio.charset.UnmappableCharacterException;
   68.10 -
   68.11 +import java.util.Arrays;
   68.12  
   68.13  public class US_ASCII
   68.14      extends Charset
   68.15 @@ -61,7 +58,8 @@
   68.16          return new Encoder(this);
   68.17      }
   68.18  
   68.19 -    private static class Decoder extends CharsetDecoder {
   68.20 +    private static class Decoder extends CharsetDecoder
   68.21 +                                 implements ArrayDecoder {
   68.22  
   68.23          private Decoder(Charset cs) {
   68.24              super(cs, 1.0f, 1.0f);
   68.25 @@ -131,9 +129,27 @@
   68.26                  return decodeBufferLoop(src, dst);
   68.27          }
   68.28  
   68.29 +        private char repl = '\uFFFD';
   68.30 +        protected void implReplaceWith(String newReplacement) {
   68.31 +            repl = newReplacement.charAt(0);
   68.32 +        }
   68.33 +
   68.34 +        public int decode(byte[] src, int sp, int len, char[] dst) {
   68.35 +            int dp = 0;
   68.36 +            len = Math.min(len, dst.length);
   68.37 +            while (dp < len) {
   68.38 +                byte b = src[sp++];
   68.39 +                if (b >= 0)
   68.40 +                    dst[dp++] = (char)b;
   68.41 +                else
   68.42 +                    dst[dp++] = repl;
   68.43 +            }
   68.44 +            return dp;
   68.45 +        }
   68.46      }
   68.47  
   68.48 -    private static class Encoder extends CharsetEncoder {
   68.49 +    private static class Encoder extends CharsetEncoder
   68.50 +                                 implements ArrayEncoder {
   68.51  
   68.52          private Encoder(Charset cs) {
   68.53              super(cs, 1.0f, 1.0f);
   68.54 @@ -143,8 +159,11 @@
   68.55              return c < 0x80;
   68.56          }
   68.57  
   68.58 +        public boolean isLegalReplacement(byte[] repl) {
   68.59 +            return (repl.length == 1 && repl[0] >= 0);
   68.60 +        }
   68.61 +
   68.62          private final Surrogate.Parser sgp = new Surrogate.Parser();
   68.63 -
   68.64          private CoderResult encodeArrayLoop(CharBuffer src,
   68.65                                              ByteBuffer dst)
   68.66          {
   68.67 @@ -213,6 +232,32 @@
   68.68                  return encodeBufferLoop(src, dst);
   68.69          }
   68.70  
   68.71 +        private byte repl = (byte)'?';
   68.72 +        protected void implReplaceWith(byte[] newReplacement) {
   68.73 +            repl = newReplacement[0];
   68.74 +        }
   68.75 +
   68.76 +        public int encode(char[] src, int sp, int len, byte[] dst) {
   68.77 +            int dp = 0;
   68.78 +            int sl = sp + Math.min(len, dst.length);
   68.79 +            while (sp < sl) {
   68.80 +                char c = src[sp++];
   68.81 +                if (c < 0x80) {
   68.82 +                    dst[dp++] = (byte)c;
   68.83 +                    continue;
   68.84 +                }
   68.85 +                if (Surrogate.isHigh(c) && sp < sl &&
   68.86 +                    Surrogate.isLow(src[sp])) {
   68.87 +                    if (len > dst.length) {
   68.88 +                        sl++;
   68.89 +                        len--;
   68.90 +                    }
   68.91 +                    sp++;
   68.92 +                }
   68.93 +                dst[dp++] = repl;
   68.94 +            }
   68.95 +            return dp;
   68.96 +        }
   68.97      }
   68.98  
   68.99  }
    69.1 --- a/src/share/classes/sun/reflect/annotation/AnnotationParser.java	Thu Apr 02 10:16:53 2009 -0700
    69.2 +++ b/src/share/classes/sun/reflect/annotation/AnnotationParser.java	Wed Apr 08 15:40:56 2009 -0700
    69.3 @@ -788,4 +788,16 @@
    69.4          for (int i = 0; i < length; i++)
    69.5              skipMemberValue(buf);
    69.6      }
    69.7 +
    69.8 +    /*
    69.9 +     * This method converts the annotation map returned by the parseAnnotations()
   69.10 +     * method to an array.  It is called by Field.getDeclaredAnnotations(),
   69.11 +     * Method.getDeclaredAnnotations(), and Constructor.getDeclaredAnnotations().
   69.12 +     * This avoids the reflection classes to load the Annotation class until
   69.13 +     * it is needed.
   69.14 +     */
   69.15 +    private static final Annotation[] EMPTY_ANNOTATION_ARRAY = new Annotation[0];
   69.16 +    public static Annotation[] toArray(Map<Class, Annotation> annotations) {
   69.17 +        return annotations.values().toArray(EMPTY_ANNOTATION_ARRAY);
   69.18 +    }
   69.19  }
    70.1 --- a/src/share/classes/sun/security/jgss/spnego/NegTokenInit.java	Thu Apr 02 10:16:53 2009 -0700
    70.2 +++ b/src/share/classes/sun/security/jgss/spnego/NegTokenInit.java	Wed Apr 08 15:40:56 2009 -0700
    70.3 @@ -1,5 +1,5 @@
    70.4  /*
    70.5 - * Copyright 2005-2006 Sun Microsystems, Inc.  All Rights Reserved.
    70.6 + * Copyright 2005-2009 Sun Microsystems, Inc.  All Rights Reserved.
    70.7   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    70.8   *
    70.9   * This code is free software; you can redistribute it and/or modify it
   70.10 @@ -66,11 +66,11 @@
   70.11      private byte[] mechTypes = null;
   70.12      private Oid[] mechTypeList = null;
   70.13  
   70.14 -    private byte[] reqFlags = null;
   70.15 +    private BitArray reqFlags = null;
   70.16      private byte[] mechToken = null;
   70.17      private byte[] mechListMIC = null;
   70.18  
   70.19 -    NegTokenInit(byte[] mechTypes, byte[] flags,
   70.20 +    NegTokenInit(byte[] mechTypes, BitArray flags,
   70.21                  byte[] token, byte[] mechListMIC)
   70.22      {
   70.23          super(NEG_TOKEN_INIT_ID);
   70.24 @@ -101,7 +101,7 @@
   70.25              // write context flags with CONTEXT 01
   70.26              if (reqFlags != null) {
   70.27                  DerOutputStream flags = new DerOutputStream();
   70.28 -                flags.putBitString(reqFlags);
   70.29 +                flags.putUnalignedBitString(reqFlags);
   70.30                  initToken.write(DerValue.createTag(DerValue.TAG_CONTEXT,
   70.31                                                  true, (byte) 0x01), flags);
   70.32              }
   70.33 @@ -237,7 +237,7 @@
   70.34          return mechTypeList;
   70.35      }
   70.36  
   70.37 -    byte[] getReqFlags() {
   70.38 +    BitArray getReqFlags() {
   70.39          return reqFlags;
   70.40      }
   70.41  
    71.1 --- a/src/share/classes/sun/security/jgss/spnego/SpNegoContext.java	Thu Apr 02 10:16:53 2009 -0700
    71.2 +++ b/src/share/classes/sun/security/jgss/spnego/SpNegoContext.java	Wed Apr 08 15:40:56 2009 -0700
    71.3 @@ -1,5 +1,5 @@
    71.4  /*
    71.5 - * Copyright 2005-2008 Sun Microsystems, Inc.  All Rights Reserved.
    71.6 + * Copyright 2005-2009 Sun Microsystems, Inc.  All Rights Reserved.
    71.7   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    71.8   *
    71.9   * This code is free software; you can redistribute it and/or modify it
   71.10 @@ -53,13 +53,6 @@
   71.11  
   71.12      private int state = STATE_NEW;
   71.13  
   71.14 -    private static final int CHECKSUM_DELEG_FLAG    = 1;
   71.15 -    private static final int CHECKSUM_MUTUAL_FLAG   = 2;
   71.16 -    private static final int CHECKSUM_REPLAY_FLAG   = 4;
   71.17 -    private static final int CHECKSUM_SEQUENCE_FLAG = 8;
   71.18 -    private static final int CHECKSUM_CONF_FLAG     = 16;
   71.19 -    private static final int CHECKSUM_INTEG_FLAG    = 32;
   71.20 -
   71.21      /*
   71.22       * Optional features that the application can set and their default
   71.23       * values.
   71.24 @@ -697,25 +690,17 @@
   71.25      /**
   71.26       * get the context flags
   71.27       */
   71.28 -    private byte[] getContextFlags() {
   71.29 -        int flags = 0;
   71.30 +    private BitArray getContextFlags() {
   71.31 +        BitArray out = new BitArray(7);
   71.32  
   71.33 -        if (getCredDelegState())
   71.34 -            flags |= CHECKSUM_DELEG_FLAG;
   71.35 -        if (getMutualAuthState())
   71.36 -            flags |= CHECKSUM_MUTUAL_FLAG;
   71.37 -        if (getReplayDetState())
   71.38 -            flags |= CHECKSUM_REPLAY_FLAG;
   71.39 -        if (getSequenceDetState())
   71.40 -            flags |= CHECKSUM_SEQUENCE_FLAG;
   71.41 -        if (getIntegState())
   71.42 -            flags |= CHECKSUM_INTEG_FLAG;
   71.43 -        if (getConfState())
   71.44 -            flags |= CHECKSUM_CONF_FLAG;
   71.45 +        if (getCredDelegState()) out.set(0, true);
   71.46 +        if (getMutualAuthState()) out.set(1, true);
   71.47 +        if (getReplayDetState()) out.set(2, true);
   71.48 +        if (getSequenceDetState()) out.set(3, true);
   71.49 +        if (getConfState()) out.set(5, true);
   71.50 +        if (getIntegState()) out.set(6, true);
   71.51  
   71.52 -        byte[] temp = new byte[1];
   71.53 -        temp[0] = (byte)(flags & 0xff);
   71.54 -        return temp;
   71.55 +        return out;
   71.56      }
   71.57  
   71.58      private void setContextFlags() {
    72.1 --- a/src/share/classes/sun/security/krb5/Realm.java	Thu Apr 02 10:16:53 2009 -0700
    72.2 +++ b/src/share/classes/sun/security/krb5/Realm.java	Wed Apr 08 15:40:56 2009 -0700
    72.3 @@ -1,5 +1,5 @@
    72.4  /*
    72.5 - * Portions Copyright 2000-2006 Sun Microsystems, Inc.  All Rights Reserved.
    72.6 + * Portions Copyright 2000-2009 Sun Microsystems, Inc.  All Rights Reserved.
    72.7   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    72.8   *
    72.9   * This code is free software; you can redistribute it and/or modify it
    73.1 --- a/src/share/classes/sun/security/pkcs11/P11Key.java	Thu Apr 02 10:16:53 2009 -0700
    73.2 +++ b/src/share/classes/sun/security/pkcs11/P11Key.java	Wed Apr 08 15:40:56 2009 -0700
    73.3 @@ -1,5 +1,5 @@
    73.4  /*
    73.5 - * Copyright 2003-2006 Sun Microsystems, Inc.  All Rights Reserved.
    73.6 + * Copyright 2003-2009 Sun Microsystems, Inc.  All Rights Reserved.
    73.7   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    73.8   *
    73.9   * This code is free software; you can redistribute it and/or modify it
   73.10 @@ -26,6 +26,7 @@
   73.11  package sun.security.pkcs11;
   73.12  
   73.13  import java.io.*;
   73.14 +import java.lang.ref.*;
   73.15  import java.math.BigInteger;
   73.16  import java.util.*;
   73.17  
   73.18 @@ -67,9 +68,6 @@
   73.19      // type of key, one of (PUBLIC, PRIVATE, SECRET)
   73.20      final String type;
   73.21  
   73.22 -    // session in which the key was created, relevant for session objects
   73.23 -    final Session session;
   73.24 -
   73.25      // token instance
   73.26      final Token token;
   73.27  
   73.28 @@ -85,10 +83,12 @@
   73.29      // flags indicating whether the key is a token object, sensitive, extractable
   73.30      final boolean tokenObject, sensitive, extractable;
   73.31  
   73.32 +    // weak reference notification clean up for session keys
   73.33 +    private final SessionKeyRef sessionKeyRef;
   73.34 +
   73.35      P11Key(String type, Session session, long keyID, String algorithm,
   73.36              int keyLength, CK_ATTRIBUTE[] attributes) {
   73.37          this.type = type;
   73.38 -        this.session = session;
   73.39          this.token = session.token;
   73.40          this.keyID = keyID;
   73.41          this.algorithm = algorithm;
   73.42 @@ -111,7 +111,9 @@
   73.43          this.sensitive = sensitive;
   73.44          this.extractable = extractable;
   73.45          if (tokenObject == false) {
   73.46 -            session.addObject();
   73.47 +            sessionKeyRef = new SessionKeyRef(this, keyID, session);
   73.48 +        } else {
   73.49 +            sessionKeyRef = null;
   73.50          }
   73.51      }
   73.52  
   73.53 @@ -236,24 +238,6 @@
   73.54          }
   73.55      }
   73.56  
   73.57 -    protected void finalize() throws Throwable {
   73.58 -        if (tokenObject || (token.isValid() == false)) {
   73.59 -            super.finalize();
   73.60 -            return;
   73.61 -        }
   73.62 -        Session newSession = null;
   73.63 -        try {
   73.64 -            newSession = token.getOpSession();
   73.65 -            token.p11.C_DestroyObject(newSession.id(), keyID);
   73.66 -        } catch (PKCS11Exception e) {
   73.67 -            // ignore
   73.68 -        } finally {
   73.69 -            token.releaseSession(newSession);
   73.70 -            session.removeObject();
   73.71 -            super.finalize();
   73.72 -        }
   73.73 -    }
   73.74 -
   73.75      private final static CK_ATTRIBUTE[] A0 = new CK_ATTRIBUTE[0];
   73.76  
   73.77      private static CK_ATTRIBUTE[] getAttributes(Session session, long keyID,
   73.78 @@ -1055,5 +1039,65 @@
   73.79                  + "\n  parameters: " + params;
   73.80          }
   73.81      }
   73.82 +}
   73.83  
   73.84 +final class SessionKeyRef extends WeakReference<P11Key>
   73.85 +    implements Comparable<SessionKeyRef> {
   73.86 +    private static ReferenceQueue<P11Key> refQueue =
   73.87 +        new ReferenceQueue<P11Key>();
   73.88 +    private static Set<SessionKeyRef> refList =
   73.89 +        Collections.synchronizedSortedSet(new TreeSet<SessionKeyRef>());
   73.90 +
   73.91 +    static ReferenceQueue<P11Key> referenceQueue() {
   73.92 +        return refQueue;
   73.93 +    }
   73.94 +
   73.95 +    static final private int MAX_ITERATIONS = 2;
   73.96 +
   73.97 +    private static void drainRefQueueBounded() {
   73.98 +        int iterations = 0;
   73.99 +        while (iterations < MAX_ITERATIONS) {
  73.100 +            SessionKeyRef next = (SessionKeyRef) refQueue.poll();
  73.101 +            if (next != null) next.dispose();
  73.102 +            ++iterations;
  73.103 +        }
  73.104 +    }
  73.105 +
  73.106 +    // handle to the native key
  73.107 +    private long keyID;
  73.108 +    private Session session;
  73.109 +
  73.110 +    SessionKeyRef(P11Key key , long keyID, Session session) {
  73.111 +        super(key, refQueue);
  73.112 +        this.keyID = keyID;
  73.113 +        this.session = session;
  73.114 +        this.session.addObject();
  73.115 +        refList.add(this);
  73.116 +        // TBD: run at some interval and not every time?
  73.117 +        drainRefQueueBounded();
  73.118 +    }
  73.119 +
  73.120 +    void dispose() {
  73.121 +        refList.remove(this);
  73.122 +        if (session.token.isValid()) {
  73.123 +            Session newSession = null;
  73.124 +            try {
  73.125 +                newSession = session.token.getOpSession();
  73.126 +                session.token.p11.C_DestroyObject(newSession.id(), keyID);
  73.127 +            } catch (PKCS11Exception e) {
  73.128 +                // ignore
  73.129 +            } finally {
  73.130 +                session.token.releaseSession(newSession);
  73.131 +                session.removeObject();
  73.132 +            }
  73.133 +        }
  73.134 +    }
  73.135 +
  73.136 +    public int compareTo(SessionKeyRef other) {
  73.137 +        if (this.keyID == other.keyID) {
  73.138 +            return 0;
  73.139 +        } else {
  73.140 +            return (this.keyID < other.keyID) ? -1 : 1;
  73.141 +        }
  73.142 +    }
  73.143  }
    74.1 --- a/src/share/classes/sun/security/pkcs11/P11RSACipher.java	Thu Apr 02 10:16:53 2009 -0700
    74.2 +++ b/src/share/classes/sun/security/pkcs11/P11RSACipher.java	Wed Apr 08 15:40:56 2009 -0700
    74.3 @@ -1,5 +1,5 @@
    74.4  /*
    74.5 - * Copyright 2003-2008 Sun Microsystems, Inc.  All Rights Reserved.
    74.6 + * Copyright 2003-2009 Sun Microsystems, Inc.  All Rights Reserved.
    74.7   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    74.8   *
    74.9   * This code is free software; you can redistribute it and/or modify it
   74.10 @@ -191,7 +191,9 @@
   74.11                  throw new InvalidKeyException
   74.12                                  ("Unwrap has to be used with private keys");
   74.13              }
   74.14 -            encrypt = false;
   74.15 +            // No further setup needed for C_Unwrap(). We'll initialize later
   74.16 +            // if we can't use C_Unwrap().
   74.17 +            return;
   74.18          } else {
   74.19              throw new InvalidKeyException("Unsupported mode: " + opmode);
   74.20          }
   74.21 @@ -452,7 +454,7 @@
   74.22                  long keyID = token.p11.C_UnwrapKey(s.id(),
   74.23                          new CK_MECHANISM(mechanism), p11Key.keyID, wrappedKey,
   74.24                          attributes);
   74.25 -                return P11Key.secretKey(session, keyID, algorithm, 48 << 3,
   74.26 +                return P11Key.secretKey(s, keyID, algorithm, 48 << 3,
   74.27                          attributes);
   74.28              } catch (PKCS11Exception e) {
   74.29                  throw new InvalidKeyException("unwrap() failed", e);
   74.30 @@ -461,6 +463,7 @@
   74.31              }
   74.32          }
   74.33          // XXX implement unwrap using C_Unwrap() for all keys
   74.34 +        implInit(Cipher.DECRYPT_MODE, p11Key);
   74.35          if (wrappedKey.length > maxInputSize) {
   74.36              throw new InvalidKeyException("Key is too long for unwrapping");
   74.37          }
    75.1 --- a/src/share/classes/sun/security/pkcs11/P11SecretKeyFactory.java	Thu Apr 02 10:16:53 2009 -0700
    75.2 +++ b/src/share/classes/sun/security/pkcs11/P11SecretKeyFactory.java	Wed Apr 08 15:40:56 2009 -0700
    75.3 @@ -151,7 +151,7 @@
    75.4                          session = token.getObjSession();
    75.5                          long newKeyID = token.p11.C_CopyObject(session.id(),
    75.6                                  p11Key.keyID, extraAttrs);
    75.7 -                        p11Key = (P11Key) (P11Key.secretKey(p11Key.session,
    75.8 +                        p11Key = (P11Key) (P11Key.secretKey(session,
    75.9                                  newKeyID, p11Key.algorithm, p11Key.keyLength,
   75.10                                  extraAttrs));
   75.11                      } catch (PKCS11Exception p11e) {
    76.1 --- a/src/share/classes/sun/security/provider/SeedGenerator.java	Thu Apr 02 10:16:53 2009 -0700
    76.2 +++ b/src/share/classes/sun/security/provider/SeedGenerator.java	Wed Apr 08 15:40:56 2009 -0700
    76.3 @@ -1,5 +1,5 @@
    76.4  /*
    76.5 - * Copyright 1996-2006 Sun Microsystems, Inc.  All Rights Reserved.
    76.6 + * Copyright 1996-2009 Sun Microsystems, Inc.  All Rights Reserved.
    76.7   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    76.8   *
    76.9   * This code is free software; you can redistribute it and/or modify it
   76.10 @@ -68,6 +68,9 @@
   76.11  import java.util.Properties;
   76.12  import java.util.Enumeration;
   76.13  import java.net.*;
   76.14 +import java.nio.file.DirectoryStream;
   76.15 +import java.nio.file.Path;
   76.16 +import java.util.Random;
   76.17  import sun.security.util.Debug;
   76.18  
   76.19  abstract class SeedGenerator {
   76.20 @@ -180,10 +183,27 @@
   76.21  
   76.22                          // The temporary dir
   76.23                          File f = new File(p.getProperty("java.io.tmpdir"));
   76.24 -                        String[] sa = f.list();
   76.25 -                        for(int i = 0; i < sa.length; i++)
   76.26 -                            md.update(sa[i].getBytes());
   76.27 -
   76.28 +                        int count = 0;
   76.29 +                        DirectoryStream<Path> ds
   76.30 +                                = f.toPath().newDirectoryStream();
   76.31 +                        try {
   76.32 +                            // We use a Random object to choose what file names
   76.33 +                            // should be used. Otherwise on a machine with too
   76.34 +                            // many files, the same first 1024 files always get
   76.35 +                            // used. Any, We make sure the first 512 files are
   76.36 +                            // always used.
   76.37 +                            Random r = new Random();
   76.38 +                            for (Path path: ds) {
   76.39 +                                if (count < 512 || r.nextBoolean()) {
   76.40 +                                    md.update(path.getName().toString().getBytes());
   76.41 +                                }
   76.42 +                                if (count++ > 1024) {
   76.43 +                                    break;
   76.44 +                                }
   76.45 +                            }
   76.46 +                        } finally {
   76.47 +                            ds.close();
   76.48 +                        }
   76.49                      } catch (Exception ex) {
   76.50                          md.update((byte)ex.hashCode());
   76.51                      }
    77.1 --- a/src/share/classes/sun/security/provider/certpath/OCSPResponse.java	Thu Apr 02 10:16:53 2009 -0700
    77.2 +++ b/src/share/classes/sun/security/provider/certpath/OCSPResponse.java	Wed Apr 08 15:40:56 2009 -0700
    77.3 @@ -1,5 +1,5 @@
    77.4  /*
    77.5 - * Copyright 2003-2008 Sun Microsystems, Inc.  All Rights Reserved.
    77.6 + * Copyright 2003-2009 Sun Microsystems, Inc.  All Rights Reserved.
    77.7   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    77.8   *
    77.9   * This code is free software; you can redistribute it and/or modify it
   77.10 @@ -28,8 +28,6 @@
   77.11  import java.io.*;
   77.12  import java.math.BigInteger;
   77.13  import java.security.*;
   77.14 -import java.security.cert.Certificate;
   77.15 -import java.security.cert.CertificateFactory;
   77.16  import java.security.cert.CertPathValidatorException;
   77.17  import java.security.cert.CRLReason;
   77.18  import java.security.cert.X509Certificate;
   77.19 @@ -335,7 +333,7 @@
   77.20  
   77.21              // Check whether the cert returned by the responder is trusted
   77.22              if (x509Certs != null && x509Certs[0] != null) {
   77.23 -                X509Certificate cert = x509Certs[0];
   77.24 +                X509CertImpl cert = x509Certs[0];
   77.25  
   77.26                  // First check if the cert matches the responder cert which
   77.27                  // was set locally.
   77.28 @@ -344,8 +342,8 @@
   77.29  
   77.30                  // Next check if the cert was issued by the responder cert
   77.31                  // which was set locally.
   77.32 -                } else if (cert.getIssuerDN().equals(
   77.33 -                    responderCert.getSubjectDN())) {
   77.34 +                } else if (cert.getIssuerX500Principal().equals(
   77.35 +                    responderCert.getSubjectX500Principal())) {
   77.36  
   77.37                      // Check for the OCSPSigning key purpose
   77.38                      List<String> keyPurposes = cert.getExtendedKeyUsage();
   77.39 @@ -360,6 +358,43 @@
   77.40                              "OCSP responses");
   77.41                      }
   77.42  
   77.43 +                    // check the validity
   77.44 +                    try {
   77.45 +                        Date dateCheckedAgainst = params.getDate();
   77.46 +                        if (dateCheckedAgainst == null) {
   77.47 +                            cert.checkValidity();
   77.48 +                        } else {
   77.49 +                            cert.checkValidity(dateCheckedAgainst);
   77.50 +                        }
   77.51 +                    } catch (GeneralSecurityException e) {
   77.52 +                        if (DEBUG != null) {
   77.53 +                            DEBUG.println("Responder's certificate is not " +
   77.54 +                                "within the validity period.");
   77.55 +                        }
   77.56 +                        throw new CertPathValidatorException(
   77.57 +                            "Responder's certificate not within the " +
   77.58 +                            "validity period");
   77.59 +                    }
   77.60 +
   77.61 +                    // check for revocation
   77.62 +                    //
   77.63 +                    // A CA may specify that an OCSP client can trust a
   77.64 +                    // responder for the lifetime of the responder's
   77.65 +                    // certificate. The CA does so by including the
   77.66 +                    // extension id-pkix-ocsp-nocheck.
   77.67 +                    //
   77.68 +                    Extension noCheck =
   77.69 +                            cert.getExtension(PKIXExtensions.OCSPNoCheck_Id);
   77.70 +                    if (noCheck != null) {
   77.71 +                        if (DEBUG != null) {
   77.72 +                            DEBUG.println("Responder's certificate includes " +
   77.73 +                                "the extension id-pkix-ocsp-nocheck.");
   77.74 +                        }
   77.75 +                    } else {
   77.76 +                        // we should do the revocating checking of the
   77.77 +                        // authorized responder in a future update.
   77.78 +                    }
   77.79 +
   77.80                      // verify the signature
   77.81                      try {
   77.82                          cert.verify(responderCert.getPublicKey());
   77.83 @@ -369,6 +404,14 @@
   77.84                      } catch (GeneralSecurityException e) {
   77.85                          responderCert = null;
   77.86                      }
   77.87 +                } else {
   77.88 +                    if (DEBUG != null) {
   77.89 +                        DEBUG.println("Responder's certificate is not " +
   77.90 +                            "authorized to sign OCSP responses.");
   77.91 +                    }
   77.92 +                    throw new CertPathValidatorException(
   77.93 +                        "Responder's certificate not authorized to sign " +
   77.94 +                        "OCSP responses");
   77.95                  }
   77.96              }
   77.97  
    78.1 --- a/src/share/classes/sun/security/provider/certpath/PKIXMasterCertPathValidator.java	Thu Apr 02 10:16:53 2009 -0700
    78.2 +++ b/src/share/classes/sun/security/provider/certpath/PKIXMasterCertPathValidator.java	Wed Apr 08 15:40:56 2009 -0700
    78.3 @@ -1,5 +1,5 @@
    78.4  /*
    78.5 - * Copyright 2000-2008 Sun Microsystems, Inc.  All Rights Reserved.
    78.6 + * Copyright 2000-2009 Sun Microsystems, Inc.  All Rights Reserved.
    78.7   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    78.8   *
    78.9   * This code is free software; you can redistribute it and/or modify it
   78.10 @@ -143,11 +143,15 @@
   78.11                      }
   78.12  
   78.13                  } catch (CertPathValidatorException cpve) {
   78.14 -                    // Throw the saved OCSP exception
   78.15 -                    // (when the CRL check has also failed)
   78.16 +                    // Throw the saved OCSP exception unless the CRL
   78.17 +                    // checker has determined that the cert is revoked
   78.18                      if (ocspCause != null &&
   78.19 -                        currChecker instanceof CrlRevocationChecker) {
   78.20 -                        throw ocspCause;
   78.21 +                            currChecker instanceof CrlRevocationChecker) {
   78.22 +                        if (cpve.getReason() == BasicReason.REVOKED) {
   78.23 +                            throw cpve;
   78.24 +                        } else {
   78.25 +                            throw ocspCause;
   78.26 +                        }
   78.27                      }
   78.28                      /*
   78.29                       * Handle failover from OCSP to CRLs
    79.1 --- a/src/share/classes/sun/security/tools/KeyTool.java	Thu Apr 02 10:16:53 2009 -0700
    79.2 +++ b/src/share/classes/sun/security/tools/KeyTool.java	Wed Apr 08 15:40:56 2009 -0700
    79.3 @@ -875,6 +875,18 @@
    79.4              if (filename != null) {
    79.5                  inStream = new FileInputStream(filename);
    79.6              }
    79.7 +            // Read the full stream before feeding to X509Factory,
    79.8 +            // otherwise, keytool -gencert | keytool -importcert
    79.9 +            // might not work properly, since -gencert is slow
   79.10 +            // and there's no data in the pipe at the beginning.
   79.11 +            ByteArrayOutputStream bout = new ByteArrayOutputStream();
   79.12 +            byte[] b = new byte[4096];
   79.13 +            while (true) {
   79.14 +                int len = inStream.read(b);
   79.15 +                if (len < 0) break;
   79.16 +                bout.write(b, 0, len);
   79.17 +            }
   79.18 +            inStream = new ByteArrayInputStream(bout.toByteArray());
   79.19              try {
   79.20                  String importAlias = (alias!=null)?alias:keyAlias;
   79.21                  if (keyStore.entryInstanceOf(importAlias, KeyStore.PrivateKeyEntry.class)) {
   79.22 @@ -1060,8 +1072,8 @@
   79.23  
   79.24          X509CertInfo info = new X509CertInfo();
   79.25          info.set(X509CertInfo.VALIDITY, interval);
   79.26 -        info.set(X509CertInfo.SERIAL_NUMBER, new CertificateSerialNumber
   79.27 -                 ((int)(firstDate.getTime()/1000)));
   79.28 +        info.set(X509CertInfo.SERIAL_NUMBER, new CertificateSerialNumber(
   79.29 +                    new java.util.Random().nextInt() & 0x7fffffff));
   79.30          info.set(X509CertInfo.VERSION,
   79.31                       new CertificateVersion(CertificateVersion.V3));
   79.32          info.set(X509CertInfo.ALGORITHM_ID,
   79.33 @@ -1910,7 +1922,9 @@
   79.34              ObjectIdentifier oid = attr.getAttributeId();
   79.35              if (oid.equals(PKCS9Attribute.EXTENSION_REQUEST_OID)) {
   79.36                  CertificateExtensions exts = (CertificateExtensions)attr.getAttributeValue();
   79.37 -                printExtensions(rb.getString("Extension Request:"), exts, out);
   79.38 +                if (exts != null) {
   79.39 +                    printExtensions(rb.getString("Extension Request:"), exts, out);
   79.40 +                }
   79.41              } else {
   79.42                  out.println(attr.getAttributeId());
   79.43                  out.println(attr.getAttributeValue());
   79.44 @@ -2107,8 +2121,8 @@
   79.45          certInfo.set(X509CertInfo.VALIDITY, interval);
   79.46  
   79.47          // Make new serial number
   79.48 -        certInfo.set(X509CertInfo.SERIAL_NUMBER, new CertificateSerialNumber
   79.49 -                     ((int)(firstDate.getTime()/1000)));
   79.50 +        certInfo.set(X509CertInfo.SERIAL_NUMBER, new CertificateSerialNumber(
   79.51 +                    new java.util.Random().nextInt() & 0x7fffffff));
   79.52  
   79.53          // Set owner and issuer fields
   79.54          X500Name owner;
   79.55 @@ -2495,7 +2509,9 @@
   79.56                                                             X509CertImpl.INFO);
   79.57              CertificateExtensions exts = (CertificateExtensions)
   79.58                      certInfo.get(X509CertInfo.EXTENSIONS);
   79.59 -            printExtensions(rb.getString("Extensions: "), exts, out);
   79.60 +            if (exts != null) {
   79.61 +                printExtensions(rb.getString("Extensions: "), exts, out);
   79.62 +            }
   79.63          }
   79.64      }
   79.65  
    80.1 --- a/src/share/classes/sun/security/x509/AuthorityInfoAccessExtension.java	Thu Apr 02 10:16:53 2009 -0700
    80.2 +++ b/src/share/classes/sun/security/x509/AuthorityInfoAccessExtension.java	Wed Apr 08 15:40:56 2009 -0700
    80.3 @@ -1,5 +1,5 @@
    80.4  /*
    80.5 - * Copyright 2004-2006 Sun Microsystems, Inc.  All Rights Reserved.
    80.6 + * Copyright 2004-2009 Sun Microsystems, Inc.  All Rights Reserved.
    80.7   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    80.8   *
    80.9   * This code is free software; you can redistribute it and/or modify it
    81.1 --- a/src/share/classes/sun/security/x509/CertAndKeyGen.java	Thu Apr 02 10:16:53 2009 -0700
    81.2 +++ b/src/share/classes/sun/security/x509/CertAndKeyGen.java	Wed Apr 08 15:40:56 2009 -0700
    81.3 @@ -265,8 +265,8 @@
    81.4              // Add all mandatory attributes
    81.5              info.set(X509CertInfo.VERSION,
    81.6                       new CertificateVersion(CertificateVersion.V3));
    81.7 -            info.set(X509CertInfo.SERIAL_NUMBER,
    81.8 -                 new CertificateSerialNumber((int)(firstDate.getTime()/1000)));
    81.9 +            info.set(X509CertInfo.SERIAL_NUMBER, new CertificateSerialNumber(
   81.10 +                    new java.util.Random().nextInt() & 0x7fffffff));
   81.11              AlgorithmId algID = issuer.getAlgorithmId();
   81.12              info.set(X509CertInfo.ALGORITHM_ID,
   81.13                       new CertificateAlgorithmId(algID));
    82.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    82.2 +++ b/src/share/classes/sun/security/x509/OCSPNoCheckExtension.java	Wed Apr 08 15:40:56 2009 -0700
    82.3 @@ -0,0 +1,132 @@
    82.4 +/*
    82.5 + * Copyright 2009 Sun Microsystems, Inc.  All Rights Reserved.
    82.6 + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    82.7 + *
    82.8 + * This code is free software; you can redistribute it and/or modify it
    82.9 + * under the terms of the GNU General Public License version 2 only, as
   82.10 + * published by the Free Software Foundation.  Sun designates this
   82.11 + * particular file as subject to the "Classpath" exception as provided
   82.12 + * by Sun in the LICENSE file that accompanied this code.
   82.13 + *
   82.14 + * This code is distributed in the hope that it will be useful, but WITHOUT
   82.15 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   82.16 + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
   82.17 + * version 2 for more details (a copy is included in the LICENSE file that
   82.18 + * accompanied this code).
   82.19 + *
   82.20 + * You should have received a copy of the GNU General Public License version
   82.21 + * 2 along with this work; if not, write to the Free Software Foundation,
   82.22 + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
   82.23 + *
   82.24 + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
   82.25 + * CA 95054 USA or visit www.sun.com if you need additional information or
   82.26 + * have any questions.
   82.27 + */
   82.28 +
   82.29 +package sun.security.x509;
   82.30 +
   82.31 +import java.io.IOException;
   82.32 +import java.io.OutputStream;
   82.33 +import java.util.Enumeration;
   82.34 +
   82.35 +import sun.security.util.*;
   82.36 +
   82.37 +/**
   82.38 + * Represent the OCSP NoCheck Extension from RFC2560.
   82.39 + * <p>
   82.40 + * A CA may specify that an OCSP client can trust a responder for the
   82.41 + * lifetime of the responder's certificate. The CA does so by including
   82.42 + * the extension id-pkix-ocsp-nocheck. This SHOULD be a non-critical
   82.43 + * extension. The value of the extension should be NULL. CAs issuing
   82.44 + * such a certificate should realized that a compromise of the
   82.45 + * responder's key, is as serious as the compromise of a CA key used to
   82.46 + * sign CRLs, at least for the validity period of this certificate. CA's
   82.47 + * may choose to issue this type of certificate with a very short
   82.48 + * lifetime and renew it frequently.
   82.49 + * <pre>
   82.50 + * id-pkix-ocsp-nocheck OBJECT IDENTIFIER ::= { id-pkix-ocsp 5 }
   82.51 + * </pre>
   82.52 + *
   82.53 + * @author Xuelei Fan
   82.54 + * @see Extension
   82.55 + * @see CertAttrSet
   82.56 + */
   82.57 +public class OCSPNoCheckExtension extends Extension
   82.58 +    implements CertAttrSet<String> {
   82.59 +
   82.60 +    /**
   82.61 +     * Identifier for this attribute, to be used with the
   82.62 +     * get, set, delete methods of Certificate, x509 type.
   82.63 +     */
   82.64 +    public static final String IDENT =
   82.65 +                         "x509.info.extensions.OCSPNoCheck";
   82.66 +    /**
   82.67 +     * Attribute names.
   82.68 +     */
   82.69 +    public static final String NAME = "OCSPNoCheck";
   82.70 +
   82.71 +    /**
   82.72 +     * Create a OCSPNoCheckExtension
   82.73 +     */
   82.74 +    public OCSPNoCheckExtension() throws IOException {
   82.75 +        this.extensionId = PKIXExtensions.OCSPNoCheck_Id;
   82.76 +        this.critical = false;
   82.77 +        this.extensionValue = new byte[0];
   82.78 +    }
   82.79 +
   82.80 +    /**
   82.81 +     * Create the extension from the passed DER encoded value.
   82.82 +     *
   82.83 +     * @param critical true if the extension is to be treated as critical.
   82.84 +     * @param value an array of DER encoded bytes of the actual value.
   82.85 +     * @exception IOException on error.
   82.86 +     */
   82.87 +    public OCSPNoCheckExtension(Boolean critical, Object value)
   82.88 +        throws IOException {
   82.89 +
   82.90 +        this.extensionId = PKIXExtensions.OCSPNoCheck_Id;
   82.91 +        this.critical = critical.booleanValue();
   82.92 +
   82.93 +        // the value should be null, just ignore it here.
   82.94 +        this.extensionValue = new byte[0];
   82.95 +    }
   82.96 +
   82.97 +    /**
   82.98 +     * Set the attribute value.
   82.99 +     */
  82.100 +    public void set(String name, Object obj) throws IOException {
  82.101 +        throw new IOException("No attribute is allowed by " +
  82.102 +                        "CertAttrSet:OCSPNoCheckExtension.");
  82.103 +    }
  82.104 +
  82.105 +    /**
  82.106 +     * Get the attribute value.
  82.107 +     */
  82.108 +    public Object get(String name) throws IOException {
  82.109 +        throw new IOException("No attribute is allowed by " +
  82.110 +                        "CertAttrSet:OCSPNoCheckExtension.");
  82.111 +    }
  82.112 +
  82.113 +    /**
  82.114 +     * Delete the attribute value.
  82.115 +     */
  82.116 +    public void delete(String name) throws IOException {
  82.117 +        throw new IOException("No attribute is allowed by " +
  82.118 +                        "CertAttrSet:OCSPNoCheckExtension.");
  82.119 +    }
  82.120 +
  82.121 +    /**
  82.122 +     * Return an enumeration of names of attributes existing within this
  82.123 +     * attribute.
  82.124 +     */
  82.125 +    public Enumeration<String> getElements() {
  82.126 +        return (new AttributeNameEnumeration()).elements();
  82.127 +    }
  82.128 +
  82.129 +    /**
  82.130 +     * Return the name of this attribute.
  82.131 +     */
  82.132 +    public String getName() {
  82.133 +        return NAME;
  82.134 +    }
  82.135 +}
    83.1 --- a/src/share/classes/sun/security/x509/OIDMap.java	Thu Apr 02 10:16:53 2009 -0700
    83.2 +++ b/src/share/classes/sun/security/x509/OIDMap.java	Wed Apr 08 15:40:56 2009 -0700
    83.3 @@ -100,6 +100,8 @@
    83.4                                          DeltaCRLIndicatorExtension.NAME;
    83.5      private static final String FRESHEST_CRL = ROOT + "." +
    83.6                                          FreshestCRLExtension.NAME;
    83.7 +    private static final String OCSPNOCHECK = ROOT + "." +
    83.8 +                                        OCSPNoCheckExtension.NAME;
    83.9  
   83.10      private static final int NetscapeCertType_data[] =
   83.11          { 2, 16, 840, 1, 113730, 1, 1 };
   83.12 @@ -161,6 +163,8 @@
   83.13                      "sun.security.x509.DeltaCRLIndicatorExtension");
   83.14          addInternal(FRESHEST_CRL, PKIXExtensions.FreshestCRL_Id,
   83.15                      "sun.security.x509.FreshestCRLExtension");
   83.16 +        addInternal(OCSPNOCHECK, PKIXExtensions.OCSPNoCheck_Id,
   83.17 +                    "sun.security.x509.OCSPNoCheckExtension");
   83.18      }
   83.19  
   83.20      /**
    84.1 --- a/src/share/classes/sun/security/x509/PKIXExtensions.java	Thu Apr 02 10:16:53 2009 -0700
    84.2 +++ b/src/share/classes/sun/security/x509/PKIXExtensions.java	Wed Apr 08 15:40:56 2009 -0700
    84.3 @@ -1,5 +1,5 @@
    84.4  /*
    84.5 - * Copyright 1997-2005 Sun Microsystems, Inc.  All Rights Reserved.
    84.6 + * Copyright 1997-2009 Sun Microsystems, Inc.  All Rights Reserved.
    84.7   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    84.8   *
    84.9   * This code is free software; you can redistribute it and/or modify it
   84.10 @@ -74,6 +74,8 @@
   84.11      private static final int AuthInfoAccess_data [] = { 1, 3, 6, 1, 5, 5, 7, 1, 1};
   84.12      private static final int SubjectInfoAccess_data [] = { 1, 3, 6, 1, 5, 5, 7, 1, 11};
   84.13      private static final int FreshestCRL_data [] = { 2, 5, 29, 46 };
   84.14 +    private static final int OCSPNoCheck_data [] = { 1, 3, 6, 1, 5, 5, 7,
   84.15 +                                                    48, 1, 5};
   84.16  
   84.17      /**
   84.18       * Identifies the particular public key used to sign the certificate.
   84.19 @@ -216,6 +218,12 @@
   84.20       */
   84.21      public static final ObjectIdentifier FreshestCRL_Id;
   84.22  
   84.23 +    /**
   84.24 +     * Identifies the OCSP client can trust the responder for the
   84.25 +     * lifetime of the responder's certificate.
   84.26 +     */
   84.27 +    public static final ObjectIdentifier OCSPNoCheck_Id;
   84.28 +
   84.29      static {
   84.30          AuthorityKey_Id = ObjectIdentifier.newInternal(AuthorityKey_data);
   84.31          SubjectKey_Id   = ObjectIdentifier.newInternal(SubjectKey_data);
   84.32 @@ -257,5 +265,6 @@
   84.33          SubjectInfoAccess_Id =
   84.34              ObjectIdentifier.newInternal(SubjectInfoAccess_data);
   84.35          FreshestCRL_Id = ObjectIdentifier.newInternal(FreshestCRL_data);
   84.36 +        OCSPNoCheck_Id = ObjectIdentifier.newInternal(OCSPNoCheck_data);
   84.37      }
   84.38  }
    85.1 --- a/src/share/lib/security/java.policy	Thu Apr 02 10:16:53 2009 -0700
    85.2 +++ b/src/share/lib/security/java.policy	Wed Apr 08 15:40:56 2009 -0700
    85.3 @@ -15,7 +15,8 @@
    85.4  	// It is strongly recommended that you either remove this permission
    85.5  	// from this policy file or further restrict it to code sources
    85.6  	// that you specify, because Thread.stop() is potentially unsafe.
    85.7 -	// See "http://java.sun.com/notes" for more information.
    85.8 +	// See the API specification of java.lang.Thread.stop() for more 
    85.9 +        // information.
   85.10  	permission java.lang.RuntimePermission "stopThread";
   85.11  
   85.12  	// allows anyone to listen on un-privileged ports
    86.1 --- a/src/share/native/java/util/zip/zip_util.c	Thu Apr 02 10:16:53 2009 -0700
    86.2 +++ b/src/share/native/java/util/zip/zip_util.c	Wed Apr 08 15:40:56 2009 -0700
    86.3 @@ -1,5 +1,5 @@
    86.4  /*
    86.5 - * Copyright 1995-2008 Sun Microsystems, Inc.  All Rights Reserved.
    86.6 + * Copyright 1995-2009 Sun Microsystems, Inc.  All Rights Reserved.
    86.7   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    86.8   *
    86.9   * This code is free software; you can redistribute it and/or modify it
    87.1 --- a/src/share/native/java/util/zip/zip_util.h	Thu Apr 02 10:16:53 2009 -0700
    87.2 +++ b/src/share/native/java/util/zip/zip_util.h	Wed Apr 08 15:40:56 2009 -0700
    87.3 @@ -1,5 +1,5 @@
    87.4  /*
    87.5 - * Copyright 1995-2006 Sun Microsystems, Inc.  All Rights Reserved.
    87.6 + * Copyright 1995-2009 Sun Microsystems, Inc.  All Rights Reserved.
    87.7   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    87.8   *
    87.9   * This code is free software; you can redistribute it and/or modify it
    88.1 --- a/src/share/native/sun/security/pkcs11/wrapper/p11_convert.c	Thu Apr 02 10:16:53 2009 -0700
    88.2 +++ b/src/share/native/sun/security/pkcs11/wrapper/p11_convert.c	Wed Apr 08 15:40:56 2009 -0700
    88.3 @@ -1,5 +1,5 @@
    88.4  /*
    88.5 - * Portions Copyright 2003-2005 Sun Microsystems, Inc.  All Rights Reserved.
    88.6 + * Portions Copyright 2003-2009 Sun Microsystems, Inc.  All Rights Reserved.
    88.7   */
    88.8  
    88.9  /* Copyright  (c) 2002 Graz University of Technology. All rights reserved.
   88.10 @@ -89,21 +89,24 @@
   88.11  
   88.12      /* load CK_DATE class */
   88.13      jDateClass = (*env)->FindClass(env, CLASS_DATE);
   88.14 -    assert(jDateClass != 0);
   88.15 +    if (jDateClass == NULL) { return NULL; }
   88.16  
   88.17      /* load CK_DATE constructor */
   88.18      jCtrId = (*env)->GetMethodID(env, jDateClass, "<init>", "([C[C[C)V");
   88.19 -    assert(jCtrId != 0);
   88.20 +    if (jCtrId == NULL) { return NULL; }
   88.21  
   88.22      /* prep all fields */
   88.23      jYear = ckCharArrayToJCharArray(env, (CK_CHAR_PTR)(ckpDate->year), 4);
   88.24 +    if (jYear == NULL) { return NULL; }
   88.25      jMonth = ckCharArrayToJCharArray(env, (CK_CHAR_PTR)(ckpDate->month), 2);
   88.26 +    if (jMonth == NULL) { return NULL; }
   88.27      jDay = ckCharArrayToJCharArray(env, (CK_CHAR_PTR)(ckpDate->day), 2);
   88.28 +    if (jDay == NULL) { return NULL; }
   88.29  
   88.30      /* create new CK_DATE object */
   88.31      jDateObject =
   88.32        (*env)->NewObject(env, jDateClass, jCtrId, jYear, jMonth, jDay);
   88.33 -    assert(jDateObject != 0);
   88.34 +    if (jDateObject == NULL) { return NULL; }
   88.35  
   88.36      /* free local references */
   88.37      (*env)->DeleteLocalRef(env, jDateClass);
   88.38 @@ -131,11 +134,11 @@
   88.39  
   88.40      /* load CK_VERSION class */
   88.41      jVersionClass = (*env)->FindClass(env, CLASS_VERSION);
   88.42 -    assert(jVersionClass != 0);
   88.43 +    if (jVersionClass == NULL) { return NULL; }
   88.44  
   88.45      /* load CK_VERSION constructor */
   88.46      jCtrId = (*env)->GetMethodID(env, jVersionClass, "<init>", "(II)V");
   88.47 -    assert(jCtrId != 0);
   88.48 +    if (jCtrId == NULL) { return NULL; }
   88.49  
   88.50      /* prep both fields */
   88.51      jMajor = ckpVersion->major;
   88.52 @@ -144,7 +147,7 @@
   88.53      /* create new CK_VERSION object */
   88.54      jVersionObject =
   88.55        (*env)->NewObject(env, jVersionClass, jCtrId, jMajor, jMinor);
   88.56 -    assert(jVersionObject != 0);
   88.57 +    if (jVersionObject == NULL) { return NULL; }
   88.58  
   88.59      /* free local references */
   88.60      (*env)->DeleteLocalRef(env, jVersionClass);
   88.61 @@ -171,11 +174,11 @@
   88.62  
   88.63      /* load CK_SESSION_INFO class */
   88.64      jSessionInfoClass = (*env)->FindClass(env, CLASS_SESSION_INFO);
   88.65 -    assert(jSessionInfoClass != 0);
   88.66 +    if (jSessionInfoClass == NULL) { return NULL; }
   88.67  
   88.68      /* load CK_SESSION_INFO constructor */
   88.69      jCtrId = (*env)->GetMethodID(env, jSessionInfoClass, "<init>", "(JJJJ)V");
   88.70 -    assert(jCtrId != 0);
   88.71 +    if (jCtrId == NULL) { return NULL; }
   88.72  
   88.73      /* prep all fields */
   88.74      jSlotID = ckULongToJLong(ckpSessionInfo->slotID);
   88.75 @@ -187,7 +190,7 @@
   88.76      jSessionInfoObject =
   88.77        (*env)->NewObject(env, jSessionInfoClass, jCtrId, jSlotID, jState,
   88.78                          jFlags, jDeviceError);
   88.79 -    assert(jSessionInfoObject != 0);
   88.80 +    if (jSessionInfoObject == NULL) { return NULL; }
   88.81  
   88.82      /* free local references */
   88.83      (*env)->DeleteLocalRef(env, jSessionInfoClass);
   88.84 @@ -211,20 +214,21 @@
   88.85      jobject jPValue = NULL;
   88.86  
   88.87      jAttributeClass = (*env)->FindClass(env, CLASS_ATTRIBUTE);
   88.88 -    assert(jAttributeClass != 0);
   88.89 +    if (jAttributeClass == NULL) { return NULL; }
   88.90  
   88.91      /* load CK_INFO constructor */
   88.92      jCtrId = (*env)->GetMethodID(env, jAttributeClass, "<init>", "(JLjava/lang/Object;)V");
   88.93 -    assert(jCtrId != 0);
   88.94 +    if (jCtrId == NULL) { return NULL; }
   88.95  
   88.96      /* prep both fields */
   88.97      jType = ckULongToJLong(ckpAttribute->type);
   88.98      jPValue = ckAttributeValueToJObject(env, ckpAttribute);
   88.99 +    if ((*env)->ExceptionCheck(env)) { return NULL; }
  88.100  
  88.101      /* create new CK_ATTRIBUTE object */
  88.102      jAttributeObject =
  88.103        (*env)->NewObject(env, jAttributeClass, jCtrId, jType, jPValue);
  88.104 -    assert(jAttributeObject != 0);
  88.105 +    if (jAttributeObject == NULL) { return NULL; }
  88.106  
  88.107      /* free local references */
  88.108      (*env)->DeleteLocalRef(env, jAttributeClass);
  88.109 @@ -252,23 +256,27 @@
  88.110          return NULL;
  88.111      }
  88.112  
  88.113 -    /* allocate memory for CK_VERSION pointer */
  88.114 -    ckpVersion = (CK_VERSION_PTR) malloc(sizeof(CK_VERSION));
  88.115 -
  88.116      /* get CK_VERSION class */
  88.117      jVersionClass = (*env)->GetObjectClass(env, jVersion);
  88.118 -    assert(jVersionClass != 0);
  88.119 +    if (jVersionClass == NULL) { return NULL; }
  88.120  
  88.121      /* get Major */
  88.122      jFieldID = (*env)->GetFieldID(env, jVersionClass, "major", "B");
  88.123 -    assert(jFieldID != 0);
  88.124 +    if (jFieldID == NULL) { return NULL; }
  88.125      jMajor = (*env)->GetByteField(env, jVersion, jFieldID);
  88.126 -    ckpVersion->major = jByteToCKByte(jMajor);
  88.127  
  88.128      /* get Minor */
  88.129      jFieldID = (*env)->GetFieldID(env, jVersionClass, "minor", "B");
  88.130 -    assert(jFieldID != 0);
  88.131 +    if (jFieldID == NULL) { return NULL; }
  88.132      jMinor = (*env)->GetByteField(env, jVersion, jFieldID);
  88.133 +
  88.134 +    /* allocate memory for CK_VERSION pointer */
  88.135 +    ckpVersion = (CK_VERSION_PTR) malloc(sizeof(CK_VERSION));
  88.136 +    if (ckpVersion == NULL) {
  88.137 +        JNU_ThrowOutOfMemoryError(env, 0);
  88.138 +        return NULL;
  88.139 +    }
  88.140 +    ckpVersion->major = jByteToCKByte(jMajor);
  88.141      ckpVersion->minor = jByteToCKByte(jMinor);
  88.142  
  88.143      return ckpVersion ;
  88.144 @@ -292,18 +300,36 @@
  88.145      jchar *jTempChars;
  88.146      CK_ULONG i;
  88.147  
  88.148 -    /* allocate memory for CK_DATE pointer */
  88.149 -    ckpDate = (CK_DATE *) malloc(sizeof(CK_DATE));
  88.150 +    if (jDate == NULL) {
  88.151 +        return NULL;
  88.152 +    }
  88.153  
  88.154      /* get CK_DATE class */
  88.155      jDateClass = (*env)->FindClass(env, CLASS_DATE);
  88.156 -    assert(jDateClass != 0);
  88.157 +    if (jDateClass == NULL) { return NULL; }
  88.158  
  88.159      /* get Year */
  88.160      jFieldID = (*env)->GetFieldID(env, jDateClass, "year", "[C");
  88.161 -    assert(jFieldID != 0);
  88.162 +    if (jFieldID == NULL) { return NULL; }
  88.163      jYear = (*env)->GetObjectField(env, jDate, jFieldID);
  88.164  
  88.165 +    /* get Month */
  88.166 +    jFieldID = (*env)->GetFieldID(env, jDateClass, "month", "[C");
  88.167 +    if (jFieldID == NULL) { return NULL; }
  88.168 +    jMonth = (*env)->GetObjectField(env, jDate, jFieldID);
  88.169 +
  88.170 +    /* get Day */
  88.171 +    jFieldID = (*env)->GetFieldID(env, jDateClass, "day", "[C");
  88.172 +    if (jFieldID == NULL) { return NULL; }
  88.173 +    jDay = (*env)->GetObjectField(env, jDate, jFieldID);
  88.174 +
  88.175 +    /* allocate memory for CK_DATE pointer */
  88.176 +    ckpDate = (CK_DATE *) malloc(sizeof(CK_DATE));
  88.177 +    if (ckpDate == NULL) {
  88.178 +        JNU_ThrowOutOfMemoryError(env, 0);
  88.179 +        return NULL;
  88.180 +    }
  88.181 +
  88.182      if (jYear == NULL) {
  88.183          ckpDate->year[0] = 0;
  88.184          ckpDate->year[1] = 0;
  88.185 @@ -312,43 +338,66 @@
  88.186      } else {
  88.187          ckLength = (*env)->GetArrayLength(env, jYear);
  88.188          jTempChars = (jchar*) malloc((ckLength) * sizeof(jchar));
  88.189 +        if (jTempChars == NULL) {
  88.190 +            free(ckpDate);
  88.191 +            JNU_ThrowOutOfMemoryError(env, 0);
  88.192 +            return NULL;
  88.193 +        }
  88.194          (*env)->GetCharArrayRegion(env, jYear, 0, ckLength, jTempChars);
  88.195 +        if ((*env)->ExceptionCheck(env)) {
  88.196 +            free(ckpDate);
  88.197 +            free(jTempChars);
  88.198 +            return NULL;
  88.199 +        }
  88.200 +
  88.201          for (i = 0; (i < ckLength) && (i < 4) ; i++) {
  88.202              ckpDate->year[i] = jCharToCKChar(jTempChars[i]);
  88.203          }
  88.204          free(jTempChars);
  88.205      }
  88.206  
  88.207 -    /* get Month */
  88.208 -    jFieldID = (*env)->GetFieldID(env, jDateClass, "month", "[C");
  88.209 -    assert(jFieldID != 0);
  88.210 -    jMonth = (*env)->GetObjectField(env, jDate, jFieldID);
  88.211 -
  88.212      if (jMonth == NULL) {
  88.213          ckpDate->month[0] = 0;
  88.214          ckpDate->month[1] = 0;
  88.215      } else {
  88.216          ckLength = (*env)->GetArrayLength(env, jMonth);
  88.217          jTempChars = (jchar*) malloc((ckLength) * sizeof(jchar));
  88.218 +        if (jTempChars == NULL) {
  88.219 +            free(ckpDate);
  88.220 +            JNU_ThrowOutOfMemoryError(env, 0);
  88.221 +            return NULL;
  88.222 +        }
  88.223          (*env)->GetCharArrayRegion(env, jMonth, 0, ckLength, jTempChars);
  88.224 +        if ((*env)->ExceptionCheck(env)) {
  88.225 +            free(ckpDate);
  88.226 +            free(jTempChars);
  88.227 +            return NULL;
  88.228 +        }
  88.229 +
  88.230          for (i = 0; (i < ckLength) && (i < 4) ; i++) {
  88.231              ckpDate->month[i] = jCharToCKChar(jTempChars[i]);
  88.232          }
  88.233          free(jTempChars);
  88.234      }
  88.235  
  88.236 -    /* get Day */
  88.237 -    jFieldID = (*env)->GetFieldID(env, jDateClass, "day", "[C");
  88.238 -    assert(jFieldID != 0);
  88.239 -    jDay = (*env)->GetObjectField(env, jDate, jFieldID);
  88.240 -
  88.241      if (jDay == NULL) {
  88.242          ckpDate->day[0] = 0;
  88.243          ckpDate->day[1] = 0;
  88.244      } else {
  88.245          ckLength = (*env)->GetArrayLength(env, jDay);
  88.246          jTempChars = (jchar*) malloc((ckLength) * sizeof(jchar));
  88.247 +        if (jTempChars == NULL) {
  88.248 +            free(ckpDate);
  88.249 +            JNU_ThrowOutOfMemoryError(env, 0);
  88.250 +            return NULL;
  88.251 +        }
  88.252          (*env)->GetCharArrayRegion(env, jDay, 0, ckLength, jTempChars);
  88.253 +        if ((*env)->ExceptionCheck(env)) {
  88.254 +            free(ckpDate);
  88.255 +            free(jTempChars);
  88.256 +            return NULL;
  88.257 +        }
  88.258 +
  88.259          for (i = 0; (i < ckLength) && (i < 4) ; i++) {
  88.260              ckpDate->day[i] = jCharToCKChar(jTempChars[i]);
  88.261          }
  88.262 @@ -374,23 +423,25 @@
  88.263      jlong jType;
  88.264      jobject jPValue;
  88.265  
  88.266 +    // TBD: what if jAttribute == NULL?!
  88.267 +
  88.268      TRACE0("\nDEBUG: jAttributeToCKAttribute");
  88.269      /* get CK_ATTRIBUTE class */
  88.270      TRACE0(", getting attribute object class");
  88.271      jAttributeClass = (*env)->GetObjectClass(env, jAttribute);
  88.272 -    assert(jAttributeClass != 0);
  88.273 +    if (jAttributeClass == NULL) { return ckAttribute; }
  88.274  
  88.275      /* get type */
  88.276      TRACE0(", getting type field");
  88.277      jFieldID = (*env)->GetFieldID(env, jAttributeClass, "type", "J");
  88.278 -    assert(jFieldID != 0);
  88.279 +    if (jFieldID == NULL) { return ckAttribute; }
  88.280      jType = (*env)->GetLongField(env, jAttribute, jFieldID);
  88.281      TRACE1(", type=0x%X", jType);
  88.282  
  88.283      /* get pValue */
  88.284      TRACE0(", getting pValue field");
  88.285      jFieldID = (*env)->GetFieldID(env, jAttributeClass, "pValue", "Ljava/lang/Object;");
  88.286 -    assert(jFieldID != 0);
  88.287 +    if (jFieldID == NULL) { return ckAttribute; }
  88.288      jPValue = (*env)->GetObjectField(env, jAttribute, jFieldID);
  88.289      TRACE1(", pValue=%p", jPValue);
  88.290  
  88.291 @@ -417,36 +468,50 @@
  88.292  {
  88.293      // XXX don't return structs
  88.294      // XXX prefetch class and field ids
  88.295 -    jclass jSsl3MasterKeyDeriveParamsClass = (*env)->FindClass(env, CLASS_SSL3_MASTER_KEY_DERIVE_PARAMS);
  88.296 +    jclass jSsl3MasterKeyDeriveParamsClass;
  88.297      CK_SSL3_MASTER_KEY_DERIVE_PARAMS ckParam;
  88.298      jfieldID fieldID;
  88.299 -    jobject jObject;
  88.300      jclass jSsl3RandomDataClass;
  88.301 -    jobject jRandomInfo;
  88.302 +    jobject jRandomInfo, jRIClientRandom, jRIServerRandom, jVersion;
  88.303  
  88.304      /* get RandomInfo */
  88.305 -    jSsl3RandomDataClass = (*env)->FindClass(env, CLASS_SSL3_RANDOM_DATA);
  88.306 +    jSsl3MasterKeyDeriveParamsClass = (*env)->FindClass(env, CLASS_SSL3_MASTER_KEY_DERIVE_PARAMS);
  88.307 +    if (jSsl3MasterKeyDeriveParamsClass == NULL) { return ckParam; }
  88.308      fieldID = (*env)->GetFieldID(env, jSsl3MasterKeyDeriveParamsClass, "RandomInfo", "Lsun/security/pkcs11/wrapper/CK_SSL3_RANDOM_DATA;");
  88.309 -    assert(fieldID != 0);
  88.310 +    if (fieldID == NULL) { return ckParam; }
  88.311      jRandomInfo = (*env)->GetObjectField(env, jParam, fieldID);
  88.312  
  88.313      /* get pClientRandom and ulClientRandomLength out of RandomInfo */
  88.314 +    jSsl3RandomDataClass = (*env)->FindClass(env, CLASS_SSL3_RANDOM_DATA);
  88.315 +    if (jSsl3RandomDataClass == NULL) { return ckParam; }
  88.316      fieldID = (*env)->GetFieldID(env, jSsl3RandomDataClass, "pClientRandom", "[B");
  88.317 -    assert(fieldID != 0);
  88.318 -    jObject = (*env)->GetObjectField(env, jRandomInfo, fieldID);
  88.319 -    jByteArrayToCKByteArray(env, jObject, &(ckParam.RandomInfo.pClientRandom), &(ckParam.RandomInfo.ulClientRandomLen));
  88.320 +    if (fieldID == NULL) { return ckParam; }
  88.321 +    jRIClientRandom = (*env)->GetObjectField(env, jRandomInfo, fieldID);
  88.322  
  88.323      /* get pServerRandom and ulServerRandomLength out of RandomInfo */
  88.324      fieldID = (*env)->GetFieldID(env, jSsl3RandomDataClass, "pServerRandom", "[B");
  88.325 -    assert(fieldID != 0);
  88.326 -    jObject = (*env)->GetObjectField(env, jRandomInfo, fieldID);
  88.327 -    jByteArrayToCKByteArray(env, jObject, &(ckParam.RandomInfo.pServerRandom), &(ckParam.RandomInfo.ulServerRandomLen));
  88.328 +    if (fieldID == NULL) { return ckParam; }
  88.329 +    jRIServerRandom = (*env)->GetObjectField(env, jRandomInfo, fieldID);
  88.330  
  88.331      /* get pVersion */
  88.332      fieldID = (*env)->GetFieldID(env, jSsl3MasterKeyDeriveParamsClass, "pVersion",  "Lsun/security/pkcs11/wrapper/CK_VERSION;");
  88.333 -    assert(fieldID != 0);
  88.334 -    jObject = (*env)->GetObjectField(env, jParam, fieldID);
  88.335 -    ckParam.pVersion = jVersionToCKVersionPtr(env, jObject);
  88.336 +    if (fieldID == NULL) { return ckParam; }
  88.337 +    jVersion = (*env)->GetObjectField(env, jParam, fieldID);
  88.338 +
  88.339 +    /* populate java values */
  88.340 +    ckParam.pVersion = jVersionToCKVersionPtr(env, jVersion);
  88.341 +    if ((*env)->ExceptionCheck(env)) { return ckParam; }
  88.342 +    jByteArrayToCKByteArray(env, jRIClientRandom, &(ckParam.RandomInfo.pClientRandom), &(ckParam.RandomInfo.ulClientRandomLen));
  88.343 +    if ((*env)->ExceptionCheck(env)) {
  88.344 +        free(ckParam.pVersion);
  88.345 +        return ckParam;
  88.346 +    }
  88.347 +    jByteArrayToCKByteArray(env, jRIServerRandom, &(ckParam.RandomInfo.pServerRandom), &(ckParam.RandomInfo.ulServerRandomLen));
  88.348 +    if ((*env)->ExceptionCheck(env)) {
  88.349 +        free(ckParam.pVersion);
  88.350 +        free(ckParam.RandomInfo.pClientRandom);
  88.351 +        return ckParam;
  88.352 +    }
  88.353  
  88.354      return ckParam ;
  88.355  }
  88.356 @@ -457,27 +522,52 @@
  88.357   */
  88.358  CK_TLS_PRF_PARAMS jTlsPrfParamsToCKTlsPrfParam(JNIEnv *env, jobject jParam)
  88.359  {
  88.360 -    jclass jTlsPrfParamsClass = (*env)->FindClass(env, CLASS_TLS_PRF_PARAMS);
  88.361 +    jclass jTlsPrfParamsClass;
  88.362      CK_TLS_PRF_PARAMS ckParam;
  88.363      jfieldID fieldID;
  88.364 -    jobject jObject;
  88.365 +    jobject jSeed, jLabel, jOutput;
  88.366  
  88.367 +    // TBD: what if jParam == NULL?!
  88.368 +
  88.369 +    /* get pSeed */
  88.370 +    jTlsPrfParamsClass = (*env)->FindClass(env, CLASS_TLS_PRF_PARAMS);
  88.371 +    if (jTlsPrfParamsClass == NULL) { return ckParam; }
  88.372      fieldID = (*env)->GetFieldID(env, jTlsPrfParamsClass, "pSeed", "[B");
  88.373 -    assert(fieldID != 0);
  88.374 -    jObject = (*env)->GetObjectField(env, jParam, fieldID);
  88.375 -    jByteArrayToCKByteArray(env, jObject, &(ckParam.pSeed), &(ckParam.ulSeedLen));
  88.376 +    if (fieldID == NULL) { return ckParam; }
  88.377 +    jSeed = (*env)->GetObjectField(env, jParam, fieldID);
  88.378  
  88.379 +    /* get pLabel */
  88.380      fieldID = (*env)->GetFieldID(env, jTlsPrfParamsClass, "pLabel", "[B");
  88.381 -    assert(fieldID != 0);
  88.382 -    jObject = (*env)->GetObjectField(env, jParam, fieldID);
  88.383 -    jByteArrayToCKByteArray(env, jObject, &(ckParam.pLabel), &(ckParam.ulLabelLen));
  88.384 +    if (fieldID == NULL) { return ckParam; }
  88.385 +    jLabel = (*env)->GetObjectField(env, jParam, fieldID);
  88.386  
  88.387 +    /* get pOutput */
  88.388 +    fieldID = (*env)->GetFieldID(env, jTlsPrfParamsClass, "pOutput", "[B");
  88.389 +    if (fieldID == NULL) { return ckParam; }
  88.390 +    jOutput = (*env)->GetObjectField(env, jParam, fieldID);
  88.391 +
  88.392 +    /* populate java values */
  88.393 +    jByteArrayToCKByteArray(env, jSeed, &(ckParam.pSeed), &(ckParam.ulSeedLen));
  88.394 +    if ((*env)->ExceptionCheck(env)) { return ckParam; }
  88.395 +    jByteArrayToCKByteArray(env, jLabel, &(ckParam.pLabel), &(ckParam.ulLabelLen));
  88.396 +    if ((*env)->ExceptionCheck(env)) {
  88.397 +        free(ckParam.pSeed);
  88.398 +        return ckParam;
  88.399 +    }
  88.400      ckParam.pulOutputLen = malloc(sizeof(CK_ULONG));
  88.401 -
  88.402 -    fieldID = (*env)->GetFieldID(env, jTlsPrfParamsClass, "pOutput", "[B");
  88.403 -    assert(fieldID != 0);
  88.404 -    jObject = (*env)->GetObjectField(env, jParam, fieldID);
  88.405 -    jByteArrayToCKByteArray(env, jObject, &(ckParam.pOutput), ckParam.pulOutputLen);
  88.406 +    if (ckParam.pulOutputLen == NULL) {
  88.407 +        free(ckParam.pSeed);
  88.408 +        free(ckParam.pLabel);
  88.409 +        JNU_ThrowOutOfMemoryError(env, 0);
  88.410 +        return ckParam;
  88.411 +    }
  88.412 +    jByteArrayToCKByteArray(env, jOutput, &(ckParam.pOutput), ckParam.pulOutputLen);
  88.413 +    if ((*env)->ExceptionCheck(env)) {
  88.414 +        free(ckParam.pSeed);
  88.415 +        free(ckParam.pLabel);
  88.416 +        free(ckParam.pulOutputLen);
  88.417 +        return ckParam;
  88.418 +    }
  88.419  
  88.420      return ckParam ;
  88.421  }
  88.422 @@ -493,68 +583,91 @@
  88.423  {
  88.424      // XXX don't return structs
  88.425      // XXX prefetch class and field ids
  88.426 -    jclass jSsl3KeyMatParamsClass = (*env)->FindClass(env, CLASS_SSL3_KEY_MAT_PARAMS);
  88.427 +    jclass jSsl3KeyMatParamsClass, jSsl3RandomDataClass, jSsl3KeyMatOutClass;
  88.428      CK_SSL3_KEY_MAT_PARAMS ckParam;
  88.429      jfieldID fieldID;
  88.430 -    jlong jLong;
  88.431 -    jboolean jBoolean;
  88.432 -    jobject jObject;
  88.433 -    jobject jRandomInfo;
  88.434 -    jobject jReturnedKeyMaterial;
  88.435 -    jclass jSsl3RandomDataClass;
  88.436 -    jclass jSsl3KeyMatOutClass;
  88.437 +    jlong jMacSizeInBits, jKeySizeInBits, jIVSizeInBits;
  88.438 +    jboolean jIsExport;
  88.439 +    jobject jRandomInfo, jRIClientRandom, jRIServerRandom;
  88.440 +    jobject jReturnedKeyMaterial, jRMIvClient, jRMIvServer;
  88.441      CK_ULONG ckTemp;
  88.442  
  88.443      /* get ulMacSizeInBits */
  88.444 +    jSsl3KeyMatParamsClass = (*env)->FindClass(env, CLASS_SSL3_KEY_MAT_PARAMS);
  88.445 +    if (jSsl3KeyMatParamsClass == NULL) { return ckParam; }
  88.446      fieldID = (*env)->GetFieldID(env, jSsl3KeyMatParamsClass, "ulMacSizeInBits", "J");
  88.447 -    assert(fieldID != 0);
  88.448 -    jLong = (*env)->GetLongField(env, jParam, fieldID);
  88.449 -    ckParam.ulMacSizeInBits = jLongToCKULong(jLong);
  88.450 +    if (fieldID == NULL) { return ckParam; }
  88.451 +    jMacSizeInBits = (*env)->GetLongField(env, jParam, fieldID);
  88.452  
  88.453      /* get ulKeySizeInBits */
  88.454      fieldID = (*env)->GetFieldID(env, jSsl3KeyMatParamsClass, "ulKeySizeInBits", "J");
  88.455 -    assert(fieldID != 0);
  88.456 -    jLong = (*env)->GetLongField(env, jParam, fieldID);
  88.457 -    ckParam.ulKeySizeInBits = jLongToCKULong(jLong);
  88.458 +    if (fieldID == NULL) { return ckParam; }
  88.459 +    jKeySizeInBits = (*env)->GetLongField(env, jParam, fieldID);
  88.460  
  88.461      /* get ulIVSizeInBits */
  88.462      fieldID = (*env)->GetFieldID(env, jSsl3KeyMatParamsClass, "ulIVSizeInBits", "J");
  88.463 -    assert(fieldID != 0);
  88.464 -    jLong = (*env)->GetLongField(env, jParam, fieldID);
  88.465 -    ckParam.ulIVSizeInBits = jLongToCKULong(jLong);
  88.466 +    if (fieldID == NULL) { return ckParam; }
  88.467 +    jIVSizeInBits = (*env)->GetLongField(env, jParam, fieldID);
  88.468  
  88.469      /* get bIsExport */
  88.470      fieldID = (*env)->GetFieldID(env, jSsl3KeyMatParamsClass, "bIsExport", "Z");
  88.471 -    assert(fieldID != 0);
  88.472 -    jBoolean = (*env)->GetBooleanField(env, jParam, fieldID);
  88.473 -    ckParam.bIsExport = jBooleanToCKBBool(jBoolean);
  88.474 +    if (fieldID == NULL) { return ckParam; }
  88.475 +    jIsExport = (*env)->GetBooleanField(env, jParam, fieldID);
  88.476  
  88.477      /* get RandomInfo */
  88.478      jSsl3RandomDataClass = (*env)->FindClass(env, CLASS_SSL3_RANDOM_DATA);
  88.479 +    if (jSsl3RandomDataClass == NULL) { return ckParam; }
  88.480      fieldID = (*env)->GetFieldID(env, jSsl3KeyMatParamsClass, "RandomInfo",  "Lsun/security/pkcs11/wrapper/CK_SSL3_RANDOM_DATA;");
  88.481 -    assert(fieldID != 0);
  88.482 +    if (fieldID == NULL) { return ckParam; }
  88.483      jRandomInfo = (*env)->GetObjectField(env, jParam, fieldID);
  88.484  
  88.485      /* get pClientRandom and ulClientRandomLength out of RandomInfo */
  88.486      fieldID = (*env)->GetFieldID(env, jSsl3RandomDataClass, "pClientRandom", "[B");
  88.487 -    assert(fieldID != 0);
  88.488 -    jObject = (*env)->GetObjectField(env, jRandomInfo, fieldID);
  88.489 -    jByteArrayToCKByteArray(env, jObject, &(ckParam.RandomInfo.pClientRandom), &(ckParam.RandomInfo.ulClientRandomLen));
  88.490 +    if (fieldID == NULL) { return ckParam; }
  88.491 +    jRIClientRandom = (*env)->GetObjectField(env, jRandomInfo, fieldID);
  88.492  
  88.493      /* get pServerRandom and ulServerRandomLength out of RandomInfo */
  88.494      fieldID = (*env)->GetFieldID(env, jSsl3RandomDataClass, "pServerRandom", "[B");
  88.495 -    assert(fieldID != 0);
  88.496 -    jObject = (*env)->GetObjectField(env, jRandomInfo, fieldID);
  88.497 -    jByteArrayToCKByteArray(env, jObject, &(ckParam.RandomInfo.pServerRandom), &(ckParam.RandomInfo.ulServerRandomLen));
  88.498 +    if (fieldID == NULL) { return ckParam; }
  88.499 +    jRIServerRandom = (*env)->GetObjectField(env, jRandomInfo, fieldID);
  88.500  
  88.501      /* get pReturnedKeyMaterial */
  88.502      jSsl3KeyMatOutClass = (*env)->FindClass(env, CLASS_SSL3_KEY_MAT_OUT);
  88.503 +    if (jSsl3KeyMatOutClass == NULL) { return ckParam; }
  88.504      fieldID = (*env)->GetFieldID(env, jSsl3KeyMatParamsClass, "pReturnedKeyMaterial",  "Lsun/security/pkcs11/wrapper/CK_SSL3_KEY_MAT_OUT;");
  88.505 -    assert(fieldID != 0);
  88.506 +    if (fieldID == NULL) { return ckParam; }
  88.507      jReturnedKeyMaterial = (*env)->GetObjectField(env, jParam, fieldID);
  88.508  
  88.509 +    /* get pIVClient out of pReturnedKeyMaterial */
  88.510 +    fieldID = (*env)->GetFieldID(env, jSsl3KeyMatOutClass, "pIVClient", "[B");
  88.511 +    if (fieldID == NULL) { return ckParam; }
  88.512 +    jRMIvClient = (*env)->GetObjectField(env, jReturnedKeyMaterial, fieldID);
  88.513 +
  88.514 +    /* get pIVServer out of pReturnedKeyMaterial */
  88.515 +    fieldID = (*env)->GetFieldID(env, jSsl3KeyMatOutClass, "pIVServer", "[B");
  88.516 +    if (fieldID == NULL) { return ckParam; }
  88.517 +    jRMIvServer = (*env)->GetObjectField(env, jReturnedKeyMaterial, fieldID);
  88.518 +
  88.519 +    /* populate java values */
  88.520 +    ckParam.ulMacSizeInBits = jLongToCKULong(jMacSizeInBits);
  88.521 +    ckParam.ulKeySizeInBits = jLongToCKULong(jKeySizeInBits);
  88.522 +    ckParam.ulIVSizeInBits = jLongToCKULong(jIVSizeInBits);
  88.523 +    ckParam.bIsExport = jBooleanToCKBBool(jIsExport);
  88.524 +    jByteArrayToCKByteArray(env, jRIClientRandom, &(ckParam.RandomInfo.pClientRandom), &(ckParam.RandomInfo.ulClientRandomLen));
  88.525 +    if ((*env)->ExceptionCheck(env)) { return ckParam; }
  88.526 +    jByteArrayToCKByteArray(env, jRIServerRandom, &(ckParam.RandomInfo.pServerRandom), &(ckParam.RandomInfo.ulServerRandomLen));
  88.527 +    if ((*env)->ExceptionCheck(env)) {
  88.528 +        free(ckParam.RandomInfo.pClientRandom);
  88.529 +        return ckParam;
  88.530 +    }
  88.531      /* allocate memory for pRetrunedKeyMaterial */
  88.532      ckParam.pReturnedKeyMaterial = (CK_SSL3_KEY_MAT_OUT_PTR) malloc(sizeof(CK_SSL3_KEY_MAT_OUT));
  88.533 +    if (ckParam.pReturnedKeyMaterial == NULL) {
  88.534 +        free(ckParam.RandomInfo.pClientRandom);
  88.535 +        free(ckParam.RandomInfo.pServerRandom);
  88.536 +        JNU_ThrowOutOfMemoryError(env, 0);
  88.537 +        return ckParam;
  88.538 +    }
  88.539  
  88.540      // the handles are output params only, no need to fetch them from Java
  88.541      ckParam.pReturnedKeyMaterial->hClientMacSecret = 0;
  88.542 @@ -562,17 +675,21 @@
  88.543      ckParam.pReturnedKeyMaterial->hClientKey = 0;
  88.544      ckParam.pReturnedKeyMaterial->hServerKey = 0;
  88.545  
  88.546 -    /* get pIVClient out of pReturnedKeyMaterial */
  88.547 -    fieldID = (*env)->GetFieldID(env, jSsl3KeyMatOutClass, "pIVClient", "[B");
  88.548 -    assert(fieldID != 0);
  88.549 -    jObject = (*env)->GetObjectField(env, jReturnedKeyMaterial, fieldID);
  88.550 -    jByteArrayToCKByteArray(env, jObject, &(ckParam.pReturnedKeyMaterial->pIVClient), &ckTemp);
  88.551 -
  88.552 -    /* get pIVServer out of pReturnedKeyMaterial */
  88.553 -    fieldID = (*env)->GetFieldID(env, jSsl3KeyMatOutClass, "pIVServer", "[B");
  88.554 -    assert(fieldID != 0);
  88.555 -    jObject = (*env)->GetObjectField(env, jReturnedKeyMaterial, fieldID);
  88.556 -    jByteArrayToCKByteArray(env, jObject, &(ckParam.pReturnedKeyMaterial->pIVServer), &ckTemp);
  88.557 +    jByteArrayToCKByteArray(env, jRMIvClient, &(ckParam.pReturnedKeyMaterial->pIVClient), &ckTemp);
  88.558 +    if ((*env)->ExceptionCheck(env)) {
  88.559 +        free(ckParam.RandomInfo.pClientRandom);
  88.560 +        free(ckParam.RandomInfo.pServerRandom);
  88.561 +        free(ckParam.pReturnedKeyMaterial);
  88.562 +        return ckParam;
  88.563 +    }
  88.564 +    jByteArrayToCKByteArray(env, jRMIvServer, &(ckParam.pReturnedKeyMaterial->pIVServer), &ckTemp);
  88.565 +    if ((*env)->ExceptionCheck(env)) {
  88.566 +        free(ckParam.RandomInfo.pClientRandom);
  88.567 +        free(ckParam.RandomInfo.pServerRandom);
  88.568 +        free(ckParam.pReturnedKeyMaterial);
  88.569 +        free(ckParam.pReturnedKeyMaterial->pIVClient);
  88.570 +        return ckParam;
  88.571 +    }
  88.572  
  88.573      return ckParam ;
  88.574  }
  88.575 @@ -811,7 +928,7 @@
  88.576          *ckpParamPtr = jLongObjectToCKULongPtr(env, jParam);
  88.577          *ckpLength = sizeof(CK_ULONG);
  88.578      } else {
  88.579 -        /* printf("slow path jMechanismParameterToCKMechanismParameter\n"); */
  88.580 +        TRACE0("\nSLOW PATH jMechanismParameterToCKMechanismParameter\n");
  88.581          jMechanismParameterToCKMechanismParameterSlow(env, jParam, ckpParamPtr, ckpLength);
  88.582      }
  88.583  }
  88.584 @@ -819,40 +936,24 @@
  88.585  void jMechanismParameterToCKMechanismParameterSlow(JNIEnv *env, jobject jParam, CK_VOID_PTR *ckpParamPtr, CK_ULONG *ckpLength)
  88.586  {
  88.587      /* get all Java mechanism parameter classes */
  88.588 -    jclass jVersionClass    = (*env)->FindClass(env, CLASS_VERSION);
  88.589 -    jclass jRsaPkcsOaepParamsClass = (*env)->FindClass(env, CLASS_RSA_PKCS_OAEP_PARAMS);
  88.590 -    jclass jPbeParamsClass = (*env)->FindClass(env, CLASS_PBE_PARAMS);
  88.591 -    jclass jPkcs5Pbkd2ParamsClass = (*env)->FindClass(env, CLASS_PKCS5_PBKD2_PARAMS);
  88.592 +    jclass jVersionClass, jSsl3MasterKeyDeriveParamsClass, jSsl3KeyMatParamsClass;
  88.593 +    jclass jTlsPrfParamsClass, jRsaPkcsOaepParamsClass, jPbeParamsClass;
  88.594 +    jclass jPkcs5Pbkd2ParamsClass, jRsaPkcsPssParamsClass;
  88.595 +    jclass jEcdh1DeriveParamsClass, jEcdh2DeriveParamsClass;
  88.596 +    jclass jX942Dh1DeriveParamsClass, jX942Dh2DeriveParamsClass;
  88.597  
  88.598 -    jclass jRsaPkcsPssParamsClass = (*env)->FindClass(env, CLASS_RSA_PKCS_PSS_PARAMS);
  88.599 -    jclass jEcdh1DeriveParamsClass = (*env)->FindClass(env, CLASS_ECDH1_DERIVE_PARAMS);
  88.600 -    jclass jEcdh2DeriveParamsClass = (*env)->FindClass(env, CLASS_ECDH2_DERIVE_PARAMS);
  88.601 -    jclass jX942Dh1DeriveParamsClass = (*env)->FindClass(env, CLASS_X9_42_DH1_DERIVE_PARAMS);
  88.602 -    jclass jX942Dh2DeriveParamsClass = (*env)->FindClass(env, CLASS_X9_42_DH2_DERIVE_PARAMS);
  88.603 -
  88.604 -    jclass jSsl3MasterKeyDeriveParamsClass = (*env)->FindClass(env, CLASS_SSL3_MASTER_KEY_DERIVE_PARAMS);
  88.605 -    jclass jSsl3KeyMatParamsClass = (*env)->FindClass(env, CLASS_SSL3_KEY_MAT_PARAMS);
  88.606 -    jclass jTlsPrfParamsClass = (*env)->FindClass(env, CLASS_TLS_PRF_PARAMS);
  88.607 -
  88.608 +    /* get all Java mechanism parameter classes */
  88.609      TRACE0("\nDEBUG: jMechanismParameterToCKMechanismParameter");
  88.610  
  88.611 -    /* first check the most common cases */
  88.612 -/*
  88.613 -    if (jParam == NULL) {
  88.614 -        *ckpParamPtr = NULL;
  88.615 -        *ckpLength = 0;
  88.616 -    } else if ((*env)->IsInstanceOf(env, jParam, jByteArrayClass)) {
  88.617 -        jByteArrayToCKByteArray(env, jParam, (CK_BYTE_PTR *)ckpParamPtr, ckpLength);
  88.618 -    } else if ((*env)->IsInstanceOf(env, jParam, jLongClass)) {
  88.619 -        *ckpParamPtr = jLongObjectToCKULongPtr(env, jParam);
  88.620 -        *ckpLength = sizeof(CK_ULONG);
  88.621 -    } else if ((*env)->IsInstanceOf(env, jParam, jVersionClass)) {
  88.622 -*/
  88.623 +    /* most common cases, i.e. NULL/byte[]/long, are already handled by
  88.624 +     * jMechanismParameterToCKMechanismParameter before calling this method.
  88.625 +     */
  88.626 +    jVersionClass = (*env)->FindClass(env, CLASS_VERSION);
  88.627 +    if (jVersionClass == NULL) { return; }
  88.628      if ((*env)->IsInstanceOf(env, jParam, jVersionClass)) {
  88.629          /*
  88.630           * CK_VERSION used by CKM_SSL3_PRE_MASTER_KEY_GEN
  88.631           */
  88.632 -
  88.633          CK_VERSION_PTR ckpParam;
  88.634  
  88.635          /* convert jParameter to CKParameter */
  88.636 @@ -861,190 +962,311 @@
  88.637          /* get length and pointer of parameter */
  88.638          *ckpLength = sizeof(CK_VERSION);
  88.639          *ckpParamPtr = ckpParam;
  88.640 +        return;
  88.641 +    }
  88.642  
  88.643 -    } else if ((*env)->IsInstanceOf(env, jParam, jSsl3MasterKeyDeriveParamsClass)) {
  88.644 +    jSsl3MasterKeyDeriveParamsClass = (*env)->FindClass(env, CLASS_SSL3_MASTER_KEY_DERIVE_PARAMS);
  88.645 +    if (jSsl3MasterKeyDeriveParamsClass == NULL) { return; }
  88.646 +    if ((*env)->IsInstanceOf(env, jParam, jSsl3MasterKeyDeriveParamsClass)) {
  88.647          /*
  88.648           * CK_SSL3_MASTER_KEY_DERIVE_PARAMS
  88.649           */
  88.650 -
  88.651          CK_SSL3_MASTER_KEY_DERIVE_PARAMS_PTR ckpParam;
  88.652  
  88.653          ckpParam = (CK_SSL3_MASTER_KEY_DERIVE_PARAMS_PTR) malloc(sizeof(CK_SSL3_MASTER_KEY_DERIVE_PARAMS));
  88.654 +        if (ckpParam == NULL) {
  88.655 +            JNU_ThrowOutOfMemoryError(env, 0);
  88.656 +            return;
  88.657 +        }
  88.658  
  88.659          /* convert jParameter to CKParameter */
  88.660          *ckpParam = jSsl3MasterKeyDeriveParamToCKSsl3MasterKeyDeriveParam(env, jParam);
  88.661 +        if ((*env)->ExceptionCheck(env)) {
  88.662 +            free(ckpParam);
  88.663 +            return;
  88.664 +        }
  88.665  
  88.666          /* get length and pointer of parameter */
  88.667          *ckpLength = sizeof(CK_SSL3_MASTER_KEY_DERIVE_PARAMS);
  88.668          *ckpParamPtr = ckpParam;
  88.669 +        return;
  88.670 +    }
  88.671  
  88.672 -    } else if ((*env)->IsInstanceOf(env, jParam, jSsl3KeyMatParamsClass)) {
  88.673 +    jSsl3KeyMatParamsClass = (*env)->FindClass(env, CLASS_SSL3_KEY_MAT_PARAMS);
  88.674 +    if (jSsl3KeyMatParamsClass == NULL) { return; }
  88.675 +    if ((*env)->IsInstanceOf(env, jParam, jSsl3KeyMatParamsClass)) {
  88.676          /*
  88.677           * CK_SSL3_KEY_MAT_PARAMS
  88.678           */
  88.679 -
  88.680          CK_SSL3_KEY_MAT_PARAMS_PTR ckpParam;
  88.681  
  88.682          ckpParam = (CK_SSL3_KEY_MAT_PARAMS_PTR) malloc(sizeof(CK_SSL3_KEY_MAT_PARAMS));
  88.683 +        if (ckpParam == NULL) {
  88.684 +            JNU_ThrowOutOfMemoryError(env, 0);
  88.685 +            return;
  88.686 +        }
  88.687  
  88.688          /* convert jParameter to CKParameter */
  88.689          *ckpParam = jSsl3KeyMatParamToCKSsl3KeyMatParam(env, jParam);
  88.690 +        if ((*env)->ExceptionCheck(env)) {
  88.691 +            free(ckpParam);
  88.692 +            return;
  88.693 +        }
  88.694  
  88.695          /* get length and pointer of parameter */
  88.696          *ckpLength = sizeof(CK_SSL3_KEY_MAT_PARAMS);
  88.697          *ckpParamPtr = ckpParam;
  88.698 +        return;
  88.699 +    }
  88.700  
  88.701 -    } else if ((*env)->IsInstanceOf(env, jParam, jTlsPrfParamsClass)) {
  88.702 -        //
  88.703 -        // CK_TLS_PRF_PARAMS
  88.704 -        //
  88.705 -
  88.706 +    jTlsPrfParamsClass = (*env)->FindClass(env, CLASS_TLS_PRF_PARAMS);
  88.707 +    if (jTlsPrfParamsClass == NULL) { return; }
  88.708 +    if ((*env)->IsInstanceOf(env, jParam, jTlsPrfParamsClass)) {
  88.709 +        /*
  88.710 +         * CK_TLS_PRF_PARAMS
  88.711 +         */
  88.712          CK_TLS_PRF_PARAMS_PTR ckpParam;
  88.713  
  88.714          ckpParam = (CK_TLS_PRF_PARAMS_PTR) malloc(sizeof(CK_TLS_PRF_PARAMS));
  88.715 +        if (ckpParam == NULL) {
  88.716 +            JNU_ThrowOutOfMemoryError(env, 0);
  88.717 +            return;
  88.718 +        }
  88.719  
  88.720 -        // convert jParameter to CKParameter
  88.721 +        /* convert jParameter to CKParameter */
  88.722          *ckpParam = jTlsPrfParamsToCKTlsPrfParam(env, jParam);
  88.723 +        if ((*env)->ExceptionCheck(env)) {
  88.724 +            free(ckpParam);
  88.725 +            return;
  88.726 +        }
  88.727  
  88.728 -        // get length and pointer of parameter
  88.729 +        /* get length and pointer of parameter */
  88.730          *ckpLength = sizeof(CK_TLS_PRF_PARAMS);
  88.731          *ckpParamPtr = ckpParam;
  88.732 +        return;
  88.733 +    }
  88.734  
  88.735 -    } else if ((*env)->IsInstanceOf(env, jParam, jRsaPkcsOaepParamsClass)) {
  88.736 +    jRsaPkcsOaepParamsClass = (*env)->FindClass(env, CLASS_RSA_PKCS_OAEP_PARAMS);
  88.737 +    if (jRsaPkcsOaepParamsClass == NULL) { return; }
  88.738 +    if ((*env)->IsInstanceOf(env, jParam, jRsaPkcsOaepParamsClass)) {
  88.739          /*
  88.740           * CK_RSA_PKCS_OAEP_PARAMS
  88.741           */
  88.742 -
  88.743          CK_RSA_PKCS_OAEP_PARAMS_PTR ckpParam;
  88.744  
  88.745          ckpParam = (CK_RSA_PKCS_OAEP_PARAMS_PTR) malloc(sizeof(CK_RSA_PKCS_OAEP_PARAMS));
  88.746 +        if (ckpParam == NULL) {
  88.747 +            JNU_ThrowOutOfMemoryError(env, 0);
  88.748 +            return;
  88.749 +        }
  88.750  
  88.751          /* convert jParameter to CKParameter */
  88.752          *ckpParam = jRsaPkcsOaepParamToCKRsaPkcsOaepParam(env, jParam);
  88.753 +        if ((*env)->ExceptionCheck(env)) {
  88.754 +            free(ckpParam);
  88.755 +            return;
  88.756 +        }
  88.757  
  88.758          /* get length and pointer of parameter */
  88.759          *ckpLength = sizeof(CK_RSA_PKCS_OAEP_PARAMS);
  88.760          *ckpParamPtr = ckpParam;
  88.761 +        return;
  88.762 +    }
  88.763  
  88.764 -    } else if ((*env)->IsInstanceOf(env, jParam, jPbeParamsClass)) {
  88.765 +    jPbeParamsClass = (*env)->FindClass(env, CLASS_PBE_PARAMS);
  88.766 +    if (jPbeParamsClass == NULL) { return; }
  88.767 +    if ((*env)->IsInstanceOf(env, jParam, jPbeParamsClass)) {
  88.768          /*
  88.769           * CK_PBE_PARAMS
  88.770           */
  88.771 -
  88.772          CK_PBE_PARAMS_PTR ckpParam;
  88.773  
  88.774          ckpParam = (CK_PBE_PARAMS_PTR) malloc(sizeof(CK_PBE_PARAMS));
  88.775 +        if (ckpParam == NULL) {
  88.776 +            JNU_ThrowOutOfMemoryError(env, 0);
  88.777 +            return;
  88.778 +        }
  88.779  
  88.780          /* convert jParameter to CKParameter */
  88.781          *ckpParam = jPbeParamToCKPbeParam(env, jParam);
  88.782 +        if ((*env)->ExceptionCheck(env)) {
  88.783 +            free(ckpParam);
  88.784 +            return;
  88.785 +        }
  88.786  
  88.787          /* get length and pointer of parameter */
  88.788          *ckpLength = sizeof(CK_PBE_PARAMS);
  88.789          *ckpParamPtr = ckpParam;
  88.790 +        return;
  88.791 +    }
  88.792  
  88.793 -    } else if ((*env)->IsInstanceOf(env, jParam, jPkcs5Pbkd2ParamsClass)) {
  88.794 +    jPkcs5Pbkd2ParamsClass = (*env)->FindClass(env, CLASS_PKCS5_PBKD2_PARAMS);
  88.795 +    if (jPkcs5Pbkd2ParamsClass == NULL) { return; }
  88.796 +    if ((*env)->IsInstanceOf(env, jParam, jPkcs5Pbkd2ParamsClass)) {
  88.797          /*
  88.798           * CK_PKCS5_PBKD2_PARAMS
  88.799           */
  88.800 -
  88.801          CK_PKCS5_PBKD2_PARAMS_PTR ckpParam;
  88.802  
  88.803          ckpParam = (CK_PKCS5_PBKD2_PARAMS_PTR) malloc(sizeof(CK_PKCS5_PBKD2_PARAMS));
  88.804 +        if (ckpParam == NULL) {
  88.805 +            JNU_ThrowOutOfMemoryError(env, 0);
  88.806 +            return;
  88.807 +        }
  88.808  
  88.809          /* convert jParameter to CKParameter */
  88.810          *ckpParam = jPkcs5Pbkd2ParamToCKPkcs5Pbkd2Param(env, jParam);
  88.811 +        if ((*env)->ExceptionCheck(env)) {
  88.812 +            free(ckpParam);
  88.813 +            return;
  88.814 +        }
  88.815  
  88.816          /* get length and pointer of parameter */
  88.817          *ckpLength = sizeof(CK_PKCS5_PBKD2_PARAMS);
  88.818          *ckpParamPtr = ckpParam;
  88.819 +        return;
  88.820 +    }
  88.821  
  88.822 -    } else if ((*env)->IsInstanceOf(env, jParam, jRsaPkcsPssParamsClass)) {
  88.823 +    jRsaPkcsPssParamsClass = (*env)->FindClass(env, CLASS_RSA_PKCS_PSS_PARAMS);
  88.824 +    if (jRsaPkcsPssParamsClass == NULL) { return; }
  88.825 +    if ((*env)->IsInstanceOf(env, jParam, jRsaPkcsPssParamsClass)) {
  88.826          /*
  88.827           * CK_RSA_PKCS_PSS_PARAMS
  88.828           */
  88.829 -
  88.830          CK_RSA_PKCS_PSS_PARAMS_PTR ckpParam;
  88.831  
  88.832          ckpParam = (CK_RSA_PKCS_PSS_PARAMS_PTR) malloc(sizeof(CK_RSA_PKCS_PSS_PARAMS));
  88.833 +        if (ckpParam == NULL) {
  88.834 +            JNU_ThrowOutOfMemoryError(env, 0);
  88.835 +            return;
  88.836 +        }
  88.837  
  88.838          /* convert jParameter to CKParameter */
  88.839          *ckpParam = jRsaPkcsPssParamToCKRsaPkcsPssParam(env, jParam);
  88.840 +        if ((*env)->ExceptionCheck(env)) {
  88.841 +            free(ckpParam);
  88.842 +            return;
  88.843 +        }
  88.844  
  88.845          /* get length and pointer of parameter */
  88.846          *ckpLength = sizeof(CK_RSA_PKCS_PSS_PARAMS);
  88.847          *ckpParamPtr = ckpParam;
  88.848 +        return;
  88.849 +    }
  88.850  
  88.851 -    } else if ((*env)->IsInstanceOf(env, jParam, jEcdh1DeriveParamsClass)) {
  88.852 +    jEcdh1DeriveParamsClass = (*env)->FindClass(env, CLASS_ECDH1_DERIVE_PARAMS);
  88.853 +    if (jEcdh1DeriveParamsClass == NULL) { return; }
  88.854 +    if ((*env)->IsInstanceOf(env, jParam, jEcdh1DeriveParamsClass)) {
  88.855          /*
  88.856           * CK_ECDH1_DERIVE_PARAMS
  88.857           */
  88.858 -
  88.859          CK_ECDH1_DERIVE_PARAMS_PTR ckpParam;
  88.860  
  88.861          ckpParam = (CK_ECDH1_DERIVE_PARAMS_PTR) malloc(sizeof(CK_ECDH1_DERIVE_PARAMS));
  88.862 +        if (ckpParam == NULL) {
  88.863 +            JNU_ThrowOutOfMemoryError(env, 0);
  88.864 +            return;
  88.865 +        }
  88.866  
  88.867          /* convert jParameter to CKParameter */
  88.868          *ckpParam = jEcdh1DeriveParamToCKEcdh1DeriveParam(env, jParam);
  88.869 +        if ((*env)->ExceptionCheck(env)) {
  88.870 +            free(ckpParam);
  88.871 +            return;
  88.872 +        }
  88.873  
  88.874          /* get length and pointer of parameter */
  88.875          *ckpLength = sizeof(CK_ECDH1_DERIVE_PARAMS);
  88.876          *ckpParamPtr = ckpParam;
  88.877 +        return;
  88.878 +    }
  88.879  
  88.880 -    } else if ((*env)->IsInstanceOf(env, jParam, jEcdh2DeriveParamsClass)) {
  88.881 +    jEcdh2DeriveParamsClass = (*env)->FindClass(env, CLASS_ECDH2_DERIVE_PARAMS);
  88.882 +    if (jEcdh2DeriveParamsClass == NULL) { return; }
  88.883 +    if ((*env)->IsInstanceOf(env, jParam, jEcdh2DeriveParamsClass)) {
  88.884          /*
  88.885           * CK_ECDH2_DERIVE_PARAMS
  88.886           */
  88.887 -
  88.888          CK_ECDH2_DERIVE_PARAMS_PTR ckpParam;
  88.889  
  88.890          ckpParam = (CK_ECDH2_DERIVE_PARAMS_PTR) malloc(sizeof(CK_ECDH2_DERIVE_PARAMS));
  88.891 +        if (ckpParam == NULL) {
  88.892 +            JNU_ThrowOutOfMemoryError(env, 0);
  88.893 +            return;
  88.894 +        }
  88.895  
  88.896          /* convert jParameter to CKParameter */
  88.897          *ckpParam = jEcdh2DeriveParamToCKEcdh2DeriveParam(env, jParam);
  88.898 +        if ((*env)->ExceptionCheck(env)) {
  88.899 +            free(ckpParam);
  88.900 +            return;
  88.901 +        }
  88.902  
  88.903          /* get length and pointer of parameter */
  88.904          *ckpLength = sizeof(CK_ECDH2_DERIVE_PARAMS);
  88.905          *ckpParamPtr = ckpParam;
  88.906 +        return;
  88.907 +    }
  88.908  
  88.909 -    } else if ((*env)->IsInstanceOf(env, jParam, jX942Dh1DeriveParamsClass)) {
  88.910 +    jX942Dh1DeriveParamsClass = (*env)->FindClass(env, CLASS_X9_42_DH1_DERIVE_PARAMS);
  88.911 +    if (jX942Dh1DeriveParamsClass == NULL) { return; }
  88.912 +    if ((*env)->IsInstanceOf(env, jParam, jX942Dh1DeriveParamsClass)) {
  88.913          /*
  88.914           * CK_X9_42_DH1_DERIVE_PARAMS
  88.915           */
  88.916 -
  88.917          CK_X9_42_DH1_DERIVE_PARAMS_PTR ckpParam;
  88.918  
  88.919          ckpParam = (CK_X9_42_DH1_DERIVE_PARAMS_PTR) malloc(sizeof(CK_X9_42_DH1_DERIVE_PARAMS));
  88.920 +        if (ckpParam == NULL) {
  88.921 +            JNU_ThrowOutOfMemoryError(env, 0);
  88.922 +            return;
  88.923 +        }
  88.924  
  88.925          /* convert jParameter to CKParameter */
  88.926          *ckpParam = jX942Dh1DeriveParamToCKX942Dh1DeriveParam(env, jParam);
  88.927 +        if ((*env)->ExceptionCheck(env)) {
  88.928 +            free(ckpParam);
  88.929 +            return;
  88.930 +        }
  88.931  
  88.932          /* get length and pointer of parameter */
  88.933          *ckpLength = sizeof(CK_X9_42_DH1_DERIVE_PARAMS);
  88.934          *ckpParamPtr = ckpParam;
  88.935 +        return;
  88.936 +    }
  88.937  
  88.938 -    } else if ((*env)->IsInstanceOf(env, jParam, jX942Dh2DeriveParamsClass)) {
  88.939 +    jX942Dh2DeriveParamsClass = (*env)->FindClass(env, CLASS_X9_42_DH2_DERIVE_PARAMS);
  88.940 +    if (jX942Dh2DeriveParamsClass == NULL) { return; }
  88.941 +    if ((*env)->IsInstanceOf(env, jParam, jX942Dh2DeriveParamsClass)) {
  88.942          /*
  88.943           * CK_X9_42_DH2_DERIVE_PARAMS
  88.944           */
  88.945 -
  88.946          CK_X9_42_DH2_DERIVE_PARAMS_PTR ckpParam;
  88.947  
  88.948          ckpParam = (CK_X9_42_DH2_DERIVE_PARAMS_PTR) malloc(sizeof(CK_X9_42_DH2_DERIVE_PARAMS));
  88.949 +        if (ckpParam == NULL) {
  88.950 +            JNU_ThrowOutOfMemoryError(env, 0);
  88.951 +            return;
  88.952 +        }
  88.953  
  88.954          /* convert jParameter to CKParameter */
  88.955          *ckpParam = jX942Dh2DeriveParamToCKX942Dh2DeriveParam(env, jParam);
  88.956 +        if ((*env)->ExceptionCheck(env)) {
  88.957 +            free(ckpParam);
  88.958 +            return;
  88.959 +        }
  88.960  
  88.961          /* get length and pointer of parameter */
  88.962          *ckpLength = sizeof(CK_X9_42_DH2_DERIVE_PARAMS);
  88.963          *ckpParamPtr = ckpParam;
  88.964 +        return;
  88.965 +    }
  88.966  
  88.967 -    } else {
  88.968 -        /* if everything faild up to here */
  88.969 -        /* try if the parameter is a primitive Java type */
  88.970 -        jObjectToPrimitiveCKObjectPtrPtr(env, jParam, ckpParamPtr, ckpLength);
  88.971 -        /* *ckpParamPtr = jObjectToCKVoidPtr(jParam); */
  88.972 -        /* *ckpLength = 1; */
  88.973 -    }
  88.974 +    /* if everything faild up to here */
  88.975 +    /* try if the parameter is a primitive Java type */
  88.976 +    jObjectToPrimitiveCKObjectPtrPtr(env, jParam, ckpParamPtr, ckpLength);
  88.977 +    /* *ckpParamPtr = jObjectToCKVoidPtr(jParam); */
  88.978 +    /* *ckpLength = 1; */
  88.979  
  88.980      TRACE0("FINISHED\n");
  88.981  }
  88.982 @@ -1061,36 +1283,41 @@
  88.983   */
  88.984  CK_RSA_PKCS_OAEP_PARAMS jRsaPkcsOaepParamToCKRsaPkcsOaepParam(JNIEnv *env, jobject jParam)
  88.985  {
  88.986 -    jclass jRsaPkcsOaepParamsClass = (*env)->FindClass(env, CLASS_RSA_PKCS_OAEP_PARAMS);
  88.987 +    jclass jRsaPkcsOaepParamsClass;
  88.988      CK_RSA_PKCS_OAEP_PARAMS ckParam;
  88.989      jfieldID fieldID;
  88.990 -    jlong jLong;
  88.991 -    jobject jObject;
  88.992 +    jlong jHashAlg, jMgf, jSource;
  88.993 +    jobject jSourceData;
  88.994      CK_BYTE_PTR ckpByte;
  88.995  
  88.996      /* get hashAlg */
  88.997 +    jRsaPkcsOaepParamsClass = (*env)->FindClass(env, CLASS_RSA_PKCS_OAEP_PARAMS);
  88.998 +    if (jRsaPkcsOaepParamsClass == NULL) { return ckParam; }
  88.999      fieldID = (*env)->GetFieldID(env, jRsaPkcsOaepParamsClass, "hashAlg", "J");
 88.1000 -    assert(fieldID != 0);
 88.1001 -    jLong = (*env)->GetLongField(env, jParam, fieldID);
 88.1002 -    ckParam.hashAlg = jLongToCKULong(jLong);
 88.1003 +    if (fieldID == NULL) { return ckParam; }
 88.1004 +    jHashAlg = (*env)->GetLongField(env, jParam, fieldID);
 88.1005  
 88.1006      /* get mgf */
 88.1007      fieldID = (*env)->GetFieldID(env, jRsaPkcsOaepParamsClass, "mgf", "J");
 88.1008 -    assert(fieldID != 0);
 88.1009 -    jLong = (*env)->GetLongField(env, jParam, fieldID);
 88.1010 -    ckParam.mgf = jLongToCKULong(jLong);
 88.1011 +    if (fieldID == NULL) { return ckParam; }
 88.1012 +    jMgf = (*env)->GetLongField(env, jParam, fieldID);
 88.1013  
 88.1014      /* get source */
 88.1015      fieldID = (*env)->GetFieldID(env, jRsaPkcsOaepParamsClass, "source", "J");
 88.1016 -    assert(fieldID != 0);
 88.1017 -    jLong = (*env)->GetLongField(env, jParam, fieldID);
 88.1018 -    ckParam.source = jLongToCKULong(jLong);
 88.1019 +    if (fieldID == NULL) { return ckParam; }
 88.1020 +    jSource = (*env)->GetLongField(env, jParam, fieldID);
 88.1021  
 88.1022      /* get sourceData and sourceDataLength */
 88.1023      fieldID = (*env)->GetFieldID(env, jRsaPkcsOaepParamsClass, "pSourceData", "[B");
 88.1024 -    assert(fieldID != 0);
 88.1025 -    jObject = (*env)->GetObjectField(env, jParam, fieldID);
 88.1026 -    jByteArrayToCKByteArray(env, jObject, &ckpByte, &(ckParam.ulSourceDataLen));
 88.1027 +    if (fieldID == NULL) { return ckParam; }
 88.1028 +    jSourceData = (*env)->GetObjectField(env, jParam, fieldID);
 88.1029 +
 88.1030 +    /* populate java values */
 88.1031 +    ckParam.hashAlg = jLongToCKULong(jHashAlg);
 88.1032 +    ckParam.mgf = jLongToCKULong(jMgf);
 88.1033 +    ckParam.source = jLongToCKULong(jSource);
 88.1034 +    jByteArrayToCKByteArray(env, jSourceData, & ckpByte, &(ckParam.ulSourceDataLen));
 88.1035 +    if ((*env)->ExceptionCheck(env)) { return ckParam; }
 88.1036      ckParam.pSourceData = (CK_VOID_PTR) ckpByte;
 88.1037  
 88.1038      return ckParam ;
 88.1039 @@ -1105,36 +1332,50 @@
 88.1040   */
 88.1041  CK_PBE_PARAMS jPbeParamToCKPbeParam(JNIEnv *env, jobject jParam)
 88.1042  {
 88.1043 -    jclass jPbeParamsClass = (*env)->FindClass(env, CLASS_PBE_PARAMS);
 88.1044 +    jclass jPbeParamsClass;
 88.1045      CK_PBE_PARAMS ckParam;
 88.1046      jfieldID fieldID;
 88.1047 -    jlong jLong;
 88.1048 -    jobject jObject;
 88.1049 +    jlong jIteration;
 88.1050 +    jobject jInitVector, jPassword, jSalt;
 88.1051      CK_ULONG ckTemp;
 88.1052  
 88.1053      /* get pInitVector */
 88.1054 +    jPbeParamsClass = (*env)->FindClass(env, CLASS_PBE_PARAMS);
 88.1055 +    if (jPbeParamsClass == NULL) { return ckParam; }
 88.1056      fieldID = (*env)->GetFieldID(env, jPbeParamsClass, "pInitVector", "[C");
 88.1057 -    assert(fieldID != 0);
 88.1058 -    jObject = (*env)->GetObjectField(env, jParam, fieldID);
 88.1059 -    jCharArrayToCKCharArray(env, jObject, &(ckParam.pInitVector), &ckTemp);
 88.1060 +    if (fieldID == NULL) { return ckParam; }
 88.1061 +    jInitVector = (*env)->GetObjectField(env, jParam, fieldID);
 88.1062  
 88.1063      /* get pPassword and ulPasswordLength */
 88.1064      fieldID = (*env)->GetFieldID(env, jPbeParamsClass, "pPassword", "[C");
 88.1065 -    assert(fieldID != 0);
 88.1066 -    jObject = (*env)->GetObjectField(env, jParam, fieldID);
 88.1067 -    jCharArrayToCKCharArray(env, jObject, &(ckParam.pPassword), &(ckParam.ulPasswordLen));
 88.1068 +    if (fieldID == NULL) { return ckParam; }
 88.1069 +    jPassword = (*env)->GetObjectField(env, jParam, fieldID);
 88.1070  
 88.1071      /* get pSalt and ulSaltLength */
 88.1072      fieldID = (*env)->GetFieldID(env, jPbeParamsClass, "pSalt", "[C");
 88.1073 -    assert(fieldID != 0);
 88.1074 -    jObject = (*env)->GetObjectField(env, jParam, fieldID);
 88.1075 -    jCharArrayToCKCharArray(env, jObject, &(ckParam.pSalt), &(ckParam.ulSaltLen));
 88.1076 +    if (fieldID == NULL) { return ckParam; }
 88.1077 +    jSalt = (*env)->GetObjectField(env, jParam, fieldID);
 88.1078  
 88.1079      /* get ulIteration */
 88.1080      fieldID = (*env)->GetFieldID(env, jPbeParamsClass, "ulIteration", "J");
 88.1081 -    assert(fieldID != 0);
 88.1082 -    jLong = (*env)->GetLongField(env, jParam, fieldID);
 88.1083 -    ckParam.ulIteration = jLongToCKULong(jLong);
 88.1084 +    if (fieldID == NULL) { return ckParam; }
 88.1085 +    jIteration = (*env)->GetLongField(env, jParam, fieldID);
 88.1086 +
 88.1087 +    /* populate java values */
 88.1088 +    ckParam.ulIteration = jLongToCKULong(jIteration);
 88.1089 +    jCharArrayToCKCharArray(env, jInitVector, &(ckParam.pInitVector), &ckTemp);
 88.1090 +    if ((*env)->ExceptionCheck(env)) { return ckParam; }
 88.1091 +    jCharArrayToCKCharArray(env, jPassword, &(ckParam.pPassword), &(ckParam.ulPasswordLen));
 88.1092 +    if ((*env)->ExceptionCheck(env)) {
 88.1093 +        free(ckParam.pInitVector);
 88.1094 +        return ckParam;
 88.1095 +    }
 88.1096 +    jCharArrayToCKCharArray(env, jSalt, &(ckParam.pSalt), &(ckParam.ulSaltLen));
 88.1097 +    if ((*env)->ExceptionCheck(env)) {
 88.1098 +        free(ckParam.pInitVector);
 88.1099 +        free(ckParam.pPassword);
 88.1100 +        return ckParam;
 88.1101 +    }
 88.1102  
 88.1103      return ckParam ;
 88.1104  }
 88.1105 @@ -1147,8 +1388,7 @@
 88.1106   */
 88.1107  void copyBackPBEInitializationVector(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism)
 88.1108  {
 88.1109 -    jclass jMechanismClass= (*env)->FindClass(env, CLASS_MECHANISM);
 88.1110 -    jclass jPbeParamsClass = (*env)->FindClass(env, CLASS_PBE_PARAMS);
 88.1111 +    jclass jMechanismClass, jPbeParamsClass;
 88.1112      CK_PBE_PARAMS *ckParam;
 88.1113      jfieldID fieldID;
 88.1114      CK_MECHANISM_TYPE ckMechanismType;
 88.1115 @@ -1161,8 +1401,10 @@
 88.1116      jchar* jInitVectorChars;
 88.1117  
 88.1118      /* get mechanism */
 88.1119 +    jMechanismClass = (*env)->FindClass(env, CLASS_MECHANISM);
 88.1120 +    if (jMechanismClass == NULL) { return; }
 88.1121      fieldID = (*env)->GetFieldID(env, jMechanismClass, "mechanism", "J");
 88.1122 -    assert(fieldID != 0);
 88.1123 +    if (fieldID == NULL) { return; }
 88.1124      jMechanismType = (*env)->GetLongField(env, jMechanism, fieldID);
 88.1125      ckMechanismType = jLongToCKULong(jMechanismType);
 88.1126      if (ckMechanismType != ckMechanism->mechanism) {
 88.1127 @@ -1170,21 +1412,25 @@
 88.1128          return;
 88.1129      }
 88.1130  
 88.1131 +    jPbeParamsClass = (*env)->FindClass(env, CLASS_PBE_PARAMS);
 88.1132 +    if (jPbeParamsClass == NULL) { return; }
 88.1133      ckParam = (CK_PBE_PARAMS *) ckMechanism->pParameter;
 88.1134      if (ckParam != NULL_PTR) {
 88.1135          initVector = ckParam->pInitVector;
 88.1136          if (initVector != NULL_PTR) {
 88.1137              /* get pParameter */
 88.1138              fieldID = (*env)->GetFieldID(env, jMechanismClass, "pParameter", "Ljava/lang/Object;");
 88.1139 -            assert(fieldID != 0);
 88.1140 +            if (fieldID == NULL) { return; }
 88.1141              jParameter = (*env)->GetObjectField(env, jMechanism, fieldID);
 88.1142              fieldID = (*env)->GetFieldID(env, jPbeParamsClass, "pInitVektor", "[C");
 88.1143 -            assert(fieldID != 0);
 88.1144 +            if (fieldID == NULL) { return; }
 88.1145              jInitVector = (*env)->GetObjectField(env, jParameter, fieldID);
 88.1146  
 88.1147              if (jInitVector != NULL) {
 88.1148                  jInitVectorLength = (*env)->GetArrayLength(env, jInitVector);
 88.1149                  jInitVectorChars = (*env)->GetCharArrayElements(env, jInitVector, NULL);
 88.1150 +                if (jInitVectorChars == NULL) { return; }
 88.1151 +
 88.1152                  /* copy the chars to the Java buffer */
 88.1153                  for (i=0; i < jInitVectorLength; i++) {
 88.1154                      jInitVectorChars[i] = ckCharToJChar(initVector[i]);
 88.1155 @@ -1205,41 +1451,50 @@
 88.1156   */
 88.1157  CK_PKCS5_PBKD2_PARAMS jPkcs5Pbkd2ParamToCKPkcs5Pbkd2Param(JNIEnv *env, jobject jParam)
 88.1158  {
 88.1159 -    jclass jPkcs5Pbkd2ParamsClass = (*env)->FindClass(env, CLASS_PKCS5_PBKD2_PARAMS);
 88.1160 +    jclass jPkcs5Pbkd2ParamsClass;
 88.1161      CK_PKCS5_PBKD2_PARAMS ckParam;
 88.1162      jfieldID fieldID;
 88.1163 -    jlong jLong;
 88.1164 -    jobject jObject;
 88.1165 +    jlong jSaltSource, jIteration, jPrf;
 88.1166 +    jobject jSaltSourceData, jPrfData;
 88.1167  
 88.1168      /* get saltSource */
 88.1169 +    jPkcs5Pbkd2ParamsClass = (*env)->FindClass(env, CLASS_PKCS5_PBKD2_PARAMS);
 88.1170 +    if (jPkcs5Pbkd2ParamsClass == NULL) { return ckParam; }
 88.1171      fieldID = (*env)->GetFieldID(env, jPkcs5Pbkd2ParamsClass, "saltSource", "J");
 88.1172 -    assert(fieldID != 0);
 88.1173 -    jLong = (*env)->GetLongField(env, jParam, fieldID);
 88.1174 -    ckParam.saltSource = jLongToCKULong(jLong);
 88.1175 +    if (fieldID == NULL) { return ckParam; }
 88.1176 +    jSaltSource = (*env)->GetLongField(env, jParam, fieldID);
 88.1177  
 88.1178      /* get pSaltSourceData */
 88.1179      fieldID = (*env)->GetFieldID(env, jPkcs5Pbkd2ParamsClass, "pSaltSourceData", "[B");
 88.1180 -    assert(fieldID != 0);
 88.1181 -    jObject = (*env)->GetObjectField(env, jParam, fieldID);
 88.1182 -    jByteArrayToCKByteArray(env, jObject, (CK_BYTE_PTR *) &(ckParam.pSaltSourceData), &(ckParam.ulSaltSourceDataLen));
 88.1183 +    if (fieldID == NULL) { return ckParam; }
 88.1184 +    jSaltSourceData = (*env)->GetObjectField(env, jParam, fieldID);
 88.1185  
 88.1186      /* get iterations */
 88.1187      fieldID = (*env)->GetFieldID(env, jPkcs5Pbkd2ParamsClass, "iterations", "J");
 88.1188 -    assert(fieldID != 0);
 88.1189 -    jLong = (*env)->GetLongField(env, jParam, fieldID);
 88.1190 -    ckParam.iterations = jLongToCKULong(jLong);
 88.1191 +    if (fieldID == NULL) { return ckParam; }
 88.1192 +    jIteration = (*env)->GetLongField(env, jParam, fieldID);
 88.1193  
 88.1194      /* get prf */
 88.1195      fieldID = (*env)->GetFieldID(env, jPkcs5Pbkd2ParamsClass, "prf", "J");
 88.1196 -    assert(fieldID != 0);
 88.1197 -    jLong = (*env)->GetLongField(env, jParam, fieldID);
 88.1198 -    ckParam.prf = jLongToCKULong(jLong);
 88.1199 +    if (fieldID == NULL) { return ckParam; }
 88.1200 +    jPrf = (*env)->GetLongField(env, jParam, fieldID);
 88.1201  
 88.1202      /* get pPrfData and ulPrfDataLength in byte */
 88.1203      fieldID = (*env)->GetFieldID(env, jPkcs5Pbkd2ParamsClass, "pPrfData", "[B");
 88.1204 -    assert(fieldID != 0);
 88.1205 -    jObject = (*env)->GetObjectField(env, jParam, fieldID);
 88.1206 -    jByteArrayToCKByteArray(env, jObject, (CK_BYTE_PTR *) &(ckParam.pPrfData), &(ckParam.ulPrfDataLen));
 88.1207 +    if (fieldID == NULL) { return ckParam; }
 88.1208 +    jPrfData = (*env)->GetObjectField(env, jParam, fieldID);
 88.1209 +
 88.1210 +    /* populate java values */
 88.1211 +    ckParam.saltSource = jLongToCKULong(jSaltSource);
 88.1212 +    jByteArrayToCKByteArray(env, jSaltSourceData, (CK_BYTE_PTR *) &(ckParam.pSaltSourceData), &(ckParam.ulSaltSourceDataLen));
 88.1213 +    if ((*env)->ExceptionCheck(env)) { return ckParam; }
 88.1214 +    ckParam.iterations = jLongToCKULong(jIteration);
 88.1215 +    ckParam.prf = jLongToCKULong(jPrf);
 88.1216 +    jByteArrayToCKByteArray(env, jPrfData, (CK_BYTE_PTR *) &(ckParam.pPrfData), &(ckParam.ulPrfDataLen));
 88.1217 +    if ((*env)->ExceptionCheck(env)) {
 88.1218 +        free(ckParam.pSaltSourceData);
 88.1219 +        return ckParam;
 88.1220 +    }
 88.1221  
 88.1222      return ckParam ;
 88.1223  }
 88.1224 @@ -1253,28 +1508,32 @@
 88.1225   */
 88.1226  CK_RSA_PKCS_PSS_PARAMS jRsaPkcsPssParamToCKRsaPkcsPssParam(JNIEnv *env, jobject jParam)
 88.1227  {
 88.1228 -    jclass jRsaPkcsPssParamsClass = (*env)->FindClass(env, CLASS_RSA_PKCS_PSS_PARAMS);
 88.1229 +    jclass jRsaPkcsPssParamsClass;
 88.1230      CK_RSA_PKCS_PSS_PARAMS ckParam;
 88.1231      jfieldID fieldID;
 88.1232 -    jlong jLong;
 88.1233 +    jlong jHashAlg, jMgf, jSLen;
 88.1234  
 88.1235      /* get hashAlg */
 88.1236 +    jRsaPkcsPssParamsClass = (*env)->FindClass(env, CLASS_RSA_PKCS_PSS_PARAMS);
 88.1237 +    if (jRsaPkcsPssParamsClass == NULL) { return ckParam; }
 88.1238      fieldID = (*env)->GetFieldID(env, jRsaPkcsPssParamsClass, "hashAlg", "J");
 88.1239 -    assert(fieldID != 0);
 88.1240 -    jLong = (*env)->GetLongField(env, jParam, fieldID);
 88.1241 -    ckParam.hashAlg = jLongToCKULong(jLong);
 88.1242 +    if (fieldID == NULL) { return ckParam; }
 88.1243 +    jHashAlg = (*env)->GetLongField(env, jParam, fieldID);
 88.1244  
 88.1245      /* get mgf */
 88.1246      fieldID = (*env)->GetFieldID(env, jRsaPkcsPssParamsClass, "mgf", "J");
 88.1247 -    assert(fieldID != 0);
 88.1248 -    jLong = (*env)->GetLongField(env, jParam, fieldID);
 88.1249 -    ckParam.mgf = jLongToCKULong(jLong);
 88.1250 +    if (fieldID == NULL) { return ckParam; }
 88.1251 +    jMgf = (*env)->GetLongField(env, jParam, fieldID);
 88.1252  
 88.1253      /* get sLen */
 88.1254      fieldID = (*env)->GetFieldID(env, jRsaPkcsPssParamsClass, "sLen", "J");
 88.1255 -    assert(fieldID != 0);
 88.1256 -    jLong = (*env)->GetLongField(env, jParam, fieldID);
 88.1257 -    ckParam.sLen = jLongToCKULong(jLong);
 88.1258 +    if (fieldID == NULL) { return ckParam; }
 88.1259 +    jSLen = (*env)->GetLongField(env, jParam, fieldID);
 88.1260 +
 88.1261 +    /* populate java values */
 88.1262 +    ckParam.hashAlg = jLongToCKULong(jHashAlg);
 88.1263 +    ckParam.mgf = jLongToCKULong(jMgf);
 88.1264 +    ckParam.sLen = jLongToCKULong(jSLen);
 88.1265  
 88.1266      return ckParam ;
 88.1267  }
 88.1268 @@ -1288,29 +1547,39 @@
 88.1269   */
 88.1270  CK_ECDH1_DERIVE_PARAMS jEcdh1DeriveParamToCKEcdh1DeriveParam(JNIEnv *env, jobject jParam)
 88.1271  {
 88.1272 -    jclass jEcdh1DeriveParamsClass = (*env)->FindClass(env, CLASS_ECDH1_DERIVE_PARAMS);
 88.1273 +    jclass jEcdh1DeriveParamsClass;
 88.1274      CK_ECDH1_DERIVE_PARAMS ckParam;
 88.1275      jfieldID fieldID;
 88.1276      jlong jLong;
 88.1277 -    jobject jObject;
 88.1278 +    jobject jSharedData, jPublicData;
 88.1279  
 88.1280      /* get kdf */
 88.1281 +    jEcdh1DeriveParamsClass = (*env)->FindClass(env, CLASS_ECDH1_DERIVE_PARAMS);
 88.1282 +    if (jEcdh1DeriveParamsClass == NULL) { return ckParam; }
 88.1283      fieldID = (*env)->GetFieldID(env, jEcdh1DeriveParamsClass, "kdf", "J");
 88.1284 -    assert(fieldID != 0);
 88.1285 +    if (fieldID == NULL) { return ckParam; }
 88.1286      jLong = (*env)->GetLongField(env, jParam, fieldID);
 88.1287      ckParam.kdf = jLongToCKULong(jLong);
 88.1288  
 88.1289      /* get pSharedData and ulSharedDataLen */
 88.1290      fieldID = (*env)->GetFieldID(env, jEcdh1DeriveParamsClass, "pSharedData", "[B");
 88.1291 -    assert(fieldID != 0);
 88.1292 -    jObject = (*env)->GetObjectField(env, jParam, fieldID);
 88.1293 -    jByteArrayToCKByteArray(env, jObject, &(ckParam.pSharedData), &(ckParam.ulSharedDataLen));
 88.1294 +    if (fieldID == NULL) { return ckParam; }
 88.1295 +    jSharedData = (*env)->GetObjectField(env, jParam, fieldID);
 88.1296  
 88.1297      /* get pPublicData and ulPublicDataLen */
 88.1298      fieldID = (*env)->GetFieldID(env, jEcdh1DeriveParamsClass, "pPublicData", "[B");
 88.1299 -    assert(fieldID != 0);
 88.1300 -    jObject = (*env)->GetObjectField(env, jParam, fieldID);
 88.1301 -    jByteArrayToCKByteArray(env, jObject, &(ckParam.pPublicData), &(ckParam.ulPublicDataLen));
 88.1302 +    if (fieldID == NULL) { return ckParam; }
 88.1303 +    jPublicData = (*env)->GetObjectField(env, jParam, fieldID);
 88.1304 +
 88.1305 +    /* populate java values */
 88.1306 +    ckParam.kdf = jLongToCKULong(jLong);
 88.1307 +    jByteArrayToCKByteArray(env, jSharedData, &(ckParam.pSharedData), &(ckParam.ulSharedDataLen));
 88.1308 +    if ((*env)->ExceptionCheck(env)) { return ckParam; }
 88.1309 +    jByteArrayToCKByteArray(env, jPublicData, &(ckParam.pPublicData), &(ckParam.ulPublicDataLen));
 88.1310 +    if ((*env)->ExceptionCheck(env)) {
 88.1311 +        free(ckParam.pSharedData);
 88.1312 +        return ckParam;
 88.1313 +    }
 88.1314  
 88.1315      return ckParam ;
 88.1316  }
 88.1317 @@ -1324,48 +1593,61 @@
 88.1318   */
 88.1319  CK_ECDH2_DERIVE_PARAMS jEcdh2DeriveParamToCKEcdh2DeriveParam(JNIEnv *env, jobject jParam)
 88.1320  {
 88.1321 -    jclass jEcdh2DeriveParamsClass = (*env)->FindClass(env, CLASS_ECDH2_DERIVE_PARAMS);
 88.1322 +    jclass jEcdh2DeriveParamsClass;
 88.1323      CK_ECDH2_DERIVE_PARAMS ckParam;
 88.1324      jfieldID fieldID;
 88.1325 -    jlong jLong;
 88.1326 -    jobject jObject;
 88.1327 +    jlong jKdf, jPrivateDataLen, jPrivateData;
 88.1328 +    jobject jSharedData, jPublicData, jPublicData2;
 88.1329  
 88.1330      /* get kdf */
 88.1331 +    jEcdh2DeriveParamsClass = (*env)->FindClass(env, CLASS_ECDH2_DERIVE_PARAMS);
 88.1332 +    if (jEcdh2DeriveParamsClass == NULL) { return ckParam; }
 88.1333      fieldID = (*env)->GetFieldID(env, jEcdh2DeriveParamsClass, "kdf", "J");
 88.1334 -    assert(fieldID != 0);
 88.1335 -    jLong = (*env)->GetLongField(env, jParam, fieldID);
 88.1336 -    ckParam.kdf = jLongToCKULong(jLong);
 88.1337 +    if (fieldID == NULL) { return ckParam; }
 88.1338 +    jKdf = (*env)->GetLongField(env, jParam, fieldID);
 88.1339  
 88.1340      /* get pSharedData and ulSharedDataLen */
 88.1341      fieldID = (*env)->GetFieldID(env, jEcdh2DeriveParamsClass, "pSharedData", "[B");
 88.1342 -    assert(fieldID != 0);
 88.1343 -    jObject = (*env)->GetObjectField(env, jParam, fieldID);
 88.1344 -    jByteArrayToCKByteArray(env, jObject, &(ckParam.pSharedData), &(ckParam.ulSharedDataLen));
 88.1345 +    if (fieldID == NULL) { return ckParam; }
 88.1346 +    jSharedData = (*env)->GetObjectField(env, jParam, fieldID);
 88.1347  
 88.1348      /* get pPublicData and ulPublicDataLen */
 88.1349      fieldID = (*env)->GetFieldID(env, jEcdh2DeriveParamsClass, "pPublicData", "[B");
 88.1350 -    assert(fieldID != 0);
 88.1351 -    jObject = (*env)->GetObjectField(env, jParam, fieldID);
 88.1352 -    jByteArrayToCKByteArray(env, jObject, &(ckParam.pPublicData), &(ckParam.ulPublicDataLen));
 88.1353 +    if (fieldID == NULL) { return ckParam; }
 88.1354 +    jPublicData = (*env)->GetObjectField(env, jParam, fieldID);
 88.1355  
 88.1356      /* get ulPrivateDataLen */
 88.1357      fieldID = (*env)->GetFieldID(env, jEcdh2DeriveParamsClass, "ulPrivateDataLen", "J");
 88.1358 -    assert(fieldID != 0);
 88.1359 -    jLong = (*env)->GetLongField(env, jParam, fieldID);
 88.1360 -    ckParam.ulPrivateDataLen = jLongToCKULong(jLong);
 88.1361 +    if (fieldID == NULL) { return ckParam; }
 88.1362 +    jPrivateDataLen = (*env)->GetLongField(env, jParam, fieldID);
 88.1363  
 88.1364      /* get hPrivateData */
 88.1365      fieldID = (*env)->GetFieldID(env, jEcdh2DeriveParamsClass, "hPrivateData", "J");
 88.1366 -    assert(fieldID != 0);
 88.1367 -    jLong = (*env)->GetLongField(env, jParam, fieldID);
 88.1368 -    ckParam.hPrivateData = jLongToCKULong(jLong);
 88.1369 +    if (fieldID == NULL) { return ckParam; }
 88.1370 +    jPrivateData = (*env)->GetLongField(env, jParam, fieldID);
 88.1371  
 88.1372      /* get pPublicData2 and ulPublicDataLen2 */
 88.1373      fieldID = (*env)->GetFieldID(env, jEcdh2DeriveParamsClass, "pPublicData2", "[B");
 88.1374 -    assert(fieldID != 0);
 88.1375 -    jObject = (*env)->GetObjectField(env, jParam, fieldID);
 88.1376 -    jByteArrayToCKByteArray(env, jObject, &(ckParam.pPublicData2), &(ckParam.ulPublicDataLen2));
 88.1377 +    if (fieldID == NULL) { return ckParam; }
 88.1378 +    jPublicData2 = (*env)->GetObjectField(env, jParam, fieldID);
 88.1379  
 88.1380 +    /* populate java values */
 88.1381 +    ckParam.kdf = jLongToCKULong(jKdf);
 88.1382 +    jByteArrayToCKByteArray(env, jSharedData, &(ckParam.pSharedData), &(ckParam.ulSharedDataLen));
 88.1383 +    if ((*env)->ExceptionCheck(env)) { return ckParam; }
 88.1384 +    jByteArrayToCKByteArray(env, jPublicData, &(ckParam.pPublicData), &(ckParam.ulPublicDataLen));
 88.1385 +    if ((*env)->ExceptionCheck(env)) {
 88.1386 +        free(ckParam.pSharedData);
 88.1387 +        return ckParam;
 88.1388 +    }
 88.1389 +    ckParam.ulPrivateDataLen = jLongToCKULong(jPrivateDataLen);
 88.1390 +    ckParam.hPrivateData = jLongToCKULong(jPrivateData);
 88.1391 +    jByteArrayToCKByteArray(env, jPublicData2, &(ckParam.pPublicData2), &(ckParam.ulPublicDataLen2));
 88.1392 +    if ((*env)->ExceptionCheck(env)) {
 88.1393 +        free(ckParam.pSharedData);
 88.1394 +        free(ckParam.pPublicData);
 88.1395 +        return ckParam;
 88.1396 +    }
 88.1397      return ckParam ;
 88.1398  }
 88.1399  
 88.1400 @@ -1378,29 +1660,38 @@
 88.1401   */
 88.1402  CK_X9_42_DH1_DERIVE_PARAMS jX942Dh1DeriveParamToCKX942Dh1DeriveParam(JNIEnv *env, jobject jParam)
 88.1403  {
 88.1404 -    jclass jX942Dh1DeriveParamsClass = (*env)->FindClass(env, CLASS_X9_42_DH1_DERIVE_PARAMS);
 88.1405 +    jclass jX942Dh1DeriveParamsClass;
 88.1406      CK_X9_42_DH1_DERIVE_PARAMS ckParam;
 88.1407      jfieldID fieldID;
 88.1408 -    jlong jLong;
 88.1409 -    jobject jObject;
 88.1410 +    jlong jKdf;
 88.1411 +    jobject jOtherInfo, jPublicData;
 88.1412  
 88.1413      /* get kdf */
 88.1414 +    jX942Dh1DeriveParamsClass = (*env)->FindClass(env, CLASS_X9_42_DH1_DERIVE_PARAMS);
 88.1415 +    if (jX942Dh1DeriveParamsClass == NULL) { return ckParam; }
 88.1416      fieldID = (*env)->GetFieldID(env, jX942Dh1DeriveParamsClass, "kdf", "J");
 88.1417 -    assert(fieldID != 0);
 88.1418 -    jLong = (*env)->GetLongField(env, jParam, fieldID);
 88.1419 -    ckParam.kdf = jLongToCKULong(jLong);
 88.1420 +    if (fieldID == NULL) { return ckParam; }
 88.1421 +    jKdf = (*env)->GetLongField(env, jParam, fieldID);
 88.1422  
 88.1423      /* get pOtherInfo and ulOtherInfoLen */
 88.1424      fieldID = (*env)->GetFieldID(env, jX942Dh1DeriveParamsClass, "pOtherInfo", "[B");
 88.1425 -    assert(fieldID != 0);
 88.1426 -    jObject = (*env)->GetObjectField(env, jParam, fieldID);
 88.1427 -    jByteArrayToCKByteArray(env, jObject, &(ckParam.pOtherInfo), &(ckParam.ulOtherInfoLen));
 88.1428 +    if (fieldID == NULL) { return ckParam; }
 88.1429 +    jOtherInfo = (*env)->GetObjectField(env, jParam, fieldID);
 88.1430  
 88.1431      /* get pPublicData and ulPublicDataLen */
 88.1432      fieldID = (*env)->GetFieldID(env, jX942Dh1DeriveParamsClass, "pPublicData", "[B");
 88.1433 -    assert(fieldID != 0);
 88.1434 -    jObject = (*env)->GetObjectField(env, jParam, fieldID);
 88.1435 -    jByteArrayToCKByteArray(env, jObject, &(ckParam.pPublicData), &(ckParam.ulPublicDataLen));
 88.1436 +    if (fieldID == NULL) { return ckParam; }
 88.1437 +    jPublicData = (*env)->GetObjectField(env, jParam, fieldID);
 88.1438 +
 88.1439 +    /* populate java values */
 88.1440 +    ckParam.kdf = jLongToCKULong(jKdf);
 88.1441 +    jByteArrayToCKByteArray(env, jOtherInfo, &(ckParam.pOtherInfo), &(ckParam.ulOtherInfoLen));
 88.1442 +    if ((*env)->ExceptionCheck(env)) { return ckParam; }
 88.1443 +    jByteArrayToCKByteArray(env, jPublicData, &(ckParam.pPublicData), &(ckParam.ulPublicDataLen));
 88.1444 +    if ((*env)->ExceptionCheck(env)) {
 88.1445 +        free(ckParam.pOtherInfo);
 88.1446 +        return ckParam;
 88.1447 +    }
 88.1448  
 88.1449      return ckParam ;
 88.1450  }
 88.1451 @@ -1414,47 +1705,61 @@
 88.1452   */
 88.1453  CK_X9_42_DH2_DERIVE_PARAMS jX942Dh2DeriveParamToCKX942Dh2DeriveParam(JNIEnv *env, jobject jParam)
 88.1454  {
 88.1455 -    jclass jX942Dh2DeriveParamsClass = (*env)->FindClass(env, CLASS_X9_42_DH2_DERIVE_PARAMS);
 88.1456 +    jclass jX942Dh2DeriveParamsClass;
 88.1457      CK_X9_42_DH2_DERIVE_PARAMS ckParam;
 88.1458      jfieldID fieldID;
 88.1459 -    jlong jLong;
 88.1460 -    jobject jObject;
 88.1461 +    jlong jKdf, jPrivateDataLen, jPrivateData;
 88.1462 +    jobject jOtherInfo, jPublicData, jPublicData2;
 88.1463  
 88.1464      /* get kdf */
 88.1465 +    jX942Dh2DeriveParamsClass = (*env)->FindClass(env, CLASS_X9_42_DH2_DERIVE_PARAMS);
 88.1466 +    if (jX942Dh2DeriveParamsClass == NULL) { return ckParam; }
 88.1467      fieldID = (*env)->GetFieldID(env, jX942Dh2DeriveParamsClass, "kdf", "J");
 88.1468 -    assert(fieldID != 0);
 88.1469 -    jLong = (*env)->GetLongField(env, jParam, fieldID);
 88.1470 -    ckParam.kdf = jLongToCKULong(jLong);
 88.1471 +    if (fieldID == NULL) { return ckParam; }
 88.1472 +    jKdf = (*env)->GetLongField(env, jParam, fieldID);
 88.1473  
 88.1474      /* get pOtherInfo and ulOtherInfoLen */
 88.1475      fieldID = (*env)->GetFieldID(env, jX942Dh2DeriveParamsClass, "pOtherInfo", "[B");
 88.1476 -    assert(fieldID != 0);
 88.1477 -    jObject = (*env)->GetObjectField(env, jParam, fieldID);
 88.1478 -    jByteArrayToCKByteArray(env, jObject, &(ckParam.pOtherInfo), &(ckParam.ulOtherInfoLen));
 88.1479 +    if (fieldID == NULL) { return ckParam; }
 88.1480 +    jOtherInfo = (*env)->GetObjectField(env, jParam, fieldID);
 88.1481  
 88.1482      /* get pPublicData and ulPublicDataLen */
 88.1483      fieldID = (*env)->GetFieldID(env, jX942Dh2DeriveParamsClass, "pPublicData", "[B");
 88.1484 -    assert(fieldID != 0);
 88.1485 -    jObject = (*env)->GetObjectField(env, jParam, fieldID);
 88.1486 -    jByteArrayToCKByteArray(env, jObject, &(ckParam.pPublicData), &(ckParam.ulPublicDataLen));
 88.1487 +    if (fieldID == NULL) { return ckParam; }
 88.1488 +    jPublicData = (*env)->GetObjectField(env, jParam, fieldID);
 88.1489  
 88.1490      /* get ulPrivateDataLen */
 88.1491      fieldID = (*env)->GetFieldID(env, jX942Dh2DeriveParamsClass, "ulPrivateDataLen", "J");
 88.1492 -    assert(fieldID != 0);
 88.1493 -    jLong = (*env)->GetLongField(env, jParam, fieldID);
 88.1494 -    ckParam.ulPrivateDataLen = jLongToCKULong(jLong);
 88.1495 +    if (fieldID == NULL) { return ckParam; }
 88.1496 +    jPrivateDataLen = (*env)->GetLongField(env, jParam, fieldID);
 88.1497  
 88.1498      /* get hPrivateData */
 88.1499      fieldID = (*env)->GetFieldID(env, jX942Dh2DeriveParamsClass, "hPrivateData", "J");
 88.1500 -    assert(fieldID != 0);
 88.1501 -    jLong = (*env)->GetLongField(env, jParam, fieldID);
 88.1502 -    ckParam.hPrivateData = jLongToCKULong(jLong);
 88.1503 +    if (fieldID == NULL) { return ckParam; }
 88.1504 +    jPrivateData = (*env)->GetLongField(env, jParam, fieldID);
 88.1505  
 88.1506      /* get pPublicData2 and ulPublicDataLen2 */
 88.1507      fieldID = (*env)->GetFieldID(env, jX942Dh2DeriveParamsClass, "pPublicData2", "[B");
 88.1508 -    assert(fieldID != 0);
 88.1509 -    jObject = (*env)->GetObjectField(env, jParam, fieldID);
 88.1510 -    jByteArrayToCKByteArray(env, jObject, &(ckParam.pPublicData2), &(ckParam.ulPublicDataLen2));
 88.1511 +    if (fieldID == NULL) { return ckParam; }
 88.1512 +    jPublicData2 = (*env)->GetObjectField(env, jParam, fieldID);
 88.1513 +
 88.1514 +    /* populate java values */
 88.1515 +    ckParam.kdf = jLongToCKULong(jKdf);
 88.1516 +    jByteArrayToCKByteArray(env, jOtherInfo, &(ckParam.pOtherInfo), &(ckParam.ulOtherInfoLen));
 88.1517 +    if ((*env)->ExceptionCheck(env)) { return ckParam; }
 88.1518 +    jByteArrayToCKByteArray(env, jPublicData, &(ckParam.pPublicData), &(ckParam.ulPublicDataLen));
 88.1519 +    if ((*env)->ExceptionCheck(env)) {
 88.1520 +        free(ckParam.pOtherInfo);
 88.1521 +        return ckParam;
 88.1522 +    }
 88.1523 +    ckParam.ulPrivateDataLen = jLongToCKULong(jPrivateDataLen);
 88.1524 +    ckParam.hPrivateData = jLongToCKULong(jPrivateData);
 88.1525 +    jByteArrayToCKByteArray(env, jPublicData2, &(ckParam.pPublicData2), &(ckParam.ulPublicDataLen2));
 88.1526 +    if ((*env)->ExceptionCheck(env)) {
 88.1527 +        free(ckParam.pOtherInfo);
 88.1528 +        free(ckParam.pPublicData);
 88.1529 +        return ckParam;
 88.1530 +    }
 88.1531  
 88.1532      return ckParam ;
 88.1533  }
    89.1 --- a/src/share/native/sun/security/pkcs11/wrapper/p11_crypt.c	Thu Apr 02 10:16:53 2009 -0700
    89.2 +++ b/src/share/native/sun/security/pkcs11/wrapper/p11_crypt.c	Wed Apr 08 15:40:56 2009 -0700
    89.3 @@ -1,5 +1,5 @@
    89.4  /*
    89.5 - * Portions Copyright 2003-2007 Sun Microsystems, Inc.  All Rights Reserved.
    89.6 + * Portions Copyright 2003-2009 Sun Microsystems, Inc.  All Rights Reserved.
    89.7   */
    89.8  
    89.9  /* Copyright  (c) 2002 Graz University of Technology. All rights reserved.
   89.10 @@ -81,6 +81,7 @@
   89.11      ckSessionHandle = jLongToCKULong(jSessionHandle);
   89.12      ckKeyHandle = jLongToCKULong(jKeyHandle);
   89.13      jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
   89.14 +    if ((*env)->ExceptionCheck(env)) { return; }
   89.15  
   89.16      rv = (*ckpFunctions->C_EncryptInit)(ckSessionHandle, &ckMechanism,
   89.17                                          ckKeyHandle);
   89.18 @@ -126,14 +127,29 @@
   89.19  
   89.20      if (jInLen > MAX_STACK_BUFFER_LEN) {
   89.21        inBufP = (CK_BYTE_PTR)malloc((size_t)jInLen);
   89.22 +      if (inBufP == NULL) {
   89.23 +        JNU_ThrowOutOfMemoryError(env, 0);
   89.24 +        return 0;
   89.25 +      }
   89.26      } else {
   89.27        inBufP = IBUF;
   89.28      }
   89.29      (*env)->GetByteArrayRegion(env, jIn, jInOfs, jInLen, (jbyte *)inBufP);
   89.30 +    if ((*env)->ExceptionCheck(env)) {
   89.31 +      if (inBufP != IBUF) { free(inBufP); }
   89.32 +      return 0;
   89.33 +    }
   89.34  
   89.35      ckEncryptedPartLen = jOutLen;
   89.36      if (jOutLen > MAX_STACK_BUFFER_LEN) {
   89.37        outBufP = (CK_BYTE_PTR)malloc((size_t)jOutLen);
   89.38 +      if (outBufP == NULL) {
   89.39 +        if (inBufP != IBUF) {
   89.40 +          free(inBufP);
   89.41 +        }
   89.42 +        JNU_ThrowOutOfMemoryError(env, 0);
   89.43 +        return 0;
   89.44 +      }
   89.45      } else {
   89.46        outBufP = OBUF;
   89.47      }
   89.48 @@ -193,10 +209,18 @@
   89.49      } else {
   89.50        if (jInLen > MAX_STACK_BUFFER_LEN) {
   89.51          inBufP = (CK_BYTE_PTR)malloc((size_t)jInLen);
   89.52 +        if (inBufP == NULL) {
   89.53 +          JNU_ThrowOutOfMemoryError(env, 0);
   89.54 +          return 0;
   89.55 +        }
   89.56        } else {
   89.57          inBufP = IBUF;
   89.58        }
   89.59        (*env)->GetByteArrayRegion(env, jIn, jInOfs, jInLen, (jbyte *)inBufP);
   89.60 +      if ((*env)->ExceptionCheck(env)) {
   89.61 +        if (directIn == 0 && inBufP != IBUF) { free(inBufP); }
   89.62 +        return 0;
   89.63 +      }
   89.64      }
   89.65  
   89.66      ckEncryptedPartLen = jOutLen;
   89.67 @@ -205,6 +229,13 @@
   89.68      } else {
   89.69        if (jOutLen > MAX_STACK_BUFFER_LEN) {
   89.70          outBufP = (CK_BYTE_PTR)malloc((size_t)jOutLen);
   89.71 +        if (outBufP == NULL) {
   89.72 +          if (directIn == 0 && inBufP != IBUF) {
   89.73 +            free(inBufP);
   89.74 +          }
   89.75 +          JNU_ThrowOutOfMemoryError(env, 0);
   89.76 +          return 0;
   89.77 +        }
   89.78        } else {
   89.79          outBufP = OBUF;
   89.80        }
   89.81 @@ -317,6 +348,7 @@
   89.82      ckSessionHandle = jLongToCKULong(jSessionHandle);
   89.83      ckKeyHandle = jLongToCKULong(jKeyHandle);
   89.84      jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
   89.85 +    if ((*env)->ExceptionCheck(env)) { return; }
   89.86  
   89.87      rv = (*ckpFunctions->C_DecryptInit)(ckSessionHandle, &ckMechanism,
   89.88                                          ckKeyHandle);
   89.89 @@ -362,14 +394,29 @@
   89.90  
   89.91      if (jInLen > MAX_STACK_BUFFER_LEN) {
   89.92        inBufP = (CK_BYTE_PTR)malloc((size_t)jInLen);
   89.93 +      if (inBufP == NULL) {
   89.94 +        JNU_ThrowOutOfMemoryError(env, 0);
   89.95 +        return 0;
   89.96 +      }
   89.97      } else {
   89.98        inBufP = IBUF;
   89.99      }
  89.100      (*env)->GetByteArrayRegion(env, jIn, jInOfs, jInLen, (jbyte *)inBufP);
  89.101 +    if ((*env)->ExceptionCheck(env)) {
  89.102 +      if (inBufP != IBUF) { free(inBufP); }
  89.103 +      return 0;
  89.104 +    }
  89.105  
  89.106      ckPartLen = jOutLen;
  89.107      if (jOutLen > MAX_STACK_BUFFER_LEN) {
  89.108        outBufP = (CK_BYTE_PTR)malloc((size_t)jOutLen);
  89.109 +      if (outBufP == NULL) {
  89.110 +        if (inBufP != IBUF) {
  89.111 +          free(inBufP);
  89.112 +        }
  89.113 +        JNU_ThrowOutOfMemoryError(env, 0);
  89.114 +        return 0;
  89.115 +      }
  89.116      } else {
  89.117        outBufP = OBUF;
  89.118      }
  89.119 @@ -429,10 +476,18 @@
  89.120      } else {
  89.121        if (jInLen > MAX_STACK_BUFFER_LEN) {
  89.122          inBufP = (CK_BYTE_PTR)malloc((size_t)jInLen);
  89.123 +        if (inBufP == NULL) {
  89.124 +          JNU_ThrowOutOfMemoryError(env, 0);
  89.125 +          return 0;
  89.126 +        }
  89.127        } else {
  89.128          inBufP = IBUF;
  89.129        }
  89.130        (*env)->GetByteArrayRegion(env, jIn, jInOfs, jInLen, (jbyte *)inBufP);
  89.131 +      if ((*env)->ExceptionCheck(env)) {
  89.132 +        if (directIn == 0 && inBufP != IBUF) { free(inBufP); }
  89.133 +        return 0;
  89.134 +      }
  89.135      }
  89.136  
  89.137      ckDecryptedPartLen = jOutLen;
  89.138 @@ -441,6 +496,13 @@
  89.139      } else {
  89.140        if (jOutLen > MAX_STACK_BUFFER_LEN) {
  89.141          outBufP = (CK_BYTE_PTR)malloc((size_t)jOutLen);
  89.142 +        if (outBufP == NULL) {
  89.143 +          if (directIn == 0 && inBufP != IBUF) {
  89.144 +            free(inBufP);
  89.145 +          }
  89.146 +          JNU_ThrowOutOfMemoryError(env, 0);
  89.147 +          return 0;
  89.148 +      }
  89.149        } else {
  89.150          outBufP = OBUF;
  89.151        }
    90.1 --- a/src/share/native/sun/security/pkcs11/wrapper/p11_digest.c	Thu Apr 02 10:16:53 2009 -0700
    90.2 +++ b/src/share/native/sun/security/pkcs11/wrapper/p11_digest.c	Wed Apr 08 15:40:56 2009 -0700
    90.3 @@ -1,5 +1,5 @@
    90.4  /*
    90.5 - * Portions Copyright 2003 Sun Microsystems, Inc.  All Rights Reserved.
    90.6 + * Portions Copyright 2003-2009 Sun Microsystems, Inc.  All Rights Reserved.
    90.7   */
    90.8  
    90.9  /* Copyright  (c) 2002 Graz University of Technology. All rights reserved.
   90.10 @@ -75,6 +75,7 @@
   90.11  
   90.12      ckSessionHandle = jLongToCKULong(jSessionHandle);
   90.13      jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
   90.14 +    if ((*env)->ExceptionCheck(env)) { return; }
   90.15  
   90.16      rv = (*ckpFunctions->C_DigestInit)(ckSessionHandle, &ckMechanism);
   90.17  
   90.18 @@ -82,7 +83,7 @@
   90.19          free(ckMechanism.pParameter);
   90.20      }
   90.21  
   90.22 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
   90.23 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
   90.24  }
   90.25  #endif
   90.26  
   90.27 @@ -114,6 +115,7 @@
   90.28  
   90.29      ckSessionHandle = jLongToCKULong(jSessionHandle);
   90.30      jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
   90.31 +    if ((*env)->ExceptionCheck(env)) { return 0; }
   90.32  
   90.33      rv = (*ckpFunctions->C_DigestInit)(ckSessionHandle, &ckMechanism);
   90.34  
   90.35 @@ -121,29 +123,32 @@
   90.36          free(ckMechanism.pParameter);
   90.37      }
   90.38  
   90.39 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return 0; }
   90.40 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return 0; }
   90.41  
   90.42      if (jInLen <= MAX_STACK_BUFFER_LEN) {
   90.43          bufP = BUF;
   90.44      } else {
   90.45          /* always use single part op, even for large data */
   90.46 -        bufP = (CK_BYTE_PTR)malloc((size_t)jInLen);
   90.47 +        bufP = (CK_BYTE_PTR) malloc((size_t)jInLen);
   90.48 +        if (bufP == NULL) {
   90.49 +            JNU_ThrowOutOfMemoryError(env, 0);
   90.50 +            return 0;
   90.51 +        }
   90.52      }
   90.53  
   90.54      (*env)->GetByteArrayRegion(env, jIn, jInOfs, jInLen, (jbyte *)bufP);
   90.55 -    rv = (*ckpFunctions->C_Digest)(ckSessionHandle, bufP, jInLen, DIGESTBUF, &ckDigestLength);
   90.56 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
   90.57 -        if (bufP != BUF) {
   90.58 -            free(bufP);
   90.59 -        }
   90.60 +    if ((*env)->ExceptionCheck(env)) {
   90.61 +        if (bufP != BUF) { free(bufP); }
   90.62          return 0;
   90.63      }
   90.64  
   90.65 -    (*env)->SetByteArrayRegion(env, jDigest, jDigestOfs, ckDigestLength, (jbyte *)DIGESTBUF);
   90.66 +    rv = (*ckpFunctions->C_Digest)(ckSessionHandle, bufP, jInLen, DIGESTBUF, &ckDigestLength);
   90.67 +    if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
   90.68 +        (*env)->SetByteArrayRegion(env, jDigest, jDigestOfs, ckDigestLength, (jbyte *)DIGESTBUF);
   90.69 +    }
   90.70  
   90.71 -    if (bufP != BUF) {
   90.72 -        free(bufP);
   90.73 -    }
   90.74 +    if (bufP != BUF) { free(bufP); }
   90.75 +
   90.76      return ckDigestLength;
   90.77  }
   90.78  #endif
   90.79 @@ -183,17 +188,23 @@
   90.80          bufP = BUF;
   90.81      } else {
   90.82          bufLen = min(MAX_HEAP_BUFFER_LEN, jInLen);
   90.83 -        bufP = (CK_BYTE_PTR)malloc((size_t)bufLen);
   90.84 +        bufP = (CK_BYTE_PTR) malloc((size_t)bufLen);
   90.85 +        if (bufP == NULL) {
   90.86 +            JNU_ThrowOutOfMemoryError(env, 0);
   90.87 +            return;
   90.88 +        }
   90.89      }
   90.90  
   90.91      while (jInLen > 0) {
   90.92          jsize chunkLen = min(bufLen, jInLen);
   90.93          (*env)->GetByteArrayRegion(env, jIn, jInOfs, chunkLen, (jbyte *)bufP);
   90.94 +        if ((*env)->ExceptionCheck(env)) {
   90.95 +            if (bufP != BUF) { free(bufP); }
   90.96 +            return;
   90.97 +        }
   90.98          rv = (*ckpFunctions->C_DigestUpdate)(ckSessionHandle, bufP, chunkLen);
   90.99 -        if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
  90.100 -            if (bufP != BUF) {
  90.101 -                free(bufP);
  90.102 -            }
  90.103 +        if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
  90.104 +            if (bufP != BUF) { free(bufP); }
  90.105              return;
  90.106          }
  90.107          jInOfs += chunkLen;
  90.108 @@ -229,7 +240,7 @@
  90.109      ckKeyHandle = jLongToCKULong(jKeyHandle);
  90.110  
  90.111      rv = (*ckpFunctions->C_DigestKey)(ckSessionHandle, ckKeyHandle);
  90.112 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
  90.113 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
  90.114  }
  90.115  #endif
  90.116  
  90.117 @@ -257,10 +268,9 @@
  90.118      ckSessionHandle = jLongToCKULong(jSessionHandle);
  90.119  
  90.120      rv = (*ckpFunctions->C_DigestFinal)(ckSessionHandle, BUF, &ckDigestLength);
  90.121 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return 0 ; }
  90.122 -
  90.123 -    (*env)->SetByteArrayRegion(env, jDigest, jDigestOfs, ckDigestLength, (jbyte *)BUF);
  90.124 -
  90.125 +    if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
  90.126 +        (*env)->SetByteArrayRegion(env, jDigest, jDigestOfs, ckDigestLength, (jbyte *)BUF);
  90.127 +    }
  90.128      return ckDigestLength;
  90.129  }
  90.130  #endif
  90.131 @@ -288,12 +298,13 @@
  90.132  
  90.133      ckSessionHandle = jLongToCKULong(jSessionHandle);
  90.134      jByteArrayToCKByteArray(env, jSeed, &ckpSeed, &ckSeedLength);
  90.135 +    if ((*env)->ExceptionCheck(env)) { return; }
  90.136  
  90.137      rv = (*ckpFunctions->C_SeedRandom)(ckSessionHandle, ckpSeed, ckSeedLength);
  90.138  
  90.139      free(ckpSeed);
  90.140  
  90.141 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
  90.142 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
  90.143  }
  90.144  #endif
  90.145  
  90.146 @@ -322,6 +333,7 @@
  90.147  
  90.148      jRandomBufferLength = (*env)->GetArrayLength(env, jRandomData);
  90.149      jRandomBuffer = (*env)->GetByteArrayElements(env, jRandomData, NULL);
  90.150 +    if (jRandomBuffer == NULL) { return; }
  90.151  
  90.152      rv = (*ckpFunctions->C_GenerateRandom)(ckSessionHandle,
  90.153                                           (CK_BYTE_PTR) jRandomBuffer,
  90.154 @@ -330,6 +342,6 @@
  90.155      /* copy back generated bytes */
  90.156      (*env)->ReleaseByteArrayElements(env, jRandomData, jRandomBuffer, 0);
  90.157  
  90.158 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
  90.159 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
  90.160  }
  90.161  #endif
    91.1 --- a/src/share/native/sun/security/pkcs11/wrapper/p11_dual.c	Thu Apr 02 10:16:53 2009 -0700
    91.2 +++ b/src/share/native/sun/security/pkcs11/wrapper/p11_dual.c	Wed Apr 08 15:40:56 2009 -0700
    91.3 @@ -1,5 +1,5 @@
    91.4  /*
    91.5 - * Portions Copyright 2003-2007 Sun Microsystems, Inc.  All Rights Reserved.
    91.6 + * Portions Copyright 2003-2009 Sun Microsystems, Inc.  All Rights Reserved.
    91.7   */
    91.8  
    91.9  /* Copyright  (c) 2002 Graz University of Technology. All rights reserved.
   91.10 @@ -73,7 +73,7 @@
   91.11      CK_SESSION_HANDLE ckSessionHandle;
   91.12      CK_BYTE_PTR ckpPart = NULL_PTR, ckpEncryptedPart;
   91.13      CK_ULONG ckPartLength, ckEncryptedPartLength = 0;
   91.14 -    jbyteArray jEncryptedPart;
   91.15 +    jbyteArray jEncryptedPart = NULL;
   91.16      CK_RV rv;
   91.17  
   91.18      CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
   91.19 @@ -81,20 +81,28 @@
   91.20  
   91.21      ckSessionHandle = jLongToCKULong(jSessionHandle);
   91.22      jByteArrayToCKByteArray(env, jPart, &ckpPart, &ckPartLength);
   91.23 +    if ((*env)->ExceptionCheck(env)) { return NULL; }
   91.24  
   91.25      rv = (*ckpFunctions->C_DigestEncryptUpdate)(ckSessionHandle, ckpPart, ckPartLength, NULL_PTR, &ckEncryptedPartLength);
   91.26 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
   91.27 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
   91.28 +        free(ckpPart);
   91.29 +        return NULL;
   91.30 +    }
   91.31  
   91.32      ckpEncryptedPart = (CK_BYTE_PTR) malloc(ckEncryptedPartLength * sizeof(CK_BYTE));
   91.33 +    if (ckpEncryptedPart == NULL) {
   91.34 +        free(ckpPart);
   91.35 +        JNU_ThrowOutOfMemoryError(env, 0);
   91.36 +        return NULL;
   91.37 +    }
   91.38  
   91.39      rv = (*ckpFunctions->C_DigestEncryptUpdate)(ckSessionHandle, ckpPart, ckPartLength, ckpEncryptedPart, &ckEncryptedPartLength);
   91.40 -
   91.41 -    jEncryptedPart = ckByteArrayToJByteArray(env, ckpEncryptedPart, ckEncryptedPartLength);
   91.42 +    if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
   91.43 +        jEncryptedPart = ckByteArrayToJByteArray(env, ckpEncryptedPart, ckEncryptedPartLength);
   91.44 +    }
   91.45      free(ckpPart);
   91.46      free(ckpEncryptedPart);
   91.47  
   91.48 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
   91.49 -
   91.50      return jEncryptedPart ;
   91.51  }
   91.52  #endif
   91.53 @@ -117,7 +125,7 @@
   91.54      CK_SESSION_HANDLE ckSessionHandle;
   91.55      CK_BYTE_PTR ckpPart, ckpEncryptedPart = NULL_PTR;
   91.56      CK_ULONG ckPartLength = 0, ckEncryptedPartLength;
   91.57 -    jbyteArray jPart;
   91.58 +    jbyteArray jPart = NULL;
   91.59      CK_RV rv;
   91.60  
   91.61      CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
   91.62 @@ -125,19 +133,27 @@
   91.63  
   91.64      ckSessionHandle = jLongToCKULong(jSessionHandle);
   91.65      jByteArrayToCKByteArray(env, jEncryptedPart, &ckpEncryptedPart, &ckEncryptedPartLength);
   91.66 +    if ((*env)->ExceptionCheck(env)) { return NULL; }
   91.67  
   91.68      rv = (*ckpFunctions->C_DecryptDigestUpdate)(ckSessionHandle, ckpEncryptedPart, ckEncryptedPartLength, NULL_PTR, &ckPartLength);
   91.69 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL; }
   91.70 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
   91.71 +        free(ckpEncryptedPart);
   91.72 +        return NULL;
   91.73 +    }
   91.74  
   91.75      ckpPart = (CK_BYTE_PTR) malloc(ckPartLength * sizeof(CK_BYTE));
   91.76 +    if (ckpPart == NULL) {
   91.77 +        free(ckpEncryptedPart);
   91.78 +        JNU_ThrowOutOfMemoryError(env, 0);
   91.79 +        return NULL;
   91.80 +    }
   91.81  
   91.82      rv = (*ckpFunctions->C_DecryptDigestUpdate)(ckSessionHandle, ckpEncryptedPart, ckEncryptedPartLength, ckpPart, &ckPartLength);
   91.83 -
   91.84 -    jPart = ckByteArrayToJByteArray(env, ckpPart, ckPartLength);
   91.85 +    if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
   91.86 +        jPart = ckByteArrayToJByteArray(env, ckpPart, ckPartLength);
   91.87 +    }
   91.88 +    free(ckpEncryptedPart);
   91.89      free(ckpPart);
   91.90 -    free(ckpEncryptedPart);
   91.91 -
   91.92 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
   91.93  
   91.94      return jPart ;
   91.95  }
   91.96 @@ -161,7 +177,7 @@
   91.97      CK_SESSION_HANDLE ckSessionHandle;
   91.98      CK_BYTE_PTR ckpPart = NULL_PTR, ckpEncryptedPart;
   91.99      CK_ULONG ckPartLength, ckEncryptedPartLength = 0;
  91.100 -    jbyteArray jEncryptedPart;
  91.101 +    jbyteArray jEncryptedPart = NULL;
  91.102      CK_RV rv;
  91.103  
  91.104      CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
  91.105 @@ -169,20 +185,28 @@
  91.106  
  91.107      ckSessionHandle = jLongToCKULong(jSessionHandle);
  91.108      jByteArrayToCKByteArray(env, jPart, &ckpPart, &ckPartLength);
  91.109 +    if ((*env)->ExceptionCheck(env)) { return NULL; }
  91.110  
  91.111      rv = (*ckpFunctions->C_SignEncryptUpdate)(ckSessionHandle, ckpPart, ckPartLength, NULL_PTR, &ckEncryptedPartLength);
  91.112 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
  91.113 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
  91.114 +        free(ckpPart);
  91.115 +        return NULL;
  91.116 +    }
  91.117  
  91.118      ckpEncryptedPart = (CK_BYTE_PTR) malloc(ckEncryptedPartLength * sizeof(CK_BYTE));
  91.119 +    if (ckpEncryptedPart == NULL) {
  91.120 +        free(ckpPart);
  91.121 +        JNU_ThrowOutOfMemoryError(env, 0);
  91.122 +        return NULL;
  91.123 +    }
  91.124  
  91.125      rv = (*ckpFunctions->C_SignEncryptUpdate)(ckSessionHandle, ckpPart, ckPartLength, ckpEncryptedPart, &ckEncryptedPartLength);
  91.126 -
  91.127 -    jEncryptedPart = ckByteArrayToJByteArray(env, ckpEncryptedPart, ckEncryptedPartLength);
  91.128 +    if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
  91.129 +        jEncryptedPart = ckByteArrayToJByteArray(env, ckpEncryptedPart, ckEncryptedPartLength);
  91.130 +    }
  91.131      free(ckpPart);
  91.132      free(ckpEncryptedPart);
  91.133  
  91.134 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
  91.135 -
  91.136      return jEncryptedPart ;
  91.137  }
  91.138  #endif
  91.139 @@ -205,7 +229,7 @@
  91.140      CK_SESSION_HANDLE ckSessionHandle;
  91.141      CK_BYTE_PTR ckpPart, ckpEncryptedPart = NULL_PTR;
  91.142      CK_ULONG ckPartLength = 0, ckEncryptedPartLength;
  91.143 -    jbyteArray jPart;
  91.144 +    jbyteArray jPart = NULL;
  91.145      CK_RV rv;
  91.146  
  91.147      CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
  91.148 @@ -213,19 +237,28 @@
  91.149  
  91.150      ckSessionHandle = jLongToCKULong(jSessionHandle);
  91.151      jByteArrayToCKByteArray(env, jEncryptedPart, &ckpEncryptedPart, &ckEncryptedPartLength);
  91.152 +    if ((*env)->ExceptionCheck(env)) { return NULL; }
  91.153  
  91.154      rv = (*ckpFunctions->C_DecryptVerifyUpdate)(ckSessionHandle, ckpEncryptedPart, ckEncryptedPartLength, NULL_PTR, &ckPartLength);
  91.155 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
  91.156 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
  91.157 +        free(ckpEncryptedPart);
  91.158 +        return NULL;
  91.159 +    }
  91.160  
  91.161      ckpPart = (CK_BYTE_PTR) malloc(ckPartLength * sizeof(CK_BYTE));
  91.162 +    if (ckpPart == NULL) {
  91.163 +        free(ckpEncryptedPart);
  91.164 +        JNU_ThrowOutOfMemoryError(env, 0);
  91.165 +        return NULL;
  91.166 +    }
  91.167  
  91.168      rv = (*ckpFunctions->C_DecryptVerifyUpdate)(ckSessionHandle, ckpEncryptedPart, ckEncryptedPartLength, ckpPart, &ckPartLength);
  91.169  
  91.170 -    jPart = ckByteArrayToJByteArray(env, ckpPart, ckPartLength);
  91.171 +    if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
  91.172 +        jPart = ckByteArrayToJByteArray(env, ckpPart, ckPartLength);
  91.173 +    }
  91.174 +    free(ckpEncryptedPart);
  91.175      free(ckpPart);
  91.176 -    free(ckpEncryptedPart);
  91.177 -
  91.178 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
  91.179  
  91.180      return jPart ;
  91.181  }
  91.182 @@ -252,7 +285,7 @@
  91.183  
  91.184      /* C_GetFunctionStatus should always return CKR_FUNCTION_NOT_PARALLEL */
  91.185      rv = (*ckpFunctions->C_GetFunctionStatus)(ckSessionHandle);
  91.186 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
  91.187 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
  91.188  }
  91.189  #endif
  91.190  
  91.191 @@ -277,6 +310,6 @@
  91.192  
  91.193      /* C_GetFunctionStatus should always return CKR_FUNCTION_NOT_PARALLEL */
  91.194      rv = (*ckpFunctions->C_CancelFunction)(ckSessionHandle);
  91.195 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
  91.196 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
  91.197  }
  91.198  #endif
    92.1 --- a/src/share/native/sun/security/pkcs11/wrapper/p11_general.c	Thu Apr 02 10:16:53 2009 -0700
    92.2 +++ b/src/share/native/sun/security/pkcs11/wrapper/p11_general.c	Wed Apr 08 15:40:56 2009 -0700
    92.3 @@ -1,5 +1,5 @@
    92.4  /*
    92.5 - * Portions Copyright 2003-2006 Sun Microsystems, Inc.  All Rights Reserved.
    92.6 + * Portions Copyright 2003-2009 Sun Microsystems, Inc.  All Rights Reserved.
    92.7   */
    92.8  
    92.9  /* Copyright  (c) 2002 Graz University of Technology. All rights reserved.
   92.10 @@ -102,6 +102,7 @@
   92.11  
   92.12  jclass fetchClass(JNIEnv *env, const char *name) {
   92.13      jclass tmpClass = (*env)->FindClass(env, name);
   92.14 +    if (tmpClass == NULL) { return NULL; }
   92.15      return (*env)->NewGlobalRef(env, tmpClass);
   92.16  }
   92.17  
   92.18 @@ -110,14 +111,18 @@
   92.19  
   92.20      /* PKCS11 */
   92.21      pNativeDataID = (*env)->GetFieldID(env, thisClass, "pNativeData", "J");
   92.22 +    if (pNativeDataID == NULL) { return; }
   92.23  
   92.24      /* CK_MECHANISM */
   92.25      tmpClass = (*env)->FindClass(env, CLASS_MECHANISM);
   92.26 +    if (tmpClass == NULL) { return; }
   92.27      mech_mechanismID = (*env)->GetFieldID(env, tmpClass, "mechanism", "J");
   92.28 +    if (mech_mechanismID == NULL) { return; }
   92.29      mech_pParameterID = (*env)->GetFieldID(env, tmpClass, "pParameter",
   92.30                                             "Ljava/lang/Object;");
   92.31 -
   92.32 +    if (mech_pParameterID == NULL) { return; }
   92.33      jByteArrayClass = fetchClass(env, "[B");
   92.34 +    if (jByteArrayClass == NULL) { return; }
   92.35      jLongClass = fetchClass(env, "java/lang/Long");
   92.36  }
   92.37  
   92.38 @@ -252,10 +257,9 @@
   92.39      if (ckpFunctions == NULL) { return NULL; }
   92.40  
   92.41      rv = (*ckpFunctions->C_GetInfo)(&ckLibInfo);
   92.42 -    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
   92.43 -
   92.44 -    jInfoObject = ckInfoPtrToJInfo(env, &ckLibInfo);
   92.45 -
   92.46 +    if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
   92.47 +        jInfoObject = ckInfoPtrToJInfo(env, &ckLibInfo);
   92.48 +    }
   92.49      return jInfoObject ;
   92.50  }
   92.51  
   92.52 @@ -279,28 +283,31 @@
   92.53  
   92.54      /* load CK_INFO class */
   92.55      jInfoClass = (*env)->FindClass(env, CLASS_INFO);
   92.56 -    assert(jInfoClass != 0);
   92.57 +    if (jInfoClass == NULL) { return NULL; };
   92.58  
   92.59      /* load CK_INFO constructor */
   92.60      jCtrId = (*env)->GetMethodID
   92.61        (env, jInfoClass, "<init>",
   92.62         "(Lsun/security/pkcs11/wrapper/CK_VERSION;[CJ[CLsun/security/pkcs11/wrapper/CK_VERSION;)V");
   92.63 -
   92.64 -    assert(jCtrId != 0);
   92.65 +    if (jCtrId == NULL) { return NULL; }
   92.66  
   92.67      /* prep all fields */
   92.68      jCryptokiVer = ckVersionPtrToJVersion(env, &(ckpInfo->cryptokiVersion));
   92.69 +    if (jCryptokiVer == NULL) { return NULL; }
   92.70      jVendor =
   92.71        ckUTF8CharArrayToJCharArray(env, &(ckpInfo->manufacturerID[0]), 32);
   92.72 +    if (jVendor == NULL) { return NULL; }
   92.73      jFlags = ckULongToJLong(ckpInfo->flags);
   92.74      jLibraryDesc =
   92.75        ckUTF8CharArrayToJCharArray(env, &(ckpInfo->libraryDescription[0]), 32);
   92.76 +    if (jLibraryDesc == NULL) { return NULL; }
   92.77      jLibraryVer = ckVersionPtrToJVersion(env, &(ckpInfo->libraryVersion));
   92.78 +    if (jLibraryVer == NULL) { return NULL; }
   92.79  
   92.80      /* create new CK_INFO object */
   92.81      jInfoObject = (*env)->NewObject(env, jInfoClass, jCtrId, jCryptokiVer,
   92.82                                      jVendor, jFlags, jLibraryDesc, jLibraryVer);
   92.83 -    assert(jInfoObject != 0);
   92.84 +    if (jInfoObject == NULL) { return NULL; }
   92.85  
   92.86      /* free local references */
   92.87      (*env)->DeleteLocalRef(env, jInfoClass);
   92.88 @@ -343,15 +350,18 @@
   92.89      if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
   92.90  
   92.91      ckpSlotList = (CK_SLOT_ID_PTR) malloc(ckTokenNumber * sizeof(CK_SLOT_ID));
   92.92 +    if (ckpSlotList == NULL) {
   92.93 +        JNU_ThrowOutOfMemoryError(env, 0);
   92.94 +        return NULL;
   92.95 +    }
   92.96  
   92.97      rv = (*ckpFunctions->C_GetSlotList)(ckTokenPresent, ckpSlotList,
   92.98                                          &ckTokenNumber);
   92.99 -
  92.100 -    jSlotList = ckULongArrayToJLongArray(env, ckpSlotList, ckTokenNumber);
  92.101 +    if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
  92.102 +        jSlotList = ckULongArrayToJLongArray(env, ckpSlotList, ckTokenNumber);
  92.103 +    }
  92.104      free(ckpSlotList);
  92.105  
  92.106 -    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
  92.107 -
  92.108      return jSlotList ;
  92.109  }
  92.110  #endif
  92.111 @@ -380,10 +390,9 @@
  92.112      ckSlotID = jLongToCKULong(jSlotID);
  92.113  
  92.114      rv = (*ckpFunctions->C_GetSlotInfo)(ckSlotID, &ckSlotInfo);
  92.115 -    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
  92.116 -
  92.117 -    jSlotInfoObject = ckSlotInfoPtrToJSlotInfo(env, &ckSlotInfo);
  92.118 -
  92.119 +    if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
  92.120 +        jSlotInfoObject = ckSlotInfoPtrToJSlotInfo(env, &ckSlotInfo);
  92.121 +    }
  92.122      return jSlotInfoObject ;
  92.123  }
  92.124  
  92.125 @@ -410,28 +419,32 @@
  92.126  
  92.127      /* load CK_SLOT_INFO class */
  92.128      jSlotInfoClass = (*env)->FindClass(env, CLASS_SLOT_INFO);
  92.129 -    assert(jSlotInfoClass != 0);
  92.130 +    if (jSlotInfoClass == NULL) { return NULL; };
  92.131  
  92.132      /* load CK_SLOT_INFO constructor */
  92.133      jCtrId = (*env)->GetMethodID
  92.134        (env, jSlotInfoClass, "<init>",
  92.135         "([C[CJLsun/security/pkcs11/wrapper/CK_VERSION;Lsun/security/pkcs11/wrapper/CK_VERSION;)V");
  92.136 -    assert(jCtrId != 0);
  92.137 +    if (jCtrId == NULL) { return NULL; }
  92.138  
  92.139      /* prep all fields */
  92.140      jSlotDesc =
  92.141        ckUTF8CharArrayToJCharArray(env, &(ckpSlotInfo->slotDescription[0]), 64);
  92.142 +    if (jSlotDesc == NULL) { return NULL; }
  92.143      jVendor =
  92.144        ckUTF8CharArrayToJCharArray(env, &(ckpSlotInfo->manufacturerID[0]), 32);
  92.145 +    if (jVendor == NULL) { return NULL; }
  92.146      jFlags = ckULongToJLong(ckpSlotInfo->flags);
  92.147      jHardwareVer = ckVersionPtrToJVersion(env, &(ckpSlotInfo->hardwareVersion));
  92.148 +    if (jHardwareVer == NULL) { return NULL; }
  92.149      jFirmwareVer = ckVersionPtrToJVersion(env, &(ckpSlotInfo->firmwareVersion));
  92.150 +    if (jFirmwareVer == NULL) { return NULL; }
  92.151  
  92.152      /* create new CK_SLOT_INFO object */
  92.153      jSlotInfoObject = (*env)->NewObject
  92.154        (env, jSlotInfoClass, jCtrId, jSlotDesc, jVendor, jFlags,
  92.155         jHardwareVer, jFirmwareVer);
  92.156 -    assert(jSlotInfoObject != 0);
  92.157 +    if (jSlotInfoObject == NULL) { return NULL; }
  92.158  
  92.159      /* free local references */
  92.160      (*env)->DeleteLocalRef(env, jSlotInfoClass);
  92.161 @@ -460,7 +473,7 @@
  92.162  {
  92.163      CK_SLOT_ID ckSlotID;
  92.164      CK_TOKEN_INFO ckTokenInfo;
  92.165 -    jobject jInfoTokenObject;
  92.166 +    jobject jInfoTokenObject = NULL;
  92.167      CK_RV rv;
  92.168  
  92.169      CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
  92.170 @@ -469,10 +482,9 @@
  92.171      ckSlotID = jLongToCKULong(jSlotID);
  92.172  
  92.173      rv = (*ckpFunctions->C_GetTokenInfo)(ckSlotID, &ckTokenInfo);
  92.174 -    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
  92.175 -
  92.176 -    jInfoTokenObject = ckTokenInfoPtrToJTokenInfo(env, &ckTokenInfo);
  92.177 -
  92.178 +    if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
  92.179 +        jInfoTokenObject = ckTokenInfoPtrToJTokenInfo(env, &ckTokenInfo);
  92.180 +    }
  92.181      return jInfoTokenObject ;
  92.182  }
  92.183  
  92.184 @@ -512,21 +524,25 @@
  92.185  
  92.186      /* load CK_TOKEN_INFO class */
  92.187      jTokenInfoClass = (*env)->FindClass(env, CLASS_TOKEN_INFO);
  92.188 -    assert(jTokenInfoClass != 0);
  92.189 +    if (jTokenInfoClass == NULL)  { return NULL; };
  92.190  
  92.191      /* load CK_TOKEN_INFO constructor */
  92.192      jCtrId = (*env)->GetMethodID
  92.193        (env, jTokenInfoClass, "<init>",
  92.194         "([C[C[C[CJJJJJJJJJJJLsun/security/pkcs11/wrapper/CK_VERSION;Lsun/security/pkcs11/wrapper/CK_VERSION;[C)V");
  92.195 -    assert(jCtrId != 0);
  92.196 +    if (jCtrId == NULL)  { return NULL; };
  92.197  
  92.198      /* prep all fields */
  92.199      jLabel = ckUTF8CharArrayToJCharArray(env, &(ckpTokenInfo->label[0]), 32);
  92.200 +    if (jLabel == NULL)  { return NULL; };
  92.201      jVendor =
  92.202        ckUTF8CharArrayToJCharArray(env, &(ckpTokenInfo->manufacturerID[0]), 32);
  92.203 +    if (jVendor == NULL)  { return NULL; };
  92.204      jModel = ckUTF8CharArrayToJCharArray(env, &(ckpTokenInfo->model[0]), 16);
  92.205 +    if (jModel == NULL)  { return NULL; };
  92.206      jSerialNo =
  92.207        ckUTF8CharArrayToJCharArray(env, &(ckpTokenInfo->serialNumber[0]), 16);
  92.208 +    if (jSerialNo == NULL)  { return NULL; };
  92.209      jFlags = ckULongToJLong(ckpTokenInfo->flags);
  92.210      jMaxSnCnt = ckULongSpecialToJLong(ckpTokenInfo->ulMaxSessionCount);
  92.211      jSnCnt = ckULongSpecialToJLong(ckpTokenInfo->ulSessionCount);
  92.212 @@ -540,10 +556,13 @@
  92.213      jFreePrivMem = ckULongSpecialToJLong(ckpTokenInfo->ulFreePrivateMemory);
  92.214      jHardwareVer =
  92.215        ckVersionPtrToJVersion(env, &(ckpTokenInfo->hardwareVersion));
  92.216 +    if (jHardwareVer == NULL) { return NULL; }
  92.217      jFirmwareVer =
  92.218        ckVersionPtrToJVersion(env, &(ckpTokenInfo->firmwareVersion));
  92.219 +    if (jFirmwareVer == NULL) { return NULL; }
  92.220      jUtcTime =
  92.221        ckUTF8CharArrayToJCharArray(env, &(ckpTokenInfo->utcTime[0]), 16);
  92.222 +    if (jUtcTime == NULL) { return NULL; }
  92.223  
  92.224      /* create new CK_TOKEN_INFO object */
  92.225      jTokenInfoObject =
  92.226 @@ -553,7 +572,7 @@
  92.227                          jMaxPinLen, jMinPinLen,
  92.228                          jTotalPubMem, jFreePubMem, jTotalPrivMem, jFreePrivMem,
  92.229                          jHardwareVer, jFirmwareVer, jUtcTime);
  92.230 -    assert(jTokenInfoObject != 0);
  92.231 +    if (jTokenInfoObject == NULL) { return NULL; }
  92.232  
  92.233      /* free local references */
  92.234      (*env)->DeleteLocalRef(env, jTokenInfoClass);
  92.235 @@ -584,7 +603,7 @@
  92.236  {
  92.237      CK_FLAGS ckFlags;
  92.238      CK_SLOT_ID ckSlotID;
  92.239 -    jlong jSlotID;
  92.240 +    jlong jSlotID = 0L;
  92.241      CK_RV rv;
  92.242  
  92.243      CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
  92.244 @@ -593,9 +612,9 @@
  92.245      ckFlags = jLongToCKULong(jFlags);
  92.246  
  92.247      rv = (*ckpFunctions->C_WaitForSlotEvent)(ckFlags, &ckSlotID, NULL_PTR);
  92.248 -    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return 0L; }
  92.249 -
  92.250 -    jSlotID = ckULongToJLong(ckSlotID);
  92.251 +    if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
  92.252 +        jSlotID = ckULongToJLong(ckSlotID);
  92.253 +    }
  92.254  
  92.255      return jSlotID ;
  92.256  }
  92.257 @@ -632,16 +651,19 @@
  92.258  
  92.259      ckpMechanismList = (CK_MECHANISM_TYPE_PTR)
  92.260        malloc(ckMechanismNumber * sizeof(CK_MECHANISM_TYPE));
  92.261 +    if (ckpMechanismList == NULL) {
  92.262 +        JNU_ThrowOutOfMemoryError(env, 0);
  92.263 +        return NULL;
  92.264 +    }
  92.265  
  92.266      rv = (*ckpFunctions->C_GetMechanismList)(ckSlotID, ckpMechanismList,
  92.267                                               &ckMechanismNumber);
  92.268 -
  92.269 -    jMechanismList = ckULongArrayToJLongArray(env, ckpMechanismList,
  92.270 -                                              ckMechanismNumber);
  92.271 +    if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
  92.272 +        jMechanismList = ckULongArrayToJLongArray(env, ckpMechanismList,
  92.273 +                                                  ckMechanismNumber);
  92.274 +    }
  92.275      free(ckpMechanismList);
  92.276  
  92.277 -    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
  92.278 -
  92.279      return jMechanismList ;
  92.280  }
  92.281  #endif
  92.282 @@ -663,7 +685,7 @@
  92.283      CK_SLOT_ID ckSlotID;
  92.284      CK_MECHANISM_TYPE ckMechanismType;
  92.285      CK_MECHANISM_INFO ckMechanismInfo;
  92.286 -    jobject jMechanismInfo;
  92.287 +    jobject jMechanismInfo = NULL;
  92.288      CK_RV rv;
  92.289  
  92.290      CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
  92.291 @@ -674,10 +696,9 @@
  92.292  
  92.293      rv = (*ckpFunctions->C_GetMechanismInfo)(ckSlotID, ckMechanismType,
  92.294                                               &ckMechanismInfo);
  92.295 -    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
  92.296 -
  92.297 -    jMechanismInfo = ckMechanismInfoPtrToJMechanismInfo(env, &ckMechanismInfo);
  92.298 -
  92.299 +    if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
  92.300 +        jMechanismInfo = ckMechanismInfoPtrToJMechanismInfo(env, &ckMechanismInfo);
  92.301 +    }
  92.302      return jMechanismInfo ;
  92.303  }
  92.304  
  92.305 @@ -703,11 +724,11 @@
  92.306  
  92.307      /* load CK_MECHANISM_INFO class */
  92.308      jMechanismInfoClass = (*env)->FindClass(env, CLASS_MECHANISM_INFO);
  92.309 -    assert(jMechanismInfoClass != 0);
  92.310 +    if (jMechanismInfoClass == NULL) { return NULL; };
  92.311  
  92.312      /* load CK_MECHANISM_INFO constructor */
  92.313      jCtrId = (*env)->GetMethodID(env, jMechanismInfoClass, "<init>", "(JJJ)V");
  92.314 -    assert(jCtrId != 0);
  92.315 +    if (jCtrId == NULL) { return NULL; };
  92.316  
  92.317      /* prep all fields */
  92.318      jMinKeySize = ckULongToJLong(ckpMechanismInfo->ulMinKeySize);
  92.319 @@ -717,7 +738,7 @@
  92.320      /* create new CK_MECHANISM_INFO object */
  92.321      jMechanismInfoObject = (*env)->NewObject(env, jMechanismInfoClass, jCtrId,
  92.322                                               jMinKeySize, jMaxKeySize, jFlags);
  92.323 -    assert(jMechanismInfoObject != 0);
  92.324 +    if (jMechanismInfoObject == NULL) { return NULL; };
  92.325  
  92.326      /* free local references */
  92.327      (*env)->DeleteLocalRef(env, jMechanismInfoClass);
  92.328 @@ -753,8 +774,13 @@
  92.329  
  92.330      ckSlotID = jLongToCKULong(jSlotID);
  92.331      jCharArrayToCKCharArray(env, jPin, &ckpPin, &ckPinLength);
  92.332 +    if ((*env)->ExceptionCheck(env)) { return; }
  92.333 +    /* ckLabelLength <= 32 !!! */
  92.334      jCharArrayToCKUTF8CharArray(env, jLabel, &ckpLabel, &ckLabelLength);
  92.335 -    /* ckLabelLength <= 32 !!! */
  92.336 +    if ((*env)->ExceptionCheck(env)) {
  92.337 +        free(ckpPin);
  92.338 +        return;
  92.339 +    }
  92.340  
  92.341      rv = (*ckpFunctions->C_InitToken)(ckSlotID, ckpPin, ckPinLength, ckpLabel);
  92.342      TRACE1("InitToken return code: %d", rv);
  92.343 @@ -790,6 +816,7 @@
  92.344  
  92.345      ckSessionHandle = jLongToCKULong(jSessionHandle);
  92.346      jCharArrayToCKCharArray(env, jPin, &ckpPin, &ckPinLength);
  92.347 +    if ((*env)->ExceptionCheck(env)) { return; }
  92.348  
  92.349      rv = (*ckpFunctions->C_InitPIN)(ckSessionHandle, ckpPin, ckPinLength);
  92.350  
  92.351 @@ -828,7 +855,12 @@
  92.352  
  92.353      ckSessionHandle = jLongToCKULong(jSessionHandle);
  92.354      jCharArrayToCKCharArray(env, jOldPin, &ckpOldPin, &ckOldPinLength);
  92.355 +    if ((*env)->ExceptionCheck(env)) { return; }
  92.356      jCharArrayToCKCharArray(env, jNewPin, &ckpNewPin, &ckNewPinLength);
  92.357 +    if ((*env)->ExceptionCheck(env)) {
  92.358 +        free(ckpOldPin);
  92.359 +        return;
  92.360 +    }
  92.361  
  92.362      rv = (*ckpFunctions->C_SetPIN)(ckSessionHandle, ckpOldPin, ckOldPinLength,
  92.363                                     ckpNewPin, ckNewPinLength);
    93.1 --- a/src/share/native/sun/security/pkcs11/wrapper/p11_keymgmt.c	Thu Apr 02 10:16:53 2009 -0700
    93.2 +++ b/src/share/native/sun/security/pkcs11/wrapper/p11_keymgmt.c	Wed Apr 08 15:40:56 2009 -0700
    93.3 @@ -1,5 +1,5 @@
    93.4  /*
    93.5 - * Portions Copyright 2003-2006 Sun Microsystems, Inc.  All Rights Reserved.
    93.6 + * Portions Copyright 2003-2009 Sun Microsystems, Inc.  All Rights Reserved.
    93.7   */
    93.8  
    93.9  /* Copyright  (c) 2002 Graz University of Technology. All rights reserved.
   93.10 @@ -74,7 +74,7 @@
   93.11      CK_ATTRIBUTE_PTR ckpAttributes = NULL_PTR;
   93.12      CK_ULONG ckAttributesLength;
   93.13      CK_OBJECT_HANDLE ckKeyHandle;
   93.14 -    jlong jKeyHandle;
   93.15 +    jlong jKeyHandle = 0L;
   93.16      CK_ULONG i;
   93.17      CK_RV rv;
   93.18  
   93.19 @@ -83,21 +83,23 @@
   93.20  
   93.21      ckSessionHandle = jLongToCKULong(jSessionHandle);
   93.22      jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
   93.23 -    if ((*env)->ExceptionOccurred(env)) { return 0L ; }
   93.24 +    if ((*env)->ExceptionCheck(env)) { return 0L ; }
   93.25 +
   93.26      jAttributeArrayToCKAttributeArray(env, jTemplate, &ckpAttributes, &ckAttributesLength);
   93.27 +    if ((*env)->ExceptionCheck(env)) {
   93.28 +        if (ckMechanism.pParameter != NULL_PTR) {
   93.29 +            free(ckMechanism.pParameter);
   93.30 +        }
   93.31 +        return 0L;
   93.32 +    }
   93.33  
   93.34      rv = (*ckpFunctions->C_GenerateKey)(ckSessionHandle, &ckMechanism, ckpAttributes, ckAttributesLength, &ckKeyHandle);
   93.35  
   93.36 -    jKeyHandle = ckULongToJLong(ckKeyHandle);
   93.37 -    for(i=0; i<ckAttributesLength; i++) {
   93.38 -        if(ckpAttributes[i].pValue != NULL_PTR) {
   93.39 -            free(ckpAttributes[i].pValue);
   93.40 -        }
   93.41 -    }
   93.42 -    free(ckpAttributes);
   93.43 +    if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
   93.44 +        jKeyHandle = ckULongToJLong(ckKeyHandle);
   93.45  
   93.46 -    /* cheack, if we must give a initialization vector back to Java */
   93.47 -    switch (ckMechanism.mechanism) {
   93.48 +        /* cheack, if we must give a initialization vector back to Java */
   93.49 +        switch (ckMechanism.mechanism) {
   93.50          case CKM_PBE_MD2_DES_CBC:
   93.51          case CKM_PBE_MD5_DES_CBC:
   93.52          case CKM_PBE_MD5_CAST_CBC:
   93.53 @@ -109,13 +111,13 @@
   93.54              /* we must copy back the initialization vector to the jMechanism object */
   93.55              copyBackPBEInitializationVector(env, &ckMechanism, jMechanism);
   93.56              break;
   93.57 +        }
   93.58      }
   93.59  
   93.60 -    if(ckMechanism.pParameter != NULL_PTR) {
   93.61 +    if (ckMechanism.pParameter != NULL_PTR) {
   93.62          free(ckMechanism.pParameter);
   93.63      }
   93.64 -
   93.65 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return 0L ; }
   93.66 +    freeCKAttributeArray(ckpAttributes, ckAttributesLength);
   93.67  
   93.68      return jKeyHandle ;
   93.69  }
   93.70 @@ -158,40 +160,53 @@
   93.71  
   93.72      ckSessionHandle = jLongToCKULong(jSessionHandle);
   93.73      jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
   93.74 -    jAttributeArrayToCKAttributeArray(env, jPublicKeyTemplate, &ckpPublicKeyAttributes, &ckPublicKeyAttributesLength);
   93.75 -    jAttributeArrayToCKAttributeArray(env, jPrivateKeyTemplate, &ckpPrivateKeyAttributes, &ckPrivateKeyAttributesLength);
   93.76 +    if ((*env)->ExceptionCheck(env)) { return NULL; }
   93.77 +
   93.78      ckpKeyHandles = (CK_OBJECT_HANDLE_PTR) malloc(2 * sizeof(CK_OBJECT_HANDLE));
   93.79 +    if (ckpKeyHandles == NULL) {
   93.80 +        if (ckMechanism.pParameter != NULL_PTR) {
   93.81 +            free(ckMechanism.pParameter);
   93.82 +        }
   93.83 +        JNU_ThrowOutOfMemoryError(env, 0);
   93.84 +        return NULL;
   93.85 +    }
   93.86      ckpPublicKeyHandle = ckpKeyHandles;   /* first element of array is Public Key */
   93.87      ckpPrivateKeyHandle = (ckpKeyHandles + 1);  /* second element of array is Private Key */
   93.88  
   93.89 +    jAttributeArrayToCKAttributeArray(env, jPublicKeyTemplate, &ckpPublicKeyAttributes, &ckPublicKeyAttributesLength);
   93.90 +    if ((*env)->ExceptionCheck(env)) {
   93.91 +        if (ckMechanism.pParameter != NULL_PTR) {
   93.92 +            free(ckMechanism.pParameter);
   93.93 +        }
   93.94 +        free(ckpKeyHandles);
   93.95 +        return NULL;
   93.96 +    }
   93.97 +
   93.98 +    jAttributeArrayToCKAttributeArray(env, jPrivateKeyTemplate, &ckpPrivateKeyAttributes, &ckPrivateKeyAttributesLength);
   93.99 +    if ((*env)->ExceptionCheck(env)) {
  93.100 +        if (ckMechanism.pParameter != NULL_PTR) {
  93.101 +            free(ckMechanism.pParameter);
  93.102 +        }
  93.103 +        free(ckpKeyHandles);
  93.104 +        freeCKAttributeArray(ckpPublicKeyAttributes, ckPublicKeyAttributesLength);
  93.105 +        return NULL;
  93.106 +    }
  93.107 +
  93.108      rv = (*ckpFunctions->C_GenerateKeyPair)(ckSessionHandle, &ckMechanism,
  93.109                       ckpPublicKeyAttributes, ckPublicKeyAttributesLength,
  93.110                       ckpPrivateKeyAttributes, ckPrivateKeyAttributesLength,
  93.111                       ckpPublicKeyHandle, ckpPrivateKeyHandle);
  93.112  
  93.113 -    jKeyHandles = ckULongArrayToJLongArray(env, ckpKeyHandles, 2);
  93.114 -
  93.115 -    for(i=0; i<ckPublicKeyAttributesLength; i++) {
  93.116 -        if(ckpPublicKeyAttributes[i].pValue != NULL_PTR) {
  93.117 -            free(ckpPublicKeyAttributes[i].pValue);
  93.118 -        }
  93.119 +    if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
  93.120 +        jKeyHandles = ckULongArrayToJLongArray(env, ckpKeyHandles, 2);
  93.121      }
  93.122 -    free(ckpPublicKeyAttributes);
  93.123 -
  93.124 -    for(i=0; i<ckPrivateKeyAttributesLength; i++) {
  93.125 -        if(ckpPrivateKeyAttributes[i].pValue != NULL_PTR) {
  93.126 -            free(ckpPrivateKeyAttributes[i].pValue);
  93.127 -        }
  93.128 -    }
  93.129 -    free(ckpPrivateKeyAttributes);
  93.130  
  93.131      if(ckMechanism.pParameter != NULL_PTR) {
  93.132          free(ckMechanism.pParameter);
  93.133      }
  93.134 -
  93.135      free(ckpKeyHandles);
  93.136 -
  93.137 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL; }
  93.138 +    freeCKAttributeArray(ckpPublicKeyAttributes, ckPublicKeyAttributesLength);
  93.139 +    freeCKAttributeArray(ckpPrivateKeyAttributes, ckPrivateKeyAttributesLength);
  93.140  
  93.141      return jKeyHandles ;
  93.142  }
  93.143 @@ -217,7 +232,7 @@
  93.144      CK_MECHANISM ckMechanism;
  93.145      CK_OBJECT_HANDLE ckWrappingKeyHandle;
  93.146      CK_OBJECT_HANDLE ckKeyHandle;
  93.147 -    jbyteArray jWrappedKey;
  93.148 +    jbyteArray jWrappedKey = NULL;
  93.149      CK_RV rv;
  93.150      CK_BYTE BUF[MAX_STACK_BUFFER_LEN];
  93.151      CK_BYTE_PTR ckpWrappedKey = BUF;
  93.152 @@ -228,24 +243,32 @@
  93.153  
  93.154      ckSessionHandle = jLongToCKULong(jSessionHandle);
  93.155      jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
  93.156 +    if ((*env)->ExceptionCheck(env)) { return NULL; }
  93.157 +
  93.158      ckWrappingKeyHandle = jLongToCKULong(jWrappingKeyHandle);
  93.159      ckKeyHandle = jLongToCKULong(jKeyHandle);
  93.160  
  93.161      rv = (*ckpFunctions->C_WrapKey)(ckSessionHandle, &ckMechanism, ckWrappingKeyHandle, ckKeyHandle, ckpWrappedKey, &ckWrappedKeyLength);
  93.162      if (rv == CKR_BUFFER_TOO_SMALL) {
  93.163          ckpWrappedKey = (CK_BYTE_PTR) malloc(ckWrappedKeyLength);
  93.164 +        if (ckpWrappedKey == NULL) {
  93.165 +            if (ckMechanism.pParameter != NULL_PTR) {
  93.166 +                free(ckMechanism.pParameter);
  93.167 +            }
  93.168 +            JNU_ThrowOutOfMemoryError(env, 0);
  93.169 +            return NULL;
  93.170 +        }
  93.171 +
  93.172          rv = (*ckpFunctions->C_WrapKey)(ckSessionHandle, &ckMechanism, ckWrappingKeyHandle, ckKeyHandle, ckpWrappedKey, &ckWrappedKeyLength);
  93.173      }
  93.174      if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
  93.175          jWrappedKey = ckByteArrayToJByteArray(env, ckpWrappedKey, ckWrappedKeyLength);
  93.176      }
  93.177  
  93.178 -    if (ckpWrappedKey != BUF) {
  93.179 -        free(ckpWrappedKey);
  93.180 +    if (ckpWrappedKey != BUF) { free(ckpWrappedKey); }
  93.181 +    if (ckMechanism.pParameter != NULL_PTR) {
  93.182 +        free(ckMechanism.pParameter);
  93.183      }
  93.184 -    if(ckMechanism.pParameter != NULL_PTR)
  93.185 -        free(ckMechanism.pParameter);
  93.186 -
  93.187      return jWrappedKey ;
  93.188  }
  93.189  #endif
  93.190 @@ -277,7 +300,7 @@
  93.191      CK_ATTRIBUTE_PTR ckpAttributes = NULL_PTR;
  93.192      CK_ULONG ckAttributesLength;
  93.193      CK_OBJECT_HANDLE ckKeyHandle;
  93.194 -    jlong jKeyHandle;
  93.195 +    jlong jKeyHandle = 0L;
  93.196      CK_ULONG i;
  93.197      CK_RV rv;
  93.198  
  93.199 @@ -286,37 +309,48 @@
  93.200  
  93.201      ckSessionHandle = jLongToCKULong(jSessionHandle);
  93.202      jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
  93.203 +    if ((*env)->ExceptionCheck(env)) { return 0L; }
  93.204 +
  93.205      ckUnwrappingKeyHandle = jLongToCKULong(jUnwrappingKeyHandle);
  93.206      jByteArrayToCKByteArray(env, jWrappedKey, &ckpWrappedKey, &ckWrappedKeyLength);
  93.207 +    if ((*env)->ExceptionCheck(env)) {
  93.208 +        if (ckMechanism.pParameter != NULL_PTR) {
  93.209 +            free(ckMechanism.pParameter);
  93.210 +        }
  93.211 +        return 0L;
  93.212 +    }
  93.213 +
  93.214      jAttributeArrayToCKAttributeArray(env, jTemplate, &ckpAttributes, &ckAttributesLength);
  93.215 +    if ((*env)->ExceptionCheck(env)) {
  93.216 +        if (ckMechanism.pParameter != NULL_PTR) {
  93.217 +            free(ckMechanism.pParameter);
  93.218 +        }
  93.219 +        free(ckpWrappedKey);
  93.220 +        return 0L;
  93.221 +    }
  93.222 +
  93.223  
  93.224      rv = (*ckpFunctions->C_UnwrapKey)(ckSessionHandle, &ckMechanism, ckUnwrappingKeyHandle,
  93.225                   ckpWrappedKey, ckWrappedKeyLength,
  93.226                   ckpAttributes, ckAttributesLength, &ckKeyHandle);
  93.227  
  93.228 -    jKeyHandle = ckLongToJLong(ckKeyHandle);
  93.229 -
  93.230 -    for(i=0; i<ckAttributesLength; i++) {
  93.231 -        if(ckpAttributes[i].pValue != NULL_PTR) {
  93.232 -            free(ckpAttributes[i].pValue);
  93.233 -        }
  93.234 -    }
  93.235 -    free(ckpAttributes);
  93.236 +    if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
  93.237 +        jKeyHandle = ckLongToJLong(ckKeyHandle);
  93.238  
  93.239  #if 0
  93.240 -    /* cheack, if we must give a initialization vector back to Java */
  93.241 -    if (ckMechanism.mechanism == CKM_KEY_WRAP_SET_OAEP) {
  93.242 -        /* we must copy back the unwrapped key info to the jMechanism object */
  93.243 -        copyBackSetUnwrappedKey(env, &ckMechanism, jMechanism);
  93.244 +        /* cheack, if we must give a initialization vector back to Java */
  93.245 +        if (ckMechanism.mechanism == CKM_KEY_WRAP_SET_OAEP) {
  93.246 +            /* we must copy back the unwrapped key info to the jMechanism object */
  93.247 +            copyBackSetUnwrappedKey(env, &ckMechanism, jMechanism);
  93.248 +        }
  93.249 +#endif
  93.250      }
  93.251 -#endif
  93.252  
  93.253 -    free(ckpWrappedKey);
  93.254 -    if(ckMechanism.pParameter != NULL_PTR) {
  93.255 +    if (ckMechanism.pParameter != NULL_PTR) {
  93.256          free(ckMechanism.pParameter);
  93.257      }
  93.258 -
  93.259 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return 0L ; }
  93.260 +    freeCKAttributeArray(ckpAttributes, ckAttributesLength);
  93.261 +    free(ckpWrappedKey);
  93.262  
  93.263      return jKeyHandle ;
  93.264  }
  93.265 @@ -360,8 +394,7 @@
  93.266   */
  93.267  void copyBackTLSPrfParams(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism)
  93.268  {
  93.269 -    jclass jMechanismClass= (*env)->FindClass(env, CLASS_MECHANISM);
  93.270 -    jclass jTLSPrfParamsClass = (*env)->FindClass(env, CLASS_TLS_PRF_PARAMS);
  93.271 +    jclass jMechanismClass, jTLSPrfParamsClass;
  93.272      CK_TLS_PRF_PARAMS *ckTLSPrfParams;
  93.273      jobject jTLSPrfParams;
  93.274      jfieldID fieldID;
  93.275 @@ -374,8 +407,10 @@
  93.276      int i;
  93.277  
  93.278      /* get mechanism */
  93.279 +    jMechanismClass = (*env)->FindClass(env, CLASS_MECHANISM);
  93.280 +    if (jMechanismClass == NULL) { return; }
  93.281      fieldID = (*env)->GetFieldID(env, jMechanismClass, "mechanism", "J");
  93.282 -    assert(fieldID != 0);
  93.283 +    if (fieldID == NULL) { return; }
  93.284      jMechanismType = (*env)->GetLongField(env, jMechanism, fieldID);
  93.285      ckMechanismType = jLongToCKULong(jMechanismType);
  93.286      if (ckMechanismType != ckMechanism->mechanism) {
  93.287 @@ -388,12 +423,14 @@
  93.288      if (ckTLSPrfParams != NULL_PTR) {
  93.289          /* get the Java CK_TLS_PRF_PARAMS object (pParameter) */
  93.290          fieldID = (*env)->GetFieldID(env, jMechanismClass, "pParameter", "Ljava/lang/Object;");
  93.291 -        assert(fieldID != 0);
  93.292 +        if (fieldID == NULL) { return; }
  93.293          jTLSPrfParams = (*env)->GetObjectField(env, jMechanism, fieldID);
  93.294  
  93.295          /* copy back the client IV */
  93.296 +        jTLSPrfParamsClass = (*env)->FindClass(env, CLASS_TLS_PRF_PARAMS);
  93.297 +        if (jTLSPrfParamsClass == NULL) { return; }
  93.298          fieldID = (*env)->GetFieldID(env, jTLSPrfParamsClass, "pOutput", "[B");
  93.299 -        assert(fieldID != 0);
  93.300 +        if (fieldID == NULL) { return; }
  93.301          jOutput = (*env)->GetObjectField(env, jTLSPrfParams, fieldID);
  93.302          output = ckTLSPrfParams->pOutput;
  93.303  
  93.304 @@ -402,26 +439,21 @@
  93.305          if (jOutput != NULL) {
  93.306              jLength = (*env)->GetArrayLength(env, jOutput);
  93.307              jBytes = (*env)->GetByteArrayElements(env, jOutput, NULL);
  93.308 +            if (jBytes == NULL) { return; }
  93.309 +
  93.310              /* copy the bytes to the Java buffer */
  93.311              for (i=0; i < jLength; i++) {
  93.312                  jBytes[i] = ckByteToJByte(output[i]);
  93.313              }
  93.314              /* copy back the Java buffer to the object */
  93.315              (*env)->ReleaseByteArrayElements(env, jOutput, jBytes, 0);
  93.316 -            // free malloc'd data
  93.317 -            free(output);
  93.318          }
  93.319  
  93.320          // free malloc'd data
  93.321 -        if (ckTLSPrfParams->pSeed != NULL) {
  93.322 -            free(ckTLSPrfParams->pSeed);
  93.323 -        }
  93.324 -        if (ckTLSPrfParams->pLabel != NULL) {
  93.325 -            free(ckTLSPrfParams->pLabel);
  93.326 -        }
  93.327 -        if (ckTLSPrfParams->pulOutputLen != NULL) {
  93.328 -            free(ckTLSPrfParams->pulOutputLen);
  93.329 -        }
  93.330 +        free(ckTLSPrfParams->pSeed);
  93.331 +        free(ckTLSPrfParams->pLabel);
  93.332 +        free(ckTLSPrfParams->pulOutputLen);
  93.333 +        free(ckTLSPrfParams->pOutput);
  93.334      }
  93.335  }
  93.336  
  93.337 @@ -456,8 +488,16 @@
  93.338  
  93.339      ckSessionHandle = jLongToCKULong(jSessionHandle);
  93.340      jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
  93.341 +    if ((*env)->ExceptionCheck(env)) { return 0L; }
  93.342 +
  93.343      ckBaseKeyHandle = jLongToCKULong(jBaseKeyHandle);
  93.344      jAttributeArrayToCKAttributeArray(env, jTemplate, &ckpAttributes, &ckAttributesLength);
  93.345 +    if ((*env)->ExceptionCheck(env)) {
  93.346 +        if (ckMechanism.pParameter != NULL_PTR) {
  93.347 +            free(ckMechanism.pParameter);
  93.348 +        }
  93.349 +        return 0L;
  93.350 +    }
  93.351  
  93.352      switch (ckMechanism.mechanism) {
  93.353      case CKM_SSL3_KEY_AND_MAC_DERIVE:
  93.354 @@ -476,14 +516,8 @@
  93.355                   ckpAttributes, ckAttributesLength, phKey);
  93.356  
  93.357      jKeyHandle = ckLongToJLong(ckKeyHandle);
  93.358 -    for(i=0; i<ckAttributesLength; i++) {
  93.359 -        if(ckpAttributes[i].pValue != NULL_PTR) {
  93.360 -            free(ckpAttributes[i].pValue);
  93.361 -        }
  93.362 -    }
  93.363 -    if (ckpAttributes != NULL) {
  93.364 -        free(ckpAttributes);
  93.365 -    }
  93.366 +
  93.367 +    freeCKAttributeArray(ckpAttributes, ckAttributesLength);
  93.368  
  93.369      switch (ckMechanism.mechanism) {
  93.370      case CKM_SSL3_MASTER_KEY_DERIVE:
  93.371 @@ -512,11 +546,10 @@
  93.372          break;
  93.373      }
  93.374  
  93.375 -    if(ckMechanism.pParameter != NULL_PTR) {
  93.376 +    if (ckMechanism.pParameter != NULL_PTR) {
  93.377          free(ckMechanism.pParameter);
  93.378      }
  93.379 -
  93.380 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return 0L ; }
  93.381 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return 0L ; }
  93.382  
  93.383      return jKeyHandle ;
  93.384  }
  93.385 @@ -529,9 +562,7 @@
  93.386   */
  93.387  void copyBackClientVersion(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism)
  93.388  {
  93.389 -  jclass jMechanismClass= (*env)->FindClass(env, CLASS_MECHANISM);
  93.390 -  jclass jSSL3MasterKeyDeriveParamsClass = (*env)->FindClass(env, CLASS_SSL3_MASTER_KEY_DERIVE_PARAMS);
  93.391 -  jclass jVersionClass = (*env)->FindClass(env, CLASS_VERSION);
  93.392 +  jclass jMechanismClass, jSSL3MasterKeyDeriveParamsClass, jVersionClass;
  93.393    CK_SSL3_MASTER_KEY_DERIVE_PARAMS *ckSSL3MasterKeyDeriveParams;
  93.394    CK_VERSION *ckVersion;
  93.395    jfieldID fieldID;
  93.396 @@ -541,8 +572,10 @@
  93.397    jobject jVersion;
  93.398  
  93.399    /* get mechanism */
  93.400 +  jMechanismClass = (*env)->FindClass(env, CLASS_MECHANISM);
  93.401 +  if (jMechanismClass == NULL) { return; }
  93.402    fieldID = (*env)->GetFieldID(env, jMechanismClass, "mechanism", "J");
  93.403 -  assert(fieldID != 0);
  93.404 +  if (fieldID == NULL) { return; }
  93.405    jMechanismType = (*env)->GetLongField(env, jMechanism, fieldID);
  93.406    ckMechanismType = jLongToCKULong(jMechanismType);
  93.407    if (ckMechanismType != ckMechanism->mechanism) {
  93.408 @@ -558,27 +591,31 @@
  93.409      if (ckVersion != NULL_PTR) {
  93.410        /* get the Java CK_SSL3_MASTER_KEY_DERIVE_PARAMS (pParameter) */
  93.411        fieldID = (*env)->GetFieldID(env, jMechanismClass, "pParameter", "Ljava/lang/Object;");
  93.412 -      assert(fieldID != 0);
  93.413 +      if (fieldID == NULL) { return; }
  93.414 +
  93.415        jSSL3MasterKeyDeriveParams = (*env)->GetObjectField(env, jMechanism, fieldID);
  93.416  
  93.417        /* get the Java CK_VERSION */
  93.418 +      jSSL3MasterKeyDeriveParamsClass = (*env)->FindClass(env, CLASS_SSL3_MASTER_KEY_DERIVE_PARAMS);
  93.419 +      if (jSSL3MasterKeyDeriveParamsClass == NULL) { return; }
  93.420        fieldID = (*env)->GetFieldID(env, jSSL3MasterKeyDeriveParamsClass, "pVersion", "L"CLASS_VERSION";");
  93.421 -      assert(fieldID != 0);
  93.422 +      if (fieldID == NULL) { return; }
  93.423        jVersion = (*env)->GetObjectField(env, jSSL3MasterKeyDeriveParams, fieldID);
  93.424  
  93.425        /* now copy back the version from the native structure to the Java structure */
  93.426  
  93.427        /* copy back the major version */
  93.428 +      jVersionClass = (*env)->FindClass(env, CLASS_VERSION);
  93.429 +      if (jVersionClass == NULL) { return; }
  93.430        fieldID = (*env)->GetFieldID(env, jVersionClass, "major", "B");
  93.431 -      assert(fieldID != 0);
  93.432 +      if (fieldID == NULL) { return; }
  93.433        (*env)->SetByteField(env, jVersion, fieldID, ckByteToJByte(ckVersion->major));
  93.434  
  93.435        /* copy back the minor version */
  93.436        fieldID = (*env)->GetFieldID(env, jVersionClass, "minor", "B");
  93.437 -      assert(fieldID != 0);
  93.438 +      if (fieldID == NULL) { return; }
  93.439        (*env)->SetByteField(env, jVersion, fieldID, ckByteToJByte(ckVersion->minor));
  93.440      }
  93.441 -
  93.442    }
  93.443  }
  93.444  
  93.445 @@ -591,9 +628,7 @@
  93.446   */
  93.447  void copyBackSSLKeyMatParams(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism)
  93.448  {
  93.449 -  jclass jMechanismClass= (*env)->FindClass(env, CLASS_MECHANISM);
  93.450 -  jclass jSSL3KeyMatParamsClass = (*env)->FindClass(env, CLASS_SSL3_KEY_MAT_PARAMS);
  93.451 -  jclass jSSL3KeyMatOutClass = (*env)->FindClass(env, CLASS_SSL3_KEY_MAT_OUT);
  93.452 +  jclass jMechanismClass, jSSL3KeyMatParamsClass, jSSL3KeyMatOutClass;
  93.453    CK_SSL3_KEY_MAT_PARAMS *ckSSL3KeyMatParam;
  93.454    CK_SSL3_KEY_MAT_OUT *ckSSL3KeyMatOut;
  93.455    jfieldID fieldID;
  93.456 @@ -608,8 +643,10 @@
  93.457    int i;
  93.458  
  93.459    /* get mechanism */
  93.460 +  jMechanismClass= (*env)->FindClass(env, CLASS_MECHANISM);
  93.461 +  if (jMechanismClass == NULL) { return; }
  93.462    fieldID = (*env)->GetFieldID(env, jMechanismClass, "mechanism", "J");
  93.463 -  assert(fieldID != 0);
  93.464 +  if (fieldID == NULL) { return; }
  93.465    jMechanismType = (*env)->GetLongField(env, jMechanism, fieldID);
  93.466    ckMechanismType = jLongToCKULong(jMechanismType);
  93.467    if (ckMechanismType != ckMechanism->mechanism) {
  93.468 @@ -633,74 +670,78 @@
  93.469      if (ckSSL3KeyMatOut != NULL_PTR) {
  93.470        /* get the Java CK_SSL3_KEY_MAT_PARAMS (pParameter) */
  93.471        fieldID = (*env)->GetFieldID(env, jMechanismClass, "pParameter", "Ljava/lang/Object;");
  93.472 -      assert(fieldID != 0);
  93.473 +      if (fieldID == NULL) { return; }
  93.474        jSSL3KeyMatParam = (*env)->GetObjectField(env, jMechanism, fieldID);
  93.475  
  93.476        /* get the Java CK_SSL3_KEY_MAT_OUT */
  93.477 +      jSSL3KeyMatParamsClass = (*env)->FindClass(env, CLASS_SSL3_KEY_MAT_PARAMS);
  93.478 +      if (jSSL3KeyMatParamsClass == NULL) { return; }
  93.479        fieldID = (*env)->GetFieldID(env, jSSL3KeyMatParamsClass, "pReturnedKeyMaterial", "L"CLASS_SSL3_KEY_MAT_OUT";");
  93.480 -      assert(fieldID != 0);
  93.481 +      if (fieldID == NULL) { return; }
  93.482        jSSL3KeyMatOut = (*env)->GetObjectField(env, jSSL3KeyMatParam, fieldID);
  93.483  
  93.484        /* now copy back all the key handles and the initialization vectors */
  93.485        /* copy back client MAC secret handle */
  93.486 +      jSSL3KeyMatOutClass = (*env)->FindClass(env, CLASS_SSL3_KEY_MAT_OUT);
  93.487 +      if (jSSL3KeyMatOutClass == NULL) { return; }
  93.488        fieldID = (*env)->GetFieldID(env, jSSL3KeyMatOutClass, "hClientMacSecret", "J");
  93.489 -      assert(fieldID != 0);
  93.490 +      if (fieldID == NULL) { return; }
  93.491        (*env)->SetLongField(env, jSSL3KeyMatOut, fieldID, ckULongToJLong(ckSSL3KeyMatOut->hClientMacSecret));
  93.492  
  93.493        /* copy back server MAC secret handle */
  93.494        fieldID = (*env)->GetFieldID(env, jSSL3KeyMatOutClass, "hServerMacSecret", "J");
  93.495 -      assert(fieldID != 0);
  93.496 +      if (fieldID == NULL) { return; }
  93.497        (*env)->SetLongField(env, jSSL3KeyMatOut, fieldID, ckULongToJLong(ckSSL3KeyMatOut->hServerMacSecret));
  93.498  
  93.499        /* copy back client secret key handle */
  93.500        fieldID = (*env)->GetFieldID(env, jSSL3KeyMatOutClass, "hClientKey", "J");
  93.501 -      assert(fieldID != 0);
  93.502 +      if (fieldID == NULL) { return; }
  93.503        (*env)->SetLongField(env, jSSL3KeyMatOut, fieldID, ckULongToJLong(ckSSL3KeyMatOut->hClientKey));
  93.504  
  93.505        /* copy back server secret key handle */
  93.506        fieldID = (*env)->GetFieldID(env, jSSL3KeyMatOutClass, "hServerKey", "J");
  93.507 -      assert(fieldID != 0);
  93.508 +      if (fieldID == NULL) { return; }
  93.509        (*env)->SetLongField(env, jSSL3KeyMatOut, fieldID, ckULongToJLong(ckSSL3KeyMatOut->hServerKey));
  93.510  
  93.511        /* copy back the client IV */
  93.512        fieldID = (*env)->GetFieldID(env, jSSL3KeyMatOutClass, "pIVClient", "[B");
  93.513 -      assert(fieldID != 0);
  93.514 +      if (fieldID == NULL) { return; }
  93.515        jIV = (*env)->GetObjectField(env, jSSL3KeyMatOut, fieldID);
  93.516        iv = ckSSL3KeyMatOut->pIVClient;
  93.517  
  93.518        if (jIV != NULL) {
  93.519          jLength = (*env)->GetArrayLength(env, jIV);
  93.520          jBytes = (*env)->GetByteArrayElements(env, jIV, NULL);
  93.521 +        if (jBytes == NULL) { return; }
  93.522          /* copy the bytes to the Java buffer */
  93.523          for (i=0; i < jLength; i++) {
  93.524            jBytes[i] = ckByteToJByte(iv[i]);
  93.525          }
  93.526          /* copy back the Java buffer to the object */
  93.527          (*env)->ReleaseByteArrayElements(env, jIV, jBytes, 0);
  93.528 -        // free malloc'd data
  93.529 -        free(iv);
  93.530        }
  93.531 +      // free malloc'd data
  93.532 +      free(ckSSL3KeyMatOut->pIVClient);
  93.533  
  93.534        /* copy back the server IV */
  93.535        fieldID = (*env)->GetFieldID(env, jSSL3KeyMatOutClass, "pIVServer", "[B");
  93.536 -      assert(fieldID != 0);
  93.537 +      if (fieldID == NULL) { return; }
  93.538        jIV = (*env)->GetObjectField(env, jSSL3KeyMatOut, fieldID);
  93.539        iv = ckSSL3KeyMatOut->pIVServer;
  93.540  
  93.541        if (jIV != NULL) {
  93.542          jLength = (*env)->GetArrayLength(env, jIV);
  93.543          jBytes = (*env)->GetByteArrayElements(env, jIV, NULL);
  93.544 +        if (jBytes == NULL) { return; }
  93.545          /* copy the bytes to the Java buffer */
  93.546          for (i=0; i < jLength; i++) {
  93.547            jBytes[i] = ckByteToJByte(iv[i]);
  93.548          }
  93.549          /* copy back the Java buffer to the object */
  93.550          (*env)->ReleaseByteArrayElements(env, jIV, jBytes, 0);
  93.551 -        // free malloc'd data
  93.552 -        free(iv);
  93.553        }
  93.554 -
  93.555        // free malloc'd data
  93.556 +      free(ckSSL3KeyMatOut->pIVServer);
  93.557        free(ckSSL3KeyMatOut);
  93.558      }
  93.559    }
    94.1 --- a/src/share/native/sun/security/pkcs11/wrapper/p11_mutex.c	Thu Apr 02 10:16:53 2009 -0700
    94.2 +++ b/src/share/native/sun/security/pkcs11/wrapper/p11_mutex.c	Wed Apr 08 15:40:56 2009 -0700
    94.3 @@ -1,5 +1,5 @@
    94.4  /*
    94.5 - * Portions Copyright 2003 Sun Microsystems, Inc.  All Rights Reserved.
    94.6 + * Portions Copyright 2003-2009 Sun Microsystems, Inc.  All Rights Reserved.
    94.7   */
    94.8  
    94.9  /* Copyright  (c) 2002 Graz University of Technology. All rights reserved.
   94.10 @@ -76,7 +76,7 @@
   94.11  CK_C_INITIALIZE_ARGS_PTR makeCKInitArgsAdapter(JNIEnv *env, jobject jInitArgs)
   94.12  {
   94.13      CK_C_INITIALIZE_ARGS_PTR ckpInitArgs;
   94.14 -    jclass jInitArgsClass = (*env)->FindClass(env, CLASS_C_INITIALIZE_ARGS);
   94.15 +    jclass jInitArgsClass;
   94.16      jfieldID fieldID;
   94.17      jlong jFlags;
   94.18      jobject jReserved;
   94.19 @@ -91,10 +91,20 @@
   94.20  
   94.21      /* convert the Java InitArgs object to a pointer to a CK_C_INITIALIZE_ARGS structure */
   94.22      ckpInitArgs = (CK_C_INITIALIZE_ARGS_PTR) malloc(sizeof(CK_C_INITIALIZE_ARGS));
   94.23 +    if (ckpInitArgs == NULL) {
   94.24 +        JNU_ThrowOutOfMemoryError(env, 0);
   94.25 +        return NULL_PTR;
   94.26 +    }
   94.27  
   94.28      /* Set the mutex functions that will call the Java mutex functions, but
   94.29       * only set it, if the field is not null.
   94.30       */
   94.31 +    jInitArgsClass = (*env)->FindClass(env, CLASS_C_INITIALIZE_ARGS);
   94.32 +    if (jInitArgsClass == NULL) {
   94.33 +        free(ckpInitArgs);
   94.34 +        return NULL;
   94.35 +    }
   94.36 +
   94.37  #ifdef NO_CALLBACKS
   94.38      ckpInitArgs->CreateMutex = NULL_PTR;
   94.39      ckpInitArgs->DestroyMutex = NULL_PTR;
   94.40 @@ -102,22 +112,22 @@
   94.41      ckpInitArgs->UnlockMutex = NULL_PTR;
   94.42  #else
   94.43      fieldID = (*env)->GetFieldID(env, jInitArgsClass, "CreateMutex", "Lsun/security/pkcs11/wrapper/CK_CREATEMUTEX;");
   94.44 -    assert(fieldID != 0);
   94.45 +    if (fieldID == NULL) { return NULL; }
   94.46      jMutexHandler = (*env)->GetObjectField(env, jInitArgs, fieldID);
   94.47      ckpInitArgs->CreateMutex = (jMutexHandler != NULL) ? &callJCreateMutex : NULL_PTR;
   94.48  
   94.49      fieldID = (*env)->GetFieldID(env, jInitArgsClass, "DestroyMutex", "Lsun/security/pkcs11/wrapper/CK_DESTROYMUTEX;");
   94.50 -    assert(fieldID != 0);
   94.51 +    if (fieldID == NULL) { return NULL; }
   94.52      jMutexHandler = (*env)->GetObjectField(env, jInitArgs, fieldID);
   94.53      ckpInitArgs->DestroyMutex = (jMutexHandler != NULL) ? &callJDestroyMutex : NULL_PTR;
   94.54  
   94.55      fieldID = (*env)->GetFieldID(env, jInitArgsClass, "LockMutex", "Lsun/security/pkcs11/wrapper/CK_LOCKMUTEX;");
   94.56 -    assert(fieldID != 0);
   94.57 +    if (fieldID == NULL) { return NULL; }
   94.58      jMutexHandler = (*env)->GetObjectField(env, jInitArgs, fieldID);
   94.59      ckpInitArgs->LockMutex = (jMutexHandler != NULL) ? &callJLockMutex : NULL_PTR;
   94.60  
   94.61      fieldID = (*env)->GetFieldID(env, jInitArgsClass, "UnlockMutex", "Lsun/security/pkcs11/wrapper/CK_UNLOCKMUTEX;");
   94.62 -    assert(fieldID != 0);
   94.63 +    if (fieldID == NULL) { return NULL; }
   94.64      jMutexHandler = (*env)->GetObjectField(env, jInitArgs, fieldID);
   94.65      ckpInitArgs->UnlockMutex = (jMutexHandler != NULL) ? &callJUnlockMutex : NULL_PTR;
   94.66  
   94.67 @@ -129,19 +139,25 @@
   94.68          /* set the global object jInitArgs so that the right Java mutex functions will be called */
   94.69          jInitArgsObject = (*env)->NewGlobalRef(env, jInitArgs);
   94.70          ckpGlobalInitArgs = (CK_C_INITIALIZE_ARGS_PTR) malloc(sizeof(CK_C_INITIALIZE_ARGS));
   94.71 +        if (ckpGlobalInitArgs == NULL) {
   94.72 +            free(ckpInitArgs);
   94.73 +            JNU_ThrowOutOfMemoryError(env, 0);
   94.74 +            return NULL_PTR;
   94.75 +        }
   94.76 +
   94.77          memcpy(ckpGlobalInitArgs, ckpInitArgs, sizeof(CK_C_INITIALIZE_ARGS));
   94.78      }
   94.79  #endif /* NO_CALLBACKS */
   94.80  
   94.81      /* convert and set the flags field */
   94.82      fieldID = (*env)->GetFieldID(env, jInitArgsClass, "flags", "J");
   94.83 -    assert(fieldID != 0);
   94.84 +    if (fieldID == NULL) { return NULL; }
   94.85      jFlags = (*env)->GetLongField(env, jInitArgs, fieldID);
   94.86      ckpInitArgs->flags = jLongToCKULong(jFlags);
   94.87  
   94.88      /* pReserved should be NULL_PTR in this version */
   94.89      fieldID = (*env)->GetFieldID(env, jInitArgsClass, "pReserved", "Ljava/lang/Object;");
   94.90 -    assert(fieldID != 0);
   94.91 +    if (fieldID == NULL) { return NULL; }
   94.92      jReserved = (*env)->GetObjectField(env, jInitArgs, fieldID);
   94.93  
   94.94      /* we try to convert the reserved parameter also */
   94.95 @@ -201,20 +217,21 @@
   94.96          wasAttached = 1;
   94.97      }
   94.98  
   94.99 -
  94.100      jCreateMutexClass = (*env)->FindClass(env, CLASS_CREATEMUTEX);
  94.101 +    if (jCreateMutexClass == NULL) { return rv; }
  94.102      jInitArgsClass = (*env)->FindClass(env, CLASS_C_INITIALIZE_ARGS);
  94.103 +    if (jInitArgsClass == NULL) { return rv; }
  94.104  
  94.105      /* get the CreateMutex object out of the jInitArgs object */
  94.106      fieldID = (*env)->GetFieldID(env, jInitArgsClass, "CreateMutex", "Lsun/security/pkcs11/wrapper/CK_CREATEMUTEX;");
  94.107 -    assert(fieldID != 0);
  94.108 +    if (fieldID == NULL) { return rv; }
  94.109      jCreateMutex = (*env)->GetObjectField(env, jInitArgsObject, fieldID);
  94.110      assert(jCreateMutex != 0);
  94.111  
  94.112      /* call the CK_CREATEMUTEX function of the CreateMutex object */
  94.113      /* and get the new Java mutex object */
  94.114      methodID = (*env)->GetMethodID(env, jCreateMutexClass, "CK_CREATEMUTEX", "()Ljava/lang/Object;");
  94.115 -    assert(methodID != 0);
  94.116 +    if (methodID == NULL) { return rv; }
  94.117      jMutex = (*env)->CallObjectMethod(env, jCreateMutex, methodID);
  94.118  
  94.119      /* set a global reference on the Java mutex */
  94.120 @@ -227,10 +244,13 @@
  94.121      pkcs11Exception = (*env)->ExceptionOccurred(env);
  94.122  
  94.123      if (pkcs11Exception != NULL) {
  94.124 +        /* TBD: clear the pending exception with ExceptionClear? */
  94.125          /* The was an exception thrown, now we get the error-code from it */
  94.126          pkcs11ExceptionClass = (*env)->FindClass(env, CLASS_PKCS11EXCEPTION);
  94.127 +        if (pkcs11ExceptionClass == NULL) { return rv; }
  94.128          methodID = (*env)->GetMethodID(env, pkcs11ExceptionClass, "getErrorCode", "()J");
  94.129 -        assert(methodID != 0);
  94.130 +        if (methodID == NULL) { return rv; }
  94.131 +
  94.132          errorCode = (*env)->CallLongMethod(env, pkcs11Exception, methodID);
  94.133          rv = jLongToCKULong(errorCode);
  94.134      }
  94.135 @@ -292,22 +312,23 @@
  94.136          wasAttached = 1;
  94.137      }
  94.138  
  94.139 -
  94.140      jDestroyMutexClass = (*env)->FindClass(env, CLASS_DESTROYMUTEX);
  94.141 +    if (jDestroyMutexClass == NULL) { return rv; }
  94.142      jInitArgsClass = (*env)->FindClass(env, CLASS_C_INITIALIZE_ARGS);
  94.143 +    if (jInitArgsClass == NULL) { return rv; }
  94.144  
  94.145      /* convert the CK mutex to a Java mutex */
  94.146      jMutex = ckVoidPtrToJObject(pMutex);
  94.147  
  94.148      /* get the DestroyMutex object out of the jInitArgs object */
  94.149      fieldID = (*env)->GetFieldID(env, jInitArgsClass, "DestroyMutex", "Lsun/security/pkcs11/wrapper/CK_DESTROYMUTEX;");
  94.150 -    assert(fieldID != 0);
  94.151 +    if (fieldID == NULL) { return rv; }
  94.152      jDestroyMutex = (*env)->GetObjectField(env, jInitArgsObject, fieldID);
  94.153      assert(jDestroyMutex != 0);
  94.154  
  94.155      /* call the CK_DESTROYMUTEX method of the DestroyMutex object */
  94.156      methodID = (*env)->GetMethodID(env, jDestroyMutexClass, "CK_DESTROYMUTEX", "(Ljava/lang/Object;)V");
  94.157 -    assert(methodID != 0);
  94.158 +    if (methodID == NULL) { return rv; }
  94.159      (*env)->CallVoidMethod(env, jDestroyMutex, methodID, jMutex);
  94.160  
  94.161      /* delete the global reference on the Java mutex */
  94.162 @@ -318,10 +339,12 @@
  94.163      pkcs11Exception = (*env)->ExceptionOccurred(env);
  94.164  
  94.165      if (pkcs11Exception != NULL) {
  94.166 +        /* TBD: clear the pending exception with ExceptionClear? */
  94.167          /* The was an exception thrown, now we get the error-code from it */
  94.168          pkcs11ExceptionClass = (*env)->FindClass(env, CLASS_PKCS11EXCEPTION);
  94.169 +        if (pkcs11ExceptionClass == NULL) { return rv; }
  94.170          methodID = (*env)->GetMethodID(env, pkcs11ExceptionClass, "getErrorCode", "()J");
  94.171 -        assert(methodID != 0);
  94.172 +        if (methodID == NULL) { return rv; }
  94.173          errorCode = (*env)->CallLongMethod(env, pkcs11Exception, methodID);
  94.174          rv = jLongToCKULong(errorCode);
  94.175      }
  94.176 @@ -383,33 +406,35 @@
  94.177          wasAttached = 1;
  94.178      }
  94.179  
  94.180 -
  94.181      jLockMutexClass = (*env)->FindClass(env, CLASS_LOCKMUTEX);
  94.182 +    if (jLockMutexClass == NULL) { return rv; }
  94.183      jInitArgsClass = (*env)->FindClass(env, CLASS_C_INITIALIZE_ARGS);
  94.184 +    if (jInitArgsClass == NULL) { return rv; }
  94.185  
  94.186      /* convert the CK mutex to a Java mutex */
  94.187      jMutex = ckVoidPtrToJObject(pMutex);
  94.188  
  94.189      /* get the LockMutex object out of the jInitArgs object */
  94.190      fieldID = (*env)->GetFieldID(env, jInitArgsClass, "LockMutex", "Lsun/security/pkcs11/wrapper/CK_LOCKMUTEX;");
  94.191 -    assert(fieldID != 0);
  94.192 +    if (fieldID == NULL) { return rv; }
  94.193      jLockMutex = (*env)->GetObjectField(env, jInitArgsObject, fieldID);
  94.194      assert(jLockMutex != 0);
  94.195  
  94.196      /* call the CK_LOCKMUTEX method of the LockMutex object */
  94.197      methodID = (*env)->GetMethodID(env, jLockMutexClass, "CK_LOCKMUTEX", "(Ljava/lang/Object;)V");
  94.198 -    assert(methodID != 0);
  94.199 +    if (methodID == NULL) { return rv; }
  94.200      (*env)->CallVoidMethod(env, jLockMutex, methodID, jMutex);
  94.201  
  94.202 -
  94.203      /* check, if callback threw an exception */
  94.204      pkcs11Exception = (*env)->ExceptionOccurred(env);
  94.205  
  94.206      if (pkcs11Exception != NULL) {
  94.207 +        /* TBD: clear the pending exception with ExceptionClear? */
  94.208          /* The was an exception thrown, now we get the error-code from it */
  94.209          pkcs11ExceptionClass = (*env)->FindClass(env, CLASS_PKCS11EXCEPTION);
  94.210 +        if (pkcs11ExceptionClass == NULL) { return rv; }
  94.211          methodID = (*env)->GetMethodID(env, pkcs11ExceptionClass, "getErrorCode", "()J");
  94.212 -        assert(methodID != 0);
  94.213 +        if (methodID == NULL) { return rv; }
  94.214          errorCode = (*env)->CallLongMethod(env, pkcs11Exception, methodID);
  94.215          rv = jLongToCKULong(errorCode);
  94.216      }
  94.217 @@ -471,33 +496,35 @@
  94.218          wasAttached = 1;
  94.219      }
  94.220  
  94.221 -
  94.222      jUnlockMutexClass = (*env)->FindClass(env, CLASS_UNLOCKMUTEX);
  94.223 +    if (jUnlockMutexClass == NULL) { return rv; }
  94.224      jInitArgsClass = (*env)->FindClass(env, CLASS_C_INITIALIZE_ARGS);
  94.225 +    if (jInitArgsClass == NULL) { return rv; }
  94.226  
  94.227      /* convert the CK-type mutex to a Java mutex */
  94.228      jMutex = ckVoidPtrToJObject(pMutex);
  94.229  
  94.230      /* get the UnlockMutex object out of the jInitArgs object */
  94.231      fieldID = (*env)->GetFieldID(env, jInitArgsClass, "UnlockMutex", "Lsun/security/pkcs11/wrapper/CK_UNLOCKMUTEX;");
  94.232 -    assert(fieldID != 0);
  94.233 +    if (fieldID == NULL) { return rv; }
  94.234      jUnlockMutex = (*env)->GetObjectField(env, jInitArgsObject, fieldID);
  94.235      assert(jUnlockMutex != 0);
  94.236  
  94.237      /* call the CK_UNLOCKMUTEX method of the UnLockMutex object */
  94.238      methodID = (*env)->GetMethodID(env, jUnlockMutexClass, "CK_UNLOCKMUTEX", "(Ljava/lang/Object;)V");
  94.239 -    assert(methodID != 0);
  94.240 +    if (methodID == NULL) { return rv; }
  94.241      (*env)->CallVoidMethod(env, jUnlockMutex, methodID, jMutex);
  94.242  
  94.243 -
  94.244      /* check, if callback threw an exception */
  94.245      pkcs11Exception = (*env)->ExceptionOccurred(env);
  94.246  
  94.247      if (pkcs11Exception != NULL) {
  94.248 +        /* TBD: clear the pending exception with ExceptionClear? */
  94.249          /* The was an exception thrown, now we get the error-code from it */
  94.250          pkcs11ExceptionClass = (*env)->FindClass(env, CLASS_PKCS11EXCEPTION);
  94.251 +        if (pkcs11ExceptionClass == NULL) { return rv; }
  94.252          methodID = (*env)->GetMethodID(env, pkcs11ExceptionClass, "getErrorCode", "()J");
  94.253 -        assert(methodID != 0);
  94.254 +        if (methodID == NULL) { return rv; }
  94.255          errorCode = (*env)->CallLongMethod(env, pkcs11Exception, methodID);
  94.256          rv = jLongToCKULong(errorCode);
  94.257      }
    95.1 --- a/src/share/native/sun/security/pkcs11/wrapper/p11_objmgmt.c	Thu Apr 02 10:16:53 2009 -0700
    95.2 +++ b/src/share/native/sun/security/pkcs11/wrapper/p11_objmgmt.c	Wed Apr 08 15:40:56 2009 -0700
    95.3 @@ -1,5 +1,5 @@
    95.4  /*
    95.5 - * Portions Copyright 2003 Sun Microsystems, Inc.  All Rights Reserved.
    95.6 + * Portions Copyright 2003-2009 Sun Microsystems, Inc.  All Rights Reserved.
    95.7   */
    95.8  
    95.9  /* Copyright  (c) 2002 Graz University of Technology. All rights reserved.
   95.10 @@ -81,16 +81,14 @@
   95.11  
   95.12      ckSessionHandle = jLongToCKULong(jSessionHandle);
   95.13      jAttributeArrayToCKAttributeArray(env, jTemplate, &ckpAttributes, &ckAttributesLength);
   95.14 +    if ((*env)->ExceptionCheck(env)) { return 0L; }
   95.15  
   95.16      rv = (*ckpFunctions->C_CreateObject)(ckSessionHandle, ckpAttributes, ckAttributesLength, &ckObjectHandle);
   95.17  
   95.18      jObjectHandle = ckULongToJLong(ckObjectHandle);
   95.19 -    for(i=0; i<ckAttributesLength; i++)
   95.20 -        if(ckpAttributes[i].pValue != NULL_PTR)
   95.21 -            free(ckpAttributes[i].pValue);
   95.22 -    free(ckpAttributes);
   95.23 +    freeCKAttributeArray(ckpAttributes, ckAttributesLength);
   95.24  
   95.25 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return 0L ; }
   95.26 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return 0L ; }
   95.27  
   95.28      return jObjectHandle ;
   95.29  }
   95.30 @@ -126,14 +124,12 @@
   95.31      ckSessionHandle = jLongToCKULong(jSessionHandle);
   95.32      ckObjectHandle = jLongToCKULong(jObjectHandle);
   95.33      jAttributeArrayToCKAttributeArray(env, jTemplate, &ckpAttributes, &ckAttributesLength);
   95.34 +    if ((*env)->ExceptionCheck(env)) { return 0L; }
   95.35  
   95.36      rv = (*ckpFunctions->C_CopyObject)(ckSessionHandle, ckObjectHandle, ckpAttributes, ckAttributesLength, &ckNewObjectHandle);
   95.37  
   95.38      jNewObjectHandle = ckULongToJLong(ckNewObjectHandle);
   95.39 -    for(i=0; i<ckAttributesLength; i++)
   95.40 -        if(ckpAttributes[i].pValue != NULL_PTR)
   95.41 -            free(ckpAttributes[i].pValue);
   95.42 -    free(ckpAttributes);
   95.43 +    freeCKAttributeArray(ckpAttributes, ckAttributesLength);
   95.44  
   95.45      if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return 0L ; }
   95.46  
   95.47 @@ -164,7 +160,7 @@
   95.48      ckObjectHandle = jLongToCKULong(jObjectHandle);
   95.49  
   95.50      rv = (*ckpFunctions->C_DestroyObject)(ckSessionHandle, ckObjectHandle);
   95.51 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
   95.52 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
   95.53  }
   95.54  #endif
   95.55  
   95.56 @@ -194,7 +190,7 @@
   95.57      ckObjectHandle = jLongToCKULong(jObjectHandle);
   95.58  
   95.59      rv = (*ckpFunctions->C_GetObjectSize)(ckSessionHandle, ckObjectHandle, &ckObjectSize);
   95.60 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return 0L ; }
   95.61 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return 0L ; }
   95.62  
   95.63      jObjectSize = ckULongToJLong(ckObjectSize);
   95.64  
   95.65 @@ -221,7 +217,7 @@
   95.66      CK_ATTRIBUTE_PTR ckpAttributes = NULL_PTR;
   95.67      CK_ULONG ckAttributesLength;
   95.68      CK_ULONG ckBufferLength;
   95.69 -    CK_ULONG i;
   95.70 +    CK_ULONG i, j;
   95.71      jobject jAttribute;
   95.72      CK_RV rv;
   95.73  
   95.74 @@ -238,19 +234,20 @@
   95.75      ckObjectHandle = jLongToCKULong(jObjectHandle);
   95.76      TRACE1("jAttributeArrayToCKAttributeArray now with jTemplate = %d", jTemplate);
   95.77      jAttributeArrayToCKAttributeArray(env, jTemplate, &ckpAttributes, &ckAttributesLength);
   95.78 +    if ((*env)->ExceptionCheck(env)) { return; }
   95.79 +
   95.80      TRACE2("DEBUG: jAttributeArrayToCKAttributeArray finished with ckpAttribute = %d, Length = %d\n", ckpAttributes, ckAttributesLength);
   95.81  
   95.82      /* first set all pValue to NULL, to get the needed buffer length */
   95.83      for(i = 0; i < ckAttributesLength; i++) {
   95.84 -        if(ckpAttributes[i].pValue != NULL_PTR) {
   95.85 +        if (ckpAttributes[i].pValue != NULL_PTR) {
   95.86              free(ckpAttributes[i].pValue);
   95.87 +            ckpAttributes[i].pValue = NULL_PTR;
   95.88          }
   95.89      }
   95.90 -    for (i = 0; i < ckAttributesLength; i++) {
   95.91 -        ckpAttributes[i].pValue = NULL_PTR;
   95.92 -    }
   95.93 +
   95.94      rv = (*ckpFunctions->C_GetAttributeValue)(ckSessionHandle, ckObjectHandle, ckpAttributes, ckAttributesLength);
   95.95 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
   95.96 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
   95.97          free(ckpAttributes);
   95.98          return ;
   95.99      }
  95.100 @@ -261,27 +258,34 @@
  95.101      for (i = 0; i < ckAttributesLength; i++) {
  95.102          ckBufferLength = sizeof(CK_BYTE) * ckpAttributes[i].ulValueLen;
  95.103          ckpAttributes[i].pValue = (void *) malloc(ckBufferLength);
  95.104 +        if (ckpAttributes[i].pValue == NULL) {
  95.105 +            freeCKAttributeArray(ckpAttributes, i);
  95.106 +            JNU_ThrowOutOfMemoryError(env, 0);
  95.107 +            return;
  95.108 +        }
  95.109          ckpAttributes[i].ulValueLen = ckBufferLength;
  95.110      }
  95.111  
  95.112      /* now get the attributes with all values */
  95.113      rv = (*ckpFunctions->C_GetAttributeValue)(ckSessionHandle, ckObjectHandle, ckpAttributes, ckAttributesLength);
  95.114  
  95.115 -    /* copy back the values to the Java attributes */
  95.116 -    for (i = 0; i < ckAttributesLength; i++) {
  95.117 -        jAttribute = ckAttributePtrToJAttribute(env, &(ckpAttributes[i]));
  95.118 -        (*env)->SetObjectArrayElement(env, jTemplate, i, jAttribute);
  95.119 -    }
  95.120 -
  95.121 -    for(i=0; i<ckAttributesLength; i++) {
  95.122 -        if(ckpAttributes[i].pValue != NULL_PTR) {
  95.123 -            free(ckpAttributes[i].pValue);
  95.124 +    if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
  95.125 +        /* copy back the values to the Java attributes */
  95.126 +        for (i = 0; i < ckAttributesLength; i++) {
  95.127 +            jAttribute = ckAttributePtrToJAttribute(env, &(ckpAttributes[i]));
  95.128 +            if (jAttribute == NULL) {
  95.129 +                freeCKAttributeArray(ckpAttributes, ckAttributesLength);
  95.130 +                return;
  95.131 +            }
  95.132 +            (*env)->SetObjectArrayElement(env, jTemplate, i, jAttribute);
  95.133 +            if ((*env)->ExceptionCheck(env)) {
  95.134 +                freeCKAttributeArray(ckpAttributes, ckAttributesLength);
  95.135 +                return;
  95.136 +            }
  95.137          }
  95.138      }
  95.139 -    free(ckpAttributes);
  95.140 +    freeCKAttributeArray(ckpAttributes, ckAttributesLength);
  95.141      TRACE0("FINISHED\n");
  95.142 -
  95.143 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return ; }
  95.144  }
  95.145  #endif
  95.146  
  95.147 @@ -312,15 +316,11 @@
  95.148      ckSessionHandle = jLongToCKULong(jSessionHandle);
  95.149      ckObjectHandle = jLongToCKULong(jObjectHandle);
  95.150      jAttributeArrayToCKAttributeArray(env, jTemplate, &ckpAttributes, &ckAttributesLength);
  95.151 +    if ((*env)->ExceptionCheck(env)) { return; }
  95.152  
  95.153      rv = (*ckpFunctions->C_SetAttributeValue)(ckSessionHandle, ckObjectHandle, ckpAttributes, ckAttributesLength);
  95.154  
  95.155 -    for(i=0; i<ckAttributesLength; i++) {
  95.156 -        if(ckpAttributes[i].pValue != NULL_PTR) {
  95.157 -            free(ckpAttributes[i].pValue);
  95.158 -        }
  95.159 -    }
  95.160 -    free(ckpAttributes);
  95.161 +    freeCKAttributeArray(ckpAttributes, ckAttributesLength);
  95.162  
  95.163      if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
  95.164  }
  95.165 @@ -355,15 +355,11 @@
  95.166  
  95.167      ckSessionHandle = jLongToCKULong(jSessionHandle);
  95.168      jAttributeArrayToCKAttributeArray(env, jTemplate, &ckpAttributes, &ckAttributesLength);
  95.169 +    if ((*env)->ExceptionCheck(env)) { return; }
  95.170  
  95.171      rv = (*ckpFunctions->C_FindObjectsInit)(ckSessionHandle, ckpAttributes, ckAttributesLength);
  95.172  
  95.173 -    for(i=0; i<ckAttributesLength; i++) {
  95.174 -        if(ckpAttributes[i].pValue != NULL_PTR) {
  95.175 -            free(ckpAttributes[i].pValue);
  95.176 -        }
  95.177 -    }
  95.178 -    free(ckpAttributes);
  95.179 +    freeCKAttributeArray(ckpAttributes, ckAttributesLength);
  95.180      TRACE0("FINISHED\n");
  95.181  
  95.182      if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
  95.183 @@ -397,14 +393,18 @@
  95.184      ckSessionHandle = jLongToCKULong(jSessionHandle);
  95.185      ckMaxObjectLength = jLongToCKULong(jMaxObjectCount);
  95.186      ckpObjectHandleArray = (CK_OBJECT_HANDLE_PTR) malloc(sizeof(CK_OBJECT_HANDLE) * ckMaxObjectLength);
  95.187 +    if (ckpObjectHandleArray == NULL) {
  95.188 +        JNU_ThrowOutOfMemoryError(env, 0);
  95.189 +        return NULL;
  95.190 +    }
  95.191  
  95.192      rv = (*ckpFunctions->C_FindObjects)(ckSessionHandle, ckpObjectHandleArray, ckMaxObjectLength, &ckActualObjectCount);
  95.193 +    if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
  95.194 +        jObjectHandleArray = ckULongArrayToJLongArray(env, ckpObjectHandleArray, ckActualObjectCount);
  95.195 +    }
  95.196  
  95.197 -    jObjectHandleArray = ckULongArrayToJLongArray(env, ckpObjectHandleArray, ckActualObjectCount);
  95.198      free(ckpObjectHandleArray);
  95.199  
  95.200 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
  95.201 -
  95.202      return jObjectHandleArray ;
  95.203  }
  95.204  #endif
    96.1 --- a/src/share/native/sun/security/pkcs11/wrapper/p11_sessmgmt.c	Thu Apr 02 10:16:53 2009 -0700
    96.2 +++ b/src/share/native/sun/security/pkcs11/wrapper/p11_sessmgmt.c	Wed Apr 08 15:40:56 2009 -0700
    96.3 @@ -1,5 +1,5 @@
    96.4  /*
    96.5 - * Portions Copyright 2003 Sun Microsystems, Inc.  All Rights Reserved.
    96.6 + * Portions Copyright 2003-2009 Sun Microsystems, Inc.  All Rights Reserved.
    96.7   */
    96.8  
    96.9  /* Copyright  (c) 2002 Graz University of Technology. All rights reserved.
   96.10 @@ -97,6 +97,10 @@
   96.11  #ifndef NO_CALLBACKS
   96.12      if (jNotify != NULL) {
   96.13          notifyEncapsulation = (NotifyEncapsulation *) malloc(sizeof(NotifyEncapsulation));
   96.14 +        if (notifyEncapsulation == NULL) {
   96.15 +            JNU_ThrowOutOfMemoryError(env, 0);
   96.16 +            return 0L;
   96.17 +        }
   96.18          notifyEncapsulation->jApplicationData = (jApplication != NULL)
   96.19                  ? (*env)->NewGlobalRef(env, jApplication)
   96.20                  : NULL;
   96.21 @@ -118,7 +122,18 @@
   96.22      TRACE0(" ... ");
   96.23  
   96.24      rv = (*ckpFunctions->C_OpenSession)(ckSlotID, ckFlags, ckpApplication, ckNotify, &ckSessionHandle);
   96.25 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return 0L ; }
   96.26 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
   96.27 +#ifndef NO_CALLBACKS
   96.28 +        if (notifyEncapsulation != NULL) {
   96.29 +            if (notifyEncapsulation->jApplicationData != NULL) {
   96.30 +                (*env)->DeleteGlobalRef(env, jApplication);
   96.31 +            }
   96.32 +            (*env)->DeleteGlobalRef(env, jNotify);
   96.33 +            free(notifyEncapsulation);
   96.34 +        }
   96.35 +#endif /* NO_CALLBACKS */
   96.36 +        return 0L;
   96.37 +    }
   96.38  
   96.39      TRACE0("got session");
   96.40      TRACE1(", SessionHandle=%u", ckSessionHandle);
   96.41 @@ -163,7 +178,7 @@
   96.42      ckSessionHandle = jLongToCKULong(jSessionHandle);
   96.43  
   96.44      rv = (*ckpFunctions->C_CloseSession)(ckSessionHandle);
   96.45 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
   96.46 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
   96.47  
   96.48  #ifndef NO_CALLBACKS
   96.49      notifyEncapsulation = removeNotifyEntry(env, ckSessionHandle);
   96.50 @@ -208,7 +223,7 @@
   96.51      ckSlotID = jLongToCKULong(jSlotID);
   96.52  
   96.53      rv = (*ckpFunctions->C_CloseAllSessions)(ckSlotID);
   96.54 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
   96.55 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
   96.56  
   96.57  #ifndef NO_CALLBACKS
   96.58      /* Remove all notify callback helper objects. */
   96.59 @@ -250,10 +265,9 @@
   96.60      ckSessionHandle = jLongToCKULong(jSessionHandle);
   96.61  
   96.62      rv = (*ckpFunctions->C_GetSessionInfo)(ckSessionHandle, &ckSessionInfo);
   96.63 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
   96.64 -
   96.65 -    jSessionInfo = ckSessionInfoPtrToJSessionInfo(env, &ckSessionInfo);
   96.66 -
   96.67 +    if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
   96.68 +        jSessionInfo = ckSessionInfoPtrToJSessionInfo(env, &ckSessionInfo);
   96.69 +    }
   96.70      return jSessionInfo ;
   96.71  }
   96.72  #endif
   96.73 @@ -274,7 +288,7 @@
   96.74      CK_SESSION_HANDLE ckSessionHandle;
   96.75      CK_BYTE_PTR ckpState;
   96.76      CK_ULONG ckStateLength;
   96.77 -    jbyteArray jState;
   96.78 +    jbyteArray jState = NULL;
   96.79      CK_RV rv;
   96.80  
   96.81      CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
   96.82 @@ -283,17 +297,20 @@
   96.83      ckSessionHandle = jLongToCKULong(jSessionHandle);
   96.84  
   96.85      rv = (*ckpFunctions->C_GetOperationState)(ckSessionHandle, NULL_PTR, &ckStateLength);
   96.86 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
   96.87 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
   96.88  
   96.89      ckpState = (CK_BYTE_PTR) malloc(ckStateLength);
   96.90 +    if (ckpState == NULL) {
   96.91 +        JNU_ThrowOutOfMemoryError(env, 0);
   96.92 +        return NULL;
   96.93 +    }
   96.94  
   96.95      rv = (*ckpFunctions->C_GetOperationState)(ckSessionHandle, ckpState, &ckStateLength);
   96.96 -
   96.97 -    jState = ckByteArrayToJByteArray(env, ckpState, ckStateLength);
   96.98 +    if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
   96.99 +        jState = ckByteArrayToJByteArray(env, ckpState, ckStateLength);
  96.100 +    }
  96.101      free(ckpState);
  96.102  
  96.103 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
  96.104 -
  96.105      return jState ;
  96.106  }
  96.107  #endif
  96.108 @@ -325,6 +342,8 @@
  96.109  
  96.110      ckSessionHandle = jLongToCKULong(jSessionHandle);
  96.111      jByteArrayToCKByteArray(env, jOperationState, &ckpState, &ckStateLength);
  96.112 +    if ((*env)->ExceptionCheck(env)) { return; }
  96.113 +
  96.114      ckEncryptionKeyHandle = jLongToCKULong(jEncryptionKeyHandle);
  96.115      ckAuthenticationKeyHandle = jLongToCKULong(jAuthenticationKeyHandle);
  96.116  
  96.117 @@ -332,7 +351,7 @@
  96.118  
  96.119      free(ckpState);
  96.120  
  96.121 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
  96.122 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
  96.123  }
  96.124  #endif
  96.125  
  96.126 @@ -362,12 +381,13 @@
  96.127      ckSessionHandle = jLongToCKULong(jSessionHandle);
  96.128      ckUserType = jLongToCKULong(jUserType);
  96.129      jCharArrayToCKCharArray(env, jPin, &ckpPinArray, &ckPinLength);
  96.130 +    if ((*env)->ExceptionCheck(env)) { return; }
  96.131  
  96.132      rv = (*ckpFunctions->C_Login)(ckSessionHandle, ckUserType, ckpPinArray, ckPinLength);
  96.133  
  96.134      free(ckpPinArray);
  96.135  
  96.136 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
  96.137 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
  96.138  }
  96.139  #endif
  96.140  
  96.141 @@ -391,7 +411,7 @@
  96.142      ckSessionHandle = jLongToCKULong(jSessionHandle);
  96.143  
  96.144      rv = (*ckpFunctions->C_Logout)(ckSessionHandle);
  96.145 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
  96.146 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
  96.147  }
  96.148  #endif
  96.149  
  96.150 @@ -410,10 +430,14 @@
  96.151      NotifyListNode *currentNode, *newNode;
  96.152  
  96.153      if (notifyEncapsulation == NULL) {
  96.154 -        return ;
  96.155 +        return;
  96.156      }
  96.157  
  96.158      newNode = (NotifyListNode *) malloc(sizeof(NotifyListNode));
  96.159 +    if (newNode == NULL) {
  96.160 +        JNU_ThrowOutOfMemoryError(env, 0);
  96.161 +        return;
  96.162 +    }
  96.163      newNode->hSession = hSession;
  96.164      newNode->notifyEncapsulation = notifyEncapsulation;
  96.165      newNode->next = NULL;
  96.166 @@ -578,9 +602,10 @@
  96.167      jEvent = ckULongToJLong(event);
  96.168  
  96.169      ckNotifyClass = (*env)->FindClass(env, CLASS_NOTIFY);
  96.170 -    assert(ckNotifyClass != 0);
  96.171 +    if (ckNotifyClass == NULL) { return rv; }
  96.172      jmethod = (*env)->GetMethodID(env, ckNotifyClass, "CK_NOTIFY", "(JJLjava/lang/Object;)V");
  96.173 -    assert(jmethod != 0);
  96.174 +    if (jmethod == NULL) { return rv; }
  96.175 +
  96.176      (*env)->CallVoidMethod(env, notifyEncapsulation->jNotifyObject, jmethod,
  96.177                           jSessionHandle, jEvent, notifyEncapsulation->jApplicationData);
  96.178  
  96.179 @@ -588,10 +613,14 @@
  96.180      pkcs11Exception = (*env)->ExceptionOccurred(env);
  96.181  
  96.182      if (pkcs11Exception != NULL) {
  96.183 +        /* TBD: clear the pending exception with ExceptionClear? */
  96.184          /* The was an exception thrown, now we get the error-code from it */
  96.185          pkcs11ExceptionClass = (*env)->FindClass(env, CLASS_PKCS11EXCEPTION);
  96.186 +        if (pkcs11ExceptionClass == NULL) { return rv; }
  96.187 +
  96.188          jmethod = (*env)->GetMethodID(env, pkcs11ExceptionClass, "getErrorCode", "()J");
  96.189 -        assert(jmethod != 0);
  96.190 +        if (jmethod == NULL) { return rv; }
  96.191 +
  96.192          errorCode = (*env)->CallLongMethod(env, pkcs11Exception, jmethod);
  96.193          rv = jLongToCKULong(errorCode);
  96.194      }
    97.1 --- a/src/share/native/sun/security/pkcs11/wrapper/p11_sign.c	Thu Apr 02 10:16:53 2009 -0700
    97.2 +++ b/src/share/native/sun/security/pkcs11/wrapper/p11_sign.c	Wed Apr 08 15:40:56 2009 -0700
    97.3 @@ -1,5 +1,5 @@
    97.4  /*
    97.5 - * Portions Copyright 2003-2005 Sun Microsystems, Inc.  All Rights Reserved.
    97.6 + * Portions Copyright 2003-2009 Sun Microsystems, Inc.  All Rights Reserved.
    97.7   */
    97.8  
    97.9  /* Copyright  (c) 2002 Graz University of Technology. All rights reserved.
   97.10 @@ -77,15 +77,16 @@
   97.11  
   97.12      ckSessionHandle = jLongToCKULong(jSessionHandle);
   97.13      jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
   97.14 +    if ((*env)->ExceptionCheck(env)) { return; }
   97.15      ckKeyHandle = jLongToCKULong(jKeyHandle);
   97.16  
   97.17      rv = (*ckpFunctions->C_SignInit)(ckSessionHandle, &ckMechanism, ckKeyHandle);
   97.18  
   97.19 -    if(ckMechanism.pParameter != NULL_PTR) {
   97.20 +    if (ckMechanism.pParameter != NULL_PTR) {
   97.21          free(ckMechanism.pParameter);
   97.22      }
   97.23  
   97.24 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
   97.25 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
   97.26  }
   97.27  #endif
   97.28  
   97.29 @@ -117,14 +118,23 @@
   97.30  
   97.31      ckSessionHandle = jLongToCKULong(jSessionHandle);
   97.32      jByteArrayToCKByteArray(env, jData, &ckpData, &ckDataLength);
   97.33 +    if ((*env)->ExceptionCheck(env)) { return NULL; }
   97.34  
   97.35      /* START standard code */
   97.36  
   97.37      /* first determine the length of the signature */
   97.38      rv = (*ckpFunctions->C_Sign)(ckSessionHandle, ckpData, ckDataLength, NULL_PTR, &ckSignatureLength);
   97.39 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
   97.40 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
   97.41 +        free(ckpData);
   97.42 +        return NULL;
   97.43 +    }
   97.44  
   97.45      ckpSignature = (CK_BYTE_PTR) malloc(ckSignatureLength * sizeof(CK_BYTE));
   97.46 +    if (ckpSignature == NULL) {
   97.47 +        free(ckpData);
   97.48 +        JNU_ThrowOutOfMemoryError(env, 0);
   97.49 +        return NULL;
   97.50 +    }
   97.51  
   97.52      /* now get the signature */
   97.53      rv = (*ckpFunctions->C_Sign)(ckSessionHandle, ckpData, ckDataLength, ckpSignature, &ckSignatureLength);
   97.54 @@ -134,22 +144,31 @@
   97.55      /* START workaround code for operation abort bug in pkcs#11 of Datakey and iButton */
   97.56  /*
   97.57      ckpSignature = (CK_BYTE_PTR) malloc(256 * sizeof(CK_BYTE));
   97.58 +    if (ckpSignature == NULL) {
   97.59 +        free(ckpData);
   97.60 +        JNU_ThrowOutOfMemoryError(env, 0);
   97.61 +        return NULL;
   97.62 +    }
   97.63      rv = (*ckpFunctions->C_Sign)(ckSessionHandle, ckpData, ckDataLength, ckpSignature, &ckSignatureLength);
   97.64  
   97.65      if (rv == CKR_BUFFER_TOO_SMALL) {
   97.66          free(ckpSignature);
   97.67          ckpSignature = (CK_BYTE_PTR) malloc(ckSignatureLength * sizeof(CK_BYTE));
   97.68 +        if (ckpSignature == NULL) {
   97.69 +            free(ckpData);
   97.70 +            JNU_ThrowOutOfMemoryError(env, 0);
   97.71 +            return NULL;
   97.72 +        }
   97.73          rv = (*ckpFunctions->C_Sign)(ckSessionHandle, ckpData, ckDataLength, ckpSignature, &ckSignatureLength);
   97.74      }
   97.75   */
   97.76      /* END workaround code */
   97.77 -
   97.78 -    jSignature = ckByteArrayToJByteArray(env, ckpSignature, ckSignatureLength);
   97.79 +    if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
   97.80 +        jSignature = ckByteArrayToJByteArray(env, ckpSignature, ckSignatureLength);
   97.81 +    }
   97.82      free(ckpData);
   97.83      free(ckpSignature);
   97.84  
   97.85 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
   97.86 -
   97.87      return jSignature ;
   97.88  }
   97.89  #endif
   97.90 @@ -189,14 +208,22 @@
   97.91          bufP = BUF;
   97.92      } else {
   97.93          bufLen = min(MAX_HEAP_BUFFER_LEN, jInLen);
   97.94 -        bufP = (CK_BYTE_PTR)malloc((size_t)bufLen);
   97.95 +        bufP = (CK_BYTE_PTR) malloc((size_t)bufLen);
   97.96 +        if (bufP == NULL) {
   97.97 +            JNU_ThrowOutOfMemoryError(env, 0);
   97.98 +            return;
   97.99 +        }
  97.100      }
  97.101  
  97.102      while (jInLen > 0) {
  97.103          jsize chunkLen = min(bufLen, jInLen);
  97.104          (*env)->GetByteArrayRegion(env, jIn, jInOfs, chunkLen, (jbyte *)bufP);
  97.105 +        if ((*env)->ExceptionCheck(env)) {
  97.106 +            if (bufP != BUF) { free(bufP); }
  97.107 +            return;
  97.108 +        }
  97.109          rv = (*ckpFunctions->C_SignUpdate)(ckSessionHandle, bufP, chunkLen);
  97.110 -        if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
  97.111 +        if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
  97.112              if (bufP != BUF) {
  97.113                  free(bufP);
  97.114              }
  97.115 @@ -206,9 +233,7 @@
  97.116          jInLen -= chunkLen;
  97.117      }
  97.118  
  97.119 -    if (bufP != BUF) {
  97.120 -        free(bufP);
  97.121 -    }
  97.122 +    if (bufP != BUF) { free(bufP); }
  97.123  }
  97.124  #endif
  97.125  
  97.126 @@ -244,15 +269,18 @@
  97.127      rv = (*ckpFunctions->C_SignFinal)(ckSessionHandle, bufP, &ckSignatureLength);
  97.128      if (rv == CKR_BUFFER_TOO_SMALL) {
  97.129          bufP = (CK_BYTE_PTR) malloc(ckSignatureLength);
  97.130 +        if (bufP == NULL) {
  97.131 +            JNU_ThrowOutOfMemoryError(env, 0);
  97.132 +            return NULL;
  97.133 +        }
  97.134          rv = (*ckpFunctions->C_SignFinal)(ckSessionHandle, bufP, &ckSignatureLength);
  97.135      }
  97.136      if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
  97.137          jSignature = ckByteArrayToJByteArray(env, bufP, ckSignatureLength);
  97.138      }
  97.139  
  97.140 -    if (bufP != BUF) {
  97.141 -        free(bufP);
  97.142 -    }
  97.143 +    if (bufP != BUF) { free(bufP); }
  97.144 +
  97.145      return jSignature;
  97.146  }
  97.147  #endif
  97.148 @@ -280,11 +308,13 @@
  97.149  
  97.150      ckSessionHandle = jLongToCKULong(jSessionHandle);
  97.151      jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
  97.152 +    if ((*env)->ExceptionCheck(env)) { return; }
  97.153 +
  97.154      ckKeyHandle = jLongToCKULong(jKeyHandle);
  97.155  
  97.156      rv = (*ckpFunctions->C_SignRecoverInit)(ckSessionHandle, &ckMechanism, ckKeyHandle);
  97.157  
  97.158 -    if(ckMechanism.pParameter != NULL_PTR) {
  97.159 +    if (ckMechanism.pParameter != NULL_PTR) {
  97.160          free(ckMechanism.pParameter);
  97.161      }
  97.162  
  97.163 @@ -323,26 +353,38 @@
  97.164      if (jInLen <= MAX_STACK_BUFFER_LEN) {
  97.165          inBufP = INBUF;
  97.166      } else {
  97.167 -        inBufP = (CK_BYTE_PTR)malloc((size_t)jInLen);
  97.168 +        inBufP = (CK_BYTE_PTR) malloc((size_t)jInLen);
  97.169 +        if (inBufP == NULL) {
  97.170 +            JNU_ThrowOutOfMemoryError(env, 0);
  97.171 +            return 0;
  97.172 +        }
  97.173      }
  97.174  
  97.175      (*env)->GetByteArrayRegion(env, jIn, jInOfs, jInLen, (jbyte *)inBufP);
  97.176 +    if ((*env)->ExceptionCheck(env)) {
  97.177 +        if (inBufP != INBUF) { free(inBufP); }
  97.178 +        return 0;
  97.179 +    }
  97.180      rv = (*ckpFunctions->C_SignRecover)(ckSessionHandle, inBufP, jInLen, outBufP, &ckSignatureLength);
  97.181      /* re-alloc larger buffer if it fits into our Java buffer */
  97.182      if ((rv == CKR_BUFFER_TOO_SMALL) && (ckSignatureLength <= jIntToCKULong(jOutLen))) {
  97.183          outBufP = (CK_BYTE_PTR) malloc(ckSignatureLength);
  97.184 +        if (outBufP == NULL) {
  97.185 +            if (inBufP != INBUF) {
  97.186 +                free(inBufP);
  97.187 +            }
  97.188 +            JNU_ThrowOutOfMemoryError(env, 0);
  97.189 +            return 0;
  97.190 +        }
  97.191          rv = (*ckpFunctions->C_SignRecover)(ckSessionHandle, inBufP, jInLen, outBufP, &ckSignatureLength);
  97.192      }
  97.193      if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
  97.194          (*env)->SetByteArrayRegion(env, jOut, jOutOfs, ckSignatureLength, (jbyte *)outBufP);
  97.195      }
  97.196  
  97.197 -    if (inBufP != INBUF) {
  97.198 -        free(inBufP);
  97.199 -    }
  97.200 -    if (outBufP != OUTBUF) {
  97.201 -        free(outBufP);
  97.202 -    }
  97.203 +    if (inBufP != INBUF) { free(inBufP); }
  97.204 +    if (outBufP != OUTBUF) { free(outBufP); }
  97.205 +
  97.206      return ckSignatureLength;
  97.207  }
  97.208  #endif
  97.209 @@ -370,6 +412,8 @@
  97.210  
  97.211      ckSessionHandle = jLongToCKULong(jSessionHandle);
  97.212      jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
  97.213 +    if ((*env)->ExceptionCheck(env)) { return; }
  97.214 +
  97.215      ckKeyHandle = jLongToCKULong(jKeyHandle);
  97.216  
  97.217      rv = (*ckpFunctions->C_VerifyInit)(ckSessionHandle, &ckMechanism, ckKeyHandle);
  97.218 @@ -378,7 +422,7 @@
  97.219          free(ckMechanism.pParameter);
  97.220      }
  97.221  
  97.222 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
  97.223 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
  97.224  }
  97.225  #endif
  97.226  
  97.227 @@ -409,7 +453,13 @@
  97.228  
  97.229      ckSessionHandle = jLongToCKULong(jSessionHandle);
  97.230      jByteArrayToCKByteArray(env, jData, &ckpData, &ckDataLength);
  97.231 +    if ((*env)->ExceptionCheck(env)) { return; }
  97.232 +
  97.233      jByteArrayToCKByteArray(env, jSignature, &ckpSignature, &ckSignatureLength);
  97.234 +    if ((*env)->ExceptionCheck(env)) {
  97.235 +        free(ckpData);
  97.236 +        return;
  97.237 +    }
  97.238  
  97.239      /* verify the signature */
  97.240      rv = (*ckpFunctions->C_Verify)(ckSessionHandle, ckpData, ckDataLength, ckpSignature, ckSignatureLength);
  97.241 @@ -417,7 +467,7 @@
  97.242      free(ckpData);
  97.243      free(ckpSignature);
  97.244  
  97.245 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
  97.246 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
  97.247  }
  97.248  #endif
  97.249  
  97.250 @@ -456,26 +506,31 @@
  97.251          bufP = BUF;
  97.252      } else {
  97.253          bufLen = min(MAX_HEAP_BUFFER_LEN, jInLen);
  97.254 -        bufP = (CK_BYTE_PTR)malloc((size_t)bufLen);
  97.255 +        bufP = (CK_BYTE_PTR) malloc((size_t)bufLen);
  97.256 +        if (bufP == NULL) {
  97.257 +            JNU_ThrowOutOfMemoryError(env, 0);
  97.258 +            return;
  97.259 +        }
  97.260      }
  97.261  
  97.262      while (jInLen > 0) {
  97.263          jsize chunkLen = min(bufLen, jInLen);
  97.264          (*env)->GetByteArrayRegion(env, jIn, jInOfs, chunkLen, (jbyte *)bufP);
  97.265 +        if ((*env)->ExceptionCheck(env)) {
  97.266 +            if (bufP != BUF) { free(bufP); }
  97.267 +            return;
  97.268 +        }
  97.269 +
  97.270          rv = (*ckpFunctions->C_VerifyUpdate)(ckSessionHandle, bufP, chunkLen);
  97.271 -        if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
  97.272 -            if (bufP != BUF) {
  97.273 -                free(bufP);
  97.274 -            }
  97.275 +        if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
  97.276 +            if (bufP != BUF) { free(bufP); }
  97.277              return;
  97.278          }
  97.279          jInOfs += chunkLen;
  97.280          jInLen -= chunkLen;
  97.281      }
  97.282  
  97.283 -    if (bufP != BUF) {
  97.284 -        free(bufP);
  97.285 -    }
  97.286 +    if (bufP != BUF) { free(bufP); }
  97.287  }
  97.288  #endif
  97.289  
  97.290 @@ -502,13 +557,14 @@
  97.291  
  97.292      ckSessionHandle = jLongToCKULong(jSessionHandle);
  97.293      jByteArrayToCKByteArray(env, jSignature, &ckpSignature, &ckSignatureLength);
  97.294 +    if ((*env)->ExceptionCheck(env)) { return; }
  97.295  
  97.296      /* verify the signature */
  97.297      rv = (*ckpFunctions->C_VerifyFinal)(ckSessionHandle, ckpSignature, ckSignatureLength);
  97.298  
  97.299      free(ckpSignature);
  97.300  
  97.301 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
  97.302 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
  97.303  }
  97.304  #endif
  97.305  
  97.306 @@ -535,15 +591,17 @@
  97.307  
  97.308      ckSessionHandle = jLongToCKULong(jSessionHandle);
  97.309      jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
  97.310 +    if ((*env)->ExceptionCheck(env)) { return; }
  97.311 +
  97.312      ckKeyHandle = jLongToCKULong(jKeyHandle);
  97.313  
  97.314      rv = (*ckpFunctions->C_VerifyRecoverInit)(ckSessionHandle, &ckMechanism, ckKeyHandle);
  97.315  
  97.316 -    if(ckMechanism.pParameter != NULL_PTR) {
  97.317 +    if (ckMechanism.pParameter != NULL_PTR) {
  97.318          free(ckMechanism.pParameter);
  97.319      }
  97.320  
  97.321 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
  97.322 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
  97.323  }
  97.324  #endif
  97.325  
  97.326 @@ -578,26 +636,38 @@
  97.327      if (jInLen <= MAX_STACK_BUFFER_LEN) {
  97.328          inBufP = INBUF;
  97.329      } else {
  97.330 -        inBufP = (CK_BYTE_PTR)malloc((size_t)jInLen);
  97.331 +        inBufP = (CK_BYTE_PTR) malloc((size_t)jInLen);
  97.332 +        if (inBufP == NULL) {
  97.333 +            JNU_ThrowOutOfMemoryError(env, 0);
  97.334 +            return 0;
  97.335 +        }
  97.336      }
  97.337  
  97.338      (*env)->GetByteArrayRegion(env, jIn, jInOfs, jInLen, (jbyte *)inBufP);
  97.339 +    if ((*env)->ExceptionCheck(env)) {
  97.340 +        if (inBufP != INBUF) { free(inBufP); }
  97.341 +        return 0;
  97.342 +    }
  97.343 +
  97.344      rv = (*ckpFunctions->C_VerifyRecover)(ckSessionHandle, inBufP, jInLen, outBufP, &ckDataLength);
  97.345 +
  97.346      /* re-alloc larger buffer if it fits into our Java buffer */
  97.347      if ((rv == CKR_BUFFER_TOO_SMALL) && (ckDataLength <= jIntToCKULong(jOutLen))) {
  97.348          outBufP = (CK_BYTE_PTR) malloc(ckDataLength);
  97.349 +        if (outBufP == NULL) {
  97.350 +            if (inBufP != INBUF) { free(inBufP); }
  97.351 +            JNU_ThrowOutOfMemoryError(env, 0);
  97.352 +            return 0;
  97.353 +        }
  97.354          rv = (*ckpFunctions->C_VerifyRecover)(ckSessionHandle, inBufP, jInLen, outBufP, &ckDataLength);
  97.355      }
  97.356      if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
  97.357          (*env)->SetByteArrayRegion(env, jOut, jOutOfs, ckDataLength, (jbyte *)outBufP);
  97.358      }
  97.359  
  97.360 -    if (inBufP != INBUF) {
  97.361 -        free(inBufP);
  97.362 -    }
  97.363 -    if (outBufP != OUTBUF) {
  97.364 -        free(outBufP);
  97.365 -    }
  97.366 +    if (inBufP != INBUF) { free(inBufP); }
  97.367 +    if (outBufP != OUTBUF) { free(outBufP); }
  97.368 +
  97.369      return ckDataLength;
  97.370  }
  97.371  #endif
    98.1 --- a/src/share/native/sun/security/pkcs11/wrapper/p11_util.c	Thu Apr 02 10:16:53 2009 -0700
    98.2 +++ b/src/share/native/sun/security/pkcs11/wrapper/p11_util.c	Wed Apr 08 15:40:56 2009 -0700
    98.3 @@ -1,5 +1,5 @@
    98.4  /*
    98.5 - * Portions Copyright 2003 Sun Microsystems, Inc.  All Rights Reserved.
    98.6 + * Portions Copyright 2003-2009 Sun Microsystems, Inc.  All Rights Reserved.
    98.7   */
    98.8  
    98.9  /* Copyright  (c) 2002 Graz University of Technology. All rights reserved.
   98.10 @@ -73,11 +73,11 @@
   98.11      jmethodID jConstructor;
   98.12  
   98.13      jObjectClass = (*env)->FindClass(env, "java/lang/Object");
   98.14 -    assert(jObjectClass != 0);
   98.15 +    if (jObjectClass == NULL) { return NULL; }
   98.16      jConstructor = (*env)->GetMethodID(env, jObjectClass, "<init>", "()V");
   98.17 -    assert(jConstructor != 0);
   98.18 +    if (jConstructor == NULL) { return NULL; }
   98.19      jLockObject = (*env)->NewObject(env, jObjectClass, jConstructor);
   98.20 -    assert(jLockObject != 0);
   98.21 +    if (jLockObject == NULL) { return NULL; }
   98.22      jLockObject = (*env)->NewGlobalRef(env, jLockObject);
   98.23  
   98.24      return jLockObject ;
   98.25 @@ -200,84 +200,30 @@
   98.26          return 0L ;
   98.27      } else {
   98.28          jPKCS11ExceptionClass = (*env)->FindClass(env, CLASS_PKCS11EXCEPTION);
   98.29 -        assert(jPKCS11ExceptionClass != 0);
   98.30 -        jConstructor = (*env)->GetMethodID(env, jPKCS11ExceptionClass, "<init>", "(J)V");
   98.31 -        assert(jConstructor != 0);
   98.32 -        jErrorCode = ckULongToJLong(returnValue);
   98.33 -        jPKCS11Exception = (jthrowable) (*env)->NewObject(env, jPKCS11ExceptionClass, jConstructor, jErrorCode);
   98.34 -        (*env)->Throw(env, jPKCS11Exception);
   98.35 +        if (jPKCS11ExceptionClass != NULL) {
   98.36 +            jConstructor = (*env)->GetMethodID(env, jPKCS11ExceptionClass, "<init>", "(J)V");
   98.37 +            if (jConstructor != NULL) {
   98.38 +                jErrorCode = ckULongToJLong(returnValue);
   98.39 +                jPKCS11Exception = (jthrowable) (*env)->NewObject(env, jPKCS11ExceptionClass, jConstructor, jErrorCode);
   98.40 +                if (jPKCS11Exception != NULL) {
   98.41 +                    (*env)->Throw(env, jPKCS11Exception);
   98.42 +                }
   98.43 +            }
   98.44 +        }
   98.45 +        (*env)->DeleteLocalRef(env, jPKCS11ExceptionClass);
   98.46          return jErrorCode ;
   98.47      }
   98.48  }
   98.49  
   98.50  /*
   98.51 - * this function simply throws a FileNotFoundException
   98.52 - *
   98.53 - * @param env Used to call JNI funktions and to get the Exception class.
   98.54 - * @param jmessage The message string of the Exception object.
   98.55 - */
   98.56 -void throwFileNotFoundException(JNIEnv *env, jstring jmessage)
   98.57 -{
   98.58 -    jclass jFileNotFoundExceptionClass;
   98.59 -    jmethodID jConstructor;
   98.60 -    jthrowable jFileNotFoundException;
   98.61 -
   98.62 -    jFileNotFoundExceptionClass = (*env)->FindClass(env, CLASS_FILE_NOT_FOUND_EXCEPTION);
   98.63 -    assert(jFileNotFoundExceptionClass != 0);
   98.64 -
   98.65 -    jConstructor = (*env)->GetMethodID(env, jFileNotFoundExceptionClass, "<init>", "(Ljava/lang/String;)V");
   98.66 -    assert(jConstructor != 0);
   98.67 -    jFileNotFoundException = (jthrowable) (*env)->NewObject(env, jFileNotFoundExceptionClass, jConstructor, jmessage);
   98.68 -    (*env)->Throw(env, jFileNotFoundException);
   98.69 -}
   98.70 -
   98.71 -/*
   98.72 - * this function simply throws an IOException
   98.73 + * This function simply throws an IOException
   98.74   *
   98.75   * @param env Used to call JNI funktions and to get the Exception class.
   98.76   * @param message The message string of the Exception object.
   98.77   */
   98.78 -void throwIOException(JNIEnv *env, const char * message)
   98.79 +void throwIOException(JNIEnv *env, const char *message)
   98.80  {
   98.81 -    jclass jIOExceptionClass;
   98.82 -
   98.83 -    jIOExceptionClass = (*env)->FindClass(env, CLASS_IO_EXCEPTION);
   98.84 -    assert(jIOExceptionClass != 0);
   98.85 -
   98.86 -    (*env)->ThrowNew(env, jIOExceptionClass, message);
   98.87 -}
   98.88 -
   98.89 -/*
   98.90 - * this function simply throws an IOException and takes a unicode
   98.91 - * messge.
   98.92 - *
   98.93 - * @param env Used to call JNI funktions and to get the Exception class.
   98.94 - * @param message The unicode message string of the Exception object.
   98.95 - */
   98.96 -void throwIOExceptionUnicodeMessage(JNIEnv *env, const short *message)
   98.97 -{
   98.98 -    jclass jIOExceptionClass;
   98.99 -    jmethodID jConstructor;
  98.100 -    jthrowable jIOException;
  98.101 -    jstring jmessage;
  98.102 -    jsize length;
  98.103 -    short *currentCharacter;
  98.104 -
  98.105 -    jIOExceptionClass = (*env)->FindClass(env, CLASS_IO_EXCEPTION);
  98.106 -    assert(jIOExceptionClass != 0);
  98.107 -
  98.108 -    length = 0;
  98.109 -    if (message != NULL) {
  98.110 -        currentCharacter = (short *) message;
  98.111 -        while (*(currentCharacter++) != 0) length++;
  98.112 -    }
  98.113 -
  98.114 -    jmessage = (*env)->NewString(env, (const jchar *)message, length);
  98.115 -
  98.116 -    jConstructor = (*env)->GetMethodID(env, jIOExceptionClass, "<init>", "(Ljava/lang/String;)V");
  98.117 -    assert(jConstructor != 0);
  98.118 -    jIOException = (jthrowable) (*env)->NewObject(env, jIOExceptionClass, jConstructor, jmessage);
  98.119 -    (*env)->Throw(env, jIOException);
  98.120 +    JNU_ThrowByName(env, CLASS_IO_EXCEPTION, message);
  98.121  }
  98.122  
  98.123  /*
  98.124 @@ -288,26 +234,9 @@
  98.125   * @param env Used to call JNI funktions and to get the Exception class.
  98.126   * @param jmessage The message string of the Exception object.
  98.127   */
  98.128 -void throwPKCS11RuntimeException(JNIEnv *env, jstring jmessage)
  98.129 +void throwPKCS11RuntimeException(JNIEnv *env, const char *message)
  98.130  {
  98.131 -    jclass jPKCS11RuntimeExceptionClass;
  98.132 -    jmethodID jConstructor;
  98.133 -    jthrowable jPKCS11RuntimeException;
  98.134 -
  98.135 -    jPKCS11RuntimeExceptionClass = (*env)->FindClass(env, CLASS_PKCS11RUNTIMEEXCEPTION);
  98.136 -    assert(jPKCS11RuntimeExceptionClass != 0);
  98.137 -
  98.138 -    if (jmessage == NULL) {
  98.139 -        jConstructor = (*env)->GetMethodID(env, jPKCS11RuntimeExceptionClass, "<init>", "()V");
  98.140 -        assert(jConstructor != 0);
  98.141 -        jPKCS11RuntimeException = (jthrowable) (*env)->NewObject(env, jPKCS11RuntimeExceptionClass, jConstructor);
  98.142 -        (*env)->Throw(env, jPKCS11RuntimeException);
  98.143 -    } else {
  98.144 -        jConstructor = (*env)->GetMethodID(env, jPKCS11RuntimeExceptionClass, "<init>", "(Ljava/lang/String;)V");
  98.145 -        assert(jConstructor != 0);
  98.146 -        jPKCS11RuntimeException = (jthrowable) (*env)->NewObject(env, jPKCS11RuntimeExceptionClass, jConstructor, jmessage);
  98.147 -        (*env)->Throw(env, jPKCS11RuntimeException);
  98.148 -    }
  98.149 +    JNU_ThrowByName(env, CLASS_PKCS11RUNTIMEEXCEPTION, message);
  98.150  }
  98.151  
  98.152  /*
  98.153 @@ -318,9 +247,24 @@
  98.154   */
  98.155  void throwDisconnectedRuntimeException(JNIEnv *env)
  98.156  {
  98.157 -    jstring jExceptionMessage = (*env)->NewStringUTF(env, "This object is not connected to a module.");
  98.158 +    throwPKCS11RuntimeException(env, "This object is not connected to a module.");
  98.159 +}
  98.160  
  98.161 -    throwPKCS11RuntimeException(env, jExceptionMessage);
  98.162 +/* This function frees the specified CK_ATTRIBUTE array.
  98.163 + *
  98.164 + * @param attrPtr pointer to the to-be-freed CK_ATTRIBUTE array.
  98.165 + * @param len the length of the array
  98.166 + */
  98.167 +void freeCKAttributeArray(CK_ATTRIBUTE_PTR attrPtr, int len)
  98.168 +{
  98.169 +    int i;
  98.170 +
  98.171 +    for (i=0; i<len; i++) {
  98.172 +        if (attrPtr[i].pValue != NULL_PTR) {
  98.173 +            free(attrPtr[i].pValue);
  98.174 +        }
  98.175 +    }
  98.176 +    free(attrPtr);
  98.177  }
  98.178  
  98.179  /*
  98.180 @@ -375,8 +319,22 @@
  98.181      }
  98.182      *ckpLength = (*env)->GetArrayLength(env, jArray);
  98.183      jpTemp = (jboolean*) malloc((*ckpLength) * sizeof(jboolean));
  98.184 +    if (jpTemp == NULL) {
  98.185 +        JNU_ThrowOutOfMemoryError(env, 0);
  98.186 +        return;
  98.187 +    }
  98.188      (*env)->GetBooleanArrayRegion(env, jArray, 0, *ckpLength, jpTemp);
  98.189 +    if ((*env)->ExceptionCheck(env)) {
  98.190 +        free(jpTemp);
  98.191 +        return;
  98.192 +    }
  98.193 +
  98.194      *ckpArray = (CK_BBOOL*) malloc ((*ckpLength) * sizeof(CK_BBOOL));
  98.195 +    if (*ckpArray == NULL) {
  98.196 +        free(jpTemp);
  98.197 +        JNU_ThrowOutOfMemoryError(env, 0);
  98.198 +        return;
  98.199 +    }
  98.200      for (i=0; i<(*ckpLength); i++) {
  98.201          (*ckpArray)[i] = jBooleanToCKBBool(jpTemp[i]);
  98.202      }
  98.203 @@ -403,13 +361,26 @@
  98.204      }
  98.205      *ckpLength = (*env)->GetArrayLength(env, jArray);
  98.206      jpTemp = (jbyte*) malloc((*ckpLength) * sizeof(jbyte));
  98.207 +    if (jpTemp == NULL) {
  98.208 +        JNU_ThrowOutOfMemoryError(env, 0);
  98.209 +        return;
  98.210 +    }
  98.211      (*env)->GetByteArrayRegion(env, jArray, 0, *ckpLength, jpTemp);
  98.212 +    if ((*env)->ExceptionCheck(env)) {
  98.213 +        free(jpTemp);
  98.214 +        return;
  98.215 +    }
  98.216  
  98.217      /* if CK_BYTE is the same size as jbyte, we save an additional copy */
  98.218      if (sizeof(CK_BYTE) == sizeof(jbyte)) {
  98.219          *ckpArray = (CK_BYTE_PTR) jpTemp;
  98.220      } else {
  98.221          *ckpArray = (CK_BYTE_PTR) malloc ((*ckpLength) * sizeof(CK_BYTE));
  98.222 +        if (*ckpArray == NULL) {
  98.223 +            free(jpTemp);
  98.224 +            JNU_ThrowOutOfMemoryError(env, 0);
  98.225 +            return;
  98.226 +        }
  98.227          for (i=0; i<(*ckpLength); i++) {
  98.228              (*ckpArray)[i] = jByteToCKByte(jpTemp[i]);
  98.229          }
  98.230 @@ -437,8 +408,22 @@
  98.231      }
  98.232      *ckpLength = (*env)->GetArrayLength(env, jArray);
  98.233      jTemp = (jlong*) malloc((*ckpLength) * sizeof(jlong));
  98.234 +    if (jTemp == NULL) {
  98.235 +        JNU_ThrowOutOfMemoryError(env, 0);
  98.236 +        return;
  98.237 +    }
  98.238      (*env)->GetLongArrayRegion(env, jArray, 0, *ckpLength, jTemp);
  98.239 +    if ((*env)->ExceptionCheck(env)) {
  98.240 +        free(jTemp);
  98.241 +        return;
  98.242 +    }
  98.243 +
  98.244      *ckpArray = (CK_ULONG_PTR) malloc (*ckpLength * sizeof(CK_ULONG));
  98.245 +    if (*ckpArray == NULL) {
  98.246 +        free(jTemp);
  98.247 +        JNU_ThrowOutOfMemoryError(env, 0);
  98.248 +        return;
  98.249 +    }
  98.250      for (i=0; i<(*ckpLength); i++) {
  98.251          (*ckpArray)[i] = jLongToCKULong(jTemp[i]);
  98.252      }
  98.253 @@ -465,8 +450,22 @@
  98.254      }
  98.255      *ckpLength = (*env)->GetArrayLength(env, jArray);
  98.256      jpTemp = (jchar*) malloc((*ckpLength) * sizeof(jchar));
  98.257 +    if (jpTemp == NULL) {
  98.258 +        JNU_ThrowOutOfMemoryError(env, 0);
  98.259 +        return;
  98.260 +    }
  98.261      (*env)->GetCharArrayRegion(env, jArray, 0, *ckpLength, jpTemp);
  98.262 +    if ((*env)->ExceptionCheck(env)) {
  98.263 +        free(jpTemp);
  98.264 +        return;
  98.265 +    }
  98.266 +
  98.267      *ckpArray = (CK_CHAR_PTR) malloc (*ckpLength * sizeof(CK_CHAR));
  98.268 +    if (*ckpArray == NULL) {
  98.269 +        free(jpTemp);
  98.270 +        JNU_ThrowOutOfMemoryError(env, 0);
  98.271 +        return;
  98.272 +    }
  98.273      for (i=0; i<(*ckpLength); i++) {
  98.274          (*ckpArray)[i] = jCharToCKChar(jpTemp[i]);
  98.275      }
  98.276 @@ -493,8 +492,22 @@
  98.277      }
  98.278      *ckpLength = (*env)->GetArrayLength(env, jArray);
  98.279      jTemp = (jchar*) malloc((*ckpLength) * sizeof(jchar));
  98.280 +    if (jTemp == NULL) {
  98.281 +        JNU_ThrowOutOfMemoryError(env, 0);
  98.282 +        return;
  98.283 +    }
  98.284      (*env)->GetCharArrayRegion(env, jArray, 0, *ckpLength, jTemp);
  98.285 +    if ((*env)->ExceptionCheck(env)) {
  98.286 +        free(jTemp);
  98.287 +        return;
  98.288 +    }
  98.289 +
  98.290      *ckpArray = (CK_UTF8CHAR_PTR) malloc (*ckpLength * sizeof(CK_UTF8CHAR));
  98.291 +    if (*ckpArray == NULL) {
  98.292 +        free(jTemp);
  98.293 +        JNU_ThrowOutOfMemoryError(env, 0);
  98.294 +        return;
  98.295 +    }
  98.296      for (i=0; i<(*ckpLength); i++) {
  98.297          (*ckpArray)[i] = jCharToCKUTF8Char(jTemp[i]);
  98.298      }
  98.299 @@ -521,8 +534,15 @@
  98.300      }
  98.301  
  98.302      pCharArray = (*env)->GetStringUTFChars(env, jArray, &isCopy);
  98.303 +    if (pCharArray == NULL) { return; }
  98.304 +
  98.305      *ckpLength = strlen(pCharArray);
  98.306      *ckpArray = (CK_UTF8CHAR_PTR) malloc((*ckpLength + 1) * sizeof(CK_UTF8CHAR));
  98.307 +    if (*ckpArray == NULL) {
  98.308 +        (*env)->ReleaseStringUTFChars(env, (jstring) jArray, pCharArray);
  98.309 +        JNU_ThrowOutOfMemoryError(env, 0);
  98.310 +        return;
  98.311 +    }
  98.312      strcpy((char*)*ckpArray, pCharArray);
  98.313      (*env)->ReleaseStringUTFChars(env, (jstring) jArray, pCharArray);
  98.314  }
  98.315 @@ -552,55 +572,36 @@
  98.316      jLength = (*env)->GetArrayLength(env, jArray);
  98.317      *ckpLength = jLongToCKULong(jLength);
  98.318      *ckpArray = (CK_ATTRIBUTE_PTR) malloc(*ckpLength * sizeof(CK_ATTRIBUTE));
  98.319 +    if (*ckpArray == NULL) {
  98.320 +        JNU_ThrowOutOfMemoryError(env, 0);
  98.321 +        return;
  98.322 +    }
  98.323      TRACE1(", converting %d attibutes", jLength);
  98.324      for (i=0; i<(*ckpLength); i++) {
  98.325          TRACE1(", getting %d. attibute", i);
  98.326          jAttribute = (*env)->GetObjectArrayElement(env, jArray, i);
  98.327 +        if ((*env)->ExceptionCheck(env)) {
  98.328 +            freeCKAttributeArray(*ckpArray, i);
  98.329 +            return;
  98.330 +        }
  98.331          TRACE1(", jAttribute = %d", jAttribute);
  98.332          TRACE1(", converting %d. attibute", i);
  98.333          (*ckpArray)[i] = jAttributeToCKAttribute(env, jAttribute);
  98.334 +        if ((*env)->ExceptionCheck(env)) {
  98.335 +            freeCKAttributeArray(*ckpArray, i);
  98.336 +            return;
  98.337 +        }
  98.338      }
  98.339      TRACE0("FINISHED\n");
  98.340  }
  98.341  
  98.342  /*
  98.343 - * converts a jobjectArray to a CK_VOID_PTR array. The allocated memory has to be freed after
  98.344 - * use!
  98.345 - * NOTE: this function does not work and is not used yet
  98.346 - *
  98.347 - * @param env - used to call JNI funktions to get the array informtaion
  98.348 - * @param jArray - the Java object array to convert
  98.349 - * @param ckpArray - the reference, where the pointer to the new CK_VOID_PTR array will be stored
  98.350 - * @param ckpLength - the reference, where the array length will be stored
  98.351 - */
  98.352 -/*
  98.353 -void jObjectArrayToCKVoidPtrArray(JNIEnv *env, const jobjectArray jArray, CK_VOID_PTR_PTR *ckpArray, CK_ULONG_PTR ckpLength)
  98.354 -{
  98.355 -    jobject jTemp;
  98.356 -    CK_ULONG i;
  98.357 -
  98.358 -    if(jArray == NULL) {
  98.359 -        *ckpArray = NULL_PTR;
  98.360 -        *ckpLength = 0L;
  98.361 -        return;
  98.362 -    }
  98.363 -    *ckpLength = (*env)->GetArrayLength(env, jArray);
  98.364 -    *ckpArray = (CK_VOID_PTR_PTR) malloc (*ckpLength * sizeof(CK_VOID_PTR));
  98.365 -    for (i=0; i<(*ckpLength); i++) {
  98.366 -        jTemp = (*env)->GetObjectArrayElement(env, jArray, i);
  98.367 -        (*ckpArray)[i] = jObjectToCKVoidPtr(jTemp);
  98.368 -    }
  98.369 -    free(jTemp);
  98.370 -}
  98.371 -*/
  98.372 -
  98.373 -/*
  98.374   * converts a CK_BYTE array and its length to a jbyteArray.
  98.375   *
  98.376   * @param env - used to call JNI funktions to create the new Java array
  98.377   * @param ckpArray - the pointer to the CK_BYTE array to convert
  98.378   * @param ckpLength - the length of the array to convert
  98.379 - * @return - the new Java byte array
  98.380 + * @return - the new Java byte array or NULL if error occurred
  98.381   */
  98.382  jbyteArray ckByteArrayToJByteArray(JNIEnv *env, const CK_BYTE_PTR ckpArray, CK_ULONG ckLength)
  98.383  {
  98.384 @@ -613,17 +614,21 @@
  98.385          jpTemp = (jbyte*) ckpArray;
  98.386      } else {
  98.387          jpTemp = (jbyte*) malloc((ckLength) * sizeof(jbyte));
  98.388 +        if (jpTemp == NULL) {
  98.389 +            JNU_ThrowOutOfMemoryError(env, 0);
  98.390 +            return NULL;
  98.391 +        }
  98.392          for (i=0; i<ckLength; i++) {
  98.393              jpTemp[i] = ckByteToJByte(ckpArray[i]);
  98.394          }
  98.395      }
  98.396  
  98.397      jArray = (*env)->NewByteArray(env, ckULongToJSize(ckLength));
  98.398 -    (*env)->SetByteArrayRegion(env, jArray, 0, ckULongToJSize(ckLength), jpTemp);
  98.399 +    if (jArray != NULL) {
  98.400 +        (*env)->SetByteArrayRegion(env, jArray, 0, ckULongToJSize(ckLength), jpTemp);
  98.401 +    }
  98.402  
  98.403 -    if (sizeof(CK_BYTE) != sizeof(jbyte)) {
  98.404 -        free(jpTemp);
  98.405 -    }
  98.406 +    if (sizeof(CK_BYTE) != sizeof(jbyte)) { free(jpTemp); }
  98.407  
  98.408      return jArray ;
  98.409  }
  98.410 @@ -643,11 +648,17 @@
  98.411      jlongArray jArray;
  98.412  
  98.413      jpTemp = (jlong*) malloc((ckLength) * sizeof(jlong));
  98.414 +    if (jpTemp == NULL) {
  98.415 +        JNU_ThrowOutOfMemoryError(env, 0);
  98.416 +        return NULL;
  98.417 +    }
  98.418      for (i=0; i<ckLength; i++) {
  98.419          jpTemp[i] = ckLongToJLong(ckpArray[i]);
  98.420      }
  98.421      jArray = (*env)->NewLongArray(env, ckULongToJSize(ckLength));
  98.422 -    (*env)->SetLongArrayRegion(env, jArray, 0, ckULongToJSize(ckLength), jpTemp);
  98.423 +    if (jArray != NULL) {
  98.424 +        (*env)->SetLongArrayRegion(env, jArray, 0, ckULongToJSize(ckLength), jpTemp);
  98.425 +    }
  98.426      free(jpTemp);
  98.427  
  98.428      return jArray ;
  98.429 @@ -668,11 +679,17 @@
  98.430      jcharArray jArray;
  98.431  
  98.432      jpTemp = (jchar*) malloc(ckLength * sizeof(jchar));
  98.433 +    if (jpTemp == NULL) {
  98.434 +        JNU_ThrowOutOfMemoryError(env, 0);
  98.435 +        return NULL;
  98.436 +    }
  98.437      for (i=0; i<ckLength; i++) {
  98.438          jpTemp[i] = ckCharToJChar(ckpArray[i]);
  98.439      }
  98.440      jArray = (*env)->NewCharArray(env, ckULongToJSize(ckLength));
  98.441 -    (*env)->SetCharArrayRegion(env, jArray, 0, ckULongToJSize(ckLength), jpTemp);
  98.442 +    if (jArray != NULL) {
  98.443 +        (*env)->SetCharArrayRegion(env, jArray, 0, ckULongToJSize(ckLength), jpTemp);
  98.444 +    }
  98.445      free(jpTemp);
  98.446  
  98.447      return jArray ;
  98.448 @@ -693,11 +710,17 @@
  98.449      jcharArray jArray;
  98.450  
  98.451      jpTemp = (jchar*) malloc(ckLength * sizeof(jchar));
  98.452 +    if (jpTemp == NULL) {
  98.453 +        JNU_ThrowOutOfMemoryError(env, 0);
  98.454 +        return NULL;
  98.455 +    }
  98.456      for (i=0; i<ckLength; i++) {
  98.457          jpTemp[i] = ckUTF8CharToJChar(ckpArray[i]);
  98.458      }
  98.459      jArray = (*env)->NewCharArray(env, ckULongToJSize(ckLength));
  98.460 -    (*env)->SetCharArrayRegion(env, jArray, 0, ckULongToJSize(ckLength), jpTemp);
  98.461 +    if (jArray != NULL) {
  98.462 +        (*env)->SetCharArrayRegion(env, jArray, 0, ckULongToJSize(ckLength), jpTemp);
  98.463 +    }
  98.464      free(jpTemp);
  98.465  
  98.466      return jArray ;
  98.467 @@ -736,12 +759,11 @@
  98.468      jboolean jValue;
  98.469  
  98.470      jValueObjectClass = (*env)->FindClass(env, "java/lang/Boolean");
  98.471 -    assert(jValueObjectClass != 0);
  98.472 +    if (jValueObjectClass == NULL) { return NULL; }
  98.473      jConstructor = (*env)->GetMethodID(env, jValueObjectClass, "<init>", "(Z)V");
  98.474 -    assert(jConstructor != 0);
  98.475 +    if (jConstructor == NULL) { return NULL; }
  98.476      jValue = ckBBoolToJBoolean(*ckpValue);
  98.477      jValueObject = (*env)->NewObject(env, jValueObjectClass, jConstructor, jValue);
  98.478 -    assert(jValueObject != 0);
  98.479  
  98.480      return jValueObject ;
  98.481  }
  98.482 @@ -761,12 +783,11 @@
  98.483      jlong jValue;
  98.484  
  98.485      jValueObjectClass = (*env)->FindClass(env, "java/lang/Long");
  98.486 -    assert(jValueObjectClass != 0);
  98.487 +    if (jValueObjectClass == NULL) { return NULL; }
  98.488      jConstructor = (*env)->GetMethodID(env, jValueObjectClass, "<init>", "(J)V");
  98.489 -    assert(jConstructor != 0);
  98.490 +    if (jConstructor == NULL) { return NULL; }
  98.491      jValue = ckULongToJLong(*ckpValue);
  98.492      jValueObject = (*env)->NewObject(env, jValueObjectClass, jConstructor, jValue);
  98.493 -    assert(jValueObject != 0);
  98.494  
  98.495      return jValueObject ;
  98.496  }
  98.497 @@ -787,11 +808,15 @@
  98.498      CK_BBOOL *ckpValue;
  98.499  
  98.500      jObjectClass = (*env)->FindClass(env, "java/lang/Boolean");
  98.501 -    assert(jObjectClass != 0);
  98.502 +    if (jObjectClass == NULL) { return NULL; }
  98.503      jValueMethod = (*env)->GetMethodID(env, jObjectClass, "booleanValue", "()Z");
  98.504 -    assert(jValueMethod != 0);
  98.505 +    if (jValueMethod == NULL) { return NULL; }
  98.506      jValue = (*env)->CallBooleanMethod(env, jObject, jValueMethod);
  98.507      ckpValue = (CK_BBOOL *) malloc(sizeof(CK_BBOOL));
  98.508 +    if (ckpValue == NULL) {
  98.509 +        JNU_ThrowOutOfMemoryError(env, 0);
  98.510 +        return NULL;
  98.511 +    }
  98.512      *ckpValue = jBooleanToCKBBool(jValue);
  98.513  
  98.514      return ckpValue ;
  98.515 @@ -813,13 +838,16 @@
  98.516      CK_BYTE_PTR ckpValue;
  98.517  
  98.518      jObjectClass = (*env)->FindClass(env, "java/lang/Byte");
  98.519 -    assert(jObjectClass != 0);
  98.520 +    if (jObjectClass == NULL) { return NULL; }
  98.521      jValueMethod = (*env)->GetMethodID(env, jObjectClass, "byteValue", "()B");
  98.522 -    assert(jValueMethod != 0);
  98.523 +    if (jValueMethod == NULL) { return NULL; }
  98.524      jValue = (*env)->CallByteMethod(env, jObject, jValueMethod);
  98.525      ckpValue = (CK_BYTE_PTR) malloc(sizeof(CK_BYTE));
  98.526 +    if (ckpValue == NULL) {
  98.527 +        JNU_ThrowOutOfMemoryError(env, 0);
  98.528 +        return NULL;
  98.529 +    }
  98.530      *ckpValue = jByteToCKByte(jValue);
  98.531 -
  98.532      return ckpValue ;
  98.533  }
  98.534  
  98.535 @@ -839,13 +867,16 @@
  98.536      CK_ULONG *ckpValue;
  98.537  
  98.538      jObjectClass = (*env)->FindClass(env, "java/lang/Integer");
  98.539 -    assert(jObjectClass != 0);
  98.540 +    if (jObjectClass == NULL) { return NULL; }
  98.541      jValueMethod = (*env)->GetMethodID(env, jObjectClass, "intValue", "()I");
  98.542 -    assert(jValueMethod != 0);
  98.543 +    if (jValueMethod == NULL) { return NULL; }
  98.544      jValue = (*env)->CallIntMethod(env, jObject, jValueMethod);
  98.545      ckpValue = (CK_ULONG *) malloc(sizeof(CK_ULONG));
  98.546 +    if (ckpValue == NULL) {
  98.547 +        JNU_ThrowOutOfMemoryError(env, 0);
  98.548 +        return NULL;
  98.549 +    }
  98.550      *ckpValue = jLongToCKLong(jValue);
  98.551 -
  98.552      return ckpValue ;
  98.553  }
  98.554  
  98.555 @@ -865,11 +896,15 @@
  98.556      CK_ULONG *ckpValue;
  98.557  
  98.558      jObjectClass = (*env)->FindClass(env, "java/lang/Long");
  98.559 -    assert(jObjectClass != 0);
  98.560 +    if (jObjectClass == NULL) { return NULL; }
  98.561      jValueMethod = (*env)->GetMethodID(env, jObjectClass, "longValue", "()J");
  98.562 -    assert(jValueMethod != 0);
  98.563 +    if (jValueMethod == NULL) { return NULL; }
  98.564      jValue = (*env)->CallLongMethod(env, jObject, jValueMethod);
  98.565      ckpValue = (CK_ULONG *) malloc(sizeof(CK_ULONG));
  98.566 +    if (ckpValue == NULL) {
  98.567 +        JNU_ThrowOutOfMemoryError(env, 0);
  98.568 +        return NULL;
  98.569 +    }
  98.570      *ckpValue = jLongToCKULong(jValue);
  98.571  
  98.572      return ckpValue ;
  98.573 @@ -891,11 +926,15 @@
  98.574      CK_CHAR_PTR ckpValue;
  98.575  
  98.576      jObjectClass = (*env)->FindClass(env, "java/lang/Char");
  98.577 -    assert(jObjectClass != 0);
  98.578 +    if (jObjectClass == NULL) { return NULL; }
  98.579      jValueMethod = (*env)->GetMethodID(env, jObjectClass, "charValue", "()C");
  98.580 -    assert(jValueMethod != 0);
  98.581 +    if (jValueMethod == NULL) { return NULL; }
  98.582      jValue = (*env)->CallCharMethod(env, jObject, jValueMethod);
  98.583      ckpValue = (CK_CHAR_PTR) malloc(sizeof(CK_CHAR));
  98.584 +    if (ckpValue == NULL) {
  98.585 +        JNU_ThrowOutOfMemoryError(env, 0);
  98.586 +        return NULL;
  98.587 +    }
  98.588      *ckpValue = jCharToCKChar(jValue);
  98.589  
  98.590      return ckpValue ;
  98.591 @@ -913,124 +952,172 @@
  98.592   */
  98.593  void jObjectToPrimitiveCKObjectPtrPtr(JNIEnv *env, jobject jObject, CK_VOID_PTR *ckpObjectPtr, CK_ULONG *ckpLength)
  98.594  {
  98.595 -    jclass jBooleanClass     = (*env)->FindClass(env, "java/lang/Boolean");
  98.596 -    jclass jByteClass        = (*env)->FindClass(env, "java/lang/Byte");
  98.597 -    jclass jCharacterClass   = (*env)->FindClass(env, "java/lang/Character");
  98.598 -    jclass jClassClass = (*env)->FindClass(env, "java/lang/Class");
  98.599 -    /* jclass jShortClass       = (*env)->FindClass(env, "java/lang/Short"); */
  98.600 -    jclass jIntegerClass     = (*env)->FindClass(env, "java/lang/Integer");
  98.601 -    jclass jLongClass        = (*env)->FindClass(env, "java/lang/Long");
  98.602 -    /* jclass jFloatClass       = (*env)->FindClass(env, "java/lang/Float"); */
  98.603 -    /* jclass jDoubleClass      = (*env)->FindClass(env, "java/lang/Double"); */
  98.604 -    jclass jDateClass      = (*env)->FindClass(env, CLASS_DATE);
  98.605 -    jclass jStringClass      = (*env)->FindClass(env, "java/lang/String");
  98.606 -    jclass jStringBufferClass      = (*env)->FindClass(env, "java/lang/StringBuffer");
  98.607 -    jclass jBooleanArrayClass = (*env)->FindClass(env, "[Z");
  98.608 -    jclass jByteArrayClass    = (*env)->FindClass(env, "[B");
  98.609 -    jclass jCharArrayClass    = (*env)->FindClass(env, "[C");
  98.610 -    /* jclass jShortArrayClass   = (*env)->FindClass(env, "[S"); */
  98.611 -    jclass jIntArrayClass     = (*env)->FindClass(env, "[I");
  98.612 -    jclass jLongArrayClass    = (*env)->FindClass(env, "[J");
  98.613 -    /* jclass jFloatArrayClass   = (*env)->FindClass(env, "[F"); */
  98.614 -    /* jclass jDoubleArrayClass  = (*env)->FindClass(env, "[D"); */
  98.615 -    jclass jObjectClass = (*env)->FindClass(env, "java/lang/Object");
  98.616 -    /* jclass jObjectArrayClass = (*env)->FindClass(env, "[java/lang/Object"); */
  98.617 -    /* ATTENTION: jObjectArrayClass is always NULL !! */
  98.618 -    /* CK_ULONG ckArrayLength; */
  98.619 -    /* CK_VOID_PTR *ckpElementObject; */
  98.620 -    /* CK_ULONG ckElementLength; */
  98.621 -    /* CK_ULONG i; */
  98.622 +    jclass jLongClass, jBooleanClass, jByteArrayClass, jCharArrayClass;
  98.623 +    jclass jByteClass, jDateClass, jCharacterClass, jIntegerClass;
  98.624 +    jclass jBooleanArrayClass, jIntArrayClass, jLongArrayClass;
  98.625 +    jclass jStringClass;
  98.626 +    jclass jObjectClass, jClassClass;
  98.627      CK_VOID_PTR ckpVoid = *ckpObjectPtr;
  98.628      jmethodID jMethod;
  98.629      jobject jClassObject;
  98.630      jstring jClassNameString;
  98.631 -    jstring jExceptionMessagePrefix;
  98.632 -    jobject jExceptionMessageStringBuffer;
  98.633 -    jstring jExceptionMessage;
  98.634 +    char *classNameString, *exceptionMsgPrefix, *exceptionMsg;
  98.635  
  98.636      TRACE0("\nDEBUG: jObjectToPrimitiveCKObjectPtrPtr");
  98.637      if (jObject == NULL) {
  98.638          *ckpObjectPtr = NULL;
  98.639          *ckpLength = 0;
  98.640 -    } else if ((*env)->IsInstanceOf(env, jObject, jLongClass)) {
  98.641 +        return;
  98.642 +    }
  98.643 +
  98.644 +    jLongClass = (*env)->FindClass(env, "java/lang/Long");
  98.645 +    if (jLongClass == NULL) { return; }
  98.646 +    if ((*env)->IsInstanceOf(env, jObject, jLongClass)) {
  98.647          *ckpObjectPtr = jLongObjectToCKULongPtr(env, jObject);
  98.648          *ckpLength = sizeof(CK_ULONG);
  98.649          TRACE1("<converted long value %X>", *((CK_ULONG *) *ckpObjectPtr));
  98.650 -    } else if ((*env)->IsInstanceOf(env, jObject, jBooleanClass)) {
  98.651 +        return;
  98.652 +    }
  98.653 +
  98.654 +    jBooleanClass = (*env)->FindClass(env, "java/lang/Boolean");
  98.655 +    if (jBooleanClass == NULL) { return; }
  98.656 +    if ((*env)->IsInstanceOf(env, jObject, jBooleanClass)) {
  98.657          *ckpObjectPtr = jBooleanObjectToCKBBoolPtr(env, jObject);
  98.658          *ckpLength = sizeof(CK_BBOOL);
  98.659          TRACE0(" <converted boolean value ");
  98.660          TRACE0((*((CK_BBOOL *) *ckpObjectPtr) == TRUE) ? "TRUE>" : "FALSE>");
  98.661 -    } else if ((*env)->IsInstanceOf(env, jObject, jByteArrayClass)) {
  98.662 +        return;
  98.663 +    }
  98.664 +
  98.665 +    jByteArrayClass = (*env)->FindClass(env, "[B");
  98.666 +    if (jByteArrayClass == NULL) { return; }
  98.667 +    if ((*env)->IsInstanceOf(env, jObject, jByteArrayClass)) {
  98.668          jByteArrayToCKByteArray(env, jObject, (CK_BYTE_PTR*)ckpObjectPtr, ckpLength);
  98.669 -    } else if ((*env)->IsInstanceOf(env, jObject, jCharArrayClass)) {
  98.670 +        return;
  98.671 +    }
  98.672 +
  98.673 +    jCharArrayClass = (*env)->FindClass(env, "[C");
  98.674 +    if (jCharArrayClass == NULL) { return; }
  98.675 +    if ((*env)->IsInstanceOf(env, jObject, jCharArrayClass)) {
  98.676          jCharArrayToCKUTF8CharArray(env, jObject, (CK_UTF8CHAR_PTR*)ckpObjectPtr, ckpLength);
  98.677 -    } else if ((*env)->IsInstanceOf(env, jObject, jByteClass)) {
  98.678 +        return;
  98.679 +    }
  98.680 +
  98.681 +    jByteClass = (*env)->FindClass(env, "java/lang/Byte");
  98.682 +    if (jByteClass == NULL) { return; }
  98.683 +    if ((*env)->IsInstanceOf(env, jObject, jByteClass)) {
  98.684          *ckpObjectPtr = jByteObjectToCKBytePtr(env, jObject);
  98.685          *ckpLength = sizeof(CK_BYTE);
  98.686          TRACE1("<converted byte value %X>", *((CK_BYTE *) *ckpObjectPtr));
  98.687 -    } else if ((*env)->IsInstanceOf(env, jObject, jDateClass)) {
  98.688 +        return;
  98.689 +    }
  98.690 +
  98.691 +    jDateClass = (*env)->FindClass(env, CLASS_DATE);
  98.692 +    if (jDateClass == NULL) { return; }
  98.693 +    if ((*env)->IsInstanceOf(env, jObject, jDateClass)) {
  98.694          *ckpObjectPtr = jDateObjectPtrToCKDatePtr(env, jObject);
  98.695          *ckpLength = sizeof(CK_DATE);
  98.696 -        TRACE3("<converted date value %.4s-%.2s-%.2s>", (*((CK_DATE *) *ckpObjectPtr)).year,
  98.697 -                                                    (*((CK_DATE *) *ckpObjectPtr)).month,
  98.698 -                                                    (*((CK_DATE *) *ckpObjectPtr)).day);
  98.699 -    } else if ((*env)->IsInstanceOf(env, jObject, jCharacterClass)) {
  98.700 +        TRACE3("<converted date value %.4s-%.2s-%.2s>", (*((CK_DATE *) *ckpObjectPtr)).year, (*((CK_DATE *) *ckpObjectPtr)).month, (*((CK_DATE *) *ckpObjectPtr)).day);
  98.701 +        return;
  98.702 +    }
  98.703 +
  98.704 +    jCharacterClass = (*env)->FindClass(env, "java/lang/Character");
  98.705 +    if (jCharacterClass == NULL) { return; }
  98.706 +    if ((*env)->IsInstanceOf(env, jObject, jCharacterClass)) {
  98.707          *ckpObjectPtr = jCharObjectToCKCharPtr(env, jObject);
  98.708          *ckpLength = sizeof(CK_UTF8CHAR);
  98.709          TRACE1("<converted char value %c>", *((CK_CHAR *) *ckpObjectPtr));
  98.710 -    } else if ((*env)->IsInstanceOf(env, jObject, jIntegerClass)) {
  98.711 +        return;
  98.712 +    }
  98.713 +
  98.714 +    jIntegerClass = (*env)->FindClass(env, "java/lang/Integer");
  98.715 +    if (jIntegerClass == NULL) { return; }
  98.716 +    if ((*env)->IsInstanceOf(env, jObject, jIntegerClass)) {
  98.717          *ckpObjectPtr = jIntegerObjectToCKULongPtr(env, jObject);
  98.718          *ckpLength = sizeof(CK_ULONG);
  98.719          TRACE1("<converted integer value %X>", *((CK_ULONG *) *ckpObjectPtr));
  98.720 -    } else if ((*env)->IsInstanceOf(env, jObject, jBooleanArrayClass)) {
  98.721 +        return;
  98.722 +    }
  98.723 +
  98.724 +    jBooleanArrayClass = (*env)->FindClass(env, "[Z");
  98.725 +    if (jBooleanArrayClass == NULL) { return; }
  98.726 +    if ((*env)->IsInstanceOf(env, jObject, jBooleanArrayClass)) {
  98.727          jBooleanArrayToCKBBoolArray(env, jObject, (CK_BBOOL**)ckpObjectPtr, ckpLength);
  98.728 -    } else if ((*env)->IsInstanceOf(env, jObject, jIntArrayClass)) {
  98.729 +        return;
  98.730 +    }
  98.731 +
  98.732 +    jIntArrayClass = (*env)->FindClass(env, "[I");
  98.733 +    if (jIntArrayClass == NULL) { return; }
  98.734 +    if ((*env)->IsInstanceOf(env, jObject, jIntArrayClass)) {
  98.735          jLongArrayToCKULongArray(env, jObject, (CK_ULONG_PTR*)ckpObjectPtr, ckpLength);
  98.736 -    } else if ((*env)->IsInstanceOf(env, jObject, jLongArrayClass)) {
  98.737 +        return;
  98.738 +    }
  98.739 +
  98.740 +    jLongArrayClass = (*env)->FindClass(env, "[J");
  98.741 +    if (jLongArrayClass == NULL) { return; }
  98.742 +    if ((*env)->IsInstanceOf(env, jObject, jLongArrayClass)) {
  98.743          jLongArrayToCKULongArray(env, jObject, (CK_ULONG_PTR*)ckpObjectPtr, ckpLength);
  98.744 -    } else if ((*env)->IsInstanceOf(env, jObject, jStringClass)) {
  98.745 +        return;
  98.746 +    }
  98.747 +
  98.748 +    jStringClass = (*env)->FindClass(env, "java/lang/String");
  98.749 +    if (jStringClass == NULL) { return; }
  98.750 +    if ((*env)->IsInstanceOf(env, jObject, jStringClass)) {
  98.751          jStringToCKUTF8CharArray(env, jObject, (CK_UTF8CHAR_PTR*)ckpObjectPtr, ckpLength);
  98.752 +        return;
  98.753 +    }
  98.754  
  98.755 -        /* a Java object array is not used by CK_ATTRIBUTE by now... */
  98.756 -/*  } else if ((*env)->IsInstanceOf(env, jObject, jObjectArrayClass)) {
  98.757 -        ckArrayLength = (*env)->GetArrayLength(env, (jarray) jObject);
  98.758 -        ckpObjectPtr = (CK_VOID_PTR_PTR) malloc(sizeof(CK_VOID_PTR) * ckArrayLength);
  98.759 -        *ckpLength = 0;
  98.760 -        for (i = 0; i < ckArrayLength; i++) {
  98.761 -            jObjectToPrimitiveCKObjectPtrPtr(env, (*env)->GetObjectArrayElement(env, (jarray) jObject, i),
  98.762 -                     ckpElementObject, &ckElementLength);
  98.763 -            (*ckpObjectPtr)[i] = *ckpElementObject;
  98.764 -            *ckpLength += ckElementLength;
  98.765 -        }
  98.766 -*/
  98.767 -    } else {
  98.768 -        /* type of jObject unknown, throw PKCS11RuntimeException */
  98.769 -        jMethod = (*env)->GetMethodID(env, jObjectClass, "getClass", "()Ljava/lang/Class;");
  98.770 -        assert(jMethod != 0);
  98.771 -        jClassObject = (*env)->CallObjectMethod(env, jObject, jMethod);
  98.772 -        assert(jClassObject != 0);
  98.773 -        jMethod = (*env)->GetMethodID(env, jClassClass, "getName", "()Ljava/lang/String;");
  98.774 -        assert(jMethod != 0);
  98.775 -        jClassNameString = (jstring)
  98.776 -                (*env)->CallObjectMethod(env, jClassObject, jMethod);
  98.777 -        assert(jClassNameString != 0);
  98.778 -        jExceptionMessagePrefix = (*env)->NewStringUTF(env, "Java object of this class cannot be converted to native PKCS#11 type: ");
  98.779 -        jMethod = (*env)->GetMethodID(env, jStringBufferClass, "<init>", "(Ljava/lang/String;)V");
  98.780 -        assert(jMethod != 0);
  98.781 -        jExceptionMessageStringBuffer = (*env)->NewObject(env, jStringBufferClass, jMethod, jExceptionMessagePrefix);
  98.782 -        assert(jClassNameString != 0);
  98.783 -        jMethod = (*env)->GetMethodID(env, jStringBufferClass, "append", "(Ljava/lang/String;)Ljava/lang/StringBuffer;");
  98.784 -        assert(jMethod != 0);
  98.785 -        jExceptionMessage = (jstring)
  98.786 -                 (*env)->CallObjectMethod(env, jExceptionMessageStringBuffer, jMethod, jClassNameString);
  98.787 -        assert(jExceptionMessage != 0);
  98.788 -
  98.789 -        throwPKCS11RuntimeException(env, jExceptionMessage);
  98.790 -
  98.791 -        *ckpObjectPtr = NULL;
  98.792 -        *ckpLength = 0;
  98.793 +    /* type of jObject unknown, throw PKCS11RuntimeException */
  98.794 +    jObjectClass = (*env)->FindClass(env, "java/lang/Object");
  98.795 +    if (jObjectClass == NULL) { return; }
  98.796 +    jMethod = (*env)->GetMethodID(env, jObjectClass, "getClass", "()Ljava/lang/Class;");
  98.797 +    if (jMethod == NULL) { return; }
  98.798 +    jClassObject = (*env)->CallObjectMethod(env, jObject, jMethod);
  98.799 +    assert(jClassObject != 0);
  98.800 +    jClassClass = (*env)->FindClass(env, "java/lang/Class");
  98.801 +    if (jClassClass == NULL) { return; }
  98.802 +    jMethod = (*env)->GetMethodID(env, jClassClass, "getName", "()Ljava/lang/String;");
  98.803 +    if (jMethod == NULL) { return; }
  98.804 +    jClassNameString = (jstring)
  98.805 +        (*env)->CallObjectMethod(env, jClassObject, jMethod);
  98.806 +    assert(jClassNameString != 0);
  98.807 +    classNameString = (char*)
  98.808 +        (*env)->GetStringUTFChars(env, jClassNameString, NULL);
  98.809 +    if (classNameString == NULL) { return; }
  98.810 +    exceptionMsgPrefix = "Java object of this class cannot be converted to native PKCS#11 type: ";
  98.811 +    exceptionMsg = (char *)
  98.812 +        malloc((strlen(exceptionMsgPrefix) + strlen(classNameString) + 1));
  98.813 +    if (exceptionMsg == NULL) {
  98.814 +        (*env)->ReleaseStringUTFChars(env, jClassNameString, classNameString);
  98.815 +        JNU_ThrowOutOfMemoryError(env, 0);
  98.816 +        return;
  98.817      }
  98.818 +    strcpy(exceptionMsg, exceptionMsgPrefix);
  98.819 +    strcat(exceptionMsg, classNameString);
  98.820 +    (*env)->ReleaseStringUTFChars(env, jClassNameString, classNameString);
  98.821 +    throwPKCS11RuntimeException(env, exceptionMsg);
  98.822 +    free(exceptionMsg);
  98.823 +    *ckpObjectPtr = NULL;
  98.824 +    *ckpLength = 0;
  98.825  
  98.826      TRACE0("FINISHED\n");
  98.827  }
  98.828 +
  98.829 +#ifdef P11_MEMORYDEBUG
  98.830 +
  98.831 +#undef malloc
  98.832 +#undef free
  98.833 +
  98.834 +void *p11malloc(size_t c, char *file, int line) {
  98.835 +    void *p = malloc(c);
  98.836 +    printf("malloc\t%08x\t%d\t%s:%d\n", p, c, file, line); fflush(stdout);
  98.837 +    return p;
  98.838 +}
  98.839 +
  98.840 +void p11free(void *p, char *file, int line) {
  98.841 +    printf("free\t%08x\t\t%s:%d\n", p, file, line); fflush(stdout);
  98.842 +    free(p);
  98.843 +}
  98.844 +
  98.845 +#endif
  98.846 +
    99.1 --- a/src/share/native/sun/security/pkcs11/wrapper/pkcs11wrapper.h	Thu Apr 02 10:16:53 2009 -0700
    99.2 +++ b/src/share/native/sun/security/pkcs11/wrapper/pkcs11wrapper.h	Wed Apr 08 15:40:56 2009 -0700
    99.3 @@ -1,5 +1,5 @@
    99.4  /*
    99.5 - * Portions Copyright 2003-2006 Sun Microsystems, Inc.  All Rights Reserved.
    99.6 + * Portions Copyright 2003-2009 Sun Microsystems, Inc.  All Rights Reserved.
    99.7   */
    99.8  
    99.9  /* Copyright  (c) 2002 Graz University of Technology. All rights reserved.
   99.10 @@ -154,6 +154,7 @@
   99.11  
   99.12  #include "pkcs11.h"
   99.13  #include <jni.h>
   99.14 +#include <jni_util.h>
   99.15  
   99.16  #define MAX_STACK_BUFFER_LEN (4 * 1024)
   99.17  #define MAX_HEAP_BUFFER_LEN (64 * 1024)
   99.18 @@ -277,12 +278,14 @@
   99.19   */
   99.20  
   99.21  jlong ckAssertReturnValueOK(JNIEnv *env, CK_RV returnValue);
   99.22 -void throwPKCS11RuntimeException(JNIEnv *env, jstring jmessage);
   99.23 -void throwFileNotFoundException(JNIEnv *env, jstring jmessage);
   99.24  void throwIOException(JNIEnv *env, const char *message);
   99.25 -void throwIOExceptionUnicodeMessage(JNIEnv *env, const short *message);
   99.26 +void throwPKCS11RuntimeException(JNIEnv *env, const char *message);
   99.27  void throwDisconnectedRuntimeException(JNIEnv *env);
   99.28  
   99.29 +/* function to free CK_ATTRIBUTE array
   99.30 + */
   99.31 +void freeCKAttributeArray(CK_ATTRIBUTE_PTR attrPtr, int len);
   99.32 +
   99.33  /* funktions to convert Java arrays to a CK-type array and the array length */
   99.34  
   99.35  void jBooleanArrayToCKBBoolArray(JNIEnv *env, const jbooleanArray jArray, CK_BBOOL **ckpArray, CK_ULONG_PTR ckLength);
   99.36 @@ -438,3 +441,15 @@
   99.37  extern jobject jInitArgsObject;
   99.38  extern CK_C_INITIALIZE_ARGS_PTR ckpGlobalInitArgs;
   99.39  #endif /* NO_CALLBACKS */
   99.40 +
   99.41 +#ifdef P11_MEMORYDEBUG
   99.42 +#include <stdlib.h>
   99.43 +
   99.44 +/* Simple malloc/free dumper */
   99.45 +void *p11malloc(size_t c, char *file, int line);
   99.46 +void p11free(void *p, char *file, int line);
   99.47 +
   99.48 +#define malloc(c)       (p11malloc((c), __FILE__, __LINE__))
   99.49 +#define free(c)         (p11free((c), __FILE__, __LINE__))
   99.50 +
   99.51 +#endif
   100.1 --- a/src/solaris/classes/sun/nio/ch/UnixAsynchronousSocketChannelImpl.java	Thu Apr 02 10:16:53 2009 -0700
   100.2 +++ b/src/solaris/classes/sun/nio/ch/UnixAsynchronousSocketChannelImpl.java	Wed Apr 08 15:40:56 2009 -0700
   100.3 @@ -16,7 +16,7 @@
   100.4   *
   100.5   * You should have received a copy of the GNU General Public License version
   100.6   * 2 along with this work; if not, write to the Free Software Foundation,
   100.7 - * Inc., 51 Franklin St, Fifth Floor, Boston, MA conne02110-1301 USA.
   100.8 + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
   100.9   *
  100.10   * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
  100.11   * CA 95054 USA or visit www.sun.com if you need additional information or
   101.1 --- a/src/solaris/native/java/net/NetworkInterface.c	Thu Apr 02 10:16:53 2009 -0700
   101.2 +++ b/src/solaris/native/java/net/NetworkInterface.c	Wed Apr 08 15:40:56 2009 -0700
   101.3 @@ -1,5 +1,5 @@
   101.4  /*
   101.5 - * Copyright 2000-2008 Sun Microsystems, Inc.  All Rights Reserved.
   101.6 + * Copyright 2000-2009 Sun Microsystems, Inc.  All Rights Reserved.
   101.7   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   101.8   *
   101.9   * This code is free software; you can redistribute it and/or modify it
   102.1 --- a/src/windows/classes/sun/nio/ch/WindowsAsynchronousSocketChannelImpl.java	Thu Apr 02 10:16:53 2009 -0700
   102.2 +++ b/src/windows/classes/sun/nio/ch/WindowsAsynchronousSocketChannelImpl.java	Wed Apr 08 15:40:56 2009 -0700
   102.3 @@ -16,7 +16,7 @@
   102.4   *
   102.5   * You should have received a copy of the GNU General Public License version
   102.6   * 2 along with this work; if not, write to the Free Software Foundation,
   102.7 - * Inc., 51 Franklin St, Fifth Floor, Boston, MA conne02110-1301 USA.
   102.8 + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
   102.9   *
  102.10   * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
  102.11   * CA 95054 USA or visit www.sun.com if you need additional information or
   103.1 --- a/src/windows/native/sun/windows/awt.rc	Thu Apr 02 10:16:53 2009 -0700
   103.2 +++ b/src/windows/native/sun/windows/awt.rc	Wed Apr 08 15:40:56 2009 -0700
   103.3 @@ -23,7 +23,7 @@
   103.4  // have any questions.
   103.5  //
   103.6  
   103.7 -#include "afxres.h"
   103.8 +#include "windows.h"
   103.9  
  103.10  // Need 2 defines so macro argument to XSTR will get expanded before quoting.
  103.11  #define XSTR(x) STR(x)
   104.1 --- a/src/windows/resource/version.rc	Thu Apr 02 10:16:53 2009 -0700
   104.2 +++ b/src/windows/resource/version.rc	Wed Apr 08 15:40:56 2009 -0700
   104.3 @@ -23,7 +23,7 @@
   104.4  // have any questions.
   104.5  //
   104.6  
   104.7 -#include "afxres.h"
   104.8 +#include "windows.h"
   104.9  
  104.10  // Need 2 defines so macro argument to XSTR will get expanded before quoting.
  104.11  #define XSTR(x) STR(x)
   105.1 --- a/test/Makefile	Thu Apr 02 10:16:53 2009 -0700
   105.2 +++ b/test/Makefile	Wed Apr 08 15:40:56 2009 -0700
   105.3 @@ -1,12 +1,44 @@
   105.4  #
   105.5 -# Makefile to run jtreg
   105.6 +# Copyright 1995-2008 Sun Microsystems, Inc.  All Rights Reserved.
   105.7 +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   105.8 +#
   105.9 +# This code is free software; you can redistribute it and/or modify it
  105.10 +# under the terms of the GNU General Public License version 2 only, as
  105.11 +# published by the Free Software Foundation.  Sun designates this
  105.12 +# particular file as subject to the "Classpath" exception as provided
  105.13 +# by Sun in the LICENSE file that accompanied this code.
  105.14 +#
  105.15 +# This code is distributed in the hope that it will be useful, but WITHOUT
  105.16 +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  105.17 +# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  105.18 +# version 2 for more details (a copy is included in the LICENSE file that
  105.19 +# accompanied this code).
  105.20 +#
  105.21 +# You should have received a copy of the GNU General Public License version
  105.22 +# 2 along with this work; if not, write to the Free Software Foundation,
  105.23 +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  105.24 +#
  105.25 +# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
  105.26 +# CA 95054 USA or visit www.sun.com if you need additional information or
  105.27 +# have any questions.
  105.28 +#
  105.29 +
  105.30 +#
  105.31 +# Makefile to run various jdk tests
  105.32  #
  105.33  
  105.34  # Get OS/ARCH specifics
  105.35  OSNAME = $(shell uname -s)
  105.36 +
  105.37 +# Commands to run on paths to make mixed paths for java on windows
  105.38 +GETMIXEDPATH=echo
  105.39 +
  105.40 +# Location of developer shared files
  105.41 +SLASH_JAVA = /java
  105.42 +
  105.43 +# Platform specific settings
  105.44  ifeq ($(OSNAME), SunOS)
  105.45    PLATFORM = solaris
  105.46 -  JCT_PLATFORM = solaris
  105.47    ARCH = $(shell uname -p)
  105.48    ifeq ($(ARCH), i386)
  105.49      ARCH=i586
  105.50 @@ -14,97 +46,403 @@
  105.51  endif
  105.52  ifeq ($(OSNAME), Linux)
  105.53    PLATFORM = linux
  105.54 -  JCT_PLATFORM = linux
  105.55    ARCH = $(shell uname -m)
  105.56    ifeq ($(ARCH), i386)
  105.57      ARCH=i586
  105.58    endif
  105.59  endif
  105.60 -ifeq ($(OSNAME), Windows_NT)
  105.61 +
  105.62 +# Cannot trust uname output
  105.63 +ifneq ($(PROCESSOR_IDENTIFIER), )
  105.64    PLATFORM = windows
  105.65 -  JCT_PLATFORM = win32
  105.66 -  ifeq ($(word 1, $(PROCESSOR_IDENTIFIER)),ia64)
  105.67 -    ARCH=ia64
  105.68 +  SLASH_JAVA = J:
  105.69 +  # A variety of ways to say X64 arch :^(
  105.70 +  PROC_ARCH:=$(word 1, $(PROCESSOR_IDENTIFIER))
  105.71 +  PROC_ARCH:=$(subst x86,X86,$(PROC_ARCH))
  105.72 +  PROC_ARCH:=$(subst x64,X64,$(PROC_ARCH))
  105.73 +  PROC_ARCH:=$(subst AMD64,X64,$(PROC_ARCH))
  105.74 +  PROC_ARCH:=$(subst amd64,X64,$(PROC_ARCH))
  105.75 +  PROC_ARCH:=$(subst EM64T,X64,$(PROC_ARCH))
  105.76 +  PROC_ARCH:=$(subst em64t,X64,$(PROC_ARCH))
  105.77 +  PROC_ARCH:=$(subst intel64,X64,$(PROC_ARCH))
  105.78 +  PROC_ARCH:=$(subst Intel64,X64,$(PROC_ARCH))
  105.79 +  PROC_ARCH:=$(subst INTEL64,X64,$(PROC_ARCH))
  105.80 +  PROC_ARCH:=$(subst ia64,IA64,$(PROC_ARCH))
  105.81 +  ifeq ($(PROC_ARCH),IA64)
  105.82 +    ARCH = ia64
  105.83    else
  105.84 -    ifeq ($(word 1, $(PROCESSOR_IDENTIFIER)),AMD64)
  105.85 -      ARCH=x64
  105.86 +    ifeq ($(PROC_ARCH),X64)
  105.87 +      ARCH = x64
  105.88      else
  105.89 -      ifeq ($(word 1, $(PROCESSOR_IDENTIFIER)),EM64T)
  105.90 -        ARCH=x64
  105.91 -      else
  105.92 -        ARCH=i586
  105.93 -      endif
  105.94 +      ARCH = i586
  105.95      endif
  105.96    endif
  105.97 +  EXESUFFIX = .exe
  105.98 +  # These need to be different depending on MKS or CYGWIN
  105.99 +  ifeq ($(findstring cygdrive,$(shell (cd C:/ && pwd))), )
 105.100 +    GETMIXEDPATH=dosname -s
 105.101 +  else
 105.102 +    GETMIXEDPATH=cygpath -m -s
 105.103 +  endif
 105.104  endif
 105.105  
 105.106 +# Utilities used
 105.107 +CD    = cd
 105.108 +CP    = cp
 105.109 +ECHO  = echo
 105.110 +MKDIR = mkdir
 105.111 +ZIP   = zip
 105.112 +
 105.113  # Root of this test area (important to use full paths in some places)
 105.114  TEST_ROOT := $(shell pwd)
 105.115  
 105.116 -# Default bundle of all test results (passed or not)
 105.117 -JPRT_ARCHIVE_BUNDLE=$(TEST_ROOT)/JPRT_ARCHIVE_BUNDLE.zip
 105.118 +# Root of all test results
 105.119 +ifdef ALT_OUTPUTDIR
 105.120 +  ABS_OUTPUTDIR = $(ALT_OUTPUTDIR)
 105.121 +else
 105.122 +  ABS_OUTPUTDIR = $(TEST_ROOT)/../build/$(PLATFORM)-$(ARCH)
 105.123 +endif
 105.124 +ABS_BUILD_ROOT = $(ABS_OUTPUTDIR)
 105.125 +ABS_TEST_OUTPUT_DIR := $(ABS_BUILD_ROOT)/testoutput
 105.126  
 105.127 -# Default home for JTREG
 105.128 -ifeq ($(PLATFORM), windows)
 105.129 -  JT_HOME = J:/svc/jct-tools3.2.2_02
 105.130 -  JTREG_KEY_OPTION=-k:!ignore
 105.131 -else
 105.132 -  JT_HOME = /java/svc/jct-tools3.2.2_02
 105.133 -  JTREG_KEY_OPTION=-k:\!ignore
 105.134 +# Expect JPRT to set PRODUCT_HOME (the product or jdk in this case to test)
 105.135 +ifndef PRODUCT_HOME
 105.136 +  # Try to use j2sdk-image if it exists
 105.137 +  ABS_JDK_IMAGE = $(ABS_BUILD_ROOT)/j2sdk-image
 105.138 +  PRODUCT_HOME :=                       \
 105.139 +    $(shell                             \
 105.140 +      if [ -d $(ABS_JDK_IMAGE) ] ; then \
 105.141 +         $(ECHO) "$(ABS_JDK_IMAGE)";    \
 105.142 +       else                             \
 105.143 +         $(ECHO) "$(ABS_BUILD_ROOT)" ;  \
 105.144 +       fi)
 105.145 +  PRODUCT_HOME := $(PRODUCT_HOME)
 105.146  endif
 105.147  
 105.148 -# Default JTREG to run
 105.149 -JTREG = $(JT_HOME)/$(JCT_PLATFORM)/bin/jtreg
 105.150 +# Expect JPRT to set JPRT_PRODUCT_ARGS (e.g. -server etc.)
 105.151 +#   Should be passed into 'java' only.
 105.152 +ifdef JPRT_PRODUCT_ARGS
 105.153 +  JAVA_ARGS = $(JPRT_PRODUCT_ARGS)
 105.154 +endif
 105.155  
 105.156 -# Default JDK to test
 105.157 -JAVA_HOME = $(TEST_ROOT)/../build/$(PLATFORM)-$(ARCH)
 105.158 +# Expect JPRT to set JPRT_PRODUCT_VM_ARGS (e.g. -Xcomp etc.)
 105.159 +#   Should be passed into anything running the vm (java, javac, javadoc, ...).
 105.160 +ifdef JPRT_PRODUCT_VM_ARGS
 105.161 +  JAVA_VM_ARGS = $(JPRT_PRODUCT_VM_ARGS)
 105.162 +endif
 105.163  
 105.164 -# The test directories to run
 105.165 -DEFAULT_TESTDIRS = demo/jvmti/gctest demo/jvmti/hprof
 105.166 -TESTDIRS = $(DEFAULT_TESTDIRS)
 105.167 +# Expect JPRT to set JPRT_ARCHIVE_BUNDLE (path to zip bundle for results)
 105.168 +ARCHIVE_BUNDLE = $(ABS_TEST_OUTPUT_DIR)/ARCHIVE_BUNDLE.zip
 105.169 +ifdef JPRT_ARCHIVE_BUNDLE
 105.170 +  ARCHIVE_BUNDLE = $(JPRT_ARCHIVE_BUNDLE)
 105.171 +endif
 105.172  
 105.173 -# Root of all test results
 105.174 -JTREG_OUTPUT_DIR = $(TEST_ROOT)/o_$(PLATFORM)-$(ARCH)
 105.175 +# How to create the test bundle (pass or fail, we want to create this)
 105.176 +#   Follow command with ";$(BUNDLE_UP_AND_EXIT)", so it always gets executed.
 105.177 +ZIP_UP_RESULTS = ( $(MKDIR) -p `dirname $(ARCHIVE_BUNDLE)`     \
 105.178 +	           && $(CD) $(ABS_TEST_OUTPUT_DIR)             \
 105.179 +	           && $(ZIP) -q -r $(ARCHIVE_BUNDLE) . )
 105.180 +BUNDLE_UP_AND_EXIT = ( exitCode=$$? && $(ZIP_UP_RESULTS) && exit $${exitCode} )
 105.181  
 105.182 -# Export this setting and pass it in.
 105.183 -#JAVA_TOOL_OPTIONS = -Djava.awt.headless=true
 105.184 -#export JAVA_TOOL_OPTIONS
 105.185 +################################################################
 105.186  
 105.187 -# Default make rule
 105.188 -all: clean check tests $(JPRT_ARCHIVE_BUNDLE)
 105.189 -	@echo "Testing completed successfully"
 105.190 +# Default make rule (runs jtreg_tests)
 105.191 +all: jtreg_tests
 105.192 +	@$(ECHO) "Testing completed successfully"
 105.193  
 105.194 -# Chaeck to make sure these directories exist
 105.195 -check: $(JT_HOME) $(JAVA_HOME) $(JTREG)
 105.196 -
 105.197 -# Run the tests
 105.198 -tests: FRC
 105.199 -	@echo "Using export JAVA_TOOL_OPTIONS=$(JAVA_TOOL_OPTIONS)"
 105.200 -	@rm -f -r $(JTREG_OUTPUT_DIR)
 105.201 -	@mkdir -p $(JTREG_OUTPUT_DIR)
 105.202 -	$(JTREG) -a -v:fail,error \
 105.203 -          $(JTREG_KEY_OPTION) \
 105.204 -          -r:$(JTREG_OUTPUT_DIR)/JTreport \
 105.205 -          -w:$(JTREG_OUTPUT_DIR)/JTwork \
 105.206 -          -jdk:$(JAVA_HOME) \
 105.207 -          $(JAVA_TOOL_OPTIONS:%=-vmoption:%) \
 105.208 -          $(JAVA_ARGS:%=-vmoption:%) \
 105.209 -          $(TESTDIRS)
 105.210 -
 105.211 -# Bundle up the results
 105.212 -$(JPRT_ARCHIVE_BUNDLE): FRC
 105.213 -	@rm -f $@
 105.214 -	@mkdir -p $(@D)
 105.215 -	( cd $(JTREG_OUTPUT_DIR) && zip -q -r $@ . )
 105.216 +# Prep for output
 105.217 +prep: clean
 105.218 +	@$(MKDIR) -p $(ABS_TEST_OUTPUT_DIR)
 105.219 +	@$(MKDIR) -p `dirname $(ARCHIVE_BUNDLE)`
 105.220  
 105.221  # Cleanup
 105.222  clean:
 105.223 -	rm -f -r $(JTREG_OUTPUT_DIR)
 105.224 -	rm -f $(JPRT_ARCHIVE_BUNDLE)
 105.225 +	$(RM) -r $(ABS_TEST_OUTPUT_DIR)
 105.226 +	$(RM) $(ARCHIVE_BUNDLE)
 105.227  
 105.228 -# Used to force a target rules to run
 105.229 -FRC:
 105.230 +################################################################
 105.231 +
 105.232 +# jtreg tests
 105.233 +
 105.234 +# Expect JT_HOME to be set for jtreg tests. (home for jtreg)
 105.235 +JT_HOME = $(SLASH_JAVA)/re/jtreg/4.0/promoted/latest/binaries/jtreg
 105.236 +ifdef JPRT_JTREG_HOME
 105.237 +  JT_HOME = $(JPRT_JTREG_HOME)
 105.238 +endif
 105.239 +
 105.240 +# Expect JPRT to set TESTDIRS to the jtreg test dirs
 105.241 +ifndef TESTDIRS
 105.242 +  TESTDIRS = demo/jvmti/gctest demo/jvmti/hprof
 105.243 +endif
 105.244 +
 105.245 +# Default JTREG to run (win32 script works for everybody)
 105.246 +JTREG = $(JT_HOME)/win32/bin/jtreg
 105.247 +
 105.248 +jtreg_tests: prep $(JT_HOME) $(PRODUCT_HOME) $(JTREG)
 105.249 +	$(RM) $(JTREG).orig
 105.250 +	cp $(JTREG) $(JTREG).orig
 105.251 +	$(RM) $(JTREG)
 105.252 +	sed -e 's@-J\*@-J-*@' $(JTREG).orig > $(JTREG)
 105.253 +	chmod a+x $(JTREG)
 105.254 +	( JT_HOME=$(shell $(GETMIXEDPATH) "$(JT_HOME)");                     \
 105.255 +          export JT_HOME;                                                    \
 105.256 +          $(shell $(GETMIXEDPATH) "$(JTREG)")                                \
 105.257 +            -a -v:fail,error                                                 \
 105.258 +	    -ignore:quiet                                                    \
 105.259 +            $(EXTRA_JTREG_OPTIONS)                                           \
 105.260 +            -r:$(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)")/JTreport    \
 105.261 +            -w:$(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)")/JTwork      \
 105.262 +            -jdk:$(shell $(GETMIXEDPATH) "$(PRODUCT_HOME)")                  \
 105.263 +            $(JAVA_ARGS:%=-javaoptions:%)                                     \
 105.264 +            $(JAVA_VM_ARGS:%=-vmoption:%)                                    \
 105.265 +            $(TESTDIRS)                                                      \
 105.266 +	) ; $(BUNDLE_UP_AND_EXIT)
 105.267 +
 105.268 +PHONY_LIST += jtreg_tests
 105.269 +
 105.270 +################################################################
 105.271 +
 105.272 +# packtest
 105.273 +
 105.274 +# Expect JPRT to set JPRT_PACKTEST_HOME.
 105.275 +PACKTEST_HOME = /net/jprt-web.sfbay.sun.com/jprt/allproducts/packtest
 105.276 +ifdef JPRT_PACKTEST_HOME
 105.277 +  PACKTEST_HOME = $(JPRT_PACKTEST_HOME)
 105.278 +endif
 105.279 +
 105.280 +packtest: prep $(PACKTEST_HOME)/ptest $(PRODUCT_HOME)
 105.281 +	( $(CD) $(PACKTEST_HOME) &&            \
 105.282 +	    $(PACKTEST_HOME)/ptest             \
 105.283 +		 -t "$(PRODUCT_HOME)"          \
 105.284 +	         $(PACKTEST_STRESS_OPTION)     \
 105.285 +		 $(EXTRA_PACKTEST_OPTIONS)     \
 105.286 +		 -W $(ABS_TEST_OUTPUT_DIR)     \
 105.287 +                 $(JAVA_ARGS:%=-J %)           \
 105.288 +                 $(JAVA_VM_ARGS:%=-J %)        \
 105.289 +	 ) ; $(BUNDLE_UP_AND_EXIT)
 105.290 +
 105.291 +packtest_stress: PACKTEST_STRESS_OPTION=-s
 105.292 +packtest_stress: packtest
 105.293 +
 105.294 +PHONY_LIST += packtest packtest_stress
 105.295 +
 105.296 +################################################################
 105.297 +
 105.298 +# vmsqe tests
 105.299 +
 105.300 +# Expect JPRT to set JPRT_VMSQE_HOME.
 105.301 +VMSQE_HOME = /java/sqe/comp/vm/testbase/sqe/vm/current/build/latest/vm
 105.302 +ifdef JPRT_VMSQE_HOME
 105.303 +  VMSQE_HOME = $(JPRT_VMSQE_HOME)
 105.304 +endif
 105.305 +
 105.306 +# Expect JPRT to set JPRT_RUNVMSQE_HOME.
 105.307 +RUNVMSQE_HOME = /net/jprt-web.sfbay.sun.com/jprt/allproducts/runvmsqe
 105.308 +ifdef JPRT_RUNVMSQE_HOME
 105.309 +  RUNVMSQE_HOME = $(JPRT_RUNVMSQE_HOME)
 105.310 +endif
 105.311 +
 105.312 +# Expect JPRT to set JPRT_TONGA3_HOME.
 105.313 +TONGA3_HOME = /java/sqe//tools/gtee/harness/tonga
 105.314 +ifdef JPRT_TONGA3_HOME
 105.315 +  TONGA3_HOME = $(JPRT_TONGA3_HOME)
 105.316 +endif
 105.317 +
 105.318 +RUNVMSQE_BIN = $(RUNVMSQE_HOME)/bin/runvmsqe
 105.319 +
 105.320 +vmsqe_tests: prep $(VMSQE_HOME)/vm $(TONGA3_HOME) $(RUNVMSQE_BIN) $(PRODUCT_HOME)
 105.321 +	$(RM) -r $(ABS_TEST_OUTPUT_DIR)/vmsqe
 105.322 +	( $(CD) $(ABS_TEST_OUTPUT_DIR) &&          \
 105.323 +	    $(RUNVMSQE_BIN)                        \
 105.324 +		 -jdk "$(PRODUCT_HOME)"            \
 105.325 +		 -o "$(ABS_TEST_OUTPUT_DIR)/vmsqe" \
 105.326 +		 -testbase "$(VMSQE_HOME)/vm"      \
 105.327 +		 -tonga "$(TONGA3_HOME)"           \
 105.328 +		 -tongajdk "$(ALT_BOOTDIR)"        \
 105.329 +                 $(JAVA_ARGS)                      \
 105.330 +                 $(JAVA_VM_ARGS)                   \
 105.331 +	         $(RUNVMSQE_TEST_OPTION)           \
 105.332 +		 $(EXTRA_RUNVMSQE_OPTIONS)         \
 105.333 +	 ) ; $(BUNDLE_UP_AND_EXIT)
 105.334 +
 105.335 +vmsqe_jdwp: RUNVMSQE_TEST_OPTION=-jdwp
 105.336 +vmsqe_jdwp: vmsqe_tests
 105.337 +
 105.338 +vmsqe_jdi: RUNVMSQE_TEST_OPTION=-jdi
 105.339 +vmsqe_jdi: vmsqe_tests
 105.340 +
 105.341 +vmsqe_jdb: RUNVMSQE_TEST_OPTION=-jdb
 105.342 +vmsqe_jdb: vmsqe_tests
 105.343 +
 105.344 +vmsqe_quick-jdi: RUNVMSQE_TEST_OPTION=-quick-jdi
 105.345 +vmsqe_quick-jdi: vmsqe_tests
 105.346 +
 105.347 +vmsqe_sajdi: RUNVMSQE_TEST_OPTION=-sajdi
 105.348 +vmsqe_sajdi: vmsqe_tests
 105.349 +
 105.350 +vmsqe_jvmti: RUNVMSQE_TEST_OPTION=-jvmti
 105.351 +vmsqe_jvmti: vmsqe_tests
 105.352 +
 105.353 +vmsqe_hprof: RUNVMSQE_TEST_OPTION=-hprof
 105.354 +vmsqe_hprof: vmsqe_tests
 105.355 +
 105.356 +vmsqe_monitoring: RUNVMSQE_TEST_OPTION=-monitoring
 105.357 +vmsqe_monitoring: vmsqe_tests
 105.358 +
 105.359 +PHONY_LIST += vmsqe_jdwp vmsqe_jdi vmsqe_jdb vmsqe_quick-jdi vmsqe_sajdi \
 105.360 +              vmsqe_jvmti vmsqe_hprof vmsqe_monitoring vmsqe_tests
 105.361 +
 105.362 +################################################################
 105.363 +
 105.364 +# jck tests
 105.365 +
 105.366 +JCK_WORK_DIR     = $(ABS_TEST_OUTPUT_DIR)/JCKwork
 105.367 +JCK_REPORT_DIR   = $(ABS_TEST_OUTPUT_DIR)/JCKreport
 105.368 +JCK_PROPERTIES   = $(ABS_TEST_OUTPUT_DIR)/jck.properties
 105.369 +JCK_CONFIG       = $(ABS_TEST_OUTPUT_DIR)/jck.config
 105.370 +
 105.371 +JCK_JAVA_EXE     = $(PRODUCT_HOME)/bin/java$(EXESUFFIX)
 105.372 +
 105.373 +JCK_JAVATEST_JAR = $(JCK_HOME)/lib/javatest.jar
 105.374 +JCK_JAVATEST     = $(ALT_BOOTDIR)/bin/java -jar $(JCK_JAVATEST_JAR)
 105.375 +
 105.376 +$(JCK_CONFIG): $(TEST_ROOT)/JCK-$(JCK_BUNDLE_NAME)-$(JCK_RELEASE)-base.jti
 105.377 +	$(RM) $@
 105.378 +	$(MKDIR) -p $(@D)
 105.379 +	$(CP) $< $@
 105.380 +
 105.381 +$(JCK_PROPERTIES): $(PRODUCT_HOME) $(JCK_JAVA_EXE)
 105.382 +	$(RM) $@
 105.383 +	$(MKDIR) -p $(@D)
 105.384 +	$(ECHO) "jck.env.compiler.compRefExecute.cmdAsFile=$(JCK_JAVA_EXE)" >> $@
 105.385 +	$(ECHO) "jck.env.compiler.compRefExecute.systemRoot=$(SYSTEMROOT)" >> $@
 105.386 +	$(ECHO) "jck.env.compiler.testCompile.testCompileAPImultiJVM.cmdAsFile=$(JCK_JAVA_EXE)" >> $@
 105.387 +	$(ECHO) "jck.tests.tests=$(JCK_BUNDLE_TESTDIRS)" >> $@
 105.388 +
 105.389 +jck_tests: prep $(JCK_HOME) $(JCK_PROPERTIES) $(JCK_CONFIG) $(JCK_JAVATEST_JAR)
 105.390 +	$(MKDIR) -p $(JCK_WORK_DIR)
 105.391 +	( $(JCK_JAVATEST)                            \
 105.392 +		-verbose:commands,non-pass           \
 105.393 +		-testSuite    $(JCK_HOME)            \
 105.394 +		-workDir      $(JCK_WORK_DIR)        \
 105.395 +		-config       $(JCK_CONFIG)          \
 105.396 +		-set -file    $(JCK_PROPERTIES)      \
 105.397 +		-runtests                            \
 105.398 +		-writeReport  $(JCK_REPORT_DIR)      \
 105.399 +        ) ; $(BUNDLE_UP_AND_EXIT)
 105.400 +
 105.401 +PHONY_LIST += jck_tests
 105.402 +
 105.403 +################################################################
 105.404 +
 105.405 +# jck6 tests
 105.406 +
 105.407 +JCK6_RELEASE = 6b
 105.408 +JCK6_DEFAULT_HOME = $(SLASH_JAVA)/re/jck/$(JCK6_RELEASE)/archive/fcs/binaries
 105.409 +
 105.410 +# Expect JPRT to set JPRT_JCK6COMPILER_HOME.
 105.411 +JCK6COMPILER_HOME = $(JCK6_DEFAULT_HOME)/JCK-compiler-$(JCK6_RELEASE)
 105.412 +ifdef JPRT_JCK6COMPILER_HOME
 105.413 +  JCK6COMPILER_HOME = $(JPRT_JCK6COMPILER_HOME)
 105.414 +endif
 105.415 +
 105.416 +# Expect JPRT to set JPRT_JCK6RUNTIME_HOME.
 105.417 +JCK6RUNTIME_HOME = $(JCK6_DEFAULT_HOME)/JCK-runtime-$(JCK6_RELEASE)
 105.418 +ifdef JPRT_JCK6RUNTIME_HOME
 105.419 +  JCK6RUNTIME_HOME = $(JPRT_JCK6RUNTIME_HOME)
 105.420 +endif
 105.421 +
 105.422 +# Expect JPRT to set JPRT_JCK6DEVTOOLS_HOME.
 105.423 +JCK6DEVTOOLS_HOME = $(JCK6_DEFAULT_HOME)/JCK-devtools-$(JCK6_RELEASE)
 105.424 +ifdef JPRT_JCK6DEVTOOLS_HOME
 105.425 +  JCK6DEVTOOLS_HOME = $(JPRT_JCK6DEVTOOLS_HOME)
 105.426 +endif
 105.427 +
 105.428 +jck6_tests: JCK_HOME=$(JCK6_HOME)
 105.429 +jck6_tests: JCK_RELEASE=$(JCK6_RELEASE)
 105.430 +jck6_tests: jck_tests
 105.431 +
 105.432 +jck6compiler: JCK6_HOME=$(JCK6COMPILER_HOME)
 105.433 +jck6compiler: JCK_BUNDLE_NAME=compiler
 105.434 +jck6compiler: jck6_tests
 105.435 +
 105.436 +jck6compiler_lang: JCK_BUNDLE_TESTDIRS=lang
 105.437 +jck6compiler_lang: jck6compiler
 105.438 +
 105.439 +jck6runtime: JCK6_HOME=$(JCK6RUNTIME_HOME)
 105.440 +jck6runtime: JCK_BUNDLE_NAME=runtime
 105.441 +jck6runtime: jck6_tests
 105.442 +
 105.443 +jck6runtime_lang: JCK_BUNDLE_TESTDIRS=lang
 105.444 +jck6runtime_lang: jck6runtime
 105.445 +
 105.446 +jck6devtools: JCK6_HOME=$(JCK6DEVTOOLS_HOME)
 105.447 +jck6devtools: JCK_BUNDLE_NAME=devtools
 105.448 +jck6devtools: jck6_tests
 105.449 +
 105.450 +jck6devtools_lang: JCK_BUNDLE_TESTDIRS=lang
 105.451 +jck6devtools_lang: jck6devtools
 105.452 +
 105.453 +PHONY_LIST += jck6compiler jck6runtime jck6devtools jck6_tests \
 105.454 +	      jck6compiler_lang jck6runtime_lang jck6devtools_lang
 105.455 +
 105.456 +################################################################
 105.457 +
 105.458 +# jck7 tests
 105.459 +
 105.460 +JCK7_RELEASE = 7
 105.461 +JCK7_DEFAULT_HOME = $(SLASH_JAVA)/re/jck/$(JCK7_RELEASE)/archive/fcs/binaries
 105.462 +
 105.463 +# Expect JPRT to set JPRT_JCK7COMPILER_HOME.
 105.464 +JCK7COMPILER_HOME = $(JCK7_DEFAULT_HOME)/JCK-compiler-$(JCK7_RELEASE)
 105.465 +ifdef JPRT_JCK7COMPILER_HOME
 105.466 +  JCK7COMPILER_HOME = $(JPRT_JCK7COMPILER_HOME)
 105.467 +endif
 105.468 +
 105.469 +# Expect JPRT to set JPRT_JCK7RUNTIME_HOME.
 105.470 +JCK7RUNTIME_HOME = $(JCK7_DEFAULT_HOME)/JCK-runtime-$(JCK7_RELEASE)
 105.471 +ifdef JPRT_JCK7RUNTIME_HOME
 105.472 +  JCK7RUNTIME_HOME = $(JPRT_JCK7RUNTIME_HOME)
 105.473 +endif
 105.474 +
 105.475 +# Expect JPRT to set JPRT_JCK7DEVTOOLS_HOME.
 105.476 +JCK7DEVTOOLS_HOME = $(JCK7_DEFAULT_HOME)/JCK-devtools-$(JCK7_RELEASE)
 105.477 +ifdef JPRT_JCK7DEVTOOLS_HOME
 105.478 +  JCK7DEVTOOLS_HOME = $(JPRT_JCK7DEVTOOLS_HOME)
 105.479 +endif
 105.480 +
 105.481 +jck7_tests: JCK_HOME=$(JCK7_HOME)
 105.482 +jck7_tests: JCK_RELEASE=$(JCK7_RELEASE)
 105.483 +jck7_tests: jck_tests
 105.484 +
 105.485 +jck7compiler: JCK7_HOME=$(JCK7COMPILER_HOME)
 105.486 +jck7compiler: JCK_BUNDLE_NAME=compiler
 105.487 +jck7compiler: jck7_tests
 105.488 +
 105.489 +jck7compiler_lang: JCK_BUNDLE_TESTDIRS=lang
 105.490 +jck7compiler_lang: jck7compiler
 105.491 +
 105.492 +jck7runtime: JCK7_HOME=$(JCK7RUNTIME_HOME)
 105.493 +jck7runtime: JCK_BUNDLE_NAME=runtime
 105.494 +jck7runtime: jck7_tests
 105.495 +
 105.496 +jck7runtime_lang: JCK_BUNDLE_TESTDIRS=lang
 105.497 +jck7runtime_lang: jck7runtime
 105.498 +
 105.499 +jck7devtools: JCK7_HOME=$(JCK7DEVTOOLS_HOME)
 105.500 +jck7devtools: JCK_BUNDLE_NAME=devtools
 105.501 +jck7devtools: jck7_tests
 105.502 +
 105.503 +jck7devtools_lang: JCK_BUNDLE_TESTDIRS=lang
 105.504 +jck7devtools_lang: jck7devtools
 105.505 +
 105.506 +PHONY_LIST += jck7compiler jck7runtime jck7devtools jck7_tests \
 105.507 +	      jck7compiler_lang jck7runtime_lang jck7devtools_lang
 105.508 +
 105.509 +################################################################
 105.510  
 105.511  # Phony targets (e.g. these are not filenames)
 105.512 -.PHONY: all tests clean check
 105.513 +.PHONY: all clean prep $(PHONY_LIST)
 105.514  
 105.515 +################################################################
 105.516 +
   106.1 --- a/test/com/sun/jmx/snmp/SnmpOidHashCode.java	Thu Apr 02 10:16:53 2009 -0700
   106.2 +++ b/test/com/sun/jmx/snmp/SnmpOidHashCode.java	Wed Apr 08 15:40:56 2009 -0700
   106.3 @@ -1,5 +1,5 @@
   106.4  /*
   106.5 - * Copyright 2003 Sun Microsystems, Inc.  All Rights Reserved.
   106.6 + * Copyright 2003-2008 Sun Microsystems, Inc.  All Rights Reserved.
   106.7   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   106.8   *
   106.9   * This code is free software; you can redistribute it and/or modify it
  106.10 @@ -28,7 +28,8 @@
  106.11   * @build   SnmpOidHashCode
  106.12   * @run     main SnmpOidHashCode
  106.13   */
  106.14 -import com.sun.jmx.snmp.SnmpOid;
  106.15 +import java.lang.reflect.Constructor;
  106.16 +import java.lang.reflect.InvocationTargetException;
  106.17  
  106.18  public class SnmpOidHashCode {
  106.19      public static final String[] oids = {
  106.20 @@ -57,16 +58,81 @@
  106.21          ".39."+0xFFFFFFFFL
  106.22      };
  106.23  
  106.24 +    // We use an SnmpOidBuilder in order to adapt this test case to a
  106.25 +    // configuration where the SNMP packages are not present in rt.jar.
  106.26 +    //
  106.27 +    public static final class SnmpOidBuilder {
  106.28 +        public static final String SNMP_OID_CLASS_NAME =
  106.29 +            "com.sun.jmx.snmp.SnmpOid";
  106.30 +        private static final Class<?> SNMP_OID_CLASS;
  106.31 +        private static final Constructor<?> SNMP_OID_CTOR;
  106.32 +        static {
  106.33 +            Class<?> snmpOidClass;
  106.34 +            try {
  106.35 +                snmpOidClass =
  106.36 +                    Class.forName(SNMP_OID_CLASS_NAME, true, null);
  106.37 +            } catch (ClassNotFoundException x) {
  106.38 +                snmpOidClass = null;
  106.39 +                System.err.println("WARNING: can't load "+SNMP_OID_CLASS_NAME);
  106.40 +            } catch (NoClassDefFoundError x) {
  106.41 +                snmpOidClass = null;
  106.42 +                System.err.println("WARNING: can't load "+SNMP_OID_CLASS_NAME);
  106.43 +            }
  106.44 +            SNMP_OID_CLASS = snmpOidClass;
  106.45 +            if (SNMP_OID_CLASS != null) {
  106.46 +                try {
  106.47 +                  SNMP_OID_CTOR = snmpOidClass.getConstructor(String.class);
  106.48 +                } catch (Exception x) {
  106.49 +                    throw new ExceptionInInitializerError(x);
  106.50 +                }
  106.51 +            } else {
  106.52 +                SNMP_OID_CTOR = null;
  106.53 +            }
  106.54 +        }
  106.55 +
  106.56 +        public static boolean isSnmpPresent() {
  106.57 +            System.out.println(SnmpOidHashCode.class.getName()+
  106.58 +                    ": Testing for SNMP Packages...");
  106.59 +            return SNMP_OID_CLASS != null;
  106.60 +        }
  106.61 +
  106.62 +        public static Object newSnmpOid(String oid)
  106.63 +            throws InstantiationException,
  106.64 +                   IllegalAccessException,
  106.65 +                   InvocationTargetException {
  106.66 +            return SNMP_OID_CTOR.newInstance(oid);
  106.67 +        }
  106.68 +
  106.69 +    }
  106.70 +
  106.71 +    private static Object newSnmpOid(String oid) throws Exception {
  106.72 +        try {
  106.73 +            return SnmpOidBuilder.newSnmpOid(oid);
  106.74 +        } catch (InvocationTargetException x) {
  106.75 +            final Throwable cause = x.getCause();
  106.76 +            if (cause instanceof Exception) throw (Exception)cause;
  106.77 +            if (cause instanceof Error) throw (Error)cause;
  106.78 +            throw x;
  106.79 +        }
  106.80 +    }
  106.81 +
  106.82      public static void main(String args[]) {
  106.83 +        if (!SnmpOidBuilder.isSnmpPresent()) {
  106.84 +            System.err.println("WARNING: "+
  106.85 +                    SnmpOidBuilder.SNMP_OID_CLASS_NAME+" not present.");
  106.86 +            System.err.println(SnmpOidHashCode.class.getName()+
  106.87 +                    ": test skipped.");
  106.88 +            return;
  106.89 +        }
  106.90          try {
  106.91              int errCount=0;
  106.92              int collisions=0;
  106.93              for (int i=0;i<oids.length;i++) {
  106.94                  System.out.println("Testing " + oids[i]);
  106.95 -                final SnmpOid o1 = new SnmpOid(oids[i]);
  106.96 +                final Object o1 = newSnmpOid(oids[i]);
  106.97                  final int startCount=errCount;
  106.98                  for (int j=0;j<oids.length;j++) {
  106.99 -                    final SnmpOid o2 = new SnmpOid(oids[j]);
 106.100 +                    final Object o2 = newSnmpOid(oids[j]);
 106.101                      if (o1.equals(o2)) {
 106.102                          if (!(oids[i].equals(oids[j]))) {
 106.103                              System.err.println("OIDs differ but " +
   107.1 --- a/test/com/sun/jmx/snmp/TimeTicksWrapping.java	Thu Apr 02 10:16:53 2009 -0700
   107.2 +++ b/test/com/sun/jmx/snmp/TimeTicksWrapping.java	Wed Apr 08 15:40:56 2009 -0700
   107.3 @@ -1,5 +1,5 @@
   107.4  /*
   107.5 - * Copyright 2003 Sun Microsystems, Inc.  All Rights Reserved.
   107.6 + * Copyright 2003-2008 Sun Microsystems, Inc.  All Rights Reserved.
   107.7   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   107.8   *
   107.9   * This code is free software; you can redistribute it and/or modify it
  107.10 @@ -29,33 +29,158 @@
  107.11   * @build   TimeTicksWrapping
  107.12   * @run     main TimeTicksWrapping
  107.13   */
  107.14 -import com.sun.jmx.snmp.SnmpTimeticks;
  107.15 -import com.sun.jmx.snmp.SnmpUnsignedInt;
  107.16 +import java.lang.reflect.Constructor;
  107.17 +import java.lang.reflect.InvocationTargetException;
  107.18 +import java.lang.reflect.Method;
  107.19  
  107.20  public class TimeTicksWrapping {
  107.21 +    // We use an SnmpTimeticksBuilder in order to adapt this test case to a
  107.22 +    // configuration where the SNMP packages are not present in rt.jar.
  107.23 +    //
  107.24 +    public static final class SnmpTimeticksBuilder {
  107.25 +        public static final long   MAX_VALUE = 0x0ffffffffL;
  107.26 +        public static final String SNMP_TIME_TICKS_CLASS_NAME =
  107.27 +            "com.sun.jmx.snmp.SnmpTimeticks";
  107.28 +        private static final Class<?> SNMP_TIME_TICKS_CLASS;
  107.29 +        private static final Constructor<?> SNMP_long_CTOR;
  107.30 +        private static final Constructor<?> SNMP_LONG_CTOR;
  107.31 +        private static final Method SNMP_LONG_VALUE;
  107.32 +        static {
  107.33 +            Class<?> snmpTimeTicksClass;
  107.34 +            try {
  107.35 +                snmpTimeTicksClass =
  107.36 +                    Class.forName(SNMP_TIME_TICKS_CLASS_NAME, true, null);
  107.37 +            } catch (ClassNotFoundException x) {
  107.38 +                snmpTimeTicksClass = null;
  107.39 +                System.err.println("WARNING: can't load "+
  107.40 +                        SNMP_TIME_TICKS_CLASS_NAME);
  107.41 +            } catch (NoClassDefFoundError x) {
  107.42 +                snmpTimeTicksClass = null;
  107.43 +                System.err.println("WARNING: can't load "+
  107.44 +                        SNMP_TIME_TICKS_CLASS_NAME);
  107.45 +            }
  107.46 +            SNMP_TIME_TICKS_CLASS = snmpTimeTicksClass;
  107.47 +            if (SNMP_TIME_TICKS_CLASS != null) {
  107.48 +                try {
  107.49 +                  SNMP_long_CTOR =
  107.50 +                          SNMP_TIME_TICKS_CLASS.getConstructor(long.class);
  107.51 +                } catch (Exception x) {
  107.52 +                    throw new ExceptionInInitializerError(x);
  107.53 +                }
  107.54 +            } else {
  107.55 +                SNMP_long_CTOR = null;
  107.56 +            }
  107.57 +            if (SNMP_TIME_TICKS_CLASS != null) {
  107.58 +                try {
  107.59 +                  SNMP_LONG_CTOR =
  107.60 +                          SNMP_TIME_TICKS_CLASS.getConstructor(Long.class);
  107.61 +                } catch (Exception x) {
  107.62 +                    throw new ExceptionInInitializerError(x);
  107.63 +                }
  107.64 +            } else {
  107.65 +                SNMP_LONG_CTOR = null;
  107.66 +            }
  107.67 +            if (SNMP_TIME_TICKS_CLASS != null) {
  107.68 +                try {
  107.69 +                  SNMP_LONG_VALUE =
  107.70 +                          SNMP_TIME_TICKS_CLASS.getMethod("longValue");
  107.71 +                } catch (Exception x) {
  107.72 +                    throw new ExceptionInInitializerError(x);
  107.73 +                }
  107.74 +            } else {
  107.75 +                SNMP_LONG_VALUE = null;
  107.76 +            }
  107.77 +
  107.78 +        }
  107.79 +
  107.80 +        private final Object timeticks;
  107.81 +
  107.82 +        public SnmpTimeticksBuilder(long ticks) throws Exception {
  107.83 +            timeticks = newSnmpTimeticks(ticks);
  107.84 +        }
  107.85 +        public SnmpTimeticksBuilder(Long ticks) throws Exception {
  107.86 +            timeticks = newSnmpTimeticks(ticks);
  107.87 +        }
  107.88 +        public long longValue() throws Exception {
  107.89 +            return longValue(timeticks);
  107.90 +        }
  107.91 +
  107.92 +        public static boolean isSnmpPresent() {
  107.93 +            System.out.println(TimeTicksWrapping.class.getName()+
  107.94 +                    ": Testing for SNMP Packages...");
  107.95 +            return SNMP_TIME_TICKS_CLASS != null;
  107.96 +        }
  107.97 +
  107.98 +        private static Object newSnmpTimeticks(long time)
  107.99 +                throws Exception {
 107.100 +            try {
 107.101 +                return SNMP_long_CTOR.newInstance(time);
 107.102 +            } catch (InvocationTargetException x) {
 107.103 +                final Throwable cause = x.getCause();
 107.104 +                if (cause instanceof Exception) throw (Exception) cause;
 107.105 +                if (cause instanceof Error) throw (Error) cause;
 107.106 +                throw x;
 107.107 +            }
 107.108 +        }
 107.109 +
 107.110 +        private static Object newSnmpTimeticks(Long time)
 107.111 +            throws Exception {
 107.112 +            try {
 107.113 +                return SNMP_LONG_CTOR.newInstance(time);
 107.114 +            } catch (InvocationTargetException x) {
 107.115 +                final Throwable cause = x.getCause();
 107.116 +                if (cause instanceof Exception) throw (Exception) cause;
 107.117 +                if (cause instanceof Error) throw (Error) cause;
 107.118 +                throw x;
 107.119 +            }
 107.120 +        }
 107.121 +
 107.122 +        private static long longValue(Object o)
 107.123 +                throws Exception {
 107.124 +            try {
 107.125 +                return ((Long)SNMP_LONG_VALUE.invoke(o)).longValue();
 107.126 +            } catch (InvocationTargetException x) {
 107.127 +                final Throwable cause = x.getCause();
 107.128 +                if (cause instanceof Exception) throw (Exception) cause;
 107.129 +                if (cause instanceof Error) throw (Error) cause;
 107.130 +                throw x;
 107.131 +            }
 107.132 +        }
 107.133 +
 107.134 +    }
 107.135 +
 107.136      public static final long[] oks = {
 107.137          0L, 1L, (long)Integer.MAX_VALUE, (long)Integer.MAX_VALUE*2,
 107.138          (long)Integer.MAX_VALUE*2+1L, (long)Integer.MAX_VALUE*2+2L,
 107.139          (long)Integer.MAX_VALUE*3,
 107.140 -        SnmpUnsignedInt.MAX_VALUE, SnmpUnsignedInt.MAX_VALUE+1L,
 107.141 -        SnmpUnsignedInt.MAX_VALUE*3-1L, Long.MAX_VALUE
 107.142 +        SnmpTimeticksBuilder.MAX_VALUE, SnmpTimeticksBuilder.MAX_VALUE+1L,
 107.143 +        SnmpTimeticksBuilder.MAX_VALUE*3-1L, Long.MAX_VALUE
 107.144      };
 107.145  
 107.146      public static final long[] kos = {
 107.147          -1L, (long)Integer.MIN_VALUE, (long)Integer.MIN_VALUE*2,
 107.148          (long)Integer.MIN_VALUE*2-1L, (long)Integer.MIN_VALUE*3,
 107.149 -        -SnmpUnsignedInt.MAX_VALUE, -(SnmpUnsignedInt.MAX_VALUE+1L),
 107.150 -        -(SnmpUnsignedInt.MAX_VALUE*3-1L), Long.MIN_VALUE
 107.151 +        -SnmpTimeticksBuilder.MAX_VALUE, -(SnmpTimeticksBuilder.MAX_VALUE+1L),
 107.152 +        -(SnmpTimeticksBuilder.MAX_VALUE*3-1L), Long.MIN_VALUE
 107.153      };
 107.154  
 107.155 +
 107.156      public static void main(String args[]) {
 107.157 +        if (!SnmpTimeticksBuilder.isSnmpPresent()) {
 107.158 +            System.err.println("WARNING: "+
 107.159 +                    SnmpTimeticksBuilder.SNMP_TIME_TICKS_CLASS_NAME+
 107.160 +                    " not present.");
 107.161 +            System.err.println(TimeTicksWrapping.class.getName()+
 107.162 +                    ": test skipped.");
 107.163 +            return;
 107.164 +        }
 107.165          try {
 107.166 -            SnmpTimeticks t;
 107.167 +            SnmpTimeticksBuilder t = null;
 107.168  
 107.169              for (int i=0;i<oks.length;i++) {
 107.170                  final long t1,t2,t3;
 107.171 -                t1 = (new SnmpTimeticks(oks[i])).longValue();
 107.172 -                t2 = (new SnmpTimeticks(new Long(oks[i]))).longValue();
 107.173 +                t1 = (new SnmpTimeticksBuilder(oks[i])).longValue();
 107.174 +                t2 = (new SnmpTimeticksBuilder(new Long(oks[i]))).longValue();
 107.175                  t3 = oks[i]%0x0100000000L;
 107.176                  if (t1 != t3)
 107.177                      throw new Exception("Value should have wrapped: " +
 107.178 @@ -64,16 +189,16 @@
 107.179                      throw new Exception("Value should have wrapped: " +
 107.180                                          "Long("+oks[i]+") expected: " + t3);
 107.181  
 107.182 -                if (t1 > SnmpUnsignedInt.MAX_VALUE)
 107.183 +                if (t1 > SnmpTimeticksBuilder.MAX_VALUE)
 107.184                      throw new Exception("Value should have wrapped " +
 107.185                                          "for " + oks[i] + ": " +
 107.186                                          t1 + " exceeds max: " +
 107.187 -                                        SnmpUnsignedInt.MAX_VALUE);
 107.188 -                if (t2 > SnmpUnsignedInt.MAX_VALUE)
 107.189 +                                        SnmpTimeticksBuilder.MAX_VALUE);
 107.190 +                if (t2 > SnmpTimeticksBuilder.MAX_VALUE)
 107.191                      throw new Exception("Value should have wrapped " +
 107.192                                          "for " + oks[i] + ": " +
 107.193                                          t2 + " exceeds max: " +
 107.194 -                                        SnmpUnsignedInt.MAX_VALUE);
 107.195 +                                        SnmpTimeticksBuilder.MAX_VALUE);
 107.196  
 107.197                  if (t1 < 0)
 107.198                      throw new Exception("Value should have wrapped: " +
 107.199 @@ -90,14 +215,14 @@
 107.200  
 107.201              for (int i=0;i<kos.length;i++) {
 107.202                  try {
 107.203 -                    t = new SnmpTimeticks(kos[i]);
 107.204 +                    t = new SnmpTimeticksBuilder(kos[i]);
 107.205                      throw new Exception("Value should have been rejected: " +
 107.206                                          kos[i]);
 107.207                  } catch (IllegalArgumentException x) {
 107.208                      // OK!
 107.209                  }
 107.210                  try {
 107.211 -                    t = new SnmpTimeticks(new Long(kos[i]));
 107.212 +                    t = new SnmpTimeticksBuilder(new Long(kos[i]));
 107.213                      throw new Exception("Value should have been rejected: " +
 107.214                                          "Long("+kos[i]+")");
 107.215                  } catch (IllegalArgumentException x) {
   108.1 --- a/test/java/awt/Frame/FrameSize/TestFrameSize.java	Thu Apr 02 10:16:53 2009 -0700
   108.2 +++ b/test/java/awt/Frame/FrameSize/TestFrameSize.java	Wed Apr 08 15:40:56 2009 -0700
   108.3 @@ -15,6 +15,10 @@
   108.4   * You should have received a copy of the GNU General Public License version
   108.5   * 2 along with this work; if not, write to the Free Software Foundation,
   108.6   * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
   108.7 + *
   108.8 + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
   108.9 + * CA 95054 USA or visit www.sun.com if you need additional information or
  108.10 + * have any questions.
  108.11   */
  108.12  
  108.13  /*
   109.1 --- a/test/java/io/File/GetXSpace.java	Thu Apr 02 10:16:53 2009 -0700
   109.2 +++ b/test/java/io/File/GetXSpace.java	Wed Apr 08 15:40:56 2009 -0700
   109.3 @@ -24,6 +24,7 @@
   109.4  /**
   109.5   * @test
   109.6   * @bug 4057701 6286712 6364377
   109.7 + * @ignore until 6492634 and 6501010 is fixed
   109.8   * @run build GetXSpace
   109.9   * @run shell GetXSpace.sh
  109.10   * @summary Basic functionality of File.get-X-Space methods.
   110.1 --- a/test/java/lang/Thread/StartOOMTest.java	Thu Apr 02 10:16:53 2009 -0700
   110.2 +++ b/test/java/lang/Thread/StartOOMTest.java	Wed Apr 08 15:40:56 2009 -0700
   110.3 @@ -24,6 +24,7 @@
   110.4  /*
   110.5   * @test
   110.6   * @bug 6379235
   110.7 + * @ignore until 6721694 is fixed
   110.8   * @run main/othervm -server -Xmx32m -Xms32m -Xss256m StartOOMTest
   110.9   * @summary ThreadGroup accounting mistake possible with failure of Thread.start()
  110.10   */
   111.1 --- a/test/java/lang/reflect/Method/InheritedMethods.java	Thu Apr 02 10:16:53 2009 -0700
   111.2 +++ b/test/java/lang/reflect/Method/InheritedMethods.java	Wed Apr 08 15:40:56 2009 -0700
   111.3 @@ -23,6 +23,7 @@
   111.4  
   111.5  /* @test
   111.6     @bug 4471738
   111.7 +   @ignore until 6825739 fixed
   111.8     @summary Failure to properly traverse class hierarchy in Class.getMethod()
   111.9  */
  111.10  
   112.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   112.2 +++ b/test/java/security/Permission/ToString.java	Wed Apr 08 15:40:56 2009 -0700
   112.3 @@ -0,0 +1,101 @@
   112.4 +/*
   112.5 + * Copyright 2009 Sun Microsystems, Inc.  All Rights Reserved.
   112.6 + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   112.7 + *
   112.8 + * This code is free software; you can redistribute it and/or modify it
   112.9 + * under the terms of the GNU General Public License version 2 only, as
  112.10 + * published by the Free Software Foundation.
  112.11 + *
  112.12 + * This code is distributed in the hope that it will be useful, but WITHOUT
  112.13 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  112.14 + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  112.15 + * version 2 for more details (a copy is included in the LICENSE file that
  112.16 + * accompanied this code).
  112.17 + *
  112.18 + * You should have received a copy of the GNU General Public License version
  112.19 + * 2 along with this work; if not, write to the Free Software Foundation,
  112.20 + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  112.21 + *
  112.22 + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
  112.23 + * CA 95054 USA or visit www.sun.com if you need additional information or
  112.24 + * have any questions.
  112.25 + */
  112.26 +
  112.27 +/*
  112.28 + * @test
  112.29 + * @bug 6549506
  112.30 + * @summary Specification of Permission.toString() method contradicts with
  112.31 + *      JDK implementation
  112.32 + */
  112.33 +
  112.34 +import java.security.*;
  112.35 +
  112.36 +public class ToString {
  112.37 +
  112.38 +    public static void main(String[]args) throws Exception {
  112.39 +        DummyWritePermission dummyPerm = new DummyWritePermission();
  112.40 +        NullActionPermission nullActionPerm = new NullActionPermission();
  112.41 +        System.out.println(dummyPerm.toString());
  112.42 +        System.out.println(dummyPerm.getDescription());
  112.43 +        System.out.println(nullActionPerm.toString());
  112.44 +        System.out.println(nullActionPerm.getDescription());
  112.45 +        if (!dummyPerm.toString().equals(dummyPerm.getDescription())) {
  112.46 +            throw new Exception("The expected permission.toString() is " +
  112.47 +                dummyPerm.getDescription() + ", but " +
  112.48 +                dummyPerm.toString() + " returned!");
  112.49 +        }
  112.50 +
  112.51 +        if (!nullActionPerm.toString().equals(nullActionPerm.getDescription())) {
  112.52 +            throw new Exception("The expected permission.toString() is " +
  112.53 +                nullActionPerm.getDescription() + ", but " +
  112.54 +                nullActionPerm.toString() + " returned!");
  112.55 +        }
  112.56 +    }
  112.57 +
  112.58 +    private static abstract class SimplePermission extends Permission {
  112.59 +        public SimplePermission(String name) {
  112.60 +            super(name);
  112.61 +        }
  112.62 +
  112.63 +        public boolean implies(Permission permission) {
  112.64 +            return false;
  112.65 +        }
  112.66 +
  112.67 +        public boolean equals(Object obj) {
  112.68 +            return false;
  112.69 +        }
  112.70 +
  112.71 +        public int hashCode() {
  112.72 +            return 13;
  112.73 +        }
  112.74 +    }
  112.75 +
  112.76 +    private static class DummyWritePermission extends SimplePermission {
  112.77 +        public DummyWritePermission() {
  112.78 +            super("permit to");
  112.79 +        }
  112.80 +
  112.81 +        public String getActions() {
  112.82 +            return "write";
  112.83 +        }
  112.84 +
  112.85 +        public String getDescription() {
  112.86 +            return "(\"ToString$DummyWritePermission\" \"permit to\" \"write\")";
  112.87 +        }
  112.88 +    }
  112.89 +
  112.90 +    private static class NullActionPermission extends SimplePermission {
  112.91 +        public NullActionPermission() {
  112.92 +            super("permit to");
  112.93 +        }
  112.94 +
  112.95 +        public String getActions() {
  112.96 +            return null;
  112.97 +        }
  112.98 +
  112.99 +        public String getDescription() {
 112.100 +            return "(\"ToString$NullActionPermission\" \"permit to\")";
 112.101 +        }
 112.102 +    }
 112.103 +
 112.104 +}
   113.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   113.2 +++ b/test/java/security/cert/CertPathValidator/OCSP/FailoverToCRL.java	Wed Apr 08 15:40:56 2009 -0700
   113.3 @@ -0,0 +1,265 @@
   113.4 +/*
   113.5 + * Copyright 2009 Sun Microsystems, Inc.  All Rights Reserved.
   113.6 + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   113.7 + *
   113.8 + * This code is free software; you can redistribute it and/or modify it
   113.9 + * under the terms of the GNU General Public License version 2 only, as
  113.10 + * published by the Free Software Foundation.
  113.11 + *
  113.12 + * This code is distributed in the hope that it will be useful, but WITHOUT
  113.13 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  113.14 + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  113.15 + * version 2 for more details (a copy is included in the LICENSE file that
  113.16 + * accompanied this code).
  113.17 + *
  113.18 + * You should have received a copy of the GNU General Public License version
  113.19 + * 2 along with this work; if not, write to the Free Software Foundation,
  113.20 + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  113.21 + *
  113.22 + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
  113.23 + * CA 95054 USA or visit www.sun.com if you need additional information or
  113.24 + * have any questions.
  113.25 + */
  113.26 +
  113.27 +/**
  113.28 + * @test
  113.29 + * @bug 6383095
  113.30 + * @summary CRL revoked certificate failures masked by OCSP failures
  113.31 + *
  113.32 + * Note that the certificate validity is from Mar 16 14:55:35 2009 GMT to
  113.33 + * Dec 1 14:55:35 2028 GMT, please update it with newer certificate if
  113.34 + * expires.
  113.35 + *
  113.36 + * @author Xuelei Fan
  113.37 + */
  113.38 +
  113.39 +/*
  113.40 + * Certificates used in the test.
  113.41 + *
  113.42 + * end entity certificate:
  113.43 + * Data:
  113.44 + *     Version: 3 (0x2)
  113.45 + *     Serial Number: 25 (0x19)
  113.46 + *     Signature Algorithm: md5WithRSAEncryption
  113.47 + *     Issuer: C=US, ST=Some-State, L=Some-City, O=Some-Org
  113.48 + *     Validity
  113.49 + *         Not Before: Mar 16 14:55:35 2009 GMT
  113.50 + *         Not After : Dec  1 14:55:35 2028 GMT
  113.51 + *     Subject: C=US, ST=Some-State, L=Some-City, O=Some-Org, OU=SSL-Client,
  113.52 + *              CN=localhost
  113.53 + *     Subject Public Key Info:
  113.54 + *         Public Key Algorithm: rsaEncryption
  113.55 + *         RSA Public Key: (1024 bit)
  113.56 + *             Modulus (1024 bit):
  113.57 + *                 00:bb:f0:40:36:ac:26:54:4e:f4:a3:5a:00:2f:69:
  113.58 + *                 21:6f:b9:7a:3a:93:ec:a2:f6:e1:8e:c7:63:d8:2f:
  113.59 + *                 12:30:99:2e:b0:f2:8f:f8:27:2d:24:78:28:84:f7:
  113.60 + *                 01:bf:8d:44:79:dd:3b:d2:55:f3:ce:3c:b2:5b:21:
  113.61 + *                 7d:ef:fd:33:4a:b1:a3:ff:c6:c8:9b:b9:0f:7c:41:
  113.62 + *                 35:97:f9:db:3a:05:60:05:15:af:59:17:92:a3:10:
  113.63 + *                 ad:16:1c:e4:07:53:af:a8:76:a2:56:2a:92:d3:f9:
  113.64 + *                 28:e0:78:cf:5e:1f:48:ab:5c:19:dd:e1:67:43:ba:
  113.65 + *                 75:8d:f5:82:ac:43:92:44:1b
  113.66 + *             Exponent: 65537 (0x10001)
  113.67 + *     X509v3 extensions:
  113.68 + *         X509v3 Basic Constraints:
  113.69 + *             CA:FALSE
  113.70 + *         X509v3 Key Usage:
  113.71 + *             Digital Signature, Non Repudiation, Key Encipherment
  113.72 + *         X509v3 Subject Key Identifier:
  113.73 + *             CD:BB:C8:85:AA:91:BD:FD:1D:BE:CD:67:7C:FF:B3:E9:4C:A8:22:E6
  113.74 + *         X509v3 Authority Key Identifier:
  113.75 + *             keyid:FA:B9:51:BF:4C:E7:D9:86:98:33:F9:E7:CB:1E:F1:33:49:F7:A8:14
  113.76 + * Signature Algorithm: md5WithRSAEncryption
  113.77 + *
  113.78 + *
  113.79 + * trusted certificate authority:
  113.80 + * Data:
  113.81 + *     Version: 3 (0x2)
  113.82 + *     Serial Number: 0 (0x0)
  113.83 + *     Signature Algorithm: md5WithRSAEncryption
  113.84 + *     Issuer: C=US, ST=Some-State, L=Some-City, O=Some-Org
  113.85 + *     Validity
  113.86 + *         Not Before: Dec  8 02:43:36 2008 GMT
  113.87 + *         Not After : Aug 25 02:43:36 2028 GMT
  113.88 + *     Subject: C=US, ST=Some-State, L=Some-City, O=Some-Org
  113.89 + *     Subject Public Key Info:
  113.90 + *         Public Key Algorithm: rsaEncryption
  113.91 + *         RSA Public Key: (1024 bit)
  113.92 + *             Modulus (1024 bit):
  113.93 + *                 00:cb:c4:38:20:07:be:88:a7:93:b0:a1:43:51:2d:
  113.94 + *                 d7:8e:85:af:54:dd:ad:a2:7b:23:5b:cf:99:13:53:
  113.95 + *                 99:45:7d:ee:6d:ba:2d:bf:e3:ad:6e:3d:9f:1a:f9:
  113.96 + *                 03:97:e0:17:55:ae:11:26:57:de:01:29:8e:05:3f:
  113.97 + *                 21:f7:e7:36:e8:2e:37:d7:48:ac:53:d6:60:0e:c7:
  113.98 + *                 50:6d:f6:c5:85:f7:8b:a6:c5:91:35:72:3c:94:ee:
  113.99 + *                 f1:17:f0:71:e3:ec:1b:ce:ca:4e:40:42:b0:6d:ee:
 113.100 + *                 6a:0e:d6:e5:ad:3c:0f:c9:ba:82:4f:78:f8:89:97:
 113.101 + *                 89:2a:95:12:4c:d8:09:2a:e9
 113.102 + *             Exponent: 65537 (0x10001)
 113.103 + *     X509v3 extensions:
 113.104 + *         X509v3 Subject Key Identifier:
 113.105 + *             FA:B9:51:BF:4C:E7:D9:86:98:33:F9:E7:CB:1E:F1:33:49:F7:A8:14
 113.106 + *         X509v3 Authority Key Identifier:
 113.107 + *             keyid:FA:B9:51:BF:4C:E7:D9:86:98:33:F9:E7:CB:1E:F1:33:49:F7:A8:14
 113.108 + *             DirName:/C=US/ST=Some-State/L=Some-City/O=Some-Org
 113.109 + *         X509v3 Basic Constraints:
 113.110 + *             CA:TRUE
 113.111 + * Signature Algorithm: md5WithRSAEncryption
 113.112 + *
 113.113 + * CRL:
 113.114 + * Certificate Revocation List (CRL):
 113.115 + *    Version 2 (0x1)
 113.116 + *    Signature Algorithm: md5WithRSAEncryption
 113.117 + *    Issuer: /C=US/ST=Some-State/L=Some-City/O=Some-Org
 113.118 + *    Last Update: Mar 16 16:27:14 2009 GMT
 113.119 + *    Next Update: May 15 16:27:14 2028 GMT
 113.120 + *    CRL extensions:
 113.121 + *       X509v3 CRL Number:
 113.122 + *              2
 113.123 + * Revoked Certificates:
 113.124 + *    Serial Number: 19
 113.125 + *        Revocation Date: Mar 16 16:22:08 2009 GMT
 113.126 + *        CRL entry extensions:
 113.127 + *            X509v3 CRL Reason Code:
 113.128 + *                Superseded
 113.129 + *    Signature Algorithm: md5WithRSAEncryption
 113.130 + */
 113.131 +
 113.132 +import java.io.*;
 113.133 +import java.net.SocketException;
 113.134 +import java.util.*;
 113.135 +import java.security.Security;
 113.136 +import java.security.cert.*;
 113.137 +import java.security.InvalidAlgorithmParameterException;
 113.138 +import java.security.cert.CertPathValidatorException.BasicReason;
 113.139 +
 113.140 +public class FailoverToCRL {
 113.141 +
 113.142 +    static String trusedCertStr =
 113.143 +        "-----BEGIN CERTIFICATE-----\n" +
 113.144 +        "MIICrDCCAhWgAwIBAgIBADANBgkqhkiG9w0BAQQFADBJMQswCQYDVQQGEwJVUzET\n" +
 113.145 +        "MBEGA1UECBMKU29tZS1TdGF0ZTESMBAGA1UEBxMJU29tZS1DaXR5MREwDwYDVQQK\n" +
 113.146 +        "EwhTb21lLU9yZzAeFw0wODEyMDgwMjQzMzZaFw0yODA4MjUwMjQzMzZaMEkxCzAJ\n" +
 113.147 +        "BgNVBAYTAlVTMRMwEQYDVQQIEwpTb21lLVN0YXRlMRIwEAYDVQQHEwlTb21lLUNp\n" +
 113.148 +        "dHkxETAPBgNVBAoTCFNvbWUtT3JnMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB\n" +
 113.149 +        "gQDLxDggB76Ip5OwoUNRLdeOha9U3a2ieyNbz5kTU5lFfe5tui2/461uPZ8a+QOX\n" +
 113.150 +        "4BdVrhEmV94BKY4FPyH35zboLjfXSKxT1mAOx1Bt9sWF94umxZE1cjyU7vEX8HHj\n" +
 113.151 +        "7BvOyk5AQrBt7moO1uWtPA/JuoJPePiJl4kqlRJM2Akq6QIDAQABo4GjMIGgMB0G\n" +
 113.152 +        "A1UdDgQWBBT6uVG/TOfZhpgz+efLHvEzSfeoFDBxBgNVHSMEajBogBT6uVG/TOfZ\n" +
 113.153 +        "hpgz+efLHvEzSfeoFKFNpEswSTELMAkGA1UEBhMCVVMxEzARBgNVBAgTClNvbWUt\n" +
 113.154 +        "U3RhdGUxEjAQBgNVBAcTCVNvbWUtQ2l0eTERMA8GA1UEChMIU29tZS1PcmeCAQAw\n" +
 113.155 +        "DAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQBcIm534U123Hz+rtyYO5uA\n" +
 113.156 +        "ofd81G6FnTfEAV8Kw9fGyyEbQZclBv34A9JsFKeMvU4OFIaixD7nLZ/NZ+IWbhmZ\n" +
 113.157 +        "LovmJXyCkOufea73pNiZ+f/4/ScZaIlM/PRycQSqbFNd4j9Wott+08qxHPLpsf3P\n" +
 113.158 +        "6Mvf0r1PNTY2hwTJLJmKtg==\n" +
 113.159 +        "-----END CERTIFICATE-----";
 113.160 +
 113.161 +    static String targetCertStr =
 113.162 +        "-----BEGIN CERTIFICATE-----\n" +
 113.163 +        "MIICizCCAfSgAwIBAgIBGTANBgkqhkiG9w0BAQQFADBJMQswCQYDVQQGEwJVUzET\n" +
 113.164 +        "MBEGA1UECBMKU29tZS1TdGF0ZTESMBAGA1UEBxMJU29tZS1DaXR5MREwDwYDVQQK\n" +
 113.165 +        "EwhTb21lLU9yZzAeFw0wOTAzMTYxNDU1MzVaFw0yODEyMDExNDU1MzVaMHIxCzAJ\n" +
 113.166 +        "BgNVBAYTAlVTMRMwEQYDVQQIEwpTb21lLVN0YXRlMRIwEAYDVQQHEwlTb21lLUNp\n" +
 113.167 +        "dHkxETAPBgNVBAoTCFNvbWUtT3JnMRMwEQYDVQQLEwpTU0wtQ2xpZW50MRIwEAYD\n" +
 113.168 +        "VQQDEwlsb2NhbGhvc3QwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALvwQDas\n" +
 113.169 +        "JlRO9KNaAC9pIW+5ejqT7KL24Y7HY9gvEjCZLrDyj/gnLSR4KIT3Ab+NRHndO9JV\n" +
 113.170 +        "8848slshfe/9M0qxo//GyJu5D3xBNZf52zoFYAUVr1kXkqMQrRYc5AdTr6h2olYq\n" +
 113.171 +        "ktP5KOB4z14fSKtcGd3hZ0O6dY31gqxDkkQbAgMBAAGjWjBYMAkGA1UdEwQCMAAw\n" +
 113.172 +        "CwYDVR0PBAQDAgXgMB0GA1UdDgQWBBTNu8iFqpG9/R2+zWd8/7PpTKgi5jAfBgNV\n" +
 113.173 +        "HSMEGDAWgBT6uVG/TOfZhpgz+efLHvEzSfeoFDANBgkqhkiG9w0BAQQFAAOBgQBv\n" +
 113.174 +        "p7JjCDOrMBNun46xs4Gz7Y4ygM5VHaFP0oO7369twvRSu0pCuIdZd5OIMPFeRqQw\n" +
 113.175 +        "PA68ZdhYVR0pG5W7isV+jB+Dfge/IOgOA85sZ/6FlP3PBRW+YMQKKdRr5So3ook9\n" +
 113.176 +        "PimQ7rbxRAofPECv20IUKFBbOUkU+gFcn+WbTKYxBw==\n" +
 113.177 +        "-----END CERTIFICATE-----";
 113.178 +
 113.179 +    static String crlStr =
 113.180 +        "-----BEGIN X509 CRL-----\n" +
 113.181 +        "MIIBRTCBrwIBATANBgkqhkiG9w0BAQQFADBJMQswCQYDVQQGEwJVUzETMBEGA1UE\n" +
 113.182 +        "CBMKU29tZS1TdGF0ZTESMBAGA1UEBxMJU29tZS1DaXR5MREwDwYDVQQKEwhTb21l\n" +
 113.183 +        "LU9yZxcNMDkwMzE2MTYyNzE0WhcNMjgwNTE1MTYyNzE0WjAiMCACARkXDTA5MDMx\n" +
 113.184 +        "NjE2MjIwOFowDDAKBgNVHRUEAwoBBKAOMAwwCgYDVR0UBAMCAQIwDQYJKoZIhvcN\n" +
 113.185 +        "AQEEBQADgYEAMixJI9vBwYpOGosn46+T/MTEtlm2S5pIVT/xPDrHkCPfw8l4Zrgp\n" +
 113.186 +        "dGPuUkglWdrGdxY9MNRUj2YFNfdZi6zZ7JF6XbkDHYOAKYgPDJRjS/0VcBntn5RJ\n" +
 113.187 +        "sQfZsBqc9fFSP8gknRRn3LT41kr9xNRxTT1t3YYjv7J3zkMYyInqeUA=\n" +
 113.188 +        "-----END X509 CRL-----";
 113.189 +
 113.190 +
 113.191 +    private static CertPath generateCertificatePath()
 113.192 +            throws CertificateException {
 113.193 +        // generate certificate from cert strings
 113.194 +        CertificateFactory cf = CertificateFactory.getInstance("X.509");
 113.195 +
 113.196 +        ByteArrayInputStream is =
 113.197 +                new ByteArrayInputStream(targetCertStr.getBytes());
 113.198 +        Certificate targetCert = cf.generateCertificate(is);
 113.199 +
 113.200 +        // generate certification path
 113.201 +        List<Certificate> list = Arrays.asList(new Certificate[] {targetCert});
 113.202 +
 113.203 +        return cf.generateCertPath(list);
 113.204 +    }
 113.205 +
 113.206 +    private static Set<TrustAnchor> generateTrustAnchors()
 113.207 +            throws CertificateException {
 113.208 +        // generate certificate from cert string
 113.209 +        CertificateFactory cf = CertificateFactory.getInstance("X.509");
 113.210 +
 113.211 +        ByteArrayInputStream is =
 113.212 +                    new ByteArrayInputStream(trusedCertStr.getBytes());
 113.213 +        Certificate trusedCert = cf.generateCertificate(is);
 113.214 +
 113.215 +        // generate a trust anchor
 113.216 +        TrustAnchor anchor = new TrustAnchor((X509Certificate)trusedCert, null);
 113.217 +
 113.218 +        return Collections.singleton(anchor);
 113.219 +    }
 113.220 +
 113.221 +    private static CertStore generateCertificateStore() throws Exception {
 113.222 +        // generate CRL from CRL string
 113.223 +        CertificateFactory cf = CertificateFactory.getInstance("X.509");
 113.224 +
 113.225 +        ByteArrayInputStream is =
 113.226 +                    new ByteArrayInputStream(crlStr.getBytes());
 113.227 +
 113.228 +        // generate a cert store
 113.229 +        Collection<? extends CRL> crls = cf.generateCRLs(is);
 113.230 +        return CertStore.getInstance("Collection",
 113.231 +                            new CollectionCertStoreParameters(crls));
 113.232 +    }
 113.233 +
 113.234 +    public static void main(String args[]) throws Exception {
 113.235 +        CertPath path = generateCertificatePath();
 113.236 +        Set<TrustAnchor> anchors = generateTrustAnchors();
 113.237 +        CertStore crls = generateCertificateStore();
 113.238 +
 113.239 +        PKIXParameters params = new PKIXParameters(anchors);
 113.240 +
 113.241 +        // add the CRL store
 113.242 +        params.addCertStore(crls);
 113.243 +
 113.244 +        // Activate certificate revocation checking
 113.245 +        params.setRevocationEnabled(true);
 113.246 +
 113.247 +        // Activate OCSP
 113.248 +        Security.setProperty("ocsp.enable", "true");
 113.249 +        System.setProperty("com.sun.security.enableCRLDP", "true");
 113.250 +
 113.251 +        // Ensure that the ocsp.responderURL property is not set.
 113.252 +        if (Security.getProperty("ocsp.responderURL") != null) {
 113.253 +            throw new
 113.254 +                Exception("The ocsp.responderURL property must not be set");
 113.255 +        }
 113.256 +
 113.257 +        CertPathValidator validator = CertPathValidator.getInstance("PKIX");
 113.258 +
 113.259 +        try {
 113.260 +            validator.validate(path, params);
 113.261 +        } catch (CertPathValidatorException cpve) {
 113.262 +            if (cpve.getReason() != BasicReason.REVOKED) {
 113.263 +                throw new Exception(
 113.264 +                    "unexpect exception, should be a REVOKED CPVE", cpve);
 113.265 +            }
 113.266 +        }
 113.267 +    }
 113.268 +}
   114.1 --- a/test/java/util/concurrent/TimeUnit/Basic.java	Thu Apr 02 10:16:53 2009 -0700
   114.2 +++ b/test/java/util/concurrent/TimeUnit/Basic.java	Wed Apr 08 15:40:56 2009 -0700
   114.3 @@ -60,10 +60,11 @@
   114.4          equal(1000L, MICROSECONDS.toNanos(1));
   114.5  
   114.6          long t0 = System.nanoTime();
   114.7 -        MILLISECONDS.sleep(3);
   114.8 +        MILLISECONDS.sleep(3); /* See windows bug 6313903, might not sleep */
   114.9          long elapsedMillis = (System.nanoTime() - t0)/(1000L * 1000L);
  114.10          System.out.printf("elapsed=%d%n", elapsedMillis);
  114.11 -        check(elapsedMillis >= 3);
  114.12 +        check(elapsedMillis >= 0);
  114.13 +        /* Might not sleep on windows: check(elapsedMillis >= 3); */
  114.14          check(elapsedMillis < 1000);
  114.15  
  114.16          //----------------------------------------------------------------
   115.1 --- a/test/java/util/logging/LoggingDeadlock2.java	Thu Apr 02 10:16:53 2009 -0700
   115.2 +++ b/test/java/util/logging/LoggingDeadlock2.java	Wed Apr 08 15:40:56 2009 -0700
   115.3 @@ -24,7 +24,7 @@
   115.4  /*
   115.5   * @test
   115.6   * @bug     6467152
   115.7 - *
   115.8 + * @ignore until 6716076 is fixed
   115.9   * @summary deadlock occurs in LogManager initialization and JVM termination
  115.10   * @author  Serguei Spitsyn / Hittachi
  115.11   *
   116.1 --- a/test/java/util/regex/RegExTest.java	Thu Apr 02 10:16:53 2009 -0700
   116.2 +++ b/test/java/util/regex/RegExTest.java	Wed Apr 08 15:40:56 2009 -0700
   116.3 @@ -3389,6 +3389,11 @@
   116.4                "gname",
   116.5                "yyy");
   116.6  
   116.7 +        check(Pattern.compile("x+(?<8gname>y+)z+"),
   116.8 +              "xxxyyyzzz",
   116.9 +              "8gname",
  116.10 +              "yyy");
  116.11 +
  116.12          //backref
  116.13          Pattern pattern = Pattern.compile("(a*)bc\\1");
  116.14          check(pattern, "zzzaabcazzz", true);  // found "abca"
   117.1 --- a/test/java/util/zip/ZipFile/LargeZipFile.java	Thu Apr 02 10:16:53 2009 -0700
   117.2 +++ b/test/java/util/zip/ZipFile/LargeZipFile.java	Wed Apr 08 15:40:56 2009 -0700
   117.3 @@ -1,3 +1,26 @@
   117.4 +/*
   117.5 + * Copyright 2009 Sun Microsystems, Inc.  All Rights Reserved.
   117.6 + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   117.7 + *
   117.8 + * This code is free software; you can redistribute it and/or modify it
   117.9 + * under the terms of the GNU General Public License version 2 only, as
  117.10 + * published by the Free Software Foundation.
  117.11 + *
  117.12 + * This code is distributed in the hope that it will be useful, but WITHOUT
  117.13 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  117.14 + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  117.15 + * version 2 for more details (a copy is included in the LICENSE file that
  117.16 + * accompanied this code).
  117.17 + *
  117.18 + * You should have received a copy of the GNU General Public License version
  117.19 + * 2 along with this work; if not, write to the Free Software Foundation,
  117.20 + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  117.21 + *
  117.22 + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
  117.23 + * CA 95054 USA or visit www.sun.com if you need additional information or
  117.24 + * have any questions.
  117.25 + */
  117.26 +
  117.27  import java.io.*;
  117.28  import java.nio.*;
  117.29  import java.util.*;
   118.1 --- a/test/javax/script/Test3.java	Thu Apr 02 10:16:53 2009 -0700
   118.2 +++ b/test/javax/script/Test3.java	Wed Apr 08 15:40:56 2009 -0700
   118.3 @@ -4,7 +4,6 @@
   118.4   *
   118.5   * This code is free software; you can redistribute it and/or modify it
   118.6   * under the terms of the GNU General Public License version 2 only, as
   118.7 -
   118.8   * published by the Free Software Foundation.
   118.9   *
  118.10   * This code is distributed in the hope that it will be useful, but WITHOUT
   119.1 --- a/test/sun/nio/cs/FindEncoderBugs.java	Thu Apr 02 10:16:53 2009 -0700
   119.2 +++ b/test/sun/nio/cs/FindEncoderBugs.java	Wed Apr 08 15:40:56 2009 -0700
   119.3 @@ -526,4 +526,3 @@
   119.4          System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed);
   119.5          if (failed > 0) throw new AssertionError("Some tests failed");}
   119.6  }
   119.7 -
   120.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   120.2 +++ b/test/sun/nio/cs/StrCodingBenchmark.java	Wed Apr 08 15:40:56 2009 -0700
   120.3 @@ -0,0 +1,200 @@
   120.4 +/*
   120.5 + * Copyright (c) 2009 Sun Microsystems, Inc.  All Rights Reserved.
   120.6 + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   120.7 + *
   120.8 + * This code is free software; you can redistribute it and/or modify it
   120.9 + * under the terms of the GNU General Public License version 2 only, as
  120.10 + * published by the Free Software Foundation.
  120.11 + *
  120.12 + * This code is distributed in the hope that it will be useful, but WITHOUT
  120.13 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  120.14 + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  120.15 + * version 2 for more details (a copy is included in the LICENSE file that
  120.16 + * accompanied this code).
  120.17 + *
  120.18 + * You should have received a copy of the GNU General Public License version
  120.19 + * 2 along with this work; if not, write to the Free Software Foundation,
  120.20 + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  120.21 + *
  120.22 + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
  120.23 + * CA 95054 USA or visit www.sun.com if you need additional information or
  120.24 + * have any questions.
  120.25 + */
  120.26 +
  120.27 +import java.util.*;
  120.28 +import java.nio.*;
  120.29 +import java.nio.charset.*;
  120.30 +import java.util.concurrent.*;
  120.31 +import java.util.regex.Pattern;
  120.32 +
  120.33 +/**
  120.34 + * Usage: java StringCodingBenchmark
  120.35 + * [-Diterations=N] [-Dsize=N] [-Dsubsize=N] [-Dmaxchar=N]
  120.36 + * [-Dfilter=REGEXP] [-DSecurityManager=true]
  120.37 + */
  120.38 +public class StrCodingBenchmark {
  120.39 +    abstract static class Job {
  120.40 +        private final String name;
  120.41 +        public Job(String name) { this.name = name; }
  120.42 +        public String name() { return name; }
  120.43 +        public abstract void work() throws Throwable;
  120.44 +    }
  120.45 +
  120.46 +    private static void collectAllGarbage() {
  120.47 +        final java.util.concurrent.CountDownLatch drained
  120.48 +            = new java.util.concurrent.CountDownLatch(1);
  120.49 +        try {
  120.50 +            System.gc();        // enqueue finalizable objects
  120.51 +            new Object() { protected void finalize() {
  120.52 +                drained.countDown(); }};
  120.53 +            System.gc();        // enqueue detector
  120.54 +            drained.await();    // wait for finalizer queue to drain
  120.55 +            System.gc();        // cleanup finalized objects
  120.56 +        } catch (InterruptedException e) { throw new Error(e); }
  120.57 +    }
  120.58 +
  120.59 +    /**
  120.60 +     * Runs each job for long enough that all the runtime compilers
  120.61 +     * have had plenty of time to warm up, i.e. get around to
  120.62 +     * compiling everything worth compiling.
  120.63 +     * Returns array of average times per job per run.
  120.64 +     */
  120.65 +    public static long[] time0(Job ... jobs) throws Throwable {
  120.66 +        //final long warmupNanos = 10L * 1000L * 1000L * 1000L;
  120.67 +        final long warmupNanos = 100L * 100L;
  120.68 +        long[] nanoss = new long[jobs.length];
  120.69 +        for (int i = 0; i < jobs.length; i++) {
  120.70 +            collectAllGarbage();
  120.71 +            long t0 = System.nanoTime();
  120.72 +            long t;
  120.73 +            int j = 0;
  120.74 +            do { jobs[i].work(); j++; }
  120.75 +            while ((t = System.nanoTime() - t0) < warmupNanos);
  120.76 +            nanoss[i] = t/j;
  120.77 +        }
  120.78 +        return nanoss;
  120.79 +    }
  120.80 +
  120.81 +    public static void time(Job ... jobs) throws Throwable {
  120.82 +
  120.83 +        long[] warmup = time0(jobs); // Warm up run
  120.84 +        long[] nanoss = time0(jobs); // Real timing run
  120.85 +        long[] milliss = new long[jobs.length];
  120.86 +        double[] ratios = new double[jobs.length];
  120.87 +
  120.88 +        final String nameHeader   = "Method";
  120.89 +        final String millisHeader = "Millis";
  120.90 +        final String ratioHeader  = "Ratio";
  120.91 +
  120.92 +        int nameWidth   = nameHeader.length();
  120.93 +        int millisWidth = millisHeader.length();
  120.94 +        int ratioWidth  = ratioHeader.length();
  120.95 +
  120.96 +        for (int i = 0; i < jobs.length; i++) {
  120.97 +            nameWidth = Math.max(nameWidth, jobs[i].name().length());
  120.98 +
  120.99 +            milliss[i] = nanoss[i]/(1000L * 1000L);
 120.100 +            millisWidth = Math.max(millisWidth,
 120.101 +                                   String.format("%d", milliss[i]).length());
 120.102 +
 120.103 +            ratios[i] = (double) nanoss[i] / (double) nanoss[0];
 120.104 +            ratioWidth = Math.max(ratioWidth,
 120.105 +                                  String.format("%.3f", ratios[i]).length());
 120.106 +        }
 120.107 +        String format = String.format("%%-%ds %%%dd %n",
 120.108 +                                      nameWidth, millisWidth);
 120.109 +        String headerFormat = String.format("%%-%ds %%%ds%n",
 120.110 +                                            nameWidth, millisWidth);
 120.111 +        System.out.printf(headerFormat, "Method", "Millis");
 120.112 +
 120.113 +        // Print out absolute and relative times, calibrated against first job
 120.114 +        for (int i = 0; i < jobs.length; i++)
 120.115 +            System.out.printf(format, jobs[i].name(), milliss[i], ratios[i]);
 120.116 +    }
 120.117 +
 120.118 +    public static Job[] filter(Pattern filter, Job[] jobs) {
 120.119 +        if (filter == null) return jobs;
 120.120 +        Job[] newJobs = new Job[jobs.length];
 120.121 +        int n = 0;
 120.122 +        for (Job job : jobs)
 120.123 +            if (filter.matcher(job.name()).find())
 120.124 +                newJobs[n++] = job;
 120.125 +        // Arrays.copyOf not available in JDK 5
 120.126 +        Job[] ret = new Job[n];
 120.127 +        System.arraycopy(newJobs, 0, ret, 0, n);
 120.128 +        return ret;
 120.129 +    }
 120.130 +
 120.131 +    static class PermissiveSecurityManger extends SecurityManager {
 120.132 +        @Override public void checkPermission(java.security.Permission p) {
 120.133 +        }
 120.134 +    }
 120.135 +
 120.136 +    public static void main(String[] args) throws Throwable {
 120.137 +        final int itrs = Integer.getInteger("iterations", 100000);
 120.138 +        final int size       = Integer.getInteger("size", 2048);
 120.139 +        final int subsize    = Integer.getInteger("subsize", 128);
 120.140 +        final int maxchar    = Integer.getInteger("maxchar", 128);
 120.141 +        final String regex = System.getProperty("filter");
 120.142 +        final Pattern filter = (regex == null) ? null : Pattern.compile(regex);
 120.143 +        final boolean useSecurityManager = Boolean.getBoolean("SecurityManager");
 120.144 +        if (useSecurityManager)
 120.145 +            System.setSecurityManager(new PermissiveSecurityManger());
 120.146 +        final Random rnd = new Random();
 120.147 +
 120.148 +        for (Charset charset:  Charset.availableCharsets().values()) {
 120.149 +            if (!("ISO-8859-1".equals(charset.name()) ||
 120.150 +                  "US-ASCII".equals(charset.name()) ||
 120.151 +                  charset.newDecoder() instanceof sun.nio.cs.SingleByte.Decoder))
 120.152 +                continue;
 120.153 +            final String csn = charset.name();
 120.154 +            final Charset cs = charset;
 120.155 +            final StringBuilder sb = new StringBuilder();
 120.156 +            {
 120.157 +                final CharsetEncoder enc = cs.newEncoder();
 120.158 +                for (int i = 0; i < size; ) {
 120.159 +                    char c = (char) rnd.nextInt(maxchar);
 120.160 +                    if (enc.canEncode(c)) {
 120.161 +                        sb.append(c);
 120.162 +                        i++;
 120.163 +                    }
 120.164 +                }
 120.165 +            }
 120.166 +            final String string = sb.toString();
 120.167 +            final byte[] bytes  = string.getBytes(cs);
 120.168 +
 120.169 +            System.out.printf("%n--------%s---------%n", csn);
 120.170 +            for (int sz = 4; sz <= 2048; sz *= 2) {
 120.171 +                System.out.printf("   [len=%d]%n", sz);
 120.172 +                final byte[] bs  = Arrays.copyOf(bytes, sz);
 120.173 +                final String str = new String(bs, csn);
 120.174 +                Job[] jobs = {
 120.175 +                    new Job("String decode: csn") {
 120.176 +                    public void work() throws Throwable {
 120.177 +                        for (int i = 0; i < itrs; i++)
 120.178 +                            new String(bs, csn);
 120.179 +                    }},
 120.180 +
 120.181 +                    new Job("String decode: cs") {
 120.182 +                    public void work() throws Throwable {
 120.183 +                        for (int i = 0; i < itrs; i++)
 120.184 +                            new String(bs, cs);
 120.185 +                    }},
 120.186 +
 120.187 +                    new Job("String encode: csn") {
 120.188 +                    public void work() throws Throwable {
 120.189 +                        for (int i = 0; i < itrs; i++)
 120.190 +                                str.getBytes(csn);
 120.191 +                    }},
 120.192 +
 120.193 +                    new Job("String encode: cs") {
 120.194 +                    public void work() throws Throwable {
 120.195 +                         for (int i = 0; i < itrs; i++)
 120.196 +                          str.getBytes(cs);
 120.197 +                    }},
 120.198 +                };
 120.199 +                time(filter(filter, jobs));
 120.200 +            }
 120.201 +        }
 120.202 +    }
 120.203 +}
   121.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   121.2 +++ b/test/sun/nio/cs/TestStringCoding.java	Wed Apr 08 15:40:56 2009 -0700
   121.3 @@ -0,0 +1,151 @@
   121.4 +/*
   121.5 + * Copyright 2000-2009 Sun Microsystems, Inc.  All Rights Reserved.
   121.6 + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   121.7 + *
   121.8 + * This code is free software; you can redistribute it and/or modify it
   121.9 + * under the terms of the GNU General Public License version 2 only, as
  121.10 + * published by the Free Software Foundation.  Sun designates this
  121.11 + * particular file as subject to the "Classpath" exception as provided
  121.12 + * by Sun in the LICENSE file that accompanied this code.
  121.13 + *
  121.14 + * This code is distributed in the hope that it will be useful, but WITHOUT
  121.15 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  121.16 + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  121.17 + * version 2 for more details (a copy is included in the LICENSE file that
  121.18 + * accompanied this code).
  121.19 + *
  121.20 + * You should have received a copy of the GNU General Public License version
  121.21 + * 2 along with this work; if not, write to the Free Software Foundation,
  121.22 + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  121.23 + *
  121.24 + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
  121.25 + * CA 95054 USA or visit www.sun.com if you need additional information or
  121.26 + * have any questions.
  121.27 + */
  121.28 +
  121.29 +/* @test
  121.30 +   @bug 6636323 6636319
  121.31 +   @summary Test if StringCoding and NIO result have the same de/encoding result
  121.32 + * @run main/timeout=2000 TestStringCoding
  121.33 + */
  121.34 +
  121.35 +import java.util.*;
  121.36 +import java.nio.*;
  121.37 +import java.nio.charset.*;
  121.38 +
  121.39 +public class TestStringCoding {
  121.40 +    public static void main(String[] args) throws Throwable {
  121.41 +
  121.42 +        for (Boolean hasSM: new boolean[] { false, true }) {
  121.43 +            if (hasSM)
  121.44 +                System.setSecurityManager(new PermissiveSecurityManger());
  121.45 +            for (Charset cs:  Charset.availableCharsets().values()) {
  121.46 +                if ("ISO-2022-CN".equals(cs.name()) ||
  121.47 +                    "x-COMPOUND_TEXT".equals(cs.name()) ||
  121.48 +                    "x-JISAutoDetect".equals(cs.name()))
  121.49 +                    continue;
  121.50 +                System.out.printf("Testing(sm=%b) " + cs.name() + "....", hasSM);
  121.51 +                // full bmp first
  121.52 +                char[] bmpCA = new char[0x10000];
  121.53 +                for (int i = 0; i < 0x10000; i++) {
  121.54 +                     bmpCA[i] = (char)i;
  121.55 +                }
  121.56 +                byte[] sbBA = new byte[0x100];
  121.57 +                for (int i = 0; i < 0x100; i++) {
  121.58 +                    sbBA[i] = (byte)i;
  121.59 +                }
  121.60 +                test(cs, bmpCA, sbBA);
  121.61 +                // "randomed" sizes
  121.62 +                Random rnd = new Random();
  121.63 +                for (int i = 0; i < 10; i++) {
  121.64 +                    int clen = rnd.nextInt(0x10000);
  121.65 +                    int blen = rnd.nextInt(0x100);
  121.66 +                    //System.out.printf("    blen=%d, clen=%d%n", blen, clen);
  121.67 +                    test(cs, Arrays.copyOf(bmpCA, clen), Arrays.copyOf(sbBA, blen));
  121.68 +                    //add a pair of surrogates
  121.69 +                    int pos = clen / 2;
  121.70 +                    if ((pos + 1) < blen) {
  121.71 +                        bmpCA[pos] = '\uD800';
  121.72 +                        bmpCA[pos+1] = '\uDC00';
  121.73 +                    }
  121.74 +                    test(cs, Arrays.copyOf(bmpCA, clen), Arrays.copyOf(sbBA, blen));
  121.75 +                }
  121.76 +                System.out.println("done!");
  121.77 +            }
  121.78 +        }
  121.79 +    }
  121.80 +
  121.81 +    static void test(Charset cs, char[] bmpCA, byte[] sbBA) throws Throwable {
  121.82 +        String bmpStr = new String(bmpCA);
  121.83 +        CharsetDecoder dec = cs.newDecoder()
  121.84 +            .onMalformedInput(CodingErrorAction.REPLACE)
  121.85 +            .onUnmappableCharacter(CodingErrorAction.REPLACE);
  121.86 +        CharsetEncoder enc = cs.newEncoder()
  121.87 +            .onMalformedInput(CodingErrorAction.REPLACE)
  121.88 +            .onUnmappableCharacter(CodingErrorAction.REPLACE);
  121.89 +
  121.90 +        //getBytes(csn);
  121.91 +        byte[] baSC = bmpStr.getBytes(cs.name());
  121.92 +        ByteBuffer bf = enc.reset().encode(CharBuffer.wrap(bmpCA));
  121.93 +        byte[] baNIO = new byte[bf.limit()];
  121.94 +        bf.get(baNIO, 0, baNIO.length);
  121.95 +        if (!Arrays.equals(baSC, baNIO))
  121.96 +            throw new RuntimeException("getBytes(csn) failed  -> " + cs.name());
  121.97 +
  121.98 +        //getBytes(cs);
  121.99 +        baSC = bmpStr.getBytes(cs);
 121.100 +        if (!Arrays.equals(baSC, baNIO))
 121.101 +            throw new RuntimeException("getBytes(cs) failed  -> " + cs.name());
 121.102 +
 121.103 +        //new String(csn);
 121.104 +        String strSC = new String(sbBA, cs.name());
 121.105 +        String strNIO = dec.reset().decode(ByteBuffer.wrap(sbBA)).toString();
 121.106 +        if(!strNIO.equals(strSC))
 121.107 +            throw new RuntimeException("new String(csn) failed  -> " + cs.name());
 121.108 +
 121.109 +        //new String(cs);
 121.110 +        strSC = new String(sbBA, cs);
 121.111 +        if (!strNIO.equals(strSC))
 121.112 +            throw new RuntimeException("new String(cs) failed  -> " + cs.name());
 121.113 +
 121.114 +        //encode unmappable surrogates
 121.115 +        if (enc instanceof sun.nio.cs.ArrayEncoder &&
 121.116 +            cs.contains(Charset.forName("ASCII"))) {
 121.117 +            enc.replaceWith(new byte[] { (byte)'A'});
 121.118 +            sun.nio.cs.ArrayEncoder cae = (sun.nio.cs.ArrayEncoder)enc;
 121.119 +
 121.120 +            String str = "ab\uD800\uDC00\uD800\uDC00cd";
 121.121 +            byte[] ba = new byte[str.length() - 2];
 121.122 +            int n = cae.encode(str.toCharArray(), 0, str.length(), ba);
 121.123 +            if (n != 6 || !"abAAcd".equals(new String(ba, cs.name())))
 121.124 +                throw new RuntimeException("encode1(surrogates) failed  -> "
 121.125 +                                           + cs.name());
 121.126 +
 121.127 +            ba = new byte[str.length()];
 121.128 +            n = cae.encode(str.toCharArray(), 0, str.length(), ba);
 121.129 +            if (n != 6 || !"abAAcd".equals(new String(ba, 0, n,
 121.130 +                                                     cs.name())))
 121.131 +                throw new RuntimeException("encode2(surrogates) failed  -> "
 121.132 +                                           + cs.name());
 121.133 +            str = "ab\uD800B\uDC00Bcd";
 121.134 +            ba = new byte[str.length()];
 121.135 +            n = cae.encode(str.toCharArray(), 0, str.length(), ba);
 121.136 +            if (n != 8 || !"abABABcd".equals(new String(ba, 0, n,
 121.137 +                                                       cs.name())))
 121.138 +                throw new RuntimeException("encode3(surrogates) failed  -> "
 121.139 +                                           + cs.name());
 121.140 +
 121.141 +            ba = new byte[str.length() - 1];
 121.142 +            n = cae.encode(str.toCharArray(), 0, str.length(), ba);
 121.143 +            if (n != 7 || !"abABABc".equals(new String(ba, 0, n,
 121.144 +                                                      cs.name())))
 121.145 +                throw new RuntimeException("encode4(surrogates) failed  -> "
 121.146 +                                           + cs.name());
 121.147 +        }
 121.148 +
 121.149 +    }
 121.150 +
 121.151 +    static class PermissiveSecurityManger extends SecurityManager {
 121.152 +        @Override public void checkPermission(java.security.Permission p) {}
 121.153 +    }
 121.154 +}
   122.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   122.2 +++ b/test/sun/security/krb5/auto/SpnegoReqFlags.java	Wed Apr 08 15:40:56 2009 -0700
   122.3 @@ -0,0 +1,92 @@
   122.4 +/*
   122.5 + * Copyright 2009 Sun Microsystems, Inc.  All Rights Reserved.
   122.6 + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   122.7 + *
   122.8 + * This code is free software; you can redistribute it and/or modify it
   122.9 + * under the terms of the GNU General Public License version 2 only, as
  122.10 + * published by the Free Software Foundation.
  122.11 + *
  122.12 + * This code is distributed in the hope that it will be useful, but WITHOUT
  122.13 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  122.14 + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  122.15 + * version 2 for more details (a copy is included in the LICENSE file that
  122.16 + * accompanied this code).
  122.17 + *
  122.18 + * You should have received a copy of the GNU General Public License version
  122.19 + * 2 along with this work; if not, write to the Free Software Foundation,
  122.20 + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  122.21 + *
  122.22 + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
  122.23 + * CA 95054 USA or visit www.sun.com if you need additional information or
  122.24 + * have any questions.
  122.25 + */
  122.26 +
  122.27 +/*
  122.28 + * @test
  122.29 + * @bug 6815182
  122.30 + * @summary GSSAPI/SPNEGO does not work with server using MIT Kerberos library
  122.31 + */
  122.32 +
  122.33 +import sun.security.jgss.GSSUtil;
  122.34 +import sun.security.util.BitArray;
  122.35 +import sun.security.util.DerInputStream;
  122.36 +import sun.security.util.DerValue;
  122.37 +
  122.38 +public class SpnegoReqFlags {
  122.39 +
  122.40 +    public static void main(String[] args)
  122.41 +            throws Exception {
  122.42 +
  122.43 +        // Create and start the KDC
  122.44 +        new OneKDC(null).writeJAASConf();
  122.45 +        new SpnegoReqFlags().go();
  122.46 +    }
  122.47 +
  122.48 +    void go() throws Exception {
  122.49 +        Context c = Context.fromJAAS("client");
  122.50 +        c.startAsClient(OneKDC.SERVER, GSSUtil.GSS_SPNEGO_MECH_OID);
  122.51 +
  122.52 +        byte[] token = c.doAs(new Action() {
  122.53 +            @Override
  122.54 +            public byte[] run(Context me, byte[] input) throws Exception {
  122.55 +                me.x().requestCredDeleg(true);
  122.56 +                me.x().requestReplayDet(false);
  122.57 +                me.x().requestSequenceDet(false);
  122.58 +                return me.x().initSecContext(new byte[0], 0, 0);
  122.59 +            }
  122.60 +        }, null);
  122.61 +
  122.62 +        DerValue d = new DerValue(token);   // GSSToken
  122.63 +        DerInputStream ins = d.data;        // OID + mech token
  122.64 +        d.data.getDerValue();               // skip OID
  122.65 +        d = d.data.getDerValue();           // NegTokenInit
  122.66 +        d = d.data.getDerValue();           // The SEQUENCE inside
  122.67 +
  122.68 +        boolean found = false;
  122.69 +
  122.70 +        // Go through all fields inside NegTokenInit. The reqFlags field
  122.71 +        // is optional. It's even not recommended in RFC 4178.
  122.72 +        while (d.data.available() > 0) {
  122.73 +            DerValue d2 = d.data.getDerValue();
  122.74 +            if (d2.isContextSpecific((byte)1)) {
  122.75 +                found = true;
  122.76 +                System.out.println("regFlags field located.");
  122.77 +                BitArray ba = d2.data.getUnalignedBitString();
  122.78 +                if (ba.length() != 7) {
  122.79 +                    throw new Exception("reqFlags should contain 7 bits");
  122.80 +                }
  122.81 +                if (!ba.get(0)) {
  122.82 +                    throw new Exception("delegFlag should be true");
  122.83 +                }
  122.84 +                if (ba.get(2) || ba.get(3)) {
  122.85 +                    throw new Exception("replay/sequenceFlag should be false");
  122.86 +                }
  122.87 +            }
  122.88 +        }
  122.89 +
  122.90 +        if (!found) {
  122.91 +            System.out.println("Warning: regFlags field not found, too new?");
  122.92 +        }
  122.93 +        c.dispose();
  122.94 +    }
  122.95 +}
   123.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   123.2 +++ b/test/sun/security/tools/keytool/NoExtNPE.sh	Wed Apr 08 15:40:56 2009 -0700
   123.3 @@ -0,0 +1,65 @@
   123.4 +#
   123.5 +# Copyright 2009 Sun Microsystems, Inc.  All Rights Reserved.
   123.6 +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   123.7 +#
   123.8 +# This code is free software; you can redistribute it and/or modify it
   123.9 +# under the terms of the GNU General Public License version 2 only, as
  123.10 +# published by the Free Software Foundation.
  123.11 +#
  123.12 +# This code is distributed in the hope that it will be useful, but WITHOUT
  123.13 +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  123.14 +# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  123.15 +# version 2 for more details (a copy is included in the LICENSE file that
  123.16 +# accompanied this code).
  123.17 +#
  123.18 +# You should have received a copy of the GNU General Public License version
  123.19 +# 2 along with this work; if not, write to the Free Software Foundation,
  123.20 +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  123.21 +#
  123.22 +# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
  123.23 +# CA 95054 USA or visit www.sun.com if you need additional information or
  123.24 +# have any questions.
  123.25 +#
  123.26 +
  123.27 +# @test
  123.28 +# @bug 6813402
  123.29 +# @summary keytool cannot -printcert entries without extensions
  123.30 +#
  123.31 +# @run shell NoExtNPE.sh
  123.32 +
  123.33 +# set a few environment variables so that the shell-script can run stand-alone
  123.34 +# in the source directory
  123.35 +if [ "${TESTSRC}" = "" ] ; then
  123.36 +   TESTSRC="."
  123.37 +fi
  123.38 +
  123.39 +if [ "${TESTJAVA}" = "" ] ; then
  123.40 +   echo "TESTJAVA not set.  Test cannot execute."
  123.41 +   echo "FAILED!!!"
  123.42 +   exit 1
  123.43 +fi
  123.44 +
  123.45 +# set platform-dependent variables
  123.46 +OS=`uname -s`
  123.47 +case "$OS" in
  123.48 +  SunOS )
  123.49 +    FILESEP="/"
  123.50 +    ;;
  123.51 +  Linux )
  123.52 +    FILESEP="/"
  123.53 +    ;;
  123.54 +  Windows* )
  123.55 +    FILESEP="\\"
  123.56 +    ;;
  123.57 +  * )
  123.58 +    echo "Unrecognized system!"
  123.59 +    exit 1;
  123.60 +    ;;
  123.61 +esac
  123.62 +
  123.63 +${TESTJAVA}${FILESEP}bin${FILESEP}keytool \
  123.64 +	-list -v \
  123.65 +	-keystore ${TESTSRC}${FILESEP}CloneKeyAskPassword.jks \
  123.66 +	-storepass test123
  123.67 +
  123.68 +exit $?
   124.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   124.2 +++ b/test/sun/security/tools/keytool/importreadall.sh	Wed Apr 08 15:40:56 2009 -0700
   124.3 @@ -0,0 +1,62 @@
   124.4 +#
   124.5 +# Copyright 2009 Sun Microsystems, Inc.  All Rights Reserved.
   124.6 +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   124.7 +#
   124.8 +# This code is free software; you can redistribute it and/or modify it
   124.9 +# under the terms of the GNU General Public License version 2 only, as
  124.10 +# published by the Free Software Foundation.
  124.11 +#
  124.12 +# This code is distributed in the hope that it will be useful, but WITHOUT
  124.13 +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  124.14 +# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  124.15 +# version 2 for more details (a copy is included in the LICENSE file that
  124.16 +# accompanied this code).
  124.17 +#
  124.18 +# You should have received a copy of the GNU General Public License version
  124.19 +# 2 along with this work; if not, write to the Free Software Foundation,
  124.20 +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  124.21 +#
  124.22 +# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
  124.23 +# CA 95054 USA or visit www.sun.com if you need additional information or
  124.24 +# have any questions.
  124.25 +#
  124.26 +
  124.27 +# @test
  124.28 +# @bug 6819272
  124.29 +# @summary keytool -importcert should read the whole input
  124.30 +#
  124.31 +# @run shell importreadall.sh
  124.32 +
  124.33 +# set a few environment variables so that the shell-script can run stand-alone
  124.34 +# in the source directory
  124.35 +if [ "${TESTSRC}" = "" ] ; then
  124.36 +   TESTSRC="."
  124.37 +fi
  124.38 +
  124.39 +if [ "${TESTJAVA}" = "" ] ; then
  124.40 +  JAVA_CMD=`which java`
  124.41 +  TESTJAVA=`dirname $JAVA_CMD`/..
  124.42 +fi
  124.43 +
  124.44 +# set platform-dependent variables
  124.45 +OS=`uname -s`
  124.46 +case "$OS" in
  124.47 +  Windows_* )
  124.48 +    FS="\\"
  124.49 +    ;;
  124.50 +  * )
  124.51 +    FS="/"
  124.52 +    ;;
  124.53 +esac
  124.54 +
  124.55 +KEYTOOL="${TESTJAVA}${FS}bin${FS}keytool -keystore importreadall.jks -storepass changeit -keypass changeit"
  124.56 +
  124.57 +# In case the test is run twice in the same directory
  124.58 +
  124.59 +$KEYTOOL -delete -alias a
  124.60 +$KEYTOOL -delete -alias ca
  124.61 +$KEYTOOL -genkeypair -alias a -dname CN=a || exit 1
  124.62 +$KEYTOOL -genkeypair -alias ca -dname CN=ca || exit 2
  124.63 +$KEYTOOL -certreq -alias a | $KEYTOOL -gencert -alias ca | $KEYTOOL -importcert -alias a
  124.64 +
  124.65 +exit $?