Hello,I have the following code nothing fancy just opening a pkcs12 file and then trying to free every thing. when I run the code though purify I get an error on sk_X509_pop_free, Freeing unallocated memeory, Freeing memory read. If I don't uses sk_X509_free I get a memory leek but I don't see these errors.
Can someone please tell me the correct why to free a stack of certs?
int PKCS12PasswordVerify( char *p12FilePath, char *password )
{
PKCS12 *p12 = (PKCS12 *)NULL;
BIO *fp = (BIO *)NULL;
EVP_PKEY *pkey = (EVP_PKEY *)NULL;
X509 *cert = (X509 *)NULL;
STACK_OF(X509) *ca = NULL;
int status = PKCS12_ERR_GENERAL_FAILURE;
static int first = PKCS12_TRUE;
/* Loads all openssl needed algorithms and crypto strings */
if( PKCS12_TRUE == first )
{
OpenSSL_add_all_algorithms();
ERR_load_crypto_strings();
first = PKCS12_FALSE;
}
/* Opens file pointer to pkcs12 file */
fp = BIO_new_file(p12FilePath, "rb");
if( (BIO *)NULL != fp )
{
p12 = d2i_PKCS12_bio( fp, NULL );
if( (PKCS12 *)NULL != p12 )
{
if( 1 == PKCS12_parse(p12, password, &pkey, &cert, &ca) )
{
status = PKCS12_SUCCESS; }
else
{
status = PKCS12_ERR_PARSING_PKCS12_FILE;
}
}
else
{
/* Bad PKCS12 file */
status = PKCS12_ERR_LOADING_PKCS12_FILE;
}
}
else
{
/* Error Opening file */
status = PKCS12_ERR_OPENING_PKCS12_FILE;
}
/* Free every thing */
if( (BIO *)NULL != fp )
{
BIO_free( fp );
fp = (BIO *)NULL;
}
if( NULL != ca )
{
sk_X509_pop_free( ca, X509_free );
ca = NULL;
} if( (X509 *)NULL != cert )
{
X509_free(cert);
cert = (X509 *)NULL;
}
if( (EVP_PKEY *)NULL != pkey )
{
EVP_PKEY_free(pkey);
pkey = (EVP_PKEY *)NULL;
}
if( (PKCS12 *)NULL != p12 )
{
PKCS12_free(p12);
p12 = (PKCS12 *)NULL;
}
return status;
}
Thanks,
Perry
smime.p7s
Description: S/MIME Cryptographic Signature
