summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/rand/rand_win.c
diff options
context:
space:
mode:
authordjm <>2010-10-01 22:59:01 +0000
committerdjm <>2010-10-01 22:59:01 +0000
commitfe047d8b632246cb2db3234a0a4f32e5c318857b (patch)
tree939b752540947d33507b3acc48d76a8bfb7c3dc3 /src/lib/libcrypto/rand/rand_win.c
parent2ea67f4aa254b09ded62e6e14fc893bbe6381579 (diff)
downloadopenbsd-fe047d8b632246cb2db3234a0a4f32e5c318857b.tar.gz
openbsd-fe047d8b632246cb2db3234a0a4f32e5c318857b.tar.bz2
openbsd-fe047d8b632246cb2db3234a0a4f32e5c318857b.zip
resolve conflicts, fix local changes
Diffstat (limited to 'src/lib/libcrypto/rand/rand_win.c')
-rw-r--r--src/lib/libcrypto/rand/rand_win.c71
1 files changed, 60 insertions, 11 deletions
diff --git a/src/lib/libcrypto/rand/rand_win.c b/src/lib/libcrypto/rand/rand_win.c
index 00dbe4232c..5d134e186b 100644
--- a/src/lib/libcrypto/rand/rand_win.c
+++ b/src/lib/libcrypto/rand/rand_win.c
@@ -463,7 +463,7 @@ int RAND_poll(void)
463 PROCESSENTRY32 p; 463 PROCESSENTRY32 p;
464 THREADENTRY32 t; 464 THREADENTRY32 t;
465 MODULEENTRY32 m; 465 MODULEENTRY32 m;
466 DWORD stoptime = 0; 466 DWORD starttime = 0;
467 467
468 snap = (CREATETOOLHELP32SNAPSHOT) 468 snap = (CREATETOOLHELP32SNAPSHOT)
469 GetProcAddress(kernel, "CreateToolhelp32Snapshot"); 469 GetProcAddress(kernel, "CreateToolhelp32Snapshot");
@@ -494,12 +494,29 @@ int RAND_poll(void)
494 * each entry. Consider each field a source of 1 byte 494 * each entry. Consider each field a source of 1 byte
495 * of entropy. 495 * of entropy.
496 */ 496 */
497 ZeroMemory(&hlist, sizeof(HEAPLIST32));
497 hlist.dwSize = sizeof(HEAPLIST32); 498 hlist.dwSize = sizeof(HEAPLIST32);
498 if (good) stoptime = GetTickCount() + MAXDELAY; 499 if (good) starttime = GetTickCount();
500#ifdef _MSC_VER
499 if (heaplist_first(handle, &hlist)) 501 if (heaplist_first(handle, &hlist))
502 {
503 /*
504 following discussion on dev ML, exception on WinCE (or other Win
505 platform) is theoretically of unknown origin; prevent infinite
506 loop here when this theoretical case occurs; otherwise cope with
507 the expected (MSDN documented) exception-throwing behaviour of
508 Heap32Next() on WinCE.
509
510 based on patch in original message by Tanguy Fautré (2009/03/02)
511 Subject: RAND_poll() and CreateToolhelp32Snapshot() stability
512 */
513 int ex_cnt_limit = 42;
500 do 514 do
501 { 515 {
502 RAND_add(&hlist, hlist.dwSize, 3); 516 RAND_add(&hlist, hlist.dwSize, 3);
517 __try
518 {
519 ZeroMemory(&hentry, sizeof(HEAPENTRY32));
503 hentry.dwSize = sizeof(HEAPENTRY32); 520 hentry.dwSize = sizeof(HEAPENTRY32);
504 if (heap_first(&hentry, 521 if (heap_first(&hentry,
505 hlist.th32ProcessID, 522 hlist.th32ProcessID,
@@ -510,10 +527,42 @@ int RAND_poll(void)
510 RAND_add(&hentry, 527 RAND_add(&hentry,
511 hentry.dwSize, 5); 528 hentry.dwSize, 5);
512 while (heap_next(&hentry) 529 while (heap_next(&hentry)
530 && (!good || (GetTickCount()-starttime)<MAXDELAY)
513 && --entrycnt > 0); 531 && --entrycnt > 0);
514 } 532 }
515 } while (heaplist_next(handle, 533 }
516 &hlist) && GetTickCount() < stoptime); 534 __except (EXCEPTION_EXECUTE_HANDLER)
535 {
536 /* ignore access violations when walking the heap list */
537 ex_cnt_limit--;
538 }
539 } while (heaplist_next(handle, &hlist)
540 && (!good || (GetTickCount()-starttime)<MAXDELAY)
541 && ex_cnt_limit > 0);
542 }
543
544#else
545 if (heaplist_first(handle, &hlist))
546 {
547 do
548 {
549 RAND_add(&hlist, hlist.dwSize, 3);
550 hentry.dwSize = sizeof(HEAPENTRY32);
551 if (heap_first(&hentry,
552 hlist.th32ProcessID,
553 hlist.th32HeapID))
554 {
555 int entrycnt = 80;
556 do
557 RAND_add(&hentry,
558 hentry.dwSize, 5);
559 while (heap_next(&hentry)
560 && --entrycnt > 0);
561 }
562 } while (heaplist_next(handle, &hlist)
563 && (!good || (GetTickCount()-starttime)<MAXDELAY));
564 }
565#endif
517 566
518 /* process walking */ 567 /* process walking */
519 /* PROCESSENTRY32 contains 9 fields that will change 568 /* PROCESSENTRY32 contains 9 fields that will change
@@ -522,11 +571,11 @@ int RAND_poll(void)
522 */ 571 */
523 p.dwSize = sizeof(PROCESSENTRY32); 572 p.dwSize = sizeof(PROCESSENTRY32);
524 573
525 if (good) stoptime = GetTickCount() + MAXDELAY; 574 if (good) starttime = GetTickCount();
526 if (process_first(handle, &p)) 575 if (process_first(handle, &p))
527 do 576 do
528 RAND_add(&p, p.dwSize, 9); 577 RAND_add(&p, p.dwSize, 9);
529 while (process_next(handle, &p) && GetTickCount() < stoptime); 578 while (process_next(handle, &p) && (!good || (GetTickCount()-starttime)<MAXDELAY));
530 579
531 /* thread walking */ 580 /* thread walking */
532 /* THREADENTRY32 contains 6 fields that will change 581 /* THREADENTRY32 contains 6 fields that will change
@@ -534,11 +583,11 @@ int RAND_poll(void)
534 * 1 byte of entropy. 583 * 1 byte of entropy.
535 */ 584 */
536 t.dwSize = sizeof(THREADENTRY32); 585 t.dwSize = sizeof(THREADENTRY32);
537 if (good) stoptime = GetTickCount() + MAXDELAY; 586 if (good) starttime = GetTickCount();
538 if (thread_first(handle, &t)) 587 if (thread_first(handle, &t))
539 do 588 do
540 RAND_add(&t, t.dwSize, 6); 589 RAND_add(&t, t.dwSize, 6);
541 while (thread_next(handle, &t) && GetTickCount() < stoptime); 590 while (thread_next(handle, &t) && (!good || (GetTickCount()-starttime)<MAXDELAY));
542 591
543 /* module walking */ 592 /* module walking */
544 /* MODULEENTRY32 contains 9 fields that will change 593 /* MODULEENTRY32 contains 9 fields that will change
@@ -546,12 +595,12 @@ int RAND_poll(void)
546 * 1 byte of entropy. 595 * 1 byte of entropy.
547 */ 596 */
548 m.dwSize = sizeof(MODULEENTRY32); 597 m.dwSize = sizeof(MODULEENTRY32);
549 if (good) stoptime = GetTickCount() + MAXDELAY; 598 if (good) starttime = GetTickCount();
550 if (module_first(handle, &m)) 599 if (module_first(handle, &m))
551 do 600 do
552 RAND_add(&m, m.dwSize, 9); 601 RAND_add(&m, m.dwSize, 9);
553 while (module_next(handle, &m) 602 while (module_next(handle, &m)
554 && (GetTickCount() < stoptime)); 603 && (!good || (GetTickCount()-starttime)<MAXDELAY));
555 if (close_snap) 604 if (close_snap)
556 close_snap(handle); 605 close_snap(handle);
557 else 606 else
@@ -701,7 +750,7 @@ static void readscreen(void)
701 int y; /* y-coordinate of screen lines to grab */ 750 int y; /* y-coordinate of screen lines to grab */
702 int n = 16; /* number of screen lines to grab at a time */ 751 int n = 16; /* number of screen lines to grab at a time */
703 752
704 if (GetVersion() >= 0x80000000 || !OPENSSL_isservice()) 753 if (GetVersion() < 0x80000000 && OPENSSL_isservice()>0)
705 return; 754 return;
706 755
707 /* Create a screen DC and a memory DC compatible to screen DC */ 756 /* Create a screen DC and a memory DC compatible to screen DC */