< prev index next >
src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11Key.java
Print this page
*** 43,52 ****
--- 43,53 ----
import sun.security.internal.interfaces.TlsMasterSecret;
import sun.security.pkcs11.wrapper.*;
import static sun.security.pkcs11.wrapper.PKCS11Constants.*;
+ import sun.security.util.Debug;
import sun.security.util.DerValue;
import sun.security.util.Length;
import sun.security.util.ECUtil;
/**
*** 1108,1122 ****
static ReferenceQueue<P11Key> referenceQueue() {
return refQueue;
}
private static void drainRefQueueBounded() {
while (true) {
SessionKeyRef next = (SessionKeyRef) refQueue.poll();
! if (next == null) break;
next.dispose();
}
}
// handle to the native key
private long keyID;
private Session session;
--- 1109,1154 ----
static ReferenceQueue<P11Key> referenceQueue() {
return refQueue;
}
private static void drainRefQueueBounded() {
+ Session sess = null;
+ Token tkn = null;
while (true) {
SessionKeyRef next = (SessionKeyRef) refQueue.poll();
! if (next == null) {
! break;
! }
!
! // If the token is still valid, try to remove the object
! if (next.session.token.isValid()) {
! // If this key's token is the same as the previous key, the
! // same session can be used for C_DestroyObject.
! try {
! if (next.session.token != tkn || sess == null) {
! // Release session if not using previous token
! if (tkn != null && sess != null) {
! tkn.releaseSession(sess);
! sess = null;
! }
!
! tkn = next.session.token;
! sess = tkn.getOpSession();
! }
!
! next.disposeNative(sess);
! } catch (PKCS11Exception e) {
! // ignore
! }
! }
! // Regardless of native results, dispose of java references
next.dispose();
}
+
+ if (tkn != null && sess != null) {
+ tkn.releaseSession(sess);
+ }
}
// handle to the native key
private long keyID;
private Session session;
*** 1125,1154 ****
super(key, refQueue);
this.keyID = keyID;
this.session = session;
this.session.addObject();
refList.add(this);
- // TBD: run at some interval and not every time?
drainRefQueueBounded();
}
private void dispose() {
refList.remove(this);
- if (session.token.isValid()) {
- Session newSession = null;
- try {
- newSession = session.token.getOpSession();
- session.token.p11.C_DestroyObject(newSession.id(), keyID);
- } catch (PKCS11Exception e) {
- // ignore
- } finally {
this.clear();
- session.token.releaseSession(newSession);
session.removeObject();
}
- }
- }
public int compareTo(SessionKeyRef other) {
if (this.keyID == other.keyID) {
return 0;
} else {
--- 1157,1178 ----
super(key, refQueue);
this.keyID = keyID;
this.session = session;
this.session.addObject();
refList.add(this);
drainRefQueueBounded();
}
+ private void disposeNative(Session s) throws PKCS11Exception {
+ session.token.p11.C_DestroyObject(s.id(), keyID);
+ }
+
private void dispose() {
refList.remove(this);
this.clear();
session.removeObject();
}
public int compareTo(SessionKeyRef other) {
if (this.keyID == other.keyID) {
return 0;
} else {
< prev index next >