Skip to content

Commit 3a7861e

Browse files
authored
[NFC][asan] Track current dynamic init module (#101597)
This patch allows sequences like: `__asan_before_dynamic_init` `__asan_before_dynamic_init` ... `__asan_before_dynamic_init` to do minimal incrementa poisoning. It's NFC as now callbacks invokes in pairs: `__asan_before_dynamic_init` `__asan_after_dynamic_init` `__asan_before_dynamic_init` `__asan_after_dynamic_init` and `__asan_after_dynamic_init` unpoisons everything anyway. For #101837
1 parent 8252d4d commit 3a7861e

File tree

1 file changed

+28
-9
lines changed

1 file changed

+28
-9
lines changed

compiler-rt/lib/asan/asan_globals.cpp

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,9 @@ static ListOfGlobals &GlobalsByIndicator(uptr odr_indicator)
7070
return (*globals_by_indicator)[odr_indicator];
7171
}
7272

73+
static const char *current_dynamic_init_module_name
74+
SANITIZER_GUARDED_BY(mu_for_globals) = nullptr;
75+
7376
using DynInitGlobalsByModule =
7477
DenseMap<const char *, IntrusiveList<DynInitGlobal>>;
7578

@@ -492,18 +495,29 @@ void __asan_before_dynamic_init(const char *module_name) {
492495
CHECK(module_name);
493496
CHECK(AsanInited());
494497
Lock lock(&mu_for_globals);
498+
if (current_dynamic_init_module_name == module_name)
499+
return;
495500
if (flags()->report_globals >= 3)
496501
Printf("DynInitPoison module: %s\n", module_name);
497502

498-
DynInitGlobals().forEach([&](auto &kv) {
499-
if (kv.first != module_name) {
500-
PoisonDynamicGlobals(kv.second);
501-
} else {
502-
UnpoisonDynamicGlobals(kv.second,
503-
/*mark_initialized=*/!strict_init_order);
504-
}
505-
return true;
506-
});
503+
if (current_dynamic_init_module_name == nullptr) {
504+
// First call, poison all globals from other modules.
505+
DynInitGlobals().forEach([&](auto &kv) {
506+
if (kv.first != module_name) {
507+
PoisonDynamicGlobals(kv.second);
508+
} else {
509+
UnpoisonDynamicGlobals(kv.second,
510+
/*mark_initialized=*/!strict_init_order);
511+
}
512+
return true;
513+
});
514+
} else {
515+
// Module changed.
516+
PoisonDynamicGlobals(DynInitGlobals()[current_dynamic_init_module_name]);
517+
UnpoisonDynamicGlobals(DynInitGlobals()[module_name],
518+
/*mark_initialized=*/!strict_init_order);
519+
}
520+
current_dynamic_init_module_name = module_name;
507521
}
508522

509523
// This method runs immediately after dynamic initialization in each TU, when
@@ -514,11 +528,16 @@ void __asan_after_dynamic_init() {
514528
return;
515529
CHECK(AsanInited());
516530
Lock lock(&mu_for_globals);
531+
if (!current_dynamic_init_module_name)
532+
return;
533+
517534
if (flags()->report_globals >= 3)
518535
Printf("DynInitUnpoison\n");
519536

520537
DynInitGlobals().forEach([&](auto &kv) {
521538
UnpoisonDynamicGlobals(kv.second, /*mark_initialized=*/false);
522539
return true;
523540
});
541+
542+
current_dynamic_init_module_name = nullptr;
524543
}

0 commit comments

Comments
 (0)