aboutsummaryrefslogtreecommitdiffstats
path: root/crypto/rand/rand_win.c
diff options
context:
space:
mode:
authorDr. Stephen Henson <steve@openssl.org>2009-07-24 13:48:07 +0000
committerDr. Stephen Henson <steve@openssl.org>2009-07-24 13:48:07 +0000
commit75a86fa02401a57b9ace175eca17587d017363e0 (patch)
tree4c8b90023b6fc0c5b32196abb30157c62a5555a3 /crypto/rand/rand_win.c
parent6b3bf0edf3b22e0f8f4de2f831cc4ed89b503e7c (diff)
downloadopenssl-75a86fa02401a57b9ace175eca17587d017363e0.tar.gz
Update from 0.9.8-stable.
Diffstat (limited to 'crypto/rand/rand_win.c')
-rw-r--r--crypto/rand/rand_win.c28
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