7024697: SessionRef.dispose() should determine if the token referred to by the token object is still valid
authorcoffeys
Fri, 26 Aug 2011 10:47:09 +0100
changeset 10363 6670d68e5011
parent 10362 5938b19e89b9
child 10364 6aa14d716d9d
7024697: SessionRef.dispose() should determine if the token referred to by the token object is still valid Reviewed-by: valeriep
jdk/src/share/classes/sun/security/pkcs11/Session.java
jdk/src/share/classes/sun/security/pkcs11/Token.java
--- a/jdk/src/share/classes/sun/security/pkcs11/Session.java	Thu Aug 25 09:42:50 2011 -0700
+++ b/jdk/src/share/classes/sun/security/pkcs11/Session.java	Fri Aug 26 10:47:09 2011 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -87,7 +87,7 @@
     }
 
     long id() {
-        if (token.isPresent(this) == false) {
+        if (token.isPresent(this.id) == false) {
             throw new ProviderException("Token has been removed");
         }
         lastAccess = System.currentTimeMillis();
@@ -167,7 +167,9 @@
     void dispose() {
         refList.remove(this);
         try {
-            token.p11.C_CloseSession(id);
+            if (token.isPresent(id)) {
+                token.p11.C_CloseSession(id);
+            }
         } catch (PKCS11Exception e1) {
             // ignore
         } catch (ProviderException e2) {
--- a/jdk/src/share/classes/sun/security/pkcs11/Token.java	Thu Aug 25 09:42:50 2011 -0700
+++ b/jdk/src/share/classes/sun/security/pkcs11/Token.java	Fri Aug 26 10:47:09 2011 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -217,7 +217,7 @@
 
     // return whether a token is present (i.e. token not removed)
     // returns cached value if current, otherwise performs new check
-    boolean isPresent(Session session) {
+    boolean isPresent(long sessionID) {
         if (removable == false) {
             return true;
         }
@@ -238,7 +238,7 @@
                             // the token should return an error
                             CK_SESSION_INFO sessInfo =
                                     provider.p11.C_GetSessionInfo
-                                    (session.idInternal());
+                                    (sessionID);
                             ok = true;
                         }
                     } catch (PKCS11Exception e) {