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