lsan: Support free_sized and free_aligned_sized from C23 (#144415)

Adds support to LSan for `free_sized` and `free_aligned_sized` from C23.

Other sanitizers will be handled with their own separate PRs.

For #144435

Signed-off-by: Justin King <jcking@google.com>
This commit is contained in:
Justin King
2025-06-16 14:29:08 -07:00
committed by GitHub
parent 38daa6d4ef
commit 95418bc8a8
5 changed files with 52 additions and 10 deletions

View File

@@ -220,6 +220,10 @@ void lsan_free(void *p) {
Deallocate(p);
}
void lsan_free_sized(void *p, uptr) { Deallocate(p); }
void lsan_free_aligned_sized(void *p, uptr, uptr) { Deallocate(p); }
void *lsan_realloc(void *p, uptr size, const StackTrace &stack) {
return SetErrnoOnNull(Reallocate(stack, p, size, 1));
}

View File

@@ -127,6 +127,8 @@ void *lsan_aligned_alloc(uptr alignment, uptr size, const StackTrace &stack);
void *lsan_memalign(uptr alignment, uptr size, const StackTrace &stack);
void *lsan_malloc(uptr size, const StackTrace &stack);
void lsan_free(void *p);
void lsan_free_sized(void *p, uptr size);
void lsan_free_aligned_sized(void *p, uptr alignment, uptr size);
void *lsan_realloc(void *p, uptr size, const StackTrace &stack);
void *lsan_reallocarray(void *p, uptr nmemb, uptr size,
const StackTrace &stack);

View File

@@ -84,6 +84,24 @@ INTERCEPTOR(void, free, void *p) {
lsan_free(p);
}
INTERCEPTOR(void, free_sized, void *p, uptr size) {
if (UNLIKELY(!p))
return;
if (DlsymAlloc::PointerIsMine(p))
return DlsymAlloc::Free(p);
ENSURE_LSAN_INITED;
lsan_free_sized(p, size);
}
INTERCEPTOR(void, free_aligned_sized, void *p, uptr alignment, uptr size) {
if (UNLIKELY(!p))
return;
if (DlsymAlloc::PointerIsMine(p))
return DlsymAlloc::Free(p);
ENSURE_LSAN_INITED;
lsan_free_aligned_sized(p, alignment, size);
}
INTERCEPTOR(void*, calloc, uptr nmemb, uptr size) {
if (DlsymAlloc::Use())
return DlsymAlloc::Callocate(nmemb, size);

View File

@@ -44,16 +44,19 @@ using namespace __lsan;
void *p = lsan_valloc(size, stack)
#define COMMON_MALLOC_FREE(ptr) \
lsan_free(ptr)
#define COMMON_MALLOC_SIZE(ptr) \
uptr size = lsan_mz_size(ptr)
#define COMMON_MALLOC_FILL_STATS(zone, stats)
#define COMMON_MALLOC_REPORT_UNKNOWN_REALLOC(ptr, zone_ptr, zone_name) \
(void)zone_name; \
Report("mz_realloc(%p) -- attempting to realloc unallocated memory.\n", ptr);
#define COMMON_MALLOC_NAMESPACE __lsan
#define COMMON_MALLOC_HAS_ZONE_ENUMERATOR 0
#define COMMON_MALLOC_HAS_EXTRA_INTROSPECTION_INIT 0
# define COMMON_MALLOC_FREE_SIZED(ptr, size) lsan_free_sized(ptr, size)
# define COMMON_MALLOC_FREE_ALIGNED_SIZED(ptr, alignment, size) \
lsan_free_aligned_sized(ptr, alignment, size)
# define COMMON_MALLOC_SIZE(ptr) uptr size = lsan_mz_size(ptr)
# define COMMON_MALLOC_FILL_STATS(zone, stats)
# define COMMON_MALLOC_REPORT_UNKNOWN_REALLOC(ptr, zone_ptr, zone_name) \
(void)zone_name; \
Report("mz_realloc(%p) -- attempting to realloc unallocated memory.\n", \
ptr);
# define COMMON_MALLOC_NAMESPACE __lsan
# define COMMON_MALLOC_HAS_ZONE_ENUMERATOR 0
# define COMMON_MALLOC_HAS_EXTRA_INTROSPECTION_INIT 0
#include "sanitizer_common/sanitizer_malloc_mac.inc"
# include "sanitizer_common/sanitizer_malloc_mac.inc"
#endif // SANITIZER_APPLE

View File

@@ -144,6 +144,21 @@ INTERCEPTOR(void, free, void *ptr) {
COMMON_MALLOC_FREE(ptr);
}
#ifdef COMMON_MALLOC_FREE_SIZED
INTERCEPTOR(void, free_sized, void *ptr, size_t size) {
COMMON_MALLOC_ENTER();
COMMON_MALLOC_FREE_SIZED(ptr, size);
}
#endif
#ifdef COMMON_MALLOC_FREE_ALIGNED_SIZED
INTERCEPTOR(void, free_aligned_sized, void *ptr, size_t alignment,
size_t size) {
COMMON_MALLOC_ENTER();
COMMON_MALLOC_FREE_ALIGNED_SIZED(ptr, alignment, size);
}
#endif
INTERCEPTOR(void *, realloc, void *ptr, size_t size) {
COMMON_MALLOC_ENTER();
COMMON_MALLOC_REALLOC(ptr, size);