Hi,
I found that there is a memory leak in the function
PEM_read_bio_X509();
Herewith I've attached the valgrind trace(with flags --tool=memcheck --leak-check=full --show-reachable=yes ) and a sample test case.
Is this a known issue or have I missed some steps?
Cheers,
Kaushalye

--
http://kaushalye.blogspot.com/
http://wso2.org/

#include <stdio.h>
#include <openssl/rsa.h>
#include <openssl/evp.h>
#include <openssl/objects.h>
#include <openssl/x509.h>
#include <openssl/err.h>
#include <openssl/pem.h>
#include <openssl/ssl.h>
#include <openssl/bio.h>

int main ()
{
  static char certfile[] = "rsacert.pem";
  X509 *    cert = NULL;
  BIO *bio_cert = NULL;
  int ret;


  /*Load cert*/
  bio_cert = BIO_new_file(certfile, "rb");
  PEM_read_bio_X509(bio_cert, &cert, NULL, NULL);
  if(!cert){
    printf("Cannot load the certificate\n");
  }
  ret = BIO_reset(bio_cert);
  ret = BIO_free(bio_cert);
  bio_cert = NULL;

    return 0;
}
==23024== Memcheck, a memory error detector.
==23024== Copyright (C) 2002-2007, and GNU GPL'd, by Julian Seward et al.
==23024== Using LibVEX rev 1732, a library for dynamic binary translation.
==23024== Copyright (C) 2004-2007, and GNU GPL'd, by OpenWorks LLP.
==23024== Using valgrind-3.2.3-Debian, a dynamic binary instrumentation 
framework.
==23024== Copyright (C) 2000-2007, and GNU GPL'd, by Julian Seward et al.
==23024== For more details, rerun with: -v
==23024== 
==23024== Conditional jump or move depends on uninitialised value(s)
==23024==    at 0x4016B71: (within /lib/ld-2.6.so)
==23024==    by 0x4007CD1: (within /lib/ld-2.6.so)
==23024==    by 0x40031B6: (within /lib/ld-2.6.so)
==23024==    by 0x4014E9A: (within /lib/ld-2.6.so)
==23024==    by 0x4000C42: (within /lib/ld-2.6.so)
==23024==    by 0x4000816: (within /lib/ld-2.6.so)
==23024== 
==23024== Conditional jump or move depends on uninitialised value(s)
==23024==    at 0x4016B7C: (within /lib/ld-2.6.so)
==23024==    by 0x4007CD1: (within /lib/ld-2.6.so)
==23024==    by 0x40031B6: (within /lib/ld-2.6.so)
==23024==    by 0x4014E9A: (within /lib/ld-2.6.so)
==23024==    by 0x4000C42: (within /lib/ld-2.6.so)
==23024==    by 0x4000816: (within /lib/ld-2.6.so)
==23024== 
==23024== Conditional jump or move depends on uninitialised value(s)
==23024==    at 0x400B44C: (within /lib/ld-2.6.so)
==23024==    by 0x40040DC: (within /lib/ld-2.6.so)
==23024==    by 0x4014E9A: (within /lib/ld-2.6.so)
==23024==    by 0x4000C42: (within /lib/ld-2.6.so)
==23024==    by 0x4000816: (within /lib/ld-2.6.so)
==23024== 
==23024== Conditional jump or move depends on uninitialised value(s)
==23024==    at 0x400B14A: (within /lib/ld-2.6.so)
==23024==    by 0x40040DC: (within /lib/ld-2.6.so)
==23024==    by 0x4014E9A: (within /lib/ld-2.6.so)
==23024==    by 0x4000C42: (within /lib/ld-2.6.so)
==23024==    by 0x4000816: (within /lib/ld-2.6.so)
==23024== 
==23024== Conditional jump or move depends on uninitialised value(s)
==23024==    at 0x400B8DF: (within /lib/ld-2.6.so)
==23024==    by 0x40040DC: (within /lib/ld-2.6.so)
==23024==    by 0x4014E9A: (within /lib/ld-2.6.so)
==23024==    by 0x4000C42: (within /lib/ld-2.6.so)
==23024==    by 0x4000816: (within /lib/ld-2.6.so)
==23024== 
==23024== Conditional jump or move depends on uninitialised value(s)
==23024==    at 0x400B00B: (within /lib/ld-2.6.so)
==23024==    by 0x4003F87: (within /lib/ld-2.6.so)
==23024==    by 0x4014E9A: (within /lib/ld-2.6.so)
==23024==    by 0x4000C42: (within /lib/ld-2.6.so)
==23024==    by 0x4000816: (within /lib/ld-2.6.so)
==23024== 
==23024== Conditional jump or move depends on uninitialised value(s)
==23024==    at 0x400B013: (within /lib/ld-2.6.so)
==23024==    by 0x4003F87: (within /lib/ld-2.6.so)
==23024==    by 0x4014E9A: (within /lib/ld-2.6.so)
==23024==    by 0x4000C42: (within /lib/ld-2.6.so)
==23024==    by 0x4000816: (within /lib/ld-2.6.so)
==23024== 
==23024== Conditional jump or move depends on uninitialised value(s)
==23024==    at 0x400B14A: (within /lib/ld-2.6.so)
==23024==    by 0x4003F87: (within /lib/ld-2.6.so)
==23024==    by 0x4014E9A: (within /lib/ld-2.6.so)
==23024==    by 0x4000C42: (within /lib/ld-2.6.so)
==23024==    by 0x4000816: (within /lib/ld-2.6.so)
==23024== 
==23024== ERROR SUMMARY: 19 errors from 8 contexts (suppressed: 0 from 0)
==23024== malloc/free: in use at exit: 2,918 bytes in 136 blocks.
==23024== malloc/free: 191 allocs, 55 frees, 8,382 bytes allocated.
==23024== For counts of detected errors, rerun with: -v
==23024== searching for pointers to 136 not-freed blocks.
==23024== checked 176,000 bytes.
==23024== 
==23024== 
==23024== 280 bytes in 10 blocks are still reachable in loss record 1 of 4
==23024==    at 0x40244B0: malloc (vg_replace_malloc.c:149)
==23024==    by 0x4064C4D: (within /usr/lib/i686/cmov/libcrypto.so.0.9.8)
==23024==    by 0x40652CE: CRYPTO_malloc (in 
/usr/lib/i686/cmov/libcrypto.so.0.9.8)
==23024==    by 0x40CD2F9: lh_new (in /usr/lib/i686/cmov/libcrypto.so.0.9.8)
==23024==    by 0x4066FC1: (within /usr/lib/i686/cmov/libcrypto.so.0.9.8)
==23024==    by 0x40673EB: (within /usr/lib/i686/cmov/libcrypto.so.0.9.8)
==23024==    by 0x4067A8D: CRYPTO_new_ex_data (in 
/usr/lib/i686/cmov/libcrypto.so.0.9.8)
==23024==    by 0x40C2CD3: BIO_set (in /usr/lib/i686/cmov/libcrypto.so.0.9.8)
==23024==    by 0x40C2D69: BIO_new (in /usr/lib/i686/cmov/libcrypto.so.0.9.8)
==23024==    by 0x40C424E: BIO_new_file (in 
/usr/lib/i686/cmov/libcrypto.so.0.9.8)
==23024==    by 0x80485A6: main (mem.c:20)
==23024== 
==23024== 
==23024== 2,638 (92 direct, 2,546 indirect) bytes in 1 blocks are definitely 
lost in loss record 2 of 4
==23024==    at 0x40244B0: malloc (vg_replace_malloc.c:149)
==23024==    by 0x4064C4D: (within /usr/lib/i686/cmov/libcrypto.so.0.9.8)
==23024==    by 0x40652CE: CRYPTO_malloc (in 
/usr/lib/i686/cmov/libcrypto.so.0.9.8)
==23024==    by 0x40EC806: (within /usr/lib/i686/cmov/libcrypto.so.0.9.8)
==23024==    by 0x40EF45D: ASN1_item_ex_d2i (in 
/usr/lib/i686/cmov/libcrypto.so.0.9.8)
==23024==    by 0x40EFC04: ASN1_item_d2i (in 
/usr/lib/i686/cmov/libcrypto.so.0.9.8)
==23024==    by 0x40E67D4: d2i_X509 (in /usr/lib/i686/cmov/libcrypto.so.0.9.8)
==23024==    by 0x40FD3C2: PEM_ASN1_read_bio (in 
/usr/lib/i686/cmov/libcrypto.so.0.9.8)
==23024==    by 0x40FCF06: PEM_read_bio_X509 (in 
/usr/lib/i686/cmov/libcrypto.so.0.9.8)
==23024==    by 0x80485CB: main (mem.c:21)
==23024== 
==23024== 
==23024== 96 bytes in 3 blocks are indirectly lost in loss record 3 of 4
==23024==    at 0x40245AB: realloc (vg_replace_malloc.c:306)
==23024==    by 0x4064C84: (within /usr/lib/i686/cmov/libcrypto.so.0.9.8)
==23024==    by 0x40653B6: CRYPTO_realloc (in 
/usr/lib/i686/cmov/libcrypto.so.0.9.8)
==23024==    by 0x40CCCE7: sk_insert (in /usr/lib/i686/cmov/libcrypto.so.0.9.8)
==23024==    by 0x40CCD79: sk_push (in /usr/lib/i686/cmov/libcrypto.so.0.9.8)
==23024==    by 0x40E6352: (within /usr/lib/i686/cmov/libcrypto.so.0.9.8)
==23024==    by 0x40EEDE3: ASN1_item_ex_d2i (in 
/usr/lib/i686/cmov/libcrypto.so.0.9.8)
==23024==    by 0x40EF710: (within /usr/lib/i686/cmov/libcrypto.so.0.9.8)
==23024==    by 0x40EFA22: (within /usr/lib/i686/cmov/libcrypto.so.0.9.8)
==23024==    by 0x40EF170: ASN1_item_ex_d2i (in 
/usr/lib/i686/cmov/libcrypto.so.0.9.8)
==23024==    by 0x40EF710: (within /usr/lib/i686/cmov/libcrypto.so.0.9.8)
==23024==    by 0x40EFA22: (within /usr/lib/i686/cmov/libcrypto.so.0.9.8)
==23024== 
==23024== 
==23024== 2,450 bytes in 122 blocks are indirectly lost in loss record 4 of 4
==23024==    at 0x40244B0: malloc (vg_replace_malloc.c:149)
==23024==    by 0x4064C4D: (within /usr/lib/i686/cmov/libcrypto.so.0.9.8)
==23024==    by 0x40652CE: CRYPTO_malloc (in 
/usr/lib/i686/cmov/libcrypto.so.0.9.8)
==23024==    by 0x40EC806: (within /usr/lib/i686/cmov/libcrypto.so.0.9.8)
==23024==    by 0x40EC792: (within /usr/lib/i686/cmov/libcrypto.so.0.9.8)
==23024==    by 0x40EF45D: ASN1_item_ex_d2i (in 
/usr/lib/i686/cmov/libcrypto.so.0.9.8)
==23024==    by 0x40EFC04: ASN1_item_d2i (in 
/usr/lib/i686/cmov/libcrypto.so.0.9.8)
==23024==    by 0x40E67D4: d2i_X509 (in /usr/lib/i686/cmov/libcrypto.so.0.9.8)
==23024==    by 0x40FD3C2: PEM_ASN1_read_bio (in 
/usr/lib/i686/cmov/libcrypto.so.0.9.8)
==23024==    by 0x40FCF06: PEM_read_bio_X509 (in 
/usr/lib/i686/cmov/libcrypto.so.0.9.8)
==23024==    by 0x80485CB: main (mem.c:21)
==23024== 
==23024== LEAK SUMMARY:
==23024==    definitely lost: 92 bytes in 1 blocks.
==23024==    indirectly lost: 2,546 bytes in 125 blocks.
==23024==      possibly lost: 0 bytes in 0 blocks.
==23024==    still reachable: 280 bytes in 10 blocks.
==23024==         suppressed: 0 bytes in 0 blocks.

Reply via email to