Sorry, I forgot to mention that the allocated array has also to be free'ed before returning. So please look at the whole function below:



* Enumerate slots
 */
int
PKCS11_enumerate_slots(PKCS11_CTX * ctx, PKCS11_SLOT ** slotp, unsigned int *countp)
{
    PKCS11_CTX_private *priv = PRIVCTX(ctx);

    CK_SLOT_ID *slotid;
    CK_ULONG nslots, n;
    PKCS11_SLOT *slots;
    int rv;

    rv = priv->method->C_GetSlotList(FALSE, NULL_PTR, &nslots);
    CRYPTOKI_checkerr(PKCS11_F_PKCS11_ENUM_SLOTS, rv);
   
    slotid = (CK_SLOT_ID *)malloc(nslots * sizeof(CK_SLOT_ID));
    if (slotid == NULL) return (-1);

    rv = priv->method->C_GetSlotList(FALSE, slotid, &nslots);
    CRYPTOKI_checkerr(PKCS11_F_PKCS11_ENUM_SLOTS, rv);
   
    slots = (PKCS11_SLOT *) pkcs11_malloc(nslots * sizeof(PKCS11_SLOT));
    for (n = 0; n < nslots; n++) {
        if (pkcs11_init_slot(ctx, &slots[n], slotid[n])) {
            while (n--)
                pkcs11_release_slot(ctx, slots + n);
            OPENSSL_free(slots);
            free (slotid);
            return -1;
        }
    }

    *slotp = slots;
    *countp = nslots;
    free (slotid);
   
    return 0;
}

Thomas Irlet
_______________________________________________
opensc-devel mailing list
[email protected]
http://www.opensc-project.org/mailman/listinfo/opensc-devel

Reply via email to