@@ -110,6 +110,17 @@ SANITIZER_WEAK_ATTRIBUTE
110
110
const void *__sanitizer_get_allocated_begin (const void *p);
111
111
}
112
112
113
+ static bool GetDTLSRange (uptr &tls_beg, uptr &tls_size) {
114
+ const void *start = __sanitizer_get_allocated_begin ((void *)tls_beg);
115
+ if (!start)
116
+ return false ;
117
+ tls_beg = (uptr)start;
118
+ tls_size = __sanitizer_get_allocated_size (start);
119
+ VReport (2 , " __tls_get_addr: glibc >=2.25 suspected; tls={%p,0x%zx}\n " ,
120
+ (void *)tls_beg, tls_size);
121
+ return true ;
122
+ }
123
+
113
124
DTLS::DTV *DTLS_on_tls_get_addr (void *arg_void, void *res,
114
125
uptr static_tls_begin, uptr static_tls_end) {
115
126
if (!common_flags ()->intercept_tls_get_addr ) return 0 ;
@@ -135,13 +146,7 @@ DTLS::DTV *DTLS_on_tls_get_addr(void *arg_void, void *res,
135
146
// creation.
136
147
VReport (2 , " __tls_get_addr: static tls: %p\n " , (void *)tls_beg);
137
148
tls_size = 0 ;
138
- } else if (const void *start =
139
- __sanitizer_get_allocated_begin ((void *)tls_beg)) {
140
- tls_beg = (uptr)start;
141
- tls_size = __sanitizer_get_allocated_size (start);
142
- VReport (2 , " __tls_get_addr: glibc >=2.25 suspected; tls={%p,0x%zx}\n " ,
143
- (void *)tls_beg, tls_size);
144
- } else {
149
+ } else if (!GetDTLSRange (tls_beg, tls_size)) {
145
150
VReport (2 , " __tls_get_addr: Can't guess glibc version\n " );
146
151
// This may happen inside the DTOR of main thread, so just ignore it.
147
152
tls_size = 0 ;
0 commit comments