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]

Reply via email to