PR: 1992
authorDr. Stephen Henson <steve@openssl.org>
Fri, 24 Jul 2009 13:47:32 +0000 (13:47 +0000)
committerDr. Stephen Henson <steve@openssl.org>
Fri, 24 Jul 2009 13:47:32 +0000 (13:47 +0000)
Submitted by: Ger Hobbelt <ger@hobbelt.com>
Approved by: steve@openssl.org

RAND_poll() and CreateToolhelp32Snapshot() stability for WIN32.

crypto/rand/rand_win.c

index 00dbe4232cc189965ad728673911bb0fef2f5689..25a76cf1ec2ebc71f882227aaea22ef795428d1a 100644 (file)
@@ -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