diff options
author | Dr. Stephen Henson <steve@openssl.org> | 2009-07-24 13:47:52 +0000 |
---|---|---|
committer | Dr. Stephen Henson <steve@openssl.org> | 2009-07-24 13:47:52 +0000 |
commit | 2475a5206168fd0614a361465b1d3fd0cce34c28 (patch) | |
tree | b4e578930e093e2b9b8f9b6e69a00294f082a849 /crypto | |
parent | 001dfac0615fd82a0ca6024ebd90089001ea58f5 (diff) |
Update from 0.9.8-stable.
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 |