Hello,

I am using openssl_0.9.6a.

Following code has been used to convert a PKCS 12 cert to PEM format. But I am getting 
some memory leaks reported. The report is listed at the end also.

Anyone has any ideas?  I ran the same piece of code through Purify, same leak 
reported. From there, I can see that the leak is coming from PKCS12_parse(). Besides 
freeing the PKCS12 object, what else do I need to free here after calling 
PKCS12_parse()?

Thanks for any help,
Kate

Here is my code:

========================================
Source code 
========================================

EVP_CIPHER *g_pEncAlg = NULL;
ESMTRESULT OsPEMCredConvert(FILE *fIn, char *pszP12Password, char *pszPassword, char 
*pszFilename, 
                            BOOL fMakeCertChain)
{
  ESMTRESULT  hr = NF_S_OK;
  PKCS12     *p12 = NULL;
  EVP_PKEY   *pPkey = NULL;
  X509       *pCert = NULL;
  BIO        *pBIO = NULL;
  STACK_OF(X509) *pCaCerts=NULL;
  char        abFilename[MAXPATHLEN] = "";
  FILE       *fOut = NULL;
  int         fCerts = INFO;
  NfCtx       nfCtx;
  nfCtx.fIn  = fIn;
  nfCtx.fOut = stdout;

  CRYPTO_malloc_debug_init();
  MemCheck_start();

  do
  {
    if (fMakeCertChain && g_fOutputCaCerts)
    {
      hr = CRED_E_INCOMPATIBLE_FLAGS;
      break;
    }
    if (fMakeCertChain)
      fCerts |= CLCERTS;
    else if (g_fOutputCaCerts)
      fCerts |= CACERTS | NOKEYS;

    if ((pBIO = BIO_new(NfBIO())) == NULL)
    {
      hr = CRED_E_BIO;
      break;
    }
    BIO_ctrl(pBIO, BIO_CTRL_SET, BIO_NOCLOSE, (char *)&nfCtx);

    if ((p12 = d2i_PKCS12_bio(pBIO, &p12)) == NULL)
    {
      hr = CRED_E_P12_OPEN;
      break;
    }

    if (PKCS12_parse(p12, pszP12Password ? pszP12Password : "", &pPkey, &pCert, (STACK 
**)&pCaCerts) <= 0)
    {
      hr = CRED_E_P12_PARSE;
      break;
    }  
        
 
    if (pszP12Password == NULL) 
    {
      if (!PKCS12_verify_mac(p12, NULL, 0))
      {
        hr = CRED_E_P12_BAD_PWD;
        break;
      }
    }
    else if (!PKCS12_verify_mac(p12, pszP12Password, -1)) 
    {
      hr = CRED_E_P12_BAD_PWD;
            break;
    }

    /*  Encrypt private key with 3DES if required */
    g_pEncAlg = pszPassword != NULL ? EVP_des_ede3_cbc() : NULL;
    if (!dump_certs_keys_p12 (pBIO, p12, pszP12Password, -1, fCerts, pszPassword)) 
    {
      hr = CRED_E_P12_PARSE;
        break;
    }

  } while (0);

  if (fOut) fclose(fOut);
  if (pCaCerts) sk_X509_free(pCaCerts);
  if (pCert) X509_free(pCert);
  if (pPkey)EVP_PKEY_free(pPkey);
  if (p12) PKCS12_free(p12);
  if (pBIO) BIO_free(pBIO);

  ERR_free_strings();
  ERR_remove_state(0);
  EVP_cleanup();


  MemCheck_stop();
  CRYPTO_mem_leaks(stdout);

  return (hr);
}

==========================================
Memory Leak Report
==========================================

