diff options
author | Dr. Stephen Henson <steve@openssl.org> | 2009-07-24 13:47:32 +0000 |
---|---|---|
committer | Dr. Stephen Henson <steve@openssl.org> | 2009-07-24 13:47:32 +0000 |
commit | b0080e3817f5208f950d847086f3ded9b50fdd59 (patch) | |
tree | ca88f15eb8a2ff66dcc3b561b83f0f545ffdb814 /crypto | |
parent | 4d67d79273c2114116685090af84306c1189d145 (diff) |
PR: 1992
Submitted by: Ger Hobbelt <ger@hobbelt.com>
Approved by: steve@openssl.org
RAND_poll() and CreateToolhelp32Snapshot() stability for WIN32.
Diffstat (limited to 'crypto')
-rw-r--r-- | crypto/rand/rand_win.c | 28 |
1 files changed, 26 insertions, 2 deletions
diff --git a/crypto/rand/rand_win.c b/crypto/rand/rand_win.c index 00dbe4232c..25a76cf1ec 100644 --- a/crypto/rand/rand_win.c +++ b/crypto/rand/rand_win.c @@ -494,12 +494,28 @@ int RAND_poll(void) * each entry. Consider each field a source of 1 byte * of entropy. */ + ZeroMemory(&hlist, sizeof(HEAPLIST32)); hlist.dwSize = sizeof(HEAPLIST32); if (good) stoptime = GetTickCount() + MAXDELAY; if (heaplist_first(handle, &hlist)) + { + /* + following discussion on dev ML, exception on WinCE (or other Win + platform) is theoretically of unknown origin; prevent infinite + loop here when this theoretical case occurs; otherwise cope with + the expected (MSDN documented) exception-throwing behaviour of + Heap32Next() on WinCE. + + based on patch in original message by Tanguy Fautré (2009/03/02) + Subject: RAND_poll() and CreateToolhelp32Snapshot() stability + */ + int ex_cnt_limit = 42; do { RAND_add(&hlist, hlist.dwSize, 3); + __try + { + ZeroMemory(&hentry, sizeof(HEAPENTRY32)); hentry.dwSize = sizeof(HEAPENTRY32); if (heap_first(&hentry, hlist.th32ProcessID, @@ -512,8 +528,16 @@ int RAND_poll(void) while (heap_next(&hentry) && --entrycnt > 0); } - } while (heaplist_next(handle, - &hlist) && GetTickCount() < stoptime); + } + __except (EXCEPTION_EXECUTE_HANDLER) + { + /* ignore access violations when walking the heap list */ + ex_cnt_limit--; + } + } while (heaplist_next(handle, &hlist) + && GetTickCount() < stoptime + && ex_cnt_limit > 0); + } /* process walking */ /* PROCESSENTRY32 contains 9 fields that will change |