Merge jdk7-b51
authorohair
Tue, 17 Mar 2009 13:45:01 -0700
changeset 945fea0898259ae
parent 944 bdb4b0b28407
parent 943 ece878b04159
child 946 bcbeadb4a5d7
child 970 90873391a0e0
Merge
     1.1 --- a/make/common/shared/Defs-java.gmk	Tue Mar 17 13:44:08 2009 -0700
     1.2 +++ b/make/common/shared/Defs-java.gmk	Tue Mar 17 13:45:01 2009 -0700
     1.3 @@ -129,6 +129,9 @@
     1.4  # Needed for javah
     1.5  JAVAHFLAGS += -bootclasspath $(CLASSBINDIR)
     1.6  
     1.7 +# Needed for JAVADOC and BOOT_JAVACFLAGS
     1.8 +NO_PROPRIETARY_API_WARNINGS = -XDignore.symbol.file=true
     1.9 +
    1.10  # Langtools
    1.11  ifdef LANGTOOLS_DIST
    1.12    JAVAC_JAR   = $(LANGTOOLS_DIST)/bootstrap/lib/javac.jar
    1.13 @@ -192,6 +195,8 @@
    1.14  BOOT_JAVACFLAGS  += -encoding ascii
    1.15  BOOT_JAR_JFLAGS += $(JAR_JFLAGS)
    1.16  
    1.17 +BOOT_JAVACFLAGS  += $(NO_PROPRIETARY_API_WARNINGS)
    1.18 +
    1.19  BOOT_JAVA_CMD      = $(BOOTDIR)/bin/java $(JAVA_TOOLS_FLAGS)
    1.20  BOOT_JAVAC_CMD     = $(BOOTDIR)/bin/javac $(JAVAC_JVM_FLAGS) $(BOOT_JAVACFLAGS)
    1.21  BOOT_JAR_CMD       = $(BOOTDIR)/bin/jar
     2.1 --- a/make/docs/Makefile	Tue Mar 17 13:44:08 2009 -0700
     2.2 +++ b/make/docs/Makefile	Tue Mar 17 13:45:01 2009 -0700
     2.3 @@ -45,6 +45,7 @@
     2.4  DOCSTMPDIR          = $(TEMPDIR)/doctmp
     2.5  
     2.6  COMMON_JAVADOCFLAGS =					\
     2.7 +		$(NO_PROPRIETARY_API_WARNINGS)		\
     2.8  		-source 1.5				\
     2.9  		-quiet					\
    2.10                  -use					\
     3.1 --- a/make/javax/swing/beaninfo/SwingBeans.gmk	Tue Mar 17 13:44:08 2009 -0700
     3.2 +++ b/make/javax/swing/beaninfo/SwingBeans.gmk	Tue Mar 17 13:45:01 2009 -0700
     3.3 @@ -47,7 +47,7 @@
     3.4  LOCAL_JAVADOC   = $(JAVADOC_CMD) $(JAVADOCFLAGS)
     3.5  # get the absolute path to the jar command.
     3.6  PREFIX          = 1.2
     3.7 -JAVADOCFLAGS    = $(LANGUAGE_VERSION)
     3.8 +JAVADOCFLAGS    = $(NO_PROPRIETARY_API_WARNINGS) $(LANGUAGE_VERSION)
     3.9  SWINGPKG        = javax/swing
    3.10  LOCAL_JAVAC_FLAGS = $(OTHER_JAVACFLAGS)
    3.11  
     4.1 --- a/src/share/classes/com/sun/servicetag/resources/register.html	Tue Mar 17 13:44:08 2009 -0700
     4.2 +++ b/src/share/classes/com/sun/servicetag/resources/register.html	Tue Mar 17 13:45:01 2009 -0700
     4.3 @@ -68,7 +68,7 @@
     4.4            <table width="708" border="0" cellspacing="0" cellpadding="3">
     4.5              <tr valign="top">
     4.6                <td width="126" height="35">
     4.7 -              <form name="form1" method="post" action="@@REGISTRATION_URL@@" enctype="text/xml">
     4.8 +              <form name="form1" method="post" action="@@REGISTRATION_URL@@">
     4.9                  <input type="hidden" name="servicetag_payload" value="@@REGISTRATION_PAYLOAD@@">
    4.10                  <input type="submit" name="Submit"border="0" class="buttonblue" onmouseover="this.style.color='#fbe249';" onmouseout="this.style.color='#FFF';"  value="Register My JDK">
    4.11                </form></td>
     5.1 --- a/src/share/classes/com/sun/servicetag/resources/register_ja.html	Tue Mar 17 13:44:08 2009 -0700
     5.2 +++ b/src/share/classes/com/sun/servicetag/resources/register_ja.html	Tue Mar 17 13:45:01 2009 -0700
     5.3 @@ -62,7 +62,7 @@
     5.4            <p class="style1">必要になるのは、Sun 開発者向けネットワークアカウントまたはその他の Sun オンラインアカウントだけです。 まだアカウントがない場合は、アカウントの作成が求められます。 </p>
     5.5            <table width="708" border="0" cellspacing="0" cellpadding="3">
     5.6              <tr valign="top">
     5.7 -              <td width="126" height="35"><form name="form1" method="post" action="@@REGISTRATION_URL@@" enctype="text/xml">
     5.8 +              <td width="126" height="35"><form name="form1" method="post" action="@@REGISTRATION_URL@@">
     5.9  			  <input type="hidden" name="servicetag_payload" value="@@REGISTRATION_PAYLOAD@@">
    5.10                  <input type="submit" name="Submit"border="0" class="buttonblue" onmouseover="this.style.color='#fbe249';" onmouseout="this.style.color='#FFF';"  value="JDK 製品登録">
    5.11                </form></td>
     6.1 --- a/src/share/classes/com/sun/servicetag/resources/register_zh_CN.html	Tue Mar 17 13:44:08 2009 -0700
     6.2 +++ b/src/share/classes/com/sun/servicetag/resources/register_zh_CN.html	Tue Mar 17 13:45:01 2009 -0700
     6.3 @@ -63,7 +63,7 @@
     6.4  <p class="style1">您需要具有 Sun 开发者网络或其他 Sun 联机帐户。如果您没有,系统将提示您创建一个。 </p>
     6.5            <table width="708" border="0" cellspacing="0" cellpadding="3">
     6.6              <tr valign="top">
     6.7 -              <td width="126" height="35"><form name="form1" method="post" action="@@REGISTRATION_URL@@" enctype="text/xml">
     6.8 +              <td width="126" height="35"><form name="form1" method="post" action="@@REGISTRATION_URL@@">
     6.9  			  <input type="hidden" name="servicetag_payload" value="@@REGISTRATION_PAYLOAD@@">
    6.10  <input type="submit" name="Submit"border="0" class="buttonblue" onmouseover="this.style.color='#fbe249';" onmouseout="this.style.color='#FFF';"  value="注册我的 JDK">
    6.11                </form></td>
     7.1 --- a/src/share/classes/java/lang/Class.java	Tue Mar 17 13:44:08 2009 -0700
     7.2 +++ b/src/share/classes/java/lang/Class.java	Tue Mar 17 13:45:01 2009 -0700
     7.3 @@ -3059,14 +3059,12 @@
     7.4      }
     7.5  
     7.6  
     7.7 -    private static Annotation[] EMPTY_ANNOTATIONS_ARRAY = new Annotation[0];
     7.8 -
     7.9      /**
    7.10       * @since 1.5
    7.11       */
    7.12      public Annotation[] getAnnotations() {
    7.13          initAnnotationsIfNecessary();
    7.14 -        return annotations.values().toArray(EMPTY_ANNOTATIONS_ARRAY);
    7.15 +        return AnnotationParser.toArray(annotations);
    7.16      }
    7.17  
    7.18      /**
    7.19 @@ -3074,7 +3072,7 @@
    7.20       */
    7.21      public Annotation[] getDeclaredAnnotations()  {
    7.22          initAnnotationsIfNecessary();
    7.23 -        return declaredAnnotations.values().toArray(EMPTY_ANNOTATIONS_ARRAY);
    7.24 +        return AnnotationParser.toArray(declaredAnnotations);
    7.25      }
    7.26  
    7.27      // Annotations cache
     8.1 --- a/src/share/classes/java/lang/reflect/Constructor.java	Tue Mar 17 13:44:08 2009 -0700
     8.2 +++ b/src/share/classes/java/lang/reflect/Constructor.java	Tue Mar 17 13:45:01 2009 -0700
     8.3 @@ -626,13 +626,11 @@
     8.4          return (T) declaredAnnotations().get(annotationClass);
     8.5      }
     8.6  
     8.7 -    private static final Annotation[] EMPTY_ANNOTATION_ARRAY=new Annotation[0];
     8.8 -
     8.9      /**
    8.10       * @since 1.5
    8.11       */
    8.12      public Annotation[] getDeclaredAnnotations()  {
    8.13 -        return declaredAnnotations().values().toArray(EMPTY_ANNOTATION_ARRAY);
    8.14 +        return AnnotationParser.toArray(declaredAnnotations());
    8.15      }
    8.16  
    8.17      private transient Map<Class, Annotation> declaredAnnotations;
     9.1 --- a/src/share/classes/java/lang/reflect/Field.java	Tue Mar 17 13:44:08 2009 -0700
     9.2 +++ b/src/share/classes/java/lang/reflect/Field.java	Tue Mar 17 13:45:01 2009 -0700
     9.3 @@ -1018,13 +1018,11 @@
     9.4          return (T) declaredAnnotations().get(annotationClass);
     9.5      }
     9.6  
     9.7 -    private static final Annotation[] EMPTY_ANNOTATION_ARRAY=new Annotation[0];
     9.8 -
     9.9      /**
    9.10       * @since 1.5
    9.11       */
    9.12      public Annotation[] getDeclaredAnnotations()  {
    9.13 -        return declaredAnnotations().values().toArray(EMPTY_ANNOTATION_ARRAY);
    9.14 +        return AnnotationParser.toArray(declaredAnnotations());
    9.15      }
    9.16  
    9.17      private transient Map<Class, Annotation> declaredAnnotations;
    10.1 --- a/src/share/classes/java/lang/reflect/Method.java	Tue Mar 17 13:44:08 2009 -0700
    10.2 +++ b/src/share/classes/java/lang/reflect/Method.java	Tue Mar 17 13:45:01 2009 -0700
    10.3 @@ -705,13 +705,11 @@
    10.4          return (T) declaredAnnotations().get(annotationClass);
    10.5      }
    10.6  
    10.7 -    private static final Annotation[] EMPTY_ANNOTATION_ARRAY=new Annotation[0];
    10.8 -
    10.9      /**
   10.10       * @since 1.5
   10.11       */
   10.12      public Annotation[] getDeclaredAnnotations()  {
   10.13 -        return declaredAnnotations().values().toArray(EMPTY_ANNOTATION_ARRAY);
   10.14 +        return AnnotationParser.toArray(declaredAnnotations());
   10.15      }
   10.16  
   10.17      private transient Map<Class, Annotation> declaredAnnotations;
    11.1 --- a/src/share/classes/java/net/SocketPermission.java	Tue Mar 17 13:44:08 2009 -0700
    11.2 +++ b/src/share/classes/java/net/SocketPermission.java	Tue Mar 17 13:45:01 2009 -0700
    11.3 @@ -113,7 +113,6 @@
    11.4   * <p>Similarly, if the following permission:
    11.5   *
    11.6   * <pre>
    11.7 - *   p1 = new SocketPermission("puffin.eng.sun.com:7777", "connect,accept");
    11.8   *   p2 = new SocketPermission("localhost:1024-", "accept,connect,listen");
    11.9   * </pre>
   11.10   *
    12.1 --- a/src/share/classes/java/security/Permission.java	Tue Mar 17 13:44:08 2009 -0700
    12.2 +++ b/src/share/classes/java/security/Permission.java	Tue Mar 17 13:45:01 2009 -0700
    12.3 @@ -1,5 +1,5 @@
    12.4  /*
    12.5 - * Copyright 1997-2003 Sun Microsystems, Inc.  All Rights Reserved.
    12.6 + * Copyright 1997-2009 Sun Microsystems, Inc.  All Rights Reserved.
    12.7   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    12.8   *
    12.9   * This code is free software; you can redistribute it and/or modify it
   12.10 @@ -214,18 +214,18 @@
   12.11      /**
   12.12       * Returns a string describing this Permission.  The convention is to
   12.13       * specify the class name, the permission name, and the actions in
   12.14 -     * the following format: '("ClassName" "name" "actions")'.
   12.15 +     * the following format: '("ClassName" "name" "actions")', or
   12.16 +     * '("ClassName" "name")' if actions list is null or empty.
   12.17       *
   12.18       * @return information about this Permission.
   12.19       */
   12.20 -
   12.21      public String toString() {
   12.22          String actions = getActions();
   12.23          if ((actions == null) || (actions.length() == 0)) { // OPTIONAL
   12.24 -            return "(" + getClass().getName() + " " + name + ")";
   12.25 +            return "(\"" + getClass().getName() + "\" \"" + name + "\")";
   12.26          } else {
   12.27 -            return "(" + getClass().getName() + " " + name + " " +
   12.28 -                actions + ")";
   12.29 +            return "(\"" + getClass().getName() + "\" \"" + name +
   12.30 +                 "\" \"" + actions + "\")";
   12.31          }
   12.32      }
   12.33  }
    13.1 --- a/src/share/classes/java/util/ArrayList.java	Tue Mar 17 13:44:08 2009 -0700
    13.2 +++ b/src/share/classes/java/util/ArrayList.java	Tue Mar 17 13:45:01 2009 -0700
    13.3 @@ -179,7 +179,6 @@
    13.4          modCount++;
    13.5          int oldCapacity = elementData.length;
    13.6          if (minCapacity > oldCapacity) {
    13.7 -            Object oldData[] = elementData;
    13.8              int newCapacity = (oldCapacity * 3)/2 + 1;
    13.9              if (newCapacity < minCapacity)
   13.10                  newCapacity = minCapacity;
    14.1 --- a/src/share/classes/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.java	Tue Mar 17 13:44:08 2009 -0700
    14.2 +++ b/src/share/classes/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.java	Tue Mar 17 13:45:01 2009 -0700
    14.3 @@ -1222,8 +1222,10 @@
    14.4          // The correctness of this depends on head being initialized
    14.5          // before tail and on head.next being accurate if the current
    14.6          // thread is first in queue.
    14.7 -        Node h, s;
    14.8 -        return (h = head) != tail &&
    14.9 +        Node t = tail; // Read fields in reverse initialization order
   14.10 +        Node h = head;
   14.11 +        Node s;
   14.12 +        return h != t &&
   14.13              ((s = h.next) == null || s.thread != Thread.currentThread());
   14.14      }
   14.15  
    15.1 --- a/src/share/classes/java/util/concurrent/locks/AbstractQueuedSynchronizer.java	Tue Mar 17 13:44:08 2009 -0700
    15.2 +++ b/src/share/classes/java/util/concurrent/locks/AbstractQueuedSynchronizer.java	Tue Mar 17 13:45:01 2009 -0700
    15.3 @@ -1445,8 +1445,10 @@
    15.4          // The correctness of this depends on head being initialized
    15.5          // before tail and on head.next being accurate if the current
    15.6          // thread is first in queue.
    15.7 -        Node h, s;
    15.8 -        return (h = head) != tail &&
    15.9 +        Node t = tail; // Read fields in reverse initialization order
   15.10 +        Node h = head;
   15.11 +        Node s;
   15.12 +        return h != t &&
   15.13              ((s = h.next) == null || s.thread != Thread.currentThread());
   15.14      }
   15.15  
    16.1 --- a/src/share/classes/sun/launcher/LauncherHelper.java	Tue Mar 17 13:44:08 2009 -0700
    16.2 +++ b/src/share/classes/sun/launcher/LauncherHelper.java	Tue Mar 17 13:45:01 2009 -0700
    16.3 @@ -1,6 +1,5 @@
    16.4 -
    16.5  /*
    16.6 - * Copyright 2007-2008 Sun Microsystems, Inc.  All Rights Reserved.
    16.7 + * Copyright 2007-2009 Sun Microsystems, Inc.  All Rights Reserved.
    16.8   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    16.9   *
   16.10   * This code is free software; you can redistribute it and/or modify it
   16.11 @@ -55,18 +54,24 @@
   16.12      INSTANCE;
   16.13      private static final String defaultBundleName =
   16.14              "sun.launcher.resources.launcher";
   16.15 -    private static ResourceBundle javarb =
   16.16 -            ResourceBundle.getBundle(defaultBundleName);
   16.17      private static final String MAIN_CLASS = "Main-Class";
   16.18  
   16.19      private static StringBuilder outBuf = new StringBuilder();
   16.20  
   16.21 +    private static ResourceBundle javarb = null;
   16.22 +    private static synchronized ResourceBundle getLauncherResourceBundle() {
   16.23 +        if (javarb == null) {
   16.24 +            javarb = ResourceBundle.getBundle(defaultBundleName);
   16.25 +        }
   16.26 +        return javarb;
   16.27 +    }
   16.28 +
   16.29      /**
   16.30       * A private helper method to get a localized message and also
   16.31       * apply any arguments that we might pass.
   16.32       */
   16.33      private static String getLocalizedMessage(String key, Object... args) {
   16.34 -        String msg = javarb.getString(key);
   16.35 +        String msg = getLauncherResourceBundle().getString(key);
   16.36          return (args != null) ? MessageFormat.format(msg, args) : msg;
   16.37      }
   16.38  
    17.1 --- a/src/share/classes/sun/misc/ClassLoaderUtil.java	Tue Mar 17 13:44:08 2009 -0700
    17.2 +++ b/src/share/classes/sun/misc/ClassLoaderUtil.java	Tue Mar 17 13:45:01 2009 -0700
    17.3 @@ -77,8 +77,6 @@
    17.4                  jarsClosed.clear();
    17.5              }
    17.6  
    17.7 -            System.out.println ("classLoader = " + classLoader);
    17.8 -            System.out.println ("SharedSecrets.getJavaNetAccess()="+SharedSecrets.getJavaNetAccess());
    17.9              URLClassPath ucp = SharedSecrets.getJavaNetAccess()
   17.10                                                  .getURLClassPath(classLoader);
   17.11              ArrayList loaders = ucp.loaders;
    18.1 --- a/src/share/classes/sun/misc/FloatingDecimal.java	Tue Mar 17 13:44:08 2009 -0700
    18.2 +++ b/src/share/classes/sun/misc/FloatingDecimal.java	Tue Mar 17 13:45:01 2009 -0700
    18.3 @@ -1867,10 +1867,16 @@
    18.4       * Grammar is compatible with hexadecimal floating-point constants
    18.5       * described in section 6.4.4.2 of the C99 specification.
    18.6       */
    18.7 -    private static Pattern hexFloatPattern = Pattern.compile(
    18.8 +    private static Pattern hexFloatPattern = null;
    18.9 +    private static synchronized Pattern getHexFloatPattern() {
   18.10 +        if (hexFloatPattern == null) {
   18.11 +           hexFloatPattern = Pattern.compile(
   18.12                     //1           234                   56                7                   8      9
   18.13                      "([-+])?0[xX](((\\p{XDigit}+)\\.?)|((\\p{XDigit}*)\\.(\\p{XDigit}+)))[pP]([-+])?(\\p{Digit}+)[fFdD]?"
   18.14                      );
   18.15 +        }
   18.16 +        return hexFloatPattern;
   18.17 +    }
   18.18  
   18.19      /*
   18.20       * Convert string s to a suitable floating decimal; uses the
   18.21 @@ -1880,7 +1886,7 @@
   18.22     static FloatingDecimal parseHexString(String s) {
   18.23          // Verify string is a member of the hexadecimal floating-point
   18.24          // string language.
   18.25 -        Matcher m = hexFloatPattern.matcher(s);
   18.26 +        Matcher m = getHexFloatPattern().matcher(s);
   18.27          boolean validInput = m.matches();
   18.28  
   18.29          if (!validInput) {
    19.1 --- a/src/share/classes/sun/reflect/annotation/AnnotationParser.java	Tue Mar 17 13:44:08 2009 -0700
    19.2 +++ b/src/share/classes/sun/reflect/annotation/AnnotationParser.java	Tue Mar 17 13:45:01 2009 -0700
    19.3 @@ -788,4 +788,16 @@
    19.4          for (int i = 0; i < length; i++)
    19.5              skipMemberValue(buf);
    19.6      }
    19.7 +
    19.8 +    /*
    19.9 +     * This method converts the annotation map returned by the parseAnnotations()
   19.10 +     * method to an array.  It is called by Field.getDeclaredAnnotations(),
   19.11 +     * Method.getDeclaredAnnotations(), and Constructor.getDeclaredAnnotations().
   19.12 +     * This avoids the reflection classes to load the Annotation class until
   19.13 +     * it is needed.
   19.14 +     */
   19.15 +    private static final Annotation[] EMPTY_ANNOTATION_ARRAY = new Annotation[0];
   19.16 +    public static Annotation[] toArray(Map<Class, Annotation> annotations) {
   19.17 +        return annotations.values().toArray(EMPTY_ANNOTATION_ARRAY);
   19.18 +    }
   19.19  }
    20.1 --- a/src/share/classes/sun/security/pkcs11/P11Key.java	Tue Mar 17 13:44:08 2009 -0700
    20.2 +++ b/src/share/classes/sun/security/pkcs11/P11Key.java	Tue Mar 17 13:45:01 2009 -0700
    20.3 @@ -1,5 +1,5 @@
    20.4  /*
    20.5 - * Copyright 2003-2006 Sun Microsystems, Inc.  All Rights Reserved.
    20.6 + * Copyright 2003-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 @@ -26,6 +26,7 @@
   20.11  package sun.security.pkcs11;
   20.12  
   20.13  import java.io.*;
   20.14 +import java.lang.ref.*;
   20.15  import java.math.BigInteger;
   20.16  import java.util.*;
   20.17  
   20.18 @@ -67,9 +68,6 @@
   20.19      // type of key, one of (PUBLIC, PRIVATE, SECRET)
   20.20      final String type;
   20.21  
   20.22 -    // session in which the key was created, relevant for session objects
   20.23 -    final Session session;
   20.24 -
   20.25      // token instance
   20.26      final Token token;
   20.27  
   20.28 @@ -85,10 +83,12 @@
   20.29      // flags indicating whether the key is a token object, sensitive, extractable
   20.30      final boolean tokenObject, sensitive, extractable;
   20.31  
   20.32 +    // weak reference notification clean up for session keys
   20.33 +    private final SessionKeyRef sessionKeyRef;
   20.34 +
   20.35      P11Key(String type, Session session, long keyID, String algorithm,
   20.36              int keyLength, CK_ATTRIBUTE[] attributes) {
   20.37          this.type = type;
   20.38 -        this.session = session;
   20.39          this.token = session.token;
   20.40          this.keyID = keyID;
   20.41          this.algorithm = algorithm;
   20.42 @@ -111,7 +111,9 @@
   20.43          this.sensitive = sensitive;
   20.44          this.extractable = extractable;
   20.45          if (tokenObject == false) {
   20.46 -            session.addObject();
   20.47 +            sessionKeyRef = new SessionKeyRef(this, keyID, session);
   20.48 +        } else {
   20.49 +            sessionKeyRef = null;
   20.50          }
   20.51      }
   20.52  
   20.53 @@ -236,24 +238,6 @@
   20.54          }
   20.55      }
   20.56  
   20.57 -    protected void finalize() throws Throwable {
   20.58 -        if (tokenObject || (token.isValid() == false)) {
   20.59 -            super.finalize();
   20.60 -            return;
   20.61 -        }
   20.62 -        Session newSession = null;
   20.63 -        try {
   20.64 -            newSession = token.getOpSession();
   20.65 -            token.p11.C_DestroyObject(newSession.id(), keyID);
   20.66 -        } catch (PKCS11Exception e) {
   20.67 -            // ignore
   20.68 -        } finally {
   20.69 -            token.releaseSession(newSession);
   20.70 -            session.removeObject();
   20.71 -            super.finalize();
   20.72 -        }
   20.73 -    }
   20.74 -
   20.75      private final static CK_ATTRIBUTE[] A0 = new CK_ATTRIBUTE[0];
   20.76  
   20.77      private static CK_ATTRIBUTE[] getAttributes(Session session, long keyID,
   20.78 @@ -1055,5 +1039,65 @@
   20.79                  + "\n  parameters: " + params;
   20.80          }
   20.81      }
   20.82 +}
   20.83  
   20.84 +final class SessionKeyRef extends WeakReference<P11Key>
   20.85 +    implements Comparable<SessionKeyRef> {
   20.86 +    private static ReferenceQueue<P11Key> refQueue =
   20.87 +        new ReferenceQueue<P11Key>();
   20.88 +    private static Set<SessionKeyRef> refList =
   20.89 +        Collections.synchronizedSortedSet(new TreeSet<SessionKeyRef>());
   20.90 +
   20.91 +    static ReferenceQueue<P11Key> referenceQueue() {
   20.92 +        return refQueue;
   20.93 +    }
   20.94 +
   20.95 +    static final private int MAX_ITERATIONS = 2;
   20.96 +
   20.97 +    private static void drainRefQueueBounded() {
   20.98 +        int iterations = 0;
   20.99 +        while (iterations < MAX_ITERATIONS) {
  20.100 +            SessionKeyRef next = (SessionKeyRef) refQueue.poll();
  20.101 +            if (next != null) next.dispose();
  20.102 +            ++iterations;
  20.103 +        }
  20.104 +    }
  20.105 +
  20.106 +    // handle to the native key
  20.107 +    private long keyID;
  20.108 +    private Session session;
  20.109 +
  20.110 +    SessionKeyRef(P11Key key , long keyID, Session session) {
  20.111 +        super(key, refQueue);
  20.112 +        this.keyID = keyID;
  20.113 +        this.session = session;
  20.114 +        this.session.addObject();
  20.115 +        refList.add(this);
  20.116 +        // TBD: run at some interval and not every time?
  20.117 +        drainRefQueueBounded();
  20.118 +    }
  20.119 +
  20.120 +    void dispose() {
  20.121 +        refList.remove(this);
  20.122 +        if (session.token.isValid()) {
  20.123 +            Session newSession = null;
  20.124 +            try {
  20.125 +                newSession = session.token.getOpSession();
  20.126 +                session.token.p11.C_DestroyObject(newSession.id(), keyID);
  20.127 +            } catch (PKCS11Exception e) {
  20.128 +                // ignore
  20.129 +            } finally {
  20.130 +                session.token.releaseSession(newSession);
  20.131 +                session.removeObject();
  20.132 +            }
  20.133 +        }
  20.134 +    }
  20.135 +
  20.136 +    public int compareTo(SessionKeyRef other) {
  20.137 +        if (this.keyID == other.keyID) {
  20.138 +            return 0;
  20.139 +        } else {
  20.140 +            return (this.keyID < other.keyID) ? -1 : 1;
  20.141 +        }
  20.142 +    }
  20.143  }
    21.1 --- a/src/share/classes/sun/security/pkcs11/P11RSACipher.java	Tue Mar 17 13:44:08 2009 -0700
    21.2 +++ b/src/share/classes/sun/security/pkcs11/P11RSACipher.java	Tue Mar 17 13:45:01 2009 -0700
    21.3 @@ -1,5 +1,5 @@
    21.4  /*
    21.5 - * Copyright 2003-2008 Sun Microsystems, Inc.  All Rights Reserved.
    21.6 + * Copyright 2003-2009 Sun Microsystems, Inc.  All Rights Reserved.
    21.7   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    21.8   *
    21.9   * This code is free software; you can redistribute it and/or modify it
   21.10 @@ -191,7 +191,9 @@
   21.11                  throw new InvalidKeyException
   21.12                                  ("Unwrap has to be used with private keys");
   21.13              }
   21.14 -            encrypt = false;
   21.15 +            // No further setup needed for C_Unwrap(). We'll initialize later
   21.16 +            // if we can't use C_Unwrap().
   21.17 +            return;
   21.18          } else {
   21.19              throw new InvalidKeyException("Unsupported mode: " + opmode);
   21.20          }
   21.21 @@ -452,7 +454,7 @@
   21.22                  long keyID = token.p11.C_UnwrapKey(s.id(),
   21.23                          new CK_MECHANISM(mechanism), p11Key.keyID, wrappedKey,
   21.24                          attributes);
   21.25 -                return P11Key.secretKey(session, keyID, algorithm, 48 << 3,
   21.26 +                return P11Key.secretKey(s, keyID, algorithm, 48 << 3,
   21.27                          attributes);
   21.28              } catch (PKCS11Exception e) {
   21.29                  throw new InvalidKeyException("unwrap() failed", e);
   21.30 @@ -461,6 +463,7 @@
   21.31              }
   21.32          }
   21.33          // XXX implement unwrap using C_Unwrap() for all keys
   21.34 +        implInit(Cipher.DECRYPT_MODE, p11Key);
   21.35          if (wrappedKey.length > maxInputSize) {
   21.36              throw new InvalidKeyException("Key is too long for unwrapping");
   21.37          }
    22.1 --- a/src/share/classes/sun/security/pkcs11/P11SecretKeyFactory.java	Tue Mar 17 13:44:08 2009 -0700
    22.2 +++ b/src/share/classes/sun/security/pkcs11/P11SecretKeyFactory.java	Tue Mar 17 13:45:01 2009 -0700
    22.3 @@ -151,7 +151,7 @@
    22.4                          session = token.getObjSession();
    22.5                          long newKeyID = token.p11.C_CopyObject(session.id(),
    22.6                                  p11Key.keyID, extraAttrs);
    22.7 -                        p11Key = (P11Key) (P11Key.secretKey(p11Key.session,
    22.8 +                        p11Key = (P11Key) (P11Key.secretKey(session,
    22.9                                  newKeyID, p11Key.algorithm, p11Key.keyLength,
   22.10                                  extraAttrs));
   22.11                      } catch (PKCS11Exception p11e) {
    23.1 --- a/src/share/classes/sun/security/provider/SeedGenerator.java	Tue Mar 17 13:44:08 2009 -0700
    23.2 +++ b/src/share/classes/sun/security/provider/SeedGenerator.java	Tue Mar 17 13:45:01 2009 -0700
    23.3 @@ -1,5 +1,5 @@
    23.4  /*
    23.5 - * Copyright 1996-2006 Sun Microsystems, Inc.  All Rights Reserved.
    23.6 + * Copyright 1996-2009 Sun Microsystems, Inc.  All Rights Reserved.
    23.7   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    23.8   *
    23.9   * This code is free software; you can redistribute it and/or modify it
   23.10 @@ -68,6 +68,9 @@
   23.11  import java.util.Properties;
   23.12  import java.util.Enumeration;
   23.13  import java.net.*;
   23.14 +import java.nio.file.DirectoryStream;
   23.15 +import java.nio.file.Path;
   23.16 +import java.util.Random;
   23.17  import sun.security.util.Debug;
   23.18  
   23.19  abstract class SeedGenerator {
   23.20 @@ -180,10 +183,27 @@
   23.21  
   23.22                          // The temporary dir
   23.23                          File f = new File(p.getProperty("java.io.tmpdir"));
   23.24 -                        String[] sa = f.list();
   23.25 -                        for(int i = 0; i < sa.length; i++)
   23.26 -                            md.update(sa[i].getBytes());
   23.27 -
   23.28 +                        int count = 0;
   23.29 +                        DirectoryStream<Path> ds
   23.30 +                                = f.toPath().newDirectoryStream();
   23.31 +                        try {
   23.32 +                            // We use a Random object to choose what file names
   23.33 +                            // should be used. Otherwise on a machine with too
   23.34 +                            // many files, the same first 1024 files always get
   23.35 +                            // used. Any, We make sure the first 512 files are
   23.36 +                            // always used.
   23.37 +                            Random r = new Random();
   23.38 +                            for (Path path: ds) {
   23.39 +                                if (count < 512 || r.nextBoolean()) {
   23.40 +                                    md.update(path.getName().toString().getBytes());
   23.41 +                                }
   23.42 +                                if (count++ > 1024) {
   23.43 +                                    break;
   23.44 +                                }
   23.45 +                            }
   23.46 +                        } finally {
   23.47 +                            ds.close();
   23.48 +                        }
   23.49                      } catch (Exception ex) {
   23.50                          md.update((byte)ex.hashCode());
   23.51                      }
    24.1 --- a/src/share/classes/sun/security/tools/KeyTool.java	Tue Mar 17 13:44:08 2009 -0700
    24.2 +++ b/src/share/classes/sun/security/tools/KeyTool.java	Tue Mar 17 13:45:01 2009 -0700
    24.3 @@ -1910,7 +1910,9 @@
    24.4              ObjectIdentifier oid = attr.getAttributeId();
    24.5              if (oid.equals(PKCS9Attribute.EXTENSION_REQUEST_OID)) {
    24.6                  CertificateExtensions exts = (CertificateExtensions)attr.getAttributeValue();
    24.7 -                printExtensions(rb.getString("Extension Request:"), exts, out);
    24.8 +                if (exts != null) {
    24.9 +                    printExtensions(rb.getString("Extension Request:"), exts, out);
   24.10 +                }
   24.11              } else {
   24.12                  out.println(attr.getAttributeId());
   24.13                  out.println(attr.getAttributeValue());
   24.14 @@ -2495,7 +2497,9 @@
   24.15                                                             X509CertImpl.INFO);
   24.16              CertificateExtensions exts = (CertificateExtensions)
   24.17                      certInfo.get(X509CertInfo.EXTENSIONS);
   24.18 -            printExtensions(rb.getString("Extensions: "), exts, out);
   24.19 +            if (exts != null) {
   24.20 +                printExtensions(rb.getString("Extensions: "), exts, out);
   24.21 +            }
   24.22          }
   24.23      }
   24.24  
    25.1 --- a/src/share/lib/security/java.policy	Tue Mar 17 13:44:08 2009 -0700
    25.2 +++ b/src/share/lib/security/java.policy	Tue Mar 17 13:45:01 2009 -0700
    25.3 @@ -15,7 +15,8 @@
    25.4  	// It is strongly recommended that you either remove this permission
    25.5  	// from this policy file or further restrict it to code sources
    25.6  	// that you specify, because Thread.stop() is potentially unsafe.
    25.7 -	// See "http://java.sun.com/notes" for more information.
    25.8 +	// See the API specification of java.lang.Thread.stop() for more 
    25.9 +        // information.
   25.10  	permission java.lang.RuntimePermission "stopThread";
   25.11  
   25.12  	// allows anyone to listen on un-privileged ports
    26.1 --- a/src/share/native/sun/security/pkcs11/wrapper/p11_convert.c	Tue Mar 17 13:44:08 2009 -0700
    26.2 +++ b/src/share/native/sun/security/pkcs11/wrapper/p11_convert.c	Tue Mar 17 13:45:01 2009 -0700
    26.3 @@ -1,5 +1,5 @@
    26.4  /*
    26.5 - * Portions Copyright 2003-2005 Sun Microsystems, Inc.  All Rights Reserved.
    26.6 + * Portions Copyright 2003-2009 Sun Microsystems, Inc.  All Rights Reserved.
    26.7   */
    26.8  
    26.9  /* Copyright  (c) 2002 Graz University of Technology. All rights reserved.
   26.10 @@ -89,21 +89,24 @@
   26.11  
   26.12      /* load CK_DATE class */
   26.13      jDateClass = (*env)->FindClass(env, CLASS_DATE);
   26.14 -    assert(jDateClass != 0);
   26.15 +    if (jDateClass == NULL) { return NULL; }
   26.16  
   26.17      /* load CK_DATE constructor */
   26.18      jCtrId = (*env)->GetMethodID(env, jDateClass, "<init>", "([C[C[C)V");
   26.19 -    assert(jCtrId != 0);
   26.20 +    if (jCtrId == NULL) { return NULL; }
   26.21  
   26.22      /* prep all fields */
   26.23      jYear = ckCharArrayToJCharArray(env, (CK_CHAR_PTR)(ckpDate->year), 4);
   26.24 +    if (jYear == NULL) { return NULL; }
   26.25      jMonth = ckCharArrayToJCharArray(env, (CK_CHAR_PTR)(ckpDate->month), 2);
   26.26 +    if (jMonth == NULL) { return NULL; }
   26.27      jDay = ckCharArrayToJCharArray(env, (CK_CHAR_PTR)(ckpDate->day), 2);
   26.28 +    if (jDay == NULL) { return NULL; }
   26.29  
   26.30      /* create new CK_DATE object */
   26.31      jDateObject =
   26.32        (*env)->NewObject(env, jDateClass, jCtrId, jYear, jMonth, jDay);
   26.33 -    assert(jDateObject != 0);
   26.34 +    if (jDateObject == NULL) { return NULL; }
   26.35  
   26.36      /* free local references */
   26.37      (*env)->DeleteLocalRef(env, jDateClass);
   26.38 @@ -131,11 +134,11 @@
   26.39  
   26.40      /* load CK_VERSION class */
   26.41      jVersionClass = (*env)->FindClass(env, CLASS_VERSION);
   26.42 -    assert(jVersionClass != 0);
   26.43 +    if (jVersionClass == NULL) { return NULL; }
   26.44  
   26.45      /* load CK_VERSION constructor */
   26.46      jCtrId = (*env)->GetMethodID(env, jVersionClass, "<init>", "(II)V");
   26.47 -    assert(jCtrId != 0);
   26.48 +    if (jCtrId == NULL) { return NULL; }
   26.49  
   26.50      /* prep both fields */
   26.51      jMajor = ckpVersion->major;
   26.52 @@ -144,7 +147,7 @@
   26.53      /* create new CK_VERSION object */
   26.54      jVersionObject =
   26.55        (*env)->NewObject(env, jVersionClass, jCtrId, jMajor, jMinor);
   26.56 -    assert(jVersionObject != 0);
   26.57 +    if (jVersionObject == NULL) { return NULL; }
   26.58  
   26.59      /* free local references */
   26.60      (*env)->DeleteLocalRef(env, jVersionClass);
   26.61 @@ -171,11 +174,11 @@
   26.62  
   26.63      /* load CK_SESSION_INFO class */
   26.64      jSessionInfoClass = (*env)->FindClass(env, CLASS_SESSION_INFO);
   26.65 -    assert(jSessionInfoClass != 0);
   26.66 +    if (jSessionInfoClass == NULL) { return NULL; }
   26.67  
   26.68      /* load CK_SESSION_INFO constructor */
   26.69      jCtrId = (*env)->GetMethodID(env, jSessionInfoClass, "<init>", "(JJJJ)V");
   26.70 -    assert(jCtrId != 0);
   26.71 +    if (jCtrId == NULL) { return NULL; }
   26.72  
   26.73      /* prep all fields */
   26.74      jSlotID = ckULongToJLong(ckpSessionInfo->slotID);
   26.75 @@ -187,7 +190,7 @@
   26.76      jSessionInfoObject =
   26.77        (*env)->NewObject(env, jSessionInfoClass, jCtrId, jSlotID, jState,
   26.78                          jFlags, jDeviceError);
   26.79 -    assert(jSessionInfoObject != 0);
   26.80 +    if (jSessionInfoObject == NULL) { return NULL; }
   26.81  
   26.82      /* free local references */
   26.83      (*env)->DeleteLocalRef(env, jSessionInfoClass);
   26.84 @@ -211,20 +214,21 @@
   26.85      jobject jPValue = NULL;
   26.86  
   26.87      jAttributeClass = (*env)->FindClass(env, CLASS_ATTRIBUTE);
   26.88 -    assert(jAttributeClass != 0);
   26.89 +    if (jAttributeClass == NULL) { return NULL; }
   26.90  
   26.91      /* load CK_INFO constructor */
   26.92      jCtrId = (*env)->GetMethodID(env, jAttributeClass, "<init>", "(JLjava/lang/Object;)V");
   26.93 -    assert(jCtrId != 0);
   26.94 +    if (jCtrId == NULL) { return NULL; }
   26.95  
   26.96      /* prep both fields */
   26.97      jType = ckULongToJLong(ckpAttribute->type);
   26.98      jPValue = ckAttributeValueToJObject(env, ckpAttribute);
   26.99 +    if ((*env)->ExceptionCheck(env)) { return NULL; }
  26.100  
  26.101      /* create new CK_ATTRIBUTE object */
  26.102      jAttributeObject =
  26.103        (*env)->NewObject(env, jAttributeClass, jCtrId, jType, jPValue);
  26.104 -    assert(jAttributeObject != 0);
  26.105 +    if (jAttributeObject == NULL) { return NULL; }
  26.106  
  26.107      /* free local references */
  26.108      (*env)->DeleteLocalRef(env, jAttributeClass);
  26.109 @@ -252,23 +256,27 @@
  26.110          return NULL;
  26.111      }
  26.112  
  26.113 -    /* allocate memory for CK_VERSION pointer */
  26.114 -    ckpVersion = (CK_VERSION_PTR) malloc(sizeof(CK_VERSION));
  26.115 -
  26.116      /* get CK_VERSION class */
  26.117      jVersionClass = (*env)->GetObjectClass(env, jVersion);
  26.118 -    assert(jVersionClass != 0);
  26.119 +    if (jVersionClass == NULL) { return NULL; }
  26.120  
  26.121      /* get Major */
  26.122      jFieldID = (*env)->GetFieldID(env, jVersionClass, "major", "B");
  26.123 -    assert(jFieldID != 0);
  26.124 +    if (jFieldID == NULL) { return NULL; }
  26.125      jMajor = (*env)->GetByteField(env, jVersion, jFieldID);
  26.126 -    ckpVersion->major = jByteToCKByte(jMajor);
  26.127  
  26.128      /* get Minor */
  26.129      jFieldID = (*env)->GetFieldID(env, jVersionClass, "minor", "B");
  26.130 -    assert(jFieldID != 0);
  26.131 +    if (jFieldID == NULL) { return NULL; }
  26.132      jMinor = (*env)->GetByteField(env, jVersion, jFieldID);
  26.133 +
  26.134 +    /* allocate memory for CK_VERSION pointer */
  26.135 +    ckpVersion = (CK_VERSION_PTR) malloc(sizeof(CK_VERSION));
  26.136 +    if (ckpVersion == NULL) {
  26.137 +        JNU_ThrowOutOfMemoryError(env, 0);
  26.138 +        return NULL;
  26.139 +    }
  26.140 +    ckpVersion->major = jByteToCKByte(jMajor);
  26.141      ckpVersion->minor = jByteToCKByte(jMinor);
  26.142  
  26.143      return ckpVersion ;
  26.144 @@ -292,18 +300,36 @@
  26.145      jchar *jTempChars;
  26.146      CK_ULONG i;
  26.147  
  26.148 -    /* allocate memory for CK_DATE pointer */
  26.149 -    ckpDate = (CK_DATE *) malloc(sizeof(CK_DATE));
  26.150 +    if (jDate == NULL) {
  26.151 +        return NULL;
  26.152 +    }
  26.153  
  26.154      /* get CK_DATE class */
  26.155      jDateClass = (*env)->FindClass(env, CLASS_DATE);
  26.156 -    assert(jDateClass != 0);
  26.157 +    if (jDateClass == NULL) { return NULL; }
  26.158  
  26.159      /* get Year */
  26.160      jFieldID = (*env)->GetFieldID(env, jDateClass, "year", "[C");
  26.161 -    assert(jFieldID != 0);
  26.162 +    if (jFieldID == NULL) { return NULL; }
  26.163      jYear = (*env)->GetObjectField(env, jDate, jFieldID);
  26.164  
  26.165 +    /* get Month */
  26.166 +    jFieldID = (*env)->GetFieldID(env, jDateClass, "month", "[C");
  26.167 +    if (jFieldID == NULL) { return NULL; }
  26.168 +    jMonth = (*env)->GetObjectField(env, jDate, jFieldID);
  26.169 +
  26.170 +    /* get Day */
  26.171 +    jFieldID = (*env)->GetFieldID(env, jDateClass, "day", "[C");
  26.172 +    if (jFieldID == NULL) { return NULL; }
  26.173 +    jDay = (*env)->GetObjectField(env, jDate, jFieldID);
  26.174 +
  26.175 +    /* allocate memory for CK_DATE pointer */
  26.176 +    ckpDate = (CK_DATE *) malloc(sizeof(CK_DATE));
  26.177 +    if (ckpDate == NULL) {
  26.178 +        JNU_ThrowOutOfMemoryError(env, 0);
  26.179 +        return NULL;
  26.180 +    }
  26.181 +
  26.182      if (jYear == NULL) {
  26.183          ckpDate->year[0] = 0;
  26.184          ckpDate->year[1] = 0;
  26.185 @@ -312,43 +338,66 @@
  26.186      } else {
  26.187          ckLength = (*env)->GetArrayLength(env, jYear);
  26.188          jTempChars = (jchar*) malloc((ckLength) * sizeof(jchar));
  26.189 +        if (jTempChars == NULL) {
  26.190 +            free(ckpDate);
  26.191 +            JNU_ThrowOutOfMemoryError(env, 0);
  26.192 +            return NULL;
  26.193 +        }
  26.194          (*env)->GetCharArrayRegion(env, jYear, 0, ckLength, jTempChars);
  26.195 +        if ((*env)->ExceptionCheck(env)) {
  26.196 +            free(ckpDate);
  26.197 +            free(jTempChars);
  26.198 +            return NULL;
  26.199 +        }
  26.200 +
  26.201          for (i = 0; (i < ckLength) && (i < 4) ; i++) {
  26.202              ckpDate->year[i] = jCharToCKChar(jTempChars[i]);
  26.203          }
  26.204          free(jTempChars);
  26.205      }
  26.206  
  26.207 -    /* get Month */
  26.208 -    jFieldID = (*env)->GetFieldID(env, jDateClass, "month", "[C");
  26.209 -    assert(jFieldID != 0);
  26.210 -    jMonth = (*env)->GetObjectField(env, jDate, jFieldID);
  26.211 -
  26.212      if (jMonth == NULL) {
  26.213          ckpDate->month[0] = 0;
  26.214          ckpDate->month[1] = 0;
  26.215      } else {
  26.216          ckLength = (*env)->GetArrayLength(env, jMonth);
  26.217          jTempChars = (jchar*) malloc((ckLength) * sizeof(jchar));
  26.218 +        if (jTempChars == NULL) {
  26.219 +            free(ckpDate);
  26.220 +            JNU_ThrowOutOfMemoryError(env, 0);
  26.221 +            return NULL;
  26.222 +        }
  26.223          (*env)->GetCharArrayRegion(env, jMonth, 0, ckLength, jTempChars);
  26.224 +        if ((*env)->ExceptionCheck(env)) {
  26.225 +            free(ckpDate);
  26.226 +            free(jTempChars);
  26.227 +            return NULL;
  26.228 +        }
  26.229 +
  26.230          for (i = 0; (i < ckLength) && (i < 4) ; i++) {
  26.231              ckpDate->month[i] = jCharToCKChar(jTempChars[i]);
  26.232          }
  26.233          free(jTempChars);
  26.234      }
  26.235  
  26.236 -    /* get Day */
  26.237 -    jFieldID = (*env)->GetFieldID(env, jDateClass, "day", "[C");
  26.238 -    assert(jFieldID != 0);
  26.239 -    jDay = (*env)->GetObjectField(env, jDate, jFieldID);
  26.240 -
  26.241      if (jDay == NULL) {
  26.242          ckpDate->day[0] = 0;
  26.243          ckpDate->day[1] = 0;
  26.244      } else {
  26.245          ckLength = (*env)->GetArrayLength(env, jDay);
  26.246          jTempChars = (jchar*) malloc((ckLength) * sizeof(jchar));
  26.247 +        if (jTempChars == NULL) {
  26.248 +            free(ckpDate);
  26.249 +            JNU_ThrowOutOfMemoryError(env, 0);
  26.250 +            return NULL;
  26.251 +        }
  26.252          (*env)->GetCharArrayRegion(env, jDay, 0, ckLength, jTempChars);
  26.253 +        if ((*env)->ExceptionCheck(env)) {
  26.254 +            free(ckpDate);
  26.255 +            free(jTempChars);
  26.256 +            return NULL;
  26.257 +        }
  26.258 +
  26.259          for (i = 0; (i < ckLength) && (i < 4) ; i++) {
  26.260              ckpDate->day[i] = jCharToCKChar(jTempChars[i]);
  26.261          }
  26.262 @@ -374,23 +423,25 @@
  26.263      jlong jType;
  26.264      jobject jPValue;
  26.265  
  26.266 +    // TBD: what if jAttribute == NULL?!
  26.267 +
  26.268      TRACE0("\nDEBUG: jAttributeToCKAttribute");
  26.269      /* get CK_ATTRIBUTE class */
  26.270      TRACE0(", getting attribute object class");
  26.271      jAttributeClass = (*env)->GetObjectClass(env, jAttribute);
  26.272 -    assert(jAttributeClass != 0);
  26.273 +    if (jAttributeClass == NULL) { return ckAttribute; }
  26.274  
  26.275      /* get type */
  26.276      TRACE0(", getting type field");
  26.277      jFieldID = (*env)->GetFieldID(env, jAttributeClass, "type", "J");
  26.278 -    assert(jFieldID != 0);
  26.279 +    if (jFieldID == NULL) { return ckAttribute; }
  26.280      jType = (*env)->GetLongField(env, jAttribute, jFieldID);
  26.281      TRACE1(", type=0x%X", jType);
  26.282  
  26.283      /* get pValue */
  26.284      TRACE0(", getting pValue field");
  26.285      jFieldID = (*env)->GetFieldID(env, jAttributeClass, "pValue", "Ljava/lang/Object;");
  26.286 -    assert(jFieldID != 0);
  26.287 +    if (jFieldID == NULL) { return ckAttribute; }
  26.288      jPValue = (*env)->GetObjectField(env, jAttribute, jFieldID);
  26.289      TRACE1(", pValue=%p", jPValue);
  26.290  
  26.291 @@ -417,36 +468,50 @@
  26.292  {
  26.293      // XXX don't return structs
  26.294      // XXX prefetch class and field ids
  26.295 -    jclass jSsl3MasterKeyDeriveParamsClass = (*env)->FindClass(env, CLASS_SSL3_MASTER_KEY_DERIVE_PARAMS);
  26.296 +    jclass jSsl3MasterKeyDeriveParamsClass;
  26.297      CK_SSL3_MASTER_KEY_DERIVE_PARAMS ckParam;
  26.298      jfieldID fieldID;
  26.299 -    jobject jObject;
  26.300      jclass jSsl3RandomDataClass;
  26.301 -    jobject jRandomInfo;
  26.302 +    jobject jRandomInfo, jRIClientRandom, jRIServerRandom, jVersion;
  26.303  
  26.304      /* get RandomInfo */
  26.305 -    jSsl3RandomDataClass = (*env)->FindClass(env, CLASS_SSL3_RANDOM_DATA);
  26.306 +    jSsl3MasterKeyDeriveParamsClass = (*env)->FindClass(env, CLASS_SSL3_MASTER_KEY_DERIVE_PARAMS);
  26.307 +    if (jSsl3MasterKeyDeriveParamsClass == NULL) { return ckParam; }
  26.308      fieldID = (*env)->GetFieldID(env, jSsl3MasterKeyDeriveParamsClass, "RandomInfo", "Lsun/security/pkcs11/wrapper/CK_SSL3_RANDOM_DATA;");
  26.309 -    assert(fieldID != 0);
  26.310 +    if (fieldID == NULL) { return ckParam; }
  26.311      jRandomInfo = (*env)->GetObjectField(env, jParam, fieldID);
  26.312  
  26.313      /* get pClientRandom and ulClientRandomLength out of RandomInfo */
  26.314 +    jSsl3RandomDataClass = (*env)->FindClass(env, CLASS_SSL3_RANDOM_DATA);
  26.315 +    if (jSsl3RandomDataClass == NULL) { return ckParam; }
  26.316      fieldID = (*env)->GetFieldID(env, jSsl3RandomDataClass, "pClientRandom", "[B");
  26.317 -    assert(fieldID != 0);
  26.318 -    jObject = (*env)->GetObjectField(env, jRandomInfo, fieldID);
  26.319 -    jByteArrayToCKByteArray(env, jObject, &(ckParam.RandomInfo.pClientRandom), &(ckParam.RandomInfo.ulClientRandomLen));
  26.320 +    if (fieldID == NULL) { return ckParam; }
  26.321 +    jRIClientRandom = (*env)->GetObjectField(env, jRandomInfo, fieldID);
  26.322  
  26.323      /* get pServerRandom and ulServerRandomLength out of RandomInfo */
  26.324      fieldID = (*env)->GetFieldID(env, jSsl3RandomDataClass, "pServerRandom", "[B");
  26.325 -    assert(fieldID != 0);
  26.326 -    jObject = (*env)->GetObjectField(env, jRandomInfo, fieldID);
  26.327 -    jByteArrayToCKByteArray(env, jObject, &(ckParam.RandomInfo.pServerRandom), &(ckParam.RandomInfo.ulServerRandomLen));
  26.328 +    if (fieldID == NULL) { return ckParam; }
  26.329 +    jRIServerRandom = (*env)->GetObjectField(env, jRandomInfo, fieldID);
  26.330  
  26.331      /* get pVersion */
  26.332      fieldID = (*env)->GetFieldID(env, jSsl3MasterKeyDeriveParamsClass, "pVersion",  "Lsun/security/pkcs11/wrapper/CK_VERSION;");
  26.333 -    assert(fieldID != 0);
  26.334 -    jObject = (*env)->GetObjectField(env, jParam, fieldID);
  26.335 -    ckParam.pVersion = jVersionToCKVersionPtr(env, jObject);
  26.336 +    if (fieldID == NULL) { return ckParam; }
  26.337 +    jVersion = (*env)->GetObjectField(env, jParam, fieldID);
  26.338 +
  26.339 +    /* populate java values */
  26.340 +    ckParam.pVersion = jVersionToCKVersionPtr(env, jVersion);
  26.341 +    if ((*env)->ExceptionCheck(env)) { return ckParam; }
  26.342 +    jByteArrayToCKByteArray(env, jRIClientRandom, &(ckParam.RandomInfo.pClientRandom), &(ckParam.RandomInfo.ulClientRandomLen));
  26.343 +    if ((*env)->ExceptionCheck(env)) {
  26.344 +        free(ckParam.pVersion);
  26.345 +        return ckParam;
  26.346 +    }
  26.347 +    jByteArrayToCKByteArray(env, jRIServerRandom, &(ckParam.RandomInfo.pServerRandom), &(ckParam.RandomInfo.ulServerRandomLen));
  26.348 +    if ((*env)->ExceptionCheck(env)) {
  26.349 +        free(ckParam.pVersion);
  26.350 +        free(ckParam.RandomInfo.pClientRandom);
  26.351 +        return ckParam;
  26.352 +    }
  26.353  
  26.354      return ckParam ;
  26.355  }
  26.356 @@ -457,27 +522,52 @@
  26.357   */
  26.358  CK_TLS_PRF_PARAMS jTlsPrfParamsToCKTlsPrfParam(JNIEnv *env, jobject jParam)
  26.359  {
  26.360 -    jclass jTlsPrfParamsClass = (*env)->FindClass(env, CLASS_TLS_PRF_PARAMS);
  26.361 +    jclass jTlsPrfParamsClass;
  26.362      CK_TLS_PRF_PARAMS ckParam;
  26.363      jfieldID fieldID;
  26.364 -    jobject jObject;
  26.365 +    jobject jSeed, jLabel, jOutput;
  26.366  
  26.367 +    // TBD: what if jParam == NULL?!
  26.368 +
  26.369 +    /* get pSeed */
  26.370 +    jTlsPrfParamsClass = (*env)->FindClass(env, CLASS_TLS_PRF_PARAMS);
  26.371 +    if (jTlsPrfParamsClass == NULL) { return ckParam; }
  26.372      fieldID = (*env)->GetFieldID(env, jTlsPrfParamsClass, "pSeed", "[B");
  26.373 -    assert(fieldID != 0);
  26.374 -    jObject = (*env)->GetObjectField(env, jParam, fieldID);
  26.375 -    jByteArrayToCKByteArray(env, jObject, &(ckParam.pSeed), &(ckParam.ulSeedLen));
  26.376 +    if (fieldID == NULL) { return ckParam; }
  26.377 +    jSeed = (*env)->GetObjectField(env, jParam, fieldID);
  26.378  
  26.379 +    /* get pLabel */
  26.380      fieldID = (*env)->GetFieldID(env, jTlsPrfParamsClass, "pLabel", "[B");
  26.381 -    assert(fieldID != 0);
  26.382 -    jObject = (*env)->GetObjectField(env, jParam, fieldID);
  26.383 -    jByteArrayToCKByteArray(env, jObject, &(ckParam.pLabel), &(ckParam.ulLabelLen));
  26.384 +    if (fieldID == NULL) { return ckParam; }
  26.385 +    jLabel = (*env)->GetObjectField(env, jParam, fieldID);
  26.386  
  26.387 +    /* get pOutput */
  26.388 +    fieldID = (*env)->GetFieldID(env, jTlsPrfParamsClass, "pOutput", "[B");
  26.389 +    if (fieldID == NULL) { return ckParam; }
  26.390 +    jOutput = (*env)->GetObjectField(env, jParam, fieldID);
  26.391 +
  26.392 +    /* populate java values */
  26.393 +    jByteArrayToCKByteArray(env, jSeed, &(ckParam.pSeed), &(ckParam.ulSeedLen));
  26.394 +    if ((*env)->ExceptionCheck(env)) { return ckParam; }
  26.395 +    jByteArrayToCKByteArray(env, jLabel, &(ckParam.pLabel), &(ckParam.ulLabelLen));
  26.396 +    if ((*env)->ExceptionCheck(env)) {
  26.397 +        free(ckParam.pSeed);
  26.398 +        return ckParam;
  26.399 +    }
  26.400      ckParam.pulOutputLen = malloc(sizeof(CK_ULONG));
  26.401 -
  26.402 -    fieldID = (*env)->GetFieldID(env, jTlsPrfParamsClass, "pOutput", "[B");
  26.403 -    assert(fieldID != 0);
  26.404 -    jObject = (*env)->GetObjectField(env, jParam, fieldID);
  26.405 -    jByteArrayToCKByteArray(env, jObject, &(ckParam.pOutput), ckParam.pulOutputLen);
  26.406 +    if (ckParam.pulOutputLen == NULL) {
  26.407 +        free(ckParam.pSeed);
  26.408 +        free(ckParam.pLabel);
  26.409 +        JNU_ThrowOutOfMemoryError(env, 0);
  26.410 +        return ckParam;
  26.411 +    }
  26.412 +    jByteArrayToCKByteArray(env, jOutput, &(ckParam.pOutput), ckParam.pulOutputLen);
  26.413 +    if ((*env)->ExceptionCheck(env)) {
  26.414 +        free(ckParam.pSeed);
  26.415 +        free(ckParam.pLabel);
  26.416 +        free(ckParam.pulOutputLen);
  26.417 +        return ckParam;
  26.418 +    }
  26.419  
  26.420      return ckParam ;
  26.421  }
  26.422 @@ -493,68 +583,91 @@
  26.423  {
  26.424      // XXX don't return structs
  26.425      // XXX prefetch class and field ids
  26.426 -    jclass jSsl3KeyMatParamsClass = (*env)->FindClass(env, CLASS_SSL3_KEY_MAT_PARAMS);
  26.427 +    jclass jSsl3KeyMatParamsClass, jSsl3RandomDataClass, jSsl3KeyMatOutClass;
  26.428      CK_SSL3_KEY_MAT_PARAMS ckParam;
  26.429      jfieldID fieldID;
  26.430 -    jlong jLong;
  26.431 -    jboolean jBoolean;
  26.432 -    jobject jObject;
  26.433 -    jobject jRandomInfo;
  26.434 -    jobject jReturnedKeyMaterial;
  26.435 -    jclass jSsl3RandomDataClass;
  26.436 -    jclass jSsl3KeyMatOutClass;
  26.437 +    jlong jMacSizeInBits, jKeySizeInBits, jIVSizeInBits;
  26.438 +    jboolean jIsExport;
  26.439 +    jobject jRandomInfo, jRIClientRandom, jRIServerRandom;
  26.440 +    jobject jReturnedKeyMaterial, jRMIvClient, jRMIvServer;
  26.441      CK_ULONG ckTemp;
  26.442  
  26.443      /* get ulMacSizeInBits */
  26.444 +    jSsl3KeyMatParamsClass = (*env)->FindClass(env, CLASS_SSL3_KEY_MAT_PARAMS);
  26.445 +    if (jSsl3KeyMatParamsClass == NULL) { return ckParam; }
  26.446      fieldID = (*env)->GetFieldID(env, jSsl3KeyMatParamsClass, "ulMacSizeInBits", "J");
  26.447 -    assert(fieldID != 0);
  26.448 -    jLong = (*env)->GetLongField(env, jParam, fieldID);
  26.449 -    ckParam.ulMacSizeInBits = jLongToCKULong(jLong);
  26.450 +    if (fieldID == NULL) { return ckParam; }
  26.451 +    jMacSizeInBits = (*env)->GetLongField(env, jParam, fieldID);
  26.452  
  26.453      /* get ulKeySizeInBits */
  26.454      fieldID = (*env)->GetFieldID(env, jSsl3KeyMatParamsClass, "ulKeySizeInBits", "J");
  26.455 -    assert(fieldID != 0);
  26.456 -    jLong = (*env)->GetLongField(env, jParam, fieldID);
  26.457 -    ckParam.ulKeySizeInBits = jLongToCKULong(jLong);
  26.458 +    if (fieldID == NULL) { return ckParam; }
  26.459 +    jKeySizeInBits = (*env)->GetLongField(env, jParam, fieldID);
  26.460  
  26.461      /* get ulIVSizeInBits */
  26.462      fieldID = (*env)->GetFieldID(env, jSsl3KeyMatParamsClass, "ulIVSizeInBits", "J");
  26.463 -    assert(fieldID != 0);
  26.464 -    jLong = (*env)->GetLongField(env, jParam, fieldID);
  26.465 -    ckParam.ulIVSizeInBits = jLongToCKULong(jLong);
  26.466 +    if (fieldID == NULL) { return ckParam; }
  26.467 +    jIVSizeInBits = (*env)->GetLongField(env, jParam, fieldID);
  26.468  
  26.469      /* get bIsExport */
  26.470      fieldID = (*env)->GetFieldID(env, jSsl3KeyMatParamsClass, "bIsExport", "Z");
  26.471 -    assert(fieldID != 0);
  26.472 -    jBoolean = (*env)->GetBooleanField(env, jParam, fieldID);
  26.473 -    ckParam.bIsExport = jBooleanToCKBBool(jBoolean);
  26.474 +    if (fieldID == NULL) { return ckParam; }
  26.475 +    jIsExport = (*env)->GetBooleanField(env, jParam, fieldID);
  26.476  
  26.477      /* get RandomInfo */
  26.478      jSsl3RandomDataClass = (*env)->FindClass(env, CLASS_SSL3_RANDOM_DATA);
  26.479 +    if (jSsl3RandomDataClass == NULL) { return ckParam; }
  26.480      fieldID = (*env)->GetFieldID(env, jSsl3KeyMatParamsClass, "RandomInfo",  "Lsun/security/pkcs11/wrapper/CK_SSL3_RANDOM_DATA;");
  26.481 -    assert(fieldID != 0);
  26.482 +    if (fieldID == NULL) { return ckParam; }
  26.483      jRandomInfo = (*env)->GetObjectField(env, jParam, fieldID);
  26.484  
  26.485      /* get pClientRandom and ulClientRandomLength out of RandomInfo */
  26.486      fieldID = (*env)->GetFieldID(env, jSsl3RandomDataClass, "pClientRandom", "[B");
  26.487 -    assert(fieldID != 0);
  26.488 -    jObject = (*env)->GetObjectField(env, jRandomInfo, fieldID);
  26.489 -    jByteArrayToCKByteArray(env, jObject, &(ckParam.RandomInfo.pClientRandom), &(ckParam.RandomInfo.ulClientRandomLen));
  26.490 +    if (fieldID == NULL) { return ckParam; }
  26.491 +    jRIClientRandom = (*env)->GetObjectField(env, jRandomInfo, fieldID);
  26.492  
  26.493      /* get pServerRandom and ulServerRandomLength out of RandomInfo */
  26.494      fieldID = (*env)->GetFieldID(env, jSsl3RandomDataClass, "pServerRandom", "[B");
  26.495 -    assert(fieldID != 0);
  26.496 -    jObject = (*env)->GetObjectField(env, jRandomInfo, fieldID);
  26.497 -    jByteArrayToCKByteArray(env, jObject, &(ckParam.RandomInfo.pServerRandom), &(ckParam.RandomInfo.ulServerRandomLen));
  26.498 +    if (fieldID == NULL) { return ckParam; }
  26.499 +    jRIServerRandom = (*env)->GetObjectField(env, jRandomInfo, fieldID);
  26.500  
  26.501      /* get pReturnedKeyMaterial */
  26.502      jSsl3KeyMatOutClass = (*env)->FindClass(env, CLASS_SSL3_KEY_MAT_OUT);
  26.503 +    if (jSsl3KeyMatOutClass == NULL) { return ckParam; }
  26.504      fieldID = (*env)->GetFieldID(env, jSsl3KeyMatParamsClass, "pReturnedKeyMaterial",  "Lsun/security/pkcs11/wrapper/CK_SSL3_KEY_MAT_OUT;");
  26.505 -    assert(fieldID != 0);
  26.506 +    if (fieldID == NULL) { return ckParam; }
  26.507      jReturnedKeyMaterial = (*env)->GetObjectField(env, jParam, fieldID);
  26.508  
  26.509 +    /* get pIVClient out of pReturnedKeyMaterial */
  26.510 +    fieldID = (*env)->GetFieldID(env, jSsl3KeyMatOutClass, "pIVClient", "[B");
  26.511 +    if (fieldID == NULL) { return ckParam; }
  26.512 +    jRMIvClient = (*env)->GetObjectField(env, jReturnedKeyMaterial, fieldID);
  26.513 +
  26.514 +    /* get pIVServer out of pReturnedKeyMaterial */
  26.515 +    fieldID = (*env)->GetFieldID(env, jSsl3KeyMatOutClass, "pIVServer", "[B");
  26.516 +    if (fieldID == NULL) { return ckParam; }
  26.517 +    jRMIvServer = (*env)->GetObjectField(env, jReturnedKeyMaterial, fieldID);
  26.518 +
  26.519 +    /* populate java values */
  26.520 +    ckParam.ulMacSizeInBits = jLongToCKULong(jMacSizeInBits);
  26.521 +    ckParam.ulKeySizeInBits = jLongToCKULong(jKeySizeInBits);
  26.522 +    ckParam.ulIVSizeInBits = jLongToCKULong(jIVSizeInBits);
  26.523 +    ckParam.bIsExport = jBooleanToCKBBool(jIsExport);
  26.524 +    jByteArrayToCKByteArray(env, jRIClientRandom, &(ckParam.RandomInfo.pClientRandom), &(ckParam.RandomInfo.ulClientRandomLen));
  26.525 +    if ((*env)->ExceptionCheck(env)) { return ckParam; }
  26.526 +    jByteArrayToCKByteArray(env, jRIServerRandom, &(ckParam.RandomInfo.pServerRandom), &(ckParam.RandomInfo.ulServerRandomLen));
  26.527 +    if ((*env)->ExceptionCheck(env)) {
  26.528 +        free(ckParam.RandomInfo.pClientRandom);
  26.529 +        return ckParam;
  26.530 +    }
  26.531      /* allocate memory for pRetrunedKeyMaterial */
  26.532      ckParam.pReturnedKeyMaterial = (CK_SSL3_KEY_MAT_OUT_PTR) malloc(sizeof(CK_SSL3_KEY_MAT_OUT));
  26.533 +    if (ckParam.pReturnedKeyMaterial == NULL) {
  26.534 +        free(ckParam.RandomInfo.pClientRandom);
  26.535 +        free(ckParam.RandomInfo.pServerRandom);
  26.536 +        JNU_ThrowOutOfMemoryError(env, 0);
  26.537 +        return ckParam;
  26.538 +    }
  26.539  
  26.540      // the handles are output params only, no need to fetch them from Java
  26.541      ckParam.pReturnedKeyMaterial->hClientMacSecret = 0;
  26.542 @@ -562,17 +675,21 @@
  26.543      ckParam.pReturnedKeyMaterial->hClientKey = 0;
  26.544      ckParam.pReturnedKeyMaterial->hServerKey = 0;
  26.545  
  26.546 -    /* get pIVClient out of pReturnedKeyMaterial */
  26.547 -    fieldID = (*env)->GetFieldID(env, jSsl3KeyMatOutClass, "pIVClient", "[B");
  26.548 -    assert(fieldID != 0);
  26.549 -    jObject = (*env)->GetObjectField(env, jReturnedKeyMaterial, fieldID);
  26.550 -    jByteArrayToCKByteArray(env, jObject, &(ckParam.pReturnedKeyMaterial->pIVClient), &ckTemp);
  26.551 -
  26.552 -    /* get pIVServer out of pReturnedKeyMaterial */
  26.553 -    fieldID = (*env)->GetFieldID(env, jSsl3KeyMatOutClass, "pIVServer", "[B");
  26.554 -    assert(fieldID != 0);
  26.555 -    jObject = (*env)->GetObjectField(env, jReturnedKeyMaterial, fieldID);
  26.556 -    jByteArrayToCKByteArray(env, jObject, &(ckParam.pReturnedKeyMaterial->pIVServer), &ckTemp);
  26.557 +    jByteArrayToCKByteArray(env, jRMIvClient, &(ckParam.pReturnedKeyMaterial->pIVClient), &ckTemp);
  26.558 +    if ((*env)->ExceptionCheck(env)) {
  26.559 +        free(ckParam.RandomInfo.pClientRandom);
  26.560 +        free(ckParam.RandomInfo.pServerRandom);
  26.561 +        free(ckParam.pReturnedKeyMaterial);
  26.562 +        return ckParam;
  26.563 +    }
  26.564 +    jByteArrayToCKByteArray(env, jRMIvServer, &(ckParam.pReturnedKeyMaterial->pIVServer), &ckTemp);
  26.565 +    if ((*env)->ExceptionCheck(env)) {
  26.566 +        free(ckParam.RandomInfo.pClientRandom);
  26.567 +        free(ckParam.RandomInfo.pServerRandom);
  26.568 +        free(ckParam.pReturnedKeyMaterial);
  26.569 +        free(ckParam.pReturnedKeyMaterial->pIVClient);
  26.570 +        return ckParam;
  26.571 +    }
  26.572  
  26.573      return ckParam ;
  26.574  }
  26.575 @@ -811,7 +928,7 @@
  26.576          *ckpParamPtr = jLongObjectToCKULongPtr(env, jParam);
  26.577          *ckpLength = sizeof(CK_ULONG);
  26.578      } else {
  26.579 -        /* printf("slow path jMechanismParameterToCKMechanismParameter\n"); */
  26.580 +        TRACE0("\nSLOW PATH jMechanismParameterToCKMechanismParameter\n");
  26.581          jMechanismParameterToCKMechanismParameterSlow(env, jParam, ckpParamPtr, ckpLength);
  26.582      }
  26.583  }
  26.584 @@ -819,40 +936,24 @@
  26.585  void jMechanismParameterToCKMechanismParameterSlow(JNIEnv *env, jobject jParam, CK_VOID_PTR *ckpParamPtr, CK_ULONG *ckpLength)
  26.586  {
  26.587      /* get all Java mechanism parameter classes */
  26.588 -    jclass jVersionClass    = (*env)->FindClass(env, CLASS_VERSION);
  26.589 -    jclass jRsaPkcsOaepParamsClass = (*env)->FindClass(env, CLASS_RSA_PKCS_OAEP_PARAMS);
  26.590 -    jclass jPbeParamsClass = (*env)->FindClass(env, CLASS_PBE_PARAMS);
  26.591 -    jclass jPkcs5Pbkd2ParamsClass = (*env)->FindClass(env, CLASS_PKCS5_PBKD2_PARAMS);
  26.592 +    jclass jVersionClass, jSsl3MasterKeyDeriveParamsClass, jSsl3KeyMatParamsClass;
  26.593 +    jclass jTlsPrfParamsClass, jRsaPkcsOaepParamsClass, jPbeParamsClass;
  26.594 +    jclass jPkcs5Pbkd2ParamsClass, jRsaPkcsPssParamsClass;
  26.595 +    jclass jEcdh1DeriveParamsClass, jEcdh2DeriveParamsClass;
  26.596 +    jclass jX942Dh1DeriveParamsClass, jX942Dh2DeriveParamsClass;
  26.597  
  26.598 -    jclass jRsaPkcsPssParamsClass = (*env)->FindClass(env, CLASS_RSA_PKCS_PSS_PARAMS);
  26.599 -    jclass jEcdh1DeriveParamsClass = (*env)->FindClass(env, CLASS_ECDH1_DERIVE_PARAMS);
  26.600 -    jclass jEcdh2DeriveParamsClass = (*env)->FindClass(env, CLASS_ECDH2_DERIVE_PARAMS);
  26.601 -    jclass jX942Dh1DeriveParamsClass = (*env)->FindClass(env, CLASS_X9_42_DH1_DERIVE_PARAMS);
  26.602 -    jclass jX942Dh2DeriveParamsClass = (*env)->FindClass(env, CLASS_X9_42_DH2_DERIVE_PARAMS);
  26.603 -
  26.604 -    jclass jSsl3MasterKeyDeriveParamsClass = (*env)->FindClass(env, CLASS_SSL3_MASTER_KEY_DERIVE_PARAMS);
  26.605 -    jclass jSsl3KeyMatParamsClass = (*env)->FindClass(env, CLASS_SSL3_KEY_MAT_PARAMS);
  26.606 -    jclass jTlsPrfParamsClass = (*env)->FindClass(env, CLASS_TLS_PRF_PARAMS);
  26.607 -
  26.608 +    /* get all Java mechanism parameter classes */
  26.609      TRACE0("\nDEBUG: jMechanismParameterToCKMechanismParameter");
  26.610  
  26.611 -    /* first check the most common cases */
  26.612 -/*
  26.613 -    if (jParam == NULL) {
  26.614 -        *ckpParamPtr = NULL;
  26.615 -        *ckpLength = 0;
  26.616 -    } else if ((*env)->IsInstanceOf(env, jParam, jByteArrayClass)) {
  26.617 -        jByteArrayToCKByteArray(env, jParam, (CK_BYTE_PTR *)ckpParamPtr, ckpLength);
  26.618 -    } else if ((*env)->IsInstanceOf(env, jParam, jLongClass)) {
  26.619 -        *ckpParamPtr = jLongObjectToCKULongPtr(env, jParam);
  26.620 -        *ckpLength = sizeof(CK_ULONG);
  26.621 -    } else if ((*env)->IsInstanceOf(env, jParam, jVersionClass)) {
  26.622 -*/
  26.623 +    /* most common cases, i.e. NULL/byte[]/long, are already handled by
  26.624 +     * jMechanismParameterToCKMechanismParameter before calling this method.
  26.625 +     */
  26.626 +    jVersionClass = (*env)->FindClass(env, CLASS_VERSION);
  26.627 +    if (jVersionClass == NULL) { return; }
  26.628      if ((*env)->IsInstanceOf(env, jParam, jVersionClass)) {
  26.629          /*
  26.630           * CK_VERSION used by CKM_SSL3_PRE_MASTER_KEY_GEN
  26.631           */
  26.632 -
  26.633          CK_VERSION_PTR ckpParam;
  26.634  
  26.635          /* convert jParameter to CKParameter */
  26.636 @@ -861,190 +962,311 @@
  26.637          /* get length and pointer of parameter */
  26.638          *ckpLength = sizeof(CK_VERSION);
  26.639          *ckpParamPtr = ckpParam;
  26.640 +        return;
  26.641 +    }
  26.642  
  26.643 -    } else if ((*env)->IsInstanceOf(env, jParam, jSsl3MasterKeyDeriveParamsClass)) {
  26.644 +    jSsl3MasterKeyDeriveParamsClass = (*env)->FindClass(env, CLASS_SSL3_MASTER_KEY_DERIVE_PARAMS);
  26.645 +    if (jSsl3MasterKeyDeriveParamsClass == NULL) { return; }
  26.646 +    if ((*env)->IsInstanceOf(env, jParam, jSsl3MasterKeyDeriveParamsClass)) {
  26.647          /*
  26.648           * CK_SSL3_MASTER_KEY_DERIVE_PARAMS
  26.649           */
  26.650 -
  26.651          CK_SSL3_MASTER_KEY_DERIVE_PARAMS_PTR ckpParam;
  26.652  
  26.653          ckpParam = (CK_SSL3_MASTER_KEY_DERIVE_PARAMS_PTR) malloc(sizeof(CK_SSL3_MASTER_KEY_DERIVE_PARAMS));
  26.654 +        if (ckpParam == NULL) {
  26.655 +            JNU_ThrowOutOfMemoryError(env, 0);
  26.656 +            return;
  26.657 +        }
  26.658  
  26.659          /* convert jParameter to CKParameter */
  26.660          *ckpParam = jSsl3MasterKeyDeriveParamToCKSsl3MasterKeyDeriveParam(env, jParam);
  26.661 +        if ((*env)->ExceptionCheck(env)) {
  26.662 +            free(ckpParam);
  26.663 +            return;
  26.664 +        }
  26.665  
  26.666          /* get length and pointer of parameter */
  26.667          *ckpLength = sizeof(CK_SSL3_MASTER_KEY_DERIVE_PARAMS);
  26.668          *ckpParamPtr = ckpParam;
  26.669 +        return;
  26.670 +    }
  26.671  
  26.672 -    } else if ((*env)->IsInstanceOf(env, jParam, jSsl3KeyMatParamsClass)) {
  26.673 +    jSsl3KeyMatParamsClass = (*env)->FindClass(env, CLASS_SSL3_KEY_MAT_PARAMS);
  26.674 +    if (jSsl3KeyMatParamsClass == NULL) { return; }
  26.675 +    if ((*env)->IsInstanceOf(env, jParam, jSsl3KeyMatParamsClass)) {
  26.676          /*
  26.677           * CK_SSL3_KEY_MAT_PARAMS
  26.678           */
  26.679 -
  26.680          CK_SSL3_KEY_MAT_PARAMS_PTR ckpParam;
  26.681  
  26.682          ckpParam = (CK_SSL3_KEY_MAT_PARAMS_PTR) malloc(sizeof(CK_SSL3_KEY_MAT_PARAMS));
  26.683 +        if (ckpParam == NULL) {
  26.684 +            JNU_ThrowOutOfMemoryError(env, 0);
  26.685 +            return;
  26.686 +        }
  26.687  
  26.688          /* convert jParameter to CKParameter */
  26.689          *ckpParam = jSsl3KeyMatParamToCKSsl3KeyMatParam(env, jParam);
  26.690 +        if ((*env)->ExceptionCheck(env)) {
  26.691 +            free(ckpParam);
  26.692 +            return;
  26.693 +        }
  26.694  
  26.695          /* get length and pointer of parameter */
  26.696          *ckpLength = sizeof(CK_SSL3_KEY_MAT_PARAMS);
  26.697          *ckpParamPtr = ckpParam;
  26.698 +        return;
  26.699 +    }
  26.700  
  26.701 -    } else if ((*env)->IsInstanceOf(env, jParam, jTlsPrfParamsClass)) {
  26.702 -        //
  26.703 -        // CK_TLS_PRF_PARAMS
  26.704 -        //
  26.705 -
  26.706 +    jTlsPrfParamsClass = (*env)->FindClass(env, CLASS_TLS_PRF_PARAMS);
  26.707 +    if (jTlsPrfParamsClass == NULL) { return; }
  26.708 +    if ((*env)->IsInstanceOf(env, jParam, jTlsPrfParamsClass)) {
  26.709 +        /*
  26.710 +         * CK_TLS_PRF_PARAMS
  26.711 +         */
  26.712          CK_TLS_PRF_PARAMS_PTR ckpParam;
  26.713  
  26.714          ckpParam = (CK_TLS_PRF_PARAMS_PTR) malloc(sizeof(CK_TLS_PRF_PARAMS));
  26.715 +        if (ckpParam == NULL) {
  26.716 +            JNU_ThrowOutOfMemoryError(env, 0);
  26.717 +            return;
  26.718 +        }
  26.719  
  26.720 -        // convert jParameter to CKParameter
  26.721 +        /* convert jParameter to CKParameter */
  26.722          *ckpParam = jTlsPrfParamsToCKTlsPrfParam(env, jParam);
  26.723 +        if ((*env)->ExceptionCheck(env)) {
  26.724 +            free(ckpParam);
  26.725 +            return;
  26.726 +        }
  26.727  
  26.728 -        // get length and pointer of parameter
  26.729 +        /* get length and pointer of parameter */
  26.730          *ckpLength = sizeof(CK_TLS_PRF_PARAMS);
  26.731          *ckpParamPtr = ckpParam;
  26.732 +        return;
  26.733 +    }
  26.734  
  26.735 -    } else if ((*env)->IsInstanceOf(env, jParam, jRsaPkcsOaepParamsClass)) {
  26.736 +    jRsaPkcsOaepParamsClass = (*env)->FindClass(env, CLASS_RSA_PKCS_OAEP_PARAMS);
  26.737 +    if (jRsaPkcsOaepParamsClass == NULL) { return; }
  26.738 +    if ((*env)->IsInstanceOf(env, jParam, jRsaPkcsOaepParamsClass)) {
  26.739          /*
  26.740           * CK_RSA_PKCS_OAEP_PARAMS
  26.741           */
  26.742 -
  26.743          CK_RSA_PKCS_OAEP_PARAMS_PTR ckpParam;
  26.744  
  26.745          ckpParam = (CK_RSA_PKCS_OAEP_PARAMS_PTR) malloc(sizeof(CK_RSA_PKCS_OAEP_PARAMS));
  26.746 +        if (ckpParam == NULL) {
  26.747 +            JNU_ThrowOutOfMemoryError(env, 0);
  26.748 +            return;
  26.749 +        }
  26.750  
  26.751          /* convert jParameter to CKParameter */
  26.752          *ckpParam = jRsaPkcsOaepParamToCKRsaPkcsOaepParam(env, jParam);
  26.753 +        if ((*env)->ExceptionCheck(env)) {
  26.754 +            free(ckpParam);
  26.755 +            return;
  26.756 +        }
  26.757  
  26.758          /* get length and pointer of parameter */
  26.759          *ckpLength = sizeof(CK_RSA_PKCS_OAEP_PARAMS);
  26.760          *ckpParamPtr = ckpParam;
  26.761 +        return;
  26.762 +    }
  26.763  
  26.764 -    } else if ((*env)->IsInstanceOf(env, jParam, jPbeParamsClass)) {
  26.765 +    jPbeParamsClass = (*env)->FindClass(env, CLASS_PBE_PARAMS);
  26.766 +    if (jPbeParamsClass == NULL) { return; }
  26.767 +    if ((*env)->IsInstanceOf(env, jParam, jPbeParamsClass)) {
  26.768          /*
  26.769           * CK_PBE_PARAMS
  26.770           */
  26.771 -
  26.772          CK_PBE_PARAMS_PTR ckpParam;
  26.773  
  26.774          ckpParam = (CK_PBE_PARAMS_PTR) malloc(sizeof(CK_PBE_PARAMS));
  26.775 +        if (ckpParam == NULL) {
  26.776 +            JNU_ThrowOutOfMemoryError(env, 0);
  26.777 +            return;
  26.778 +        }
  26.779  
  26.780          /* convert jParameter to CKParameter */
  26.781          *ckpParam = jPbeParamToCKPbeParam(env, jParam);
  26.782 +        if ((*env)->ExceptionCheck(env)) {
  26.783 +            free(ckpParam);
  26.784 +            return;
  26.785 +        }
  26.786  
  26.787          /* get length and pointer of parameter */
  26.788          *ckpLength = sizeof(CK_PBE_PARAMS);
  26.789          *ckpParamPtr = ckpParam;
  26.790 +        return;
  26.791 +    }
  26.792  
  26.793 -    } else if ((*env)->IsInstanceOf(env, jParam, jPkcs5Pbkd2ParamsClass)) {
  26.794 +    jPkcs5Pbkd2ParamsClass = (*env)->FindClass(env, CLASS_PKCS5_PBKD2_PARAMS);
  26.795 +    if (jPkcs5Pbkd2ParamsClass == NULL) { return; }
  26.796 +    if ((*env)->IsInstanceOf(env, jParam, jPkcs5Pbkd2ParamsClass)) {
  26.797          /*
  26.798           * CK_PKCS5_PBKD2_PARAMS
  26.799           */
  26.800 -
  26.801          CK_PKCS5_PBKD2_PARAMS_PTR ckpParam;
  26.802  
  26.803          ckpParam = (CK_PKCS5_PBKD2_PARAMS_PTR) malloc(sizeof(CK_PKCS5_PBKD2_PARAMS));
  26.804 +        if (ckpParam == NULL) {
  26.805 +            JNU_ThrowOutOfMemoryError(env, 0);
  26.806 +            return;
  26.807 +        }
  26.808  
  26.809          /* convert jParameter to CKParameter */
  26.810          *ckpParam = jPkcs5Pbkd2ParamToCKPkcs5Pbkd2Param(env, jParam);
  26.811 +        if ((*env)->ExceptionCheck(env)) {
  26.812 +            free(ckpParam);
  26.813 +            return;
  26.814 +        }
  26.815  
  26.816          /* get length and pointer of parameter */
  26.817          *ckpLength = sizeof(CK_PKCS5_PBKD2_PARAMS);
  26.818          *ckpParamPtr = ckpParam;
  26.819 +        return;
  26.820 +    }
  26.821  
  26.822 -    } else if ((*env)->IsInstanceOf(env, jParam, jRsaPkcsPssParamsClass)) {
  26.823 +    jRsaPkcsPssParamsClass = (*env)->FindClass(env, CLASS_RSA_PKCS_PSS_PARAMS);
  26.824 +    if (jRsaPkcsPssParamsClass == NULL) { return; }
  26.825 +    if ((*env)->IsInstanceOf(env, jParam, jRsaPkcsPssParamsClass)) {
  26.826          /*
  26.827           * CK_RSA_PKCS_PSS_PARAMS
  26.828           */
  26.829 -
  26.830          CK_RSA_PKCS_PSS_PARAMS_PTR ckpParam;
  26.831  
  26.832          ckpParam = (CK_RSA_PKCS_PSS_PARAMS_PTR) malloc(sizeof(CK_RSA_PKCS_PSS_PARAMS));
  26.833 +        if (ckpParam == NULL) {
  26.834 +            JNU_ThrowOutOfMemoryError(env, 0);
  26.835 +            return;
  26.836 +        }
  26.837  
  26.838          /* convert jParameter to CKParameter */
  26.839          *ckpParam = jRsaPkcsPssParamToCKRsaPkcsPssParam(env, jParam);
  26.840 +        if ((*env)->ExceptionCheck(env)) {
  26.841 +            free(ckpParam);
  26.842 +            return;
  26.843 +        }
  26.844  
  26.845          /* get length and pointer of parameter */
  26.846          *ckpLength = sizeof(CK_RSA_PKCS_PSS_PARAMS);
  26.847          *ckpParamPtr = ckpParam;
  26.848 +        return;
  26.849 +    }
  26.850  
  26.851 -    } else if ((*env)->IsInstanceOf(env, jParam, jEcdh1DeriveParamsClass)) {
  26.852 +    jEcdh1DeriveParamsClass = (*env)->FindClass(env, CLASS_ECDH1_DERIVE_PARAMS);
  26.853 +    if (jEcdh1DeriveParamsClass == NULL) { return; }
  26.854 +    if ((*env)->IsInstanceOf(env, jParam, jEcdh1DeriveParamsClass)) {
  26.855          /*
  26.856           * CK_ECDH1_DERIVE_PARAMS
  26.857           */
  26.858 -
  26.859          CK_ECDH1_DERIVE_PARAMS_PTR ckpParam;
  26.860  
  26.861          ckpParam = (CK_ECDH1_DERIVE_PARAMS_PTR) malloc(sizeof(CK_ECDH1_DERIVE_PARAMS));
  26.862 +        if (ckpParam == NULL) {
  26.863 +            JNU_ThrowOutOfMemoryError(env, 0);
  26.864 +            return;
  26.865 +        }
  26.866  
  26.867          /* convert jParameter to CKParameter */
  26.868          *ckpParam = jEcdh1DeriveParamToCKEcdh1DeriveParam(env, jParam);
  26.869 +        if ((*env)->ExceptionCheck(env)) {
  26.870 +            free(ckpParam);
  26.871 +            return;
  26.872 +        }
  26.873  
  26.874          /* get length and pointer of parameter */
  26.875          *ckpLength = sizeof(CK_ECDH1_DERIVE_PARAMS);
  26.876          *ckpParamPtr = ckpParam;
  26.877 +        return;
  26.878 +    }
  26.879  
  26.880 -    } else if ((*env)->IsInstanceOf(env, jParam, jEcdh2DeriveParamsClass)) {
  26.881 +    jEcdh2DeriveParamsClass = (*env)->FindClass(env, CLASS_ECDH2_DERIVE_PARAMS);
  26.882 +    if (jEcdh2DeriveParamsClass == NULL) { return; }
  26.883 +    if ((*env)->IsInstanceOf(env, jParam, jEcdh2DeriveParamsClass)) {
  26.884          /*
  26.885           * CK_ECDH2_DERIVE_PARAMS
  26.886           */
  26.887 -
  26.888          CK_ECDH2_DERIVE_PARAMS_PTR ckpParam;
  26.889  
  26.890          ckpParam = (CK_ECDH2_DERIVE_PARAMS_PTR) malloc(sizeof(CK_ECDH2_DERIVE_PARAMS));
  26.891 +        if (ckpParam == NULL) {
  26.892 +            JNU_ThrowOutOfMemoryError(env, 0);
  26.893 +            return;
  26.894 +        }
  26.895  
  26.896          /* convert jParameter to CKParameter */
  26.897          *ckpParam = jEcdh2DeriveParamToCKEcdh2DeriveParam(env, jParam);
  26.898 +        if ((*env)->ExceptionCheck(env)) {
  26.899 +            free(ckpParam);
  26.900 +            return;
  26.901 +        }
  26.902  
  26.903          /* get length and pointer of parameter */
  26.904          *ckpLength = sizeof(CK_ECDH2_DERIVE_PARAMS);
  26.905          *ckpParamPtr = ckpParam;
  26.906 +        return;
  26.907 +    }
  26.908  
  26.909 -    } else if ((*env)->IsInstanceOf(env, jParam, jX942Dh1DeriveParamsClass)) {
  26.910 +    jX942Dh1DeriveParamsClass = (*env)->FindClass(env, CLASS_X9_42_DH1_DERIVE_PARAMS);
  26.911 +    if (jX942Dh1DeriveParamsClass == NULL) { return; }
  26.912 +    if ((*env)->IsInstanceOf(env, jParam, jX942Dh1DeriveParamsClass)) {
  26.913          /*
  26.914           * CK_X9_42_DH1_DERIVE_PARAMS
  26.915           */
  26.916 -
  26.917          CK_X9_42_DH1_DERIVE_PARAMS_PTR ckpParam;
  26.918  
  26.919          ckpParam = (CK_X9_42_DH1_DERIVE_PARAMS_PTR) malloc(sizeof(CK_X9_42_DH1_DERIVE_PARAMS));
  26.920 +        if (ckpParam == NULL) {
  26.921 +            JNU_ThrowOutOfMemoryError(env, 0);
  26.922 +            return;
  26.923 +        }
  26.924  
  26.925          /* convert jParameter to CKParameter */
  26.926          *ckpParam = jX942Dh1DeriveParamToCKX942Dh1DeriveParam(env, jParam);
  26.927 +        if ((*env)->ExceptionCheck(env)) {
  26.928 +            free(ckpParam);
  26.929 +            return;
  26.930 +        }
  26.931  
  26.932          /* get length and pointer of parameter */
  26.933          *ckpLength = sizeof(CK_X9_42_DH1_DERIVE_PARAMS);
  26.934          *ckpParamPtr = ckpParam;
  26.935 +        return;
  26.936 +    }
  26.937  
  26.938 -    } else if ((*env)->IsInstanceOf(env, jParam, jX942Dh2DeriveParamsClass)) {
  26.939 +    jX942Dh2DeriveParamsClass = (*env)->FindClass(env, CLASS_X9_42_DH2_DERIVE_PARAMS);
  26.940 +    if (jX942Dh2DeriveParamsClass == NULL) { return; }
  26.941 +    if ((*env)->IsInstanceOf(env, jParam, jX942Dh2DeriveParamsClass)) {
  26.942          /*
  26.943           * CK_X9_42_DH2_DERIVE_PARAMS
  26.944           */
  26.945 -
  26.946          CK_X9_42_DH2_DERIVE_PARAMS_PTR ckpParam;
  26.947  
  26.948          ckpParam = (CK_X9_42_DH2_DERIVE_PARAMS_PTR) malloc(sizeof(CK_X9_42_DH2_DERIVE_PARAMS));
  26.949 +        if (ckpParam == NULL) {
  26.950 +            JNU_ThrowOutOfMemoryError(env, 0);
  26.951 +            return;
  26.952 +        }
  26.953  
  26.954          /* convert jParameter to CKParameter */
  26.955          *ckpParam = jX942Dh2DeriveParamToCKX942Dh2DeriveParam(env, jParam);
  26.956 +        if ((*env)->ExceptionCheck(env)) {
  26.957 +            free(ckpParam);
  26.958 +            return;
  26.959 +        }
  26.960  
  26.961          /* get length and pointer of parameter */
  26.962          *ckpLength = sizeof(CK_X9_42_DH2_DERIVE_PARAMS);
  26.963          *ckpParamPtr = ckpParam;
  26.964 +        return;
  26.965 +    }
  26.966  
  26.967 -    } else {
  26.968 -        /* if everything faild up to here */
  26.969 -        /* try if the parameter is a primitive Java type */
  26.970 -        jObjectToPrimitiveCKObjectPtrPtr(env, jParam, ckpParamPtr, ckpLength);
  26.971 -        /* *ckpParamPtr = jObjectToCKVoidPtr(jParam); */
  26.972 -        /* *ckpLength = 1; */
  26.973 -    }
  26.974 +    /* if everything faild up to here */
  26.975 +    /* try if the parameter is a primitive Java type */
  26.976 +    jObjectToPrimitiveCKObjectPtrPtr(env, jParam, ckpParamPtr, ckpLength);
  26.977 +    /* *ckpParamPtr = jObjectToCKVoidPtr(jParam); */
  26.978 +    /* *ckpLength = 1; */
  26.979  
  26.980      TRACE0("FINISHED\n");
  26.981  }
  26.982 @@ -1061,36 +1283,41 @@
  26.983   */
  26.984  CK_RSA_PKCS_OAEP_PARAMS jRsaPkcsOaepParamToCKRsaPkcsOaepParam(JNIEnv *env, jobject jParam)
  26.985  {
  26.986 -    jclass jRsaPkcsOaepParamsClass = (*env)->FindClass(env, CLASS_RSA_PKCS_OAEP_PARAMS);
  26.987 +    jclass jRsaPkcsOaepParamsClass;
  26.988      CK_RSA_PKCS_OAEP_PARAMS ckParam;
  26.989      jfieldID fieldID;
  26.990 -    jlong jLong;
  26.991 -    jobject jObject;
  26.992 +    jlong jHashAlg, jMgf, jSource;
  26.993 +    jobject jSourceData;
  26.994      CK_BYTE_PTR ckpByte;
  26.995  
  26.996      /* get hashAlg */
  26.997 +    jRsaPkcsOaepParamsClass = (*env)->FindClass(env, CLASS_RSA_PKCS_OAEP_PARAMS);
  26.998 +    if (jRsaPkcsOaepParamsClass == NULL) { return ckParam; }
  26.999      fieldID = (*env)->GetFieldID(env, jRsaPkcsOaepParamsClass, "hashAlg", "J");
 26.1000 -    assert(fieldID != 0);
 26.1001 -    jLong = (*env)->GetLongField(env, jParam, fieldID);
 26.1002 -    ckParam.hashAlg = jLongToCKULong(jLong);
 26.1003 +    if (fieldID == NULL) { return ckParam; }
 26.1004 +    jHashAlg = (*env)->GetLongField(env, jParam, fieldID);
 26.1005  
 26.1006      /* get mgf */
 26.1007      fieldID = (*env)->GetFieldID(env, jRsaPkcsOaepParamsClass, "mgf", "J");
 26.1008 -    assert(fieldID != 0);
 26.1009 -    jLong = (*env)->GetLongField(env, jParam, fieldID);
 26.1010 -    ckParam.mgf = jLongToCKULong(jLong);
 26.1011 +    if (fieldID == NULL) { return ckParam; }
 26.1012 +    jMgf = (*env)->GetLongField(env, jParam, fieldID);
 26.1013  
 26.1014      /* get source */
 26.1015      fieldID = (*env)->GetFieldID(env, jRsaPkcsOaepParamsClass, "source", "J");
 26.1016 -    assert(fieldID != 0);
 26.1017 -    jLong = (*env)->GetLongField(env, jParam, fieldID);
 26.1018 -    ckParam.source = jLongToCKULong(jLong);
 26.1019 +    if (fieldID == NULL) { return ckParam; }
 26.1020 +    jSource = (*env)->GetLongField(env, jParam, fieldID);
 26.1021  
 26.1022      /* get sourceData and sourceDataLength */
 26.1023      fieldID = (*env)->GetFieldID(env, jRsaPkcsOaepParamsClass, "pSourceData", "[B");
 26.1024 -    assert(fieldID != 0);
 26.1025 -    jObject = (*env)->GetObjectField(env, jParam, fieldID);
 26.1026 -    jByteArrayToCKByteArray(env, jObject, &ckpByte, &(ckParam.ulSourceDataLen));
 26.1027 +    if (fieldID == NULL) { return ckParam; }
 26.1028 +    jSourceData = (*env)->GetObjectField(env, jParam, fieldID);
 26.1029 +
 26.1030 +    /* populate java values */
 26.1031 +    ckParam.hashAlg = jLongToCKULong(jHashAlg);
 26.1032 +    ckParam.mgf = jLongToCKULong(jMgf);
 26.1033 +    ckParam.source = jLongToCKULong(jSource);
 26.1034 +    jByteArrayToCKByteArray(env, jSourceData, & ckpByte, &(ckParam.ulSourceDataLen));
 26.1035 +    if ((*env)->ExceptionCheck(env)) { return ckParam; }
 26.1036      ckParam.pSourceData = (CK_VOID_PTR) ckpByte;
 26.1037  
 26.1038      return ckParam ;
 26.1039 @@ -1105,36 +1332,50 @@
 26.1040   */
 26.1041  CK_PBE_PARAMS jPbeParamToCKPbeParam(JNIEnv *env, jobject jParam)
 26.1042  {
 26.1043 -    jclass jPbeParamsClass = (*env)->FindClass(env, CLASS_PBE_PARAMS);
 26.1044 +    jclass jPbeParamsClass;
 26.1045      CK_PBE_PARAMS ckParam;
 26.1046      jfieldID fieldID;
 26.1047 -    jlong jLong;
 26.1048 -    jobject jObject;
 26.1049 +    jlong jIteration;
 26.1050 +    jobject jInitVector, jPassword, jSalt;
 26.1051      CK_ULONG ckTemp;
 26.1052  
 26.1053      /* get pInitVector */
 26.1054 +    jPbeParamsClass = (*env)->FindClass(env, CLASS_PBE_PARAMS);
 26.1055 +    if (jPbeParamsClass == NULL) { return ckParam; }
 26.1056      fieldID = (*env)->GetFieldID(env, jPbeParamsClass, "pInitVector", "[C");
 26.1057 -    assert(fieldID != 0);
 26.1058 -    jObject = (*env)->GetObjectField(env, jParam, fieldID);
 26.1059 -    jCharArrayToCKCharArray(env, jObject, &(ckParam.pInitVector), &ckTemp);
 26.1060 +    if (fieldID == NULL) { return ckParam; }
 26.1061 +    jInitVector = (*env)->GetObjectField(env, jParam, fieldID);
 26.1062  
 26.1063      /* get pPassword and ulPasswordLength */
 26.1064      fieldID = (*env)->GetFieldID(env, jPbeParamsClass, "pPassword", "[C");
 26.1065 -    assert(fieldID != 0);
 26.1066 -    jObject = (*env)->GetObjectField(env, jParam, fieldID);
 26.1067 -    jCharArrayToCKCharArray(env, jObject, &(ckParam.pPassword), &(ckParam.ulPasswordLen));
 26.1068 +    if (fieldID == NULL) { return ckParam; }
 26.1069 +    jPassword = (*env)->GetObjectField(env, jParam, fieldID);
 26.1070  
 26.1071      /* get pSalt and ulSaltLength */
 26.1072      fieldID = (*env)->GetFieldID(env, jPbeParamsClass, "pSalt", "[C");
 26.1073 -    assert(fieldID != 0);
 26.1074 -    jObject = (*env)->GetObjectField(env, jParam, fieldID);
 26.1075 -    jCharArrayToCKCharArray(env, jObject, &(ckParam.pSalt), &(ckParam.ulSaltLen));
 26.1076 +    if (fieldID == NULL) { return ckParam; }
 26.1077 +    jSalt = (*env)->GetObjectField(env, jParam, fieldID);
 26.1078  
 26.1079      /* get ulIteration */
 26.1080      fieldID = (*env)->GetFieldID(env, jPbeParamsClass, "ulIteration", "J");
 26.1081 -    assert(fieldID != 0);
 26.1082 -    jLong = (*env)->GetLongField(env, jParam, fieldID);
 26.1083 -    ckParam.ulIteration = jLongToCKULong(jLong);
 26.1084 +    if (fieldID == NULL) { return ckParam; }
 26.1085 +    jIteration = (*env)->GetLongField(env, jParam, fieldID);
 26.1086 +
 26.1087 +    /* populate java values */
 26.1088 +    ckParam.ulIteration = jLongToCKULong(jIteration);
 26.1089 +    jCharArrayToCKCharArray(env, jInitVector, &(ckParam.pInitVector), &ckTemp);
 26.1090 +    if ((*env)->ExceptionCheck(env)) { return ckParam; }
 26.1091 +    jCharArrayToCKCharArray(env, jPassword, &(ckParam.pPassword), &(ckParam.ulPasswordLen));
 26.1092 +    if ((*env)->ExceptionCheck(env)) {
 26.1093 +        free(ckParam.pInitVector);
 26.1094 +        return ckParam;
 26.1095 +    }
 26.1096 +    jCharArrayToCKCharArray(env, jSalt, &(ckParam.pSalt), &(ckParam.ulSaltLen));
 26.1097 +    if ((*env)->ExceptionCheck(env)) {
 26.1098 +        free(ckParam.pInitVector);
 26.1099 +        free(ckParam.pPassword);
 26.1100 +        return ckParam;
 26.1101 +    }
 26.1102  
 26.1103      return ckParam ;
 26.1104  }
 26.1105 @@ -1147,8 +1388,7 @@
 26.1106   */
 26.1107  void copyBackPBEInitializationVector(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism)
 26.1108  {
 26.1109 -    jclass jMechanismClass= (*env)->FindClass(env, CLASS_MECHANISM);
 26.1110 -    jclass jPbeParamsClass = (*env)->FindClass(env, CLASS_PBE_PARAMS);
 26.1111 +    jclass jMechanismClass, jPbeParamsClass;
 26.1112      CK_PBE_PARAMS *ckParam;
 26.1113      jfieldID fieldID;
 26.1114      CK_MECHANISM_TYPE ckMechanismType;
 26.1115 @@ -1161,8 +1401,10 @@
 26.1116      jchar* jInitVectorChars;
 26.1117  
 26.1118      /* get mechanism */
 26.1119 +    jMechanismClass = (*env)->FindClass(env, CLASS_MECHANISM);
 26.1120 +    if (jMechanismClass == NULL) { return; }
 26.1121      fieldID = (*env)->GetFieldID(env, jMechanismClass, "mechanism", "J");
 26.1122 -    assert(fieldID != 0);
 26.1123 +    if (fieldID == NULL) { return; }
 26.1124      jMechanismType = (*env)->GetLongField(env, jMechanism, fieldID);
 26.1125      ckMechanismType = jLongToCKULong(jMechanismType);
 26.1126      if (ckMechanismType != ckMechanism->mechanism) {
 26.1127 @@ -1170,21 +1412,25 @@
 26.1128          return;
 26.1129      }
 26.1130  
 26.1131 +    jPbeParamsClass = (*env)->FindClass(env, CLASS_PBE_PARAMS);
 26.1132 +    if (jPbeParamsClass == NULL) { return; }
 26.1133      ckParam = (CK_PBE_PARAMS *) ckMechanism->pParameter;
 26.1134      if (ckParam != NULL_PTR) {
 26.1135          initVector = ckParam->pInitVector;
 26.1136          if (initVector != NULL_PTR) {
 26.1137              /* get pParameter */
 26.1138              fieldID = (*env)->GetFieldID(env, jMechanismClass, "pParameter", "Ljava/lang/Object;");
 26.1139 -            assert(fieldID != 0);
 26.1140 +            if (fieldID == NULL) { return; }
 26.1141              jParameter = (*env)->GetObjectField(env, jMechanism, fieldID);
 26.1142              fieldID = (*env)->GetFieldID(env, jPbeParamsClass, "pInitVektor", "[C");
 26.1143 -            assert(fieldID != 0);
 26.1144 +            if (fieldID == NULL) { return; }
 26.1145              jInitVector = (*env)->GetObjectField(env, jParameter, fieldID);
 26.1146  
 26.1147              if (jInitVector != NULL) {
 26.1148                  jInitVectorLength = (*env)->GetArrayLength(env, jInitVector);
 26.1149                  jInitVectorChars = (*env)->GetCharArrayElements(env, jInitVector, NULL);
 26.1150 +                if (jInitVectorChars == NULL) { return; }
 26.1151 +
 26.1152                  /* copy the chars to the Java buffer */
 26.1153                  for (i=0; i < jInitVectorLength; i++) {
 26.1154                      jInitVectorChars[i] = ckCharToJChar(initVector[i]);
 26.1155 @@ -1205,41 +1451,50 @@
 26.1156   */
 26.1157  CK_PKCS5_PBKD2_PARAMS jPkcs5Pbkd2ParamToCKPkcs5Pbkd2Param(JNIEnv *env, jobject jParam)
 26.1158  {
 26.1159 -    jclass jPkcs5Pbkd2ParamsClass = (*env)->FindClass(env, CLASS_PKCS5_PBKD2_PARAMS);
 26.1160 +    jclass jPkcs5Pbkd2ParamsClass;
 26.1161      CK_PKCS5_PBKD2_PARAMS ckParam;
 26.1162      jfieldID fieldID;
 26.1163 -    jlong jLong;
 26.1164 -    jobject jObject;
 26.1165 +    jlong jSaltSource, jIteration, jPrf;
 26.1166 +    jobject jSaltSourceData, jPrfData;
 26.1167  
 26.1168      /* get saltSource */
 26.1169 +    jPkcs5Pbkd2ParamsClass = (*env)->FindClass(env, CLASS_PKCS5_PBKD2_PARAMS);
 26.1170 +    if (jPkcs5Pbkd2ParamsClass == NULL) { return ckParam; }
 26.1171      fieldID = (*env)->GetFieldID(env, jPkcs5Pbkd2ParamsClass, "saltSource", "J");
 26.1172 -    assert(fieldID != 0);
 26.1173 -    jLong = (*env)->GetLongField(env, jParam, fieldID);
 26.1174 -    ckParam.saltSource = jLongToCKULong(jLong);
 26.1175 +    if (fieldID == NULL) { return ckParam; }
 26.1176 +    jSaltSource = (*env)->GetLongField(env, jParam, fieldID);
 26.1177  
 26.1178      /* get pSaltSourceData */
 26.1179      fieldID = (*env)->GetFieldID(env, jPkcs5Pbkd2ParamsClass, "pSaltSourceData", "[B");
 26.1180 -    assert(fieldID != 0);
 26.1181 -    jObject = (*env)->GetObjectField(env, jParam, fieldID);
 26.1182 -    jByteArrayToCKByteArray(env, jObject, (CK_BYTE_PTR *) &(ckParam.pSaltSourceData), &(ckParam.ulSaltSourceDataLen));
 26.1183 +    if (fieldID == NULL) { return ckParam; }
 26.1184 +    jSaltSourceData = (*env)->GetObjectField(env, jParam, fieldID);
 26.1185  
 26.1186      /* get iterations */
 26.1187      fieldID = (*env)->GetFieldID(env, jPkcs5Pbkd2ParamsClass, "iterations", "J");
 26.1188 -    assert(fieldID != 0);
 26.1189 -    jLong = (*env)->GetLongField(env, jParam, fieldID);
 26.1190 -    ckParam.iterations = jLongToCKULong(jLong);
 26.1191 +    if (fieldID == NULL) { return ckParam; }
 26.1192 +    jIteration = (*env)->GetLongField(env, jParam, fieldID);
 26.1193  
 26.1194      /* get prf */
 26.1195      fieldID = (*env)->GetFieldID(env, jPkcs5Pbkd2ParamsClass, "prf", "J");
 26.1196 -    assert(fieldID != 0);
 26.1197 -    jLong = (*env)->GetLongField(env, jParam, fieldID);
 26.1198 -    ckParam.prf = jLongToCKULong(jLong);
 26.1199 +    if (fieldID == NULL) { return ckParam; }
 26.1200 +    jPrf = (*env)->GetLongField(env, jParam, fieldID);
 26.1201  
 26.1202      /* get pPrfData and ulPrfDataLength in byte */
 26.1203      fieldID = (*env)->GetFieldID(env, jPkcs5Pbkd2ParamsClass, "pPrfData", "[B");
 26.1204 -    assert(fieldID != 0);
 26.1205 -    jObject = (*env)->GetObjectField(env, jParam, fieldID);
 26.1206 -    jByteArrayToCKByteArray(env, jObject, (CK_BYTE_PTR *) &(ckParam.pPrfData), &(ckParam.ulPrfDataLen));
 26.1207 +    if (fieldID == NULL) { return ckParam; }
 26.1208 +    jPrfData = (*env)->GetObjectField(env, jParam, fieldID);
 26.1209 +
 26.1210 +    /* populate java values */
 26.1211 +    ckParam.saltSource = jLongToCKULong(jSaltSource);
 26.1212 +    jByteArrayToCKByteArray(env, jSaltSourceData, (CK_BYTE_PTR *) &(ckParam.pSaltSourceData), &(ckParam.ulSaltSourceDataLen));
 26.1213 +    if ((*env)->ExceptionCheck(env)) { return ckParam; }
 26.1214 +    ckParam.iterations = jLongToCKULong(jIteration);
 26.1215 +    ckParam.prf = jLongToCKULong(jPrf);
 26.1216 +    jByteArrayToCKByteArray(env, jPrfData, (CK_BYTE_PTR *) &(ckParam.pPrfData), &(ckParam.ulPrfDataLen));
 26.1217 +    if ((*env)->ExceptionCheck(env)) {
 26.1218 +        free(ckParam.pSaltSourceData);
 26.1219 +        return ckParam;
 26.1220 +    }
 26.1221  
 26.1222      return ckParam ;
 26.1223  }
 26.1224 @@ -1253,28 +1508,32 @@
 26.1225   */
 26.1226  CK_RSA_PKCS_PSS_PARAMS jRsaPkcsPssParamToCKRsaPkcsPssParam(JNIEnv *env, jobject jParam)
 26.1227  {
 26.1228 -    jclass jRsaPkcsPssParamsClass = (*env)->FindClass(env, CLASS_RSA_PKCS_PSS_PARAMS);
 26.1229 +    jclass jRsaPkcsPssParamsClass;
 26.1230      CK_RSA_PKCS_PSS_PARAMS ckParam;
 26.1231      jfieldID fieldID;
 26.1232 -    jlong jLong;
 26.1233 +    jlong jHashAlg, jMgf, jSLen;
 26.1234  
 26.1235      /* get hashAlg */
 26.1236 +    jRsaPkcsPssParamsClass = (*env)->FindClass(env, CLASS_RSA_PKCS_PSS_PARAMS);
 26.1237 +    if (jRsaPkcsPssParamsClass == NULL) { return ckParam; }
 26.1238      fieldID = (*env)->GetFieldID(env, jRsaPkcsPssParamsClass, "hashAlg", "J");
 26.1239 -    assert(fieldID != 0);
 26.1240 -    jLong = (*env)->GetLongField(env, jParam, fieldID);
 26.1241 -    ckParam.hashAlg = jLongToCKULong(jLong);
 26.1242 +    if (fieldID == NULL) { return ckParam; }
 26.1243 +    jHashAlg = (*env)->GetLongField(env, jParam, fieldID);
 26.1244  
 26.1245      /* get mgf */
 26.1246      fieldID = (*env)->GetFieldID(env, jRsaPkcsPssParamsClass, "mgf", "J");
 26.1247 -    assert(fieldID != 0);
 26.1248 -    jLong = (*env)->GetLongField(env, jParam, fieldID);
 26.1249 -    ckParam.mgf = jLongToCKULong(jLong);
 26.1250 +    if (fieldID == NULL) { return ckParam; }
 26.1251 +    jMgf = (*env)->GetLongField(env, jParam, fieldID);
 26.1252  
 26.1253      /* get sLen */
 26.1254      fieldID = (*env)->GetFieldID(env, jRsaPkcsPssParamsClass, "sLen", "J");
 26.1255 -    assert(fieldID != 0);
 26.1256 -    jLong = (*env)->GetLongField(env, jParam, fieldID);
 26.1257 -    ckParam.sLen = jLongToCKULong(jLong);
 26.1258 +    if (fieldID == NULL) { return ckParam; }
 26.1259 +    jSLen = (*env)->GetLongField(env, jParam, fieldID);
 26.1260 +
 26.1261 +    /* populate java values */
 26.1262 +    ckParam.hashAlg = jLongToCKULong(jHashAlg);
 26.1263 +    ckParam.mgf = jLongToCKULong(jMgf);
 26.1264 +    ckParam.sLen = jLongToCKULong(jSLen);
 26.1265  
 26.1266      return ckParam ;
 26.1267  }
 26.1268 @@ -1288,29 +1547,39 @@
 26.1269   */
 26.1270  CK_ECDH1_DERIVE_PARAMS jEcdh1DeriveParamToCKEcdh1DeriveParam(JNIEnv *env, jobject jParam)
 26.1271  {
 26.1272 -    jclass jEcdh1DeriveParamsClass = (*env)->FindClass(env, CLASS_ECDH1_DERIVE_PARAMS);
 26.1273 +    jclass jEcdh1DeriveParamsClass;
 26.1274      CK_ECDH1_DERIVE_PARAMS ckParam;
 26.1275      jfieldID fieldID;
 26.1276      jlong jLong;
 26.1277 -    jobject jObject;
 26.1278 +    jobject jSharedData, jPublicData;
 26.1279  
 26.1280      /* get kdf */
 26.1281 +    jEcdh1DeriveParamsClass = (*env)->FindClass(env, CLASS_ECDH1_DERIVE_PARAMS);
 26.1282 +    if (jEcdh1DeriveParamsClass == NULL) { return ckParam; }
 26.1283      fieldID = (*env)->GetFieldID(env, jEcdh1DeriveParamsClass, "kdf", "J");
 26.1284 -    assert(fieldID != 0);
 26.1285 +    if (fieldID == NULL) { return ckParam; }
 26.1286      jLong = (*env)->GetLongField(env, jParam, fieldID);
 26.1287      ckParam.kdf = jLongToCKULong(jLong);
 26.1288  
 26.1289      /* get pSharedData and ulSharedDataLen */
 26.1290      fieldID = (*env)->GetFieldID(env, jEcdh1DeriveParamsClass, "pSharedData", "[B");
 26.1291 -    assert(fieldID != 0);
 26.1292 -    jObject = (*env)->GetObjectField(env, jParam, fieldID);
 26.1293 -    jByteArrayToCKByteArray(env, jObject, &(ckParam.pSharedData), &(ckParam.ulSharedDataLen));
 26.1294 +    if (fieldID == NULL) { return ckParam; }
 26.1295 +    jSharedData = (*env)->GetObjectField(env, jParam, fieldID);
 26.1296  
 26.1297      /* get pPublicData and ulPublicDataLen */
 26.1298      fieldID = (*env)->GetFieldID(env, jEcdh1DeriveParamsClass, "pPublicData", "[B");
 26.1299 -    assert(fieldID != 0);
 26.1300 -    jObject = (*env)->GetObjectField(env, jParam, fieldID);
 26.1301 -    jByteArrayToCKByteArray(env, jObject, &(ckParam.pPublicData), &(ckParam.ulPublicDataLen));
 26.1302 +    if (fieldID == NULL) { return ckParam; }
 26.1303 +    jPublicData = (*env)->GetObjectField(env, jParam, fieldID);
 26.1304 +
 26.1305 +    /* populate java values */
 26.1306 +    ckParam.kdf = jLongToCKULong(jLong);
 26.1307 +    jByteArrayToCKByteArray(env, jSharedData, &(ckParam.pSharedData), &(ckParam.ulSharedDataLen));
 26.1308 +    if ((*env)->ExceptionCheck(env)) { return ckParam; }
 26.1309 +    jByteArrayToCKByteArray(env, jPublicData, &(ckParam.pPublicData), &(ckParam.ulPublicDataLen));
 26.1310 +    if ((*env)->ExceptionCheck(env)) {
 26.1311 +        free(ckParam.pSharedData);
 26.1312 +        return ckParam;
 26.1313 +    }
 26.1314  
 26.1315      return ckParam ;
 26.1316  }
 26.1317 @@ -1324,48 +1593,61 @@
 26.1318   */
 26.1319  CK_ECDH2_DERIVE_PARAMS jEcdh2DeriveParamToCKEcdh2DeriveParam(JNIEnv *env, jobject jParam)
 26.1320  {
 26.1321 -    jclass jEcdh2DeriveParamsClass = (*env)->FindClass(env, CLASS_ECDH2_DERIVE_PARAMS);
 26.1322 +    jclass jEcdh2DeriveParamsClass;
 26.1323      CK_ECDH2_DERIVE_PARAMS ckParam;
 26.1324      jfieldID fieldID;
 26.1325 -    jlong jLong;
 26.1326 -    jobject jObject;
 26.1327 +    jlong jKdf, jPrivateDataLen, jPrivateData;
 26.1328 +    jobject jSharedData, jPublicData, jPublicData2;
 26.1329  
 26.1330      /* get kdf */
 26.1331 +    jEcdh2DeriveParamsClass = (*env)->FindClass(env, CLASS_ECDH2_DERIVE_PARAMS);
 26.1332 +    if (jEcdh2DeriveParamsClass == NULL) { return ckParam; }
 26.1333      fieldID = (*env)->GetFieldID(env, jEcdh2DeriveParamsClass, "kdf", "J");
 26.1334 -    assert(fieldID != 0);
 26.1335 -    jLong = (*env)->GetLongField(env, jParam, fieldID);
 26.1336 -    ckParam.kdf = jLongToCKULong(jLong);
 26.1337 +    if (fieldID == NULL) { return ckParam; }
 26.1338 +    jKdf = (*env)->GetLongField(env, jParam, fieldID);
 26.1339  
 26.1340      /* get pSharedData and ulSharedDataLen */
 26.1341      fieldID = (*env)->GetFieldID(env, jEcdh2DeriveParamsClass, "pSharedData", "[B");
 26.1342 -    assert(fieldID != 0);
 26.1343 -    jObject = (*env)->GetObjectField(env, jParam, fieldID);
 26.1344 -    jByteArrayToCKByteArray(env, jObject, &(ckParam.pSharedData), &(ckParam.ulSharedDataLen));
 26.1345 +    if (fieldID == NULL) { return ckParam; }
 26.1346 +    jSharedData = (*env)->GetObjectField(env, jParam, fieldID);
 26.1347  
 26.1348      /* get pPublicData and ulPublicDataLen */
 26.1349      fieldID = (*env)->GetFieldID(env, jEcdh2DeriveParamsClass, "pPublicData", "[B");
 26.1350 -    assert(fieldID != 0);
 26.1351 -    jObject = (*env)->GetObjectField(env, jParam, fieldID);
 26.1352 -    jByteArrayToCKByteArray(env, jObject, &(ckParam.pPublicData), &(ckParam.ulPublicDataLen));
 26.1353 +    if (fieldID == NULL) { return ckParam; }
 26.1354 +    jPublicData = (*env)->GetObjectField(env, jParam, fieldID);
 26.1355  
 26.1356      /* get ulPrivateDataLen */
 26.1357      fieldID = (*env)->GetFieldID(env, jEcdh2DeriveParamsClass, "ulPrivateDataLen", "J");
 26.1358 -    assert(fieldID != 0);
 26.1359 -    jLong = (*env)->GetLongField(env, jParam, fieldID);
 26.1360 -    ckParam.ulPrivateDataLen = jLongToCKULong(jLong);
 26.1361 +    if (fieldID == NULL) { return ckParam; }
 26.1362 +    jPrivateDataLen = (*env)->GetLongField(env, jParam, fieldID);
 26.1363  
 26.1364      /* get hPrivateData */
 26.1365      fieldID = (*env)->GetFieldID(env, jEcdh2DeriveParamsClass, "hPrivateData", "J");
 26.1366 -    assert(fieldID != 0);
 26.1367 -    jLong = (*env)->GetLongField(env, jParam, fieldID);
 26.1368 -    ckParam.hPrivateData = jLongToCKULong(jLong);
 26.1369 +    if (fieldID == NULL) { return ckParam; }
 26.1370 +    jPrivateData = (*env)->GetLongField(env, jParam, fieldID);
 26.1371  
 26.1372      /* get pPublicData2 and ulPublicDataLen2 */
 26.1373      fieldID = (*env)->GetFieldID(env, jEcdh2DeriveParamsClass, "pPublicData2", "[B");
 26.1374 -    assert(fieldID != 0);
 26.1375 -    jObject = (*env)->GetObjectField(env, jParam, fieldID);
 26.1376 -    jByteArrayToCKByteArray(env, jObject, &(ckParam.pPublicData2), &(ckParam.ulPublicDataLen2));
 26.1377 +    if (fieldID == NULL) { return ckParam; }
 26.1378 +    jPublicData2 = (*env)->GetObjectField(env, jParam, fieldID);
 26.1379  
 26.1380 +    /* populate java values */
 26.1381 +    ckParam.kdf = jLongToCKULong(jKdf);
 26.1382 +    jByteArrayToCKByteArray(env, jSharedData, &(ckParam.pSharedData), &(ckParam.ulSharedDataLen));
 26.1383 +    if ((*env)->ExceptionCheck(env)) { return ckParam; }
 26.1384 +    jByteArrayToCKByteArray(env, jPublicData, &(ckParam.pPublicData), &(ckParam.ulPublicDataLen));
 26.1385 +    if ((*env)->ExceptionCheck(env)) {
 26.1386 +        free(ckParam.pSharedData);
 26.1387 +        return ckParam;
 26.1388 +    }
 26.1389 +    ckParam.ulPrivateDataLen = jLongToCKULong(jPrivateDataLen);
 26.1390 +    ckParam.hPrivateData = jLongToCKULong(jPrivateData);
 26.1391 +    jByteArrayToCKByteArray(env, jPublicData2, &(ckParam.pPublicData2), &(ckParam.ulPublicDataLen2));
 26.1392 +    if ((*env)->ExceptionCheck(env)) {
 26.1393 +        free(ckParam.pSharedData);
 26.1394 +        free(ckParam.pPublicData);
 26.1395 +        return ckParam;
 26.1396 +    }
 26.1397      return ckParam ;
 26.1398  }
 26.1399  
 26.1400 @@ -1378,29 +1660,38 @@
 26.1401   */
 26.1402  CK_X9_42_DH1_DERIVE_PARAMS jX942Dh1DeriveParamToCKX942Dh1DeriveParam(JNIEnv *env, jobject jParam)
 26.1403  {
 26.1404 -    jclass jX942Dh1DeriveParamsClass = (*env)->FindClass(env, CLASS_X9_42_DH1_DERIVE_PARAMS);
 26.1405 +    jclass jX942Dh1DeriveParamsClass;
 26.1406      CK_X9_42_DH1_DERIVE_PARAMS ckParam;
 26.1407      jfieldID fieldID;
 26.1408 -    jlong jLong;
 26.1409 -    jobject jObject;
 26.1410 +    jlong jKdf;
 26.1411 +    jobject jOtherInfo, jPublicData;
 26.1412  
 26.1413      /* get kdf */
 26.1414 +    jX942Dh1DeriveParamsClass = (*env)->FindClass(env, CLASS_X9_42_DH1_DERIVE_PARAMS);
 26.1415 +    if (jX942Dh1DeriveParamsClass == NULL) { return ckParam; }
 26.1416      fieldID = (*env)->GetFieldID(env, jX942Dh1DeriveParamsClass, "kdf", "J");
 26.1417 -    assert(fieldID != 0);
 26.1418 -    jLong = (*env)->GetLongField(env, jParam, fieldID);
 26.1419 -    ckParam.kdf = jLongToCKULong(jLong);
 26.1420 +    if (fieldID == NULL) { return ckParam; }
 26.1421 +    jKdf = (*env)->GetLongField(env, jParam, fieldID);
 26.1422  
 26.1423      /* get pOtherInfo and ulOtherInfoLen */
 26.1424      fieldID = (*env)->GetFieldID(env, jX942Dh1DeriveParamsClass, "pOtherInfo", "[B");
 26.1425 -    assert(fieldID != 0);
 26.1426 -    jObject = (*env)->GetObjectField(env, jParam, fieldID);
 26.1427 -    jByteArrayToCKByteArray(env, jObject, &(ckParam.pOtherInfo), &(ckParam.ulOtherInfoLen));
 26.1428 +    if (fieldID == NULL) { return ckParam; }
 26.1429 +    jOtherInfo = (*env)->GetObjectField(env, jParam, fieldID);
 26.1430  
 26.1431      /* get pPublicData and ulPublicDataLen */
 26.1432      fieldID = (*env)->GetFieldID(env, jX942Dh1DeriveParamsClass, "pPublicData", "[B");
 26.1433 -    assert(fieldID != 0);
 26.1434 -    jObject = (*env)->GetObjectField(env, jParam, fieldID);
 26.1435 -    jByteArrayToCKByteArray(env, jObject, &(ckParam.pPublicData), &(ckParam.ulPublicDataLen));
 26.1436 +    if (fieldID == NULL) { return ckParam; }
 26.1437 +    jPublicData = (*env)->GetObjectField(env, jParam, fieldID);
 26.1438 +
 26.1439 +    /* populate java values */
 26.1440 +    ckParam.kdf = jLongToCKULong(jKdf);
 26.1441 +    jByteArrayToCKByteArray(env, jOtherInfo, &(ckParam.pOtherInfo), &(ckParam.ulOtherInfoLen));
 26.1442 +    if ((*env)->ExceptionCheck(env)) { return ckParam; }
 26.1443 +    jByteArrayToCKByteArray(env, jPublicData, &(ckParam.pPublicData), &(ckParam.ulPublicDataLen));
 26.1444 +    if ((*env)->ExceptionCheck(env)) {
 26.1445 +        free(ckParam.pOtherInfo);
 26.1446 +        return ckParam;
 26.1447 +    }
 26.1448  
 26.1449      return ckParam ;
 26.1450  }
 26.1451 @@ -1414,47 +1705,61 @@
 26.1452   */
 26.1453  CK_X9_42_DH2_DERIVE_PARAMS jX942Dh2DeriveParamToCKX942Dh2DeriveParam(JNIEnv *env, jobject jParam)
 26.1454  {
 26.1455 -    jclass jX942Dh2DeriveParamsClass = (*env)->FindClass(env, CLASS_X9_42_DH2_DERIVE_PARAMS);
 26.1456 +    jclass jX942Dh2DeriveParamsClass;
 26.1457      CK_X9_42_DH2_DERIVE_PARAMS ckParam;
 26.1458      jfieldID fieldID;
 26.1459 -    jlong jLong;
 26.1460 -    jobject jObject;
 26.1461 +    jlong jKdf, jPrivateDataLen, jPrivateData;
 26.1462 +    jobject jOtherInfo, jPublicData, jPublicData2;
 26.1463  
 26.1464      /* get kdf */
 26.1465 +    jX942Dh2DeriveParamsClass = (*env)->FindClass(env, CLASS_X9_42_DH2_DERIVE_PARAMS);
 26.1466 +    if (jX942Dh2DeriveParamsClass == NULL) { return ckParam; }
 26.1467      fieldID = (*env)->GetFieldID(env, jX942Dh2DeriveParamsClass, "kdf", "J");
 26.1468 -    assert(fieldID != 0);
 26.1469 -    jLong = (*env)->GetLongField(env, jParam, fieldID);
 26.1470 -    ckParam.kdf = jLongToCKULong(jLong);
 26.1471 +    if (fieldID == NULL) { return ckParam; }
 26.1472 +    jKdf = (*env)->GetLongField(env, jParam, fieldID);
 26.1473  
 26.1474      /* get pOtherInfo and ulOtherInfoLen */
 26.1475      fieldID = (*env)->GetFieldID(env, jX942Dh2DeriveParamsClass, "pOtherInfo", "[B");
 26.1476 -    assert(fieldID != 0);
 26.1477 -    jObject = (*env)->GetObjectField(env, jParam, fieldID);
 26.1478 -    jByteArrayToCKByteArray(env, jObject, &(ckParam.pOtherInfo), &(ckParam.ulOtherInfoLen));
 26.1479 +    if (fieldID == NULL) { return ckParam; }
 26.1480 +    jOtherInfo = (*env)->GetObjectField(env, jParam, fieldID);
 26.1481  
 26.1482      /* get pPublicData and ulPublicDataLen */
 26.1483      fieldID = (*env)->GetFieldID(env, jX942Dh2DeriveParamsClass, "pPublicData", "[B");
 26.1484 -    assert(fieldID != 0);
 26.1485 -    jObject = (*env)->GetObjectField(env, jParam, fieldID);
 26.1486 -    jByteArrayToCKByteArray(env, jObject, &(ckParam.pPublicData), &(ckParam.ulPublicDataLen));
 26.1487 +    if (fieldID == NULL) { return ckParam; }
 26.1488 +    jPublicData = (*env)->GetObjectField(env, jParam, fieldID);
 26.1489  
 26.1490      /* get ulPrivateDataLen */
 26.1491      fieldID = (*env)->GetFieldID(env, jX942Dh2DeriveParamsClass, "ulPrivateDataLen", "J");
 26.1492 -    assert(fieldID != 0);
 26.1493 -    jLong = (*env)->GetLongField(env, jParam, fieldID);
 26.1494 -    ckParam.ulPrivateDataLen = jLongToCKULong(jLong);
 26.1495 +    if (fieldID == NULL) { return ckParam; }
 26.1496 +    jPrivateDataLen = (*env)->GetLongField(env, jParam, fieldID);
 26.1497  
 26.1498      /* get hPrivateData */
 26.1499      fieldID = (*env)->GetFieldID(env, jX942Dh2DeriveParamsClass, "hPrivateData", "J");
 26.1500 -    assert(fieldID != 0);
 26.1501 -    jLong = (*env)->GetLongField(env, jParam, fieldID);
 26.1502 -    ckParam.hPrivateData = jLongToCKULong(jLong);
 26.1503 +    if (fieldID == NULL) { return ckParam; }
 26.1504 +    jPrivateData = (*env)->GetLongField(env, jParam, fieldID);
 26.1505  
 26.1506      /* get pPublicData2 and ulPublicDataLen2 */
 26.1507      fieldID = (*env)->GetFieldID(env, jX942Dh2DeriveParamsClass, "pPublicData2", "[B");
 26.1508 -    assert(fieldID != 0);
 26.1509 -    jObject = (*env)->GetObjectField(env, jParam, fieldID);
 26.1510 -    jByteArrayToCKByteArray(env, jObject, &(ckParam.pPublicData2), &(ckParam.ulPublicDataLen2));
 26.1511 +    if (fieldID == NULL) { return ckParam; }
 26.1512 +    jPublicData2 = (*env)->GetObjectField(env, jParam, fieldID);
 26.1513 +
 26.1514 +    /* populate java values */
 26.1515 +    ckParam.kdf = jLongToCKULong(jKdf);
 26.1516 +    jByteArrayToCKByteArray(env, jOtherInfo, &(ckParam.pOtherInfo), &(ckParam.ulOtherInfoLen));
 26.1517 +    if ((*env)->ExceptionCheck(env)) { return ckParam; }
 26.1518 +    jByteArrayToCKByteArray(env, jPublicData, &(ckParam.pPublicData), &(ckParam.ulPublicDataLen));
 26.1519 +    if ((*env)->ExceptionCheck(env)) {
 26.1520 +        free(ckParam.pOtherInfo);
 26.1521 +        return ckParam;
 26.1522 +    }
 26.1523 +    ckParam.ulPrivateDataLen = jLongToCKULong(jPrivateDataLen);
 26.1524 +    ckParam.hPrivateData = jLongToCKULong(jPrivateData);
 26.1525 +    jByteArrayToCKByteArray(env, jPublicData2, &(ckParam.pPublicData2), &(ckParam.ulPublicDataLen2));
 26.1526 +    if ((*env)->ExceptionCheck(env)) {
 26.1527 +        free(ckParam.pOtherInfo);
 26.1528 +        free(ckParam.pPublicData);
 26.1529 +        return ckParam;
 26.1530 +    }
 26.1531  
 26.1532      return ckParam ;
 26.1533  }
    27.1 --- a/src/share/native/sun/security/pkcs11/wrapper/p11_crypt.c	Tue Mar 17 13:44:08 2009 -0700
    27.2 +++ b/src/share/native/sun/security/pkcs11/wrapper/p11_crypt.c	Tue Mar 17 13:45:01 2009 -0700
    27.3 @@ -1,5 +1,5 @@
    27.4  /*
    27.5 - * Portions Copyright 2003-2007 Sun Microsystems, Inc.  All Rights Reserved.
    27.6 + * Portions Copyright 2003-2009 Sun Microsystems, Inc.  All Rights Reserved.
    27.7   */
    27.8  
    27.9  /* Copyright  (c) 2002 Graz University of Technology. All rights reserved.
   27.10 @@ -81,6 +81,7 @@
   27.11      ckSessionHandle = jLongToCKULong(jSessionHandle);
   27.12      ckKeyHandle = jLongToCKULong(jKeyHandle);
   27.13      jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
   27.14 +    if ((*env)->ExceptionCheck(env)) { return; }
   27.15  
   27.16      rv = (*ckpFunctions->C_EncryptInit)(ckSessionHandle, &ckMechanism,
   27.17                                          ckKeyHandle);
   27.18 @@ -126,14 +127,29 @@
   27.19  
   27.20      if (jInLen > MAX_STACK_BUFFER_LEN) {
   27.21        inBufP = (CK_BYTE_PTR)malloc((size_t)jInLen);
   27.22 +      if (inBufP == NULL) {
   27.23 +        JNU_ThrowOutOfMemoryError(env, 0);
   27.24 +        return 0;
   27.25 +      }
   27.26      } else {
   27.27        inBufP = IBUF;
   27.28      }
   27.29      (*env)->GetByteArrayRegion(env, jIn, jInOfs, jInLen, (jbyte *)inBufP);
   27.30 +    if ((*env)->ExceptionCheck(env)) {
   27.31 +      if (inBufP != IBUF) { free(inBufP); }
   27.32 +      return 0;
   27.33 +    }
   27.34  
   27.35      ckEncryptedPartLen = jOutLen;
   27.36      if (jOutLen > MAX_STACK_BUFFER_LEN) {
   27.37        outBufP = (CK_BYTE_PTR)malloc((size_t)jOutLen);
   27.38 +      if (outBufP == NULL) {
   27.39 +        if (inBufP != IBUF) {
   27.40 +          free(inBufP);
   27.41 +        }
   27.42 +        JNU_ThrowOutOfMemoryError(env, 0);
   27.43 +        return 0;
   27.44 +      }
   27.45      } else {
   27.46        outBufP = OBUF;
   27.47      }
   27.48 @@ -193,10 +209,18 @@
   27.49      } else {
   27.50        if (jInLen > MAX_STACK_BUFFER_LEN) {
   27.51          inBufP = (CK_BYTE_PTR)malloc((size_t)jInLen);
   27.52 +        if (inBufP == NULL) {
   27.53 +          JNU_ThrowOutOfMemoryError(env, 0);
   27.54 +          return 0;
   27.55 +        }
   27.56        } else {
   27.57          inBufP = IBUF;
   27.58        }
   27.59        (*env)->GetByteArrayRegion(env, jIn, jInOfs, jInLen, (jbyte *)inBufP);
   27.60 +      if ((*env)->ExceptionCheck(env)) {
   27.61 +        if (directIn == 0 && inBufP != IBUF) { free(inBufP); }
   27.62 +        return 0;
   27.63 +      }
   27.64      }
   27.65  
   27.66      ckEncryptedPartLen = jOutLen;
   27.67 @@ -205,6 +229,13 @@
   27.68      } else {
   27.69        if (jOutLen > MAX_STACK_BUFFER_LEN) {
   27.70          outBufP = (CK_BYTE_PTR)malloc((size_t)jOutLen);
   27.71 +        if (outBufP == NULL) {
   27.72 +          if (directIn == 0 && inBufP != IBUF) {
   27.73 +            free(inBufP);
   27.74 +          }
   27.75 +          JNU_ThrowOutOfMemoryError(env, 0);
   27.76 +          return 0;
   27.77 +        }
   27.78        } else {
   27.79          outBufP = OBUF;
   27.80        }
   27.81 @@ -317,6 +348,7 @@
   27.82      ckSessionHandle = jLongToCKULong(jSessionHandle);
   27.83      ckKeyHandle = jLongToCKULong(jKeyHandle);
   27.84      jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
   27.85 +    if ((*env)->ExceptionCheck(env)) { return; }
   27.86  
   27.87      rv = (*ckpFunctions->C_DecryptInit)(ckSessionHandle, &ckMechanism,
   27.88                                          ckKeyHandle);
   27.89 @@ -362,14 +394,29 @@
   27.90  
   27.91      if (jInLen > MAX_STACK_BUFFER_LEN) {
   27.92        inBufP = (CK_BYTE_PTR)malloc((size_t)jInLen);
   27.93 +      if (inBufP == NULL) {
   27.94 +        JNU_ThrowOutOfMemoryError(env, 0);
   27.95 +        return 0;
   27.96 +      }
   27.97      } else {
   27.98        inBufP = IBUF;
   27.99      }
  27.100      (*env)->GetByteArrayRegion(env, jIn, jInOfs, jInLen, (jbyte *)inBufP);
  27.101 +    if ((*env)->ExceptionCheck(env)) {
  27.102 +      if (inBufP != IBUF) { free(inBufP); }
  27.103 +      return 0;
  27.104 +    }
  27.105  
  27.106      ckPartLen = jOutLen;
  27.107      if (jOutLen > MAX_STACK_BUFFER_LEN) {
  27.108        outBufP = (CK_BYTE_PTR)malloc((size_t)jOutLen);
  27.109 +      if (outBufP == NULL) {
  27.110 +        if (inBufP != IBUF) {
  27.111 +          free(inBufP);
  27.112 +        }
  27.113 +        JNU_ThrowOutOfMemoryError(env, 0);
  27.114 +        return 0;
  27.115 +      }
  27.116      } else {
  27.117        outBufP = OBUF;
  27.118      }
  27.119 @@ -429,10 +476,18 @@
  27.120      } else {
  27.121        if (jInLen > MAX_STACK_BUFFER_LEN) {
  27.122          inBufP = (CK_BYTE_PTR)malloc((size_t)jInLen);
  27.123 +        if (inBufP == NULL) {
  27.124 +          JNU_ThrowOutOfMemoryError(env, 0);
  27.125 +          return 0;
  27.126 +        }
  27.127        } else {
  27.128          inBufP = IBUF;
  27.129        }
  27.130        (*env)->GetByteArrayRegion(env, jIn, jInOfs, jInLen, (jbyte *)inBufP);
  27.131 +      if ((*env)->ExceptionCheck(env)) {
  27.132 +        if (directIn == 0 && inBufP != IBUF) { free(inBufP); }
  27.133 +        return 0;
  27.134 +      }
  27.135      }
  27.136  
  27.137      ckDecryptedPartLen = jOutLen;
  27.138 @@ -441,6 +496,13 @@
  27.139      } else {
  27.140        if (jOutLen > MAX_STACK_BUFFER_LEN) {
  27.141          outBufP = (CK_BYTE_PTR)malloc((size_t)jOutLen);
  27.142 +        if (outBufP == NULL) {
  27.143 +          if (directIn == 0 && inBufP != IBUF) {
  27.144 +            free(inBufP);
  27.145 +          }
  27.146 +          JNU_ThrowOutOfMemoryError(env, 0);
  27.147 +          return 0;
  27.148 +      }
  27.149        } else {
  27.150          outBufP = OBUF;
  27.151        }
    28.1 --- a/src/share/native/sun/security/pkcs11/wrapper/p11_digest.c	Tue Mar 17 13:44:08 2009 -0700
    28.2 +++ b/src/share/native/sun/security/pkcs11/wrapper/p11_digest.c	Tue Mar 17 13:45:01 2009 -0700
    28.3 @@ -1,5 +1,5 @@
    28.4  /*
    28.5 - * Portions Copyright 2003 Sun Microsystems, Inc.  All Rights Reserved.
    28.6 + * Portions Copyright 2003-2009 Sun Microsystems, Inc.  All Rights Reserved.
    28.7   */
    28.8  
    28.9  /* Copyright  (c) 2002 Graz University of Technology. All rights reserved.
   28.10 @@ -75,6 +75,7 @@
   28.11  
   28.12      ckSessionHandle = jLongToCKULong(jSessionHandle);
   28.13      jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
   28.14 +    if ((*env)->ExceptionCheck(env)) { return; }
   28.15  
   28.16      rv = (*ckpFunctions->C_DigestInit)(ckSessionHandle, &ckMechanism);
   28.17  
   28.18 @@ -82,7 +83,7 @@
   28.19          free(ckMechanism.pParameter);
   28.20      }
   28.21  
   28.22 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
   28.23 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
   28.24  }
   28.25  #endif
   28.26  
   28.27 @@ -114,6 +115,7 @@
   28.28  
   28.29      ckSessionHandle = jLongToCKULong(jSessionHandle);
   28.30      jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
   28.31 +    if ((*env)->ExceptionCheck(env)) { return 0; }
   28.32  
   28.33      rv = (*ckpFunctions->C_DigestInit)(ckSessionHandle, &ckMechanism);
   28.34  
   28.35 @@ -121,29 +123,32 @@
   28.36          free(ckMechanism.pParameter);
   28.37      }
   28.38  
   28.39 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return 0; }
   28.40 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return 0; }
   28.41  
   28.42      if (jInLen <= MAX_STACK_BUFFER_LEN) {
   28.43          bufP = BUF;
   28.44      } else {
   28.45          /* always use single part op, even for large data */
   28.46 -        bufP = (CK_BYTE_PTR)malloc((size_t)jInLen);
   28.47 +        bufP = (CK_BYTE_PTR) malloc((size_t)jInLen);
   28.48 +        if (bufP == NULL) {
   28.49 +            JNU_ThrowOutOfMemoryError(env, 0);
   28.50 +            return 0;
   28.51 +        }
   28.52      }
   28.53  
   28.54      (*env)->GetByteArrayRegion(env, jIn, jInOfs, jInLen, (jbyte *)bufP);
   28.55 -    rv = (*ckpFunctions->C_Digest)(ckSessionHandle, bufP, jInLen, DIGESTBUF, &ckDigestLength);
   28.56 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
   28.57 -        if (bufP != BUF) {
   28.58 -            free(bufP);
   28.59 -        }
   28.60 +    if ((*env)->ExceptionCheck(env)) {
   28.61 +        if (bufP != BUF) { free(bufP); }
   28.62          return 0;
   28.63      }
   28.64  
   28.65 -    (*env)->SetByteArrayRegion(env, jDigest, jDigestOfs, ckDigestLength, (jbyte *)DIGESTBUF);
   28.66 +    rv = (*ckpFunctions->C_Digest)(ckSessionHandle, bufP, jInLen, DIGESTBUF, &ckDigestLength);
   28.67 +    if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
   28.68 +        (*env)->SetByteArrayRegion(env, jDigest, jDigestOfs, ckDigestLength, (jbyte *)DIGESTBUF);
   28.69 +    }
   28.70  
   28.71 -    if (bufP != BUF) {
   28.72 -        free(bufP);
   28.73 -    }
   28.74 +    if (bufP != BUF) { free(bufP); }
   28.75 +
   28.76      return ckDigestLength;
   28.77  }
   28.78  #endif
   28.79 @@ -183,17 +188,23 @@
   28.80          bufP = BUF;
   28.81      } else {
   28.82          bufLen = min(MAX_HEAP_BUFFER_LEN, jInLen);
   28.83 -        bufP = (CK_BYTE_PTR)malloc((size_t)bufLen);
   28.84 +        bufP = (CK_BYTE_PTR) malloc((size_t)bufLen);
   28.85 +        if (bufP == NULL) {
   28.86 +            JNU_ThrowOutOfMemoryError(env, 0);
   28.87 +            return;
   28.88 +        }
   28.89      }
   28.90  
   28.91      while (jInLen > 0) {
   28.92          jsize chunkLen = min(bufLen, jInLen);
   28.93          (*env)->GetByteArrayRegion(env, jIn, jInOfs, chunkLen, (jbyte *)bufP);
   28.94 +        if ((*env)->ExceptionCheck(env)) {
   28.95 +            if (bufP != BUF) { free(bufP); }
   28.96 +            return;
   28.97 +        }
   28.98          rv = (*ckpFunctions->C_DigestUpdate)(ckSessionHandle, bufP, chunkLen);
   28.99 -        if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
  28.100 -            if (bufP != BUF) {
  28.101 -                free(bufP);
  28.102 -            }
  28.103 +        if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
  28.104 +            if (bufP != BUF) { free(bufP); }
  28.105              return;
  28.106          }
  28.107          jInOfs += chunkLen;
  28.108 @@ -229,7 +240,7 @@
  28.109      ckKeyHandle = jLongToCKULong(jKeyHandle);
  28.110  
  28.111      rv = (*ckpFunctions->C_DigestKey)(ckSessionHandle, ckKeyHandle);
  28.112 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
  28.113 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
  28.114  }
  28.115  #endif
  28.116  
  28.117 @@ -257,10 +268,9 @@
  28.118      ckSessionHandle = jLongToCKULong(jSessionHandle);
  28.119  
  28.120      rv = (*ckpFunctions->C_DigestFinal)(ckSessionHandle, BUF, &ckDigestLength);
  28.121 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return 0 ; }
  28.122 -
  28.123 -    (*env)->SetByteArrayRegion(env, jDigest, jDigestOfs, ckDigestLength, (jbyte *)BUF);
  28.124 -
  28.125 +    if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
  28.126 +        (*env)->SetByteArrayRegion(env, jDigest, jDigestOfs, ckDigestLength, (jbyte *)BUF);
  28.127 +    }
  28.128      return ckDigestLength;
  28.129  }
  28.130  #endif
  28.131 @@ -288,12 +298,13 @@
  28.132  
  28.133      ckSessionHandle = jLongToCKULong(jSessionHandle);
  28.134      jByteArrayToCKByteArray(env, jSeed, &ckpSeed, &ckSeedLength);
  28.135 +    if ((*env)->ExceptionCheck(env)) { return; }
  28.136  
  28.137      rv = (*ckpFunctions->C_SeedRandom)(ckSessionHandle, ckpSeed, ckSeedLength);
  28.138  
  28.139      free(ckpSeed);
  28.140  
  28.141 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
  28.142 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
  28.143  }
  28.144  #endif
  28.145  
  28.146 @@ -322,6 +333,7 @@
  28.147  
  28.148      jRandomBufferLength = (*env)->GetArrayLength(env, jRandomData);
  28.149      jRandomBuffer = (*env)->GetByteArrayElements(env, jRandomData, NULL);
  28.150 +    if (jRandomBuffer == NULL) { return; }
  28.151  
  28.152      rv = (*ckpFunctions->C_GenerateRandom)(ckSessionHandle,
  28.153                                           (CK_BYTE_PTR) jRandomBuffer,
  28.154 @@ -330,6 +342,6 @@
  28.155      /* copy back generated bytes */
  28.156      (*env)->ReleaseByteArrayElements(env, jRandomData, jRandomBuffer, 0);
  28.157  
  28.158 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
  28.159 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
  28.160  }
  28.161  #endif
    29.1 --- a/src/share/native/sun/security/pkcs11/wrapper/p11_dual.c	Tue Mar 17 13:44:08 2009 -0700
    29.2 +++ b/src/share/native/sun/security/pkcs11/wrapper/p11_dual.c	Tue Mar 17 13:45:01 2009 -0700
    29.3 @@ -1,5 +1,5 @@
    29.4  /*
    29.5 - * Portions Copyright 2003-2007 Sun Microsystems, Inc.  All Rights Reserved.
    29.6 + * Portions Copyright 2003-2009 Sun Microsystems, Inc.  All Rights Reserved.
    29.7   */
    29.8  
    29.9  /* Copyright  (c) 2002 Graz University of Technology. All rights reserved.
   29.10 @@ -73,7 +73,7 @@
   29.11      CK_SESSION_HANDLE ckSessionHandle;
   29.12      CK_BYTE_PTR ckpPart = NULL_PTR, ckpEncryptedPart;
   29.13      CK_ULONG ckPartLength, ckEncryptedPartLength = 0;
   29.14 -    jbyteArray jEncryptedPart;
   29.15 +    jbyteArray jEncryptedPart = NULL;
   29.16      CK_RV rv;
   29.17  
   29.18      CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
   29.19 @@ -81,20 +81,28 @@
   29.20  
   29.21      ckSessionHandle = jLongToCKULong(jSessionHandle);
   29.22      jByteArrayToCKByteArray(env, jPart, &ckpPart, &ckPartLength);
   29.23 +    if ((*env)->ExceptionCheck(env)) { return NULL; }
   29.24  
   29.25      rv = (*ckpFunctions->C_DigestEncryptUpdate)(ckSessionHandle, ckpPart, ckPartLength, NULL_PTR, &ckEncryptedPartLength);
   29.26 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
   29.27 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
   29.28 +        free(ckpPart);
   29.29 +        return NULL;
   29.30 +    }
   29.31  
   29.32      ckpEncryptedPart = (CK_BYTE_PTR) malloc(ckEncryptedPartLength * sizeof(CK_BYTE));
   29.33 +    if (ckpEncryptedPart == NULL) {
   29.34 +        free(ckpPart);
   29.35 +        JNU_ThrowOutOfMemoryError(env, 0);
   29.36 +        return NULL;
   29.37 +    }
   29.38  
   29.39      rv = (*ckpFunctions->C_DigestEncryptUpdate)(ckSessionHandle, ckpPart, ckPartLength, ckpEncryptedPart, &ckEncryptedPartLength);
   29.40 -
   29.41 -    jEncryptedPart = ckByteArrayToJByteArray(env, ckpEncryptedPart, ckEncryptedPartLength);
   29.42 +    if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
   29.43 +        jEncryptedPart = ckByteArrayToJByteArray(env, ckpEncryptedPart, ckEncryptedPartLength);
   29.44 +    }
   29.45      free(ckpPart);
   29.46      free(ckpEncryptedPart);
   29.47  
   29.48 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
   29.49 -
   29.50      return jEncryptedPart ;
   29.51  }
   29.52  #endif
   29.53 @@ -117,7 +125,7 @@
   29.54      CK_SESSION_HANDLE ckSessionHandle;
   29.55      CK_BYTE_PTR ckpPart, ckpEncryptedPart = NULL_PTR;
   29.56      CK_ULONG ckPartLength = 0, ckEncryptedPartLength;
   29.57 -    jbyteArray jPart;
   29.58 +    jbyteArray jPart = NULL;
   29.59      CK_RV rv;
   29.60  
   29.61      CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
   29.62 @@ -125,19 +133,27 @@
   29.63  
   29.64      ckSessionHandle = jLongToCKULong(jSessionHandle);
   29.65      jByteArrayToCKByteArray(env, jEncryptedPart, &ckpEncryptedPart, &ckEncryptedPartLength);
   29.66 +    if ((*env)->ExceptionCheck(env)) { return NULL; }
   29.67  
   29.68      rv = (*ckpFunctions->C_DecryptDigestUpdate)(ckSessionHandle, ckpEncryptedPart, ckEncryptedPartLength, NULL_PTR, &ckPartLength);
   29.69 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL; }
   29.70 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
   29.71 +        free(ckpEncryptedPart);
   29.72 +        return NULL;
   29.73 +    }
   29.74  
   29.75      ckpPart = (CK_BYTE_PTR) malloc(ckPartLength * sizeof(CK_BYTE));
   29.76 +    if (ckpPart == NULL) {
   29.77 +        free(ckpEncryptedPart);
   29.78 +        JNU_ThrowOutOfMemoryError(env, 0);
   29.79 +        return NULL;
   29.80 +    }
   29.81  
   29.82      rv = (*ckpFunctions->C_DecryptDigestUpdate)(ckSessionHandle, ckpEncryptedPart, ckEncryptedPartLength, ckpPart, &ckPartLength);
   29.83 -
   29.84 -    jPart = ckByteArrayToJByteArray(env, ckpPart, ckPartLength);
   29.85 +    if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
   29.86 +        jPart = ckByteArrayToJByteArray(env, ckpPart, ckPartLength);
   29.87 +    }
   29.88 +    free(ckpEncryptedPart);
   29.89      free(ckpPart);
   29.90 -    free(ckpEncryptedPart);
   29.91 -
   29.92 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
   29.93  
   29.94      return jPart ;
   29.95  }
   29.96 @@ -161,7 +177,7 @@
   29.97      CK_SESSION_HANDLE ckSessionHandle;
   29.98      CK_BYTE_PTR ckpPart = NULL_PTR, ckpEncryptedPart;
   29.99      CK_ULONG ckPartLength, ckEncryptedPartLength = 0;
  29.100 -    jbyteArray jEncryptedPart;
  29.101 +    jbyteArray jEncryptedPart = NULL;
  29.102      CK_RV rv;
  29.103  
  29.104      CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
  29.105 @@ -169,20 +185,28 @@
  29.106  
  29.107      ckSessionHandle = jLongToCKULong(jSessionHandle);
  29.108      jByteArrayToCKByteArray(env, jPart, &ckpPart, &ckPartLength);
  29.109 +    if ((*env)->ExceptionCheck(env)) { return NULL; }
  29.110  
  29.111      rv = (*ckpFunctions->C_SignEncryptUpdate)(ckSessionHandle, ckpPart, ckPartLength, NULL_PTR, &ckEncryptedPartLength);
  29.112 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
  29.113 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
  29.114 +        free(ckpPart);
  29.115 +        return NULL;
  29.116 +    }
  29.117  
  29.118      ckpEncryptedPart = (CK_BYTE_PTR) malloc(ckEncryptedPartLength * sizeof(CK_BYTE));
  29.119 +    if (ckpEncryptedPart == NULL) {
  29.120 +        free(ckpPart);
  29.121 +        JNU_ThrowOutOfMemoryError(env, 0);
  29.122 +        return NULL;
  29.123 +    }
  29.124  
  29.125      rv = (*ckpFunctions->C_SignEncryptUpdate)(ckSessionHandle, ckpPart, ckPartLength, ckpEncryptedPart, &ckEncryptedPartLength);
  29.126 -
  29.127 -    jEncryptedPart = ckByteArrayToJByteArray(env, ckpEncryptedPart, ckEncryptedPartLength);
  29.128 +    if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
  29.129 +        jEncryptedPart = ckByteArrayToJByteArray(env, ckpEncryptedPart, ckEncryptedPartLength);
  29.130 +    }
  29.131      free(ckpPart);
  29.132      free(ckpEncryptedPart);
  29.133  
  29.134 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
  29.135 -
  29.136      return jEncryptedPart ;
  29.137  }
  29.138  #endif
  29.139 @@ -205,7 +229,7 @@
  29.140      CK_SESSION_HANDLE ckSessionHandle;
  29.141      CK_BYTE_PTR ckpPart, ckpEncryptedPart = NULL_PTR;
  29.142      CK_ULONG ckPartLength = 0, ckEncryptedPartLength;
  29.143 -    jbyteArray jPart;
  29.144 +    jbyteArray jPart = NULL;
  29.145      CK_RV rv;
  29.146  
  29.147      CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
  29.148 @@ -213,19 +237,28 @@
  29.149  
  29.150      ckSessionHandle = jLongToCKULong(jSessionHandle);
  29.151      jByteArrayToCKByteArray(env, jEncryptedPart, &ckpEncryptedPart, &ckEncryptedPartLength);
  29.152 +    if ((*env)->ExceptionCheck(env)) { return NULL; }
  29.153  
  29.154      rv = (*ckpFunctions->C_DecryptVerifyUpdate)(ckSessionHandle, ckpEncryptedPart, ckEncryptedPartLength, NULL_PTR, &ckPartLength);
  29.155 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
  29.156 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
  29.157 +        free(ckpEncryptedPart);
  29.158 +        return NULL;
  29.159 +    }
  29.160  
  29.161      ckpPart = (CK_BYTE_PTR) malloc(ckPartLength * sizeof(CK_BYTE));
  29.162 +    if (ckpPart == NULL) {
  29.163 +        free(ckpEncryptedPart);
  29.164 +        JNU_ThrowOutOfMemoryError(env, 0);
  29.165 +        return NULL;
  29.166 +    }
  29.167  
  29.168      rv = (*ckpFunctions->C_DecryptVerifyUpdate)(ckSessionHandle, ckpEncryptedPart, ckEncryptedPartLength, ckpPart, &ckPartLength);
  29.169  
  29.170 -    jPart = ckByteArrayToJByteArray(env, ckpPart, ckPartLength);
  29.171 +    if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
  29.172 +        jPart = ckByteArrayToJByteArray(env, ckpPart, ckPartLength);
  29.173 +    }
  29.174 +    free(ckpEncryptedPart);
  29.175      free(ckpPart);
  29.176 -    free(ckpEncryptedPart);
  29.177 -
  29.178 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
  29.179  
  29.180      return jPart ;
  29.181  }
  29.182 @@ -252,7 +285,7 @@
  29.183  
  29.184      /* C_GetFunctionStatus should always return CKR_FUNCTION_NOT_PARALLEL */
  29.185      rv = (*ckpFunctions->C_GetFunctionStatus)(ckSessionHandle);
  29.186 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
  29.187 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
  29.188  }
  29.189  #endif
  29.190  
  29.191 @@ -277,6 +310,6 @@
  29.192  
  29.193      /* C_GetFunctionStatus should always return CKR_FUNCTION_NOT_PARALLEL */
  29.194      rv = (*ckpFunctions->C_CancelFunction)(ckSessionHandle);
  29.195 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
  29.196 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
  29.197  }
  29.198  #endif
    30.1 --- a/src/share/native/sun/security/pkcs11/wrapper/p11_general.c	Tue Mar 17 13:44:08 2009 -0700
    30.2 +++ b/src/share/native/sun/security/pkcs11/wrapper/p11_general.c	Tue Mar 17 13:45:01 2009 -0700
    30.3 @@ -1,5 +1,5 @@
    30.4  /*
    30.5 - * Portions Copyright 2003-2006 Sun Microsystems, Inc.  All Rights Reserved.
    30.6 + * Portions Copyright 2003-2009 Sun Microsystems, Inc.  All Rights Reserved.
    30.7   */
    30.8  
    30.9  /* Copyright  (c) 2002 Graz University of Technology. All rights reserved.
   30.10 @@ -102,6 +102,7 @@
   30.11  
   30.12  jclass fetchClass(JNIEnv *env, const char *name) {
   30.13      jclass tmpClass = (*env)->FindClass(env, name);
   30.14 +    if (tmpClass == NULL) { return NULL; }
   30.15      return (*env)->NewGlobalRef(env, tmpClass);
   30.16  }
   30.17  
   30.18 @@ -110,14 +111,18 @@
   30.19  
   30.20      /* PKCS11 */
   30.21      pNativeDataID = (*env)->GetFieldID(env, thisClass, "pNativeData", "J");
   30.22 +    if (pNativeDataID == NULL) { return; }
   30.23  
   30.24      /* CK_MECHANISM */
   30.25      tmpClass = (*env)->FindClass(env, CLASS_MECHANISM);
   30.26 +    if (tmpClass == NULL) { return; }
   30.27      mech_mechanismID = (*env)->GetFieldID(env, tmpClass, "mechanism", "J");
   30.28 +    if (mech_mechanismID == NULL) { return; }
   30.29      mech_pParameterID = (*env)->GetFieldID(env, tmpClass, "pParameter",
   30.30                                             "Ljava/lang/Object;");
   30.31 -
   30.32 +    if (mech_pParameterID == NULL) { return; }
   30.33      jByteArrayClass = fetchClass(env, "[B");
   30.34 +    if (jByteArrayClass == NULL) { return; }
   30.35      jLongClass = fetchClass(env, "java/lang/Long");
   30.36  }
   30.37  
   30.38 @@ -252,10 +257,9 @@
   30.39      if (ckpFunctions == NULL) { return NULL; }
   30.40  
   30.41      rv = (*ckpFunctions->C_GetInfo)(&ckLibInfo);
   30.42 -    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
   30.43 -
   30.44 -    jInfoObject = ckInfoPtrToJInfo(env, &ckLibInfo);
   30.45 -
   30.46 +    if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
   30.47 +        jInfoObject = ckInfoPtrToJInfo(env, &ckLibInfo);
   30.48 +    }
   30.49      return jInfoObject ;
   30.50  }
   30.51  
   30.52 @@ -279,28 +283,31 @@
   30.53  
   30.54      /* load CK_INFO class */
   30.55      jInfoClass = (*env)->FindClass(env, CLASS_INFO);
   30.56 -    assert(jInfoClass != 0);
   30.57 +    if (jInfoClass == NULL) { return NULL; };
   30.58  
   30.59      /* load CK_INFO constructor */
   30.60      jCtrId = (*env)->GetMethodID
   30.61        (env, jInfoClass, "<init>",
   30.62         "(Lsun/security/pkcs11/wrapper/CK_VERSION;[CJ[CLsun/security/pkcs11/wrapper/CK_VERSION;)V");
   30.63 -
   30.64 -    assert(jCtrId != 0);
   30.65 +    if (jCtrId == NULL) { return NULL; }
   30.66  
   30.67      /* prep all fields */
   30.68      jCryptokiVer = ckVersionPtrToJVersion(env, &(ckpInfo->cryptokiVersion));
   30.69 +    if (jCryptokiVer == NULL) { return NULL; }
   30.70      jVendor =
   30.71        ckUTF8CharArrayToJCharArray(env, &(ckpInfo->manufacturerID[0]), 32);
   30.72 +    if (jVendor == NULL) { return NULL; }
   30.73      jFlags = ckULongToJLong(ckpInfo->flags);
   30.74      jLibraryDesc =
   30.75        ckUTF8CharArrayToJCharArray(env, &(ckpInfo->libraryDescription[0]), 32);
   30.76 +    if (jLibraryDesc == NULL) { return NULL; }
   30.77      jLibraryVer = ckVersionPtrToJVersion(env, &(ckpInfo->libraryVersion));
   30.78 +    if (jLibraryVer == NULL) { return NULL; }
   30.79  
   30.80      /* create new CK_INFO object */
   30.81      jInfoObject = (*env)->NewObject(env, jInfoClass, jCtrId, jCryptokiVer,
   30.82                                      jVendor, jFlags, jLibraryDesc, jLibraryVer);
   30.83 -    assert(jInfoObject != 0);
   30.84 +    if (jInfoObject == NULL) { return NULL; }
   30.85  
   30.86      /* free local references */
   30.87      (*env)->DeleteLocalRef(env, jInfoClass);
   30.88 @@ -343,15 +350,18 @@
   30.89      if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
   30.90  
   30.91      ckpSlotList = (CK_SLOT_ID_PTR) malloc(ckTokenNumber * sizeof(CK_SLOT_ID));
   30.92 +    if (ckpSlotList == NULL) {
   30.93 +        JNU_ThrowOutOfMemoryError(env, 0);
   30.94 +        return NULL;
   30.95 +    }
   30.96  
   30.97      rv = (*ckpFunctions->C_GetSlotList)(ckTokenPresent, ckpSlotList,
   30.98                                          &ckTokenNumber);
   30.99 -
  30.100 -    jSlotList = ckULongArrayToJLongArray(env, ckpSlotList, ckTokenNumber);
  30.101 +    if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
  30.102 +        jSlotList = ckULongArrayToJLongArray(env, ckpSlotList, ckTokenNumber);
  30.103 +    }
  30.104      free(ckpSlotList);
  30.105  
  30.106 -    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
  30.107 -
  30.108      return jSlotList ;
  30.109  }
  30.110  #endif
  30.111 @@ -380,10 +390,9 @@
  30.112      ckSlotID = jLongToCKULong(jSlotID);
  30.113  
  30.114      rv = (*ckpFunctions->C_GetSlotInfo)(ckSlotID, &ckSlotInfo);
  30.115 -    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
  30.116 -
  30.117 -    jSlotInfoObject = ckSlotInfoPtrToJSlotInfo(env, &ckSlotInfo);
  30.118 -
  30.119 +    if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
  30.120 +        jSlotInfoObject = ckSlotInfoPtrToJSlotInfo(env, &ckSlotInfo);
  30.121 +    }
  30.122      return jSlotInfoObject ;
  30.123  }
  30.124  
  30.125 @@ -410,28 +419,32 @@
  30.126  
  30.127      /* load CK_SLOT_INFO class */
  30.128      jSlotInfoClass = (*env)->FindClass(env, CLASS_SLOT_INFO);
  30.129 -    assert(jSlotInfoClass != 0);
  30.130 +    if (jSlotInfoClass == NULL) { return NULL; };
  30.131  
  30.132      /* load CK_SLOT_INFO constructor */
  30.133      jCtrId = (*env)->GetMethodID
  30.134        (env, jSlotInfoClass, "<init>",
  30.135         "([C[CJLsun/security/pkcs11/wrapper/CK_VERSION;Lsun/security/pkcs11/wrapper/CK_VERSION;)V");
  30.136 -    assert(jCtrId != 0);
  30.137 +    if (jCtrId == NULL) { return NULL; }
  30.138  
  30.139      /* prep all fields */
  30.140      jSlotDesc =
  30.141        ckUTF8CharArrayToJCharArray(env, &(ckpSlotInfo->slotDescription[0]), 64);
  30.142 +    if (jSlotDesc == NULL) { return NULL; }
  30.143      jVendor =
  30.144        ckUTF8CharArrayToJCharArray(env, &(ckpSlotInfo->manufacturerID[0]), 32);
  30.145 +    if (jVendor == NULL) { return NULL; }
  30.146      jFlags = ckULongToJLong(ckpSlotInfo->flags);
  30.147      jHardwareVer = ckVersionPtrToJVersion(env, &(ckpSlotInfo->hardwareVersion));
  30.148 +    if (jHardwareVer == NULL) { return NULL; }
  30.149      jFirmwareVer = ckVersionPtrToJVersion(env, &(ckpSlotInfo->firmwareVersion));
  30.150 +    if (jFirmwareVer == NULL) { return NULL; }
  30.151  
  30.152      /* create new CK_SLOT_INFO object */
  30.153      jSlotInfoObject = (*env)->NewObject
  30.154        (env, jSlotInfoClass, jCtrId, jSlotDesc, jVendor, jFlags,
  30.155         jHardwareVer, jFirmwareVer);
  30.156 -    assert(jSlotInfoObject != 0);
  30.157 +    if (jSlotInfoObject == NULL) { return NULL; }
  30.158  
  30.159      /* free local references */
  30.160      (*env)->DeleteLocalRef(env, jSlotInfoClass);
  30.161 @@ -460,7 +473,7 @@
  30.162  {
  30.163      CK_SLOT_ID ckSlotID;
  30.164      CK_TOKEN_INFO ckTokenInfo;
  30.165 -    jobject jInfoTokenObject;
  30.166 +    jobject jInfoTokenObject = NULL;
  30.167      CK_RV rv;
  30.168  
  30.169      CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
  30.170 @@ -469,10 +482,9 @@
  30.171      ckSlotID = jLongToCKULong(jSlotID);
  30.172  
  30.173      rv = (*ckpFunctions->C_GetTokenInfo)(ckSlotID, &ckTokenInfo);
  30.174 -    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
  30.175 -
  30.176 -    jInfoTokenObject = ckTokenInfoPtrToJTokenInfo(env, &ckTokenInfo);
  30.177 -
  30.178 +    if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
  30.179 +        jInfoTokenObject = ckTokenInfoPtrToJTokenInfo(env, &ckTokenInfo);
  30.180 +    }
  30.181      return jInfoTokenObject ;
  30.182  }
  30.183  
  30.184 @@ -512,21 +524,25 @@
  30.185  
  30.186      /* load CK_TOKEN_INFO class */
  30.187      jTokenInfoClass = (*env)->FindClass(env, CLASS_TOKEN_INFO);
  30.188 -    assert(jTokenInfoClass != 0);
  30.189 +    if (jTokenInfoClass == NULL)  { return NULL; };
  30.190  
  30.191      /* load CK_TOKEN_INFO constructor */
  30.192      jCtrId = (*env)->GetMethodID
  30.193        (env, jTokenInfoClass, "<init>",
  30.194         "([C[C[C[CJJJJJJJJJJJLsun/security/pkcs11/wrapper/CK_VERSION;Lsun/security/pkcs11/wrapper/CK_VERSION;[C)V");
  30.195 -    assert(jCtrId != 0);
  30.196 +    if (jCtrId == NULL)  { return NULL; };
  30.197  
  30.198      /* prep all fields */
  30.199      jLabel = ckUTF8CharArrayToJCharArray(env, &(ckpTokenInfo->label[0]), 32);
  30.200 +    if (jLabel == NULL)  { return NULL; };
  30.201      jVendor =
  30.202        ckUTF8CharArrayToJCharArray(env, &(ckpTokenInfo->manufacturerID[0]), 32);
  30.203 +    if (jVendor == NULL)  { return NULL; };
  30.204      jModel = ckUTF8CharArrayToJCharArray(env, &(ckpTokenInfo->model[0]), 16);
  30.205 +    if (jModel == NULL)  { return NULL; };
  30.206      jSerialNo =
  30.207        ckUTF8CharArrayToJCharArray(env, &(ckpTokenInfo->serialNumber[0]), 16);
  30.208 +    if (jSerialNo == NULL)  { return NULL; };
  30.209      jFlags = ckULongToJLong(ckpTokenInfo->flags);
  30.210      jMaxSnCnt = ckULongSpecialToJLong(ckpTokenInfo->ulMaxSessionCount);
  30.211      jSnCnt = ckULongSpecialToJLong(ckpTokenInfo->ulSessionCount);
  30.212 @@ -540,10 +556,13 @@
  30.213      jFreePrivMem = ckULongSpecialToJLong(ckpTokenInfo->ulFreePrivateMemory);
  30.214      jHardwareVer =
  30.215        ckVersionPtrToJVersion(env, &(ckpTokenInfo->hardwareVersion));
  30.216 +    if (jHardwareVer == NULL) { return NULL; }
  30.217      jFirmwareVer =
  30.218        ckVersionPtrToJVersion(env, &(ckpTokenInfo->firmwareVersion));
  30.219 +    if (jFirmwareVer == NULL) { return NULL; }
  30.220      jUtcTime =
  30.221        ckUTF8CharArrayToJCharArray(env, &(ckpTokenInfo->utcTime[0]), 16);
  30.222 +    if (jUtcTime == NULL) { return NULL; }
  30.223  
  30.224      /* create new CK_TOKEN_INFO object */
  30.225      jTokenInfoObject =
  30.226 @@ -553,7 +572,7 @@
  30.227                          jMaxPinLen, jMinPinLen,
  30.228                          jTotalPubMem, jFreePubMem, jTotalPrivMem, jFreePrivMem,
  30.229                          jHardwareVer, jFirmwareVer, jUtcTime);
  30.230 -    assert(jTokenInfoObject != 0);
  30.231 +    if (jTokenInfoObject == NULL) { return NULL; }
  30.232  
  30.233      /* free local references */
  30.234      (*env)->DeleteLocalRef(env, jTokenInfoClass);
  30.235 @@ -584,7 +603,7 @@
  30.236  {
  30.237      CK_FLAGS ckFlags;
  30.238      CK_SLOT_ID ckSlotID;
  30.239 -    jlong jSlotID;
  30.240 +    jlong jSlotID = 0L;
  30.241      CK_RV rv;
  30.242  
  30.243      CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
  30.244 @@ -593,9 +612,9 @@
  30.245      ckFlags = jLongToCKULong(jFlags);
  30.246  
  30.247      rv = (*ckpFunctions->C_WaitForSlotEvent)(ckFlags, &ckSlotID, NULL_PTR);
  30.248 -    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return 0L; }
  30.249 -
  30.250 -    jSlotID = ckULongToJLong(ckSlotID);
  30.251 +    if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
  30.252 +        jSlotID = ckULongToJLong(ckSlotID);
  30.253 +    }
  30.254  
  30.255      return jSlotID ;
  30.256  }
  30.257 @@ -632,16 +651,19 @@
  30.258  
  30.259      ckpMechanismList = (CK_MECHANISM_TYPE_PTR)
  30.260        malloc(ckMechanismNumber * sizeof(CK_MECHANISM_TYPE));
  30.261 +    if (ckpMechanismList == NULL) {
  30.262 +        JNU_ThrowOutOfMemoryError(env, 0);
  30.263 +        return NULL;
  30.264 +    }
  30.265  
  30.266      rv = (*ckpFunctions->C_GetMechanismList)(ckSlotID, ckpMechanismList,
  30.267                                               &ckMechanismNumber);
  30.268 -
  30.269 -    jMechanismList = ckULongArrayToJLongArray(env, ckpMechanismList,
  30.270 -                                              ckMechanismNumber);
  30.271 +    if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
  30.272 +        jMechanismList = ckULongArrayToJLongArray(env, ckpMechanismList,
  30.273 +                                                  ckMechanismNumber);
  30.274 +    }
  30.275      free(ckpMechanismList);
  30.276  
  30.277 -    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
  30.278 -
  30.279      return jMechanismList ;
  30.280  }
  30.281  #endif
  30.282 @@ -663,7 +685,7 @@
  30.283      CK_SLOT_ID ckSlotID;
  30.284      CK_MECHANISM_TYPE ckMechanismType;
  30.285      CK_MECHANISM_INFO ckMechanismInfo;
  30.286 -    jobject jMechanismInfo;
  30.287 +    jobject jMechanismInfo = NULL;
  30.288      CK_RV rv;
  30.289  
  30.290      CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
  30.291 @@ -674,10 +696,9 @@
  30.292  
  30.293      rv = (*ckpFunctions->C_GetMechanismInfo)(ckSlotID, ckMechanismType,
  30.294                                               &ckMechanismInfo);
  30.295 -    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
  30.296 -
  30.297 -    jMechanismInfo = ckMechanismInfoPtrToJMechanismInfo(env, &ckMechanismInfo);
  30.298 -
  30.299 +    if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
  30.300 +        jMechanismInfo = ckMechanismInfoPtrToJMechanismInfo(env, &ckMechanismInfo);
  30.301 +    }
  30.302      return jMechanismInfo ;
  30.303  }
  30.304  
  30.305 @@ -703,11 +724,11 @@
  30.306  
  30.307      /* load CK_MECHANISM_INFO class */
  30.308      jMechanismInfoClass = (*env)->FindClass(env, CLASS_MECHANISM_INFO);
  30.309 -    assert(jMechanismInfoClass != 0);
  30.310 +    if (jMechanismInfoClass == NULL) { return NULL; };
  30.311  
  30.312      /* load CK_MECHANISM_INFO constructor */
  30.313      jCtrId = (*env)->GetMethodID(env, jMechanismInfoClass, "<init>", "(JJJ)V");
  30.314 -    assert(jCtrId != 0);
  30.315 +    if (jCtrId == NULL) { return NULL; };
  30.316  
  30.317      /* prep all fields */
  30.318      jMinKeySize = ckULongToJLong(ckpMechanismInfo->ulMinKeySize);
  30.319 @@ -717,7 +738,7 @@
  30.320      /* create new CK_MECHANISM_INFO object */
  30.321      jMechanismInfoObject = (*env)->NewObject(env, jMechanismInfoClass, jCtrId,
  30.322                                               jMinKeySize, jMaxKeySize, jFlags);
  30.323 -    assert(jMechanismInfoObject != 0);
  30.324 +    if (jMechanismInfoObject == NULL) { return NULL; };
  30.325  
  30.326      /* free local references */
  30.327      (*env)->DeleteLocalRef(env, jMechanismInfoClass);
  30.328 @@ -753,8 +774,13 @@
  30.329  
  30.330      ckSlotID = jLongToCKULong(jSlotID);
  30.331      jCharArrayToCKCharArray(env, jPin, &ckpPin, &ckPinLength);
  30.332 +    if ((*env)->ExceptionCheck(env)) { return; }
  30.333 +    /* ckLabelLength <= 32 !!! */
  30.334      jCharArrayToCKUTF8CharArray(env, jLabel, &ckpLabel, &ckLabelLength);
  30.335 -    /* ckLabelLength <= 32 !!! */
  30.336 +    if ((*env)->ExceptionCheck(env)) {
  30.337 +        free(ckpPin);
  30.338 +        return;
  30.339 +    }
  30.340  
  30.341      rv = (*ckpFunctions->C_InitToken)(ckSlotID, ckpPin, ckPinLength, ckpLabel);
  30.342      TRACE1("InitToken return code: %d", rv);
  30.343 @@ -790,6 +816,7 @@
  30.344  
  30.345      ckSessionHandle = jLongToCKULong(jSessionHandle);
  30.346      jCharArrayToCKCharArray(env, jPin, &ckpPin, &ckPinLength);
  30.347 +    if ((*env)->ExceptionCheck(env)) { return; }
  30.348  
  30.349      rv = (*ckpFunctions->C_InitPIN)(ckSessionHandle, ckpPin, ckPinLength);
  30.350  
  30.351 @@ -828,7 +855,12 @@
  30.352  
  30.353      ckSessionHandle = jLongToCKULong(jSessionHandle);
  30.354      jCharArrayToCKCharArray(env, jOldPin, &ckpOldPin, &ckOldPinLength);
  30.355 +    if ((*env)->ExceptionCheck(env)) { return; }
  30.356      jCharArrayToCKCharArray(env, jNewPin, &ckpNewPin, &ckNewPinLength);
  30.357 +    if ((*env)->ExceptionCheck(env)) {
  30.358 +        free(ckpOldPin);
  30.359 +        return;
  30.360 +    }
  30.361  
  30.362      rv = (*ckpFunctions->C_SetPIN)(ckSessionHandle, ckpOldPin, ckOldPinLength,
  30.363                                     ckpNewPin, ckNewPinLength);
    31.1 --- a/src/share/native/sun/security/pkcs11/wrapper/p11_keymgmt.c	Tue Mar 17 13:44:08 2009 -0700
    31.2 +++ b/src/share/native/sun/security/pkcs11/wrapper/p11_keymgmt.c	Tue Mar 17 13:45:01 2009 -0700
    31.3 @@ -1,5 +1,5 @@
    31.4  /*
    31.5 - * Portions Copyright 2003-2006 Sun Microsystems, Inc.  All Rights Reserved.
    31.6 + * Portions Copyright 2003-2009 Sun Microsystems, Inc.  All Rights Reserved.
    31.7   */
    31.8  
    31.9  /* Copyright  (c) 2002 Graz University of Technology. All rights reserved.
   31.10 @@ -74,7 +74,7 @@
   31.11      CK_ATTRIBUTE_PTR ckpAttributes = NULL_PTR;
   31.12      CK_ULONG ckAttributesLength;
   31.13      CK_OBJECT_HANDLE ckKeyHandle;
   31.14 -    jlong jKeyHandle;
   31.15 +    jlong jKeyHandle = 0L;
   31.16      CK_ULONG i;
   31.17      CK_RV rv;
   31.18  
   31.19 @@ -83,21 +83,23 @@
   31.20  
   31.21      ckSessionHandle = jLongToCKULong(jSessionHandle);
   31.22      jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
   31.23 -    if ((*env)->ExceptionOccurred(env)) { return 0L ; }
   31.24 +    if ((*env)->ExceptionCheck(env)) { return 0L ; }
   31.25 +
   31.26      jAttributeArrayToCKAttributeArray(env, jTemplate, &ckpAttributes, &ckAttributesLength);
   31.27 +    if ((*env)->ExceptionCheck(env)) {
   31.28 +        if (ckMechanism.pParameter != NULL_PTR) {
   31.29 +            free(ckMechanism.pParameter);
   31.30 +        }
   31.31 +        return 0L;
   31.32 +    }
   31.33  
   31.34      rv = (*ckpFunctions->C_GenerateKey)(ckSessionHandle, &ckMechanism, ckpAttributes, ckAttributesLength, &ckKeyHandle);
   31.35  
   31.36 -    jKeyHandle = ckULongToJLong(ckKeyHandle);
   31.37 -    for(i=0; i<ckAttributesLength; i++) {
   31.38 -        if(ckpAttributes[i].pValue != NULL_PTR) {
   31.39 -            free(ckpAttributes[i].pValue);
   31.40 -        }
   31.41 -    }
   31.42 -    free(ckpAttributes);
   31.43 +    if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
   31.44 +        jKeyHandle = ckULongToJLong(ckKeyHandle);
   31.45  
   31.46 -    /* cheack, if we must give a initialization vector back to Java */
   31.47 -    switch (ckMechanism.mechanism) {
   31.48 +        /* cheack, if we must give a initialization vector back to Java */
   31.49 +        switch (ckMechanism.mechanism) {
   31.50          case CKM_PBE_MD2_DES_CBC:
   31.51          case CKM_PBE_MD5_DES_CBC:
   31.52          case CKM_PBE_MD5_CAST_CBC:
   31.53 @@ -109,13 +111,13 @@
   31.54              /* we must copy back the initialization vector to the jMechanism object */
   31.55              copyBackPBEInitializationVector(env, &ckMechanism, jMechanism);
   31.56              break;
   31.57 +        }
   31.58      }
   31.59  
   31.60 -    if(ckMechanism.pParameter != NULL_PTR) {
   31.61 +    if (ckMechanism.pParameter != NULL_PTR) {
   31.62          free(ckMechanism.pParameter);
   31.63      }
   31.64 -
   31.65 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return 0L ; }
   31.66 +    freeCKAttributeArray(ckpAttributes, ckAttributesLength);
   31.67  
   31.68      return jKeyHandle ;
   31.69  }
   31.70 @@ -158,40 +160,53 @@
   31.71  
   31.72      ckSessionHandle = jLongToCKULong(jSessionHandle);
   31.73      jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
   31.74 -    jAttributeArrayToCKAttributeArray(env, jPublicKeyTemplate, &ckpPublicKeyAttributes, &ckPublicKeyAttributesLength);
   31.75 -    jAttributeArrayToCKAttributeArray(env, jPrivateKeyTemplate, &ckpPrivateKeyAttributes, &ckPrivateKeyAttributesLength);
   31.76 +    if ((*env)->ExceptionCheck(env)) { return NULL; }
   31.77 +
   31.78      ckpKeyHandles = (CK_OBJECT_HANDLE_PTR) malloc(2 * sizeof(CK_OBJECT_HANDLE));
   31.79 +    if (ckpKeyHandles == NULL) {
   31.80 +        if (ckMechanism.pParameter != NULL_PTR) {
   31.81 +            free(ckMechanism.pParameter);
   31.82 +        }
   31.83 +        JNU_ThrowOutOfMemoryError(env, 0);
   31.84 +        return NULL;
   31.85 +    }
   31.86      ckpPublicKeyHandle = ckpKeyHandles;   /* first element of array is Public Key */
   31.87      ckpPrivateKeyHandle = (ckpKeyHandles + 1);  /* second element of array is Private Key */
   31.88  
   31.89 +    jAttributeArrayToCKAttributeArray(env, jPublicKeyTemplate, &ckpPublicKeyAttributes, &ckPublicKeyAttributesLength);
   31.90 +    if ((*env)->ExceptionCheck(env)) {
   31.91 +        if (ckMechanism.pParameter != NULL_PTR) {
   31.92 +            free(ckMechanism.pParameter);
   31.93 +        }
   31.94 +        free(ckpKeyHandles);
   31.95 +        return NULL;
   31.96 +    }
   31.97 +
   31.98 +    jAttributeArrayToCKAttributeArray(env, jPrivateKeyTemplate, &ckpPrivateKeyAttributes, &ckPrivateKeyAttributesLength);
   31.99 +    if ((*env)->ExceptionCheck(env)) {
  31.100 +        if (ckMechanism.pParameter != NULL_PTR) {
  31.101 +            free(ckMechanism.pParameter);
  31.102 +        }
  31.103 +        free(ckpKeyHandles);
  31.104 +        freeCKAttributeArray(ckpPublicKeyAttributes, ckPublicKeyAttributesLength);
  31.105 +        return NULL;
  31.106 +    }
  31.107 +
  31.108      rv = (*ckpFunctions->C_GenerateKeyPair)(ckSessionHandle, &ckMechanism,
  31.109                       ckpPublicKeyAttributes, ckPublicKeyAttributesLength,
  31.110                       ckpPrivateKeyAttributes, ckPrivateKeyAttributesLength,
  31.111                       ckpPublicKeyHandle, ckpPrivateKeyHandle);
  31.112  
  31.113 -    jKeyHandles = ckULongArrayToJLongArray(env, ckpKeyHandles, 2);
  31.114 -
  31.115 -    for(i=0; i<ckPublicKeyAttributesLength; i++) {
  31.116 -        if(ckpPublicKeyAttributes[i].pValue != NULL_PTR) {
  31.117 -            free(ckpPublicKeyAttributes[i].pValue);
  31.118 -        }
  31.119 +    if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
  31.120 +        jKeyHandles = ckULongArrayToJLongArray(env, ckpKeyHandles, 2);
  31.121      }
  31.122 -    free(ckpPublicKeyAttributes);
  31.123 -
  31.124 -    for(i=0; i<ckPrivateKeyAttributesLength; i++) {
  31.125 -        if(ckpPrivateKeyAttributes[i].pValue != NULL_PTR) {
  31.126 -            free(ckpPrivateKeyAttributes[i].pValue);
  31.127 -        }
  31.128 -    }
  31.129 -    free(ckpPrivateKeyAttributes);
  31.130  
  31.131      if(ckMechanism.pParameter != NULL_PTR) {
  31.132          free(ckMechanism.pParameter);
  31.133      }
  31.134 -
  31.135      free(ckpKeyHandles);
  31.136 -
  31.137 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL; }
  31.138 +    freeCKAttributeArray(ckpPublicKeyAttributes, ckPublicKeyAttributesLength);
  31.139 +    freeCKAttributeArray(ckpPrivateKeyAttributes, ckPrivateKeyAttributesLength);
  31.140  
  31.141      return jKeyHandles ;
  31.142  }
  31.143 @@ -217,7 +232,7 @@
  31.144      CK_MECHANISM ckMechanism;
  31.145      CK_OBJECT_HANDLE ckWrappingKeyHandle;
  31.146      CK_OBJECT_HANDLE ckKeyHandle;
  31.147 -    jbyteArray jWrappedKey;
  31.148 +    jbyteArray jWrappedKey = NULL;
  31.149      CK_RV rv;
  31.150      CK_BYTE BUF[MAX_STACK_BUFFER_LEN];
  31.151      CK_BYTE_PTR ckpWrappedKey = BUF;
  31.152 @@ -228,24 +243,32 @@
  31.153  
  31.154      ckSessionHandle = jLongToCKULong(jSessionHandle);
  31.155      jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
  31.156 +    if ((*env)->ExceptionCheck(env)) { return NULL; }
  31.157 +
  31.158      ckWrappingKeyHandle = jLongToCKULong(jWrappingKeyHandle);
  31.159      ckKeyHandle = jLongToCKULong(jKeyHandle);
  31.160  
  31.161      rv = (*ckpFunctions->C_WrapKey)(ckSessionHandle, &ckMechanism, ckWrappingKeyHandle, ckKeyHandle, ckpWrappedKey, &ckWrappedKeyLength);
  31.162      if (rv == CKR_BUFFER_TOO_SMALL) {
  31.163          ckpWrappedKey = (CK_BYTE_PTR) malloc(ckWrappedKeyLength);
  31.164 +        if (ckpWrappedKey == NULL) {
  31.165 +            if (ckMechanism.pParameter != NULL_PTR) {
  31.166 +                free(ckMechanism.pParameter);
  31.167 +            }
  31.168 +            JNU_ThrowOutOfMemoryError(env, 0);
  31.169 +            return NULL;
  31.170 +        }
  31.171 +
  31.172          rv = (*ckpFunctions->C_WrapKey)(ckSessionHandle, &ckMechanism, ckWrappingKeyHandle, ckKeyHandle, ckpWrappedKey, &ckWrappedKeyLength);
  31.173      }
  31.174      if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
  31.175          jWrappedKey = ckByteArrayToJByteArray(env, ckpWrappedKey, ckWrappedKeyLength);
  31.176      }
  31.177  
  31.178 -    if (ckpWrappedKey != BUF) {
  31.179 -        free(ckpWrappedKey);
  31.180 +    if (ckpWrappedKey != BUF) { free(ckpWrappedKey); }
  31.181 +    if (ckMechanism.pParameter != NULL_PTR) {
  31.182 +        free(ckMechanism.pParameter);
  31.183      }
  31.184 -    if(ckMechanism.pParameter != NULL_PTR)
  31.185 -        free(ckMechanism.pParameter);
  31.186 -
  31.187      return jWrappedKey ;
  31.188  }
  31.189  #endif
  31.190 @@ -277,7 +300,7 @@
  31.191      CK_ATTRIBUTE_PTR ckpAttributes = NULL_PTR;
  31.192      CK_ULONG ckAttributesLength;
  31.193      CK_OBJECT_HANDLE ckKeyHandle;
  31.194 -    jlong jKeyHandle;
  31.195 +    jlong jKeyHandle = 0L;
  31.196      CK_ULONG i;
  31.197      CK_RV rv;
  31.198  
  31.199 @@ -286,37 +309,48 @@
  31.200  
  31.201      ckSessionHandle = jLongToCKULong(jSessionHandle);
  31.202      jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
  31.203 +    if ((*env)->ExceptionCheck(env)) { return 0L; }
  31.204 +
  31.205      ckUnwrappingKeyHandle = jLongToCKULong(jUnwrappingKeyHandle);
  31.206      jByteArrayToCKByteArray(env, jWrappedKey, &ckpWrappedKey, &ckWrappedKeyLength);
  31.207 +    if ((*env)->ExceptionCheck(env)) {
  31.208 +        if (ckMechanism.pParameter != NULL_PTR) {
  31.209 +            free(ckMechanism.pParameter);
  31.210 +        }
  31.211 +        return 0L;
  31.212 +    }
  31.213 +
  31.214      jAttributeArrayToCKAttributeArray(env, jTemplate, &ckpAttributes, &ckAttributesLength);
  31.215 +    if ((*env)->ExceptionCheck(env)) {
  31.216 +        if (ckMechanism.pParameter != NULL_PTR) {
  31.217 +            free(ckMechanism.pParameter);
  31.218 +        }
  31.219 +        free(ckpWrappedKey);
  31.220 +        return 0L;
  31.221 +    }
  31.222 +
  31.223  
  31.224      rv = (*ckpFunctions->C_UnwrapKey)(ckSessionHandle, &ckMechanism, ckUnwrappingKeyHandle,
  31.225                   ckpWrappedKey, ckWrappedKeyLength,
  31.226                   ckpAttributes, ckAttributesLength, &ckKeyHandle);
  31.227  
  31.228 -    jKeyHandle = ckLongToJLong(ckKeyHandle);
  31.229 -
  31.230 -    for(i=0; i<ckAttributesLength; i++) {
  31.231 -        if(ckpAttributes[i].pValue != NULL_PTR) {
  31.232 -            free(ckpAttributes[i].pValue);
  31.233 -        }
  31.234 -    }
  31.235 -    free(ckpAttributes);
  31.236 +    if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
  31.237 +        jKeyHandle = ckLongToJLong(ckKeyHandle);
  31.238  
  31.239  #if 0
  31.240 -    /* cheack, if we must give a initialization vector back to Java */
  31.241 -    if (ckMechanism.mechanism == CKM_KEY_WRAP_SET_OAEP) {
  31.242 -        /* we must copy back the unwrapped key info to the jMechanism object */
  31.243 -        copyBackSetUnwrappedKey(env, &ckMechanism, jMechanism);
  31.244 +        /* cheack, if we must give a initialization vector back to Java */
  31.245 +        if (ckMechanism.mechanism == CKM_KEY_WRAP_SET_OAEP) {
  31.246 +            /* we must copy back the unwrapped key info to the jMechanism object */
  31.247 +            copyBackSetUnwrappedKey(env, &ckMechanism, jMechanism);
  31.248 +        }
  31.249 +#endif
  31.250      }
  31.251 -#endif
  31.252  
  31.253 -    free(ckpWrappedKey);
  31.254 -    if(ckMechanism.pParameter != NULL_PTR) {
  31.255 +    if (ckMechanism.pParameter != NULL_PTR) {
  31.256          free(ckMechanism.pParameter);
  31.257      }
  31.258 -
  31.259 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return 0L ; }
  31.260 +    freeCKAttributeArray(ckpAttributes, ckAttributesLength);
  31.261 +    free(ckpWrappedKey);
  31.262  
  31.263      return jKeyHandle ;
  31.264  }
  31.265 @@ -360,8 +394,7 @@
  31.266   */
  31.267  void copyBackTLSPrfParams(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism)
  31.268  {
  31.269 -    jclass jMechanismClass= (*env)->FindClass(env, CLASS_MECHANISM);
  31.270 -    jclass jTLSPrfParamsClass = (*env)->FindClass(env, CLASS_TLS_PRF_PARAMS);
  31.271 +    jclass jMechanismClass, jTLSPrfParamsClass;
  31.272      CK_TLS_PRF_PARAMS *ckTLSPrfParams;
  31.273      jobject jTLSPrfParams;
  31.274      jfieldID fieldID;
  31.275 @@ -374,8 +407,10 @@
  31.276      int i;
  31.277  
  31.278      /* get mechanism */
  31.279 +    jMechanismClass = (*env)->FindClass(env, CLASS_MECHANISM);
  31.280 +    if (jMechanismClass == NULL) { return; }
  31.281      fieldID = (*env)->GetFieldID(env, jMechanismClass, "mechanism", "J");
  31.282 -    assert(fieldID != 0);
  31.283 +    if (fieldID == NULL) { return; }
  31.284      jMechanismType = (*env)->GetLongField(env, jMechanism, fieldID);
  31.285      ckMechanismType = jLongToCKULong(jMechanismType);
  31.286      if (ckMechanismType != ckMechanism->mechanism) {
  31.287 @@ -388,12 +423,14 @@
  31.288      if (ckTLSPrfParams != NULL_PTR) {
  31.289          /* get the Java CK_TLS_PRF_PARAMS object (pParameter) */
  31.290          fieldID = (*env)->GetFieldID(env, jMechanismClass, "pParameter", "Ljava/lang/Object;");
  31.291 -        assert(fieldID != 0);
  31.292 +        if (fieldID == NULL) { return; }
  31.293          jTLSPrfParams = (*env)->GetObjectField(env, jMechanism, fieldID);
  31.294  
  31.295          /* copy back the client IV */
  31.296 +        jTLSPrfParamsClass = (*env)->FindClass(env, CLASS_TLS_PRF_PARAMS);
  31.297 +        if (jTLSPrfParamsClass == NULL) { return; }
  31.298          fieldID = (*env)->GetFieldID(env, jTLSPrfParamsClass, "pOutput", "[B");
  31.299 -        assert(fieldID != 0);
  31.300 +        if (fieldID == NULL) { return; }
  31.301          jOutput = (*env)->GetObjectField(env, jTLSPrfParams, fieldID);
  31.302          output = ckTLSPrfParams->pOutput;
  31.303  
  31.304 @@ -402,26 +439,21 @@
  31.305          if (jOutput != NULL) {
  31.306              jLength = (*env)->GetArrayLength(env, jOutput);
  31.307              jBytes = (*env)->GetByteArrayElements(env, jOutput, NULL);
  31.308 +            if (jBytes == NULL) { return; }
  31.309 +
  31.310              /* copy the bytes to the Java buffer */
  31.311              for (i=0; i < jLength; i++) {
  31.312                  jBytes[i] = ckByteToJByte(output[i]);
  31.313              }
  31.314              /* copy back the Java buffer to the object */
  31.315              (*env)->ReleaseByteArrayElements(env, jOutput, jBytes, 0);
  31.316 -            // free malloc'd data
  31.317 -            free(output);
  31.318          }
  31.319  
  31.320          // free malloc'd data
  31.321 -        if (ckTLSPrfParams->pSeed != NULL) {
  31.322 -            free(ckTLSPrfParams->pSeed);
  31.323 -        }
  31.324 -        if (ckTLSPrfParams->pLabel != NULL) {
  31.325 -            free(ckTLSPrfParams->pLabel);
  31.326 -        }
  31.327 -        if (ckTLSPrfParams->pulOutputLen != NULL) {
  31.328 -            free(ckTLSPrfParams->pulOutputLen);
  31.329 -        }
  31.330 +        free(ckTLSPrfParams->pSeed);
  31.331 +        free(ckTLSPrfParams->pLabel);
  31.332 +        free(ckTLSPrfParams->pulOutputLen);
  31.333 +        free(ckTLSPrfParams->pOutput);
  31.334      }
  31.335  }
  31.336  
  31.337 @@ -456,8 +488,16 @@
  31.338  
  31.339      ckSessionHandle = jLongToCKULong(jSessionHandle);
  31.340      jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
  31.341 +    if ((*env)->ExceptionCheck(env)) { return 0L; }
  31.342 +
  31.343      ckBaseKeyHandle = jLongToCKULong(jBaseKeyHandle);
  31.344      jAttributeArrayToCKAttributeArray(env, jTemplate, &ckpAttributes, &ckAttributesLength);
  31.345 +    if ((*env)->ExceptionCheck(env)) {
  31.346 +        if (ckMechanism.pParameter != NULL_PTR) {
  31.347 +            free(ckMechanism.pParameter);
  31.348 +        }
  31.349 +        return 0L;
  31.350 +    }
  31.351  
  31.352      switch (ckMechanism.mechanism) {
  31.353      case CKM_SSL3_KEY_AND_MAC_DERIVE:
  31.354 @@ -476,14 +516,8 @@
  31.355                   ckpAttributes, ckAttributesLength, phKey);
  31.356  
  31.357      jKeyHandle = ckLongToJLong(ckKeyHandle);
  31.358 -    for(i=0; i<ckAttributesLength; i++) {
  31.359 -        if(ckpAttributes[i].pValue != NULL_PTR) {
  31.360 -            free(ckpAttributes[i].pValue);
  31.361 -        }
  31.362 -    }
  31.363 -    if (ckpAttributes != NULL) {
  31.364 -        free(ckpAttributes);
  31.365 -    }
  31.366 +
  31.367 +    freeCKAttributeArray(ckpAttributes, ckAttributesLength);
  31.368  
  31.369      switch (ckMechanism.mechanism) {
  31.370      case CKM_SSL3_MASTER_KEY_DERIVE:
  31.371 @@ -512,11 +546,10 @@
  31.372          break;
  31.373      }
  31.374  
  31.375 -    if(ckMechanism.pParameter != NULL_PTR) {
  31.376 +    if (ckMechanism.pParameter != NULL_PTR) {
  31.377          free(ckMechanism.pParameter);
  31.378      }
  31.379 -
  31.380 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return 0L ; }
  31.381 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return 0L ; }
  31.382  
  31.383      return jKeyHandle ;
  31.384  }
  31.385 @@ -529,9 +562,7 @@
  31.386   */
  31.387  void copyBackClientVersion(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism)
  31.388  {
  31.389 -  jclass jMechanismClass= (*env)->FindClass(env, CLASS_MECHANISM);
  31.390 -  jclass jSSL3MasterKeyDeriveParamsClass = (*env)->FindClass(env, CLASS_SSL3_MASTER_KEY_DERIVE_PARAMS);
  31.391 -  jclass jVersionClass = (*env)->FindClass(env, CLASS_VERSION);
  31.392 +  jclass jMechanismClass, jSSL3MasterKeyDeriveParamsClass, jVersionClass;
  31.393    CK_SSL3_MASTER_KEY_DERIVE_PARAMS *ckSSL3MasterKeyDeriveParams;
  31.394    CK_VERSION *ckVersion;
  31.395    jfieldID fieldID;
  31.396 @@ -541,8 +572,10 @@
  31.397    jobject jVersion;
  31.398  
  31.399    /* get mechanism */
  31.400 +  jMechanismClass = (*env)->FindClass(env, CLASS_MECHANISM);
  31.401 +  if (jMechanismClass == NULL) { return; }
  31.402    fieldID = (*env)->GetFieldID(env, jMechanismClass, "mechanism", "J");
  31.403 -  assert(fieldID != 0);
  31.404 +  if (fieldID == NULL) { return; }
  31.405    jMechanismType = (*env)->GetLongField(env, jMechanism, fieldID);
  31.406    ckMechanismType = jLongToCKULong(jMechanismType);
  31.407    if (ckMechanismType != ckMechanism->mechanism) {
  31.408 @@ -558,27 +591,31 @@
  31.409      if (ckVersion != NULL_PTR) {
  31.410        /* get the Java CK_SSL3_MASTER_KEY_DERIVE_PARAMS (pParameter) */
  31.411        fieldID = (*env)->GetFieldID(env, jMechanismClass, "pParameter", "Ljava/lang/Object;");
  31.412 -      assert(fieldID != 0);
  31.413 +      if (fieldID == NULL) { return; }
  31.414 +
  31.415        jSSL3MasterKeyDeriveParams = (*env)->GetObjectField(env, jMechanism, fieldID);
  31.416  
  31.417        /* get the Java CK_VERSION */
  31.418 +      jSSL3MasterKeyDeriveParamsClass = (*env)->FindClass(env, CLASS_SSL3_MASTER_KEY_DERIVE_PARAMS);
  31.419 +      if (jSSL3MasterKeyDeriveParamsClass == NULL) { return; }
  31.420        fieldID = (*env)->GetFieldID(env, jSSL3MasterKeyDeriveParamsClass, "pVersion", "L"CLASS_VERSION";");
  31.421 -      assert(fieldID != 0);
  31.422 +      if (fieldID == NULL) { return; }
  31.423        jVersion = (*env)->GetObjectField(env, jSSL3MasterKeyDeriveParams, fieldID);
  31.424  
  31.425        /* now copy back the version from the native structure to the Java structure */
  31.426  
  31.427        /* copy back the major version */
  31.428 +      jVersionClass = (*env)->FindClass(env, CLASS_VERSION);
  31.429 +      if (jVersionClass == NULL) { return; }
  31.430        fieldID = (*env)->GetFieldID(env, jVersionClass, "major", "B");
  31.431 -      assert(fieldID != 0);
  31.432 +      if (fieldID == NULL) { return; }
  31.433        (*env)->SetByteField(env, jVersion, fieldID, ckByteToJByte(ckVersion->major));
  31.434  
  31.435        /* copy back the minor version */
  31.436        fieldID = (*env)->GetFieldID(env, jVersionClass, "minor", "B");
  31.437 -      assert(fieldID != 0);
  31.438 +      if (fieldID == NULL) { return; }
  31.439        (*env)->SetByteField(env, jVersion, fieldID, ckByteToJByte(ckVersion->minor));
  31.440      }
  31.441 -
  31.442    }
  31.443  }
  31.444  
  31.445 @@ -591,9 +628,7 @@
  31.446   */
  31.447  void copyBackSSLKeyMatParams(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism)
  31.448  {
  31.449 -  jclass jMechanismClass= (*env)->FindClass(env, CLASS_MECHANISM);
  31.450 -  jclass jSSL3KeyMatParamsClass = (*env)->FindClass(env, CLASS_SSL3_KEY_MAT_PARAMS);
  31.451 -  jclass jSSL3KeyMatOutClass = (*env)->FindClass(env, CLASS_SSL3_KEY_MAT_OUT);
  31.452 +  jclass jMechanismClass, jSSL3KeyMatParamsClass, jSSL3KeyMatOutClass;
  31.453    CK_SSL3_KEY_MAT_PARAMS *ckSSL3KeyMatParam;
  31.454    CK_SSL3_KEY_MAT_OUT *ckSSL3KeyMatOut;
  31.455    jfieldID fieldID;
  31.456 @@ -608,8 +643,10 @@
  31.457    int i;
  31.458  
  31.459    /* get mechanism */
  31.460 +  jMechanismClass= (*env)->FindClass(env, CLASS_MECHANISM);
  31.461 +  if (jMechanismClass == NULL) { return; }
  31.462    fieldID = (*env)->GetFieldID(env, jMechanismClass, "mechanism", "J");
  31.463 -  assert(fieldID != 0);
  31.464 +  if (fieldID == NULL) { return; }
  31.465    jMechanismType = (*env)->GetLongField(env, jMechanism, fieldID);
  31.466    ckMechanismType = jLongToCKULong(jMechanismType);
  31.467    if (ckMechanismType != ckMechanism->mechanism) {
  31.468 @@ -633,74 +670,78 @@
  31.469      if (ckSSL3KeyMatOut != NULL_PTR) {
  31.470        /* get the Java CK_SSL3_KEY_MAT_PARAMS (pParameter) */
  31.471        fieldID = (*env)->GetFieldID(env, jMechanismClass, "pParameter", "Ljava/lang/Object;");
  31.472 -      assert(fieldID != 0);
  31.473 +      if (fieldID == NULL) { return; }
  31.474        jSSL3KeyMatParam = (*env)->GetObjectField(env, jMechanism, fieldID);
  31.475  
  31.476        /* get the Java CK_SSL3_KEY_MAT_OUT */
  31.477 +      jSSL3KeyMatParamsClass = (*env)->FindClass(env, CLASS_SSL3_KEY_MAT_PARAMS);
  31.478 +      if (jSSL3KeyMatParamsClass == NULL) { return; }
  31.479        fieldID = (*env)->GetFieldID(env, jSSL3KeyMatParamsClass, "pReturnedKeyMaterial", "L"CLASS_SSL3_KEY_MAT_OUT";");
  31.480 -      assert(fieldID != 0);
  31.481 +      if (fieldID == NULL) { return; }
  31.482        jSSL3KeyMatOut = (*env)->GetObjectField(env, jSSL3KeyMatParam, fieldID);
  31.483  
  31.484        /* now copy back all the key handles and the initialization vectors */
  31.485        /* copy back client MAC secret handle */
  31.486 +      jSSL3KeyMatOutClass = (*env)->FindClass(env, CLASS_SSL3_KEY_MAT_OUT);
  31.487 +      if (jSSL3KeyMatOutClass == NULL) { return; }
  31.488        fieldID = (*env)->GetFieldID(env, jSSL3KeyMatOutClass, "hClientMacSecret", "J");
  31.489 -      assert(fieldID != 0);
  31.490 +      if (fieldID == NULL) { return; }
  31.491        (*env)->SetLongField(env, jSSL3KeyMatOut, fieldID, ckULongToJLong(ckSSL3KeyMatOut->hClientMacSecret));
  31.492  
  31.493        /* copy back server MAC secret handle */
  31.494        fieldID = (*env)->GetFieldID(env, jSSL3KeyMatOutClass, "hServerMacSecret", "J");
  31.495 -      assert(fieldID != 0);
  31.496 +      if (fieldID == NULL) { return; }
  31.497        (*env)->SetLongField(env, jSSL3KeyMatOut, fieldID, ckULongToJLong(ckSSL3KeyMatOut->hServerMacSecret));
  31.498  
  31.499        /* copy back client secret key handle */
  31.500        fieldID = (*env)->GetFieldID(env, jSSL3KeyMatOutClass, "hClientKey", "J");
  31.501 -      assert(fieldID != 0);
  31.502 +      if (fieldID == NULL) { return; }
  31.503        (*env)->SetLongField(env, jSSL3KeyMatOut, fieldID, ckULongToJLong(ckSSL3KeyMatOut->hClientKey));
  31.504  
  31.505        /* copy back server secret key handle */
  31.506        fieldID = (*env)->GetFieldID(env, jSSL3KeyMatOutClass, "hServerKey", "J");
  31.507 -      assert(fieldID != 0);
  31.508 +      if (fieldID == NULL) { return; }
  31.509        (*env)->SetLongField(env, jSSL3KeyMatOut, fieldID, ckULongToJLong(ckSSL3KeyMatOut->hServerKey));
  31.510  
  31.511        /* copy back the client IV */
  31.512        fieldID = (*env)->GetFieldID(env, jSSL3KeyMatOutClass, "pIVClient", "[B");
  31.513 -      assert(fieldID != 0);
  31.514 +      if (fieldID == NULL) { return; }
  31.515        jIV = (*env)->GetObjectField(env, jSSL3KeyMatOut, fieldID);
  31.516        iv = ckSSL3KeyMatOut->pIVClient;
  31.517  
  31.518        if (jIV != NULL) {
  31.519          jLength = (*env)->GetArrayLength(env, jIV);
  31.520          jBytes = (*env)->GetByteArrayElements(env, jIV, NULL);
  31.521 +        if (jBytes == NULL) { return; }
  31.522          /* copy the bytes to the Java buffer */
  31.523          for (i=0; i < jLength; i++) {
  31.524            jBytes[i] = ckByteToJByte(iv[i]);
  31.525          }
  31.526          /* copy back the Java buffer to the object */
  31.527          (*env)->ReleaseByteArrayElements(env, jIV, jBytes, 0);
  31.528 -        // free malloc'd data
  31.529 -        free(iv);
  31.530        }
  31.531 +      // free malloc'd data
  31.532 +      free(ckSSL3KeyMatOut->pIVClient);
  31.533  
  31.534        /* copy back the server IV */
  31.535        fieldID = (*env)->GetFieldID(env, jSSL3KeyMatOutClass, "pIVServer", "[B");
  31.536 -      assert(fieldID != 0);
  31.537 +      if (fieldID == NULL) { return; }
  31.538        jIV = (*env)->GetObjectField(env, jSSL3KeyMatOut, fieldID);
  31.539        iv = ckSSL3KeyMatOut->pIVServer;
  31.540  
  31.541        if (jIV != NULL) {
  31.542          jLength = (*env)->GetArrayLength(env, jIV);
  31.543          jBytes = (*env)->GetByteArrayElements(env, jIV, NULL);
  31.544 +        if (jBytes == NULL) { return; }
  31.545          /* copy the bytes to the Java buffer */
  31.546          for (i=0; i < jLength; i++) {
  31.547            jBytes[i] = ckByteToJByte(iv[i]);
  31.548          }
  31.549          /* copy back the Java buffer to the object */
  31.550          (*env)->ReleaseByteArrayElements(env, jIV, jBytes, 0);
  31.551 -        // free malloc'd data
  31.552 -        free(iv);
  31.553        }
  31.554 -
  31.555        // free malloc'd data
  31.556 +      free(ckSSL3KeyMatOut->pIVServer);
  31.557        free(ckSSL3KeyMatOut);
  31.558      }
  31.559    }
    32.1 --- a/src/share/native/sun/security/pkcs11/wrapper/p11_mutex.c	Tue Mar 17 13:44:08 2009 -0700
    32.2 +++ b/src/share/native/sun/security/pkcs11/wrapper/p11_mutex.c	Tue Mar 17 13:45:01 2009 -0700
    32.3 @@ -1,5 +1,5 @@
    32.4  /*
    32.5 - * Portions Copyright 2003 Sun Microsystems, Inc.  All Rights Reserved.
    32.6 + * Portions Copyright 2003-2009 Sun Microsystems, Inc.  All Rights Reserved.
    32.7   */
    32.8  
    32.9  /* Copyright  (c) 2002 Graz University of Technology. All rights reserved.
   32.10 @@ -76,7 +76,7 @@
   32.11  CK_C_INITIALIZE_ARGS_PTR makeCKInitArgsAdapter(JNIEnv *env, jobject jInitArgs)
   32.12  {
   32.13      CK_C_INITIALIZE_ARGS_PTR ckpInitArgs;
   32.14 -    jclass jInitArgsClass = (*env)->FindClass(env, CLASS_C_INITIALIZE_ARGS);
   32.15 +    jclass jInitArgsClass;
   32.16      jfieldID fieldID;
   32.17      jlong jFlags;
   32.18      jobject jReserved;
   32.19 @@ -91,10 +91,20 @@
   32.20  
   32.21      /* convert the Java InitArgs object to a pointer to a CK_C_INITIALIZE_ARGS structure */
   32.22      ckpInitArgs = (CK_C_INITIALIZE_ARGS_PTR) malloc(sizeof(CK_C_INITIALIZE_ARGS));
   32.23 +    if (ckpInitArgs == NULL) {
   32.24 +        JNU_ThrowOutOfMemoryError(env, 0);
   32.25 +        return NULL_PTR;
   32.26 +    }
   32.27  
   32.28      /* Set the mutex functions that will call the Java mutex functions, but
   32.29       * only set it, if the field is not null.
   32.30       */
   32.31 +    jInitArgsClass = (*env)->FindClass(env, CLASS_C_INITIALIZE_ARGS);
   32.32 +    if (jInitArgsClass == NULL) {
   32.33 +        free(ckpInitArgs);
   32.34 +        return NULL;
   32.35 +    }
   32.36 +
   32.37  #ifdef NO_CALLBACKS
   32.38      ckpInitArgs->CreateMutex = NULL_PTR;
   32.39      ckpInitArgs->DestroyMutex = NULL_PTR;
   32.40 @@ -102,22 +112,22 @@
   32.41      ckpInitArgs->UnlockMutex = NULL_PTR;
   32.42  #else
   32.43      fieldID = (*env)->GetFieldID(env, jInitArgsClass, "CreateMutex", "Lsun/security/pkcs11/wrapper/CK_CREATEMUTEX;");
   32.44 -    assert(fieldID != 0);
   32.45 +    if (fieldID == NULL) { return NULL; }
   32.46      jMutexHandler = (*env)->GetObjectField(env, jInitArgs, fieldID);
   32.47      ckpInitArgs->CreateMutex = (jMutexHandler != NULL) ? &callJCreateMutex : NULL_PTR;
   32.48  
   32.49      fieldID = (*env)->GetFieldID(env, jInitArgsClass, "DestroyMutex", "Lsun/security/pkcs11/wrapper/CK_DESTROYMUTEX;");
   32.50 -    assert(fieldID != 0);
   32.51 +    if (fieldID == NULL) { return NULL; }
   32.52      jMutexHandler = (*env)->GetObjectField(env, jInitArgs, fieldID);
   32.53      ckpInitArgs->DestroyMutex = (jMutexHandler != NULL) ? &callJDestroyMutex : NULL_PTR;
   32.54  
   32.55      fieldID = (*env)->GetFieldID(env, jInitArgsClass, "LockMutex", "Lsun/security/pkcs11/wrapper/CK_LOCKMUTEX;");
   32.56 -    assert(fieldID != 0);
   32.57 +    if (fieldID == NULL) { return NULL; }
   32.58      jMutexHandler = (*env)->GetObjectField(env, jInitArgs, fieldID);
   32.59      ckpInitArgs->LockMutex = (jMutexHandler != NULL) ? &callJLockMutex : NULL_PTR;
   32.60  
   32.61      fieldID = (*env)->GetFieldID(env, jInitArgsClass, "UnlockMutex", "Lsun/security/pkcs11/wrapper/CK_UNLOCKMUTEX;");
   32.62 -    assert(fieldID != 0);
   32.63 +    if (fieldID == NULL) { return NULL; }
   32.64      jMutexHandler = (*env)->GetObjectField(env, jInitArgs, fieldID);
   32.65      ckpInitArgs->UnlockMutex = (jMutexHandler != NULL) ? &callJUnlockMutex : NULL_PTR;
   32.66  
   32.67 @@ -129,19 +139,25 @@
   32.68          /* set the global object jInitArgs so that the right Java mutex functions will be called */
   32.69          jInitArgsObject = (*env)->NewGlobalRef(env, jInitArgs);
   32.70          ckpGlobalInitArgs = (CK_C_INITIALIZE_ARGS_PTR) malloc(sizeof(CK_C_INITIALIZE_ARGS));
   32.71 +        if (ckpGlobalInitArgs == NULL) {
   32.72 +            free(ckpInitArgs);
   32.73 +            JNU_ThrowOutOfMemoryError(env, 0);
   32.74 +            return NULL_PTR;
   32.75 +        }
   32.76 +
   32.77          memcpy(ckpGlobalInitArgs, ckpInitArgs, sizeof(CK_C_INITIALIZE_ARGS));
   32.78      }
   32.79  #endif /* NO_CALLBACKS */
   32.80  
   32.81      /* convert and set the flags field */
   32.82      fieldID = (*env)->GetFieldID(env, jInitArgsClass, "flags", "J");
   32.83 -    assert(fieldID != 0);
   32.84 +    if (fieldID == NULL) { return NULL; }
   32.85      jFlags = (*env)->GetLongField(env, jInitArgs, fieldID);
   32.86      ckpInitArgs->flags = jLongToCKULong(jFlags);
   32.87  
   32.88      /* pReserved should be NULL_PTR in this version */
   32.89      fieldID = (*env)->GetFieldID(env, jInitArgsClass, "pReserved", "Ljava/lang/Object;");
   32.90 -    assert(fieldID != 0);
   32.91 +    if (fieldID == NULL) { return NULL; }
   32.92      jReserved = (*env)->GetObjectField(env, jInitArgs, fieldID);
   32.93  
   32.94      /* we try to convert the reserved parameter also */
   32.95 @@ -201,20 +217,21 @@
   32.96          wasAttached = 1;
   32.97      }
   32.98  
   32.99 -
  32.100      jCreateMutexClass = (*env)->FindClass(env, CLASS_CREATEMUTEX);
  32.101 +    if (jCreateMutexClass == NULL) { return rv; }
  32.102      jInitArgsClass = (*env)->FindClass(env, CLASS_C_INITIALIZE_ARGS);
  32.103 +    if (jInitArgsClass == NULL) { return rv; }
  32.104  
  32.105      /* get the CreateMutex object out of the jInitArgs object */
  32.106      fieldID = (*env)->GetFieldID(env, jInitArgsClass, "CreateMutex", "Lsun/security/pkcs11/wrapper/CK_CREATEMUTEX;");
  32.107 -    assert(fieldID != 0);
  32.108 +    if (fieldID == NULL) { return rv; }
  32.109      jCreateMutex = (*env)->GetObjectField(env, jInitArgsObject, fieldID);
  32.110      assert(jCreateMutex != 0);
  32.111  
  32.112      /* call the CK_CREATEMUTEX function of the CreateMutex object */
  32.113      /* and get the new Java mutex object */
  32.114      methodID = (*env)->GetMethodID(env, jCreateMutexClass, "CK_CREATEMUTEX", "()Ljava/lang/Object;");
  32.115 -    assert(methodID != 0);
  32.116 +    if (methodID == NULL) { return rv; }
  32.117      jMutex = (*env)->CallObjectMethod(env, jCreateMutex, methodID);
  32.118  
  32.119      /* set a global reference on the Java mutex */
  32.120 @@ -227,10 +244,13 @@
  32.121      pkcs11Exception = (*env)->ExceptionOccurred(env);
  32.122  
  32.123      if (pkcs11Exception != NULL) {
  32.124 +        /* TBD: clear the pending exception with ExceptionClear? */
  32.125          /* The was an exception thrown, now we get the error-code from it */
  32.126          pkcs11ExceptionClass = (*env)->FindClass(env, CLASS_PKCS11EXCEPTION);
  32.127 +        if (pkcs11ExceptionClass == NULL) { return rv; }
  32.128          methodID = (*env)->GetMethodID(env, pkcs11ExceptionClass, "getErrorCode", "()J");
  32.129 -        assert(methodID != 0);
  32.130 +        if (methodID == NULL) { return rv; }
  32.131 +
  32.132          errorCode = (*env)->CallLongMethod(env, pkcs11Exception, methodID);
  32.133          rv = jLongToCKULong(errorCode);
  32.134      }
  32.135 @@ -292,22 +312,23 @@
  32.136          wasAttached = 1;
  32.137      }
  32.138  
  32.139 -
  32.140      jDestroyMutexClass = (*env)->FindClass(env, CLASS_DESTROYMUTEX);
  32.141 +    if (jDestroyMutexClass == NULL) { return rv; }
  32.142      jInitArgsClass = (*env)->FindClass(env, CLASS_C_INITIALIZE_ARGS);
  32.143 +    if (jInitArgsClass == NULL) { return rv; }
  32.144  
  32.145      /* convert the CK mutex to a Java mutex */
  32.146      jMutex = ckVoidPtrToJObject(pMutex);
  32.147  
  32.148      /* get the DestroyMutex object out of the jInitArgs object */
  32.149      fieldID = (*env)->GetFieldID(env, jInitArgsClass, "DestroyMutex", "Lsun/security/pkcs11/wrapper/CK_DESTROYMUTEX;");
  32.150 -    assert(fieldID != 0);
  32.151 +    if (fieldID == NULL) { return rv; }
  32.152      jDestroyMutex = (*env)->GetObjectField(env, jInitArgsObject, fieldID);
  32.153      assert(jDestroyMutex != 0);
  32.154  
  32.155      /* call the CK_DESTROYMUTEX method of the DestroyMutex object */
  32.156      methodID = (*env)->GetMethodID(env, jDestroyMutexClass, "CK_DESTROYMUTEX", "(Ljava/lang/Object;)V");
  32.157 -    assert(methodID != 0);
  32.158 +    if (methodID == NULL) { return rv; }
  32.159      (*env)->CallVoidMethod(env, jDestroyMutex, methodID, jMutex);
  32.160  
  32.161      /* delete the global reference on the Java mutex */
  32.162 @@ -318,10 +339,12 @@
  32.163      pkcs11Exception = (*env)->ExceptionOccurred(env);
  32.164  
  32.165      if (pkcs11Exception != NULL) {
  32.166 +        /* TBD: clear the pending exception with ExceptionClear? */
  32.167          /* The was an exception thrown, now we get the error-code from it */
  32.168          pkcs11ExceptionClass = (*env)->FindClass(env, CLASS_PKCS11EXCEPTION);
  32.169 +        if (pkcs11ExceptionClass == NULL) { return rv; }
  32.170          methodID = (*env)->GetMethodID(env, pkcs11ExceptionClass, "getErrorCode", "()J");
  32.171 -        assert(methodID != 0);
  32.172 +        if (methodID == NULL) { return rv; }
  32.173          errorCode = (*env)->CallLongMethod(env, pkcs11Exception, methodID);
  32.174          rv = jLongToCKULong(errorCode);
  32.175      }
  32.176 @@ -383,33 +406,35 @@
  32.177          wasAttached = 1;
  32.178      }
  32.179  
  32.180 -
  32.181      jLockMutexClass = (*env)->FindClass(env, CLASS_LOCKMUTEX);
  32.182 +    if (jLockMutexClass == NULL) { return rv; }
  32.183      jInitArgsClass = (*env)->FindClass(env, CLASS_C_INITIALIZE_ARGS);
  32.184 +    if (jInitArgsClass == NULL) { return rv; }
  32.185  
  32.186      /* convert the CK mutex to a Java mutex */
  32.187      jMutex = ckVoidPtrToJObject(pMutex);
  32.188  
  32.189      /* get the LockMutex object out of the jInitArgs object */
  32.190      fieldID = (*env)->GetFieldID(env, jInitArgsClass, "LockMutex", "Lsun/security/pkcs11/wrapper/CK_LOCKMUTEX;");
  32.191 -    assert(fieldID != 0);
  32.192 +    if (fieldID == NULL) { return rv; }
  32.193      jLockMutex = (*env)->GetObjectField(env, jInitArgsObject, fieldID);
  32.194      assert(jLockMutex != 0);
  32.195  
  32.196      /* call the CK_LOCKMUTEX method of the LockMutex object */
  32.197      methodID = (*env)->GetMethodID(env, jLockMutexClass, "CK_LOCKMUTEX", "(Ljava/lang/Object;)V");
  32.198 -    assert(methodID != 0);
  32.199 +    if (methodID == NULL) { return rv; }
  32.200      (*env)->CallVoidMethod(env, jLockMutex, methodID, jMutex);
  32.201  
  32.202 -
  32.203      /* check, if callback threw an exception */
  32.204      pkcs11Exception = (*env)->ExceptionOccurred(env);
  32.205  
  32.206      if (pkcs11Exception != NULL) {
  32.207 +        /* TBD: clear the pending exception with ExceptionClear? */
  32.208          /* The was an exception thrown, now we get the error-code from it */
  32.209          pkcs11ExceptionClass = (*env)->FindClass(env, CLASS_PKCS11EXCEPTION);
  32.210 +        if (pkcs11ExceptionClass == NULL) { return rv; }
  32.211          methodID = (*env)->GetMethodID(env, pkcs11ExceptionClass, "getErrorCode", "()J");
  32.212 -        assert(methodID != 0);
  32.213 +        if (methodID == NULL) { return rv; }
  32.214          errorCode = (*env)->CallLongMethod(env, pkcs11Exception, methodID);
  32.215          rv = jLongToCKULong(errorCode);
  32.216      }
  32.217 @@ -471,33 +496,35 @@
  32.218          wasAttached = 1;
  32.219      }
  32.220  
  32.221 -
  32.222      jUnlockMutexClass = (*env)->FindClass(env, CLASS_UNLOCKMUTEX);
  32.223 +    if (jUnlockMutexClass == NULL) { return rv; }
  32.224      jInitArgsClass = (*env)->FindClass(env, CLASS_C_INITIALIZE_ARGS);
  32.225 +    if (jInitArgsClass == NULL) { return rv; }
  32.226  
  32.227      /* convert the CK-type mutex to a Java mutex */
  32.228      jMutex = ckVoidPtrToJObject(pMutex);
  32.229  
  32.230      /* get the UnlockMutex object out of the jInitArgs object */
  32.231      fieldID = (*env)->GetFieldID(env, jInitArgsClass, "UnlockMutex", "Lsun/security/pkcs11/wrapper/CK_UNLOCKMUTEX;");
  32.232 -    assert(fieldID != 0);
  32.233 +    if (fieldID == NULL) { return rv; }
  32.234      jUnlockMutex = (*env)->GetObjectField(env, jInitArgsObject, fieldID);
  32.235      assert(jUnlockMutex != 0);
  32.236  
  32.237      /* call the CK_UNLOCKMUTEX method of the UnLockMutex object */
  32.238      methodID = (*env)->GetMethodID(env, jUnlockMutexClass, "CK_UNLOCKMUTEX", "(Ljava/lang/Object;)V");
  32.239 -    assert(methodID != 0);
  32.240 +    if (methodID == NULL) { return rv; }
  32.241      (*env)->CallVoidMethod(env, jUnlockMutex, methodID, jMutex);
  32.242  
  32.243 -
  32.244      /* check, if callback threw an exception */
  32.245      pkcs11Exception = (*env)->ExceptionOccurred(env);
  32.246  
  32.247      if (pkcs11Exception != NULL) {
  32.248 +        /* TBD: clear the pending exception with ExceptionClear? */
  32.249          /* The was an exception thrown, now we get the error-code from it */
  32.250          pkcs11ExceptionClass = (*env)->FindClass(env, CLASS_PKCS11EXCEPTION);
  32.251 +        if (pkcs11ExceptionClass == NULL) { return rv; }
  32.252          methodID = (*env)->GetMethodID(env, pkcs11ExceptionClass, "getErrorCode", "()J");
  32.253 -        assert(methodID != 0);
  32.254 +        if (methodID == NULL) { return rv; }
  32.255          errorCode = (*env)->CallLongMethod(env, pkcs11Exception, methodID);
  32.256          rv = jLongToCKULong(errorCode);
  32.257      }
    33.1 --- a/src/share/native/sun/security/pkcs11/wrapper/p11_objmgmt.c	Tue Mar 17 13:44:08 2009 -0700
    33.2 +++ b/src/share/native/sun/security/pkcs11/wrapper/p11_objmgmt.c	Tue Mar 17 13:45:01 2009 -0700
    33.3 @@ -1,5 +1,5 @@
    33.4  /*
    33.5 - * Portions Copyright 2003 Sun Microsystems, Inc.  All Rights Reserved.
    33.6 + * Portions Copyright 2003-2009 Sun Microsystems, Inc.  All Rights Reserved.
    33.7   */
    33.8  
    33.9  /* Copyright  (c) 2002 Graz University of Technology. All rights reserved.
   33.10 @@ -81,16 +81,14 @@
   33.11  
   33.12      ckSessionHandle = jLongToCKULong(jSessionHandle);
   33.13      jAttributeArrayToCKAttributeArray(env, jTemplate, &ckpAttributes, &ckAttributesLength);
   33.14 +    if ((*env)->ExceptionCheck(env)) { return 0L; }
   33.15  
   33.16      rv = (*ckpFunctions->C_CreateObject)(ckSessionHandle, ckpAttributes, ckAttributesLength, &ckObjectHandle);
   33.17  
   33.18      jObjectHandle = ckULongToJLong(ckObjectHandle);
   33.19 -    for(i=0; i<ckAttributesLength; i++)
   33.20 -        if(ckpAttributes[i].pValue != NULL_PTR)
   33.21 -            free(ckpAttributes[i].pValue);
   33.22 -    free(ckpAttributes);
   33.23 +    freeCKAttributeArray(ckpAttributes, ckAttributesLength);
   33.24  
   33.25 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return 0L ; }
   33.26 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return 0L ; }
   33.27  
   33.28      return jObjectHandle ;
   33.29  }
   33.30 @@ -126,14 +124,12 @@
   33.31      ckSessionHandle = jLongToCKULong(jSessionHandle);
   33.32      ckObjectHandle = jLongToCKULong(jObjectHandle);
   33.33      jAttributeArrayToCKAttributeArray(env, jTemplate, &ckpAttributes, &ckAttributesLength);
   33.34 +    if ((*env)->ExceptionCheck(env)) { return 0L; }
   33.35  
   33.36      rv = (*ckpFunctions->C_CopyObject)(ckSessionHandle, ckObjectHandle, ckpAttributes, ckAttributesLength, &ckNewObjectHandle);
   33.37  
   33.38      jNewObjectHandle = ckULongToJLong(ckNewObjectHandle);
   33.39 -    for(i=0; i<ckAttributesLength; i++)
   33.40 -        if(ckpAttributes[i].pValue != NULL_PTR)
   33.41 -            free(ckpAttributes[i].pValue);
   33.42 -    free(ckpAttributes);
   33.43 +    freeCKAttributeArray(ckpAttributes, ckAttributesLength);
   33.44  
   33.45      if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return 0L ; }
   33.46  
   33.47 @@ -164,7 +160,7 @@
   33.48      ckObjectHandle = jLongToCKULong(jObjectHandle);
   33.49  
   33.50      rv = (*ckpFunctions->C_DestroyObject)(ckSessionHandle, ckObjectHandle);
   33.51 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
   33.52 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
   33.53  }
   33.54  #endif
   33.55  
   33.56 @@ -194,7 +190,7 @@
   33.57      ckObjectHandle = jLongToCKULong(jObjectHandle);
   33.58  
   33.59      rv = (*ckpFunctions->C_GetObjectSize)(ckSessionHandle, ckObjectHandle, &ckObjectSize);
   33.60 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return 0L ; }
   33.61 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return 0L ; }
   33.62  
   33.63      jObjectSize = ckULongToJLong(ckObjectSize);
   33.64  
   33.65 @@ -221,7 +217,7 @@
   33.66      CK_ATTRIBUTE_PTR ckpAttributes = NULL_PTR;
   33.67      CK_ULONG ckAttributesLength;
   33.68      CK_ULONG ckBufferLength;
   33.69 -    CK_ULONG i;
   33.70 +    CK_ULONG i, j;
   33.71      jobject jAttribute;
   33.72      CK_RV rv;
   33.73  
   33.74 @@ -238,19 +234,20 @@
   33.75      ckObjectHandle = jLongToCKULong(jObjectHandle);
   33.76      TRACE1("jAttributeArrayToCKAttributeArray now with jTemplate = %d", jTemplate);
   33.77      jAttributeArrayToCKAttributeArray(env, jTemplate, &ckpAttributes, &ckAttributesLength);
   33.78 +    if ((*env)->ExceptionCheck(env)) { return; }
   33.79 +
   33.80      TRACE2("DEBUG: jAttributeArrayToCKAttributeArray finished with ckpAttribute = %d, Length = %d\n", ckpAttributes, ckAttributesLength);
   33.81  
   33.82      /* first set all pValue to NULL, to get the needed buffer length */
   33.83      for(i = 0; i < ckAttributesLength; i++) {
   33.84 -        if(ckpAttributes[i].pValue != NULL_PTR) {
   33.85 +        if (ckpAttributes[i].pValue != NULL_PTR) {
   33.86              free(ckpAttributes[i].pValue);
   33.87 +            ckpAttributes[i].pValue = NULL_PTR;
   33.88          }
   33.89      }
   33.90 -    for (i = 0; i < ckAttributesLength; i++) {
   33.91 -        ckpAttributes[i].pValue = NULL_PTR;
   33.92 -    }
   33.93 +
   33.94      rv = (*ckpFunctions->C_GetAttributeValue)(ckSessionHandle, ckObjectHandle, ckpAttributes, ckAttributesLength);
   33.95 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
   33.96 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
   33.97          free(ckpAttributes);
   33.98          return ;
   33.99      }
  33.100 @@ -261,27 +258,34 @@
  33.101      for (i = 0; i < ckAttributesLength; i++) {
  33.102          ckBufferLength = sizeof(CK_BYTE) * ckpAttributes[i].ulValueLen;
  33.103          ckpAttributes[i].pValue = (void *) malloc(ckBufferLength);
  33.104 +        if (ckpAttributes[i].pValue == NULL) {
  33.105 +            freeCKAttributeArray(ckpAttributes, i);
  33.106 +            JNU_ThrowOutOfMemoryError(env, 0);
  33.107 +            return;
  33.108 +        }
  33.109          ckpAttributes[i].ulValueLen = ckBufferLength;
  33.110      }
  33.111  
  33.112      /* now get the attributes with all values */
  33.113      rv = (*ckpFunctions->C_GetAttributeValue)(ckSessionHandle, ckObjectHandle, ckpAttributes, ckAttributesLength);
  33.114  
  33.115 -    /* copy back the values to the Java attributes */
  33.116 -    for (i = 0; i < ckAttributesLength; i++) {
  33.117 -        jAttribute = ckAttributePtrToJAttribute(env, &(ckpAttributes[i]));
  33.118 -        (*env)->SetObjectArrayElement(env, jTemplate, i, jAttribute);
  33.119 -    }
  33.120 -
  33.121 -    for(i=0; i<ckAttributesLength; i++) {
  33.122 -        if(ckpAttributes[i].pValue != NULL_PTR) {
  33.123 -            free(ckpAttributes[i].pValue);
  33.124 +    if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
  33.125 +        /* copy back the values to the Java attributes */
  33.126 +        for (i = 0; i < ckAttributesLength; i++) {
  33.127 +            jAttribute = ckAttributePtrToJAttribute(env, &(ckpAttributes[i]));
  33.128 +            if (jAttribute == NULL) {
  33.129 +                freeCKAttributeArray(ckpAttributes, ckAttributesLength);
  33.130 +                return;
  33.131 +            }
  33.132 +            (*env)->SetObjectArrayElement(env, jTemplate, i, jAttribute);
  33.133 +            if ((*env)->ExceptionCheck(env)) {
  33.134 +                freeCKAttributeArray(ckpAttributes, ckAttributesLength);
  33.135 +                return;
  33.136 +            }
  33.137          }
  33.138      }
  33.139 -    free(ckpAttributes);
  33.140 +    freeCKAttributeArray(ckpAttributes, ckAttributesLength);
  33.141      TRACE0("FINISHED\n");
  33.142 -
  33.143 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return ; }
  33.144  }
  33.145  #endif
  33.146  
  33.147 @@ -312,15 +316,11 @@
  33.148      ckSessionHandle = jLongToCKULong(jSessionHandle);
  33.149      ckObjectHandle = jLongToCKULong(jObjectHandle);
  33.150      jAttributeArrayToCKAttributeArray(env, jTemplate, &ckpAttributes, &ckAttributesLength);
  33.151 +    if ((*env)->ExceptionCheck(env)) { return; }
  33.152  
  33.153      rv = (*ckpFunctions->C_SetAttributeValue)(ckSessionHandle, ckObjectHandle, ckpAttributes, ckAttributesLength);
  33.154  
  33.155 -    for(i=0; i<ckAttributesLength; i++) {
  33.156 -        if(ckpAttributes[i].pValue != NULL_PTR) {
  33.157 -            free(ckpAttributes[i].pValue);
  33.158 -        }
  33.159 -    }
  33.160 -    free(ckpAttributes);
  33.161 +    freeCKAttributeArray(ckpAttributes, ckAttributesLength);
  33.162  
  33.163      if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
  33.164  }
  33.165 @@ -355,15 +355,11 @@
  33.166  
  33.167      ckSessionHandle = jLongToCKULong(jSessionHandle);
  33.168      jAttributeArrayToCKAttributeArray(env, jTemplate, &ckpAttributes, &ckAttributesLength);
  33.169 +    if ((*env)->ExceptionCheck(env)) { return; }
  33.170  
  33.171      rv = (*ckpFunctions->C_FindObjectsInit)(ckSessionHandle, ckpAttributes, ckAttributesLength);
  33.172  
  33.173 -    for(i=0; i<ckAttributesLength; i++) {
  33.174 -        if(ckpAttributes[i].pValue != NULL_PTR) {
  33.175 -            free(ckpAttributes[i].pValue);
  33.176 -        }
  33.177 -    }
  33.178 -    free(ckpAttributes);
  33.179 +    freeCKAttributeArray(ckpAttributes, ckAttributesLength);
  33.180      TRACE0("FINISHED\n");
  33.181  
  33.182      if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
  33.183 @@ -397,14 +393,18 @@
  33.184      ckSessionHandle = jLongToCKULong(jSessionHandle);
  33.185      ckMaxObjectLength = jLongToCKULong(jMaxObjectCount);
  33.186      ckpObjectHandleArray = (CK_OBJECT_HANDLE_PTR) malloc(sizeof(CK_OBJECT_HANDLE) * ckMaxObjectLength);
  33.187 +    if (ckpObjectHandleArray == NULL) {
  33.188 +        JNU_ThrowOutOfMemoryError(env, 0);
  33.189 +        return NULL;
  33.190 +    }
  33.191  
  33.192      rv = (*ckpFunctions->C_FindObjects)(ckSessionHandle, ckpObjectHandleArray, ckMaxObjectLength, &ckActualObjectCount);
  33.193 +    if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
  33.194 +        jObjectHandleArray = ckULongArrayToJLongArray(env, ckpObjectHandleArray, ckActualObjectCount);
  33.195 +    }
  33.196  
  33.197 -    jObjectHandleArray = ckULongArrayToJLongArray(env, ckpObjectHandleArray, ckActualObjectCount);
  33.198      free(ckpObjectHandleArray);
  33.199  
  33.200 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
  33.201 -
  33.202      return jObjectHandleArray ;
  33.203  }
  33.204  #endif
    34.1 --- a/src/share/native/sun/security/pkcs11/wrapper/p11_sessmgmt.c	Tue Mar 17 13:44:08 2009 -0700
    34.2 +++ b/src/share/native/sun/security/pkcs11/wrapper/p11_sessmgmt.c	Tue Mar 17 13:45:01 2009 -0700
    34.3 @@ -1,5 +1,5 @@
    34.4  /*
    34.5 - * Portions Copyright 2003 Sun Microsystems, Inc.  All Rights Reserved.
    34.6 + * Portions Copyright 2003-2009 Sun Microsystems, Inc.  All Rights Reserved.
    34.7   */
    34.8  
    34.9  /* Copyright  (c) 2002 Graz University of Technology. All rights reserved.
   34.10 @@ -97,6 +97,10 @@
   34.11  #ifndef NO_CALLBACKS
   34.12      if (jNotify != NULL) {
   34.13          notifyEncapsulation = (NotifyEncapsulation *) malloc(sizeof(NotifyEncapsulation));
   34.14 +        if (notifyEncapsulation == NULL) {
   34.15 +            JNU_ThrowOutOfMemoryError(env, 0);
   34.16 +            return 0L;
   34.17 +        }
   34.18          notifyEncapsulation->jApplicationData = (jApplication != NULL)
   34.19                  ? (*env)->NewGlobalRef(env, jApplication)
   34.20                  : NULL;
   34.21 @@ -118,7 +122,18 @@
   34.22      TRACE0(" ... ");
   34.23  
   34.24      rv = (*ckpFunctions->C_OpenSession)(ckSlotID, ckFlags, ckpApplication, ckNotify, &ckSessionHandle);
   34.25 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return 0L ; }
   34.26 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
   34.27 +#ifndef NO_CALLBACKS
   34.28 +        if (notifyEncapsulation != NULL) {
   34.29 +            if (notifyEncapsulation->jApplicationData != NULL) {
   34.30 +                (*env)->DeleteGlobalRef(env, jApplication);
   34.31 +            }
   34.32 +            (*env)->DeleteGlobalRef(env, jNotify);
   34.33 +            free(notifyEncapsulation);
   34.34 +        }
   34.35 +#endif /* NO_CALLBACKS */
   34.36 +        return 0L;
   34.37 +    }
   34.38  
   34.39      TRACE0("got session");
   34.40      TRACE1(", SessionHandle=%u", ckSessionHandle);
   34.41 @@ -163,7 +178,7 @@
   34.42      ckSessionHandle = jLongToCKULong(jSessionHandle);
   34.43  
   34.44      rv = (*ckpFunctions->C_CloseSession)(ckSessionHandle);
   34.45 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
   34.46 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
   34.47  
   34.48  #ifndef NO_CALLBACKS
   34.49      notifyEncapsulation = removeNotifyEntry(env, ckSessionHandle);
   34.50 @@ -208,7 +223,7 @@
   34.51      ckSlotID = jLongToCKULong(jSlotID);
   34.52  
   34.53      rv = (*ckpFunctions->C_CloseAllSessions)(ckSlotID);
   34.54 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
   34.55 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
   34.56  
   34.57  #ifndef NO_CALLBACKS
   34.58      /* Remove all notify callback helper objects. */
   34.59 @@ -250,10 +265,9 @@
   34.60      ckSessionHandle = jLongToCKULong(jSessionHandle);
   34.61  
   34.62      rv = (*ckpFunctions->C_GetSessionInfo)(ckSessionHandle, &ckSessionInfo);
   34.63 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
   34.64 -
   34.65 -    jSessionInfo = ckSessionInfoPtrToJSessionInfo(env, &ckSessionInfo);
   34.66 -
   34.67 +    if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
   34.68 +        jSessionInfo = ckSessionInfoPtrToJSessionInfo(env, &ckSessionInfo);
   34.69 +    }
   34.70      return jSessionInfo ;
   34.71  }
   34.72  #endif
   34.73 @@ -274,7 +288,7 @@
   34.74      CK_SESSION_HANDLE ckSessionHandle;
   34.75      CK_BYTE_PTR ckpState;
   34.76      CK_ULONG ckStateLength;
   34.77 -    jbyteArray jState;
   34.78 +    jbyteArray jState = NULL;
   34.79      CK_RV rv;
   34.80  
   34.81      CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
   34.82 @@ -283,17 +297,20 @@
   34.83      ckSessionHandle = jLongToCKULong(jSessionHandle);
   34.84  
   34.85      rv = (*ckpFunctions->C_GetOperationState)(ckSessionHandle, NULL_PTR, &ckStateLength);
   34.86 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
   34.87 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
   34.88  
   34.89      ckpState = (CK_BYTE_PTR) malloc(ckStateLength);
   34.90 +    if (ckpState == NULL) {
   34.91 +        JNU_ThrowOutOfMemoryError(env, 0);
   34.92 +        return NULL;
   34.93 +    }
   34.94  
   34.95      rv = (*ckpFunctions->C_GetOperationState)(ckSessionHandle, ckpState, &ckStateLength);
   34.96 -
   34.97 -    jState = ckByteArrayToJByteArray(env, ckpState, ckStateLength);
   34.98 +    if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
   34.99 +        jState = ckByteArrayToJByteArray(env, ckpState, ckStateLength);
  34.100 +    }
  34.101      free(ckpState);
  34.102  
  34.103 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
  34.104 -
  34.105      return jState ;
  34.106  }
  34.107  #endif
  34.108 @@ -325,6 +342,8 @@
  34.109  
  34.110      ckSessionHandle = jLongToCKULong(jSessionHandle);
  34.111      jByteArrayToCKByteArray(env, jOperationState, &ckpState, &ckStateLength);
  34.112 +    if ((*env)->ExceptionCheck(env)) { return; }
  34.113 +
  34.114      ckEncryptionKeyHandle = jLongToCKULong(jEncryptionKeyHandle);
  34.115      ckAuthenticationKeyHandle = jLongToCKULong(jAuthenticationKeyHandle);
  34.116  
  34.117 @@ -332,7 +351,7 @@
  34.118  
  34.119      free(ckpState);
  34.120  
  34.121 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
  34.122 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
  34.123  }
  34.124  #endif
  34.125  
  34.126 @@ -362,12 +381,13 @@
  34.127      ckSessionHandle = jLongToCKULong(jSessionHandle);
  34.128      ckUserType = jLongToCKULong(jUserType);
  34.129      jCharArrayToCKCharArray(env, jPin, &ckpPinArray, &ckPinLength);
  34.130 +    if ((*env)->ExceptionCheck(env)) { return; }
  34.131  
  34.132      rv = (*ckpFunctions->C_Login)(ckSessionHandle, ckUserType, ckpPinArray, ckPinLength);
  34.133  
  34.134      free(ckpPinArray);
  34.135  
  34.136 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
  34.137 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
  34.138  }
  34.139  #endif
  34.140  
  34.141 @@ -391,7 +411,7 @@
  34.142      ckSessionHandle = jLongToCKULong(jSessionHandle);
  34.143  
  34.144      rv = (*ckpFunctions->C_Logout)(ckSessionHandle);
  34.145 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
  34.146 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
  34.147  }
  34.148  #endif
  34.149  
  34.150 @@ -410,10 +430,14 @@
  34.151      NotifyListNode *currentNode, *newNode;
  34.152  
  34.153      if (notifyEncapsulation == NULL) {
  34.154 -        return ;
  34.155 +        return;
  34.156      }
  34.157  
  34.158      newNode = (NotifyListNode *) malloc(sizeof(NotifyListNode));
  34.159 +    if (newNode == NULL) {
  34.160 +        JNU_ThrowOutOfMemoryError(env, 0);
  34.161 +        return;
  34.162 +    }
  34.163      newNode->hSession = hSession;
  34.164      newNode->notifyEncapsulation = notifyEncapsulation;
  34.165      newNode->next = NULL;
  34.166 @@ -578,9 +602,10 @@
  34.167      jEvent = ckULongToJLong(event);
  34.168  
  34.169      ckNotifyClass = (*env)->FindClass(env, CLASS_NOTIFY);
  34.170 -    assert(ckNotifyClass != 0);
  34.171 +    if (ckNotifyClass == NULL) { return rv; }
  34.172      jmethod = (*env)->GetMethodID(env, ckNotifyClass, "CK_NOTIFY", "(JJLjava/lang/Object;)V");
  34.173 -    assert(jmethod != 0);
  34.174 +    if (jmethod == NULL) { return rv; }
  34.175 +
  34.176      (*env)->CallVoidMethod(env, notifyEncapsulation->jNotifyObject, jmethod,
  34.177                           jSessionHandle, jEvent, notifyEncapsulation->jApplicationData);
  34.178  
  34.179 @@ -588,10 +613,14 @@
  34.180      pkcs11Exception = (*env)->ExceptionOccurred(env);
  34.181  
  34.182      if (pkcs11Exception != NULL) {
  34.183 +        /* TBD: clear the pending exception with ExceptionClear? */
  34.184          /* The was an exception thrown, now we get the error-code from it */
  34.185          pkcs11ExceptionClass = (*env)->FindClass(env, CLASS_PKCS11EXCEPTION);
  34.186 +        if (pkcs11ExceptionClass == NULL) { return rv; }
  34.187 +
  34.188          jmethod = (*env)->GetMethodID(env, pkcs11ExceptionClass, "getErrorCode", "()J");
  34.189 -        assert(jmethod != 0);
  34.190 +        if (jmethod == NULL) { return rv; }
  34.191 +
  34.192          errorCode = (*env)->CallLongMethod(env, pkcs11Exception, jmethod);
  34.193          rv = jLongToCKULong(errorCode);
  34.194      }
    35.1 --- a/src/share/native/sun/security/pkcs11/wrapper/p11_sign.c	Tue Mar 17 13:44:08 2009 -0700
    35.2 +++ b/src/share/native/sun/security/pkcs11/wrapper/p11_sign.c	Tue Mar 17 13:45:01 2009 -0700
    35.3 @@ -1,5 +1,5 @@
    35.4  /*
    35.5 - * Portions Copyright 2003-2005 Sun Microsystems, Inc.  All Rights Reserved.
    35.6 + * Portions Copyright 2003-2009 Sun Microsystems, Inc.  All Rights Reserved.
    35.7   */
    35.8  
    35.9  /* Copyright  (c) 2002 Graz University of Technology. All rights reserved.
   35.10 @@ -77,15 +77,16 @@
   35.11  
   35.12      ckSessionHandle = jLongToCKULong(jSessionHandle);
   35.13      jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
   35.14 +    if ((*env)->ExceptionCheck(env)) { return; }
   35.15      ckKeyHandle = jLongToCKULong(jKeyHandle);
   35.16  
   35.17      rv = (*ckpFunctions->C_SignInit)(ckSessionHandle, &ckMechanism, ckKeyHandle);
   35.18  
   35.19 -    if(ckMechanism.pParameter != NULL_PTR) {
   35.20 +    if (ckMechanism.pParameter != NULL_PTR) {
   35.21          free(ckMechanism.pParameter);
   35.22      }
   35.23  
   35.24 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
   35.25 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
   35.26  }
   35.27  #endif
   35.28  
   35.29 @@ -117,14 +118,23 @@
   35.30  
   35.31      ckSessionHandle = jLongToCKULong(jSessionHandle);
   35.32      jByteArrayToCKByteArray(env, jData, &ckpData, &ckDataLength);
   35.33 +    if ((*env)->ExceptionCheck(env)) { return NULL; }
   35.34  
   35.35      /* START standard code */
   35.36  
   35.37      /* first determine the length of the signature */
   35.38      rv = (*ckpFunctions->C_Sign)(ckSessionHandle, ckpData, ckDataLength, NULL_PTR, &ckSignatureLength);
   35.39 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
   35.40 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
   35.41 +        free(ckpData);
   35.42 +        return NULL;
   35.43 +    }
   35.44  
   35.45      ckpSignature = (CK_BYTE_PTR) malloc(ckSignatureLength * sizeof(CK_BYTE));
   35.46 +    if (ckpSignature == NULL) {
   35.47 +        free(ckpData);
   35.48 +        JNU_ThrowOutOfMemoryError(env, 0);
   35.49 +        return NULL;
   35.50 +    }
   35.51  
   35.52      /* now get the signature */
   35.53      rv = (*ckpFunctions->C_Sign)(ckSessionHandle, ckpData, ckDataLength, ckpSignature, &ckSignatureLength);
   35.54 @@ -134,22 +144,31 @@
   35.55      /* START workaround code for operation abort bug in pkcs#11 of Datakey and iButton */
   35.56  /*
   35.57      ckpSignature = (CK_BYTE_PTR) malloc(256 * sizeof(CK_BYTE));
   35.58 +    if (ckpSignature == NULL) {
   35.59 +        free(ckpData);
   35.60 +        JNU_ThrowOutOfMemoryError(env, 0);
   35.61 +        return NULL;
   35.62 +    }
   35.63      rv = (*ckpFunctions->C_Sign)(ckSessionHandle, ckpData, ckDataLength, ckpSignature, &ckSignatureLength);
   35.64  
   35.65      if (rv == CKR_BUFFER_TOO_SMALL) {
   35.66          free(ckpSignature);
   35.67          ckpSignature = (CK_BYTE_PTR) malloc(ckSignatureLength * sizeof(CK_BYTE));
   35.68 +        if (ckpSignature == NULL) {
   35.69 +            free(ckpData);
   35.70 +            JNU_ThrowOutOfMemoryError(env, 0);
   35.71 +            return NULL;
   35.72 +        }
   35.73          rv = (*ckpFunctions->C_Sign)(ckSessionHandle, ckpData, ckDataLength, ckpSignature, &ckSignatureLength);
   35.74      }
   35.75   */
   35.76      /* END workaround code */
   35.77 -
   35.78 -    jSignature = ckByteArrayToJByteArray(env, ckpSignature, ckSignatureLength);
   35.79 +    if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
   35.80 +        jSignature = ckByteArrayToJByteArray(env, ckpSignature, ckSignatureLength);
   35.81 +    }
   35.82      free(ckpData);
   35.83      free(ckpSignature);
   35.84  
   35.85 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
   35.86 -
   35.87      return jSignature ;
   35.88  }
   35.89  #endif
   35.90 @@ -189,14 +208,22 @@
   35.91          bufP = BUF;
   35.92      } else {
   35.93          bufLen = min(MAX_HEAP_BUFFER_LEN, jInLen);
   35.94 -        bufP = (CK_BYTE_PTR)malloc((size_t)bufLen);
   35.95 +        bufP = (CK_BYTE_PTR) malloc((size_t)bufLen);
   35.96 +        if (bufP == NULL) {
   35.97 +            JNU_ThrowOutOfMemoryError(env, 0);
   35.98 +            return;
   35.99 +        }
  35.100      }
  35.101  
  35.102      while (jInLen > 0) {
  35.103          jsize chunkLen = min(bufLen, jInLen);
  35.104          (*env)->GetByteArrayRegion(env, jIn, jInOfs, chunkLen, (jbyte *)bufP);
  35.105 +        if ((*env)->ExceptionCheck(env)) {
  35.106 +            if (bufP != BUF) { free(bufP); }
  35.107 +            return;
  35.108 +        }
  35.109          rv = (*ckpFunctions->C_SignUpdate)(ckSessionHandle, bufP, chunkLen);
  35.110 -        if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
  35.111 +        if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
  35.112              if (bufP != BUF) {
  35.113                  free(bufP);
  35.114              }
  35.115 @@ -206,9 +233,7 @@
  35.116          jInLen -= chunkLen;
  35.117      }
  35.118  
  35.119 -    if (bufP != BUF) {
  35.120 -        free(bufP);
  35.121 -    }
  35.122 +    if (bufP != BUF) { free(bufP); }
  35.123  }
  35.124  #endif
  35.125  
  35.126 @@ -244,15 +269,18 @@
  35.127      rv = (*ckpFunctions->C_SignFinal)(ckSessionHandle, bufP, &ckSignatureLength);
  35.128      if (rv == CKR_BUFFER_TOO_SMALL) {
  35.129          bufP = (CK_BYTE_PTR) malloc(ckSignatureLength);
  35.130 +        if (bufP == NULL) {
  35.131 +            JNU_ThrowOutOfMemoryError(env, 0);
  35.132 +            return NULL;
  35.133 +        }
  35.134          rv = (*ckpFunctions->C_SignFinal)(ckSessionHandle, bufP, &ckSignatureLength);
  35.135      }
  35.136      if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
  35.137          jSignature = ckByteArrayToJByteArray(env, bufP, ckSignatureLength);
  35.138      }
  35.139  
  35.140 -    if (bufP != BUF) {
  35.141 -        free(bufP);
  35.142 -    }
  35.143 +    if (bufP != BUF) { free(bufP); }
  35.144 +
  35.145      return jSignature;
  35.146  }
  35.147  #endif
  35.148 @@ -280,11 +308,13 @@
  35.149  
  35.150      ckSessionHandle = jLongToCKULong(jSessionHandle);
  35.151      jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
  35.152 +    if ((*env)->ExceptionCheck(env)) { return; }
  35.153 +
  35.154      ckKeyHandle = jLongToCKULong(jKeyHandle);
  35.155  
  35.156      rv = (*ckpFunctions->C_SignRecoverInit)(ckSessionHandle, &ckMechanism, ckKeyHandle);
  35.157  
  35.158 -    if(ckMechanism.pParameter != NULL_PTR) {
  35.159 +    if (ckMechanism.pParameter != NULL_PTR) {
  35.160          free(ckMechanism.pParameter);
  35.161      }
  35.162  
  35.163 @@ -323,26 +353,38 @@
  35.164      if (jInLen <= MAX_STACK_BUFFER_LEN) {
  35.165          inBufP = INBUF;
  35.166      } else {
  35.167 -        inBufP = (CK_BYTE_PTR)malloc((size_t)jInLen);
  35.168 +        inBufP = (CK_BYTE_PTR) malloc((size_t)jInLen);
  35.169 +        if (inBufP == NULL) {
  35.170 +            JNU_ThrowOutOfMemoryError(env, 0);
  35.171 +            return 0;
  35.172 +        }
  35.173      }
  35.174  
  35.175      (*env)->GetByteArrayRegion(env, jIn, jInOfs, jInLen, (jbyte *)inBufP);
  35.176 +    if ((*env)->ExceptionCheck(env)) {
  35.177 +        if (inBufP != INBUF) { free(inBufP); }
  35.178 +        return 0;
  35.179 +    }
  35.180      rv = (*ckpFunctions->C_SignRecover)(ckSessionHandle, inBufP, jInLen, outBufP, &ckSignatureLength);
  35.181      /* re-alloc larger buffer if it fits into our Java buffer */
  35.182      if ((rv == CKR_BUFFER_TOO_SMALL) && (ckSignatureLength <= jIntToCKULong(jOutLen))) {
  35.183          outBufP = (CK_BYTE_PTR) malloc(ckSignatureLength);
  35.184 +        if (outBufP == NULL) {
  35.185 +            if (inBufP != INBUF) {
  35.186 +                free(inBufP);
  35.187 +            }
  35.188 +            JNU_ThrowOutOfMemoryError(env, 0);
  35.189 +            return 0;
  35.190 +        }
  35.191          rv = (*ckpFunctions->C_SignRecover)(ckSessionHandle, inBufP, jInLen, outBufP, &ckSignatureLength);
  35.192      }
  35.193      if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
  35.194          (*env)->SetByteArrayRegion(env, jOut, jOutOfs, ckSignatureLength, (jbyte *)outBufP);
  35.195      }
  35.196  
  35.197 -    if (inBufP != INBUF) {
  35.198 -        free(inBufP);
  35.199 -    }
  35.200 -    if (outBufP != OUTBUF) {
  35.201 -        free(outBufP);
  35.202 -    }
  35.203 +    if (inBufP != INBUF) { free(inBufP); }
  35.204 +    if (outBufP != OUTBUF) { free(outBufP); }
  35.205 +
  35.206      return ckSignatureLength;
  35.207  }
  35.208  #endif
  35.209 @@ -370,6 +412,8 @@
  35.210  
  35.211      ckSessionHandle = jLongToCKULong(jSessionHandle);
  35.212      jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
  35.213 +    if ((*env)->ExceptionCheck(env)) { return; }
  35.214 +
  35.215      ckKeyHandle = jLongToCKULong(jKeyHandle);
  35.216  
  35.217      rv = (*ckpFunctions->C_VerifyInit)(ckSessionHandle, &ckMechanism, ckKeyHandle);
  35.218 @@ -378,7 +422,7 @@
  35.219          free(ckMechanism.pParameter);
  35.220      }
  35.221  
  35.222 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
  35.223 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
  35.224  }
  35.225  #endif
  35.226  
  35.227 @@ -409,7 +453,13 @@
  35.228  
  35.229      ckSessionHandle = jLongToCKULong(jSessionHandle);
  35.230      jByteArrayToCKByteArray(env, jData, &ckpData, &ckDataLength);
  35.231 +    if ((*env)->ExceptionCheck(env)) { return; }
  35.232 +
  35.233      jByteArrayToCKByteArray(env, jSignature, &ckpSignature, &ckSignatureLength);
  35.234 +    if ((*env)->ExceptionCheck(env)) {
  35.235 +        free(ckpData);
  35.236 +        return;
  35.237 +    }
  35.238  
  35.239      /* verify the signature */
  35.240      rv = (*ckpFunctions->C_Verify)(ckSessionHandle, ckpData, ckDataLength, ckpSignature, ckSignatureLength);
  35.241 @@ -417,7 +467,7 @@
  35.242      free(ckpData);
  35.243      free(ckpSignature);
  35.244  
  35.245 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
  35.246 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
  35.247  }
  35.248  #endif
  35.249  
  35.250 @@ -456,26 +506,31 @@
  35.251          bufP = BUF;
  35.252      } else {
  35.253          bufLen = min(MAX_HEAP_BUFFER_LEN, jInLen);
  35.254 -        bufP = (CK_BYTE_PTR)malloc((size_t)bufLen);
  35.255 +        bufP = (CK_BYTE_PTR) malloc((size_t)bufLen);
  35.256 +        if (bufP == NULL) {
  35.257 +            JNU_ThrowOutOfMemoryError(env, 0);
  35.258 +            return;
  35.259 +        }
  35.260      }
  35.261  
  35.262      while (jInLen > 0) {
  35.263          jsize chunkLen = min(bufLen, jInLen);
  35.264          (*env)->GetByteArrayRegion(env, jIn, jInOfs, chunkLen, (jbyte *)bufP);
  35.265 +        if ((*env)->ExceptionCheck(env)) {
  35.266 +            if (bufP != BUF) { free(bufP); }
  35.267 +            return;
  35.268 +        }
  35.269 +
  35.270          rv = (*ckpFunctions->C_VerifyUpdate)(ckSessionHandle, bufP, chunkLen);
  35.271 -        if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
  35.272 -            if (bufP != BUF) {
  35.273 -                free(bufP);
  35.274 -            }
  35.275 +        if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
  35.276 +            if (bufP != BUF) { free(bufP); }
  35.277              return;
  35.278          }
  35.279          jInOfs += chunkLen;
  35.280          jInLen -= chunkLen;
  35.281      }
  35.282  
  35.283 -    if (bufP != BUF) {
  35.284 -        free(bufP);
  35.285 -    }
  35.286 +    if (bufP != BUF) { free(bufP); }
  35.287  }
  35.288  #endif
  35.289  
  35.290 @@ -502,13 +557,14 @@
  35.291  
  35.292      ckSessionHandle = jLongToCKULong(jSessionHandle);
  35.293      jByteArrayToCKByteArray(env, jSignature, &ckpSignature, &ckSignatureLength);
  35.294 +    if ((*env)->ExceptionCheck(env)) { return; }
  35.295  
  35.296      /* verify the signature */
  35.297      rv = (*ckpFunctions->C_VerifyFinal)(ckSessionHandle, ckpSignature, ckSignatureLength);
  35.298  
  35.299      free(ckpSignature);
  35.300  
  35.301 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
  35.302 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
  35.303  }
  35.304  #endif
  35.305  
  35.306 @@ -535,15 +591,17 @@
  35.307  
  35.308      ckSessionHandle = jLongToCKULong(jSessionHandle);
  35.309      jMechanismToCKMechanism(env, jMechanism, &ckMechanism);
  35.310 +    if ((*env)->ExceptionCheck(env)) { return; }
  35.311 +
  35.312      ckKeyHandle = jLongToCKULong(jKeyHandle);
  35.313  
  35.314      rv = (*ckpFunctions->C_VerifyRecoverInit)(ckSessionHandle, &ckMechanism, ckKeyHandle);
  35.315  
  35.316 -    if(ckMechanism.pParameter != NULL_PTR) {
  35.317 +    if (ckMechanism.pParameter != NULL_PTR) {
  35.318          free(ckMechanism.pParameter);
  35.319      }
  35.320  
  35.321 -    if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
  35.322 +    if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
  35.323  }
  35.324  #endif
  35.325  
  35.326 @@ -578,26 +636,38 @@
  35.327      if (jInLen <= MAX_STACK_BUFFER_LEN) {
  35.328          inBufP = INBUF;
  35.329      } else {
  35.330 -        inBufP = (CK_BYTE_PTR)malloc((size_t)jInLen);
  35.331 +        inBufP = (CK_BYTE_PTR) malloc((size_t)jInLen);
  35.332 +        if (inBufP == NULL) {
  35.333 +            JNU_ThrowOutOfMemoryError(env, 0);
  35.334 +            return 0;
  35.335 +        }
  35.336      }
  35.337  
  35.338      (*env)->GetByteArrayRegion(env, jIn, jInOfs, jInLen, (jbyte *)inBufP);
  35.339 +    if ((*env)->ExceptionCheck(env)) {
  35.340 +        if (inBufP != INBUF) { free(inBufP); }
  35.341 +        return 0;
  35.342 +    }
  35.343 +
  35.344      rv = (*ckpFunctions->C_VerifyRecover)(ckSessionHandle, inBufP, jInLen, outBufP, &ckDataLength);
  35.345 +
  35.346      /* re-alloc larger buffer if it fits into our Java buffer */
  35.347      if ((rv == CKR_BUFFER_TOO_SMALL) && (ckDataLength <= jIntToCKULong(jOutLen))) {
  35.348          outBufP = (CK_BYTE_PTR) malloc(ckDataLength);
  35.349 +        if (outBufP == NULL) {
  35.350 +            if (inBufP != INBUF) { free(inBufP); }
  35.351 +            JNU_ThrowOutOfMemoryError(env, 0);
  35.352 +            return 0;
  35.353 +        }
  35.354          rv = (*ckpFunctions->C_VerifyRecover)(ckSessionHandle, inBufP, jInLen, outBufP, &ckDataLength);
  35.355      }
  35.356      if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
  35.357          (*env)->SetByteArrayRegion(env, jOut, jOutOfs, ckDataLength, (jbyte *)outBufP);
  35.358      }
  35.359  
  35.360 -    if (inBufP != INBUF) {
  35.361 -        free(inBufP);
  35.362 -    }
  35.363 -    if (outBufP != OUTBUF) {
  35.364 -        free(outBufP);
  35.365 -    }
  35.366 +    if (inBufP != INBUF) { free(inBufP); }
  35.367 +    if (outBufP != OUTBUF) { free(outBufP); }
  35.368 +
  35.369      return ckDataLength;
  35.370  }
  35.371  #endif
    36.1 --- a/src/share/native/sun/security/pkcs11/wrapper/p11_util.c	Tue Mar 17 13:44:08 2009 -0700
    36.2 +++ b/src/share/native/sun/security/pkcs11/wrapper/p11_util.c	Tue Mar 17 13:45:01 2009 -0700
    36.3 @@ -1,5 +1,5 @@
    36.4  /*
    36.5 - * Portions Copyright 2003 Sun Microsystems, Inc.  All Rights Reserved.
    36.6 + * Portions Copyright 2003-2009 Sun Microsystems, Inc.  All Rights Reserved.
    36.7   */
    36.8  
    36.9  /* Copyright  (c) 2002 Graz University of Technology. All rights reserved.
   36.10 @@ -73,11 +73,11 @@
   36.11      jmethodID jConstructor;
   36.12  
   36.13      jObjectClass = (*env)->FindClass(env, "java/lang/Object");
   36.14 -    assert(jObjectClass != 0);
   36.15 +    if (jObjectClass == NULL) { return NULL; }
   36.16      jConstructor = (*env)->GetMethodID(env, jObjectClass, "<init>", "()V");
   36.17 -    assert(jConstructor != 0);
   36.18 +    if (jConstructor == NULL) { return NULL; }
   36.19      jLockObject = (*env)->NewObject(env, jObjectClass, jConstructor);
   36.20 -    assert(jLockObject != 0);
   36.21 +    if (jLockObject == NULL) { return NULL; }
   36.22      jLockObject = (*env)->NewGlobalRef(env, jLockObject);
   36.23  
   36.24      return jLockObject ;
   36.25 @@ -200,84 +200,30 @@
   36.26          return 0L ;
   36.27      } else {
   36.28          jPKCS11ExceptionClass = (*env)->FindClass(env, CLASS_PKCS11EXCEPTION);
   36.29 -        assert(jPKCS11ExceptionClass != 0);
   36.30 -        jConstructor = (*env)->GetMethodID(env, jPKCS11ExceptionClass, "<init>", "(J)V");
   36.31 -        assert(jConstructor != 0);
   36.32 -        jErrorCode = ckULongToJLong(returnValue);
   36.33 -        jPKCS11Exception = (jthrowable) (*env)->NewObject(env, jPKCS11ExceptionClass, jConstructor, jErrorCode);
   36.34 -        (*env)->Throw(env, jPKCS11Exception);
   36.35 +        if (jPKCS11ExceptionClass != NULL) {
   36.36 +            jConstructor = (*env)->GetMethodID(env, jPKCS11ExceptionClass, "<init>", "(J)V");
   36.37 +            if (jConstructor != NULL) {
   36.38 +                jErrorCode = ckULongToJLong(returnValue);
   36.39 +                jPKCS11Exception = (jthrowable) (*env)->NewObject(env, jPKCS11ExceptionClass, jConstructor, jErrorCode);
   36.40 +                if (jPKCS11Exception != NULL) {
   36.41 +                    (*env)->Throw(env, jPKCS11Exception);
   36.42 +                }
   36.43 +            }
   36.44 +        }
   36.45 +        (*env)->DeleteLocalRef(env, jPKCS11ExceptionClass);
   36.46          return jErrorCode ;
   36.47      }
   36.48  }
   36.49  
   36.50  /*
   36.51 - * this function simply throws a FileNotFoundException
   36.52 - *
   36.53 - * @param env Used to call JNI funktions and to get the Exception class.
   36.54 - * @param jmessage The message string of the Exception object.
   36.55 - */
   36.56 -void throwFileNotFoundException(JNIEnv *env, jstring jmessage)
   36.57 -{
   36.58 -    jclass jFileNotFoundExceptionClass;
   36.59 -    jmethodID jConstructor;
   36.60 -    jthrowable jFileNotFoundException;
   36.61 -
   36.62 -    jFileNotFoundExceptionClass = (*env)->FindClass(env, CLASS_FILE_NOT_FOUND_EXCEPTION);
   36.63 -    assert(jFileNotFoundExceptionClass != 0);
   36.64 -
   36.65 -    jConstructor = (*env)->GetMethodID(env, jFileNotFoundExceptionClass, "<init>", "(Ljava/lang/String;)V");
   36.66 -    assert(jConstructor != 0);
   36.67 -    jFileNotFoundException = (jthrowable) (*env)->NewObject(env, jFileNotFoundExceptionClass, jConstructor, jmessage);
   36.68 -    (*env)->Throw(env, jFileNotFoundException);
   36.69 -}
   36.70 -
   36.71 -/*
   36.72 - * this function simply throws an IOException
   36.73 + * This function simply throws an IOException
   36.74   *
   36.75   * @param env Used to call JNI funktions and to get the Exception class.
   36.76   * @param message The message string of the Exception object.
   36.77   */
   36.78 -void throwIOException(JNIEnv *env, const char * message)
   36.79 +void throwIOException(JNIEnv *env, const char *message)
   36.80  {
   36.81 -    jclass jIOExceptionClass;
   36.82 -
   36.83 -    jIOExceptionClass = (*env)->FindClass(env, CLASS_IO_EXCEPTION);
   36.84 -    assert(jIOExceptionClass != 0);
   36.85 -
   36.86 -    (*env)->ThrowNew(env, jIOExceptionClass, message);
   36.87 -}
   36.88 -
   36.89 -/*
   36.90 - * this function simply throws an IOException and takes a unicode
   36.91 - * messge.
   36.92 - *
   36.93 - * @param env Used to call JNI funktions and to get the Exception class.
   36.94 - * @param message The unicode message string of the Exception object.
   36.95 - */
   36.96 -void throwIOExceptionUnicodeMessage(JNIEnv *env, const short *message)
   36.97 -{
   36.98 -    jclass jIOExceptionClass;
   36.99 -    jmethodID jConstructor;
  36.100 -    jthrowable jIOException;
  36.101 -    jstring jmessage;
  36.102 -    jsize length;
  36.103 -    short *currentCharacter;
  36.104 -
  36.105 -    jIOExceptionClass = (*env)->FindClass(env, CLASS_IO_EXCEPTION);
  36.106 -    assert(jIOExceptionClass != 0);
  36.107 -
  36.108 -    length = 0;
  36.109 -    if (message != NULL) {
  36.110 -        currentCharacter = (short *) message;
  36.111 -        while (*(currentCharacter++) != 0) length++;
  36.112 -    }
  36.113 -
  36.114 -    jmessage = (*env)->NewString(env, (const jchar *)message, length);
  36.115 -
  36.116 -    jConstructor = (*env)->GetMethodID(env, jIOExceptionClass, "<init>", "(Ljava/lang/String;)V");
  36.117 -    assert(jConstructor != 0);
  36.118 -    jIOException = (jthrowable) (*env)->NewObject(env, jIOExceptionClass, jConstructor, jmessage);
  36.119 -    (*env)->Throw(env, jIOException);
  36.120 +    JNU_ThrowByName(env, CLASS_IO_EXCEPTION, message);
  36.121  }
  36.122  
  36.123  /*
  36.124 @@ -288,26 +234,9 @@
  36.125   * @param env Used to call JNI funktions and to get the Exception class.
  36.126   * @param jmessage The message string of the Exception object.
  36.127   */
  36.128 -void throwPKCS11RuntimeException(JNIEnv *env, jstring jmessage)
  36.129 +void throwPKCS11RuntimeException(JNIEnv *env, const char *message)
  36.130  {
  36.131 -    jclass jPKCS11RuntimeExceptionClass;
  36.132 -    jmethodID jConstructor;
  36.133 -    jthrowable jPKCS11RuntimeException;
  36.134 -
  36.135 -    jPKCS11RuntimeExceptionClass = (*env)->FindClass(env, CLASS_PKCS11RUNTIMEEXCEPTION);
  36.136 -    assert(jPKCS11RuntimeExceptionClass != 0);
  36.137 -
  36.138 -    if (jmessage == NULL) {
  36.139 -        jConstructor = (*env)->GetMethodID(env, jPKCS11RuntimeExceptionClass, "<init>", "()V");
  36.140 -        assert(jConstructor != 0);
  36.141 -        jPKCS11RuntimeException = (jthrowable) (*env)->NewObject(env, jPKCS11RuntimeExceptionClass, jConstructor);
  36.142 -        (*env)->Throw(env, jPKCS11RuntimeException);
  36.143 -    } else {
  36.144 -        jConstructor = (*env)->GetMethodID(env, jPKCS11RuntimeExceptionClass, "<init>", "(Ljava/lang/String;)V");
  36.145 -        assert(jConstructor != 0);
  36.146 -        jPKCS11RuntimeException = (jthrowable) (*env)->NewObject(env, jPKCS11RuntimeExceptionClass, jConstructor, jmessage);
  36.147 -        (*env)->Throw(env, jPKCS11RuntimeException);
  36.148 -    }
  36.149 +    JNU_ThrowByName(env, CLASS_PKCS11RUNTIMEEXCEPTION, message);
  36.150  }
  36.151  
  36.152  /*
  36.153 @@ -318,9 +247,24 @@
  36.154   */
  36.155  void throwDisconnectedRuntimeException(JNIEnv *env)
  36.156  {
  36.157 -    jstring jExceptionMessage = (*env)->NewStringUTF(env, "This object is not connected to a module.");
  36.158 +    throwPKCS11RuntimeException(env, "This object is not connected to a module.");
  36.159 +}
  36.160  
  36.161 -    throwPKCS11RuntimeException(env, jExceptionMessage);
  36.162 +/* This function frees the specified CK_ATTRIBUTE array.
  36.163 + *
  36.164 + * @param attrPtr pointer to the to-be-freed CK_ATTRIBUTE array.
  36.165 + * @param len the length of the array
  36.166 + */
  36.167 +void freeCKAttributeArray(CK_ATTRIBUTE_PTR attrPtr, int len)
  36.168 +{
  36.169 +    int i;
  36.170 +
  36.171 +    for (i=0; i<len; i++) {
  36.172 +        if (attrPtr[i].pValue != NULL_PTR) {
  36.173 +            free(attrPtr[i].pValue);
  36.174 +        }
  36.175 +    }
  36.176 +    free(attrPtr);
  36.177  }
  36.178  
  36.179  /*
  36.180 @@ -375,8 +319,22 @@
  36.181      }
  36.182      *ckpLength = (*env)->GetArrayLength(env, jArray);
  36.183      jpTemp = (jboolean*) malloc((*ckpLength) * sizeof(jboolean));
  36.184 +    if (jpTemp == NULL) {
  36.185 +        JNU_ThrowOutOfMemoryError(env, 0);
  36.186 +        return;
  36.187 +    }
  36.188      (*env)->GetBooleanArrayRegion(env, jArray, 0, *ckpLength, jpTemp);
  36.189 +    if ((*env)->ExceptionCheck(env)) {
  36.190 +        free(jpTemp);
  36.191 +        return;
  36.192 +    }
  36.193 +
  36.194      *ckpArray = (CK_BBOOL*) malloc ((*ckpLength) * sizeof(CK_BBOOL));
  36.195 +    if (*ckpArray == NULL) {
  36.196 +        free(jpTemp);
  36.197 +        JNU_ThrowOutOfMemoryError(env, 0);
  36.198 +        return;
  36.199 +    }
  36.200      for (i=0; i<(*ckpLength); i++) {
  36.201          (*ckpArray)[i] = jBooleanToCKBBool(jpTemp[i]);
  36.202      }
  36.203 @@ -403,13 +361,26 @@
  36.204      }
  36.205      *ckpLength = (*env)->GetArrayLength(env, jArray);
  36.206      jpTemp = (jbyte*) malloc((*ckpLength) * sizeof(jbyte));
  36.207 +    if (jpTemp == NULL) {
  36.208 +        JNU_ThrowOutOfMemoryError(env, 0);
  36.209 +        return;
  36.210 +    }
  36.211      (*env)->GetByteArrayRegion(env, jArray, 0, *ckpLength, jpTemp);
  36.212 +    if ((*env)->ExceptionCheck(env)) {
  36.213 +        free(jpTemp);
  36.214 +        return;
  36.215 +    }
  36.216  
  36.217      /* if CK_BYTE is the same size as jbyte, we save an additional copy */
  36.218      if (sizeof(CK_BYTE) == sizeof(jbyte)) {
  36.219          *ckpArray = (CK_BYTE_PTR) jpTemp;
  36.220      } else {
  36.221          *ckpArray = (CK_BYTE_PTR) malloc ((*ckpLength) * sizeof(CK_BYTE));
  36.222 +        if (*ckpArray == NULL) {
  36.223 +            free(jpTemp);
  36.224 +            JNU_ThrowOutOfMemoryError(env, 0);
  36.225 +            return;
  36.226 +        }
  36.227          for (i=0; i<(*ckpLength); i++) {
  36.228              (*ckpArray)[i] = jByteToCKByte(jpTemp[i]);
  36.229          }
  36.230 @@ -437,8 +408,22 @@
  36.231      }
  36.232      *ckpLength = (*env)->GetArrayLength(env, jArray);
  36.233      jTemp = (jlong*) malloc((*ckpLength) * sizeof(jlong));
  36.234 +    if (jTemp == NULL) {
  36.235 +        JNU_ThrowOutOfMemoryError(env, 0);
  36.236 +        return;
  36.237 +    }
  36.238      (*env)->GetLongArrayRegion(env, jArray, 0, *ckpLength, jTemp);
  36.239 +    if ((*env)->ExceptionCheck(env)) {
  36.240 +        free(jTemp);
  36.241 +        return;
  36.242 +    }
  36.243 +
  36.244      *ckpArray = (CK_ULONG_PTR) malloc (*ckpLength * sizeof(CK_ULONG));
  36.245 +    if (*ckpArray == NULL) {
  36.246 +        free(jTemp);
  36.247 +        JNU_ThrowOutOfMemoryError(env, 0);
  36.248 +        return;
  36.249 +    }
  36.250      for (i=0; i<(*ckpLength); i++) {
  36.251          (*ckpArray)[i] = jLongToCKULong(jTemp[i]);
  36.252      }
  36.253 @@ -465,8 +450,22 @@
  36.254      }
  36.255      *ckpLength = (*env)->GetArrayLength(env, jArray);
  36.256      jpTemp = (jchar*) malloc((*ckpLength) * sizeof(jchar));
  36.257 +    if (jpTemp == NULL) {
  36.258 +        JNU_ThrowOutOfMemoryError(env, 0);
  36.259 +        return;
  36.260 +    }
  36.261      (*env)->GetCharArrayRegion(env, jArray, 0, *ckpLength, jpTemp);
  36.262 +    if ((*env)->ExceptionCheck(env)) {
  36.263 +        free(jpTemp);
  36.264 +        return;
  36.265 +    }
  36.266 +
  36.267      *ckpArray = (CK_CHAR_PTR) malloc (*ckpLength * sizeof(CK_CHAR));
  36.268 +    if (*ckpArray == NULL) {
  36.269 +        free(jpTemp);
  36.270 +        JNU_ThrowOutOfMemoryError(env, 0);
  36.271 +        return;
  36.272 +    }
  36.273      for (i=0; i<(*ckpLength); i++) {
  36.274          (*ckpArray)[i] = jCharToCKChar(jpTemp[i]);
  36.275      }
  36.276 @@ -493,8 +492,22 @@
  36.277      }
  36.278      *ckpLength = (*env)->GetArrayLength(env, jArray);
  36.279      jTemp = (jchar*) malloc((*ckpLength) * sizeof(jchar));
  36.280 +    if (jTemp == NULL) {
  36.281 +        JNU_ThrowOutOfMemoryError(env, 0);
  36.282 +        return;
  36.283 +    }
  36.284      (*env)->GetCharArrayRegion(env, jArray, 0, *ckpLength, jTemp);
  36.285 +    if ((*env)->ExceptionCheck(env)) {
  36.286 +        free(jTemp);
  36.287 +        return;
  36.288 +    }
  36.289 +
  36.290      *ckpArray = (CK_UTF8CHAR_PTR) malloc (*ckpLength * sizeof(CK_UTF8CHAR));
  36.291 +    if (*ckpArray == NULL) {
  36.292 +        free(jTemp);
  36.293 +        JNU_ThrowOutOfMemoryError(env, 0);
  36.294 +        return;
  36.295 +    }
  36.296      for (i=0; i<(*ckpLength); i++) {
  36.297          (*ckpArray)[i] = jCharToCKUTF8Char(jTemp[i]);
  36.298      }
  36.299 @@ -521,8 +534,15 @@
  36.300      }
  36.301  
  36.302      pCharArray = (*env)->GetStringUTFChars(env, jArray, &isCopy);
  36.303 +    if (pCharArray == NULL) { return; }
  36.304 +
  36.305      *ckpLength = strlen(pCharArray);
  36.306      *ckpArray = (CK_UTF8CHAR_PTR) malloc((*ckpLength + 1) * sizeof(CK_UTF8CHAR));
  36.307 +    if (*ckpArray == NULL) {
  36.308 +        (*env)->ReleaseStringUTFChars(env, (jstring) jArray, pCharArray);
  36.309 +        JNU_ThrowOutOfMemoryError(env, 0);
  36.310 +        return;
  36.311 +    }
  36.312      strcpy((char*)*ckpArray, pCharArray);
  36.313      (*env)->ReleaseStringUTFChars(env, (jstring) jArray, pCharArray);
  36.314  }
  36.315 @@ -552,55 +572,36 @@
  36.316      jLength = (*env)->GetArrayLength(env, jArray);
  36.317      *ckpLength = jLongToCKULong(jLength);
  36.318      *ckpArray = (CK_ATTRIBUTE_PTR) malloc(*ckpLength * sizeof(CK_ATTRIBUTE));
  36.319 +    if (*ckpArray == NULL) {
  36.320 +        JNU_ThrowOutOfMemoryError(env, 0);
  36.321 +        return;
  36.322 +    }
  36.323      TRACE1(", converting %d attibutes", jLength);
  36.324      for (i=0; i<(*ckpLength); i++) {
  36.325          TRACE1(", getting %d. attibute", i);
  36.326          jAttribute = (*env)->GetObjectArrayElement(env, jArray, i);
  36.327 +        if ((*env)->ExceptionCheck(env)) {
  36.328 +            freeCKAttributeArray(*ckpArray, i);
  36.329 +            return;
  36.330 +        }
  36.331          TRACE1(", jAttribute = %d", jAttribute);
  36.332          TRACE1(", converting %d. attibute", i);
  36.333          (*ckpArray)[i] = jAttributeToCKAttribute(env, jAttribute);
  36.334 +        if ((*env)->ExceptionCheck(env)) {
  36.335 +            freeCKAttributeArray(*ckpArray, i);
  36.336 +            return;
  36.337 +        }
  36.338      }
  36.339      TRACE0("FINISHED\n");
  36.340  }
  36.341  
  36.342  /*
  36.343 - * converts a jobjectArray to a CK_VOID_PTR array. The allocated memory has to be freed after
  36.344 - * use!
  36.345 - * NOTE: this function does not work and is not used yet
  36.346 - *
  36.347 - * @param env - used to call JNI funktions to get the array informtaion
  36.348 - * @param jArray - the Java object array to convert
  36.349 - * @param ckpArray - the reference, where the pointer to the new CK_VOID_PTR array will be stored
  36.350 - * @param ckpLength - the reference, where the array length will be stored
  36.351 - */
  36.352 -/*
  36.353 -void jObjectArrayToCKVoidPtrArray(JNIEnv *env, const jobjectArray jArray, CK_VOID_PTR_PTR *ckpArray, CK_ULONG_PTR ckpLength)
  36.354 -{
  36.355 -    jobject jTemp;
  36.356 -    CK_ULONG i;
  36.357 -
  36.358 -    if(jArray == NULL) {
  36.359 -        *ckpArray = NULL_PTR;
  36.360 -        *ckpLength = 0L;
  36.361 -        return;
  36.362 -    }
  36.363 -    *ckpLength = (*env)->GetArrayLength(env, jArray);
  36.364 -    *ckpArray = (CK_VOID_PTR_PTR) malloc (*ckpLength * sizeof(CK_VOID_PTR));
  36.365 -    for (i=0; i<(*ckpLength); i++) {
  36.366 -        jTemp = (*env)->GetObjectArrayElement(env, jArray, i);
  36.367 -        (*ckpArray)[i] = jObjectToCKVoidPtr(jTemp);
  36.368 -    }
  36.369 -    free(jTemp);
  36.370 -}
  36.371 -*/
  36.372 -
  36.373 -/*
  36.374   * converts a CK_BYTE array and its length to a jbyteArray.
  36.375   *
  36.376   * @param env - used to call JNI funktions to create the new Java array
  36.377   * @param ckpArray - the pointer to the CK_BYTE array to convert
  36.378   * @param ckpLength - the length of the array to convert
  36.379 - * @return - the new Java byte array
  36.380 + * @return - the new Java byte array or NULL if error occurred
  36.381   */
  36.382  jbyteArray ckByteArrayToJByteArray(JNIEnv *env, const CK_BYTE_PTR ckpArray, CK_ULONG ckLength)
  36.383  {
  36.384 @@ -613,17 +614,21 @@
  36.385          jpTemp = (jbyte*) ckpArray;
  36.386      } else {
  36.387          jpTemp = (jbyte*) malloc((ckLength) * sizeof(jbyte));
  36.388 +        if (jpTemp == NULL) {
  36.389 +            JNU_ThrowOutOfMemoryError(env, 0);
  36.390 +            return NULL;
  36.391 +        }
  36.392          for (i=0; i<ckLength; i++) {
  36.393              jpTemp[i] = ckByteToJByte(ckpArray[i]);
  36.394          }
  36.395      }
  36.396  
  36.397      jArray = (*env)->NewByteArray(env, ckULongToJSize(ckLength));
  36.398 -    (*env)->SetByteArrayRegion(env, jArray, 0, ckULongToJSize(ckLength), jpTemp);
  36.399 +    if (jArray != NULL) {
  36.400 +        (*env)->SetByteArrayRegion(env, jArray, 0, ckULongToJSize(ckLength), jpTemp);
  36.401 +    }
  36.402  
  36.403 -    if (sizeof(CK_BYTE) != sizeof(jbyte)) {
  36.404 -        free(jpTemp);
  36.405 -    }
  36.406 +    if (sizeof(CK_BYTE) != sizeof(jbyte)) { free(jpTemp); }
  36.407  
  36.408      return jArray ;
  36.409  }
  36.410 @@ -643,11 +648,17 @@
  36.411      jlongArray jArray;
  36.412  
  36.413      jpTemp = (jlong*) malloc((ckLength) * sizeof(jlong));
  36.414 +    if (jpTemp == NULL) {
  36.415 +        JNU_ThrowOutOfMemoryError(env, 0);
  36.416 +        return NULL;
  36.417 +    }
  36.418      for (i=0; i<ckLength; i++) {
  36.419          jpTemp[i] = ckLongToJLong(ckpArray[i]);
  36.420      }
  36.421      jArray = (*env)->NewLongArray(env, ckULongToJSize(ckLength));
  36.422 -    (*env)->SetLongArrayRegion(env, jArray, 0, ckULongToJSize(ckLength), jpTemp);
  36.423 +    if (jArray != NULL) {
  36.424 +        (*env)->SetLongArrayRegion(env, jArray, 0, ckULongToJSize(ckLength), jpTemp);
  36.425 +    }
  36.426      free(jpTemp);
  36.427  
  36.428      return jArray ;
  36.429 @@ -668,11 +679,17 @@
  36.430      jcharArray jArray;
  36.431  
  36.432      jpTemp = (jchar*) malloc(ckLength * sizeof(jchar));
  36.433 +    if (jpTemp == NULL) {
  36.434 +        JNU_ThrowOutOfMemoryError(env, 0);
  36.435 +        return NULL;
  36.436 +    }
  36.437      for (i=0; i<ckLength; i++) {
  36.438          jpTemp[i] = ckCharToJChar(ckpArray[i]);
  36.439      }
  36.440      jArray = (*env)->NewCharArray(env, ckULongToJSize(ckLength));
  36.441 -    (*env)->SetCharArrayRegion(env, jArray, 0, ckULongToJSize(ckLength), jpTemp);
  36.442 +    if (jArray != NULL) {
  36.443 +        (*env)->SetCharArrayRegion(env, jArray, 0, ckULongToJSize(ckLength), jpTemp);
  36.444 +    }
  36.445      free(jpTemp);
  36.446  
  36.447      return jArray ;
  36.448 @@ -693,11 +710,17 @@
  36.449      jcharArray jArray;
  36.450  
  36.451      jpTemp = (jchar*) malloc(ckLength * sizeof(jchar));
  36.452 +    if (jpTemp == NULL) {
  36.453 +        JNU_ThrowOutOfMemoryError(env, 0);
  36.454 +        return NULL;
  36.455 +    }
  36.456      for (i=0; i<ckLength; i++) {
  36.457          jpTemp[i] = ckUTF8CharToJChar(ckpArray[i]);
  36.458      }
  36.459      jArray = (*env)->NewCharArray(env, ckULongToJSize(ckLength));
  36.460 -    (*env)->SetCharArrayRegion(env, jArray, 0, ckULongToJSize(ckLength), jpTemp);
  36.461 +    if (jArray != NULL) {
  36.462 +        (*env)->SetCharArrayRegion(env, jArray, 0, ckULongToJSize(ckLength), jpTemp);
  36.463 +    }
  36.464      free(jpTemp);
  36.465  
  36.466      return jArray ;
  36.467 @@ -736,12 +759,11 @@
  36.468      jboolean jValue;
  36.469  
  36.470      jValueObjectClass = (*env)->FindClass(env, "java/lang/Boolean");
  36.471 -    assert(jValueObjectClass != 0);
  36.472 +    if (jValueObjectClass == NULL) { return NULL; }
  36.473      jConstructor = (*env)->GetMethodID(env, jValueObjectClass, "<init>", "(Z)V");
  36.474 -    assert(jConstructor != 0);
  36.475 +    if (jConstructor == NULL) { return NULL; }
  36.476      jValue = ckBBoolToJBoolean(*ckpValue);
  36.477      jValueObject = (*env)->NewObject(env, jValueObjectClass, jConstructor, jValue);
  36.478 -    assert(jValueObject != 0);
  36.479  
  36.480      return jValueObject ;
  36.481  }
  36.482 @@ -761,12 +783,11 @@
  36.483      jlong jValue;
  36.484  
  36.485      jValueObjectClass = (*env)->FindClass(env, "java/lang/Long");
  36.486 -    assert(jValueObjectClass != 0);
  36.487 +    if (jValueObjectClass == NULL) { return NULL; }
  36.488      jConstructor = (*env)->GetMethodID(env, jValueObjectClass, "<init>", "(J)V");
  36.489 -    assert(jConstructor != 0);
  36.490 +    if (jConstructor == NULL) { return NULL; }
  36.491      jValue = ckULongToJLong(*ckpValue);
  36.492      jValueObject = (*env)->NewObject(env, jValueObjectClass, jConstructor, jValue);
  36.493 -    assert(jValueObject != 0);
  36.494  
  36.495      return jValueObject ;
  36.496  }
  36.497 @@ -787,11 +808,15 @@
  36.498      CK_BBOOL *ckpValue;
  36.499  
  36.500      jObjectClass = (*env)->FindClass(env, "java/lang/Boolean");
  36.501 -    assert(jObjectClass != 0);
  36.502 +    if (jObjectClass == NULL) { return NULL; }
  36.503      jValueMethod = (*env)->GetMethodID(env, jObjectClass, "booleanValue", "()Z");
  36.504 -    assert(jValueMethod != 0);
  36.505 +    if (jValueMethod == NULL) { return NULL; }
  36.506      jValue = (*env)->CallBooleanMethod(env, jObject, jValueMethod);
  36.507      ckpValue = (CK_BBOOL *) malloc(sizeof(CK_BBOOL));
  36.508 +    if (ckpValue == NULL) {
  36.509 +        JNU_ThrowOutOfMemoryError(env, 0);
  36.510 +        return NULL;
  36.511 +    }
  36.512      *ckpValue = jBooleanToCKBBool(jValue);
  36.513  
  36.514      return ckpValue ;
  36.515 @@ -813,13 +838,16 @@
  36.516      CK_BYTE_PTR ckpValue;
  36.517  
  36.518      jObjectClass = (*env)->FindClass(env, "java/lang/Byte");
  36.519 -    assert(jObjectClass != 0);
  36.520 +    if (jObjectClass == NULL) { return NULL; }
  36.521      jValueMethod = (*env)->GetMethodID(env, jObjectClass, "byteValue", "()B");
  36.522 -    assert(jValueMethod != 0);
  36.523 +    if (jValueMethod == NULL) { return NULL; }
  36.524      jValue = (*env)->CallByteMethod(env, jObject, jValueMethod);
  36.525      ckpValue = (CK_BYTE_PTR) malloc(sizeof(CK_BYTE));
  36.526 +    if (ckpValue == NULL) {
  36.527 +        JNU_ThrowOutOfMemoryError(env, 0);
  36.528 +        return NULL;
  36.529 +    }
  36.530      *ckpValue = jByteToCKByte(jValue);
  36.531 -
  36.532      return ckpValue ;
  36.533  }
  36.534  
  36.535 @@ -839,13 +867,16 @@
  36.536      CK_ULONG *ckpValue;
  36.537  
  36.538      jObjectClass = (*env)->FindClass(env, "java/lang/Integer");
  36.539 -    assert(jObjectClass != 0);
  36.540 +    if (jObjectClass == NULL) { return NULL; }
  36.541      jValueMethod = (*env)->GetMethodID(env, jObjectClass, "intValue", "()I");
  36.542 -    assert(jValueMethod != 0);
  36.543 +    if (jValueMethod == NULL) { return NULL; }
  36.544      jValue = (*env)->CallIntMethod(env, jObject, jValueMethod);
  36.545      ckpValue = (CK_ULONG *) malloc(sizeof(CK_ULONG));
  36.546 +    if (ckpValue == NULL) {
  36.547 +        JNU_ThrowOutOfMemoryError(env, 0);
  36.548 +        return NULL;
  36.549 +    }
  36.550      *ckpValue = jLongToCKLong(jValue);
  36.551 -
  36.552      return ckpValue ;
  36.553  }
  36.554  
  36.555 @@ -865,11 +896,15 @@
  36.556      CK_ULONG *ckpValue;
  36.557  
  36.558      jObjectClass = (*env)->FindClass(env, "java/lang/Long");
  36.559 -    assert(jObjectClass != 0);
  36.560 +    if (jObjectClass == NULL) { return NULL; }
  36.561      jValueMethod = (*env)->GetMethodID(env, jObjectClass, "longValue", "()J");
  36.562 -    assert(jValueMethod != 0);
  36.563 +    if (jValueMethod == NULL) { return NULL; }
  36.564      jValue = (*env)->CallLongMethod(env, jObject, jValueMethod);
  36.565      ckpValue = (CK_ULONG *) malloc(sizeof(CK_ULONG));
  36.566 +    if (ckpValue == NULL) {
  36.567 +        JNU_ThrowOutOfMemoryError(env, 0);
  36.568 +        return NULL;
  36.569 +    }
  36.570      *ckpValue = jLongToCKULong(jValue);
  36.571  
  36.572      return ckpValue ;
  36.573 @@ -891,11 +926,15 @@
  36.574      CK_CHAR_PTR ckpValue;
  36.575  
  36.576      jObjectClass = (*env)->FindClass(env, "java/lang/Char");
  36.577 -    assert(jObjectClass != 0);
  36.578 +    if (jObjectClass == NULL) { return NULL; }
  36.579      jValueMethod = (*env)->GetMethodID(env, jObjectClass, "charValue", "()C");
  36.580 -    assert(jValueMethod != 0);
  36.581 +    if (jValueMethod == NULL) { return NULL; }
  36.582      jValue = (*env)->CallCharMethod(env, jObject, jValueMethod);
  36.583      ckpValue = (CK_CHAR_PTR) malloc(sizeof(CK_CHAR));
  36.584 +    if (ckpValue == NULL) {
  36.585 +        JNU_ThrowOutOfMemoryError(env, 0);
  36.586 +        return NULL;
  36.587 +    }
  36.588      *ckpValue = jCharToCKChar(jValue);
  36.589  
  36.590      return ckpValue ;
  36.591 @@ -913,124 +952,172 @@
  36.592   */
  36.593  void jObjectToPrimitiveCKObjectPtrPtr(JNIEnv *env, jobject jObject, CK_VOID_PTR *ckpObjectPtr, CK_ULONG *ckpLength)
  36.594  {
  36.595 -    jclass jBooleanClass     = (*env)->FindClass(env, "java/lang/Boolean");
  36.596 -    jclass jByteClass        = (*env)->FindClass(env, "java/lang/Byte");
  36.597 -    jclass jCharacterClass   = (*env)->FindClass(env, "java/lang/Character");
  36.598 -    jclass jClassClass = (*env)->FindClass(env, "java/lang/Class");
  36.599 -    /* jclass jShortClass       = (*env)->FindClass(env, "java/lang/Short"); */
  36.600 -    jclass jIntegerClass     = (*env)->FindClass(env, "java/lang/Integer");
  36.601 -    jclass jLongClass        = (*env)->FindClass(env, "java/lang/Long");
  36.602 -    /* jclass jFloatClass       = (*env)->FindClass(env, "java/lang/Float"); */
  36.603 -    /* jclass jDoubleClass      = (*env)->FindClass(env, "java/lang/Double"); */
  36.604 -    jclass jDateClass      = (*env)->FindClass(env, CLASS_DATE);
  36.605 -    jclass jStringClass      = (*env)->FindClass(env, "java/lang/String");
  36.606 -    jclass jStringBufferClass      = (*env)->FindClass(env, "java/lang/StringBuffer");
  36.607 -    jclass jBooleanArrayClass = (*env)->FindClass(env, "[Z");
  36.608 -    jclass jByteArrayClass    = (*env)->FindClass(env, "[B");
  36.609 -    jclass jCharArrayClass    = (*env)->FindClass(env, "[C");
  36.610 -    /* jclass jShortArrayClass   = (*env)->FindClass(env, "[S"); */
  36.611 -    jclass jIntArrayClass     = (*env)->FindClass(env, "[I");
  36.612 -    jclass jLongArrayClass    = (*env)->FindClass(env, "[J");
  36.613 -    /* jclass jFloatArrayClass   = (*env)->FindClass(env, "[F"); */
  36.614 -    /* jclass jDoubleArrayClass  = (*env)->FindClass(env, "[D"); */
  36.615 -    jclass jObjectClass = (*env)->FindClass(env, "java/lang/Object");
  36.616 -    /* jclass jObjectArrayClass = (*env)->FindClass(env, "[java/lang/Object"); */
  36.617 -    /* ATTENTION: jObjectArrayClass is always NULL !! */
  36.618 -    /* CK_ULONG ckArrayLength; */
  36.619 -    /* CK_VOID_PTR *ckpElementObject; */
  36.620 -    /* CK_ULONG ckElementLength; */
  36.621 -    /* CK_ULONG i; */
  36.622 +    jclass jLongClass, jBooleanClass, jByteArrayClass, jCharArrayClass;
  36.623 +    jclass jByteClass, jDateClass, jCharacterClass, jIntegerClass;
  36.624 +    jclass jBooleanArrayClass, jIntArrayClass, jLongArrayClass;
  36.625 +    jclass jStringClass;
  36.626 +    jclass jObjectClass, jClassClass;
  36.627      CK_VOID_PTR ckpVoid = *ckpObjectPtr;
  36.628      jmethodID jMethod;
  36.629      jobject jClassObject;
  36.630      jstring jClassNameString;
  36.631 -    jstring jExceptionMessagePrefix;
  36.632 -    jobject jExceptionMessageStringBuffer;
  36.633 -    jstring jExceptionMessage;
  36.634 +    char *classNameString, *exceptionMsgPrefix, *exceptionMsg;
  36.635  
  36.636      TRACE0("\nDEBUG: jObjectToPrimitiveCKObjectPtrPtr");
  36.637      if (jObject == NULL) {
  36.638          *ckpObjectPtr = NULL;
  36.639          *ckpLength = 0;
  36.640 -    } else if ((*env)->IsInstanceOf(env, jObject, jLongClass)) {
  36.641 +        return;
  36.642 +    }
  36.643 +
  36.644 +    jLongClass = (*env)->FindClass(env, "java/lang/Long");
  36.645 +    if (jLongClass == NULL) { return; }
  36.646 +    if ((*env)->IsInstanceOf(env, jObject, jLongClass)) {
  36.647          *ckpObjectPtr = jLongObjectToCKULongPtr(env, jObject);
  36.648          *ckpLength = sizeof(CK_ULONG);
  36.649          TRACE1("<converted long value %X>", *((CK_ULONG *) *ckpObjectPtr));
  36.650 -    } else if ((*env)->IsInstanceOf(env, jObject, jBooleanClass)) {
  36.651 +        return;
  36.652 +    }
  36.653 +
  36.654 +    jBooleanClass = (*env)->FindClass(env, "java/lang/Boolean");
  36.655 +    if (jBooleanClass == NULL) { return; }
  36.656 +    if ((*env)->IsInstanceOf(env, jObject, jBooleanClass)) {
  36.657          *ckpObjectPtr = jBooleanObjectToCKBBoolPtr(env, jObject);
  36.658          *ckpLength = sizeof(CK_BBOOL);
  36.659          TRACE0(" <converted boolean value ");
  36.660          TRACE0((*((CK_BBOOL *) *ckpObjectPtr) == TRUE) ? "TRUE>" : "FALSE>");
  36.661 -    } else if ((*env)->IsInstanceOf(env, jObject, jByteArrayClass)) {
  36.662 +        return;
  36.663 +    }
  36.664 +
  36.665 +    jByteArrayClass = (*env)->FindClass(env, "[B");
  36.666 +    if (jByteArrayClass == NULL) { return; }
  36.667 +    if ((*env)->IsInstanceOf(env, jObject, jByteArrayClass)) {
  36.668          jByteArrayToCKByteArray(env, jObject, (CK_BYTE_PTR*)ckpObjectPtr, ckpLength);
  36.669 -    } else if ((*env)->IsInstanceOf(env, jObject, jCharArrayClass)) {
  36.670 +        return;
  36.671 +    }
  36.672 +
  36.673 +    jCharArrayClass = (*env)->FindClass(env, "[C");
  36.674 +    if (jCharArrayClass == NULL) { return; }
  36.675 +    if ((*env)->IsInstanceOf(env, jObject, jCharArrayClass)) {
  36.676          jCharArrayToCKUTF8CharArray(env, jObject, (CK_UTF8CHAR_PTR*)ckpObjectPtr, ckpLength);
  36.677 -    } else if ((*env)->IsInstanceOf(env, jObject, jByteClass)) {
  36.678 +        return;
  36.679 +    }
  36.680 +
  36.681 +    jByteClass = (*env)->FindClass(env, "java/lang/Byte");
  36.682 +    if (jByteClass == NULL) { return; }
  36.683 +    if ((*env)->IsInstanceOf(env, jObject, jByteClass)) {
  36.684          *ckpObjectPtr = jByteObjectToCKBytePtr(env, jObject);
  36.685          *ckpLength = sizeof(CK_BYTE);
  36.686          TRACE1("<converted byte value %X>", *((CK_BYTE *) *ckpObjectPtr));
  36.687 -    } else if ((*env)->IsInstanceOf(env, jObject, jDateClass)) {
  36.688 +        return;
  36.689 +    }
  36.690 +
  36.691 +    jDateClass = (*env)->FindClass(env, CLASS_DATE);
  36.692 +    if (jDateClass == NULL) { return; }
  36.693 +    if ((*env)->IsInstanceOf(env, jObject, jDateClass)) {
  36.694          *ckpObjectPtr = jDateObjectPtrToCKDatePtr(env, jObject);
  36.695          *ckpLength = sizeof(CK_DATE);
  36.696 -        TRACE3("<converted date value %.4s-%.2s-%.2s>", (*((CK_DATE *) *ckpObjectPtr)).year,
  36.697 -                                                    (*((CK_DATE *) *ckpObjectPtr)).month,
  36.698 -                                                    (*((CK_DATE *) *ckpObjectPtr)).day);
  36.699 -    } else if ((*env)->IsInstanceOf(env, jObject, jCharacterClass)) {
  36.700 +        TRACE3("<converted date value %.4s-%.2s-%.2s>", (*((CK_DATE *) *ckpObjectPtr)).year, (*((CK_DATE *) *ckpObjectPtr)).month, (*((CK_DATE *) *ckpObjectPtr)).day);
  36.701 +        return;
  36.702 +    }
  36.703 +
  36.704 +    jCharacterClass = (*env)->FindClass(env, "java/lang/Character");
  36.705 +    if (jCharacterClass == NULL) { return; }
  36.706 +    if ((*env)->IsInstanceOf(env, jObject, jCharacterClass)) {
  36.707          *ckpObjectPtr = jCharObjectToCKCharPtr(env, jObject);
  36.708          *ckpLength = sizeof(CK_UTF8CHAR);
  36.709          TRACE1("<converted char value %c>", *((CK_CHAR *) *ckpObjectPtr));
  36.710 -    } else if ((*env)->IsInstanceOf(env, jObject, jIntegerClass)) {
  36.711 +        return;
  36.712 +    }
  36.713 +
  36.714 +    jIntegerClass = (*env)->FindClass(env, "java/lang/Integer");
  36.715 +    if (jIntegerClass == NULL) { return; }
  36.716 +    if ((*env)->IsInstanceOf(env, jObject, jIntegerClass)) {
  36.717          *ckpObjectPtr = jIntegerObjectToCKULongPtr(env, jObject);
  36.718          *ckpLength = sizeof(CK_ULONG);
  36.719          TRACE1("<converted integer value %X>", *((CK_ULONG *) *ckpObjectPtr));
  36.720 -    } else if ((*env)->IsInstanceOf(env, jObject, jBooleanArrayClass)) {
  36.721 +        return;
  36.722 +    }
  36.723 +
  36.724 +    jBooleanArrayClass = (*env)->FindClass(env, "[Z");
  36.725 +    if (jBooleanArrayClass == NULL) { return; }
  36.726 +    if ((*env)->IsInstanceOf(env, jObject, jBooleanArrayClass)) {
  36.727          jBooleanArrayToCKBBoolArray(env, jObject, (CK_BBOOL**)ckpObjectPtr, ckpLength);
  36.728 -    } else if ((*env)->IsInstanceOf(env, jObject, jIntArrayClass)) {
  36.729 +        return;
  36.730 +    }
  36.731 +
  36.732 +    jIntArrayClass = (*env)->FindClass(env, "[I");
  36.733 +    if (jIntArrayClass == NULL) { return; }
  36.734 +    if ((*env)->IsInstanceOf(env, jObject, jIntArrayClass)) {
  36.735          jLongArrayToCKULongArray(env, jObject, (CK_ULONG_PTR*)ckpObjectPtr, ckpLength);
  36.736 -    } else if ((*env)->IsInstanceOf(env, jObject, jLongArrayClass)) {
  36.737 +        return;
  36.738 +    }
  36.739 +
  36.740 +    jLongArrayClass = (*env)->FindClass(env, "[J");
  36.741 +    if (jLongArrayClass == NULL) { return; }
  36.742 +    if ((*env)->IsInstanceOf(env, jObject, jLongArrayClass)) {
  36.743          jLongArrayToCKULongArray(env, jObject, (CK_ULONG_PTR*)ckpObjectPtr, ckpLength);
  36.744 -    } else if ((*env)->IsInstanceOf(env, jObject, jStringClass)) {
  36.745 +        return;
  36.746 +    }
  36.747 +
  36.748 +    jStringClass = (*env)->FindClass(env, "java/lang/String");
  36.749 +    if (jStringClass == NULL) { return; }
  36.750 +    if ((*env)->IsInstanceOf(env, jObject, jStringClass)) {
  36.751          jStringToCKUTF8CharArray(env, jObject, (CK_UTF8CHAR_PTR*)ckpObjectPtr, ckpLength);
  36.752 +        return;
  36.753 +    }
  36.754  
  36.755 -        /* a Java object array is not used by CK_ATTRIBUTE by now... */
  36.756 -/*  } else if ((*env)->IsInstanceOf(env, jObject, jObjectArrayClass)) {
  36.757 -        ckArrayLength = (*env)->GetArrayLength(env, (jarray) jObject);
  36.758 -        ckpObjectPtr = (CK_VOID_PTR_PTR) malloc(sizeof(CK_VOID_PTR) * ckArrayLength);
  36.759 -        *ckpLength = 0;
  36.760 -        for (i = 0; i < ckArrayLength; i++) {
  36.761 -            jObjectToPrimitiveCKObjectPtrPtr(env, (*env)->GetObjectArrayElement(env, (jarray) jObject, i),
  36.762 -                     ckpElementObject, &ckElementLength);
  36.763 -            (*ckpObjectPtr)[i] = *ckpElementObject;
  36.764 -            *ckpLength += ckElementLength;
  36.765 -        }
  36.766 -*/
  36.767 -    } else {
  36.768 -        /* type of jObject unknown, throw PKCS11RuntimeException */
  36.769 -        jMethod = (*env)->GetMethodID(env, jObjectClass, "getClass", "()Ljava/lang/Class;");
  36.770 -        assert(jMethod != 0);
  36.771 -        jClassObject = (*env)->CallObjectMethod(env, jObject, jMethod);
  36.772 -        assert(jClassObject != 0);
  36.773 -        jMethod = (*env)->GetMethodID(env, jClassClass, "getName", "()Ljava/lang/String;");
  36.774 -        assert(jMethod != 0);
  36.775 -        jClassNameString = (jstring)
  36.776 -                (*env)->CallObjectMethod(env, jClassObject, jMethod);
  36.777 -        assert(jClassNameString != 0);
  36.778 -        jExceptionMessagePrefix = (*env)->NewStringUTF(env, "Java object of this class cannot be converted to native PKCS#11 type: ");
  36.779 -        jMethod = (*env)->GetMethodID(env, jStringBufferClass, "<init>", "(Ljava/lang/String;)V");
  36.780 -        assert(jMethod != 0);
  36.781 -        jExceptionMessageStringBuffer = (*env)->NewObject(env, jStringBufferClass, jMethod, jExceptionMessagePrefix);
  36.782 -        assert(jClassNameString != 0);
  36.783 -        jMethod = (*env)->GetMethodID(env, jStringBufferClass, "append", "(Ljava/lang/String;)Ljava/lang/StringBuffer;");
  36.784 -        assert(jMethod != 0);
  36.785 -        jExceptionMessage = (jstring)
  36.786 -                 (*env)->CallObjectMethod(env, jExceptionMessageStringBuffer, jMethod, jClassNameString);
  36.787 -        assert(jExceptionMessage != 0);
  36.788 -
  36.789 -        throwPKCS11RuntimeException(env, jExceptionMessage);
  36.790 -
  36.791 -        *ckpObjectPtr = NULL;
  36.792 -        *ckpLength = 0;
  36.793 +    /* type of jObject unknown, throw PKCS11RuntimeException */
  36.794 +    jObjectClass = (*env)->FindClass(env, "java/lang/Object");
  36.795 +    if (jObjectClass == NULL) { return; }
  36.796 +    jMethod = (*env)->GetMethodID(env, jObjectClass, "getClass", "()Ljava/lang/Class;");
  36.797 +    if (jMethod == NULL) { return; }
  36.798 +    jClassObject = (*env)->CallObjectMethod(env, jObject, jMethod);
  36.799 +    assert(jClassObject != 0);
  36.800 +    jClassClass = (*env)->FindClass(env, "java/lang/Class");
  36.801 +    if (jClassClass == NULL) { return; }
  36.802 +    jMethod = (*env)->GetMethodID(env, jClassClass, "getName", "()Ljava/lang/String;");
  36.803 +    if (jMethod == NULL) { return; }
  36.804 +    jClassNameString = (jstring)
  36.805 +        (*env)->CallObjectMethod(env, jClassObject, jMethod);
  36.806 +    assert(jClassNameString != 0);
  36.807 +    classNameString = (char*)
  36.808 +        (*env)->GetStringUTFChars(env, jClassNameString, NULL);
  36.809 +    if (classNameString == NULL) { return; }
  36.810 +    exceptionMsgPrefix = "Java object of this class cannot be converted to native PKCS#11 type: ";
  36.811 +    exceptionMsg = (char *)
  36.812 +        malloc((strlen(exceptionMsgPrefix) + strlen(classNameString) + 1));
  36.813 +    if (exceptionMsg == NULL) {
  36.814 +        (*env)->ReleaseStringUTFChars(env, jClassNameString, classNameString);
  36.815 +        JNU_ThrowOutOfMemoryError(env, 0);
  36.816 +        return;
  36.817      }
  36.818 +    strcpy(exceptionMsg, exceptionMsgPrefix);
  36.819 +    strcat(exceptionMsg, classNameString);
  36.820 +    (*env)->ReleaseStringUTFChars(env, jClassNameString, classNameString);
  36.821 +    throwPKCS11RuntimeException(env, exceptionMsg);
  36.822 +    free(exceptionMsg);
  36.823 +    *ckpObjectPtr = NULL;
  36.824 +    *ckpLength = 0;
  36.825  
  36.826      TRACE0("FINISHED\n");
  36.827  }
  36.828 +
  36.829 +#ifdef P11_MEMORYDEBUG
  36.830 +
  36.831 +#undef malloc
  36.832 +#undef free
  36.833 +
  36.834 +void *p11malloc(size_t c, char *file, int line) {
  36.835 +    void *p = malloc(c);
  36.836 +    printf("malloc\t%08x\t%d\t%s:%d\n", p, c, file, line); fflush(stdout);
  36.837 +    return p;
  36.838 +}
  36.839 +
  36.840 +void p11free(void *p, char *file, int line) {
  36.841 +    printf("free\t%08x\t\t%s:%d\n", p, file, line); fflush(stdout);
  36.842 +    free(p);
  36.843 +}
  36.844 +
  36.845 +#endif
  36.846 +
    37.1 --- a/src/share/native/sun/security/pkcs11/wrapper/pkcs11wrapper.h	Tue Mar 17 13:44:08 2009 -0700
    37.2 +++ b/src/share/native/sun/security/pkcs11/wrapper/pkcs11wrapper.h	Tue Mar 17 13:45:01 2009 -0700
    37.3 @@ -1,5 +1,5 @@
    37.4  /*
    37.5 - * Portions Copyright 2003-2006 Sun Microsystems, Inc.  All Rights Reserved.
    37.6 + * Portions Copyright 2003-2009 Sun Microsystems, Inc.  All Rights Reserved.
    37.7   */
    37.8  
    37.9  /* Copyright  (c) 2002 Graz University of Technology. All rights reserved.
   37.10 @@ -154,6 +154,7 @@
   37.11  
   37.12  #include "pkcs11.h"
   37.13  #include <jni.h>
   37.14 +#include <jni_util.h>
   37.15  
   37.16  #define MAX_STACK_BUFFER_LEN (4 * 1024)
   37.17  #define MAX_HEAP_BUFFER_LEN (64 * 1024)
   37.18 @@ -277,12 +278,14 @@
   37.19   */
   37.20  
   37.21  jlong ckAssertReturnValueOK(JNIEnv *env, CK_RV returnValue);
   37.22 -void throwPKCS11RuntimeException(JNIEnv *env, jstring jmessage);
   37.23 -void throwFileNotFoundException(JNIEnv *env, jstring jmessage);
   37.24  void throwIOException(JNIEnv *env, const char *message);
   37.25 -void throwIOExceptionUnicodeMessage(JNIEnv *env, const short *message);
   37.26 +void throwPKCS11RuntimeException(JNIEnv *env, const char *message);
   37.27  void throwDisconnectedRuntimeException(JNIEnv *env);
   37.28  
   37.29 +/* function to free CK_ATTRIBUTE array
   37.30 + */
   37.31 +void freeCKAttributeArray(CK_ATTRIBUTE_PTR attrPtr, int len);
   37.32 +
   37.33  /* funktions to convert Java arrays to a CK-type array and the array length */
   37.34  
   37.35  void jBooleanArrayToCKBBoolArray(JNIEnv *env, const jbooleanArray jArray, CK_BBOOL **ckpArray, CK_ULONG_PTR ckLength);
   37.36 @@ -438,3 +441,15 @@
   37.37  extern jobject jInitArgsObject;
   37.38  extern CK_C_INITIALIZE_ARGS_PTR ckpGlobalInitArgs;
   37.39  #endif /* NO_CALLBACKS */
   37.40 +
   37.41 +#ifdef P11_MEMORYDEBUG
   37.42 +#include <stdlib.h>
   37.43 +
   37.44 +/* Simple malloc/free dumper */
   37.45 +void *p11malloc(size_t c, char *file, int line);
   37.46 +void p11free(void *p, char *file, int line);
   37.47 +
   37.48 +#define malloc(c)       (p11malloc((c), __FILE__, __LINE__))
   37.49 +#define free(c)         (p11free((c), __FILE__, __LINE__))
   37.50 +
   37.51 +#endif
    38.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    38.2 +++ b/test/java/security/Permission/ToString.java	Tue Mar 17 13:45:01 2009 -0700
    38.3 @@ -0,0 +1,101 @@
    38.4 +/*
    38.5 + * Copyright 2009 Sun Microsystems, Inc.  All Rights Reserved.
    38.6 + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    38.7 + *
    38.8 + * This code is free software; you can redistribute it and/or modify it
    38.9 + * under the terms of the GNU General Public License version 2 only, as
   38.10 + * published by the Free Software Foundation.
   38.11 + *
   38.12 + * This code is distributed in the hope that it will be useful, but WITHOUT
   38.13 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   38.14 + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
   38.15 + * version 2 for more details (a copy is included in the LICENSE file that
   38.16 + * accompanied this code).
   38.17 + *
   38.18 + * You should have received a copy of the GNU General Public License version
   38.19 + * 2 along with this work; if not, write to the Free Software Foundation,
   38.20 + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
   38.21 + *
   38.22 + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
   38.23 + * CA 95054 USA or visit www.sun.com if you need additional information or
   38.24 + * have any questions.
   38.25 + */
   38.26 +
   38.27 +/*
   38.28 + * @test
   38.29 + * @bug 6549506
   38.30 + * @summary Specification of Permission.toString() method contradicts with
   38.31 + *      JDK implementation
   38.32 + */
   38.33 +
   38.34 +import java.security.*;
   38.35 +
   38.36 +public class ToString {
   38.37 +
   38.38 +    public static void main(String[]args) throws Exception {
   38.39 +        DummyWritePermission dummyPerm = new DummyWritePermission();
   38.40 +        NullActionPermission nullActionPerm = new NullActionPermission();
   38.41 +        System.out.println(dummyPerm.toString());
   38.42 +        System.out.println(dummyPerm.getDescription());
   38.43 +        System.out.println(nullActionPerm.toString());
   38.44 +        System.out.println(nullActionPerm.getDescription());
   38.45 +        if (!dummyPerm.toString().equals(dummyPerm.getDescription())) {
   38.46 +            throw new Exception("The expected permission.toString() is " +
   38.47 +                dummyPerm.getDescription() + ", but " +
   38.48 +                dummyPerm.toString() + " returned!");
   38.49 +        }
   38.50 +
   38.51 +        if (!nullActionPerm.toString().equals(nullActionPerm.getDescription())) {
   38.52 +            throw new Exception("The expected permission.toString() is " +
   38.53 +                nullActionPerm.getDescription() + ", but " +
   38.54 +                nullActionPerm.toString() + " returned!");
   38.55 +        }
   38.56 +    }
   38.57 +
   38.58 +    private static abstract class SimplePermission extends Permission {
   38.59 +        public SimplePermission(String name) {
   38.60 +            super(name);
   38.61 +        }
   38.62 +
   38.63 +        public boolean implies(Permission permission) {
   38.64 +            return false;
   38.65 +        }
   38.66 +
   38.67 +        public boolean equals(Object obj) {
   38.68 +            return false;
   38.69 +        }
   38.70 +
   38.71 +        public int hashCode() {
   38.72 +            return 13;
   38.73 +        }
   38.74 +    }
   38.75 +
   38.76 +    private static class DummyWritePermission extends SimplePermission {
   38.77 +        public DummyWritePermission() {
   38.78 +            super("permit to");
   38.79 +        }
   38.80 +
   38.81 +        public String getActions() {
   38.82 +            return "write";
   38.83 +        }
   38.84 +
   38.85 +        public String getDescription() {
   38.86 +            return "(\"ToString$DummyWritePermission\" \"permit to\" \"write\")";
   38.87 +        }
   38.88 +    }
   38.89 +
   38.90 +    private static class NullActionPermission extends SimplePermission {
   38.91 +        public NullActionPermission() {
   38.92 +            super("permit to");
   38.93 +        }
   38.94 +
   38.95 +        public String getActions() {
   38.96 +            return null;
   38.97 +        }
   38.98 +
   38.99 +        public String getDescription() {
  38.100 +            return "(\"ToString$NullActionPermission\" \"permit to\")";
  38.101 +        }
  38.102 +    }
  38.103 +
  38.104 +}
    39.1 --- a/test/java/util/zip/ZipFile/LargeZipFile.java	Tue Mar 17 13:44:08 2009 -0700
    39.2 +++ b/test/java/util/zip/ZipFile/LargeZipFile.java	Tue Mar 17 13:45:01 2009 -0700
    39.3 @@ -1,3 +1,26 @@
    39.4 +/*
    39.5 + * Copyright 2009 Sun Microsystems, Inc.  All Rights Reserved.
    39.6 + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    39.7 + *
    39.8 + * This code is free software; you can redistribute it and/or modify it
    39.9 + * under the terms of the GNU General Public License version 2 only, as
   39.10 + * published by the Free Software Foundation.
   39.11 + *
   39.12 + * This code is distributed in the hope that it will be useful, but WITHOUT
   39.13 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   39.14 + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
   39.15 + * version 2 for more details (a copy is included in the LICENSE file that
   39.16 + * accompanied this code).
   39.17 + *
   39.18 + * You should have received a copy of the GNU General Public License version
   39.19 + * 2 along with this work; if not, write to the Free Software Foundation,
   39.20 + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
   39.21 + *
   39.22 + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
   39.23 + * CA 95054 USA or visit www.sun.com if you need additional information or
   39.24 + * have any questions.
   39.25 + */
   39.26 +
   39.27  import java.io.*;
   39.28  import java.nio.*;
   39.29  import java.util.*;
    40.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    40.2 +++ b/test/sun/security/tools/keytool/NoExtNPE.sh	Tue Mar 17 13:45:01 2009 -0700
    40.3 @@ -0,0 +1,65 @@
    40.4 +#
    40.5 +# Copyright 2009 Sun Microsystems, Inc.  All Rights Reserved.
    40.6 +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    40.7 +#
    40.8 +# This code is free software; you can redistribute it and/or modify it
    40.9 +# under the terms of the GNU General Public License version 2 only, as
   40.10 +# published by the Free Software Foundation.
   40.11 +#
   40.12 +# This code is distributed in the hope that it will be useful, but WITHOUT
   40.13 +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   40.14 +# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
   40.15 +# version 2 for more details (a copy is included in the LICENSE file that
   40.16 +# accompanied this code).
   40.17 +#
   40.18 +# You should have received a copy of the GNU General Public License version
   40.19 +# 2 along with this work; if not, write to the Free Software Foundation,
   40.20 +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
   40.21 +#
   40.22 +# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
   40.23 +# CA 95054 USA or visit www.sun.com if you need additional information or
   40.24 +# have any questions.
   40.25 +#
   40.26 +
   40.27 +# @test
   40.28 +# @bug 6813402
   40.29 +# @summary keytool cannot -printcert entries without extensions
   40.30 +#
   40.31 +# @run shell NoExtNPE.sh
   40.32 +
   40.33 +# set a few environment variables so that the shell-script can run stand-alone
   40.34 +# in the source directory
   40.35 +if [ "${TESTSRC}" = "" ] ; then
   40.36 +   TESTSRC="."
   40.37 +fi
   40.38 +
   40.39 +if [ "${TESTJAVA}" = "" ] ; then
   40.40 +   echo "TESTJAVA not set.  Test cannot execute."
   40.41 +   echo "FAILED!!!"
   40.42 +   exit 1
   40.43 +fi
   40.44 +
   40.45 +# set platform-dependent variables
   40.46 +OS=`uname -s`
   40.47 +case "$OS" in
   40.48 +  SunOS )
   40.49 +    FILESEP="/"
   40.50 +    ;;
   40.51 +  Linux )
   40.52 +    FILESEP="/"
   40.53 +    ;;
   40.54 +  Windows* )
   40.55 +    FILESEP="\\"
   40.56 +    ;;
   40.57 +  * )
   40.58 +    echo "Unrecognized system!"
   40.59 +    exit 1;
   40.60 +    ;;
   40.61 +esac
   40.62 +
   40.63 +${TESTJAVA}${FILESEP}bin${FILESEP}keytool \
   40.64 +	-list -v \
   40.65 +	-keystore ${TESTSRC}${FILESEP}CloneKeyAskPassword.jks \
   40.66 +	-storepass test123
   40.67 +
   40.68 +exit $?