380 file=asn1_lib.c, line=371, number=16, address=0028FA18
  363 file=asn1_lib.c, line=371, number=16, address=0028D200
  412 file=x_name.c, line=235, number=16, address=002946B8
  254 file=stack.c, line=124, number=32, address=00286BC8
  262 file=a_int.c, line=232, number=2, address=0027EE68
  422 file=x_name.c, line=235, number=16, address=00295E70
  425 file=a_object.c, line=242, number=3, address=00296598
  415 file=a_object.c, line=242, number=3, address=00294DE0
  306 file=asn1_lib.c, line=371, number=16, address=00284AA8
  332 file=a_object.c, line=242, number=9, address=00288928
  329 file=a_bytes.c, line=114, number=15, address=00288140
  402 file=a_object.c, line=242, number=3, address=00292E40
  286 file=a_bytes.c, line=114, number=12, address=00282B08
  274 file=a_object.c, line=268, number=24, address=00280AA8
  408 file=asn1_lib.c, line=371, number=16, address=00293D50
  302 file=a_object.c, line=268, number=24, address=00284140
  244 file=x_algor.c, line=102, number=8, address=0027C3E0
  348 file=a_object.c, line=242, number=9, address=0028AF60
  391 file=a_object.c, line=268, number=24, address=00291418
  253 file=stack.c, line=122, number=20, address=0027D928
  446 file=a_object.c, line=268, number=24, address=00299870
  374 file=a_int.c, line=232, number=2, address=0028EC00
  304 file=a_bytes.c, line=114, number=3, address=002845F8
  246 file=stack.c, line=122, number=20, address=0027C898
  321 file=asn1_lib.c, line=371, number=16, address=00286E40
  276 file=a_bytes.c, line=114, number=11, address=00280F60
  350 file=a_bitstr.c, line=190, number=64, address=0028B418
  393 file=a_bytes.c, line=114, number=12, address=002918D0
  356 file=x_algor.c, line=102, number=8, address=0028C178
  310 file=x_name.c, line=235, number=16, address=00285418
  419 file=a_object.c, line=268, number=24, address=00295750
  386 file=a_object.c, line=268, number=24, address=00290840
  448 file=a_bytes.c, line=222, number=23, address=00299D28
  346 file=a_bytes.c, line=222, number=39, address=0028AA80
  438 file=a_object.c, line=268, number=24, address=00298540
  339 file=a_object.c, line=268, number=24, address=002899F0
  313 file=a_object.c, line=242, number=3, address=00285B40
  278 file=asn1_lib.c, line=371, number=16, address=00281418
  451 file=a_object.c, line=268, number=24, address=0029A450
  352 file=buffer.c, line=110, number=268, address=0028B900
  326 file=asn1_lib.c, line=371, number=16, address=00287A20
  405 file=a_bytes.c, line=222, number=14, address=00293630
  395 file=asn1_lib.c, line=371, number=16, address=00291D88
  421 file=a_bytes.c, line=114, number=27, address=00295C08
  296 file=a_bytes.c, line=114, number=18, address=00283238
  288 file=asn1_lib.c, line=371, number=16, address=002550A8
  365 file=stack.c, line=122, number=20, address=0028D6C0
  388 file=a_bytes.c, line=114, number=11, address=00290CF8
  414 file=a_object.c, line=268, number=24, address=00294B78
  299 file=a_bytes.c, line=222, number=14, address=00283A20
  358 file=stack.c, line=122, number=20, address=0028C630
  427 file=x_name.c, line=235, number=16, address=00296B18
  315 file=x_name.c, line=235, number=16, address=00285FF8
  270 file=a_object.c, line=242, number=3, address=00280148
  257 file=x_algor.c, line=102, number=8, address=0027E298
  424 file=a_object.c, line=268, number=24, address=00296330
  401 file=a_object.c, line=268, number=24, address=00292BD8
  331 file=a_object.c, line=268, number=24, address=002886C0
  453 file=a_bytes.c, line=222, number=6, address=0029A908
  250 file=asn1_lib.c, line=371, number=16, address=0027D208
  443 file=stack.c, line=124, number=16, address=00299150
  267 file=x_name.c, line=235, number=16, address=0027FA20
  283 file=asn1_lib.c, line=371, number=16, address=00281FF8
  318 file=a_object.c, line=242, number=3, address=00286720
  347 file=a_object.c, line=268, number=24, address=0028ACF8
  430 file=a_object.c, line=242, number=3, address=00297180
  263 file=a_int.c, line=232, number=2, address=0027F0B8
  390 file=asn1_lib.c, line=371, number=16, address=002911B0
  426 file=a_bytes.c, line=114, number=12, address=002967E8
  416 file=a_bytes.c, line=114, number=11, address=00295030
  293 file=asn1_lib.c, line=371, number=16, address=00255C88
  259 file=x_algor.c, line=102, number=8, address=0027E750
  343 file=asn1_lib.c, line=371, number=16, address=0028A360
  403 file=a_bytes.c, line=114, number=48, address=00293090
  406 file=a_bytes.c, line=222, number=14, address=00293890
  327 file=a_object.c, line=268, number=24, address=00287C80
  242 file=x_cinf.c, line=171, number=40, address=0027BFC8
  396 file=a_object.c, line=268, number=24, address=00291FE8
  336 file=stack.c, line=124, number=16, address=002892D0
  303 file=a_object.c, line=242, number=3, address=002843A8
  432 file=x_name.c, line=235, number=16, address=00297638
  255 file=buffer.c, line=67, number=12, address=0027DDE8
  297 file=buffer.c, line=110, number=220, address=00283498
  289 file=a_object.c, line=268, number=24, address=00255308
  275 file=a_object.c, line=242, number=3, address=00280D10
  399 file=x_name.c, line=235, number=16, address=0025A188
  287 file=x_name.c, line=235, number=16, address=00252BF8
  441 file=a_bitstr.c, line=190, number=74, address=00298C58
  248 file=buffer.c, line=67, number=12, address=0027CD58
  300 file=x_name.c, line=235, number=16, address=00283C80
  265 file=a_object.c, line=242, number=9, address=0027F570
  369 file=x_algor.c, line=102, number=8, address=0028E030
  379 file=x_name.c, line=235, number=16, address=0028F7B8
  316 file=asn1_lib.c, line=371, number=16, address=00286258
  435 file=a_object.c, line=242, number=9, address=00297D60
  428 file=asn1_lib.c, line=371, number=16, address=00296CB8
  392 file=a_object.c, line=242, number=3, address=00291680
  362 file=asn1_lib.c, line=371, number=16, address=0028CFA0
  444 file=x_exten.c, line=123, number=20, address=002993B0
  251 file=asn1_lib.c, line=371, number=16, address=0027D468
  261 file=asn1_lib.c, line=371, number=16, address=0027EC08
  447 file=a_object.c, line=242, number=3, address=00299AD8
  372 file=asn1_lib.c, line=371, number=16, address=0028E740
  281 file=a_bytes.c, line=114, number=27, address=00281B30
  268 file=asn1_lib.c, line=371, number=16, address=0027FC80
  382 file=a_object.c, line=242, number=3, address=0028FEE0
  457 file=a_bitstr.c, line=190, number=128, address=0029B278
  284 file=a_object.c, line=268, number=24, address=00282258
  312 file=a_object.c, line=268, number=24, address=002858D8
  437 file=buffer.c, line=110, number=220, address=00298218
  375 file=a_int.c, line=232, number=2, address=0028EE50
  368 file=x_pubkey.c, line=101, number=12, address=0028DDD8
  305 file=x_name.c, line=235, number=16, address=00284848
  440 file=a_type.c, line=277, number=8, address=00298A00
  398 file=a_bytes.c, line=114, number=27, address=002924A0
  361 file=x_val.c, line=95, number=8, address=0028CD48
  341 file=a_bytes.c, line=222, number=3, address=00289EB0
  371 file=x_algor.c, line=102, number=8, address=0028E4E8
  378 file=a_type.c, line=277, number=8, address=0028F560
  291 file=a_bytes.c, line=114, number=24, address=002557C0
  410 file=a_object.c, line=242, number=3, address=00294218
  334 file=a_bitstr.c, line=190, number=74, address=00288DD8
  273 file=asn1_lib.c, line=371, number=16, address=00280848
  308 file=a_object.c, line=242, number=3, address=00284F70
  420 file=a_object.c, line=242, number=3, address=002959B8
  384 file=x_name.c, line=235, number=16, address=00290380
  387 file=a_object.c, line=242, number=3, address=00290AA8
  344 file=a_object.c, line=268, number=24, address=0028A5C0
  243 file=asn1_lib.c, line=371, number=16, address=0027C180
  407 file=x_name.c, line=235, number=16, address=00293AF0
  354 file=x_cinf.c, line=171, number=40, address=0028BD60
  456 file=a_type.c, line=277, number=8, address=0029B020
  439 file=a_object.c, line=242, number=9, address=002987A8
  337 file=x_exten.c, line=123, number=20, address=00289530
  433 file=asn1_lib.c, line=371, number=16, address=00297898
  367 file=buffer.c, line=67, number=12, address=0028DB80
  377 file=a_object.c, line=242, number=9, address=0028F308
  449 file=x_exten.c, line=123, number=20, address=00299F90
  353 file=x_x509.c, line=117, number=84, address=0028BC58
  340 file=a_object.c, line=242, number=9, address=00289C58
  452 file=a_object.c, line=242, number=3, address=0029A6B8
  301 file=asn1_lib.c, line=371, number=16, address=00283EE0
  314 file=a_bytes.c, line=114, number=27, address=00285D90
  360 file=buffer.c, line=67, number=12, address=0028CAF0
  294 file=a_object.c, line=268, number=24, address=00282E38
  317 file=a_object.c, line=268, number=24, address=002864B8
  333 file=a_type.c, line=277, number=8, address=00288B80
  429 file=a_object.c, line=268, number=24, address=00296F18
  455 file=a_object.c, line=242, number=9, address=0029ADC8
  252 file=x_name.c, line=221, number=16, address=0027D6C8
  320 file=x_name.c, line=235, number=16, address=00286CA0
  445 file=asn1_lib.c, line=371, number=16, address=00299610
  269 file=a_object.c, line=268, number=24, address=0027FEE0
  373 file=asn1_lib.c, line=371, number=16, address=0028E9A0
  245 file=x_name.c, line=221, number=16, address=0027C638
  247 file=stack.c, line=124, number=32, address=00282D60
  323 file=a_object.c, line=242, number=3, address=00287308
  349 file=a_type.c, line=277, number=8, address=0028B1B8
  271 file=a_bytes.c, line=114, number=3, address=00280398
  418 file=asn1_lib.c, line=371, number=16, address=002954F0
  385 file=asn1_lib.c, line=371, number=16, address=002905E0
  319 file=a_bytes.c, line=114, number=12, address=00286970
  431 file=a_bytes.c, line=114, number=24, address=002973D0
  264 file=a_object.c, line=268, number=24, address=0027F308
  277 file=x_name.c, line=235, number=16, address=002811B8
  338 file=asn1_lib.c, line=371, number=16, address=00289790
  355 file=asn1_lib.c, line=371, number=16, address=0028BF18
  434 file=a_object.c, line=268, number=24, address=00297AF8
  450 file=asn1_lib.c, line=371, number=16, address=0029A1F0
  325 file=x_name.c, line=235, number=16, address=002877C0
  280 file=a_object.c, line=242, number=3, address=002818E0
  381 file=a_object.c, line=268, number=24, address=0028FC78
  394 file=x_name.c, line=235, number=16, address=00291B28
  328 file=a_object.c, line=242, number=9, address=00287EE8
  364 file=x_name.c, line=221, number=16, address=0028D460
  404 file=buffer.c, line=110, number=208, address=00293310
  413 file=asn1_lib.c, line=371, number=16, address=00294918
  298 file=a_bytes.c, line=222, number=14, address=002837C0
  357 file=x_name.c, line=221, number=16, address=0028C3D0
  397 file=a_object.c, line=242, number=3, address=00292250
  423 file=asn1_lib.c, line=371, number=16, address=002960D0
  400 file=asn1_lib.c, line=371, number=16, address=00292978
  290 file=a_object.c, line=242, number=3, address=00255570
  307 file=a_object.c, line=268, number=24, address=00284D08
  442 file=stack.c, line=122, number=20, address=00298EF0
  383 file=a_bytes.c, line=114, number=3, address=00290130
  330 file=buffer.c, line=110, number=212, address=002883A0
  282 file=x_name.c, line=235, number=16, address=00281D98
  409 file=a_object.c, line=268, number=24, address=00293FB0
  285 file=a_object.c, line=242, number=3, address=002824C0
  359 file=stack.c, line=124, number=32, address=00292708
  376 file=a_object.c, line=268, number=24, address=0028F0A0
  389 file=x_name.c, line=235, number=16, address=00290F50
  241 file=x_x509.c, line=117, number=84, address=00249690
  292 file=x_name.c, line=235, number=16, address=00255A28
  258 file=asn1_lib.c, line=371, number=16, address=0027E4F0
  342 file=x_exten.c, line=123, number=20, address=0028A100
  411 file=a_bytes.c, line=114, number=3, address=00294468
  345 file=a_object.c, line=242, number=9, address=0028A828
  454 file=a_object.c, line=268, number=24, address=0029AB60
  309 file=a_bytes.c, line=114, number=11, address=002851C0
  335 file=stack.c, line=122, number=20, address=00289070
  322 file=a_object.c, line=268, number=24, address=002870A0
  417 file=x_name.c, line=235, number=16, address=00295288
  366 file=stack.c, line=124, number=32, address=00296A40
  260 file=asn1_lib.c, line=371, number=16, address=0027E9A8
  311 file=asn1_lib.c, line=371, number=16, address=00285678
  295 file=a_object.c, line=242, number=9, address=00282FE0
  459 file=buffer.c, line=110, number=268, address=0029B7A0
  324 file=a_bytes.c, line=114, number=21, address=00287558
  266 file=a_type.c, line=277, number=8, address=0027F7C8
  279 file=a_object.c, line=268, number=24, address=00281678
  370 file=asn1_lib.c, line=371, number=16, address=0028E288
  256 file=x_pubkey.c, line=101, number=12, address=0027E040
  436 file=a_bytes.c, line=114, number=18, address=00297FB8
  249 file=x_val.c, line=95, number=8, address=0027CFB0
  272 file=x_name.c, line=235, number=16, address=002805E8
5056 bytes leaked in 217 chunks
______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
Development Mailing List                       [EMAIL PROTECTED]
Automated List Manager                           [EMAIL PROTECTED]

Reply via email to