@@ -1011,38 +1011,41 @@ void __lsan_ignore_object(const void *p) {
1011
1011
SANITIZER_INTERFACE_ATTRIBUTE
1012
1012
void __lsan_register_root_region (const void *begin, uptr size) {
1013
1013
#if CAN_SANITIZE_LEAKS
1014
- Lock l (&global_mutex);
1015
- Region region = {reinterpret_cast <uptr>(begin),
1016
- reinterpret_cast <uptr>(begin) + size};
1017
- root_regions.push_back (region);
1018
1014
VReport (1 , " Registered root region at %p of size %zu\n " , begin, size);
1015
+ uptr b = reinterpret_cast <uptr>(begin);
1016
+ uptr e = b + size;
1017
+ CHECK_LT (b, e);
1018
+
1019
+ Lock l (&global_mutex);
1020
+ root_regions.push_back ({b, e});
1019
1021
#endif // CAN_SANITIZE_LEAKS
1020
1022
}
1021
1023
1022
1024
SANITIZER_INTERFACE_ATTRIBUTE
1023
1025
void __lsan_unregister_root_region (const void *begin, uptr size) {
1024
1026
#if CAN_SANITIZE_LEAKS
1025
- Lock l (&global_mutex);
1026
- bool removed = false ;
1027
- uptr end = reinterpret_cast <uptr>(begin) + size;
1028
- for (uptr i = 0 ; i < root_regions.size (); i++) {
1029
- Region region = root_regions[i];
1030
- if (region.begin == reinterpret_cast <uptr>(begin) && region.end == end) {
1031
- removed = true ;
1032
- uptr last_index = root_regions.size () - 1 ;
1033
- root_regions[i] = root_regions[last_index];
1034
- root_regions.pop_back ();
1035
- VReport (1 , " Unregistered root region at %p of size %zu\n " , begin, size);
1036
- break ;
1027
+ uptr b = reinterpret_cast <uptr>(begin);
1028
+ uptr e = b + size;
1029
+ CHECK_LT (b, e);
1030
+
1031
+ {
1032
+ Lock l (&global_mutex);
1033
+ for (uptr i = 0 ; i < root_regions.size (); i++) {
1034
+ Region region = root_regions[i];
1035
+ if (region.begin == b && region.end == e) {
1036
+ uptr last_index = root_regions.size () - 1 ;
1037
+ root_regions[i] = root_regions[last_index];
1038
+ root_regions.pop_back ();
1039
+ VReport (1 , " Unregistered root region at %p of size %zu\n " , begin, size);
1040
+ return ;
1041
+ }
1037
1042
}
1038
1043
}
1039
- if (!removed) {
1040
- Report (
1041
- " __lsan_unregister_root_region(): region at %p of size %zu has not "
1042
- " been registered.\n " ,
1043
- begin, size);
1044
- Die ();
1045
- }
1044
+ Report (
1045
+ " __lsan_unregister_root_region(): region at %p of size %zu has not "
1046
+ " been registered.\n " ,
1047
+ begin, size);
1048
+ Die ();
1046
1049
#endif // CAN_SANITIZE_LEAKS
1047
1050
}
1048
1051
0 commit comments