summaryrefslogtreecommitdiffstats
path: root/psession.c
diff options
context:
space:
mode:
authorKamil Dudka <kdudka@redhat.com>2009-08-20 11:04:14 +0200
committerRob Crittenden <rcritten@redhat.com>2009-08-20 10:58:37 -0400
commit99286597662891ac69146fce6590a435331938cd (patch)
treeea9a52d2c65ba57967357cb7b23cdb3967c343dd /psession.c
parent6f7f653c5dc2deca95d3453d706ddc4c2eb46e70 (diff)
downloadpemnss-99286597662891ac69146fce6590a435331938cd.tar.gz
pemnss-99286597662891ac69146fce6590a435331938cd.tar.xz
pemnss-99286597662891ac69146fce6590a435331938cd.zip
implement memory management for internal objects
* ckpem.h: Define list objects, add reference counter to internal objects. * pfind.c: Increase object's reference while exporting. Skip already freed objects. * pinst.c (AddObjectIfNeeded): New function providing sharing of internal objects. * pobject.c: Add support for list objects. Implement pem_mdObject_Finalize(). * psession.c (pem_mdSession_CopyObject): Increase reference count only. Signed-off-by: Kamil Dudka <kdudka@redhat.com>
Diffstat (limited to 'psession.c')
-rw-r--r--psession.c129
1 files changed, 17 insertions, 112 deletions
diff --git a/psession.c b/psession.c
index 2eefcbc..82f8b41 100644
--- a/psession.c
+++ b/psession.c
@@ -158,6 +158,9 @@ pem_mdSession_CreateObject
ulAttributeCount, pError);
}
+/*
+ * increase refCount of internal object(s)
+ */
NSSCKMDObject *
pem_mdSession_CopyObject
(
@@ -175,120 +178,19 @@ pem_mdSession_CopyObject
CK_RV * pError
)
{
- pemInternalObject *new = NULL;
- NSSCKMDObject *mdObject = nssCKFWObject_GetMDObject(fwOldObject);
- pemInternalObject *old = (pemInternalObject *) mdObject->etc;
- CK_RV error = CKR_OK;
-
- plog("pem_mdSession_CopyObject: ");
- /*
- * now handle the various object types
- */
- *pError = CKR_OK;
- switch (old->type) {
- case pemCert:
- plog("pemCert\n");
- if ((pemInternalObject *) NULL == 0) {
- new = nss_ZNEW(NULL, pemInternalObject);
- if ((pemInternalObject *) NULL == new) {
- *pError = CKR_HOST_MEMORY;
- goto loser;
- }
- memset(&new->u.cert, 0, sizeof(new->u.cert));
- new->objClass = CKO_CERTIFICATE;
- new->type = pemCert;
- new->derCert = nss_ZNEW(NULL, SECItem);
- new->derCert->data =
- (void *) nss_ZAlloc(NULL, old->derCert->len);
- new->derCert->len = old->derCert->len;
- nsslibc_memcpy(new->derCert->data, old->derCert->data,
- old->derCert->len);
- new->nickname =
- (char *) nss_ZAlloc(NULL, strlen(old->nickname) + 1);
- strcpy(new->nickname, old->nickname);
- new->id.data = (void *) nss_ZAlloc(NULL, old->id.size);
- (void) nsslibc_memcpy(new->id.data, old->id.data,
- old->id.size);
- new->id.size = old->id.size;
+ pemInternalObject *io = (pemInternalObject *) mdOldObject->etc;
+
+ if (NULL == io->list) {
+ io->refCount ++;
+ } else {
+ /* go through list of objects */
+ pemObjectListItem *item = io->list;
+ while (item) {
+ item->io->refCount ++;
+ item = item->next;
}
- break;
- case pemBareKey:
- plog("pemBareKey\n");
- if ((pemInternalObject *) NULL == 0) {
- new = nss_ZNEW(NULL, pemInternalObject);
- if ((pemInternalObject *) NULL == new) {
- *pError = CKR_HOST_MEMORY;
- goto loser;
- }
- memset(&new->u.key, 0, sizeof(new->u.key));
- new->objClass = CKO_PRIVATE_KEY;
- new->type = pemBareKey;
- new->derCert = nss_ZNEW(NULL, SECItem);
- new->derCert->data =
- (void *) nss_ZAlloc(NULL, old->derCert->len);
- new->derCert->len = old->derCert->len;
- new->id.data = (void *) nss_ZAlloc(NULL, old->id.size);
- (void) nsslibc_memcpy(new->id.data, old->id.data,
- old->id.size);
- new->id.size = old->id.size;
- nsslibc_memcpy(new->derCert->data, old->derCert->data,
- old->derCert->len);
- new->nickname =
- (char *) nss_ZAlloc(NULL, strlen(old->nickname) + 1);
- strcpy(new->nickname, old->nickname);
- new->u.key.key.privateKey = nss_ZNEW(NULL, SECItem);
- new->u.key.key.privateKey->data =
- (void *) nss_ZAlloc(NULL, old->u.key.key.privateKey->len);
- new->u.key.key.privateKey->len =
- old->u.key.key.privateKey->len;
- nsslibc_memcpy(new->u.key.key.privateKey->data,
- old->u.key.key.privateKey->data,
- old->u.key.key.privateKey->len);
- }
- goto done;
- break;
- case pemTrust:
- plog("pemTrust\n");
- if ((pemInternalObject *) NULL == 0) {
- new = nss_ZNEW(NULL, pemInternalObject);
- if ((pemInternalObject *) NULL == new) {
- *pError = CKR_HOST_MEMORY;
- goto loser;
- }
- memset(&new->u.trust, 0, sizeof(new->u.trust));
- new->objClass = CKO_CERTIFICATE;
- new->type = pemTrust;
- new->derCert = nss_ZNEW(NULL, SECItem);
- new->derCert->data =
- (void *) nss_ZAlloc(NULL, old->derCert->len);
- new->derCert->len = old->derCert->len;
- nsslibc_memcpy(new->derCert->data, old->derCert->data,
- old->derCert->len);
- new->nickname =
- (char *) nss_ZAlloc(NULL, strlen(old->nickname) + 1);
- strcpy(new->nickname, old->nickname);
- new->id.data = (void *) nss_ZAlloc(NULL, old->id.size);
- (void) nsslibc_memcpy(new->id.data, old->id.data,
- old->id.size);
- new->id.size = old->id.size;
- }
- goto done;
- default:
- plog("Unknown: %08x\n", old->type);
- goto done; /* no other object types we understand in this module */
- }
- if (CKR_OK != *pError) {
- goto loser;
}
-
- done:
- *pError = CKR_OK;
- return (NSSCKMDObject *) pem_CreateMDObject(arena, new, &error);
-
- loser:
- *pError = CKR_GENERAL_ERROR;
- return (NSSCKMDObject *) NULL;
-
+ return mdOldObject;
}
CK_RV
@@ -333,6 +235,9 @@ pem_mdSession_Login
/* Find the right key object */
for (i = 0; i < pem_nobjs; i++) {
+ if (NULL == gobj[i])
+ continue;
+
if ((slotID == gobj[i]->slotID) && (gobj[i]->type == pemBareKey)) {
io = gobj[i];
break;