Skip to content

Commit 8ce66a1

Browse files
committed
[NFC][lsan] Add CHECKs for root regions
1 parent e4b02c6 commit 8ce66a1

File tree

1 file changed

+26
-23
lines changed

1 file changed

+26
-23
lines changed

compiler-rt/lib/lsan/lsan_common.cpp

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1011,38 +1011,41 @@ void __lsan_ignore_object(const void *p) {
10111011
SANITIZER_INTERFACE_ATTRIBUTE
10121012
void __lsan_register_root_region(const void *begin, uptr size) {
10131013
#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);
10181014
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});
10191021
#endif // CAN_SANITIZE_LEAKS
10201022
}
10211023

10221024
SANITIZER_INTERFACE_ATTRIBUTE
10231025
void __lsan_unregister_root_region(const void *begin, uptr size) {
10241026
#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+
}
10371042
}
10381043
}
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();
10461049
#endif // CAN_SANITIZE_LEAKS
10471050
}
10481051

0 commit comments

Comments
 (0)