I have absolutely no experience with ssl whatsoever, but...
> Here is the function:
> u_char *get_digest(u_char *data, int length, int *outlen)
> {
> EVP_MD_CTX mdctx;
> const EVP_MD *md = EVP_sha1();
> int digest_size = EVP_MD_size(md);
> u_char *digest;
>
> EVP_MD_CTX_init(&mdctx);
> EVP_DigestInit_ex(&mdctx, md, NULL); /* Segfault happens here */
> EVP_DigestUpdate(&mdctx, data, length);
>
> digest = malloc(digest_size);
> EVP_DigestFinal_ex(&mdctx, digest, outlen);
> EVP_MD_CTX_cleanup(&mdctx);
> return digest;
> }
I coulnd't see where the segmentation fault occured by reading the trace. Are you 100%
sure it's not happening later on? Have you tried putting some printf()s in there?
Anyway, I think it would be a good idea to add some error checking.
/* get_digest() return NULL upon failure */
u_char *get_digest(u_char *data, int length, int *outlen)
{
EVP_MD_CTX mdctx;
const EVP_MD *md = EVP_sha1();
int digest_size = EVP_MD_size(md);
u_char *digest=NULL;
EVP_MD_CTX_init(&mdctx);
if( EVP_DigestInit_ex(&mdctx, md, NULL) ) { /* Segfault happens here */
if( EVP_DigestUpdate(&mdctx, data, length) ) {
digest = malloc(digest_size);
if( digest ) {
if( !EVP_DigestFinal_ex(&mdctx, digest, outlen) ) {
/* failure */
free( digest );
digest=NULL;
}
} else {
/* failure */
}
} else {
/* failure */
}
EVP_MD_CTX_cleanup(&mdctx); /* I dont know what this does,
should maybe be moved up? */
} else {
/* failure */
}
return digest;
}
Kind regards,
Ted Lyngmo
______________________________________________________________________
OpenSSL Project http://www.openssl.org
User Support Mailing List [EMAIL PROTECTED]
Automated List Manager [EMAIL PROTECTED]