Thanks a bunch.  This helps me look in the right direction.

This exercise was more of a “how do things work in general” kind to get a 
better understanding of the data flows.

It was just odd that when I grep searched the GitWeb that there was not a 
single define or typedef that described how PKCS7_free is supposed to work, 
whereas for other functions, one can trace it from the high level function to 
the root, e.g., sk_OPENSSL_STRING_num(st) ==> SKM_sk_num(type, st) ==> 
CHECKED_STACK_OF(type, p) ==> sk_num(const _STACK *st)


On May 25, 2014, at 9:07 PM, Tom Francis <fr...@tcsaf.com> wrote:

> 
> On May 25, 2014, at 10:15 AM, Han Sooloo <hansoo...@gmail.com> wrote:
> 
>> Trying to understand how the crl2p7.c application allocates PKCS7 pointers.  
>> I see the PKCS7_new() function and it makes sense.
>> 
>> However, I cannot find the definition of PKCS7_free().  The only place it 
>> shows up is in libeay.num as "PKCS7_free                              444    
>>  EXIST::FUNCTION:”
>> 
>> 2 questions:
>> 1. What does the above declaration in libeay.num mean?
>> 2. What is the definition of PKCS7_free()?  How does it free memory pointed 
>> to by a PKCS7 data structure?
> 
> Most of the structures that are defined as ASN.1 structures (including PKCS7) 
> have methods like _free implemented through a macro.  You can search for the 
> definition of the IMPLEMENT_ASN1_FUNCTIONS macro (in crypto/asn1/asn1t.h) for 
> more info, but IIRC, it uses ASN1_item_free() which ultimately uses 
> OPENSSL_free() for (nearly?) everything inside (some structures (but not, 
> IIRC, PKCS7) will also have OPENSSL_cleanse invoked proper to releasing the 
> memory, and there’s a patch that will apply that more frequently).  Some 
> structures use their own customer _new or _free methods, but I didn’t think 
> PKCS7 used a custom _new (and I don’t see one in 1.0.1g).  In general, 
> though, if you’re manipulating the members of the structure directly, you 
> should be sure to allocate any buffers with OPENSSL_malloc() before assigning 
> them to members of the structure, as PKCS7_free will assume it can release 
> the buffers with OPENSSL_free().  I always find it simpler to not touch any 
> members directly, but use the methods and macros defined in pkcs7.h.  They 
> should duplicate any buffers that PKCS7_free() expects to free on its own, so 
> it’ll be safe to release your buffers without worry.
> 
> TOM
> 
>> 
>> ______________________________________________________________________
>> OpenSSL Project                                 http://www.openssl.org
>> User Support Mailing List                    openssl-users@openssl.org
>> Automated List Manager                           majord...@openssl.org
>> 
> ______________________________________________________________________
> OpenSSL Project                                 http://www.openssl.org
> User Support Mailing List                    openssl-users@openssl.org
> Automated List Manager                           majord...@openssl.org

Reply via email to