147e946e7SWyllys Ingersoll /*
247e946e7SWyllys Ingersoll  *		Common Public License Version 0.5
347e946e7SWyllys Ingersoll  *
447e946e7SWyllys Ingersoll  *		THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF
547e946e7SWyllys Ingersoll  *		THIS COMMON PUBLIC LICENSE ("AGREEMENT"). ANY USE,
647e946e7SWyllys Ingersoll  *		REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES
747e946e7SWyllys Ingersoll  *		RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
847e946e7SWyllys Ingersoll  *
947e946e7SWyllys Ingersoll  *		1. DEFINITIONS
1047e946e7SWyllys Ingersoll  *
1147e946e7SWyllys Ingersoll  *		"Contribution" means:
1247e946e7SWyllys Ingersoll  *		      a) in the case of the initial Contributor, the
1347e946e7SWyllys Ingersoll  *		      initial code and documentation distributed under
1447e946e7SWyllys Ingersoll  *		      this Agreement, and
1547e946e7SWyllys Ingersoll  *
1647e946e7SWyllys Ingersoll  *		      b) in the case of each subsequent Contributor:
1747e946e7SWyllys Ingersoll  *		      i) changes to the Program, and
1847e946e7SWyllys Ingersoll  *		      ii) additions to the Program;
1947e946e7SWyllys Ingersoll  *
2047e946e7SWyllys Ingersoll  *		      where such changes and/or additions to the Program
2147e946e7SWyllys Ingersoll  *		      originate from and are distributed by that
2247e946e7SWyllys Ingersoll  *		      particular Contributor. A Contribution 'originates'
2347e946e7SWyllys Ingersoll  *		      from a Contributor if it was added to the Program
2447e946e7SWyllys Ingersoll  *		      by such Contributor itself or anyone acting on such
2547e946e7SWyllys Ingersoll  *		      Contributor's behalf. Contributions do not include
2647e946e7SWyllys Ingersoll  *		      additions to the Program which: (i) are separate
2747e946e7SWyllys Ingersoll  *		      modules of software distributed in conjunction with
2847e946e7SWyllys Ingersoll  *		      the Program under their own license agreement, and
2947e946e7SWyllys Ingersoll  *		      (ii) are not derivative works of the Program.
3047e946e7SWyllys Ingersoll  *
3147e946e7SWyllys Ingersoll  *
3247e946e7SWyllys Ingersoll  *		"Contributor" means any person or entity that distributes
3347e946e7SWyllys Ingersoll  *		the Program.
3447e946e7SWyllys Ingersoll  *
3547e946e7SWyllys Ingersoll  *		"Licensed Patents " mean patent claims licensable by a
3647e946e7SWyllys Ingersoll  *		Contributor which are necessarily infringed by the use or
3747e946e7SWyllys Ingersoll  *		sale of its Contribution alone or when combined with the
3847e946e7SWyllys Ingersoll  *		Program.
3947e946e7SWyllys Ingersoll  *
4047e946e7SWyllys Ingersoll  *		"Program" means the Contributions distributed in
4147e946e7SWyllys Ingersoll  *		accordance with this Agreement.
4247e946e7SWyllys Ingersoll  *
4347e946e7SWyllys Ingersoll  *		"Recipient" means anyone who receives the Program under
4447e946e7SWyllys Ingersoll  *		this Agreement, including all Contributors.
4547e946e7SWyllys Ingersoll  *
4647e946e7SWyllys Ingersoll  *		2. GRANT OF RIGHTS
4747e946e7SWyllys Ingersoll  *
4847e946e7SWyllys Ingersoll  *		      a) Subject to the terms of this Agreement, each
4947e946e7SWyllys Ingersoll  *		      Contributor hereby grants Recipient a
5047e946e7SWyllys Ingersoll  *		      no - exclusive, worldwide, royalt - free copyright
5147e946e7SWyllys Ingersoll  *		      license to reproduce, prepare derivative works of,
5247e946e7SWyllys Ingersoll  *		      publicly display, publicly perform, distribute and
5347e946e7SWyllys Ingersoll  *		      sublicense the Contribution of such Contributor, if
5447e946e7SWyllys Ingersoll  *		      any, and such derivative works, in source code and
5547e946e7SWyllys Ingersoll  *		      object code form.
5647e946e7SWyllys Ingersoll  *
5747e946e7SWyllys Ingersoll  *		      b) Subject to the terms of this Agreement, each
5847e946e7SWyllys Ingersoll  *		      Contributor hereby grants Recipient a
5947e946e7SWyllys Ingersoll  *		      no - exclusive, worldwide, royalt - free patent
6047e946e7SWyllys Ingersoll  *		      license under Licensed Patents to make, use, sell,
6147e946e7SWyllys Ingersoll  *		      offer to sell, import and otherwise transfer the
6247e946e7SWyllys Ingersoll  *		      Contribution of such Contributor, if any, in source
6347e946e7SWyllys Ingersoll  *		      code and object code form. This patent license
6447e946e7SWyllys Ingersoll  *		      shall apply to the combination of the Contribution
6547e946e7SWyllys Ingersoll  *		      and the Program if, at the time the Contribution is
6647e946e7SWyllys Ingersoll  *		      added by the Contributor, such addition of the
6747e946e7SWyllys Ingersoll  *		      Contribution causes such combination to be covered
6847e946e7SWyllys Ingersoll  *		      by the Licensed Patents. The patent license shall
6947e946e7SWyllys Ingersoll  *		      not apply to any other combinations which include
7047e946e7SWyllys Ingersoll  *		      the Contribution. No hardware per se is licensed
7147e946e7SWyllys Ingersoll  *		      hereunder.
7247e946e7SWyllys Ingersoll  *
7347e946e7SWyllys Ingersoll  *		      c) Recipient understands that although each
7447e946e7SWyllys Ingersoll  *		      Contributor grants the licenses to its
7547e946e7SWyllys Ingersoll  *		      Contributions set forth herein, no assurances are
7647e946e7SWyllys Ingersoll  *		      provided by any Contributor that the Program does
7747e946e7SWyllys Ingersoll  *		      not infringe the patent or other intellectual
7847e946e7SWyllys Ingersoll  *		      property rights of any other entity. Each
7947e946e7SWyllys Ingersoll  *		      Contributor disclaims any liability to Recipient
8047e946e7SWyllys Ingersoll  *		      for claims brought by any other entity based on
8147e946e7SWyllys Ingersoll  *		      infringement of intellectual property rights or
8247e946e7SWyllys Ingersoll  *		      otherwise. As a condition to exercising the rights
8347e946e7SWyllys Ingersoll  *		      and licenses granted hereunder, each Recipient
8447e946e7SWyllys Ingersoll  *		      hereby assumes sole responsibility to secure any
8547e946e7SWyllys Ingersoll  *		      other intellectual property rights needed, if any.
8647e946e7SWyllys Ingersoll  *
8747e946e7SWyllys Ingersoll  *		      For example, if a third party patent license is
8847e946e7SWyllys Ingersoll  *		      required to allow Recipient to distribute the
8947e946e7SWyllys Ingersoll  *		      Program, it is Recipient's responsibility to
9047e946e7SWyllys Ingersoll  *		      acquire that license before distributing the
9147e946e7SWyllys Ingersoll  *		      Program.
9247e946e7SWyllys Ingersoll  *
9347e946e7SWyllys Ingersoll  *		      d) Each Contributor represents that to its
9447e946e7SWyllys Ingersoll  *		      knowledge it has sufficient copyright rights in its
9547e946e7SWyllys Ingersoll  *		      Contribution, if any, to grant the copyright
9647e946e7SWyllys Ingersoll  *		      license set forth in this Agreement.
9747e946e7SWyllys Ingersoll  *
9847e946e7SWyllys Ingersoll  *		3. REQUIREMENTS
9947e946e7SWyllys Ingersoll  *
10047e946e7SWyllys Ingersoll  *		A Contributor may choose to distribute the Program in
10147e946e7SWyllys Ingersoll  *		object code form under its own license agreement, provided
10247e946e7SWyllys Ingersoll  *		that:
10347e946e7SWyllys Ingersoll  *		      a) it complies with the terms and conditions of
10447e946e7SWyllys Ingersoll  *		      this Agreement; and
10547e946e7SWyllys Ingersoll  *
10647e946e7SWyllys Ingersoll  *		      b) its license agreement:
10747e946e7SWyllys Ingersoll  *		      i) effectively disclaims on behalf of all
10847e946e7SWyllys Ingersoll  *		      Contributors all warranties and conditions, express
10947e946e7SWyllys Ingersoll  *		      and implied, including warranties or conditions of
11047e946e7SWyllys Ingersoll  *		      title and no - infringement, and implied warranties
11147e946e7SWyllys Ingersoll  *		      or conditions of merchantability and fitness for a
11247e946e7SWyllys Ingersoll  *		      particular purpose;
11347e946e7SWyllys Ingersoll  *
11447e946e7SWyllys Ingersoll  *		      ii) effectively excludes on behalf of all
11547e946e7SWyllys Ingersoll  *		      Contributors all liability for damages, including
11647e946e7SWyllys Ingersoll  *		      direct, indirect, special, incidental and
11747e946e7SWyllys Ingersoll  *		      consequential damages, such as lost profits;
11847e946e7SWyllys Ingersoll  *
11947e946e7SWyllys Ingersoll  *		      iii) states that any provisions which differ from
12047e946e7SWyllys Ingersoll  *		      this Agreement are offered by that Contributor
12147e946e7SWyllys Ingersoll  *		      alone and not by any other party; and
12247e946e7SWyllys Ingersoll  *
12347e946e7SWyllys Ingersoll  *		      iv) states that source code for the Program is
12447e946e7SWyllys Ingersoll  *		      available from such Contributor, and informs
12547e946e7SWyllys Ingersoll  *		      licensees how to obtain it in a reasonable manner
12647e946e7SWyllys Ingersoll  *		      on or through a medium customarily used for
12747e946e7SWyllys Ingersoll  *		      software exchange.
12847e946e7SWyllys Ingersoll  *
12947e946e7SWyllys Ingersoll  *		When the Program is made available in source code form:
13047e946e7SWyllys Ingersoll  *		      a) it must be made available under this Agreement;
13147e946e7SWyllys Ingersoll  *		      and
13247e946e7SWyllys Ingersoll  *		      b) a copy of this Agreement must be included with
13347e946e7SWyllys Ingersoll  *		      each copy of the Program.
13447e946e7SWyllys Ingersoll  *
13547e946e7SWyllys Ingersoll  *		Contributors may not remove or alter any copyright notices
13647e946e7SWyllys Ingersoll  *		contained within the Program.
13747e946e7SWyllys Ingersoll  *
13847e946e7SWyllys Ingersoll  *		Each Contributor must identify itself as the originator of
13947e946e7SWyllys Ingersoll  *		its Contribution, if any, in a manner that reasonably
14047e946e7SWyllys Ingersoll  *		allows subsequent Recipients to identify the originator of
14147e946e7SWyllys Ingersoll  *		the Contribution.
14247e946e7SWyllys Ingersoll  *
14347e946e7SWyllys Ingersoll  *
14447e946e7SWyllys Ingersoll  *		4. COMMERCIAL DISTRIBUTION
14547e946e7SWyllys Ingersoll  *
14647e946e7SWyllys Ingersoll  *		Commercial distributors of software may accept certain
14747e946e7SWyllys Ingersoll  *		responsibilities with respect to end users, business
14847e946e7SWyllys Ingersoll  *		partners and the like. While this license is intended to
14947e946e7SWyllys Ingersoll  *		facilitate the commercial use of the Program, the
15047e946e7SWyllys Ingersoll  *		Contributor who includes the Program in a commercial
15147e946e7SWyllys Ingersoll  *		product offering should do so in a manner which does not
15247e946e7SWyllys Ingersoll  *		create potential liability for other Contributors.
15347e946e7SWyllys Ingersoll  *		Therefore, if a Contributor includes the Program in a
15447e946e7SWyllys Ingersoll  *		commercial product offering, such Contributor ("Commercial
15547e946e7SWyllys Ingersoll  *		Contributor") hereby agrees to defend and indemnify every
15647e946e7SWyllys Ingersoll  *		other Contributor ("Indemnified Contributor") against any
15747e946e7SWyllys Ingersoll  *		losses, damages and costs (collectively "Losses") arising
15847e946e7SWyllys Ingersoll  *		from claims, lawsuits and other legal actions brought by a
15947e946e7SWyllys Ingersoll  *		third party against the Indemnified Contributor to the
16047e946e7SWyllys Ingersoll  *		extent caused by the acts or omissions of such Commercial
16147e946e7SWyllys Ingersoll  *		Contributor in connection with its distribution of the
16247e946e7SWyllys Ingersoll  *		Program in a commercial product offering. The obligations
16347e946e7SWyllys Ingersoll  *		in this section do not apply to any claims or Losses
16447e946e7SWyllys Ingersoll  *		relating to any actual or alleged intellectual property
16547e946e7SWyllys Ingersoll  *		infringement. In order to qualify, an Indemnified
16647e946e7SWyllys Ingersoll  *		Contributor must: a) promptly notify the Commercial
16747e946e7SWyllys Ingersoll  *		Contributor in writing of such claim, and b) allow the
16847e946e7SWyllys Ingersoll  *		Commercial Contributor to control, and cooperate with the
16947e946e7SWyllys Ingersoll  *		Commercial Contributor in, the defense and any related
17047e946e7SWyllys Ingersoll  *		settlement negotiations. The Indemnified Contributor may
17147e946e7SWyllys Ingersoll  *		participate in any such claim at its own expense.
17247e946e7SWyllys Ingersoll  *
17347e946e7SWyllys Ingersoll  *
17447e946e7SWyllys Ingersoll  *		For example, a Contributor might include the Program in a
17547e946e7SWyllys Ingersoll  *		commercial product offering, Product X. That Contributor
17647e946e7SWyllys Ingersoll  *		is then a Commercial Contributor. If that Commercial
17747e946e7SWyllys Ingersoll  *		Contributor then makes performance claims, or offers
17847e946e7SWyllys Ingersoll  *		warranties related to Product X, those performance claims
17947e946e7SWyllys Ingersoll  *		and warranties are such Commercial Contributor's
18047e946e7SWyllys Ingersoll  *		responsibility alone. Under this section, the Commercial
18147e946e7SWyllys Ingersoll  *		Contributor would have to defend claims against the other
18247e946e7SWyllys Ingersoll  *		Contributors related to those performance claims and
18347e946e7SWyllys Ingersoll  *		warranties, and if a court requires any other Contributor
18447e946e7SWyllys Ingersoll  *		to pay any damages as a result, the Commercial Contributor
18547e946e7SWyllys Ingersoll  *		must pay those damages.
18647e946e7SWyllys Ingersoll  *
18747e946e7SWyllys Ingersoll  *
18847e946e7SWyllys Ingersoll  *		5. NO WARRANTY
18947e946e7SWyllys Ingersoll  *
19047e946e7SWyllys Ingersoll  *		EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE
19147e946e7SWyllys Ingersoll  *		PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT
19247e946e7SWyllys Ingersoll  *		WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR
19347e946e7SWyllys Ingersoll  *		IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR
19447e946e7SWyllys Ingersoll  *		CONDITIONS OF TITLE, NO - INFRINGEMENT, MERCHANTABILITY OR
19547e946e7SWyllys Ingersoll  *		FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
19647e946e7SWyllys Ingersoll  *		responsible for determining the appropriateness of using
19747e946e7SWyllys Ingersoll  *		and distributing the Program and assumes all risks
19847e946e7SWyllys Ingersoll  *		associated with its exercise of rights under this
19947e946e7SWyllys Ingersoll  *		Agreement, including but not limited to the risks and
20047e946e7SWyllys Ingersoll  *		costs of program errors, compliance with applicable laws,
20147e946e7SWyllys Ingersoll  *		damage to or loss of data, programs or equipment, and
20247e946e7SWyllys Ingersoll  *		unavailability or interruption of operations.
20347e946e7SWyllys Ingersoll  *
20447e946e7SWyllys Ingersoll  *		6. DISCLAIMER OF LIABILITY
20547e946e7SWyllys Ingersoll  *		EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER
20647e946e7SWyllys Ingersoll  *		RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY
20747e946e7SWyllys Ingersoll  *		FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
20847e946e7SWyllys Ingersoll  *		OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION
20947e946e7SWyllys Ingersoll  *		LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
21047e946e7SWyllys Ingersoll  *		LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21147e946e7SWyllys Ingersoll  *		(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
21247e946e7SWyllys Ingersoll  *		OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE
21347e946e7SWyllys Ingersoll  *		OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE
21447e946e7SWyllys Ingersoll  *		POSSIBILITY OF SUCH DAMAGES.
21547e946e7SWyllys Ingersoll  *
21647e946e7SWyllys Ingersoll  *		7. GENERAL
21747e946e7SWyllys Ingersoll  *
21847e946e7SWyllys Ingersoll  *		If any provision of this Agreement is invalid or
21947e946e7SWyllys Ingersoll  *		unenforceable under applicable law, it shall not affect
22047e946e7SWyllys Ingersoll  *		the validity or enforceability of the remainder of the
22147e946e7SWyllys Ingersoll  *		terms of this Agreement, and without further action by the
22247e946e7SWyllys Ingersoll  *		parties hereto, such provision shall be reformed to the
22347e946e7SWyllys Ingersoll  *		minimum extent necessary to make such provision valid and
22447e946e7SWyllys Ingersoll  *		enforceable.
22547e946e7SWyllys Ingersoll  *
22647e946e7SWyllys Ingersoll  *
22747e946e7SWyllys Ingersoll  *		If Recipient institutes patent litigation against a
22847e946e7SWyllys Ingersoll  *		Contributor with respect to a patent applicable to
22947e946e7SWyllys Ingersoll  *		software (including a cros - claim or counterclaim in a
23047e946e7SWyllys Ingersoll  *		lawsuit), then any patent licenses granted by that
23147e946e7SWyllys Ingersoll  *		Contributor to such Recipient under this Agreement shall
23247e946e7SWyllys Ingersoll  *		terminate as of the date such litigation is filed. In
23347e946e7SWyllys Ingersoll  *		addition, If Recipient institutes patent litigation
23447e946e7SWyllys Ingersoll  *		against any entity (including a cros - claim or
23547e946e7SWyllys Ingersoll  *		counterclaim in a lawsuit) alleging that the Program
23647e946e7SWyllys Ingersoll  *		itself (excluding combinations of the Program with other
23747e946e7SWyllys Ingersoll  *		software or hardware) infringes such Recipient's
23847e946e7SWyllys Ingersoll  *		patent(s), then such Recipient's rights granted under
23947e946e7SWyllys Ingersoll  *		Section 2(b) shall terminate as of the date such
24047e946e7SWyllys Ingersoll  *		litigation is filed.
24147e946e7SWyllys Ingersoll  *
24247e946e7SWyllys Ingersoll  *		All Recipient's rights under this Agreement shall
24347e946e7SWyllys Ingersoll  *		terminate if it fails to comply with any of the material
24447e946e7SWyllys Ingersoll  *		terms or conditions of this Agreement and does not cure
24547e946e7SWyllys Ingersoll  *		such failure in a reasonable period of time after becoming
24647e946e7SWyllys Ingersoll  *		aware of such noncompliance. If all Recipient's rights
24747e946e7SWyllys Ingersoll  *		under this Agreement terminate, Recipient agrees to cease
24847e946e7SWyllys Ingersoll  *		use and distribution of the Program as soon as reasonably
24947e946e7SWyllys Ingersoll  *		practicable. However, Recipient's obligations under this
25047e946e7SWyllys Ingersoll  *		Agreement and any licenses granted by Recipient relating
25147e946e7SWyllys Ingersoll  *		to the Program shall continue and survive.
25247e946e7SWyllys Ingersoll  *
25347e946e7SWyllys Ingersoll  *		Everyone is permitted to copy and distribute copies of
25447e946e7SWyllys Ingersoll  *		this Agreement, but in order to avoid inconsistency the
25547e946e7SWyllys Ingersoll  *		Agreement is copyrighted and may only be modified in the
25647e946e7SWyllys Ingersoll  *		following manner. The Agreement Steward reserves the right
25747e946e7SWyllys Ingersoll  *		to publish new versions (including revisions) of this
25847e946e7SWyllys Ingersoll  *		Agreement from time to time. No one other than the
25947e946e7SWyllys Ingersoll  *		Agreement Steward has the right to modify this Agreement.
26047e946e7SWyllys Ingersoll  *
26147e946e7SWyllys Ingersoll  *		IBM is the initial Agreement Steward. IBM may assign the
26247e946e7SWyllys Ingersoll  *		responsibility to serve as the Agreement Steward to a
26347e946e7SWyllys Ingersoll  *		suitable separate entity. Each new version of the
26447e946e7SWyllys Ingersoll  *		Agreement will be given a distinguishing version number.
26547e946e7SWyllys Ingersoll  *		The Program (including Contributions) may always be
26647e946e7SWyllys Ingersoll  *		distributed subject to the version of the Agreement under
26747e946e7SWyllys Ingersoll  *		which it was received. In addition, after a new version of
26847e946e7SWyllys Ingersoll  *		the Agreement is published, Contributor may elect to
26947e946e7SWyllys Ingersoll  *		distribute the Program (including its Contributions) under
27047e946e7SWyllys Ingersoll  *		the new version. Except as expressly stated in Sections
27147e946e7SWyllys Ingersoll  *		2(a) and 2(b) above, Recipient receives no rights or
27247e946e7SWyllys Ingersoll  *		licenses to the intellectual property of any Contributor
27347e946e7SWyllys Ingersoll  *		under this Agreement, whether expressly, by implication,
27447e946e7SWyllys Ingersoll  *		estoppel or otherwise. All rights in the Program not
27547e946e7SWyllys Ingersoll  *		expressly granted under this Agreement are reserved.
27647e946e7SWyllys Ingersoll  *
27747e946e7SWyllys Ingersoll  *
27847e946e7SWyllys Ingersoll  *		This Agreement is governed by the laws of the State of New
27947e946e7SWyllys Ingersoll  *		York and the intellectual property laws of the United
28047e946e7SWyllys Ingersoll  *		States of America. No party to this Agreement will bring a
28147e946e7SWyllys Ingersoll  *		legal action under this Agreement more than one year after
28247e946e7SWyllys Ingersoll  *		the cause of action arose. Each party waives its rights to
28347e946e7SWyllys Ingersoll  *		a jury trial in any resulting litigation.
28447e946e7SWyllys Ingersoll  *
28547e946e7SWyllys Ingersoll  *
28647e946e7SWyllys Ingersoll  *
28747e946e7SWyllys Ingersoll  * (C) COPYRIGHT International Business Machines Corp. 2001, 2002
28847e946e7SWyllys Ingersoll  */
28947e946e7SWyllys Ingersoll /*
29047e946e7SWyllys Ingersoll  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
29147e946e7SWyllys Ingersoll  * Use is subject to license terms.
29247e946e7SWyllys Ingersoll  */
29347e946e7SWyllys Ingersoll 
29447e946e7SWyllys Ingersoll #include "tpmtok_int.h"
29547e946e7SWyllys Ingersoll 
29647e946e7SWyllys Ingersoll pthread_rwlock_t obj_list_rw_mutex = PTHREAD_RWLOCK_INITIALIZER;
29747e946e7SWyllys Ingersoll 
29847e946e7SWyllys Ingersoll static CK_RV
29947e946e7SWyllys Ingersoll object_mgr_search_shm_for_obj(TOK_OBJ_ENTRY *,
30047e946e7SWyllys Ingersoll 	CK_ULONG, CK_ULONG, OBJECT *, CK_ULONG *);
30147e946e7SWyllys Ingersoll static CK_RV object_mgr_update_from_shm(TSS_HCONTEXT);
30247e946e7SWyllys Ingersoll static CK_RV object_mgr_check_shm(TSS_HCONTEXT, OBJECT *);
30347e946e7SWyllys Ingersoll 
304*ab8176c2SWyllys Ingersoll static CK_RV
check_object_access(SESSION * sess,OBJECT * o)305*ab8176c2SWyllys Ingersoll check_object_access(SESSION *sess, OBJECT *o)
30647e946e7SWyllys Ingersoll {
307*ab8176c2SWyllys Ingersoll 	CK_BBOOL sess_obj, priv_obj;
308*ab8176c2SWyllys Ingersoll 	CK_RV rc = CKR_OK;
309*ab8176c2SWyllys Ingersoll 
310*ab8176c2SWyllys Ingersoll 	/*
311*ab8176c2SWyllys Ingersoll 	 * check whether session has permissions to create the object, etc
312*ab8176c2SWyllys Ingersoll 	 *
313*ab8176c2SWyllys Ingersoll 	 * Object	  R/O	    R/W    R/O   R/W    R/W
314*ab8176c2SWyllys Ingersoll 	 * Type		  Public   Public  User  User   SO
315*ab8176c2SWyllys Ingersoll 	 * -------------------------------------------------------------
316*ab8176c2SWyllys Ingersoll 	 * Public session  R/W	    R/W	   R/W   R/W    R/W
317*ab8176c2SWyllys Ingersoll 	 * Private session			 R/W    R/W
318*ab8176c2SWyllys Ingersoll 	 * Public token	   R/O	    R/W	   R/O   R/W    R/W
319*ab8176c2SWyllys Ingersoll 	 * Private token			 R/O    R/W
320*ab8176c2SWyllys Ingersoll 	 */
32147e946e7SWyllys Ingersoll 	sess_obj = object_is_session_object(o);
32247e946e7SWyllys Ingersoll 	priv_obj = object_is_private(o);
32347e946e7SWyllys Ingersoll 
32447e946e7SWyllys Ingersoll 	if (sess->session_info.state == CKS_RO_PUBLIC_SESSION) {
32547e946e7SWyllys Ingersoll 		if (priv_obj) {
32647e946e7SWyllys Ingersoll 			rc = CKR_USER_NOT_LOGGED_IN;
32747e946e7SWyllys Ingersoll 			goto done;
32847e946e7SWyllys Ingersoll 		}
32947e946e7SWyllys Ingersoll 
330*ab8176c2SWyllys Ingersoll 		if (!sess_obj) {
33147e946e7SWyllys Ingersoll 			rc = CKR_SESSION_READ_ONLY;
33247e946e7SWyllys Ingersoll 			goto done;
33347e946e7SWyllys Ingersoll 		}
33447e946e7SWyllys Ingersoll 	}
33547e946e7SWyllys Ingersoll 
33647e946e7SWyllys Ingersoll 	if (sess->session_info.state == CKS_RO_USER_FUNCTIONS) {
33747e946e7SWyllys Ingersoll 		if (! sess_obj) {
33847e946e7SWyllys Ingersoll 			rc = CKR_SESSION_READ_ONLY;
33947e946e7SWyllys Ingersoll 			goto done;
34047e946e7SWyllys Ingersoll 		}
34147e946e7SWyllys Ingersoll 	}
34247e946e7SWyllys Ingersoll 
34347e946e7SWyllys Ingersoll 	if (sess->session_info.state == CKS_RW_PUBLIC_SESSION) {
34447e946e7SWyllys Ingersoll 		if (priv_obj) {
34547e946e7SWyllys Ingersoll 			rc = CKR_USER_NOT_LOGGED_IN;
34647e946e7SWyllys Ingersoll 			goto done;
34747e946e7SWyllys Ingersoll 		}
34847e946e7SWyllys Ingersoll 	}
34947e946e7SWyllys Ingersoll 
35047e946e7SWyllys Ingersoll 	if (sess->session_info.state == CKS_RW_SO_FUNCTIONS) {
35147e946e7SWyllys Ingersoll 		if (priv_obj) {
35247e946e7SWyllys Ingersoll 			rc = CKR_USER_NOT_LOGGED_IN;
35347e946e7SWyllys Ingersoll 			goto done;
35447e946e7SWyllys Ingersoll 		}
35547e946e7SWyllys Ingersoll 	}
356*ab8176c2SWyllys Ingersoll done:
357*ab8176c2SWyllys Ingersoll 	return (rc);
358*ab8176c2SWyllys Ingersoll }
35947e946e7SWyllys Ingersoll 
360*ab8176c2SWyllys Ingersoll CK_RV
object_mgr_add(SESSION * sess,CK_ATTRIBUTE * pTemplate,CK_ULONG ulCount,CK_OBJECT_HANDLE * handle)361*ab8176c2SWyllys Ingersoll object_mgr_add(SESSION	  * sess,
362*ab8176c2SWyllys Ingersoll 	CK_ATTRIBUTE	* pTemplate,
363*ab8176c2SWyllys Ingersoll 	CK_ULONG	   ulCount,
364*ab8176c2SWyllys Ingersoll 	CK_OBJECT_HANDLE * handle)
365*ab8176c2SWyllys Ingersoll {
366*ab8176c2SWyllys Ingersoll 	OBJECT    * o = NULL;
367*ab8176c2SWyllys Ingersoll 	CK_BBOOL    priv_obj, sess_obj;
368*ab8176c2SWyllys Ingersoll 	CK_RV	rc;
369*ab8176c2SWyllys Ingersoll 
370*ab8176c2SWyllys Ingersoll 	if (! sess || ! pTemplate || ! handle) {
371*ab8176c2SWyllys Ingersoll 		return (CKR_FUNCTION_FAILED);
372*ab8176c2SWyllys Ingersoll 	}
373*ab8176c2SWyllys Ingersoll 
374*ab8176c2SWyllys Ingersoll 	rc = pthread_mutex_lock(&obj_list_mutex);
375*ab8176c2SWyllys Ingersoll 	if (rc != CKR_OK)
376*ab8176c2SWyllys Ingersoll 		return (CKR_FUNCTION_FAILED);
377*ab8176c2SWyllys Ingersoll 
378*ab8176c2SWyllys Ingersoll 	rc = object_create(pTemplate, ulCount, &o);
379*ab8176c2SWyllys Ingersoll 	if (rc != CKR_OK) {
380*ab8176c2SWyllys Ingersoll 		goto done;
381*ab8176c2SWyllys Ingersoll 	}
382*ab8176c2SWyllys Ingersoll 	rc = check_object_access(sess, o);
383*ab8176c2SWyllys Ingersoll 	if (rc != CKR_OK)
384*ab8176c2SWyllys Ingersoll 		goto done;
385*ab8176c2SWyllys Ingersoll 
386*ab8176c2SWyllys Ingersoll 	/*
387*ab8176c2SWyllys Ingersoll 	 * okay, object is created and the session permissions look okay.
388*ab8176c2SWyllys Ingersoll 	 * add the object to the appropriate list and assign an object handle
389*ab8176c2SWyllys Ingersoll 	 */
390*ab8176c2SWyllys Ingersoll 	sess_obj = object_is_session_object(o);
391*ab8176c2SWyllys Ingersoll 	priv_obj = object_is_private(o);
39247e946e7SWyllys Ingersoll 
39347e946e7SWyllys Ingersoll 	if (sess_obj) {
39447e946e7SWyllys Ingersoll 		o->session = sess;
39547e946e7SWyllys Ingersoll 		(void) memset(o->name, 0x00, sizeof (CK_BYTE) * 8);
39647e946e7SWyllys Ingersoll 
39747e946e7SWyllys Ingersoll 		sess_obj_list = dlist_add_as_first(sess_obj_list, o);
39847e946e7SWyllys Ingersoll 	} else {
39947e946e7SWyllys Ingersoll 		CK_BYTE current[8];
40047e946e7SWyllys Ingersoll 		CK_BYTE next[8];
40147e946e7SWyllys Ingersoll 
40247e946e7SWyllys Ingersoll 		rc = XProcLock(xproclock);
40347e946e7SWyllys Ingersoll 		if (rc != CKR_OK) {
40447e946e7SWyllys Ingersoll 			goto done;
40547e946e7SWyllys Ingersoll 		} else {
40647e946e7SWyllys Ingersoll 
40747e946e7SWyllys Ingersoll 			if (priv_obj) {
40847e946e7SWyllys Ingersoll 				if (global_shm->num_priv_tok_obj >=
40947e946e7SWyllys Ingersoll 				    MAX_TOK_OBJS) {
41047e946e7SWyllys Ingersoll 					rc = CKR_HOST_MEMORY;
41147e946e7SWyllys Ingersoll 					(void) XProcUnLock(xproclock);
41247e946e7SWyllys Ingersoll 					goto done;
41347e946e7SWyllys Ingersoll 				}
41447e946e7SWyllys Ingersoll 			} else {
41547e946e7SWyllys Ingersoll 				if (global_shm->num_publ_tok_obj >=
41647e946e7SWyllys Ingersoll 				    MAX_TOK_OBJS) {
41747e946e7SWyllys Ingersoll 					rc = CKR_HOST_MEMORY;
41847e946e7SWyllys Ingersoll 					(void) XProcUnLock(xproclock);
41947e946e7SWyllys Ingersoll 					goto done;
42047e946e7SWyllys Ingersoll 				}
42147e946e7SWyllys Ingersoll 			}
42247e946e7SWyllys Ingersoll 
42347e946e7SWyllys Ingersoll 			(void) memcpy(current,
42447e946e7SWyllys Ingersoll 			    &nv_token_data->next_token_object_name, 8);
42547e946e7SWyllys Ingersoll 
42647e946e7SWyllys Ingersoll 			o->session = NULL;
42747e946e7SWyllys Ingersoll 			(void) memcpy(&o->name, current, 8);
42847e946e7SWyllys Ingersoll 
42947e946e7SWyllys Ingersoll 			(void) compute_next_token_obj_name(current, next);
43047e946e7SWyllys Ingersoll 
43147e946e7SWyllys Ingersoll 			(void) memcpy(&nv_token_data->next_token_object_name,
43247e946e7SWyllys Ingersoll 			    next, 8);
43347e946e7SWyllys Ingersoll 
43447e946e7SWyllys Ingersoll 			rc = save_token_object(sess->hContext, o);
43547e946e7SWyllys Ingersoll 			if (rc != CKR_OK) {
43647e946e7SWyllys Ingersoll 				(void) XProcUnLock(xproclock);
43747e946e7SWyllys Ingersoll 				goto done;
43847e946e7SWyllys Ingersoll 			}
43947e946e7SWyllys Ingersoll 
44047e946e7SWyllys Ingersoll 			(void) object_mgr_add_to_shm(o);
44147e946e7SWyllys Ingersoll 			(void) XProcUnLock(xproclock);
44247e946e7SWyllys Ingersoll 
44347e946e7SWyllys Ingersoll 			(void) save_token_data(nv_token_data);
44447e946e7SWyllys Ingersoll 		}
44547e946e7SWyllys Ingersoll 
44647e946e7SWyllys Ingersoll 		if (priv_obj)
44747e946e7SWyllys Ingersoll 			priv_token_obj_list =
44847e946e7SWyllys Ingersoll 			    dlist_add_as_last(priv_token_obj_list, o);
44947e946e7SWyllys Ingersoll 		else
45047e946e7SWyllys Ingersoll 			publ_token_obj_list =
45147e946e7SWyllys Ingersoll 			    dlist_add_as_last(publ_token_obj_list, o);
45247e946e7SWyllys Ingersoll 	}
45347e946e7SWyllys Ingersoll 
45447e946e7SWyllys Ingersoll 	rc = object_mgr_add_to_map(sess, o, handle);
45547e946e7SWyllys Ingersoll 	if (rc != CKR_OK) {
45647e946e7SWyllys Ingersoll 		DL_NODE *node = NULL;
45747e946e7SWyllys Ingersoll 
45847e946e7SWyllys Ingersoll 		if (sess_obj) {
45947e946e7SWyllys Ingersoll 			node = dlist_find(sess_obj_list, o);
46047e946e7SWyllys Ingersoll 			if (node)
46147e946e7SWyllys Ingersoll 				sess_obj_list =
46247e946e7SWyllys Ingersoll 				    dlist_remove_node(sess_obj_list, node);
46347e946e7SWyllys Ingersoll 		} else {
46447e946e7SWyllys Ingersoll 			(void) delete_token_object(o);
46547e946e7SWyllys Ingersoll 
46647e946e7SWyllys Ingersoll 			if (priv_obj) {
46747e946e7SWyllys Ingersoll 				node = dlist_find(priv_token_obj_list, o);
46847e946e7SWyllys Ingersoll 				if (node)
46947e946e7SWyllys Ingersoll 					priv_token_obj_list =
47047e946e7SWyllys Ingersoll 					    dlist_remove_node(
47147e946e7SWyllys Ingersoll 					    priv_token_obj_list, node);
47247e946e7SWyllys Ingersoll 			} else {
47347e946e7SWyllys Ingersoll 				node = dlist_find(publ_token_obj_list, o);
47447e946e7SWyllys Ingersoll 				if (node)
47547e946e7SWyllys Ingersoll 					publ_token_obj_list =
47647e946e7SWyllys Ingersoll 					    dlist_remove_node(
47747e946e7SWyllys Ingersoll 					    publ_token_obj_list, node);
47847e946e7SWyllys Ingersoll 			}
47947e946e7SWyllys Ingersoll 
48047e946e7SWyllys Ingersoll 			rc = XProcLock(xproclock);
48147e946e7SWyllys Ingersoll 			if (rc != CKR_OK) {
48247e946e7SWyllys Ingersoll 				goto done;
48347e946e7SWyllys Ingersoll 			}
48447e946e7SWyllys Ingersoll 			(void) object_mgr_del_from_shm(o);
48547e946e7SWyllys Ingersoll 
48647e946e7SWyllys Ingersoll 			(void) XProcUnLock(xproclock);
48747e946e7SWyllys Ingersoll 		}
48847e946e7SWyllys Ingersoll 	}
48947e946e7SWyllys Ingersoll 
49047e946e7SWyllys Ingersoll done:
49147e946e7SWyllys Ingersoll 	(void) pthread_mutex_unlock(&obj_list_mutex);
49247e946e7SWyllys Ingersoll 
49347e946e7SWyllys Ingersoll 	if ((rc != CKR_OK) && (o != NULL))
49447e946e7SWyllys Ingersoll 		(void) object_free(o);
49547e946e7SWyllys Ingersoll 
49647e946e7SWyllys Ingersoll 	return (rc);
49747e946e7SWyllys Ingersoll }
49847e946e7SWyllys Ingersoll 
49947e946e7SWyllys Ingersoll CK_RV
object_mgr_add_to_map(SESSION * sess,OBJECT * obj,CK_OBJECT_HANDLE * handle)50047e946e7SWyllys Ingersoll object_mgr_add_to_map(SESSION	  * sess,
50147e946e7SWyllys Ingersoll 	OBJECT	   * obj,
50247e946e7SWyllys Ingersoll 	CK_OBJECT_HANDLE * handle) {
50347e946e7SWyllys Ingersoll 	OBJECT_MAP  *map_node = NULL;
50447e946e7SWyllys Ingersoll 
50547e946e7SWyllys Ingersoll 	if (! sess || ! obj || ! handle) {
50647e946e7SWyllys Ingersoll 		return (CKR_FUNCTION_FAILED);
50747e946e7SWyllys Ingersoll 	}
50847e946e7SWyllys Ingersoll 
50947e946e7SWyllys Ingersoll 	map_node = (OBJECT_MAP *)malloc(sizeof (OBJECT_MAP));
51047e946e7SWyllys Ingersoll 	if (! map_node) {
51147e946e7SWyllys Ingersoll 		return (CKR_HOST_MEMORY);
51247e946e7SWyllys Ingersoll 	}
51347e946e7SWyllys Ingersoll 	map_node->handle   = next_object_handle++;
51447e946e7SWyllys Ingersoll 	map_node->session  = sess;
51547e946e7SWyllys Ingersoll 	map_node->ptr	= obj;
51647e946e7SWyllys Ingersoll 
51747e946e7SWyllys Ingersoll 	if (obj->session != NULL)
51847e946e7SWyllys Ingersoll 		map_node->is_session_obj = TRUE;
51947e946e7SWyllys Ingersoll 	else
52047e946e7SWyllys Ingersoll 		map_node->is_session_obj = FALSE;
52147e946e7SWyllys Ingersoll 
52247e946e7SWyllys Ingersoll 	// add the new map entry to the list
52347e946e7SWyllys Ingersoll 	if (pthread_rwlock_wrlock(&obj_list_rw_mutex)) {
52447e946e7SWyllys Ingersoll 		return (CKR_FUNCTION_FAILED);
52547e946e7SWyllys Ingersoll 	}
52647e946e7SWyllys Ingersoll 	object_map = dlist_add_as_first(object_map, map_node);
52747e946e7SWyllys Ingersoll 	(void) pthread_rwlock_unlock(&obj_list_rw_mutex);
52847e946e7SWyllys Ingersoll 
52947e946e7SWyllys Ingersoll 	*handle = map_node->handle;
53047e946e7SWyllys Ingersoll 	return (CKR_OK);
53147e946e7SWyllys Ingersoll }
53247e946e7SWyllys Ingersoll 
53347e946e7SWyllys Ingersoll // object_mgr_copy()
53447e946e7SWyllys Ingersoll //
53547e946e7SWyllys Ingersoll // algorithm:
53647e946e7SWyllys Ingersoll //    1) find the old object
53747e946e7SWyllys Ingersoll //    2) get the template from the old object
53847e946e7SWyllys Ingersoll //    3) merge in the new object's template
53947e946e7SWyllys Ingersoll //    4) perform class - specific sanity checks
54047e946e7SWyllys Ingersoll //
54147e946e7SWyllys Ingersoll CK_RV
object_mgr_copy(SESSION * sess,CK_ATTRIBUTE * pTemplate,CK_ULONG ulCount,CK_OBJECT_HANDLE old_handle,CK_OBJECT_HANDLE * new_handle)54247e946e7SWyllys Ingersoll object_mgr_copy(SESSION	  * sess,
54347e946e7SWyllys Ingersoll 	CK_ATTRIBUTE	* pTemplate,
54447e946e7SWyllys Ingersoll 	CK_ULONG	   ulCount,
54547e946e7SWyllys Ingersoll 	CK_OBJECT_HANDLE   old_handle,
54647e946e7SWyllys Ingersoll 	CK_OBJECT_HANDLE * new_handle)
54747e946e7SWyllys Ingersoll {
54847e946e7SWyllys Ingersoll 	OBJECT	*old_obj = NULL;
54947e946e7SWyllys Ingersoll 	OBJECT	*new_obj = NULL;
55047e946e7SWyllys Ingersoll 	CK_BBOOL    priv_obj;
55147e946e7SWyllys Ingersoll 	CK_BBOOL    sess_obj;
55247e946e7SWyllys Ingersoll 	CK_RV	rc;
55347e946e7SWyllys Ingersoll 
55447e946e7SWyllys Ingersoll 	if (! sess || ! pTemplate || ! new_handle) {
55547e946e7SWyllys Ingersoll 		return (CKR_FUNCTION_FAILED);
55647e946e7SWyllys Ingersoll 	}
55747e946e7SWyllys Ingersoll 
55847e946e7SWyllys Ingersoll 	rc = pthread_mutex_lock(&obj_list_mutex);
55947e946e7SWyllys Ingersoll 	if (rc != CKR_OK)
56047e946e7SWyllys Ingersoll 		return (CKR_FUNCTION_FAILED);
56147e946e7SWyllys Ingersoll 
56247e946e7SWyllys Ingersoll 	rc = object_mgr_find_in_map1(sess->hContext, old_handle, &old_obj);
56347e946e7SWyllys Ingersoll 	if (rc != CKR_OK) {
56447e946e7SWyllys Ingersoll 		goto done;
56547e946e7SWyllys Ingersoll 	}
56647e946e7SWyllys Ingersoll 	rc = object_copy(pTemplate, ulCount, old_obj, &new_obj);
56747e946e7SWyllys Ingersoll 	if (rc != CKR_OK) {
56847e946e7SWyllys Ingersoll 		goto done;
56947e946e7SWyllys Ingersoll 	}
57047e946e7SWyllys Ingersoll 
571*ab8176c2SWyllys Ingersoll 	rc = check_object_access(sess, new_obj);
572*ab8176c2SWyllys Ingersoll 	if (rc != CKR_OK)
573*ab8176c2SWyllys Ingersoll 		goto done;
574*ab8176c2SWyllys Ingersoll 
57547e946e7SWyllys Ingersoll 	sess_obj = object_is_session_object(new_obj);
57647e946e7SWyllys Ingersoll 	priv_obj = object_is_private(new_obj);
57747e946e7SWyllys Ingersoll 
57847e946e7SWyllys Ingersoll 	if (sess_obj) {
57947e946e7SWyllys Ingersoll 		new_obj->session = sess;
58047e946e7SWyllys Ingersoll 		(void) memset(&new_obj->name, 0x00, sizeof (CK_BYTE) * 8);
58147e946e7SWyllys Ingersoll 
58247e946e7SWyllys Ingersoll 		sess_obj_list = dlist_add_as_first(sess_obj_list, new_obj);
58347e946e7SWyllys Ingersoll 	} else {
58447e946e7SWyllys Ingersoll 		CK_BYTE current[8];
58547e946e7SWyllys Ingersoll 		CK_BYTE next[8];
58647e946e7SWyllys Ingersoll 
58747e946e7SWyllys Ingersoll 		rc = XProcLock(xproclock);
58847e946e7SWyllys Ingersoll 		if (rc != CKR_OK) {
58947e946e7SWyllys Ingersoll 			goto done;
59047e946e7SWyllys Ingersoll 		} else {
59147e946e7SWyllys Ingersoll 			if (priv_obj) {
59247e946e7SWyllys Ingersoll 				if (global_shm->num_priv_tok_obj >=
59347e946e7SWyllys Ingersoll 				    MAX_TOK_OBJS) {
59447e946e7SWyllys Ingersoll 					(void) XProcUnLock(xproclock);
59547e946e7SWyllys Ingersoll 					rc = CKR_HOST_MEMORY;
59647e946e7SWyllys Ingersoll 					goto done;
59747e946e7SWyllys Ingersoll 				}
59847e946e7SWyllys Ingersoll 			} else {
59947e946e7SWyllys Ingersoll 				if (global_shm->num_publ_tok_obj >=
60047e946e7SWyllys Ingersoll 				    MAX_TOK_OBJS) {
60147e946e7SWyllys Ingersoll 					(void) XProcUnLock(xproclock);
60247e946e7SWyllys Ingersoll 					rc = CKR_HOST_MEMORY;
60347e946e7SWyllys Ingersoll 					goto done;
60447e946e7SWyllys Ingersoll 				}
60547e946e7SWyllys Ingersoll 			}
60647e946e7SWyllys Ingersoll 			(void) memcpy(current,
60747e946e7SWyllys Ingersoll 			    &nv_token_data->next_token_object_name, 8);
60847e946e7SWyllys Ingersoll 
60947e946e7SWyllys Ingersoll 			new_obj->session = NULL;
61047e946e7SWyllys Ingersoll 			(void) memcpy(&new_obj->name, current, 8);
61147e946e7SWyllys Ingersoll 
61247e946e7SWyllys Ingersoll 			(void) compute_next_token_obj_name(current, next);
61347e946e7SWyllys Ingersoll 			(void) memcpy(&nv_token_data->next_token_object_name,
61447e946e7SWyllys Ingersoll 			    next, 8);
61547e946e7SWyllys Ingersoll 
61647e946e7SWyllys Ingersoll 			rc = save_token_object(sess->hContext, new_obj);
61747e946e7SWyllys Ingersoll 			if (rc != CKR_OK) {
61847e946e7SWyllys Ingersoll 				(void) XProcUnLock(xproclock);
61947e946e7SWyllys Ingersoll 				goto done;
62047e946e7SWyllys Ingersoll 			}
62147e946e7SWyllys Ingersoll 
62247e946e7SWyllys Ingersoll 			(void) object_mgr_add_to_shm(new_obj);
62347e946e7SWyllys Ingersoll 
62447e946e7SWyllys Ingersoll 			(void) XProcUnLock(xproclock);
62547e946e7SWyllys Ingersoll 
62647e946e7SWyllys Ingersoll 			(void) save_token_data(nv_token_data);
62747e946e7SWyllys Ingersoll 		}
62847e946e7SWyllys Ingersoll 
62947e946e7SWyllys Ingersoll 		if (priv_obj)
63047e946e7SWyllys Ingersoll 			priv_token_obj_list = dlist_add_as_last(
63147e946e7SWyllys Ingersoll 			    priv_token_obj_list, new_obj);
63247e946e7SWyllys Ingersoll 		else
63347e946e7SWyllys Ingersoll 			publ_token_obj_list = dlist_add_as_last(
63447e946e7SWyllys Ingersoll 			    publ_token_obj_list, new_obj);
63547e946e7SWyllys Ingersoll 	}
63647e946e7SWyllys Ingersoll 
63747e946e7SWyllys Ingersoll 	rc = object_mgr_add_to_map(sess, new_obj, new_handle);
63847e946e7SWyllys Ingersoll 	if (rc != CKR_OK) {
63947e946e7SWyllys Ingersoll 		DL_NODE *node = NULL;
64047e946e7SWyllys Ingersoll 
64147e946e7SWyllys Ingersoll 		if (sess_obj) {
64247e946e7SWyllys Ingersoll 			node = dlist_find(sess_obj_list, new_obj);
64347e946e7SWyllys Ingersoll 			if (node)
64447e946e7SWyllys Ingersoll 				sess_obj_list = dlist_remove_node(
64547e946e7SWyllys Ingersoll 				    sess_obj_list, node);
64647e946e7SWyllys Ingersoll 		} else {
64747e946e7SWyllys Ingersoll 			(void) delete_token_object(new_obj);
64847e946e7SWyllys Ingersoll 
64947e946e7SWyllys Ingersoll 			if (priv_obj) {
65047e946e7SWyllys Ingersoll 				node = dlist_find(priv_token_obj_list, new_obj);
65147e946e7SWyllys Ingersoll 				if (node)
65247e946e7SWyllys Ingersoll 					priv_token_obj_list = dlist_remove_node(
65347e946e7SWyllys Ingersoll 					    priv_token_obj_list, node);
65447e946e7SWyllys Ingersoll 			} else {
65547e946e7SWyllys Ingersoll 				node = dlist_find(publ_token_obj_list, new_obj);
65647e946e7SWyllys Ingersoll 				if (node)
65747e946e7SWyllys Ingersoll 					publ_token_obj_list = dlist_remove_node(
65847e946e7SWyllys Ingersoll 					    publ_token_obj_list, node);
65947e946e7SWyllys Ingersoll 			}
66047e946e7SWyllys Ingersoll 
66147e946e7SWyllys Ingersoll 			rc = XProcLock(xproclock);
66247e946e7SWyllys Ingersoll 			if (rc != CKR_OK) {
66347e946e7SWyllys Ingersoll 				goto done;
66447e946e7SWyllys Ingersoll 			}
66547e946e7SWyllys Ingersoll 			(void) object_mgr_del_from_shm(new_obj);
66647e946e7SWyllys Ingersoll 
66747e946e7SWyllys Ingersoll 			(void) XProcUnLock(xproclock);
66847e946e7SWyllys Ingersoll 		}
66947e946e7SWyllys Ingersoll 	}
67047e946e7SWyllys Ingersoll 
67147e946e7SWyllys Ingersoll done:
67247e946e7SWyllys Ingersoll 	(void) pthread_mutex_unlock(&obj_list_mutex);
67347e946e7SWyllys Ingersoll 
67447e946e7SWyllys Ingersoll 	if ((rc != CKR_OK) && (new_obj != NULL))
67547e946e7SWyllys Ingersoll 		(void) object_free(new_obj);
67647e946e7SWyllys Ingersoll 
67747e946e7SWyllys Ingersoll 	return (rc);
67847e946e7SWyllys Ingersoll }
67947e946e7SWyllys Ingersoll 
68047e946e7SWyllys Ingersoll //
68147e946e7SWyllys Ingersoll // determines whether the session is allowed to create an object.  creates
68247e946e7SWyllys Ingersoll // the object but doesn't add the object to any object lists or to the
68347e946e7SWyllys Ingersoll // process' object map.
68447e946e7SWyllys Ingersoll //
68547e946e7SWyllys Ingersoll CK_RV
object_mgr_create_skel(SESSION * sess,CK_ATTRIBUTE * pTemplate,CK_ULONG ulCount,CK_ULONG mode,CK_ULONG obj_type,CK_ULONG sub_class,OBJECT ** obj)68647e946e7SWyllys Ingersoll object_mgr_create_skel(SESSION	* sess,
68747e946e7SWyllys Ingersoll 	CK_ATTRIBUTE  * pTemplate,
68847e946e7SWyllys Ingersoll 	CK_ULONG	ulCount,
68947e946e7SWyllys Ingersoll 	CK_ULONG	mode,
69047e946e7SWyllys Ingersoll 	CK_ULONG	obj_type,
69147e946e7SWyllys Ingersoll 	CK_ULONG	sub_class,
69247e946e7SWyllys Ingersoll 	OBJECT	** obj)
69347e946e7SWyllys Ingersoll {
69447e946e7SWyllys Ingersoll 	OBJECT	*o = NULL;
69547e946e7SWyllys Ingersoll 	CK_RV	rc;
69647e946e7SWyllys Ingersoll 	CK_BBOOL    priv_obj;
69747e946e7SWyllys Ingersoll 	CK_BBOOL    sess_obj;
69847e946e7SWyllys Ingersoll 
69947e946e7SWyllys Ingersoll 	if (! sess || ! obj) {
70047e946e7SWyllys Ingersoll 		return (CKR_FUNCTION_FAILED);
70147e946e7SWyllys Ingersoll 	}
70247e946e7SWyllys Ingersoll 	if (! pTemplate && (ulCount != 0)) {
70347e946e7SWyllys Ingersoll 		return (CKR_FUNCTION_FAILED);
70447e946e7SWyllys Ingersoll 	}
70547e946e7SWyllys Ingersoll 	rc = object_create_skel(pTemplate, ulCount,
70647e946e7SWyllys Ingersoll 	    mode, obj_type, sub_class, &o);
70747e946e7SWyllys Ingersoll 	if (rc != CKR_OK) {
70847e946e7SWyllys Ingersoll 		return (rc);
70947e946e7SWyllys Ingersoll 	}
71047e946e7SWyllys Ingersoll 	sess_obj = object_is_session_object(o);
71147e946e7SWyllys Ingersoll 	priv_obj = object_is_private(o);
71247e946e7SWyllys Ingersoll 
71347e946e7SWyllys Ingersoll 	if (sess->session_info.state == CKS_RO_PUBLIC_SESSION) {
71447e946e7SWyllys Ingersoll 		if (priv_obj) {
71547e946e7SWyllys Ingersoll 			(void) object_free(o);
71647e946e7SWyllys Ingersoll 			return (CKR_USER_NOT_LOGGED_IN);
71747e946e7SWyllys Ingersoll 		}
71847e946e7SWyllys Ingersoll 
71947e946e7SWyllys Ingersoll 		if (! sess_obj) {
72047e946e7SWyllys Ingersoll 			(void) object_free(o);
72147e946e7SWyllys Ingersoll 			return (CKR_SESSION_READ_ONLY);
72247e946e7SWyllys Ingersoll 		}
72347e946e7SWyllys Ingersoll 	}
72447e946e7SWyllys Ingersoll 
72547e946e7SWyllys Ingersoll 	if (sess->session_info.state == CKS_RO_USER_FUNCTIONS) {
72647e946e7SWyllys Ingersoll 		if (! sess_obj) {
72747e946e7SWyllys Ingersoll 			(void) object_free(o);
72847e946e7SWyllys Ingersoll 			return (CKR_SESSION_READ_ONLY);
72947e946e7SWyllys Ingersoll 		}
73047e946e7SWyllys Ingersoll 	}
73147e946e7SWyllys Ingersoll 
73247e946e7SWyllys Ingersoll 	if (sess->session_info.state == CKS_RW_PUBLIC_SESSION) {
73347e946e7SWyllys Ingersoll 		if (priv_obj) {
73447e946e7SWyllys Ingersoll 			(void) object_free(o);
73547e946e7SWyllys Ingersoll 			return (CKR_USER_NOT_LOGGED_IN);
73647e946e7SWyllys Ingersoll 		}
73747e946e7SWyllys Ingersoll 	}
73847e946e7SWyllys Ingersoll 
73947e946e7SWyllys Ingersoll 	if (sess->session_info.state == CKS_RW_SO_FUNCTIONS) {
74047e946e7SWyllys Ingersoll 		if (priv_obj) {
74147e946e7SWyllys Ingersoll 			(void) object_free(o);
74247e946e7SWyllys Ingersoll 			return (CKR_USER_NOT_LOGGED_IN);
74347e946e7SWyllys Ingersoll 		}
74447e946e7SWyllys Ingersoll 	}
74547e946e7SWyllys Ingersoll 
74647e946e7SWyllys Ingersoll 	*obj = o;
74747e946e7SWyllys Ingersoll 	return (CKR_OK);
74847e946e7SWyllys Ingersoll }
74947e946e7SWyllys Ingersoll 
75047e946e7SWyllys Ingersoll CK_RV
object_mgr_create_final(SESSION * sess,OBJECT * obj,CK_OBJECT_HANDLE * handle)75147e946e7SWyllys Ingersoll object_mgr_create_final(SESSION	   * sess,
75247e946e7SWyllys Ingersoll 	OBJECT	    * obj,
75347e946e7SWyllys Ingersoll 	CK_OBJECT_HANDLE  * handle)
75447e946e7SWyllys Ingersoll {
75547e946e7SWyllys Ingersoll 	CK_BBOOL  sess_obj;
75647e946e7SWyllys Ingersoll 	CK_BBOOL  priv_obj;
75747e946e7SWyllys Ingersoll 	CK_RV	rc;
75847e946e7SWyllys Ingersoll 
75947e946e7SWyllys Ingersoll 	if (!sess || !obj || !handle)
76047e946e7SWyllys Ingersoll 		return (CKR_FUNCTION_FAILED);
76147e946e7SWyllys Ingersoll 
76247e946e7SWyllys Ingersoll 	rc = pthread_mutex_lock(&obj_list_mutex);
76347e946e7SWyllys Ingersoll 	if (rc != CKR_OK)
76447e946e7SWyllys Ingersoll 		return (CKR_FUNCTION_FAILED);
76547e946e7SWyllys Ingersoll 
76647e946e7SWyllys Ingersoll 	sess_obj = object_is_session_object(obj);
76747e946e7SWyllys Ingersoll 	priv_obj = object_is_private(obj);
76847e946e7SWyllys Ingersoll 
76947e946e7SWyllys Ingersoll 	if (sess_obj) {
77047e946e7SWyllys Ingersoll 		obj->session = sess;
77147e946e7SWyllys Ingersoll 		(void) memset(obj->name, 0x0, sizeof (CK_BYTE) * 8);
77247e946e7SWyllys Ingersoll 
77347e946e7SWyllys Ingersoll 		sess_obj_list = dlist_add_as_first(sess_obj_list, obj);
77447e946e7SWyllys Ingersoll 	} else {
77547e946e7SWyllys Ingersoll 		CK_BYTE current[8];
77647e946e7SWyllys Ingersoll 		CK_BYTE next[8];
77747e946e7SWyllys Ingersoll 
77847e946e7SWyllys Ingersoll 		rc = XProcLock(xproclock);
77947e946e7SWyllys Ingersoll 		if (rc != CKR_OK) {
78047e946e7SWyllys Ingersoll 			goto done;
78147e946e7SWyllys Ingersoll 		} else {
78247e946e7SWyllys Ingersoll 			if (priv_obj) {
78347e946e7SWyllys Ingersoll 				if (global_shm->num_priv_tok_obj >=
78447e946e7SWyllys Ingersoll 				    MAX_TOK_OBJS) {
78547e946e7SWyllys Ingersoll 					(void) XProcUnLock(xproclock);
78647e946e7SWyllys Ingersoll 					rc = CKR_HOST_MEMORY;
78747e946e7SWyllys Ingersoll 					goto done;
78847e946e7SWyllys Ingersoll 				}
78947e946e7SWyllys Ingersoll 			} else {
79047e946e7SWyllys Ingersoll 				if (global_shm->num_publ_tok_obj >=
79147e946e7SWyllys Ingersoll 				    MAX_TOK_OBJS) {
79247e946e7SWyllys Ingersoll 					(void) XProcUnLock(xproclock);
79347e946e7SWyllys Ingersoll 					rc = CKR_HOST_MEMORY;
79447e946e7SWyllys Ingersoll 					goto done;
79547e946e7SWyllys Ingersoll 				}
79647e946e7SWyllys Ingersoll 			}
79747e946e7SWyllys Ingersoll 			(void) memcpy(current,
79847e946e7SWyllys Ingersoll 			    &nv_token_data->next_token_object_name, 8);
79947e946e7SWyllys Ingersoll 
80047e946e7SWyllys Ingersoll 			obj->session = NULL;
80147e946e7SWyllys Ingersoll 			(void) memcpy(&obj->name, current, 8);
80247e946e7SWyllys Ingersoll 
80347e946e7SWyllys Ingersoll 			(void) compute_next_token_obj_name(current, next);
80447e946e7SWyllys Ingersoll 			(void) memcpy(&nv_token_data->next_token_object_name,
80547e946e7SWyllys Ingersoll 			    next, 8);
80647e946e7SWyllys Ingersoll 
80747e946e7SWyllys Ingersoll 			rc = save_token_object(sess->hContext, obj);
80847e946e7SWyllys Ingersoll 			if (rc != CKR_OK) {
80947e946e7SWyllys Ingersoll 				(void) XProcUnLock(xproclock);
81047e946e7SWyllys Ingersoll 				goto done;
81147e946e7SWyllys Ingersoll 			}
81247e946e7SWyllys Ingersoll 
81347e946e7SWyllys Ingersoll 			(void) object_mgr_add_to_shm(obj);
81447e946e7SWyllys Ingersoll 
81547e946e7SWyllys Ingersoll 			(void) XProcUnLock(xproclock);
81647e946e7SWyllys Ingersoll 
81747e946e7SWyllys Ingersoll 			(void) save_token_data(nv_token_data);
81847e946e7SWyllys Ingersoll 		}
81947e946e7SWyllys Ingersoll 
82047e946e7SWyllys Ingersoll 		if (priv_obj)
82147e946e7SWyllys Ingersoll 			priv_token_obj_list = dlist_add_as_last(
82247e946e7SWyllys Ingersoll 			    priv_token_obj_list, obj);
82347e946e7SWyllys Ingersoll 		else
82447e946e7SWyllys Ingersoll 			publ_token_obj_list = dlist_add_as_last(
82547e946e7SWyllys Ingersoll 			    publ_token_obj_list, obj);
82647e946e7SWyllys Ingersoll 	}
82747e946e7SWyllys Ingersoll 
82847e946e7SWyllys Ingersoll 	rc = object_mgr_add_to_map(sess, obj, handle);
82947e946e7SWyllys Ingersoll 	if (rc != CKR_OK) {
83047e946e7SWyllys Ingersoll 		DL_NODE *node = NULL;
83147e946e7SWyllys Ingersoll 
83247e946e7SWyllys Ingersoll 		if (sess_obj) {
83347e946e7SWyllys Ingersoll 			node = dlist_find(sess_obj_list, obj);
83447e946e7SWyllys Ingersoll 			if (node)
83547e946e7SWyllys Ingersoll 				sess_obj_list = dlist_remove_node(
83647e946e7SWyllys Ingersoll 				    sess_obj_list, node);
83747e946e7SWyllys Ingersoll 		} else {
83847e946e7SWyllys Ingersoll 			(void) delete_token_object(obj);
83947e946e7SWyllys Ingersoll 
84047e946e7SWyllys Ingersoll 			if (priv_obj) {
84147e946e7SWyllys Ingersoll 				node = dlist_find(priv_token_obj_list, obj);
84247e946e7SWyllys Ingersoll 				if (node)
84347e946e7SWyllys Ingersoll 					priv_token_obj_list = dlist_remove_node(
84447e946e7SWyllys Ingersoll 					    priv_token_obj_list, node);
84547e946e7SWyllys Ingersoll 			} else {
84647e946e7SWyllys Ingersoll 				node = dlist_find(publ_token_obj_list, obj);
84747e946e7SWyllys Ingersoll 				if (node)
84847e946e7SWyllys Ingersoll 					publ_token_obj_list = dlist_remove_node(
84947e946e7SWyllys Ingersoll 					    publ_token_obj_list, node);
85047e946e7SWyllys Ingersoll 			}
85147e946e7SWyllys Ingersoll 
85247e946e7SWyllys Ingersoll 			rc = XProcLock(xproclock);
85347e946e7SWyllys Ingersoll 			if (rc != CKR_OK) {
85447e946e7SWyllys Ingersoll 				goto done;
85547e946e7SWyllys Ingersoll 			}
85647e946e7SWyllys Ingersoll 			(void) object_mgr_del_from_shm(obj);
85747e946e7SWyllys Ingersoll 
85847e946e7SWyllys Ingersoll 			(void) XProcUnLock(xproclock);
85947e946e7SWyllys Ingersoll 		}
86047e946e7SWyllys Ingersoll 	}
86147e946e7SWyllys Ingersoll 
86247e946e7SWyllys Ingersoll done:
86347e946e7SWyllys Ingersoll 	(void) pthread_mutex_unlock(&obj_list_mutex);
86447e946e7SWyllys Ingersoll 
86547e946e7SWyllys Ingersoll 	return (rc);
86647e946e7SWyllys Ingersoll }
86747e946e7SWyllys Ingersoll 
86847e946e7SWyllys Ingersoll CK_RV
object_mgr_destroy_object(SESSION * sess,CK_OBJECT_HANDLE handle)86947e946e7SWyllys Ingersoll object_mgr_destroy_object(SESSION	  * sess,
87047e946e7SWyllys Ingersoll 	CK_OBJECT_HANDLE   handle)
87147e946e7SWyllys Ingersoll {
87247e946e7SWyllys Ingersoll 	OBJECT    * obj = NULL;
87347e946e7SWyllys Ingersoll 	CK_BBOOL    sess_obj;
87447e946e7SWyllys Ingersoll 	CK_BBOOL    priv_obj;
87547e946e7SWyllys Ingersoll 	CK_RV	rc;
87647e946e7SWyllys Ingersoll 
87747e946e7SWyllys Ingersoll 	if (! sess)
87847e946e7SWyllys Ingersoll 		return (CKR_FUNCTION_FAILED);
87947e946e7SWyllys Ingersoll 
88047e946e7SWyllys Ingersoll 	rc = pthread_mutex_lock(&obj_list_mutex);
88147e946e7SWyllys Ingersoll 	if (rc != CKR_OK)
88247e946e7SWyllys Ingersoll 		return (CKR_FUNCTION_FAILED);
88347e946e7SWyllys Ingersoll 
88447e946e7SWyllys Ingersoll 	rc = object_mgr_find_in_map1(sess->hContext, handle, &obj);
88547e946e7SWyllys Ingersoll 	if (rc != CKR_OK) {
88647e946e7SWyllys Ingersoll 		goto done;
88747e946e7SWyllys Ingersoll 	}
888*ab8176c2SWyllys Ingersoll 
889*ab8176c2SWyllys Ingersoll 	rc = check_object_access(sess, obj);
890*ab8176c2SWyllys Ingersoll 	if (rc != CKR_OK)
891*ab8176c2SWyllys Ingersoll 		goto done;
892*ab8176c2SWyllys Ingersoll 
89347e946e7SWyllys Ingersoll 	sess_obj = object_is_session_object(obj);
89447e946e7SWyllys Ingersoll 	priv_obj = object_is_private(obj);
89547e946e7SWyllys Ingersoll 
89647e946e7SWyllys Ingersoll 	if (sess_obj) {
89747e946e7SWyllys Ingersoll 		DL_NODE *node;
89847e946e7SWyllys Ingersoll 
89947e946e7SWyllys Ingersoll 		node = dlist_find(sess_obj_list, obj);
90047e946e7SWyllys Ingersoll 		if (node) {
90147e946e7SWyllys Ingersoll 			(void) object_mgr_remove_from_map(handle);
90247e946e7SWyllys Ingersoll 
90347e946e7SWyllys Ingersoll 			(void) object_free(obj);
90447e946e7SWyllys Ingersoll 			sess_obj_list = dlist_remove_node(
90547e946e7SWyllys Ingersoll 			    sess_obj_list, node);
90647e946e7SWyllys Ingersoll 
90747e946e7SWyllys Ingersoll 			rc = CKR_OK;
90847e946e7SWyllys Ingersoll 			goto done;
90947e946e7SWyllys Ingersoll 		}
91047e946e7SWyllys Ingersoll 	} else {
91147e946e7SWyllys Ingersoll 		DL_NODE *node = NULL;
91247e946e7SWyllys Ingersoll 
91347e946e7SWyllys Ingersoll 		(void) delete_token_object(obj);
91447e946e7SWyllys Ingersoll 
91547e946e7SWyllys Ingersoll 		if (priv_obj)
91647e946e7SWyllys Ingersoll 			node = dlist_find(priv_token_obj_list, obj);
91747e946e7SWyllys Ingersoll 		else
91847e946e7SWyllys Ingersoll 			node = dlist_find(publ_token_obj_list, obj);
91947e946e7SWyllys Ingersoll 
92047e946e7SWyllys Ingersoll 		if (node) {
92147e946e7SWyllys Ingersoll 			rc = XProcLock(xproclock);
92247e946e7SWyllys Ingersoll 			if (rc != CKR_OK) {
92347e946e7SWyllys Ingersoll 				goto done;
92447e946e7SWyllys Ingersoll 			}
92547e946e7SWyllys Ingersoll 			(void) object_mgr_del_from_shm(obj);
92647e946e7SWyllys Ingersoll 
92747e946e7SWyllys Ingersoll 			(void) XProcUnLock(xproclock);
92847e946e7SWyllys Ingersoll 
92947e946e7SWyllys Ingersoll 			(void) object_mgr_remove_from_map(handle);
93047e946e7SWyllys Ingersoll 
93147e946e7SWyllys Ingersoll 			(void) object_free(obj);
93247e946e7SWyllys Ingersoll 
93347e946e7SWyllys Ingersoll 			if (priv_obj)
93447e946e7SWyllys Ingersoll 				priv_token_obj_list = dlist_remove_node(
93547e946e7SWyllys Ingersoll 				    priv_token_obj_list, node);
93647e946e7SWyllys Ingersoll 			else
93747e946e7SWyllys Ingersoll 				publ_token_obj_list = dlist_remove_node(
93847e946e7SWyllys Ingersoll 				    publ_token_obj_list, node);
93947e946e7SWyllys Ingersoll 
94047e946e7SWyllys Ingersoll 			rc = CKR_OK;
94147e946e7SWyllys Ingersoll 			goto done;
94247e946e7SWyllys Ingersoll 		}
94347e946e7SWyllys Ingersoll 	}
94447e946e7SWyllys Ingersoll 
94547e946e7SWyllys Ingersoll 	rc = CKR_FUNCTION_FAILED;
94647e946e7SWyllys Ingersoll done:
94747e946e7SWyllys Ingersoll 	(void) pthread_mutex_unlock(&obj_list_mutex);
94847e946e7SWyllys Ingersoll 
94947e946e7SWyllys Ingersoll 	return (rc);
95047e946e7SWyllys Ingersoll }
95147e946e7SWyllys Ingersoll 
95247e946e7SWyllys Ingersoll CK_RV
object_mgr_destroy_token_objects(TSS_HCONTEXT hContext)95347e946e7SWyllys Ingersoll object_mgr_destroy_token_objects(TSS_HCONTEXT hContext)
95447e946e7SWyllys Ingersoll {
95547e946e7SWyllys Ingersoll 	CK_BBOOL locked2 = FALSE;
95647e946e7SWyllys Ingersoll 	CK_RV rc;
95747e946e7SWyllys Ingersoll 
95847e946e7SWyllys Ingersoll 	rc = pthread_mutex_lock(&obj_list_mutex);
95947e946e7SWyllys Ingersoll 	if (rc != CKR_OK)
96047e946e7SWyllys Ingersoll 		return (CKR_FUNCTION_FAILED);
96147e946e7SWyllys Ingersoll 
96247e946e7SWyllys Ingersoll 	while (publ_token_obj_list) {
96347e946e7SWyllys Ingersoll 		OBJECT *obj = (OBJECT *)publ_token_obj_list->data;
96447e946e7SWyllys Ingersoll 
96547e946e7SWyllys Ingersoll 		CK_OBJECT_HANDLE handle;
96647e946e7SWyllys Ingersoll 
96747e946e7SWyllys Ingersoll 		rc = object_mgr_find_in_map2(hContext, obj, &handle);
96847e946e7SWyllys Ingersoll 		if (rc == CKR_OK) {
96947e946e7SWyllys Ingersoll 			(void) object_mgr_remove_from_map(handle);
97047e946e7SWyllys Ingersoll 		}
97147e946e7SWyllys Ingersoll 		(void) delete_token_object(obj);
97247e946e7SWyllys Ingersoll 		(void) object_free(obj);
97347e946e7SWyllys Ingersoll 
97447e946e7SWyllys Ingersoll 		publ_token_obj_list = dlist_remove_node(
97547e946e7SWyllys Ingersoll 		    publ_token_obj_list, publ_token_obj_list);
97647e946e7SWyllys Ingersoll 	}
97747e946e7SWyllys Ingersoll 
97847e946e7SWyllys Ingersoll 	while (priv_token_obj_list) {
97947e946e7SWyllys Ingersoll 		OBJECT *obj = (OBJECT *)priv_token_obj_list->data;
98047e946e7SWyllys Ingersoll 
98147e946e7SWyllys Ingersoll 		CK_OBJECT_HANDLE handle;
98247e946e7SWyllys Ingersoll 
98347e946e7SWyllys Ingersoll 		rc = object_mgr_find_in_map2(hContext, obj, &handle);
98447e946e7SWyllys Ingersoll 		if (rc == CKR_OK) {
98547e946e7SWyllys Ingersoll 			(void) object_mgr_remove_from_map(handle);
98647e946e7SWyllys Ingersoll 		}
98747e946e7SWyllys Ingersoll 		(void) delete_token_object(obj);
98847e946e7SWyllys Ingersoll 		(void) object_free(obj);
98947e946e7SWyllys Ingersoll 
99047e946e7SWyllys Ingersoll 		priv_token_obj_list = dlist_remove_node(
99147e946e7SWyllys Ingersoll 		    priv_token_obj_list, priv_token_obj_list);
99247e946e7SWyllys Ingersoll 	}
99347e946e7SWyllys Ingersoll 
99447e946e7SWyllys Ingersoll 	// now we want to purge the token object list in shared memory
99547e946e7SWyllys Ingersoll 	//
99647e946e7SWyllys Ingersoll 	rc = XProcLock(xproclock);
99747e946e7SWyllys Ingersoll 	if (rc == CKR_OK) {
99847e946e7SWyllys Ingersoll 		locked2 = TRUE;
99947e946e7SWyllys Ingersoll 
100047e946e7SWyllys Ingersoll 		global_shm->num_priv_tok_obj = 0;
100147e946e7SWyllys Ingersoll 		global_shm->num_publ_tok_obj = 0;
100247e946e7SWyllys Ingersoll 
100347e946e7SWyllys Ingersoll 		(void) memset(&global_shm->publ_tok_objs, 0x0,
100447e946e7SWyllys Ingersoll 		    MAX_TOK_OBJS * sizeof (TOK_OBJ_ENTRY));
100547e946e7SWyllys Ingersoll 		(void) memset(&global_shm->priv_tok_objs, 0x0,
100647e946e7SWyllys Ingersoll 		    MAX_TOK_OBJS * sizeof (TOK_OBJ_ENTRY));
100747e946e7SWyllys Ingersoll 	}
100847e946e7SWyllys Ingersoll 
100947e946e7SWyllys Ingersoll done:
101047e946e7SWyllys Ingersoll 	(void) pthread_mutex_unlock(&obj_list_mutex);
101147e946e7SWyllys Ingersoll 
101247e946e7SWyllys Ingersoll 	if (locked2 == TRUE) (void) XProcUnLock(xproclock);
101347e946e7SWyllys Ingersoll 
101447e946e7SWyllys Ingersoll 	return (rc);
101547e946e7SWyllys Ingersoll }
101647e946e7SWyllys Ingersoll 
101747e946e7SWyllys Ingersoll //
101847e946e7SWyllys Ingersoll // Locates the specified object in the map
101947e946e7SWyllys Ingersoll // without going and checking for cache update
102047e946e7SWyllys Ingersoll //
102147e946e7SWyllys Ingersoll CK_RV
object_mgr_find_in_map_nocache(CK_OBJECT_HANDLE handle,OBJECT ** ptr)102247e946e7SWyllys Ingersoll object_mgr_find_in_map_nocache(CK_OBJECT_HANDLE    handle,
102347e946e7SWyllys Ingersoll 	OBJECT	   ** ptr) {
102447e946e7SWyllys Ingersoll 	DL_NODE   * node = NULL;
102547e946e7SWyllys Ingersoll 	OBJECT    * obj  = NULL;
102647e946e7SWyllys Ingersoll 
102747e946e7SWyllys Ingersoll 	if (! ptr) {
102847e946e7SWyllys Ingersoll 		return (CKR_FUNCTION_FAILED);
102947e946e7SWyllys Ingersoll 	}
103047e946e7SWyllys Ingersoll 	if (pthread_rwlock_rdlock(&obj_list_rw_mutex)) {
103147e946e7SWyllys Ingersoll 		return (CKR_FUNCTION_FAILED);
103247e946e7SWyllys Ingersoll 	}
103347e946e7SWyllys Ingersoll 	node = object_map;
103447e946e7SWyllys Ingersoll 	while (node) {
103547e946e7SWyllys Ingersoll 		OBJECT_MAP *map = (OBJECT_MAP *)node->data;
103647e946e7SWyllys Ingersoll 
103747e946e7SWyllys Ingersoll 		if (map->handle == handle) {
103847e946e7SWyllys Ingersoll 			obj = map->ptr;
103947e946e7SWyllys Ingersoll 			break;
104047e946e7SWyllys Ingersoll 		}
104147e946e7SWyllys Ingersoll 
104247e946e7SWyllys Ingersoll 		node = node->next;
104347e946e7SWyllys Ingersoll 	}
104447e946e7SWyllys Ingersoll 	(void) pthread_rwlock_unlock(&obj_list_rw_mutex);
104547e946e7SWyllys Ingersoll 
104647e946e7SWyllys Ingersoll 	if (obj == NULL || node == NULL) {
104747e946e7SWyllys Ingersoll 		return (CKR_OBJECT_HANDLE_INVALID);
104847e946e7SWyllys Ingersoll 	}
104947e946e7SWyllys Ingersoll 
105047e946e7SWyllys Ingersoll 	if (object_is_session_object(obj) == TRUE) {
105147e946e7SWyllys Ingersoll 		 *ptr = obj;
105247e946e7SWyllys Ingersoll 		return (CKR_OK);
105347e946e7SWyllys Ingersoll 	}
105447e946e7SWyllys Ingersoll 
105547e946e7SWyllys Ingersoll 	*ptr = obj;
105647e946e7SWyllys Ingersoll 	return (CKR_OK);
105747e946e7SWyllys Ingersoll }
105847e946e7SWyllys Ingersoll 
105947e946e7SWyllys Ingersoll CK_RV
object_mgr_find_in_map1(TSS_HCONTEXT hContext,CK_OBJECT_HANDLE handle,OBJECT ** ptr)106047e946e7SWyllys Ingersoll object_mgr_find_in_map1(
106147e946e7SWyllys Ingersoll 	TSS_HCONTEXT hContext,
106247e946e7SWyllys Ingersoll 	CK_OBJECT_HANDLE    handle,
106347e946e7SWyllys Ingersoll 	OBJECT	   ** ptr)
106447e946e7SWyllys Ingersoll {
106547e946e7SWyllys Ingersoll 	DL_NODE   * node = NULL;
106647e946e7SWyllys Ingersoll 	OBJECT    * obj  = NULL;
106747e946e7SWyllys Ingersoll 
106847e946e7SWyllys Ingersoll 	if (! ptr) {
106947e946e7SWyllys Ingersoll 		return (CKR_FUNCTION_FAILED);
107047e946e7SWyllys Ingersoll 	}
107147e946e7SWyllys Ingersoll 	if (pthread_rwlock_rdlock(&obj_list_rw_mutex)) {
107247e946e7SWyllys Ingersoll 		return (CKR_FUNCTION_FAILED);
107347e946e7SWyllys Ingersoll 	}
107447e946e7SWyllys Ingersoll 	node = object_map;
107547e946e7SWyllys Ingersoll 	while (node) {
107647e946e7SWyllys Ingersoll 		OBJECT_MAP *map = (OBJECT_MAP *)node->data;
107747e946e7SWyllys Ingersoll 
107847e946e7SWyllys Ingersoll 		if (map->handle == handle) {
107947e946e7SWyllys Ingersoll 			obj = map->ptr;
108047e946e7SWyllys Ingersoll 			break;
108147e946e7SWyllys Ingersoll 		}
108247e946e7SWyllys Ingersoll 
108347e946e7SWyllys Ingersoll 		node = node->next;
108447e946e7SWyllys Ingersoll 	}
108547e946e7SWyllys Ingersoll 	(void) pthread_rwlock_unlock(&obj_list_rw_mutex);
108647e946e7SWyllys Ingersoll 
108747e946e7SWyllys Ingersoll 	if (obj == NULL || node == NULL) {
108847e946e7SWyllys Ingersoll 		return (CKR_OBJECT_HANDLE_INVALID);
108947e946e7SWyllys Ingersoll 	}
109047e946e7SWyllys Ingersoll 
109147e946e7SWyllys Ingersoll 	if (object_is_session_object(obj) == TRUE) {
109247e946e7SWyllys Ingersoll 		*ptr = obj;
109347e946e7SWyllys Ingersoll 		return (CKR_OK);
109447e946e7SWyllys Ingersoll 	}
109547e946e7SWyllys Ingersoll 
109647e946e7SWyllys Ingersoll 	(void) object_mgr_check_shm(hContext, obj);
109747e946e7SWyllys Ingersoll 
109847e946e7SWyllys Ingersoll 	*ptr = obj;
109947e946e7SWyllys Ingersoll 	return (CKR_OK);
110047e946e7SWyllys Ingersoll }
110147e946e7SWyllys Ingersoll 
110247e946e7SWyllys Ingersoll CK_RV
object_mgr_find_in_map2(TSS_HCONTEXT hContext,OBJECT * obj,CK_OBJECT_HANDLE * handle)110347e946e7SWyllys Ingersoll object_mgr_find_in_map2(
110447e946e7SWyllys Ingersoll 	TSS_HCONTEXT hContext,
110547e946e7SWyllys Ingersoll 	OBJECT	   * obj,
110647e946e7SWyllys Ingersoll 	CK_OBJECT_HANDLE * handle)
110747e946e7SWyllys Ingersoll {
110847e946e7SWyllys Ingersoll 	DL_NODE	   * node = NULL;
110947e946e7SWyllys Ingersoll 	CK_OBJECT_HANDLE    h    = (CK_OBJECT_HANDLE)NULL;
111047e946e7SWyllys Ingersoll 
111147e946e7SWyllys Ingersoll 	if (! obj || ! handle) {
111247e946e7SWyllys Ingersoll 		return (CKR_FUNCTION_FAILED);
111347e946e7SWyllys Ingersoll 	}
111447e946e7SWyllys Ingersoll 	if (pthread_rwlock_rdlock(&obj_list_rw_mutex)) {
111547e946e7SWyllys Ingersoll 		return (CKR_FUNCTION_FAILED);
111647e946e7SWyllys Ingersoll 	}
111747e946e7SWyllys Ingersoll 	node = object_map;
111847e946e7SWyllys Ingersoll 	while (node) {
111947e946e7SWyllys Ingersoll 		OBJECT_MAP *map = (OBJECT_MAP *)node->data;
112047e946e7SWyllys Ingersoll 
112147e946e7SWyllys Ingersoll 		if (map->ptr == obj) {
112247e946e7SWyllys Ingersoll 			h = map->handle;
112347e946e7SWyllys Ingersoll 			break;
112447e946e7SWyllys Ingersoll 		}
112547e946e7SWyllys Ingersoll 
112647e946e7SWyllys Ingersoll 		node = node->next;
112747e946e7SWyllys Ingersoll 	}
112847e946e7SWyllys Ingersoll 	(void) pthread_rwlock_unlock(&obj_list_rw_mutex);
112947e946e7SWyllys Ingersoll 
113047e946e7SWyllys Ingersoll 	if (node == NULL) {
113147e946e7SWyllys Ingersoll 		return (CKR_OBJECT_HANDLE_INVALID);
113247e946e7SWyllys Ingersoll 	}
113347e946e7SWyllys Ingersoll 
113447e946e7SWyllys Ingersoll 	if (object_is_session_object(obj) == TRUE) {
113547e946e7SWyllys Ingersoll 		*handle = h;
113647e946e7SWyllys Ingersoll 		return (CKR_OK);
113747e946e7SWyllys Ingersoll 	}
113847e946e7SWyllys Ingersoll 
113947e946e7SWyllys Ingersoll 	(void) object_mgr_check_shm(hContext, obj);
114047e946e7SWyllys Ingersoll 
114147e946e7SWyllys Ingersoll 	*handle = h;
114247e946e7SWyllys Ingersoll 	return (CKR_OK);
114347e946e7SWyllys Ingersoll }
114447e946e7SWyllys Ingersoll 
114547e946e7SWyllys Ingersoll CK_RV
object_mgr_find_init(SESSION * sess,CK_ATTRIBUTE * pTemplate,CK_ULONG ulCount)114647e946e7SWyllys Ingersoll object_mgr_find_init(SESSION	* sess,
114747e946e7SWyllys Ingersoll 	CK_ATTRIBUTE * pTemplate,
114847e946e7SWyllys Ingersoll 	CK_ULONG	ulCount)
114947e946e7SWyllys Ingersoll {
115047e946e7SWyllys Ingersoll 	if (! sess) {
115147e946e7SWyllys Ingersoll 		return (CKR_FUNCTION_FAILED);
115247e946e7SWyllys Ingersoll 	}
115347e946e7SWyllys Ingersoll 	if (sess->find_active != FALSE) {
115447e946e7SWyllys Ingersoll 		return (CKR_OPERATION_ACTIVE);
115547e946e7SWyllys Ingersoll 	}
115647e946e7SWyllys Ingersoll 	// initialize the found object list.  if it doesn't exist, allocate
115747e946e7SWyllys Ingersoll 	// a list big enough for 10 handles.  we'll reallocate if we need more
115847e946e7SWyllys Ingersoll 	//
115947e946e7SWyllys Ingersoll 	if (sess->find_list != NULL) {
116047e946e7SWyllys Ingersoll 		(void) memset(sess->find_list, 0x0,
116147e946e7SWyllys Ingersoll 		    sess->find_len * sizeof (CK_OBJECT_HANDLE));
116247e946e7SWyllys Ingersoll 	} else {
116347e946e7SWyllys Ingersoll 		sess->find_list = (CK_OBJECT_HANDLE *)malloc(
116447e946e7SWyllys Ingersoll 		    10 * sizeof (CK_OBJECT_HANDLE));
116547e946e7SWyllys Ingersoll 		if (! sess->find_list) {
116647e946e7SWyllys Ingersoll 			return (CKR_HOST_MEMORY);
116747e946e7SWyllys Ingersoll 		} else {
116847e946e7SWyllys Ingersoll 			(void) memset(sess->find_list, 0x0,
116947e946e7SWyllys Ingersoll 			    10 * sizeof (CK_OBJECT_HANDLE));
117047e946e7SWyllys Ingersoll 			sess->find_len = 10;
117147e946e7SWyllys Ingersoll 		}
117247e946e7SWyllys Ingersoll 	}
117347e946e7SWyllys Ingersoll 
117447e946e7SWyllys Ingersoll 	sess->find_count = 0;
117547e946e7SWyllys Ingersoll 	sess->find_idx   = 0;
117647e946e7SWyllys Ingersoll 
117747e946e7SWyllys Ingersoll 	//  --- need to grab the object lock here
117847e946e7SWyllys Ingersoll 	if (pthread_mutex_lock(&obj_list_mutex))
117947e946e7SWyllys Ingersoll 		return (CKR_FUNCTION_FAILED);
118047e946e7SWyllys Ingersoll 
118147e946e7SWyllys Ingersoll 	(void) object_mgr_update_from_shm(sess->hContext);
118247e946e7SWyllys Ingersoll 
118347e946e7SWyllys Ingersoll 	// which objects can be return (ed:
118447e946e7SWyllys Ingersoll 	//
118547e946e7SWyllys Ingersoll 	//   Public Session:   public session objects, public token objects
118647e946e7SWyllys Ingersoll 	//   User Session:	all session objects,    all token objects
118747e946e7SWyllys Ingersoll 	//   SO session:	public session objects, public token objects
118847e946e7SWyllys Ingersoll 	//
118947e946e7SWyllys Ingersoll 	switch (sess->session_info.state) {
119047e946e7SWyllys Ingersoll 		case CKS_RO_PUBLIC_SESSION:
119147e946e7SWyllys Ingersoll 		case CKS_RW_PUBLIC_SESSION:
119247e946e7SWyllys Ingersoll 		case CKS_RW_SO_FUNCTIONS:
119347e946e7SWyllys Ingersoll 		(void) object_mgr_find_build_list(sess, pTemplate,
119447e946e7SWyllys Ingersoll 		    ulCount, publ_token_obj_list, TRUE);
119547e946e7SWyllys Ingersoll 		(void) object_mgr_find_build_list(sess, pTemplate,
119647e946e7SWyllys Ingersoll 		    ulCount, sess_obj_list,	TRUE);
119747e946e7SWyllys Ingersoll 		break;
119847e946e7SWyllys Ingersoll 
119947e946e7SWyllys Ingersoll 		case CKS_RO_USER_FUNCTIONS:
120047e946e7SWyllys Ingersoll 		case CKS_RW_USER_FUNCTIONS:
120147e946e7SWyllys Ingersoll 		(void) object_mgr_find_build_list(sess, pTemplate,
120247e946e7SWyllys Ingersoll 		    ulCount, priv_token_obj_list, FALSE);
120347e946e7SWyllys Ingersoll 		(void) object_mgr_find_build_list(sess, pTemplate,
120447e946e7SWyllys Ingersoll 		    ulCount, publ_token_obj_list, FALSE);
120547e946e7SWyllys Ingersoll 		(void) object_mgr_find_build_list(sess, pTemplate,
120647e946e7SWyllys Ingersoll 		    ulCount, sess_obj_list,  FALSE);
120747e946e7SWyllys Ingersoll 		break;
120847e946e7SWyllys Ingersoll 	}
120947e946e7SWyllys Ingersoll 	(void) pthread_mutex_unlock(&obj_list_mutex);
121047e946e7SWyllys Ingersoll 
121147e946e7SWyllys Ingersoll 	sess->find_active = TRUE;
121247e946e7SWyllys Ingersoll 
121347e946e7SWyllys Ingersoll 	return (CKR_OK);
121447e946e7SWyllys Ingersoll }
121547e946e7SWyllys Ingersoll 
121647e946e7SWyllys Ingersoll CK_RV
object_mgr_find_build_list(SESSION * sess,CK_ATTRIBUTE * pTemplate,CK_ULONG ulCount,DL_NODE * obj_list,CK_BBOOL public_only)121747e946e7SWyllys Ingersoll object_mgr_find_build_list(SESSION	* sess,
121847e946e7SWyllys Ingersoll 	CK_ATTRIBUTE * pTemplate,
121947e946e7SWyllys Ingersoll 	CK_ULONG	ulCount,
122047e946e7SWyllys Ingersoll 	DL_NODE	* obj_list,
122147e946e7SWyllys Ingersoll 	CK_BBOOL	public_only)
122247e946e7SWyllys Ingersoll {
122347e946e7SWyllys Ingersoll 	OBJECT	   * obj  = NULL;
122447e946e7SWyllys Ingersoll 	DL_NODE	  * node = NULL;
122547e946e7SWyllys Ingersoll 	CK_OBJECT_HANDLE   handle;
122647e946e7SWyllys Ingersoll 	CK_BBOOL	   is_priv;
122747e946e7SWyllys Ingersoll 	CK_BBOOL	   match;
122847e946e7SWyllys Ingersoll 	CK_BBOOL	   hw_feature = FALSE;
122947e946e7SWyllys Ingersoll 	CK_BBOOL	   hidden_object = FALSE;
123047e946e7SWyllys Ingersoll 	CK_RV		rc;
123147e946e7SWyllys Ingersoll 	CK_ATTRIBUTE	* attr;
123247e946e7SWyllys Ingersoll 	unsigned int		i;
123347e946e7SWyllys Ingersoll 
123447e946e7SWyllys Ingersoll 	if (! sess) {
123547e946e7SWyllys Ingersoll 		return (CKR_FUNCTION_FAILED);
123647e946e7SWyllys Ingersoll 	}
123747e946e7SWyllys Ingersoll 	if (! obj_list)
123847e946e7SWyllys Ingersoll 		return (CKR_OK);
123947e946e7SWyllys Ingersoll 	// PKCS#11 v2.11 (pg. 79): "When searching using C_FindObjectsInit
124047e946e7SWyllys Ingersoll 	// and C_FindObjects, hardware feature objects are not returned
124147e946e7SWyllys Ingersoll 	// unless the CKA_CLASS attribute in the template has the value
124247e946e7SWyllys Ingersoll 	// CKO_HW_FEATURE." So, we check for CKO_HW_FEATURE and if its set,
124347e946e7SWyllys Ingersoll 	// we'll find these objects below. - KEY
124447e946e7SWyllys Ingersoll 	for (i = 0; i < ulCount; i++) {
124547e946e7SWyllys Ingersoll 		if (pTemplate[i].type == CKA_CLASS) {
124647e946e7SWyllys Ingersoll 			if (*(CK_ULONG *)pTemplate[i].pValue ==
124747e946e7SWyllys Ingersoll 			    CKO_HW_FEATURE) {
124847e946e7SWyllys Ingersoll 				hw_feature = TRUE;
124947e946e7SWyllys Ingersoll 				break;
125047e946e7SWyllys Ingersoll 			}
125147e946e7SWyllys Ingersoll 		}
125247e946e7SWyllys Ingersoll 
125347e946e7SWyllys Ingersoll 		if (pTemplate[i].type == CKA_HIDDEN) {
125447e946e7SWyllys Ingersoll 			if (*(CK_BBOOL *)pTemplate[i].pValue == TRUE) {
125547e946e7SWyllys Ingersoll 				hidden_object = TRUE;
125647e946e7SWyllys Ingersoll 				break;
125747e946e7SWyllys Ingersoll 			}
125847e946e7SWyllys Ingersoll 		}
125947e946e7SWyllys Ingersoll 	}
126047e946e7SWyllys Ingersoll 
126147e946e7SWyllys Ingersoll 	node = obj_list;
126247e946e7SWyllys Ingersoll 	while (node) {
126347e946e7SWyllys Ingersoll 		match   = FALSE;
126447e946e7SWyllys Ingersoll 		obj	= (OBJECT *)node->data;
126547e946e7SWyllys Ingersoll 		is_priv = object_is_private(obj);
126647e946e7SWyllys Ingersoll 
126747e946e7SWyllys Ingersoll 
126847e946e7SWyllys Ingersoll 		if ((is_priv == FALSE) || (public_only == FALSE)) {
126947e946e7SWyllys Ingersoll 			if (pTemplate == NULL || ulCount == 0)
127047e946e7SWyllys Ingersoll 				match = TRUE;
127147e946e7SWyllys Ingersoll 			else
127247e946e7SWyllys Ingersoll 				match = template_compare(pTemplate,
127347e946e7SWyllys Ingersoll 				    ulCount, obj->template);
127447e946e7SWyllys Ingersoll 		}
127547e946e7SWyllys Ingersoll 
127647e946e7SWyllys Ingersoll 		if (match) {
127747e946e7SWyllys Ingersoll 			rc = object_mgr_find_in_map2(sess->hContext, obj,
127847e946e7SWyllys Ingersoll 			    &handle);
127947e946e7SWyllys Ingersoll 			if (rc != CKR_OK) {
128047e946e7SWyllys Ingersoll 				rc = object_mgr_add_to_map(sess, obj, &handle);
128147e946e7SWyllys Ingersoll 				if (rc != CKR_OK) {
128247e946e7SWyllys Ingersoll 					return (CKR_FUNCTION_FAILED);
128347e946e7SWyllys Ingersoll 				}
128447e946e7SWyllys Ingersoll 			}
128547e946e7SWyllys Ingersoll 			if (rc == CKR_OK) {
128647e946e7SWyllys Ingersoll 				if ((hw_feature == FALSE) &&
128747e946e7SWyllys Ingersoll 				    (template_attribute_find(obj->template,
128847e946e7SWyllys Ingersoll 				    CKA_CLASS, &attr) == TRUE)) {
128947e946e7SWyllys Ingersoll 					if (*(CK_OBJECT_CLASS *)attr->pValue ==
129047e946e7SWyllys Ingersoll 					    CKO_HW_FEATURE)
129147e946e7SWyllys Ingersoll 						goto next_loop;
129247e946e7SWyllys Ingersoll 				}
129347e946e7SWyllys Ingersoll 
129447e946e7SWyllys Ingersoll 				if ((hidden_object == FALSE) &&
129547e946e7SWyllys Ingersoll 				    (template_attribute_find(obj->template,
129647e946e7SWyllys Ingersoll 				    CKA_HIDDEN, &attr) == TRUE)) {
129747e946e7SWyllys Ingersoll 					if (*(CK_BBOOL *)attr->pValue == TRUE)
129847e946e7SWyllys Ingersoll 						goto next_loop;
129947e946e7SWyllys Ingersoll 				}
130047e946e7SWyllys Ingersoll 
130147e946e7SWyllys Ingersoll 				sess->find_list[ sess->find_count ] = handle;
130247e946e7SWyllys Ingersoll 				sess->find_count++;
130347e946e7SWyllys Ingersoll 
130447e946e7SWyllys Ingersoll 				if (sess->find_count >= sess->find_len) {
130547e946e7SWyllys Ingersoll 					sess->find_len += 15;
130647e946e7SWyllys Ingersoll 					sess->find_list =
130747e946e7SWyllys Ingersoll 					    (CK_OBJECT_HANDLE *)realloc(
130847e946e7SWyllys Ingersoll 					    sess->find_list, sess->find_len *
130947e946e7SWyllys Ingersoll 					    sizeof (CK_OBJECT_HANDLE));
131047e946e7SWyllys Ingersoll 					if (! sess->find_list) {
131147e946e7SWyllys Ingersoll 						return (CKR_HOST_MEMORY);
131247e946e7SWyllys Ingersoll 					}
131347e946e7SWyllys Ingersoll 				}
131447e946e7SWyllys Ingersoll 			}
131547e946e7SWyllys Ingersoll 		}
131647e946e7SWyllys Ingersoll 		next_loop:
131747e946e7SWyllys Ingersoll 		node = node->next;
131847e946e7SWyllys Ingersoll 	}
131947e946e7SWyllys Ingersoll 
132047e946e7SWyllys Ingersoll 	return (CKR_OK);
132147e946e7SWyllys Ingersoll }
132247e946e7SWyllys Ingersoll 
132347e946e7SWyllys Ingersoll CK_RV
object_mgr_find_final(SESSION * sess)132447e946e7SWyllys Ingersoll object_mgr_find_final(SESSION *sess)
132547e946e7SWyllys Ingersoll {
132647e946e7SWyllys Ingersoll 	if (! sess) {
132747e946e7SWyllys Ingersoll 		return (CKR_FUNCTION_FAILED);
132847e946e7SWyllys Ingersoll 	}
132947e946e7SWyllys Ingersoll 	if (sess->find_active == FALSE) {
133047e946e7SWyllys Ingersoll 		return (CKR_OPERATION_NOT_INITIALIZED);
133147e946e7SWyllys Ingersoll 	}
133247e946e7SWyllys Ingersoll 	free(sess->find_list);
133347e946e7SWyllys Ingersoll 	sess->find_list   = NULL;
133447e946e7SWyllys Ingersoll 	sess->find_count  = 0;
133547e946e7SWyllys Ingersoll 	sess->find_idx    = 0;
133647e946e7SWyllys Ingersoll 	sess->find_active = FALSE;
133747e946e7SWyllys Ingersoll 
133847e946e7SWyllys Ingersoll 	return (CKR_OK);
133947e946e7SWyllys Ingersoll }
134047e946e7SWyllys Ingersoll 
134147e946e7SWyllys Ingersoll CK_RV
object_mgr_get_attribute_values(SESSION * sess,CK_OBJECT_HANDLE handle,CK_ATTRIBUTE * pTemplate,CK_ULONG ulCount)134247e946e7SWyllys Ingersoll object_mgr_get_attribute_values(SESSION	   * sess,
134347e946e7SWyllys Ingersoll 	CK_OBJECT_HANDLE    handle,
134447e946e7SWyllys Ingersoll 	CK_ATTRIBUTE	* pTemplate,
134547e946e7SWyllys Ingersoll 	CK_ULONG	    ulCount)
134647e946e7SWyllys Ingersoll {
134747e946e7SWyllys Ingersoll 	OBJECT   * obj;
134847e946e7SWyllys Ingersoll 	CK_BBOOL   priv_obj;
134947e946e7SWyllys Ingersoll 	CK_RV	rc;
135047e946e7SWyllys Ingersoll 
135147e946e7SWyllys Ingersoll 	if (! pTemplate) {
135247e946e7SWyllys Ingersoll 		return (CKR_FUNCTION_FAILED);
135347e946e7SWyllys Ingersoll 	}
135447e946e7SWyllys Ingersoll 	rc = pthread_mutex_lock(&obj_list_mutex);
135547e946e7SWyllys Ingersoll 	if (rc != CKR_OK)
135647e946e7SWyllys Ingersoll 		return (CKR_FUNCTION_FAILED);
135747e946e7SWyllys Ingersoll 
135847e946e7SWyllys Ingersoll 	rc = object_mgr_find_in_map1(sess->hContext, handle, &obj);
135947e946e7SWyllys Ingersoll 	if (rc != CKR_OK) {
136047e946e7SWyllys Ingersoll 		goto done;
136147e946e7SWyllys Ingersoll 	}
136247e946e7SWyllys Ingersoll 	priv_obj = object_is_private(obj);
136347e946e7SWyllys Ingersoll 
136447e946e7SWyllys Ingersoll 	if (priv_obj == TRUE) {
136547e946e7SWyllys Ingersoll 		if (sess->session_info.state == CKS_RO_PUBLIC_SESSION ||
136647e946e7SWyllys Ingersoll 		    sess->session_info.state == CKS_RW_PUBLIC_SESSION) {
136747e946e7SWyllys Ingersoll 			rc = CKR_USER_NOT_LOGGED_IN;
136847e946e7SWyllys Ingersoll 			goto done;
136947e946e7SWyllys Ingersoll 		}
137047e946e7SWyllys Ingersoll 	}
137147e946e7SWyllys Ingersoll 
137247e946e7SWyllys Ingersoll 	rc = object_get_attribute_values(obj, pTemplate, ulCount);
137347e946e7SWyllys Ingersoll done:
137447e946e7SWyllys Ingersoll 	(void) pthread_mutex_unlock(&obj_list_mutex);
137547e946e7SWyllys Ingersoll 
137647e946e7SWyllys Ingersoll 	return (rc);
137747e946e7SWyllys Ingersoll }
137847e946e7SWyllys Ingersoll 
137947e946e7SWyllys Ingersoll CK_RV
object_mgr_get_object_size(TSS_HCONTEXT hContext,CK_OBJECT_HANDLE handle,CK_ULONG * size)138047e946e7SWyllys Ingersoll object_mgr_get_object_size(
138147e946e7SWyllys Ingersoll 	TSS_HCONTEXT hContext,
138247e946e7SWyllys Ingersoll 	CK_OBJECT_HANDLE   handle,
138347e946e7SWyllys Ingersoll 	CK_ULONG	 * size)
138447e946e7SWyllys Ingersoll {
138547e946e7SWyllys Ingersoll 	OBJECT    * obj;
138647e946e7SWyllys Ingersoll 	CK_RV	rc;
138747e946e7SWyllys Ingersoll 
138847e946e7SWyllys Ingersoll 	rc = pthread_mutex_lock(&obj_list_mutex);
138947e946e7SWyllys Ingersoll 	if (rc != CKR_OK)
139047e946e7SWyllys Ingersoll 		return (CKR_FUNCTION_FAILED);
139147e946e7SWyllys Ingersoll 
139247e946e7SWyllys Ingersoll 	rc = object_mgr_find_in_map1(hContext, handle, &obj);
139347e946e7SWyllys Ingersoll 	if (rc != CKR_OK) {
139447e946e7SWyllys Ingersoll 		rc = CKR_OBJECT_HANDLE_INVALID;
139547e946e7SWyllys Ingersoll 		goto done;
139647e946e7SWyllys Ingersoll 	}
139747e946e7SWyllys Ingersoll 
139847e946e7SWyllys Ingersoll 	*size = object_get_size(obj);
139947e946e7SWyllys Ingersoll 
140047e946e7SWyllys Ingersoll done:
140147e946e7SWyllys Ingersoll 	(void) pthread_mutex_unlock(&obj_list_mutex);
140247e946e7SWyllys Ingersoll 	return (rc);
140347e946e7SWyllys Ingersoll }
140447e946e7SWyllys Ingersoll 
140547e946e7SWyllys Ingersoll 
140647e946e7SWyllys Ingersoll // object_mgr_invalidate_handle1()
140747e946e7SWyllys Ingersoll //
140847e946e7SWyllys Ingersoll // Returns:  TRUE  if successfully removes the node
140947e946e7SWyllys Ingersoll //	   FALSE if cannot remove the node (not found, etc)
141047e946e7SWyllys Ingersoll //
141147e946e7SWyllys Ingersoll CK_BBOOL
object_mgr_invalidate_handle1(CK_OBJECT_HANDLE handle)141247e946e7SWyllys Ingersoll object_mgr_invalidate_handle1(CK_OBJECT_HANDLE handle)
141347e946e7SWyllys Ingersoll {
141447e946e7SWyllys Ingersoll 	DL_NODE *node = NULL;
141547e946e7SWyllys Ingersoll 
141647e946e7SWyllys Ingersoll 	if (pthread_rwlock_wrlock(&obj_list_rw_mutex)) {
141747e946e7SWyllys Ingersoll 		return (CKR_FUNCTION_FAILED);
141847e946e7SWyllys Ingersoll 	}
141947e946e7SWyllys Ingersoll 	node = object_map;
142047e946e7SWyllys Ingersoll 
142147e946e7SWyllys Ingersoll 	while (node) {
142247e946e7SWyllys Ingersoll 		OBJECT_MAP *map = (OBJECT_MAP *)node->data;
142347e946e7SWyllys Ingersoll 
142447e946e7SWyllys Ingersoll 		if (map->handle == handle) {
142547e946e7SWyllys Ingersoll 			object_map = dlist_remove_node(object_map, node);
142647e946e7SWyllys Ingersoll 			free(map);
142747e946e7SWyllys Ingersoll 			(void) pthread_rwlock_unlock(&obj_list_rw_mutex);
142847e946e7SWyllys Ingersoll 			return (TRUE);
142947e946e7SWyllys Ingersoll 		}
143047e946e7SWyllys Ingersoll 
143147e946e7SWyllys Ingersoll 		node = node->next;
143247e946e7SWyllys Ingersoll 	}
143347e946e7SWyllys Ingersoll 	(void) pthread_rwlock_unlock(&obj_list_rw_mutex);
143447e946e7SWyllys Ingersoll 	return (FALSE);
143547e946e7SWyllys Ingersoll }
143647e946e7SWyllys Ingersoll 
143747e946e7SWyllys Ingersoll // object_mgr_invalidate_handle2()
143847e946e7SWyllys Ingersoll //
143947e946e7SWyllys Ingersoll // Returns:  TRUE  if successfully removes the node
144047e946e7SWyllys Ingersoll //	   FALSE if cannot remove the node (not found, etc)
144147e946e7SWyllys Ingersoll //
144247e946e7SWyllys Ingersoll CK_BBOOL
object_mgr_invalidate_handle2(OBJECT * obj)144347e946e7SWyllys Ingersoll object_mgr_invalidate_handle2(OBJECT *obj)
144447e946e7SWyllys Ingersoll {
144547e946e7SWyllys Ingersoll 	DL_NODE *node = NULL;
144647e946e7SWyllys Ingersoll 
144747e946e7SWyllys Ingersoll 	if (! obj)
144847e946e7SWyllys Ingersoll 		return (FALSE);
144947e946e7SWyllys Ingersoll 	if (pthread_rwlock_wrlock(&obj_list_rw_mutex)) {
145047e946e7SWyllys Ingersoll 		return (CKR_FUNCTION_FAILED);
145147e946e7SWyllys Ingersoll 	}
145247e946e7SWyllys Ingersoll 	node = object_map;
145347e946e7SWyllys Ingersoll 
145447e946e7SWyllys Ingersoll 	while (node) {
145547e946e7SWyllys Ingersoll 		OBJECT_MAP *map = (OBJECT_MAP *)node->data;
145647e946e7SWyllys Ingersoll 		if (map->ptr == obj) {
145747e946e7SWyllys Ingersoll 			object_map = dlist_remove_node(object_map, node);
145847e946e7SWyllys Ingersoll 			free(map);
145947e946e7SWyllys Ingersoll 			(void) pthread_rwlock_unlock(&obj_list_rw_mutex);
146047e946e7SWyllys Ingersoll 			return (TRUE);
146147e946e7SWyllys Ingersoll 		}
146247e946e7SWyllys Ingersoll 		node = node->next;
146347e946e7SWyllys Ingersoll 	}
146447e946e7SWyllys Ingersoll 	(void) pthread_rwlock_unlock(&obj_list_rw_mutex);
146547e946e7SWyllys Ingersoll 
146647e946e7SWyllys Ingersoll 	return (FALSE);
146747e946e7SWyllys Ingersoll }
146847e946e7SWyllys Ingersoll 
146947e946e7SWyllys Ingersoll // object_mgr_purge_session_objects()
147047e946e7SWyllys Ingersoll //
147147e946e7SWyllys Ingersoll // Args:    SESSION *
147247e946e7SWyllys Ingersoll //	  SESS_OBJ_TYPE:  can be ALL, PRIVATE or PUBLIC
147347e946e7SWyllys Ingersoll //
147447e946e7SWyllys Ingersoll // Remove all session objects owned by the specified session satisfying
147547e946e7SWyllys Ingersoll // the 'type' requirements
147647e946e7SWyllys Ingersoll //
147747e946e7SWyllys Ingersoll CK_BBOOL
object_mgr_purge_session_objects(SESSION * sess,SESS_OBJ_TYPE type)147847e946e7SWyllys Ingersoll object_mgr_purge_session_objects(SESSION	* sess,
147947e946e7SWyllys Ingersoll 	SESS_OBJ_TYPE   type)
148047e946e7SWyllys Ingersoll {
148147e946e7SWyllys Ingersoll 	DL_NODE   *node = NULL;
148247e946e7SWyllys Ingersoll 	DL_NODE   *next = NULL;
148347e946e7SWyllys Ingersoll 	OBJECT    *obj = NULL;
148447e946e7SWyllys Ingersoll 	CK_BBOOL   del;
148547e946e7SWyllys Ingersoll 	CK_RV	rc;
148647e946e7SWyllys Ingersoll 
148747e946e7SWyllys Ingersoll 	if (!sess)
148847e946e7SWyllys Ingersoll 		return (FALSE);
148947e946e7SWyllys Ingersoll 
149047e946e7SWyllys Ingersoll 	rc = pthread_mutex_lock(&obj_list_mutex);
149147e946e7SWyllys Ingersoll 	if (rc != CKR_OK)
149247e946e7SWyllys Ingersoll 		return (FALSE);
149347e946e7SWyllys Ingersoll 
149447e946e7SWyllys Ingersoll 	node = sess_obj_list;
149547e946e7SWyllys Ingersoll 
149647e946e7SWyllys Ingersoll 	while (node) {
149747e946e7SWyllys Ingersoll 		obj = (OBJECT *)node->data;
149847e946e7SWyllys Ingersoll 		del = FALSE;
149947e946e7SWyllys Ingersoll 
150047e946e7SWyllys Ingersoll 		if (obj->session == sess) {
150147e946e7SWyllys Ingersoll 			if (type == PRIVATE) {
150247e946e7SWyllys Ingersoll 				if (object_is_private(obj))
150347e946e7SWyllys Ingersoll 					del = TRUE;
150447e946e7SWyllys Ingersoll 			} else if (type == PUBLIC) {
150547e946e7SWyllys Ingersoll 				if (object_is_public(obj))
150647e946e7SWyllys Ingersoll 					del = TRUE;
150747e946e7SWyllys Ingersoll 			} else if (type == ALL)
150847e946e7SWyllys Ingersoll 				del = TRUE;
150947e946e7SWyllys Ingersoll 		}
151047e946e7SWyllys Ingersoll 		if (del == TRUE) {
151147e946e7SWyllys Ingersoll 
151247e946e7SWyllys Ingersoll 			CK_OBJECT_HANDLE handle;
151347e946e7SWyllys Ingersoll 			CK_RV	    rc;
151447e946e7SWyllys Ingersoll 
151547e946e7SWyllys Ingersoll 			rc = object_mgr_find_in_map2(sess->hContext, obj,
151647e946e7SWyllys Ingersoll 			    &handle);
151747e946e7SWyllys Ingersoll 			if (rc == CKR_OK) {
151847e946e7SWyllys Ingersoll 				(void) object_mgr_invalidate_handle1(handle);
151947e946e7SWyllys Ingersoll 				(void) object_free(obj);
152047e946e7SWyllys Ingersoll 			}
152147e946e7SWyllys Ingersoll 
152247e946e7SWyllys Ingersoll 			next = node->next;
152347e946e7SWyllys Ingersoll 			sess_obj_list = dlist_remove_node(sess_obj_list, node);
152447e946e7SWyllys Ingersoll 			node = next;
152547e946e7SWyllys Ingersoll 		}
152647e946e7SWyllys Ingersoll 		else
152747e946e7SWyllys Ingersoll 			node = node->next;
152847e946e7SWyllys Ingersoll 	}
152947e946e7SWyllys Ingersoll 
153047e946e7SWyllys Ingersoll 	(void) pthread_mutex_unlock(&obj_list_mutex);
153147e946e7SWyllys Ingersoll 
153247e946e7SWyllys Ingersoll 	return (TRUE);
153347e946e7SWyllys Ingersoll }
153447e946e7SWyllys Ingersoll 
153547e946e7SWyllys Ingersoll //
153647e946e7SWyllys Ingersoll // This routine cleans up the list of token objects.  in general, we don't
153747e946e7SWyllys Ingersoll // need to do this but when tracing memory leaks, it's best that we free
153847e946e7SWyllys Ingersoll // everything that we've allocated.
153947e946e7SWyllys Ingersoll //
154047e946e7SWyllys Ingersoll CK_BBOOL
object_mgr_purge_token_objects(TSS_HCONTEXT hContext)154147e946e7SWyllys Ingersoll object_mgr_purge_token_objects(TSS_HCONTEXT hContext)
154247e946e7SWyllys Ingersoll {
154347e946e7SWyllys Ingersoll 	DL_NODE   *node = NULL;
154447e946e7SWyllys Ingersoll 	DL_NODE   *next = NULL;
154547e946e7SWyllys Ingersoll 	OBJECT    *obj = NULL;
154647e946e7SWyllys Ingersoll 	CK_RV	rc;
154747e946e7SWyllys Ingersoll 
154847e946e7SWyllys Ingersoll 	rc = pthread_mutex_lock(&obj_list_mutex);
154947e946e7SWyllys Ingersoll 	if (rc != CKR_OK)
155047e946e7SWyllys Ingersoll 		return (FALSE);
155147e946e7SWyllys Ingersoll 
155247e946e7SWyllys Ingersoll 	node = publ_token_obj_list;
155347e946e7SWyllys Ingersoll 	while (publ_token_obj_list) {
155447e946e7SWyllys Ingersoll 		CK_OBJECT_HANDLE handle;
155547e946e7SWyllys Ingersoll 		CK_RV	    rc;
155647e946e7SWyllys Ingersoll 
155747e946e7SWyllys Ingersoll 		obj = (OBJECT *)node->data;
155847e946e7SWyllys Ingersoll 
155947e946e7SWyllys Ingersoll 		rc = object_mgr_find_in_map2(hContext, obj, &handle);
156047e946e7SWyllys Ingersoll 		if (rc == CKR_OK) {
156147e946e7SWyllys Ingersoll 			(void) object_mgr_invalidate_handle1(handle);
156247e946e7SWyllys Ingersoll 		}
156347e946e7SWyllys Ingersoll 		(void) object_free(obj);
156447e946e7SWyllys Ingersoll 
156547e946e7SWyllys Ingersoll 		next = node->next;
156647e946e7SWyllys Ingersoll 		publ_token_obj_list = dlist_remove_node(
156747e946e7SWyllys Ingersoll 		    publ_token_obj_list, node);
156847e946e7SWyllys Ingersoll 		node = next;
156947e946e7SWyllys Ingersoll 	}
157047e946e7SWyllys Ingersoll 
157147e946e7SWyllys Ingersoll 	node = priv_token_obj_list;
157247e946e7SWyllys Ingersoll 
157347e946e7SWyllys Ingersoll 	while (priv_token_obj_list) {
157447e946e7SWyllys Ingersoll 		CK_OBJECT_HANDLE handle;
157547e946e7SWyllys Ingersoll 		CK_RV	    rc;
157647e946e7SWyllys Ingersoll 
157747e946e7SWyllys Ingersoll 		obj = (OBJECT *)node->data;
157847e946e7SWyllys Ingersoll 
157947e946e7SWyllys Ingersoll 		rc = object_mgr_find_in_map2(hContext, obj, &handle);
158047e946e7SWyllys Ingersoll 		if (rc == CKR_OK)
158147e946e7SWyllys Ingersoll 			(void) object_mgr_invalidate_handle1(handle);
158247e946e7SWyllys Ingersoll 		(void) object_free(obj);
158347e946e7SWyllys Ingersoll 
158447e946e7SWyllys Ingersoll 		next = node->next;
158547e946e7SWyllys Ingersoll 		priv_token_obj_list = dlist_remove_node(
158647e946e7SWyllys Ingersoll 		    priv_token_obj_list, node);
158747e946e7SWyllys Ingersoll 		node = next;
158847e946e7SWyllys Ingersoll 	}
158947e946e7SWyllys Ingersoll 
159047e946e7SWyllys Ingersoll 	(void) pthread_mutex_unlock(&obj_list_mutex);
159147e946e7SWyllys Ingersoll 
159247e946e7SWyllys Ingersoll 	return (TRUE);
159347e946e7SWyllys Ingersoll }
159447e946e7SWyllys Ingersoll 
159547e946e7SWyllys Ingersoll CK_BBOOL
object_mgr_purge_private_token_objects(TSS_HCONTEXT hContext)159647e946e7SWyllys Ingersoll object_mgr_purge_private_token_objects(TSS_HCONTEXT hContext) {
159747e946e7SWyllys Ingersoll 	OBJECT   * obj  = NULL;
159847e946e7SWyllys Ingersoll 	DL_NODE  * node = NULL;
159947e946e7SWyllys Ingersoll 	DL_NODE  * next = NULL;
160047e946e7SWyllys Ingersoll 	CK_RV	rc;
160147e946e7SWyllys Ingersoll 
160247e946e7SWyllys Ingersoll 	rc = pthread_mutex_lock(&obj_list_mutex);
160347e946e7SWyllys Ingersoll 	if (rc != CKR_OK)
160447e946e7SWyllys Ingersoll 		return (FALSE);
160547e946e7SWyllys Ingersoll 
160647e946e7SWyllys Ingersoll 	node = priv_token_obj_list;
160747e946e7SWyllys Ingersoll 	while (priv_token_obj_list) {
160847e946e7SWyllys Ingersoll 		CK_OBJECT_HANDLE handle;
160947e946e7SWyllys Ingersoll 		CK_RV	    rc;
161047e946e7SWyllys Ingersoll 
161147e946e7SWyllys Ingersoll 		obj = (OBJECT *)node->data;
161247e946e7SWyllys Ingersoll 
161347e946e7SWyllys Ingersoll 		rc = object_mgr_find_in_map2(hContext, obj, &handle);
161447e946e7SWyllys Ingersoll 		if (rc == CKR_OK) {
161547e946e7SWyllys Ingersoll 			(void) object_mgr_invalidate_handle1(handle);
161647e946e7SWyllys Ingersoll 		}
161747e946e7SWyllys Ingersoll 
161847e946e7SWyllys Ingersoll 		(void) object_free(obj);
161947e946e7SWyllys Ingersoll 
162047e946e7SWyllys Ingersoll 		next = node->next;
162147e946e7SWyllys Ingersoll 		priv_token_obj_list = dlist_remove_node(
162247e946e7SWyllys Ingersoll 		    priv_token_obj_list, node);
162347e946e7SWyllys Ingersoll 		node = next;
162447e946e7SWyllys Ingersoll 	}
162547e946e7SWyllys Ingersoll 
162647e946e7SWyllys Ingersoll 	(void) pthread_mutex_unlock(&obj_list_mutex);
162747e946e7SWyllys Ingersoll 
162847e946e7SWyllys Ingersoll 	return (TRUE);
162947e946e7SWyllys Ingersoll }
163047e946e7SWyllys Ingersoll 
163147e946e7SWyllys Ingersoll CK_RV
object_mgr_remove_from_map(CK_OBJECT_HANDLE handle)163247e946e7SWyllys Ingersoll object_mgr_remove_from_map(CK_OBJECT_HANDLE  handle)
163347e946e7SWyllys Ingersoll {
163447e946e7SWyllys Ingersoll 	DL_NODE  *node = NULL;
163547e946e7SWyllys Ingersoll 
163647e946e7SWyllys Ingersoll 	if (pthread_rwlock_wrlock(&obj_list_rw_mutex)) {
163747e946e7SWyllys Ingersoll 		return (CKR_FUNCTION_FAILED);
163847e946e7SWyllys Ingersoll 	}
163947e946e7SWyllys Ingersoll 	node = object_map;
164047e946e7SWyllys Ingersoll 	while (node) {
164147e946e7SWyllys Ingersoll 		OBJECT_MAP *map = (OBJECT_MAP *)node->data;
164247e946e7SWyllys Ingersoll 		if (map->handle == handle) {
164347e946e7SWyllys Ingersoll 			object_map = dlist_remove_node(object_map, node);
164447e946e7SWyllys Ingersoll 			free(map);
164547e946e7SWyllys Ingersoll 			(void) pthread_rwlock_unlock(&obj_list_rw_mutex);
164647e946e7SWyllys Ingersoll 			return (CKR_OK);
164747e946e7SWyllys Ingersoll 		}
164847e946e7SWyllys Ingersoll 		node = node->next;
164947e946e7SWyllys Ingersoll 	}
165047e946e7SWyllys Ingersoll 	(void) pthread_rwlock_unlock(&obj_list_rw_mutex);
165147e946e7SWyllys Ingersoll 
165247e946e7SWyllys Ingersoll 	return (CKR_FUNCTION_FAILED);
165347e946e7SWyllys Ingersoll }
165447e946e7SWyllys Ingersoll 
165547e946e7SWyllys Ingersoll CK_RV
object_mgr_restore_obj(CK_BYTE * data,OBJECT * oldObj)165647e946e7SWyllys Ingersoll object_mgr_restore_obj(CK_BYTE *data, OBJECT *oldObj)
165747e946e7SWyllys Ingersoll {
165847e946e7SWyllys Ingersoll 	OBJECT    * obj  = NULL;
165947e946e7SWyllys Ingersoll 	CK_BBOOL    priv;
166047e946e7SWyllys Ingersoll 	CK_RV	rc;
166147e946e7SWyllys Ingersoll 
166247e946e7SWyllys Ingersoll 	if (! data) {
166347e946e7SWyllys Ingersoll 		return (CKR_FUNCTION_FAILED);
166447e946e7SWyllys Ingersoll 	}
166547e946e7SWyllys Ingersoll 	if (oldObj != NULL) {
166647e946e7SWyllys Ingersoll 		obj = oldObj;
166747e946e7SWyllys Ingersoll 		rc = object_restore(data, &obj, TRUE);
166847e946e7SWyllys Ingersoll 	} else {
166947e946e7SWyllys Ingersoll 		rc = object_restore(data, &obj, FALSE);
167047e946e7SWyllys Ingersoll 		if (rc == CKR_OK) {
167147e946e7SWyllys Ingersoll 			priv = object_is_private(obj);
167247e946e7SWyllys Ingersoll 
167347e946e7SWyllys Ingersoll 			if (priv)
167447e946e7SWyllys Ingersoll 				priv_token_obj_list = dlist_add_as_last(
167547e946e7SWyllys Ingersoll 				    priv_token_obj_list, obj);
167647e946e7SWyllys Ingersoll 			else
167747e946e7SWyllys Ingersoll 				publ_token_obj_list = dlist_add_as_last(
167847e946e7SWyllys Ingersoll 				    publ_token_obj_list, obj);
167947e946e7SWyllys Ingersoll 
1680*ab8176c2SWyllys Ingersoll 			(void) XProcLock(xproclock);
168147e946e7SWyllys Ingersoll 
168247e946e7SWyllys Ingersoll 			if (priv) {
168347e946e7SWyllys Ingersoll 				if (global_shm->priv_loaded == FALSE) {
168447e946e7SWyllys Ingersoll 					if (global_shm->num_priv_tok_obj <
168547e946e7SWyllys Ingersoll 					    MAX_TOK_OBJS)
168647e946e7SWyllys Ingersoll 						(void) object_mgr_add_to_shm(
168747e946e7SWyllys Ingersoll 						    obj);
168847e946e7SWyllys Ingersoll 					else
168947e946e7SWyllys Ingersoll 						rc = CKR_HOST_MEMORY;
169047e946e7SWyllys Ingersoll 				}
169147e946e7SWyllys Ingersoll 			} else {
169247e946e7SWyllys Ingersoll 				if (global_shm->publ_loaded == FALSE) {
169347e946e7SWyllys Ingersoll 					if (global_shm->num_publ_tok_obj <
169447e946e7SWyllys Ingersoll 					    MAX_TOK_OBJS)
169547e946e7SWyllys Ingersoll 						(void) object_mgr_add_to_shm(
169647e946e7SWyllys Ingersoll 						    obj);
169747e946e7SWyllys Ingersoll 					else
169847e946e7SWyllys Ingersoll 						rc = CKR_HOST_MEMORY;
169947e946e7SWyllys Ingersoll 				}
170047e946e7SWyllys Ingersoll 			}
170147e946e7SWyllys Ingersoll 
170247e946e7SWyllys Ingersoll 			(void) XProcUnLock(xproclock);
170347e946e7SWyllys Ingersoll 		}
170447e946e7SWyllys Ingersoll 	}
170547e946e7SWyllys Ingersoll 
170647e946e7SWyllys Ingersoll 	// make the callers have to have the mutes
170747e946e7SWyllys Ingersoll 	// to many grab it now.
170847e946e7SWyllys Ingersoll 	return (rc);
170947e946e7SWyllys Ingersoll }
171047e946e7SWyllys Ingersoll 
171147e946e7SWyllys Ingersoll CK_RV
object_mgr_set_attribute_values(SESSION * sess,CK_OBJECT_HANDLE handle,CK_ATTRIBUTE * pTemplate,CK_ULONG ulCount)171247e946e7SWyllys Ingersoll object_mgr_set_attribute_values(SESSION	   * sess,
171347e946e7SWyllys Ingersoll 	CK_OBJECT_HANDLE    handle,
171447e946e7SWyllys Ingersoll 	CK_ATTRIBUTE	* pTemplate,
171547e946e7SWyllys Ingersoll 	CK_ULONG	    ulCount)
171647e946e7SWyllys Ingersoll {
171747e946e7SWyllys Ingersoll 	OBJECT    * obj;
171847e946e7SWyllys Ingersoll 	CK_BBOOL    sess_obj, priv_obj;
171947e946e7SWyllys Ingersoll 	CK_BBOOL    modifiable;
172047e946e7SWyllys Ingersoll 	CK_RV	rc;
172147e946e7SWyllys Ingersoll 
172247e946e7SWyllys Ingersoll 	if (! pTemplate) {
172347e946e7SWyllys Ingersoll 		return (CKR_FUNCTION_FAILED);
172447e946e7SWyllys Ingersoll 	}
172547e946e7SWyllys Ingersoll 	rc = pthread_mutex_lock(&obj_list_mutex);
172647e946e7SWyllys Ingersoll 	if (rc != CKR_OK)
172747e946e7SWyllys Ingersoll 		return (CKR_FUNCTION_FAILED);
172847e946e7SWyllys Ingersoll 
172947e946e7SWyllys Ingersoll 	rc = object_mgr_find_in_map1(sess->hContext, handle, &obj);
173047e946e7SWyllys Ingersoll 	if (rc != CKR_OK) {
173147e946e7SWyllys Ingersoll 		(void) pthread_mutex_unlock(&obj_list_mutex);
173247e946e7SWyllys Ingersoll 		return (CKR_OBJECT_HANDLE_INVALID);
173347e946e7SWyllys Ingersoll 	}
173447e946e7SWyllys Ingersoll 	(void) pthread_mutex_unlock(&obj_list_mutex);
173547e946e7SWyllys Ingersoll 
173647e946e7SWyllys Ingersoll 	modifiable = object_is_modifiable(obj);
173747e946e7SWyllys Ingersoll 	sess_obj   = object_is_session_object(obj);
173847e946e7SWyllys Ingersoll 	priv_obj   = object_is_private(obj);
173947e946e7SWyllys Ingersoll 
174047e946e7SWyllys Ingersoll 	if (! modifiable) {
174147e946e7SWyllys Ingersoll 		return (CKR_ATTRIBUTE_READ_ONLY);
174247e946e7SWyllys Ingersoll 	}
1743*ab8176c2SWyllys Ingersoll 	rc = check_object_access(sess, obj);
1744*ab8176c2SWyllys Ingersoll 	if (rc != CKR_OK)
1745*ab8176c2SWyllys Ingersoll 		return (rc);
174647e946e7SWyllys Ingersoll 
174747e946e7SWyllys Ingersoll 	rc = object_set_attribute_values(obj, pTemplate, ulCount);
174847e946e7SWyllys Ingersoll 	if (rc != CKR_OK) {
174947e946e7SWyllys Ingersoll 		return (rc);
175047e946e7SWyllys Ingersoll 	}
175147e946e7SWyllys Ingersoll 	if (! sess_obj) {
175247e946e7SWyllys Ingersoll 		TOK_OBJ_ENTRY  *entry = NULL;
175347e946e7SWyllys Ingersoll 		CK_ULONG	index;
175447e946e7SWyllys Ingersoll 
175547e946e7SWyllys Ingersoll 		obj->count_lo++;
175647e946e7SWyllys Ingersoll 		if (obj->count_lo == 0)
175747e946e7SWyllys Ingersoll 			obj->count_hi++;
175847e946e7SWyllys Ingersoll 
175947e946e7SWyllys Ingersoll 		rc = save_token_object(sess->hContext, obj);
176047e946e7SWyllys Ingersoll 		if (rc != CKR_OK)
176147e946e7SWyllys Ingersoll 			return (rc);
176247e946e7SWyllys Ingersoll 
176347e946e7SWyllys Ingersoll 		rc = XProcLock(xproclock);
176447e946e7SWyllys Ingersoll 		if (rc != CKR_OK) {
176547e946e7SWyllys Ingersoll 			return (rc);
176647e946e7SWyllys Ingersoll 		}
176747e946e7SWyllys Ingersoll 		if (priv_obj) {
176847e946e7SWyllys Ingersoll 			rc = object_mgr_search_shm_for_obj(
176947e946e7SWyllys Ingersoll 			    global_shm->priv_tok_objs,
177047e946e7SWyllys Ingersoll 			    0, global_shm->num_priv_tok_obj - 1,
177147e946e7SWyllys Ingersoll 			    obj, &index);
177247e946e7SWyllys Ingersoll 
177347e946e7SWyllys Ingersoll 			if (rc != CKR_OK) {
177447e946e7SWyllys Ingersoll 				(void) XProcUnLock(xproclock);
177547e946e7SWyllys Ingersoll 				return (rc);
177647e946e7SWyllys Ingersoll 			}
177747e946e7SWyllys Ingersoll 
177847e946e7SWyllys Ingersoll 			entry = &global_shm->priv_tok_objs[index];
177947e946e7SWyllys Ingersoll 		} else {
178047e946e7SWyllys Ingersoll 			rc = object_mgr_search_shm_for_obj(
178147e946e7SWyllys Ingersoll 			    global_shm->publ_tok_objs,
178247e946e7SWyllys Ingersoll 			    0, global_shm->num_publ_tok_obj - 1,
178347e946e7SWyllys Ingersoll 			    obj, &index);
178447e946e7SWyllys Ingersoll 			if (rc != CKR_OK) {
178547e946e7SWyllys Ingersoll 				(void) XProcUnLock(xproclock);
178647e946e7SWyllys Ingersoll 				return (rc);
178747e946e7SWyllys Ingersoll 			}
178847e946e7SWyllys Ingersoll 
178947e946e7SWyllys Ingersoll 			entry = &global_shm->publ_tok_objs[index];
179047e946e7SWyllys Ingersoll 		}
179147e946e7SWyllys Ingersoll 
179247e946e7SWyllys Ingersoll 		entry->count_lo = obj->count_lo;
179347e946e7SWyllys Ingersoll 		entry->count_hi = obj->count_hi;
179447e946e7SWyllys Ingersoll 
179547e946e7SWyllys Ingersoll 		(void) XProcUnLock(xproclock);
179647e946e7SWyllys Ingersoll 	}
179747e946e7SWyllys Ingersoll 
179847e946e7SWyllys Ingersoll 	return (rc);
179947e946e7SWyllys Ingersoll }
180047e946e7SWyllys Ingersoll 
180147e946e7SWyllys Ingersoll CK_RV
object_mgr_add_to_shm(OBJECT * obj)180247e946e7SWyllys Ingersoll object_mgr_add_to_shm(OBJECT *obj)
180347e946e7SWyllys Ingersoll {
180447e946e7SWyllys Ingersoll 	TOK_OBJ_ENTRY  * entry  = NULL;
180547e946e7SWyllys Ingersoll 	CK_BBOOL	 priv;
180647e946e7SWyllys Ingersoll 
180747e946e7SWyllys Ingersoll 	priv = object_is_private(obj);
180847e946e7SWyllys Ingersoll 
180947e946e7SWyllys Ingersoll 	if (priv)
181047e946e7SWyllys Ingersoll 		entry = &global_shm->priv_tok_objs[
181147e946e7SWyllys Ingersoll 		    global_shm->num_priv_tok_obj];
181247e946e7SWyllys Ingersoll 	else
181347e946e7SWyllys Ingersoll 		entry = &global_shm->publ_tok_objs[
181447e946e7SWyllys Ingersoll 		    global_shm->num_publ_tok_obj];
181547e946e7SWyllys Ingersoll 
181647e946e7SWyllys Ingersoll 	entry->deleted  = FALSE;
181747e946e7SWyllys Ingersoll 	entry->count_lo = 0;
181847e946e7SWyllys Ingersoll 	entry->count_hi = 0;
181947e946e7SWyllys Ingersoll 	(void) memcpy(entry->name, obj->name, 8);
182047e946e7SWyllys Ingersoll 
182147e946e7SWyllys Ingersoll 	if (priv) {
182247e946e7SWyllys Ingersoll 		global_shm->num_priv_tok_obj++;
182347e946e7SWyllys Ingersoll 	} else {
182447e946e7SWyllys Ingersoll 		global_shm->num_publ_tok_obj++;
182547e946e7SWyllys Ingersoll 	}
182647e946e7SWyllys Ingersoll 
182747e946e7SWyllys Ingersoll 	return (CKR_OK);
182847e946e7SWyllys Ingersoll }
182947e946e7SWyllys Ingersoll 
183047e946e7SWyllys Ingersoll CK_RV
object_mgr_del_from_shm(OBJECT * obj)183147e946e7SWyllys Ingersoll object_mgr_del_from_shm(OBJECT *obj)
183247e946e7SWyllys Ingersoll {
183347e946e7SWyllys Ingersoll 	CK_ULONG	  index, count;
183447e946e7SWyllys Ingersoll 	CK_BBOOL	  priv;
183547e946e7SWyllys Ingersoll 	CK_RV		rc;
183647e946e7SWyllys Ingersoll 
183747e946e7SWyllys Ingersoll 	priv = object_is_private(obj);
183847e946e7SWyllys Ingersoll 
183947e946e7SWyllys Ingersoll 	if (priv) {
184047e946e7SWyllys Ingersoll 		rc = object_mgr_search_shm_for_obj(global_shm->priv_tok_objs,
184147e946e7SWyllys Ingersoll 		    0, global_shm->num_priv_tok_obj - 1, obj, &index);
184247e946e7SWyllys Ingersoll 		if (rc != CKR_OK) {
184347e946e7SWyllys Ingersoll 			return (CKR_FUNCTION_FAILED);
184447e946e7SWyllys Ingersoll 		}
184547e946e7SWyllys Ingersoll 
184647e946e7SWyllys Ingersoll 		global_shm->num_priv_tok_obj--;
184747e946e7SWyllys Ingersoll 		if (index > global_shm->num_priv_tok_obj) {
184847e946e7SWyllys Ingersoll 			count = index - global_shm->num_priv_tok_obj;
184947e946e7SWyllys Ingersoll 		} else {
185047e946e7SWyllys Ingersoll 			count = global_shm->num_priv_tok_obj - index;
185147e946e7SWyllys Ingersoll 		}
185247e946e7SWyllys Ingersoll 
185347e946e7SWyllys Ingersoll 		if (count > 0) {
185447e946e7SWyllys Ingersoll 			(void) memcpy((char *)&global_shm->priv_tok_objs[index],
185547e946e7SWyllys Ingersoll 			    (char *)&global_shm->priv_tok_objs[index + 1],
185647e946e7SWyllys Ingersoll 			    sizeof (TOK_OBJ_ENTRY) * count);
185747e946e7SWyllys Ingersoll 
185847e946e7SWyllys Ingersoll 			(void) memset((char *)&global_shm->priv_tok_objs[
185947e946e7SWyllys Ingersoll 			    global_shm->num_priv_tok_obj + 1], 0,
186047e946e7SWyllys Ingersoll 			    sizeof (TOK_OBJ_ENTRY));
186147e946e7SWyllys Ingersoll 		} else {
186247e946e7SWyllys Ingersoll 			(void) memset((char *)&global_shm->priv_tok_objs[
186347e946e7SWyllys Ingersoll 			    global_shm->num_priv_tok_obj], 0,
186447e946e7SWyllys Ingersoll 			    sizeof (TOK_OBJ_ENTRY));
186547e946e7SWyllys Ingersoll 		}
186647e946e7SWyllys Ingersoll 	} else {
186747e946e7SWyllys Ingersoll 		rc = object_mgr_search_shm_for_obj(global_shm->publ_tok_objs,
186847e946e7SWyllys Ingersoll 		    0, global_shm->num_publ_tok_obj - 1, obj, &index);
186947e946e7SWyllys Ingersoll 		if (rc != CKR_OK) {
187047e946e7SWyllys Ingersoll 			return (CKR_FUNCTION_FAILED);
187147e946e7SWyllys Ingersoll 		}
187247e946e7SWyllys Ingersoll 		global_shm->num_publ_tok_obj--;
187347e946e7SWyllys Ingersoll 
187447e946e7SWyllys Ingersoll 		if (index > global_shm->num_publ_tok_obj) {
187547e946e7SWyllys Ingersoll 			count = index - global_shm->num_publ_tok_obj;
187647e946e7SWyllys Ingersoll 		} else {
187747e946e7SWyllys Ingersoll 			count = global_shm->num_publ_tok_obj - index;
187847e946e7SWyllys Ingersoll 		}
187947e946e7SWyllys Ingersoll 
188047e946e7SWyllys Ingersoll 		if (count > 0) {
188147e946e7SWyllys Ingersoll 			(void) memcpy((char *)&global_shm->publ_tok_objs[index],
188247e946e7SWyllys Ingersoll 			    (char *)&global_shm->publ_tok_objs[index + 1],
188347e946e7SWyllys Ingersoll 			    sizeof (TOK_OBJ_ENTRY) * count);
188447e946e7SWyllys Ingersoll 			(void) memset((char *)&global_shm->publ_tok_objs[
188547e946e7SWyllys Ingersoll 			    global_shm->num_publ_tok_obj + 1], 0,
188647e946e7SWyllys Ingersoll 			    sizeof (TOK_OBJ_ENTRY));
188747e946e7SWyllys Ingersoll 		} else {
188847e946e7SWyllys Ingersoll 			(void) memset((char *)&global_shm->publ_tok_objs[
188947e946e7SWyllys Ingersoll 			    global_shm->num_publ_tok_obj], 0,
189047e946e7SWyllys Ingersoll 			    sizeof (TOK_OBJ_ENTRY));
189147e946e7SWyllys Ingersoll 		}
189247e946e7SWyllys Ingersoll 	}
189347e946e7SWyllys Ingersoll 
189447e946e7SWyllys Ingersoll 	return (CKR_OK);
189547e946e7SWyllys Ingersoll }
189647e946e7SWyllys Ingersoll 
189747e946e7SWyllys Ingersoll static CK_RV
object_mgr_check_shm(TSS_HCONTEXT hContext,OBJECT * obj)189847e946e7SWyllys Ingersoll object_mgr_check_shm(TSS_HCONTEXT hContext, OBJECT *obj)
189947e946e7SWyllys Ingersoll {
190047e946e7SWyllys Ingersoll 	TOK_OBJ_ENTRY   * entry = NULL;
190147e946e7SWyllys Ingersoll 	CK_BBOOL	  priv;
190247e946e7SWyllys Ingersoll 	CK_ULONG	  index;
190347e946e7SWyllys Ingersoll 	CK_RV		rc;
190447e946e7SWyllys Ingersoll 
190547e946e7SWyllys Ingersoll 
190647e946e7SWyllys Ingersoll 	priv = object_is_private(obj);
190747e946e7SWyllys Ingersoll 
190847e946e7SWyllys Ingersoll 	if (priv) {
190947e946e7SWyllys Ingersoll 		rc = object_mgr_search_shm_for_obj(
191047e946e7SWyllys Ingersoll 		    global_shm->priv_tok_objs,
191147e946e7SWyllys Ingersoll 		    0, global_shm->num_priv_tok_obj - 1, obj, &index);
191247e946e7SWyllys Ingersoll 		if (rc != CKR_OK) {
191347e946e7SWyllys Ingersoll 			return (CKR_FUNCTION_FAILED);
191447e946e7SWyllys Ingersoll 		}
191547e946e7SWyllys Ingersoll 		entry = &global_shm->priv_tok_objs[index];
191647e946e7SWyllys Ingersoll 	} else {
191747e946e7SWyllys Ingersoll 		rc = object_mgr_search_shm_for_obj(
191847e946e7SWyllys Ingersoll 		    global_shm->publ_tok_objs,
191947e946e7SWyllys Ingersoll 		    0, global_shm->num_publ_tok_obj - 1, obj, &index);
192047e946e7SWyllys Ingersoll 		if (rc != CKR_OK) {
192147e946e7SWyllys Ingersoll 			return (CKR_FUNCTION_FAILED);
192247e946e7SWyllys Ingersoll 		}
192347e946e7SWyllys Ingersoll 		entry = &global_shm->publ_tok_objs[index];
192447e946e7SWyllys Ingersoll 	}
192547e946e7SWyllys Ingersoll 
192647e946e7SWyllys Ingersoll 	if ((obj->count_hi == entry->count_hi) &&
192747e946e7SWyllys Ingersoll 	    (obj->count_lo == entry->count_lo))
192847e946e7SWyllys Ingersoll 		return (CKR_OK);
192947e946e7SWyllys Ingersoll 	rc = reload_token_object(hContext, obj);
193047e946e7SWyllys Ingersoll 	return (rc);
193147e946e7SWyllys Ingersoll }
193247e946e7SWyllys Ingersoll 
193347e946e7SWyllys Ingersoll /*ARGSUSED*/
193447e946e7SWyllys Ingersoll static CK_RV
object_mgr_search_shm_for_obj(TOK_OBJ_ENTRY * obj_list,CK_ULONG lo,CK_ULONG hi,OBJECT * obj,CK_ULONG * index)193547e946e7SWyllys Ingersoll object_mgr_search_shm_for_obj(
193647e946e7SWyllys Ingersoll 	TOK_OBJ_ENTRY *obj_list,
193747e946e7SWyllys Ingersoll 	CK_ULONG lo,
193847e946e7SWyllys Ingersoll 	CK_ULONG hi,
193947e946e7SWyllys Ingersoll 	OBJECT *obj,
194047e946e7SWyllys Ingersoll 	CK_ULONG *index)
194147e946e7SWyllys Ingersoll {
194247e946e7SWyllys Ingersoll 	CK_ULONG idx;
194347e946e7SWyllys Ingersoll 	if (obj->index == 0) {
194447e946e7SWyllys Ingersoll 		for (idx = lo; idx <= hi; idx++) {
194547e946e7SWyllys Ingersoll 			if (memcmp(obj->name, obj_list[idx].name, 8) == 0) {
194647e946e7SWyllys Ingersoll 				*index = idx;
194747e946e7SWyllys Ingersoll 				obj->index = idx;
194847e946e7SWyllys Ingersoll 				return (CKR_OK);
194947e946e7SWyllys Ingersoll 			}
195047e946e7SWyllys Ingersoll 		}
195147e946e7SWyllys Ingersoll 	} else {
195247e946e7SWyllys Ingersoll 		if (memcmp(obj->name, obj_list[obj->index].name, 8) == 0) {
195347e946e7SWyllys Ingersoll 			*index = obj->index;
195447e946e7SWyllys Ingersoll 			return (CKR_OK);
195547e946e7SWyllys Ingersoll 		} else {
195647e946e7SWyllys Ingersoll 			for (idx = lo; idx <= hi; idx++) {
195747e946e7SWyllys Ingersoll 				if (memcmp(obj->name,
195847e946e7SWyllys Ingersoll 				    obj_list[idx].name, 8) == 0) {
195947e946e7SWyllys Ingersoll 					*index = idx;
196047e946e7SWyllys Ingersoll 					obj->index = idx;
196147e946e7SWyllys Ingersoll 					return (CKR_OK);
196247e946e7SWyllys Ingersoll 				}
196347e946e7SWyllys Ingersoll 			}
196447e946e7SWyllys Ingersoll 		}
196547e946e7SWyllys Ingersoll 	}
196647e946e7SWyllys Ingersoll 	return (CKR_FUNCTION_FAILED);
196747e946e7SWyllys Ingersoll }
196847e946e7SWyllys Ingersoll 
196947e946e7SWyllys Ingersoll static CK_RV
object_mgr_update_publ_tok_obj_from_shm(TSS_HCONTEXT hContext)197047e946e7SWyllys Ingersoll object_mgr_update_publ_tok_obj_from_shm(TSS_HCONTEXT hContext)
197147e946e7SWyllys Ingersoll {
197247e946e7SWyllys Ingersoll 	DL_NODE	   * node = NULL;
197347e946e7SWyllys Ingersoll 	DL_NODE	   * next = NULL;
197447e946e7SWyllys Ingersoll 	TOK_OBJ_ENTRY	* te   = NULL;
197547e946e7SWyllys Ingersoll 	OBJECT	    * obj  = NULL;
197647e946e7SWyllys Ingersoll 	CK_OBJECT_HANDLE    handle;
197747e946e7SWyllys Ingersoll 	CK_ULONG	    index;
197847e946e7SWyllys Ingersoll 	int		 val;
197947e946e7SWyllys Ingersoll 	CK_RV		rc;
198047e946e7SWyllys Ingersoll 
198147e946e7SWyllys Ingersoll 	node  = publ_token_obj_list;
198247e946e7SWyllys Ingersoll 	index = 0;
198347e946e7SWyllys Ingersoll 
198447e946e7SWyllys Ingersoll 	while ((node != NULL) && (index < global_shm->num_publ_tok_obj)) {
198547e946e7SWyllys Ingersoll 		te = &global_shm->publ_tok_objs[index];
198647e946e7SWyllys Ingersoll 		obj = (OBJECT *)node->data;
198747e946e7SWyllys Ingersoll 
198847e946e7SWyllys Ingersoll 		val = memcmp(obj->name, te->name, 8);
198947e946e7SWyllys Ingersoll 
199047e946e7SWyllys Ingersoll 		// 3 cases:
199147e946e7SWyllys Ingersoll 		//    1) object in local list but not in the global list,
199247e946e7SWyllys Ingersoll 		//	need to remove from local list
199347e946e7SWyllys Ingersoll 		//    2) object in both lists, need to compare counters
199447e946e7SWyllys Ingersoll 		//	and update as needed
199547e946e7SWyllys Ingersoll 		//    3) object in global list but not in the local list,
199647e946e7SWyllys Ingersoll 		//	need to add the object here.
199747e946e7SWyllys Ingersoll 		//
199847e946e7SWyllys Ingersoll 		if (val < 0) {
199947e946e7SWyllys Ingersoll 			rc = object_mgr_find_in_map2(hContext, obj, &handle);
200047e946e7SWyllys Ingersoll 			if (rc == CKR_OK) {
200147e946e7SWyllys Ingersoll 				(void) object_mgr_remove_from_map(handle);
200247e946e7SWyllys Ingersoll 			}
200347e946e7SWyllys Ingersoll 			(void) object_free(obj);
200447e946e7SWyllys Ingersoll 
200547e946e7SWyllys Ingersoll 			next = node->next;
200647e946e7SWyllys Ingersoll 			publ_token_obj_list = dlist_remove_node(
200747e946e7SWyllys Ingersoll 			    publ_token_obj_list, node);
200847e946e7SWyllys Ingersoll 
200947e946e7SWyllys Ingersoll 		} else if (val == 0) {
201047e946e7SWyllys Ingersoll 			if ((te->count_hi != obj->count_hi) ||
201147e946e7SWyllys Ingersoll 			    (te->count_lo != obj->count_lo)) {
201247e946e7SWyllys Ingersoll 				(void) reload_token_object(hContext, obj);
201347e946e7SWyllys Ingersoll 				obj->count_hi = te->count_hi;
201447e946e7SWyllys Ingersoll 				obj->count_lo = te->count_lo;
201547e946e7SWyllys Ingersoll 			}
201647e946e7SWyllys Ingersoll 
201747e946e7SWyllys Ingersoll 			next = node->next;
201847e946e7SWyllys Ingersoll 			index++;
201947e946e7SWyllys Ingersoll 		} else {
202047e946e7SWyllys Ingersoll 			DL_NODE  *new_node = NULL;
202147e946e7SWyllys Ingersoll 			OBJECT   *new_obj  = NULL;
202247e946e7SWyllys Ingersoll 
202347e946e7SWyllys Ingersoll 			new_obj = (OBJECT *)malloc(sizeof (OBJECT));
202447e946e7SWyllys Ingersoll 			(void) memset(new_obj, 0x0, sizeof (OBJECT));
202547e946e7SWyllys Ingersoll 
202647e946e7SWyllys Ingersoll 			(void) memcpy(new_obj->name, te->name, 8);
202747e946e7SWyllys Ingersoll 			(void) reload_token_object(hContext, new_obj);
202847e946e7SWyllys Ingersoll 
202947e946e7SWyllys Ingersoll 			new_node = (DL_NODE *)malloc(sizeof (DL_NODE));
203047e946e7SWyllys Ingersoll 			new_node->data = new_obj;
203147e946e7SWyllys Ingersoll 
203247e946e7SWyllys Ingersoll 			new_node->next = node->next;
203347e946e7SWyllys Ingersoll 			node->next	= new_node;
203447e946e7SWyllys Ingersoll 			new_node->prev = node;
203547e946e7SWyllys Ingersoll 
203647e946e7SWyllys Ingersoll 			next = new_node->next;
203747e946e7SWyllys Ingersoll 			index++;
203847e946e7SWyllys Ingersoll 		}
203947e946e7SWyllys Ingersoll 
204047e946e7SWyllys Ingersoll 		node = next;
204147e946e7SWyllys Ingersoll 	}
204247e946e7SWyllys Ingersoll 
204347e946e7SWyllys Ingersoll 	if ((node == NULL) && (index < global_shm->num_publ_tok_obj)) {
204447e946e7SWyllys Ingersoll 		OBJECT   *new_obj  = NULL;
204547e946e7SWyllys Ingersoll 		unsigned int i;
204647e946e7SWyllys Ingersoll 
204747e946e7SWyllys Ingersoll 		for (i = index; i < global_shm->num_publ_tok_obj; i++) {
204847e946e7SWyllys Ingersoll 			new_obj = (OBJECT *)malloc(sizeof (OBJECT));
204947e946e7SWyllys Ingersoll 			(void) memset(new_obj, 0x0, sizeof (OBJECT));
205047e946e7SWyllys Ingersoll 
205147e946e7SWyllys Ingersoll 			te = &global_shm->publ_tok_objs[index];
205247e946e7SWyllys Ingersoll 
205347e946e7SWyllys Ingersoll 			(void) memcpy(new_obj->name, te->name, 8);
205447e946e7SWyllys Ingersoll 			(void) reload_token_object(hContext, new_obj);
205547e946e7SWyllys Ingersoll 
205647e946e7SWyllys Ingersoll 			publ_token_obj_list = dlist_add_as_last(
205747e946e7SWyllys Ingersoll 			    publ_token_obj_list, new_obj);
205847e946e7SWyllys Ingersoll 		}
205947e946e7SWyllys Ingersoll 	} else if ((node != NULL) && (index >= global_shm->num_publ_tok_obj)) {
206047e946e7SWyllys Ingersoll 		while (node) {
206147e946e7SWyllys Ingersoll 			obj = (OBJECT *)node->data;
206247e946e7SWyllys Ingersoll 
206347e946e7SWyllys Ingersoll 			rc = object_mgr_find_in_map2(hContext, obj, &handle);
206447e946e7SWyllys Ingersoll 			if (rc == CKR_OK) {
206547e946e7SWyllys Ingersoll 				(void) object_mgr_remove_from_map(handle);
206647e946e7SWyllys Ingersoll 			}
206747e946e7SWyllys Ingersoll 			(void) object_free(obj);
206847e946e7SWyllys Ingersoll 
206947e946e7SWyllys Ingersoll 			next = node->next;
207047e946e7SWyllys Ingersoll 			publ_token_obj_list = dlist_remove_node(
207147e946e7SWyllys Ingersoll 			    publ_token_obj_list, node);
207247e946e7SWyllys Ingersoll 
207347e946e7SWyllys Ingersoll 			node = next;
207447e946e7SWyllys Ingersoll 		}
207547e946e7SWyllys Ingersoll 	}
207647e946e7SWyllys Ingersoll 
207747e946e7SWyllys Ingersoll 	return (CKR_OK);
207847e946e7SWyllys Ingersoll }
207947e946e7SWyllys Ingersoll 
208047e946e7SWyllys Ingersoll static CK_RV
object_mgr_update_priv_tok_obj_from_shm(TSS_HCONTEXT hContext)208147e946e7SWyllys Ingersoll object_mgr_update_priv_tok_obj_from_shm(TSS_HCONTEXT hContext)
208247e946e7SWyllys Ingersoll {
208347e946e7SWyllys Ingersoll 	DL_NODE	   * node = NULL;
208447e946e7SWyllys Ingersoll 	DL_NODE	   * next = NULL;
208547e946e7SWyllys Ingersoll 	TOK_OBJ_ENTRY	* te   = NULL;
208647e946e7SWyllys Ingersoll 	OBJECT	    * obj  = NULL;
208747e946e7SWyllys Ingersoll 	CK_OBJECT_HANDLE    handle;
208847e946e7SWyllys Ingersoll 	CK_ULONG	    index;
208947e946e7SWyllys Ingersoll 	int		 val;
209047e946e7SWyllys Ingersoll 	CK_RV		rc;
209147e946e7SWyllys Ingersoll 
209247e946e7SWyllys Ingersoll 	node  = priv_token_obj_list;
209347e946e7SWyllys Ingersoll 	index = 0;
209447e946e7SWyllys Ingersoll 
209547e946e7SWyllys Ingersoll 	if (! (global_login_state == CKS_RW_USER_FUNCTIONS ||
209647e946e7SWyllys Ingersoll 	    global_login_state == CKS_RO_USER_FUNCTIONS)) {
209747e946e7SWyllys Ingersoll 		return (CKR_OK);
209847e946e7SWyllys Ingersoll 	}
209947e946e7SWyllys Ingersoll 
210047e946e7SWyllys Ingersoll 	while ((node != NULL) && (index < global_shm->num_priv_tok_obj)) {
210147e946e7SWyllys Ingersoll 		te = &global_shm->priv_tok_objs[index];
210247e946e7SWyllys Ingersoll 		obj = (OBJECT *)node->data;
210347e946e7SWyllys Ingersoll 
210447e946e7SWyllys Ingersoll 		val = memcmp(obj->name, te->name, 8);
210547e946e7SWyllys Ingersoll 
210647e946e7SWyllys Ingersoll 		if (val < 0) {
210747e946e7SWyllys Ingersoll 			rc = object_mgr_find_in_map2(hContext, obj, &handle);
210847e946e7SWyllys Ingersoll 			if (rc == CKR_OK) {
210947e946e7SWyllys Ingersoll 				(void) object_mgr_remove_from_map(handle);
211047e946e7SWyllys Ingersoll 			}
211147e946e7SWyllys Ingersoll 			(void) object_free(obj);
211247e946e7SWyllys Ingersoll 
211347e946e7SWyllys Ingersoll 			next = node->next;
211447e946e7SWyllys Ingersoll 			priv_token_obj_list = dlist_remove_node(
211547e946e7SWyllys Ingersoll 			    priv_token_obj_list, node);
211647e946e7SWyllys Ingersoll 
211747e946e7SWyllys Ingersoll 		} else if (val == 0) {
211847e946e7SWyllys Ingersoll 			if ((te->count_hi != obj->count_hi) ||
211947e946e7SWyllys Ingersoll 			    (te->count_lo != obj->count_lo)) {
212047e946e7SWyllys Ingersoll 				(void) reload_token_object(hContext, obj);
212147e946e7SWyllys Ingersoll 				obj->count_hi = te->count_hi;
212247e946e7SWyllys Ingersoll 				obj->count_lo = te->count_lo;
212347e946e7SWyllys Ingersoll 			}
212447e946e7SWyllys Ingersoll 
212547e946e7SWyllys Ingersoll 			next = node->next;
212647e946e7SWyllys Ingersoll 			index++;
212747e946e7SWyllys Ingersoll 		} else {
212847e946e7SWyllys Ingersoll 			DL_NODE  *new_node = NULL;
212947e946e7SWyllys Ingersoll 			OBJECT   *new_obj  = NULL;
213047e946e7SWyllys Ingersoll 
213147e946e7SWyllys Ingersoll 			new_obj = (OBJECT *)malloc(sizeof (OBJECT));
213247e946e7SWyllys Ingersoll 			(void) memset(new_obj, 0x0, sizeof (OBJECT));
213347e946e7SWyllys Ingersoll 
213447e946e7SWyllys Ingersoll 			(void) memcpy(new_obj->name, te->name, 8);
213547e946e7SWyllys Ingersoll 			(void) reload_token_object(hContext, new_obj);
213647e946e7SWyllys Ingersoll 
213747e946e7SWyllys Ingersoll 			new_node = (DL_NODE *)malloc(sizeof (DL_NODE));
213847e946e7SWyllys Ingersoll 			new_node->data = new_obj;
213947e946e7SWyllys Ingersoll 
214047e946e7SWyllys Ingersoll 			new_node->next = node->next;
214147e946e7SWyllys Ingersoll 			node->next	= new_node;
214247e946e7SWyllys Ingersoll 			new_node->prev = node;
214347e946e7SWyllys Ingersoll 
214447e946e7SWyllys Ingersoll 			next = new_node->next;
214547e946e7SWyllys Ingersoll 			index++;
214647e946e7SWyllys Ingersoll 		}
214747e946e7SWyllys Ingersoll 
214847e946e7SWyllys Ingersoll 		node = next;
214947e946e7SWyllys Ingersoll 	}
215047e946e7SWyllys Ingersoll 
215147e946e7SWyllys Ingersoll 	if ((node == NULL) && (index < global_shm->num_priv_tok_obj)) {
215247e946e7SWyllys Ingersoll 		OBJECT   *new_obj  = NULL;
215347e946e7SWyllys Ingersoll 		unsigned int i;
215447e946e7SWyllys Ingersoll 
215547e946e7SWyllys Ingersoll 		for (i = index; i < global_shm->num_priv_tok_obj; i++) {
215647e946e7SWyllys Ingersoll 			new_obj = (OBJECT *)malloc(sizeof (OBJECT));
215747e946e7SWyllys Ingersoll 			(void) memset(new_obj, 0x0, sizeof (OBJECT));
215847e946e7SWyllys Ingersoll 
215947e946e7SWyllys Ingersoll 			te = &global_shm->priv_tok_objs[index];
216047e946e7SWyllys Ingersoll 
216147e946e7SWyllys Ingersoll 			(void) memcpy(new_obj->name, te->name, 8);
216247e946e7SWyllys Ingersoll 			(void) reload_token_object(hContext, new_obj);
216347e946e7SWyllys Ingersoll 
216447e946e7SWyllys Ingersoll 			priv_token_obj_list = dlist_add_as_last(
216547e946e7SWyllys Ingersoll 			    priv_token_obj_list, new_obj);
216647e946e7SWyllys Ingersoll 		}
216747e946e7SWyllys Ingersoll 	} else if ((node != NULL) && (index >= global_shm->num_priv_tok_obj)) {
216847e946e7SWyllys Ingersoll 		while (node) {
216947e946e7SWyllys Ingersoll 			obj = (OBJECT *)node->data;
217047e946e7SWyllys Ingersoll 
217147e946e7SWyllys Ingersoll 			rc = object_mgr_find_in_map2(hContext, obj, &handle);
217247e946e7SWyllys Ingersoll 			if (rc == CKR_OK) {
217347e946e7SWyllys Ingersoll 				(void) object_mgr_remove_from_map(handle);
217447e946e7SWyllys Ingersoll 			}
217547e946e7SWyllys Ingersoll 			(void) object_free(obj);
217647e946e7SWyllys Ingersoll 
217747e946e7SWyllys Ingersoll 			next = node->next;
217847e946e7SWyllys Ingersoll 			priv_token_obj_list = dlist_remove_node(
217947e946e7SWyllys Ingersoll 			    priv_token_obj_list, node);
218047e946e7SWyllys Ingersoll 
218147e946e7SWyllys Ingersoll 			node = next;
218247e946e7SWyllys Ingersoll 		}
218347e946e7SWyllys Ingersoll 	}
218447e946e7SWyllys Ingersoll 
218547e946e7SWyllys Ingersoll 	return (CKR_OK);
218647e946e7SWyllys Ingersoll }
218747e946e7SWyllys Ingersoll 
218847e946e7SWyllys Ingersoll static CK_RV
object_mgr_update_from_shm(TSS_HCONTEXT hContext)218947e946e7SWyllys Ingersoll object_mgr_update_from_shm(TSS_HCONTEXT hContext)
219047e946e7SWyllys Ingersoll {
219147e946e7SWyllys Ingersoll 	(void) object_mgr_update_publ_tok_obj_from_shm(hContext);
219247e946e7SWyllys Ingersoll 	(void) object_mgr_update_priv_tok_obj_from_shm(hContext);
219347e946e7SWyllys Ingersoll 
219447e946e7SWyllys Ingersoll 	return (CKR_OK);
219547e946e7SWyllys Ingersoll }
219647e946e7SWyllys Ingersoll 
219747e946e7SWyllys Ingersoll /*ARGSUSED*/
219847e946e7SWyllys Ingersoll CK_BBOOL
object_mgr_purge_map(SESSION * sess,SESS_OBJ_TYPE type)219947e946e7SWyllys Ingersoll object_mgr_purge_map(
220047e946e7SWyllys Ingersoll 	SESSION	*sess,
220147e946e7SWyllys Ingersoll 	SESS_OBJ_TYPE type)
220247e946e7SWyllys Ingersoll {
220347e946e7SWyllys Ingersoll 	DL_NODE *node = NULL;
220447e946e7SWyllys Ingersoll 	DL_NODE *next = NULL;
220547e946e7SWyllys Ingersoll 
220647e946e7SWyllys Ingersoll 	if (pthread_rwlock_wrlock(&obj_list_rw_mutex)) {
220747e946e7SWyllys Ingersoll 		return (CKR_FUNCTION_FAILED);
220847e946e7SWyllys Ingersoll 	}
220947e946e7SWyllys Ingersoll 	node = object_map;
221047e946e7SWyllys Ingersoll 	while (node) {
221147e946e7SWyllys Ingersoll 		OBJECT_MAP *map = (OBJECT_MAP *)node->data;
221247e946e7SWyllys Ingersoll 		OBJECT	*obj = (OBJECT *)map->ptr;
221347e946e7SWyllys Ingersoll 		next = node->next;
221447e946e7SWyllys Ingersoll 		if (type == PRIVATE) {
221547e946e7SWyllys Ingersoll 			if (object_is_private(obj)) {
221647e946e7SWyllys Ingersoll 				object_map = dlist_remove_node(
221747e946e7SWyllys Ingersoll 				    object_map, node);
221847e946e7SWyllys Ingersoll 				free(map);
221947e946e7SWyllys Ingersoll 			}
222047e946e7SWyllys Ingersoll 		}
222147e946e7SWyllys Ingersoll 		if (type == PUBLIC) {
222247e946e7SWyllys Ingersoll 			if (object_is_public(obj)) {
222347e946e7SWyllys Ingersoll 				object_map = dlist_remove_node(
222447e946e7SWyllys Ingersoll 				    object_map, node);
222547e946e7SWyllys Ingersoll 				free(map);
222647e946e7SWyllys Ingersoll 			}
222747e946e7SWyllys Ingersoll 		}
222847e946e7SWyllys Ingersoll 		node = next;
222947e946e7SWyllys Ingersoll 	}
223047e946e7SWyllys Ingersoll 	(void) pthread_rwlock_unlock(&obj_list_rw_mutex);
223147e946e7SWyllys Ingersoll 
223247e946e7SWyllys Ingersoll 	return (TRUE);
223347e946e7SWyllys Ingersoll }
2234