softGeneral.c revision 8047c9fb10f4d3f14385d535d6b23a5eb80c0c0f
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * CDDL HEADER START
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * The contents of this file are subject to the terms of the
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * Common Development and Distribution License (the "License").
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * You may not use this file except in compliance with the License.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * See the License for the specific language governing permissions
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * and limitations under the License.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * When distributing Covered Code, include this CDDL HEADER in each
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * If applicable, add the following below this CDDL HEADER, with the
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * fields enclosed by brackets "[]" replaced with your own identifying
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * information: Portions Copyright [yyyy] [name of copyright owner]
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * CDDL HEADER END
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync * Use is subject to license terms.
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync#pragma ident "%Z%%M% %I% %E% SMI"
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync/* This mutex protects soft_session_list, all_sessions_closing */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync/* protects softtoken_initialized and access to C_Initialize/C_Finalize */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncpthread_mutex_t soft_giant_mutex = PTHREAD_MUTEX_INITIALIZER;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncstatic CK_RV finalize_common(boolean_t force, CK_VOID_PTR pReserved);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * Get lock to insure only one thread enters this
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * function at a time.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * This process has called C_Initialize already
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * A fork has happened and the child is
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * reinitializing. Do a finalize_common to close
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * out any state from the parent, and then
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * continue on.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* pReserved must be NULL */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * ALL supplied function pointers need to have the value
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * either NULL or non-NULL.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * When the CKF_OS_LOCKING_OK flag isn't set and mutex
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * function pointers are supplied by an application,
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * return an error. We must be able to use our own primitives.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* Initialize the session list lock */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (pthread_mutex_init(&soft_sessionlist_mutex, NULL) != 0) {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * token object related initialization
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* Initialize the slot lock */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (pthread_mutex_init(&soft_slot.slot_mutex, NULL) != 0) {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* Get keystore version because it might not be 1 at this time */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (soft_keystore_get_version(&soft_slot.ks_version, B_FALSE) !=
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* Load all the public token objects from keystore */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync (void) pthread_mutex_destroy(&soft_slot.slot_mutex);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * Invalidate public token objects until the
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * C_OpenSession is called.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* Initialize the object_to_be_freed list */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync (void) pthread_mutex_init(&obj_delay_freed.obj_to_be_free_mutex, NULL);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync (void) pthread_mutex_init(&ses_delay_freed.ses_to_be_free_mutex, NULL);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * C_Finalize is a wrapper around finalize_common. The
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * soft_giant_mutex should be locked by C_Finalize().
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * finalize_common() does the work for C_Finalize. soft_giant_mutex
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * must be held before calling this function.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncfinalize_common(boolean_t force, CK_VOID_PTR pReserved) {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* Check to see if pReseved is NULL */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync (void) pthread_mutex_lock(&soft_sessionlist_mutex);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * Set all_sessions_closing flag so any access to any
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * existing sessions will be rejected.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync (void) pthread_mutex_unlock(&soft_sessionlist_mutex);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* Delete all the sessions and release the allocated resources */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync (void) pthread_mutex_lock(&soft_sessionlist_mutex);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* Reset all_sessions_closing flag. */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync (void) pthread_mutex_unlock(&soft_sessionlist_mutex);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* Destroy the session list lock here */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync (void) pthread_mutex_destroy(&soft_sessionlist_mutex);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * Destroy token object related stuffs
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * 1. Clean up the token object list
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * 2. Destroy slot mutex
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * 3. Destroy mutex in token_session
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync (void) pthread_mutex_destroy(&soft_slot.slot_mutex);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * free all entries in the delay_freed list
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync (void) pthread_mutex_destroy(&obj_delay_freed.obj_to_be_free_mutex);
return (rv);
if (!softtoken_initialized) {
if (!softtoken_initialized)
return (CKR_CRYPTOKI_NOT_INITIALIZED);
return (CKR_ARGUMENTS_BAD);
return (CKR_OK);
return (CKR_ARGUMENTS_BAD);
return (CKR_OK);
return (CKR_FUNCTION_NOT_PARALLEL);
return (CKR_FUNCTION_NOT_PARALLEL);
char *p = buf;
if (len == 0)
if (cc < 0) {
return (cc);
} else if (cc == 0) {
return (len2);
p += cc;
} while (len > 0);
return (len2);
char *p = buf;
if (cc < 0) {
} else if (cc == 0) {
return (len2);
p += cc;
} while (len > 0);
return (len2);