diff options
author | Wilco Dijkstra <wilco.dijkstra@arm.com> | 2025-03-31 11:28:14 +0000 |
---|---|---|
committer | Wilco Dijkstra <wilco.dijkstra@arm.com> | 2025-04-15 11:14:47 +0000 |
commit | 0296654d61ffa095fc7729f1efafa7d0e4fa4f7a (patch) | |
tree | d3fe7cabdbefa6edfbc1b5755d0128cdd05c9ce4 | |
parent | 69da24fbc5861fbf30c29c89154020a5c40342ca (diff) | |
download | glibc-0296654d61ffa095fc7729f1efafa7d0e4fa4f7a.zip glibc-0296654d61ffa095fc7729f1efafa7d0e4fa4f7a.tar.gz glibc-0296654d61ffa095fc7729f1efafa7d0e4fa4f7a.tar.bz2 |
malloc: Inline _int_free_check
Inline _int_free_check since it is only used by __libc_free.
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
-rw-r--r-- | malloc/malloc.c | 31 |
1 files changed, 12 insertions, 19 deletions
diff --git a/malloc/malloc.c b/malloc/malloc.c index 49ff197..e827875 100644 --- a/malloc/malloc.c +++ b/malloc/malloc.c @@ -1086,7 +1086,6 @@ typedef struct malloc_chunk* mchunkptr; /* Internal routines. */ static void* _int_malloc(mstate, size_t); -static void _int_free_check (mstate, mchunkptr, INTERNAL_SIZE_T); static void _int_free_chunk (mstate, mchunkptr, INTERNAL_SIZE_T, int); static void _int_free_merge_chunk (mstate, mchunkptr, INTERNAL_SIZE_T); static INTERNAL_SIZE_T _int_free_create_chunk (mstate, @@ -3469,7 +3468,18 @@ __libc_free (void *mem) INTERNAL_SIZE_T size = chunksize (p); - _int_free_check (arena_for_chunk (p), p, size); + /* Little security check which won't hurt performance: the + allocator never wraps around at the end of the address space. + Therefore we can exclude some size values which might appear + here by accident or by "design" from some intruder. */ + if (__glibc_unlikely ((uintptr_t) p > (uintptr_t) -size + || misaligned_chunk (p))) + malloc_printerr ("free(): invalid pointer"); + /* We know that each chunk is at least MINSIZE bytes. */ + if (__glibc_unlikely (size < MINSIZE)) + malloc_printerr ("free(): invalid size"); + + check_inuse_chunk (arena_for_chunk (p), p); #if USE_TCACHE if (tcache_free (p, size)) @@ -4553,23 +4563,6 @@ _int_malloc (mstate av, size_t bytes) ------------------------------ free ------------------------------ */ -static __always_inline void -_int_free_check (mstate av, mchunkptr p, INTERNAL_SIZE_T size) -{ - /* Little security check which won't hurt performance: the - allocator never wraps around at the end of the address space. - Therefore we can exclude some size values which might appear - here by accident or by "design" from some intruder. */ - if (__builtin_expect ((uintptr_t) p > (uintptr_t) -size, 0) - || __builtin_expect (misaligned_chunk (p), 0)) - malloc_printerr ("free(): invalid pointer"); - /* We know that each chunk is at least MINSIZE bytes. */ - if (__glibc_unlikely (size < MINSIZE)) - malloc_printerr ("free(): invalid size"); - - check_inuse_chunk (av, p); -} - /* Free chunk P of SIZE bytes to the arena. HAVE_LOCK indicates where the arena for P has already been locked. Caller must ensure chunk and size are valid. */ |