提交 62ac2938 编写于 作者: B Bodo Möller

Always hash the pid in the first iteration in ssleay_rand_bytes,

don't try to detect fork()s by looking at getpid().
The reason is that threads sharing the same memory can have different
PIDs; it's inefficient to run RAND_seed each time a different thread
calls RAND_bytes.
上级 c1e744b9
......@@ -5,7 +5,7 @@
Changes between 0.9.4 and 0.9.5 [xx XXX 1999]
*) Make crypto/rand/md_rand.c more robust:
- Detect fork() and assure unique random states.
- Assure unique random numbers after fork().
- Make sure that concurrent threads access the global counter and
md serializably so that we never lose entropy in them
or use exactly the same state in multiple threads.
......
......@@ -287,8 +287,7 @@ static void ssleay_rand_bytes(unsigned char *buf, int num)
static int init=1;
unsigned long l;
#ifndef MSDOS
static pid_t prev_pid = 0;
pid_t curr_pid;
pid_t curr_pid = getpid();
#endif
#ifdef DEVRANDOM
FILE *fh;
......@@ -329,8 +328,7 @@ static void ssleay_rand_bytes(unsigned char *buf, int num)
* just this */
RAND_seed(&m,sizeof(m));
#ifndef MSDOS
prev_pid = getpid();
l=prev_pid;
l=curr_pid;
RAND_seed(&l,sizeof(l));
l=getuid();
RAND_seed(&l,sizeof(l));
......@@ -367,20 +365,6 @@ static void ssleay_rand_bytes(unsigned char *buf, int num)
init=0;
}
#ifndef MSDOS
/* make sure we have unique states when a program forks
* (new with OpenSSL 0.9.5; for earlier versions, applications
* must take care of this) */
curr_pid = getpid();
if (prev_pid != curr_pid)
{
prev_pid = curr_pid;
CRYPTO_w_unlock(CRYPTO_LOCK_RAND);
RAND_seed(&curr_pid, sizeof curr_pid);
CRYPTO_w_lock(CRYPTO_LOCK_RAND);
}
#endif
st_idx=state_index;
st_num=state_num;
md_c[0] = md_count[0];
......@@ -402,6 +386,13 @@ static void ssleay_rand_bytes(unsigned char *buf, int num)
j=(num >= MD_DIGEST_LENGTH/2)?MD_DIGEST_LENGTH/2:num;
num-=j;
MD_Init(&m);
#ifndef MSDOS
if (curr_pid) /* just in the first iteration to save time */
{
MD_Update(&m,(unsigned char*)&curr_pid,sizeof curr_pid);
curr_pid = 0;
}
#endif
MD_Update(&m,&(local_md[MD_DIGEST_LENGTH/2]),MD_DIGEST_LENGTH/2);
MD_Update(&m,(unsigned char *)&(md_c[0]),sizeof(md_c));
#ifndef PURIFY
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册