--- openssl-1.0.1m.ori/crypto/rand/md_rand.c 2015-03-19 14:19:00.000000000 +0100 +++ openssl-1.0.1m/crypto/rand/md_rand.c 2015-04-07 13:32:02.714467792 +0200 @@ -266,7 +266,11 @@ j = (num - i); j = (j > MD_DIGEST_LENGTH) ? MD_DIGEST_LENGTH : j; - MD_Init(&m); + if (!MD_Init(&m)) { + EVP_MD_CTX_cleanup(&m); + if (!do_not_lock) CRYPTO_w_unlock(CRYPTO_LOCK_RAND); + return; + } MD_Update(&m, local_md, MD_DIGEST_LENGTH); k = (st_idx + j) - STATE_SIZE; if (k > 0) { @@ -469,7 +473,11 @@ /* num_ceil -= MD_DIGEST_LENGTH/2 */ j = (num >= MD_DIGEST_LENGTH / 2) ? MD_DIGEST_LENGTH / 2 : num; num -= j; - MD_Init(&m); + if (!MD_Init(&m)) { + EVP_MD_CTX_cleanup(&m); + return 0; + } + #ifndef GETPID_IS_MEANINGLESS if (curr_pid) { /* just in the first iteration to save time */ MD_Update(&m, (unsigned char *)&curr_pid, sizeof curr_pid); @@ -508,7 +516,10 @@ } } - MD_Init(&m); + if (!MD_Init(&m)) { + EVP_MD_CTX_cleanup(&m); + return 0; + } MD_Update(&m, (unsigned char *)&(md_c[0]), sizeof(md_c)); MD_Update(&m, local_md, MD_DIGEST_LENGTH); if (lock)