odd segfault / must be something obvious

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

odd segfault / must be something obvious

Dirk-Willem van Gulik
I am hitting a head end and must be missing something obvious.

Below is the code - it verifies a signature. And it segfaults regularly on the PKCS7_free(p7);

And I fail to understand why - and suspect it is very obvious !

Any and all help appreciated.

Dw

#define EXITOUT(args...) { EOUT(args); goto errit; }

    int result = NO;
    BIO *signatureBlob = NULL, *contentBlob = NULL, *certificateBlob = NULL;
    X509_VERIFY_PARAM *verifyParameters = NULL;
    STACK_OF(X509) *signers = NULL;
    X509_STORE *store = NULL;
    X509 *signingCert = NULL;
    PKCS7 *p7 = NULL;
   
    if (NULL == (signatureBlob = BIO_new_mem_buf(sig.bytes, (int)sig.length))) EXITOUT("invalid  signatureBlob");    
    if (NULL == (contentBlob = BIO_new_mem_buf(cont.bytes, (int)cont.length))) EXITOUT("invalid  contentBlob");    
    if (NULL == (certificateBlob = BIO_new_mem_buf(cert.bytes, (int)cert.length))) EXITOUT("invalid certificateBlob");
   
    if (NULL == (p7 = d2i_PKCS7_bio(signatureBlob, NULL)))
        EXITOUT("invalid PKCS#7 structure in signatureBlob");
   
    if (NULL == (signers = PKCS7_get0_signers(p7, NULL, 0)))
        EXITOUT("No signers in PCKS#7 signatureBlob");

    if (sk_X509_num(signers) == 1)
        EXITOUT("Not signer exactly one signer in PCKS#7 signatureBlob");

    // do various validations/comparisons on signingCert = sk_X509_value(signers, 0);
       
    if ((NULL == (store = X509_STORE_new())))
        EXITOUT("store");
   
    for(X509 *cert = NULL;;cnt++) {
        if (NULL == (cert = PEM_read_bio_X509(certificateBlob, NULL, 0, NULL)))
            break;
       
        if (X509_STORE_add_cert(store, cert) != 1)
            EXITOUT("Could not add cert %d to chain.",1+cnt);
       
#ifdef __DEBUG
        print_certificate(cert);
#endif
        X509_free(cert);
    };
    ERR_clear_error();
   
    if (cnt == 0)
        EXITOUT("no trust chain of any length");
   
    if (NULL == (verifyParameters = X509_VERIFY_PARAM_new()))
        EXITOUT("Could create verifyParameters");

    // setup verifyParameters ..

    result = PKCS7_verify(p7, NULL, store, contentBlob, NULL, PKCS7_BINARY);

    // error handling / printing
   
errit:
    if (verifyParameters) X509_VERIFY_PARAM_free(verifyParameters);
   
    if (store) X509_STORE_free(store);
    if (p7) PKCS7_free(p7); // <----- **********************. segfault
   
    if (signatureBlob) BIO_free(signatureBlob);
    if (contentBlob) BIO_free(contentBlob);
    if (certificateBlob) BIO_free(certificateBlob);
   
    return result == 1;
}