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]