git: feaae6ba1ace - main - rtld: switch from malloc_aligned() to __crt_aligned_alloc()
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Mon, 21 Aug 2023 14:17:18 UTC
The branch main has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=feaae6ba1ace0091384ac371423976cd15e59e5a commit feaae6ba1ace0091384ac371423976cd15e59e5a Author: Konstantin Belousov <kib@FreeBSD.org> AuthorDate: 2023-07-30 01:51:52 +0000 Commit: Konstantin Belousov <kib@FreeBSD.org> CommitDate: 2023-08-21 14:16:42 +0000 rtld: switch from malloc_aligned() to __crt_aligned_alloc() Use regular free(), since it works now. Reviewed by: markj Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D41150 --- libexec/rtld-elf/rtld.c | 14 +++++++------- libexec/rtld-elf/rtld.h | 3 +-- libexec/rtld-elf/xmalloc.c | 30 +++++++----------------------- 3 files changed, 15 insertions(+), 32 deletions(-) diff --git a/libexec/rtld-elf/rtld.c b/libexec/rtld-elf/rtld.c index feef5dd0bb5d..aa7e6020a085 100644 --- a/libexec/rtld-elf/rtld.c +++ b/libexec/rtld-elf/rtld.c @@ -5254,13 +5254,13 @@ allocate_tls(Obj_Entry *objs, void *oldtcb, size_t tcbsize, size_t tcbalign) tls_block_size += pre_size + tls_static_space - TLS_TCB_SIZE - post_size; /* Allocate whole TLS block */ - tls_block = malloc_aligned(tls_block_size, maxalign, 0); + tls_block = xmalloc_aligned(tls_block_size, maxalign, 0); tcb = (Elf_Addr **)(tls_block + pre_size + extra_size); if (oldtcb != NULL) { memcpy(tls_block, get_tls_block_ptr(oldtcb, tcbsize), tls_static_space); - free_aligned(get_tls_block_ptr(oldtcb, tcbsize)); + free(get_tls_block_ptr(oldtcb, tcbsize)); /* Adjust the DTV. */ dtv = tcb[0]; @@ -5324,7 +5324,7 @@ free_tls(void *tcb, size_t tcbsize, size_t tcbalign __unused) } } free(dtv); - free_aligned(get_tls_block_ptr(tcb, tcbsize)); + free(get_tls_block_ptr(tcb, tcbsize)); } #endif /* TLS_VARIANT_I */ @@ -5350,7 +5350,7 @@ allocate_tls(Obj_Entry *objs, void *oldtls, size_t tcbsize, size_t tcbalign) size = roundup(tls_static_space, ralign) + roundup(tcbsize, ralign); assert(tcbsize >= 2*sizeof(Elf_Addr)); - tls = malloc_aligned(size, ralign, 0 /* XXX */); + tls = xmalloc_aligned(size, ralign, 0 /* XXX */); dtv = xcalloc(tls_max_index + 2, sizeof(Elf_Addr)); segbase = (Elf_Addr)(tls + roundup(tls_static_space, ralign)); @@ -5429,11 +5429,11 @@ free_tls(void *tls, size_t tcbsize __unused, size_t tcbalign) for (i = 0; i < dtvsize; i++) { if (dtv[i + 2] != 0 && (dtv[i + 2] < tlsstart || dtv[i + 2] > tlsend)) { - free_aligned((void *)dtv[i + 2]); + free((void *)dtv[i + 2]); } } - free_aligned((void *)tlsstart); + free((void *)tlsstart); free((void *)dtv); } @@ -5470,7 +5470,7 @@ allocate_module_tls(int index) obj->tls_dynamic = true; - p = malloc_aligned(obj->tlssize, obj->tlsalign, obj->tlspoffset); + p = xmalloc_aligned(obj->tlssize, obj->tlsalign, obj->tlspoffset); memcpy(p, obj->tlsinit, obj->tlsinitsize); memset(p + obj->tlsinitsize, 0, obj->tlssize - obj->tlsinitsize); return (p); diff --git a/libexec/rtld-elf/rtld.h b/libexec/rtld-elf/rtld.h index 45cb722097b2..7fe9d837d6f1 100644 --- a/libexec/rtld-elf/rtld.h +++ b/libexec/rtld-elf/rtld.h @@ -361,8 +361,7 @@ Obj_Entry *map_object(int, const char *, const struct stat *); void *xcalloc(size_t, size_t); void *xmalloc(size_t); char *xstrdup(const char *); -void *malloc_aligned(size_t size, size_t align, size_t offset); -void free_aligned(void *ptr); +void *xmalloc_aligned(size_t size, size_t align, size_t offset); extern Elf_Addr _GLOBAL_OFFSET_TABLE_[]; extern Elf_Sym sym_zero; /* For resolving undefined weak refs. */ extern bool ld_bind_not; diff --git a/libexec/rtld-elf/xmalloc.c b/libexec/rtld-elf/xmalloc.c index 80246f36dd26..5f7c1b5ba10a 100644 --- a/libexec/rtld-elf/xmalloc.c +++ b/libexec/rtld-elf/xmalloc.c @@ -75,34 +75,18 @@ xstrdup(const char *str) } void * -malloc_aligned(size_t size, size_t align, size_t offset) +xmalloc_aligned(size_t size, size_t align, size_t offset) { - char *mem, *res; - uintptr_t x; + void *res; offset &= align - 1; if (align < sizeof(void *)) align = sizeof(void *); - mem = xmalloc(size + 3 * align + offset); - x = roundup((uintptr_t)mem + sizeof(void *), align); - x += offset; - res = (void *)x; - x -= sizeof(void *); - memcpy((void *)x, &mem, sizeof(mem)); + res = __crt_aligned_alloc_offset(align, size, offset); + if (res == NULL) { + rtld_fdputstr(STDERR_FILENO, "Out of memory\n"); + _exit(1); + } return (res); } - -void -free_aligned(void *ptr) -{ - void *mem; - uintptr_t x; - - if (ptr == NULL) - return; - x = (uintptr_t)ptr; - x -= sizeof(void *); - memcpy(&mem, (void *)x, sizeof(mem)); - free(mem); -}