| @@ -205,6 +205,7 @@ void __bound_exit(void); · 204 unmodified lines |
| 205 | 205 | void *__bound_mmap (void *start, size_t size, int prot, int flags, int fd, |
| 206 | 206 | off_t offset); |
| 207 | 207 | int __bound_munmap (void *start, size_t size); |
| 208 | +DLL_EXPORT void __bound_siglongjmp(jmp_buf env, int val); |
| 208 | 209 | #endif |
| 209 | 210 | DLL_EXPORT void __bound_new_region(void *p, size_t size); |
| 210 | 211 | DLL_EXPORT void __bound_setjmp(jmp_buf env); |
| @@ -510,8 +511,6 @@ void FASTCALL __bound_local_new(void *p1) · 299 unmodified lines |
| 510 | 511 | void FASTCALL __bound_local_delete(void *p1) |
| 511 | 512 | { |
| 512 | 513 | size_t addr, fp, *p = p1; |
| 513 | | − alloca_list_type *alloca_free_list = NULL; |
| 514 | | − jmp_list_type *jmp_free_list = NULL; |
| 515 | 514 | |
| 516 | 515 | if (no_checking) |
| 517 | 516 | return; |
| @@ -524,65 +523,51 @@ void FASTCALL __bound_local_delete(void *p1) · 6 unmodified lines |
| 524 | 523 | tree = splay_delete(addr + fp, tree); |
| 525 | 524 | p += 2; |
| 526 | 525 | } |
| 527 | | − { |
| 526 | + if (alloca_list) { |
| 528 | 527 | alloca_list_type *last = NULL; |
| 529 | 528 | alloca_list_type *cur = alloca_list; |
| 530 | 529 | |
| 531 | | − while (cur) { |
| 530 | + do { |
| 532 | 531 | if (cur->fp == fp) { |
| 533 | 532 | if (last) |
| 534 | 533 | last->next = cur->next; |
| 535 | 534 | else |
| 536 | 535 | alloca_list = cur->next; |
| 537 | 536 | tree = splay_delete ((size_t) cur->p, tree); |
| 538 | | − cur->next = alloca_free_list; |
| 539 | | − alloca_free_list = cur; |
| 537 | + dprintf(stderr, "%s, %s(): remove alloca/vla %p\n", |
| 538 | + __FILE__, __FUNCTION__, cur->p); |
| 539 | + BOUND_FREE (cur); |
| 540 | 540 | cur = last ? last->next : alloca_list; |
| 541 | 541 | } |
| 542 | 542 | else { |
| 543 | 543 | last = cur; |
| 544 | 544 | cur = cur->next; |
| 545 | 545 | } |
| 546 | | − } |
| 546 | + } while (cur); |
| 547 | 547 | } |
| 548 | | − { |
| 548 | + if (jmp_list) { |
| 549 | 549 | jmp_list_type *last = NULL; |
| 550 | 550 | jmp_list_type *cur = jmp_list; |
| 551 | 551 | |
| 552 | | − while (cur) { |
| 552 | + do { |
| 553 | 553 | if (cur->fp == fp) { |
| 554 | 554 | if (last) |
| 555 | 555 | last->next = cur->next; |
| 556 | 556 | else |
| 557 | 557 | jmp_list = cur->next; |
| 558 | | − cur->next = jmp_free_list; |
| 559 | | − jmp_free_list = cur; |
| 558 | + dprintf(stderr, "%s, %s(): remove setjmp %p\n", |
| 559 | + __FILE__, __FUNCTION__, cur->penv); |
| 560 | + BOUND_FREE (cur); |
| 560 | 561 | cur = last ? last->next : jmp_list; |
| 561 | 562 | } |
| 562 | 563 | else { |
| 563 | 564 | last = cur; |
| 564 | 565 | cur = cur->next; |
| 565 | 566 | } |
| 566 | | − } |
| 567 | + } while (cur); |
| 567 | 568 | } |
| 568 | 569 | |
| 569 | 570 | POST_SEM (); |
| 570 | | − while (alloca_free_list) { |
| 571 | | − alloca_list_type *next = alloca_free_list->next; |
| 572 | | − |
| 573 | | − dprintf(stderr, "%s, %s(): remove alloca/vla %p\n", |
| 574 | | − __FILE__, __FUNCTION__, alloca_free_list->p); |
| 575 | | − BOUND_FREE (alloca_free_list); |
| 576 | | − alloca_free_list = next; |
| 577 | | − } |
| 578 | | − while (jmp_free_list) { |
| 579 | | − jmp_list_type *next = jmp_free_list->next; |
| 580 | | − |
| 581 | | − dprintf(stderr, "%s, %s(): remove setjmp %p\n", |
| 582 | | − __FILE__, __FUNCTION__, jmp_free_list->penv); |
| 583 | | − BOUND_FREE (jmp_free_list); |
| 584 | | − jmp_free_list = next; |
| 585 | | − } |
| 586 | 571 | #if BOUND_DEBUG |
| 587 | 572 | if (print_calls) { |
| 588 | 573 | p = p1; |
| @@ -647,107 +632,128 @@ void __bound_setjmp(jmp_buf env) · 58 unmodified lines |
| 647 | 632 | jmp_list_type *jl; |
| 648 | 633 | void *e = (void *) env; |
| 649 | 634 | |
| 650 | | − dprintf(stderr, "%s, %s(): %p\n", __FILE__, __FUNCTION__, e); |
| 651 | | − WAIT_SEM (); |
| 652 | | − INCR_COUNT(bound_setjmp_count); |
| 653 | | − jl = jmp_list; |
| 654 | | − while (jl) { |
| 655 | | − if (jl->penv == e) |
| 656 | | − break; |
| 657 | | − jl = jl->next; |
| 658 | | − } |
| 659 | | − if (jl == NULL) { |
| 660 | | − jl = BOUND_MALLOC (sizeof (jmp_list_type)); |
| 661 | | − if (jl) { |
| 662 | | − jl->penv = e; |
| 663 | | − jl->next = jmp_list; |
| 664 | | − jmp_list = jl; |
| 635 | + if (no_checking == 0) { |
| 636 | + dprintf(stderr, "%s, %s(): %p\n", __FILE__, __FUNCTION__, e); |
| 637 | + WAIT_SEM (); |
| 638 | + INCR_COUNT(bound_setjmp_count); |
| 639 | + jl = jmp_list; |
| 640 | + while (jl) { |
| 641 | + if (jl->penv == e) |
| 642 | + break; |
| 643 | + jl = jl->next; |
| 665 | 644 | } |
| 666 | | − } |
| 667 | | − if (jl) { |
| 668 | | − size_t fp; |
| 645 | + if (jl == NULL) { |
| 646 | + jl = BOUND_MALLOC (sizeof (jmp_list_type)); |
| 647 | + if (jl) { |
| 648 | + jl->penv = e; |
| 649 | + jl->next = jmp_list; |
| 650 | + jmp_list = jl; |
| 651 | + } |
| 652 | + } |
| 653 | + if (jl) { |
| 654 | + size_t fp; |
| 669 | 655 | |
| 670 | | − GET_CALLER_FP (fp); |
| 671 | | − jl->fp = fp; |
| 672 | | − jl->end_fp = (size_t)__builtin_frame_address(0); |
| 673 | | − jl->tid = BOUND_GET_TID; |
| 656 | + GET_CALLER_FP (fp); |
| 657 | + jl->fp = fp; |
| 658 | + jl->end_fp = (size_t)__builtin_frame_address(0); |
| 659 | + jl->tid = BOUND_GET_TID; |
| 660 | + } |
| 661 | + POST_SEM (); |
| 674 | 662 | } |
| 675 | | − POST_SEM (); |
| 676 | 663 | } |
| 677 | 664 | |
| 678 | | −void __bound_longjmp(jmp_buf env, int val) |
| 665 | +static void __bound_long_jump(jmp_buf env, int val, int sig, const char *func) |
| 679 | 666 | { |
| 680 | 667 | jmp_list_type *jl; |
| 681 | | − void *e = (void *)env; |
| 682 | | − BOUND_TID_TYPE tid = BOUND_GET_TID; |
| 683 | | − |
| 684 | | − dprintf(stderr, "%s, %s(): %p\n", __FILE__, __FUNCTION__, e); |
| 685 | | − WAIT_SEM(); |
| 686 | | − INCR_COUNT(bound_longjmp_count); |
| 687 | | − jl = jmp_list; |
| 688 | | − while (jl) { |
| 689 | | − if (jl->penv == e && jl->tid == tid) { |
| 690 | | − size_t start_fp = (size_t)__builtin_frame_address(0); |
| 691 | | − size_t end_fp = jl->end_fp; |
| 692 | | − jmp_list_type *cur = jmp_list; |
| 693 | | − jmp_list_type *last = NULL; |
| 694 | | − |
| 695 | | − while (cur->penv != e || cur->tid != tid) { |
| 696 | | − if (cur->tid == tid) { |
| 697 | | − dprintf(stderr, "%s, %s(): remove setjmp %p\n", |
| 698 | | − __FILE__, __FUNCTION__, cur->penv); |
| 699 | | − if (last) |
| 700 | | − last->next = cur->next; |
| 701 | | − else |
| 702 | | − jmp_list = cur->next; |
| 703 | | − BOUND_FREE (cur); |
| 704 | | − cur = last ? last->next : jmp_list; |
| 705 | | − } |
| 706 | | − else { |
| 707 | | − last = cur; |
| 708 | | − cur = cur->next; |
| 668 | + void *e; |
| 669 | + BOUND_TID_TYPE tid; |
| 670 | + |
| 671 | + if (no_checking == 0) { |
| 672 | + e = (void *)env; |
| 673 | + tid = BOUND_GET_TID; |
| 674 | + dprintf(stderr, "%s, %s(): %p\n", __FILE__, func, e); |
| 675 | + WAIT_SEM(); |
| 676 | + INCR_COUNT(bound_longjmp_count); |
| 677 | + jl = jmp_list; |
| 678 | + while (jl) { |
| 679 | + if (jl->penv == e && jl->tid == tid) { |
| 680 | + size_t start_fp = (size_t)__builtin_frame_address(0); |
| 681 | + size_t end_fp = jl->end_fp; |
| 682 | + jmp_list_type *cur = jmp_list; |
| 683 | + jmp_list_type *last = NULL; |
| 684 | + |
| 685 | + while (cur->penv != e || cur->tid != tid) { |
| 686 | + if (cur->tid == tid) { |
| 687 | + dprintf(stderr, "%s, %s(): remove setjmp %p\n", |
| 688 | + __FILE__, func, cur->penv); |
| 689 | + if (last) |
| 690 | + last->next = cur->next; |
| 691 | + else |
| 692 | + jmp_list = cur->next; |
| 693 | + BOUND_FREE (cur); |
| 694 | + cur = last ? last->next : jmp_list; |
| 695 | + } |
| 696 | + else { |
| 697 | + last = cur; |
| 698 | + cur = cur->next; |
| 699 | + } |
| 709 | 700 | } |
| 710 | | − } |
| 711 | | − for (;;) { |
| 712 | | − Tree *t = tree; |
| 713 | | − alloca_list_type *last; |
| 714 | | − alloca_list_type *cur; |
| 715 | | − |
| 716 | | − while (t && (t->start < start_fp || t->start > end_fp)) |
| 717 | | − if (t->start < start_fp) |
| 718 | | − t = t->right; |
| 719 | | − else |
| 720 | | − t = t->left; |
| 721 | | − if (t == NULL) |
| 722 | | − break; |
| 723 | | − last = NULL; |
| 724 | | − cur = alloca_list; |
| 725 | | − while (cur) { |
| 726 | | − if ((size_t) cur->p == t->start) { |
| 727 | | − dprintf(stderr, "%s, %s(): remove alloca/vla %p\n", |
| 728 | | − __FILE__, __FUNCTION__, cur->p); |
| 729 | | − if (last) |
| 730 | | − last->next = cur->next; |
| 731 | | − else |
| 732 | | − alloca_list = cur->next; |
| 733 | | − BOUND_FREE (cur); |
| 734 | | − break; |
| 735 | | − } |
| 736 | | − last = cur; |
| 737 | | − cur = cur->next; |
| 701 | + for (;;) { |
| 702 | + Tree *t = tree; |
| 703 | + alloca_list_type *last; |
| 704 | + alloca_list_type *cur; |
| 705 | + |
| 706 | + while (t && (t->start < start_fp || t->start > end_fp)) |
| 707 | + if (t->start < start_fp) |
| 708 | + t = t->right; |
| 709 | + else |
| 710 | + t = t->left; |
| 711 | + if (t == NULL) |
| 712 | + break; |
| 713 | + last = NULL; |
| 714 | + cur = alloca_list; |
| 715 | + while (cur) { |
| 716 | + if ((size_t) cur->p == t->start) { |
| 717 | + dprintf(stderr, "%s, %s(): remove alloca/vla %p\n", |
| 718 | + __FILE__, func, cur->p); |
| 719 | + if (last) |
| 720 | + last->next = cur->next; |
| 721 | + else |
| 722 | + alloca_list = cur->next; |
| 723 | + BOUND_FREE (cur); |
| 724 | + break; |
| 725 | + } |
| 726 | + last = cur; |
| 727 | + cur = cur->next; |
| 728 | + } |
| 729 | + dprintf(stderr, "%s, %s(): delete %p\n", |
| 730 | + __FILE__, func, (void *) t->start); |
| 731 | + tree = splay_delete(t->start, tree); |
| 738 | 732 | } |
| 739 | | − dprintf(stderr, "%s, %s(): delete %p\n", |
| 740 | | − __FILE__, __FUNCTION__, (void *) t->start); |
| 741 | | − tree = splay_delete(t->start, tree); |
| 733 | + break; |
| 742 | 734 | } |
| 743 | | − break; |
| 735 | + jl = jl->next; |
| 744 | 736 | } |
| 745 | | − jl = jl->next; |
| 737 | + POST_SEM(); |
| 746 | 738 | } |
| 747 | | − POST_SEM(); |
| 739 | +#if !defined(_WIN32) |
| 740 | + sig ? siglongjmp(env, val) : |
| 741 | +#endif |
| 748 | 742 | longjmp (env, val); |
| 749 | 743 | } |
| 750 | 744 | |
| 745 | +void __bound_longjmp(jmp_buf env, int val) |
| 746 | +{ |
| 747 | + __bound_long_jump(env,val, 0, __FUNCTION__); |
| 748 | +} |
| 749 | + |
| 750 | +#if !defined(_WIN32) |
| 751 | +void __bound_siglongjmp(jmp_buf env, int val) |
| 752 | +{ |
| 753 | + __bound_long_jump(env,val, 1, __FUNCTION__); |
| 754 | +} |
| 755 | +#endif |
| 756 | + |
| 751 | 757 | #if defined(__GNUC__) && (__GNUC__ >= 6) |
| 752 | 758 | #pragma GCC diagnostic pop |
| 753 | 759 | #endif |