hi all,
i'm refering to this post i think it's better to write here there might be a memory leak in ./crypto/pkcs7/pk7_smime.c at the beginning i thought i was a fool, but i've seen that the same error was elsewhere in the code (thanks to Changes between 0.9.6h and 0.9.7). Geoff says : ******************** *) Fix a memory leak in 'sk_dup()' in the case reallocation fails. (Also tidy up some unnecessarily weird code in 'sk_new()'). [Geoff, reported by Diego Tartara <[EMAIL PROTECTED]>] ******************** the code in openssl 0.9.6g is : ******************** STACK *sk_dup(STACK *sk) { STACK *ret; char **s; if ((ret=sk_new(sk->comp)) == NULL) goto err; s=(char **)OPENSSL_realloc((char *)ret->data, (unsigned int)sizeof(char *)*sk->num_alloc); if (s == NULL) goto err; ret->data=s; ret->num=sk->num; memcpy(ret->data,sk->data,sizeof(char *)*sk->num); ret->sorted=sk->sorted; ret->num_alloc=sk->num_alloc; ret->comp=sk->comp; return(ret); err: return(NULL); } ******************** the new one is ******************** STACK *sk_dup(STACK *sk) { STACK *ret; char **s; if ((ret=sk_new(sk->comp)) == NULL) goto err; s=(char **)OPENSSL_realloc((char *)ret->data, (unsigned int)sizeof(char *)*sk->num_alloc); if (s == NULL) goto err; ret->data=s; ret->num=sk->num; memcpy(ret->data,sk->data,sizeof(char *)*sk->num); ret->sorted=sk->sorted; ret->num_alloc=sk->num_alloc; ret->comp=sk->comp; return(ret); err: if(ret) sk_free(ret); return(NULL); } ******************** i think the same thing occurs in PKCS7_decrypt, the code is : ******************** int PKCS7_decrypt(PKCS7 *p7, EVP_PKEY *pkey, X509 *cert, BIO *data, int flags) { BIO *tmpmem; int ret, i; char buf[4096]; if(!p7) { PKCS7err(PKCS7_F_PKCS7_DECRYPT,PKCS7_R_INVALID_NULL_POINTER); return 0; } if(!PKCS7_type_is_enveloped(p7)) { PKCS7err(PKCS7_F_PKCS7_DECRYPT,PKCS7_R_WRONG_CONTENT_TYPE); return 0; } if(!X509_check_private_key(cert, pkey)) { PKCS7err(PKCS7_F_PKCS7_DECRYPT, PKCS7_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE); return 0; } if(!(tmpmem = PKCS7_dataDecode(p7, pkey, NULL, cert))) { PKCS7err(PKCS7_F_PKCS7_DECRYPT, PKCS7_R_DECRYPT_ERROR); return 0; } if (flags & PKCS7_TEXT) { BIO *tmpbuf, *bread; /* Encrypt BIOs can't do BIO_gets() so add a buffer BIO */ if(!(tmpbuf = BIO_new(BIO_f_buffer()))) { PKCS7err(PKCS7_F_PKCS7_DECRYPT, ERR_R_MALLOC_FAILURE); return 0; } if(!(bread = BIO_push(tmpbuf, tmpmem))) { PKCS7err(PKCS7_F_PKCS7_DECRYPT, ERR_R_MALLOC_FAILURE); return 0; } ret = SMIME_text(bread, data); BIO_free_all(bread); return ret; } else { for(;;) { i = BIO_read(tmpmem, buf, sizeof(buf)); if(i <= 0) break; BIO_write(data, buf, i); } BIO_free_all(tmpmem); return 1; } } ******************** to the best of my knowledge "tmpmem" (and maybe "tmpbuf") can still be allocated when the function ends) please tell me what you think bye ______________________________________________________________________ OpenSSL Project http://www.openssl.org Development Mailing List [EMAIL PROTECTED] Automated List Manager [EMAIL PROTECTED]