Fix double free's, NULL ptr de-reference, and conform better to pkcs11.
From Douglas Engert. git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@18187 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
@@ -950,16 +950,13 @@ p11_release_module(struct p11_module *p)
|
|||||||
if (--p->refcount > 0)
|
if (--p->refcount > 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (p->dl_handle)
|
|
||||||
dlclose(p->dl_handle);
|
|
||||||
|
|
||||||
for (i = 0; i < p->num_slots; i++) {
|
for (i = 0; i < p->num_slots; i++) {
|
||||||
if (p->slot->flags & P11_SESSION_IN_USE)
|
if (p->slot[i].flags & P11_SESSION_IN_USE)
|
||||||
_hx509_abort("pkcs11 module release while session in use");
|
_hx509_abort("pkcs11 module release while session in use");
|
||||||
if (p->slot->flags & P11_SESSION) {
|
if (p->slot[i].flags & P11_SESSION) {
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = P11FUNC(p, CloseSession, (p->slot->session));
|
ret = P11FUNC(p, CloseSession, (p->slot[i].session));
|
||||||
if (ret != CKR_OK)
|
if (ret != CKR_OK)
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
@@ -983,8 +980,15 @@ p11_release_module(struct p11_module *p)
|
|||||||
free(p->slot[i].mechs.infos);
|
free(p->slot[i].mechs.infos);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
free(p->slot);
|
|
||||||
}
|
}
|
||||||
|
free(p->slot);
|
||||||
|
|
||||||
|
if (p->funcs)
|
||||||
|
P11FUNC(p, Finalize, (NULL));
|
||||||
|
|
||||||
|
if (p->dl_handle)
|
||||||
|
dlclose(p->dl_handle);
|
||||||
|
|
||||||
memset(p, 0, sizeof(*p));
|
memset(p, 0, sizeof(*p));
|
||||||
free(p);
|
free(p);
|
||||||
}
|
}
|
||||||
@@ -1021,6 +1025,8 @@ p11_iter_start(hx509_context context,
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0 ; i < p->num_slots; i++) {
|
for (i = 0 ; i < p->num_slots; i++) {
|
||||||
|
if (p->slot[i].certs == NULL)
|
||||||
|
continue;
|
||||||
ret = hx509_certs_merge(context, c->certs, p->slot[i].certs);
|
ret = hx509_certs_merge(context, c->certs, p->slot[i].certs);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
hx509_certs_free(&c->certs);
|
hx509_certs_free(&c->certs);
|
||||||
|
Reference in New Issue
Block a user