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 $?