@@ -64,6 +64,23 @@ bool IsInInterceptorScope() {
64
64
return in_interceptor_scope;
65
65
}
66
66
67
+ static uptr allocated_for_dlsym;
68
+ static const uptr kDlsymAllocPoolSize = 1024 ;
69
+ static uptr alloc_memory_for_dlsym[kDlsymAllocPoolSize ];
70
+
71
+ static bool IsInDlsymAllocPool (const void *ptr) {
72
+ uptr off = (uptr)ptr - (uptr)alloc_memory_for_dlsym;
73
+ return off < sizeof (alloc_memory_for_dlsym);
74
+ }
75
+
76
+ static void *AllocateFromLocalPool (uptr size_in_bytes) {
77
+ uptr size_in_words = RoundUpTo (size_in_bytes, kWordSize ) / kWordSize ;
78
+ void *mem = (void *)&alloc_memory_for_dlsym[allocated_for_dlsym];
79
+ allocated_for_dlsym += size_in_words;
80
+ CHECK_LT (allocated_for_dlsym, kDlsymAllocPoolSize );
81
+ return mem;
82
+ }
83
+
67
84
#define ENSURE_MSAN_INITED () do { \
68
85
CHECK (!msan_init_is_running); \
69
86
if (!msan_inited) { \
@@ -227,14 +244,14 @@ INTERCEPTOR(void *, pvalloc, SIZE_T size) {
227
244
228
245
INTERCEPTOR (void , free, void *ptr) {
229
246
GET_MALLOC_STACK_TRACE;
230
- if (!ptr) return ;
247
+ if (!ptr || UNLIKELY ( IsInDlsymAllocPool (ptr)) ) return ;
231
248
MsanDeallocate (&stack, ptr);
232
249
}
233
250
234
251
#if !SANITIZER_FREEBSD
235
252
INTERCEPTOR (void , cfree, void *ptr) {
236
253
GET_MALLOC_STACK_TRACE;
237
- if (!ptr) return ;
254
+ if (!ptr || UNLIKELY ( IsInDlsymAllocPool (ptr)) ) return ;
238
255
MsanDeallocate (&stack, ptr);
239
256
}
240
257
#define MSAN_MAYBE_INTERCEPT_CFREE INTERCEPT_FUNCTION (cfree)
@@ -907,27 +924,29 @@ INTERCEPTOR(int, epoll_pwait, int epfd, void *events, int maxevents,
907
924
908
925
INTERCEPTOR (void *, calloc, SIZE_T nmemb, SIZE_T size) {
909
926
GET_MALLOC_STACK_TRACE;
910
- if (UNLIKELY (!msan_inited)) {
927
+ if (UNLIKELY (!msan_inited))
911
928
// Hack: dlsym calls calloc before REAL(calloc) is retrieved from dlsym.
912
- const SIZE_T kCallocPoolSize = 1024 ;
913
- static uptr calloc_memory_for_dlsym[kCallocPoolSize ];
914
- static SIZE_T allocated;
915
- SIZE_T size_in_words = ((nmemb * size) + kWordSize - 1 ) / kWordSize ;
916
- void *mem = (void *)&calloc_memory_for_dlsym[allocated];
917
- allocated += size_in_words;
918
- CHECK (allocated < kCallocPoolSize );
919
- return mem;
920
- }
929
+ return AllocateFromLocalPool (nmemb * size);
921
930
return MsanCalloc (&stack, nmemb, size);
922
931
}
923
932
924
933
INTERCEPTOR (void *, realloc, void *ptr, SIZE_T size) {
925
934
GET_MALLOC_STACK_TRACE;
935
+ if (UNLIKELY (IsInDlsymAllocPool (ptr))) {
936
+ uptr offset = (uptr)ptr - (uptr)alloc_memory_for_dlsym;
937
+ uptr copy_size = Min (size, kDlsymAllocPoolSize - offset);
938
+ void *new_ptr = AllocateFromLocalPool (size);
939
+ internal_memcpy (new_ptr, ptr, copy_size);
940
+ return new_ptr;
941
+ }
926
942
return MsanReallocate (&stack, ptr, size, sizeof (u64), false );
927
943
}
928
944
929
945
INTERCEPTOR (void *, malloc, SIZE_T size) {
930
946
GET_MALLOC_STACK_TRACE;
947
+ if (UNLIKELY (!msan_inited))
948
+ // Hack: dlsym calls malloc before REAL(malloc) is retrieved from dlsym.
949
+ return AllocateFromLocalPool (size);
931
950
return MsanReallocate (&stack, nullptr , size, sizeof (u64), false );
932
951
}
933
952
0 commit comments