summaryrefslogtreecommitdiff
path: root/src/lib/libc/stdlib/malloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libc/stdlib/malloc.c')
-rw-r--r--src/lib/libc/stdlib/malloc.c44
1 files changed, 43 insertions, 1 deletions
diff --git a/src/lib/libc/stdlib/malloc.c b/src/lib/libc/stdlib/malloc.c
index 81c30812a4..70e7f37dc8 100644
--- a/src/lib/libc/stdlib/malloc.c
+++ b/src/lib/libc/stdlib/malloc.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: malloc.c,v 1.249 2018/04/07 09:57:08 otto Exp $ */ 1/* $OpenBSD: malloc.c,v 1.250 2018/11/05 08:23:40 otto Exp $ */
2/* 2/*
3 * Copyright (c) 2008, 2010, 2011, 2016 Otto Moerbeek <otto@drijf.net> 3 * Copyright (c) 2008, 2010, 2011, 2016 Otto Moerbeek <otto@drijf.net>
4 * Copyright (c) 2012 Matthew Dempsky <matthew@openbsd.org> 4 * Copyright (c) 2012 Matthew Dempsky <matthew@openbsd.org>
@@ -2058,6 +2058,48 @@ err:
2058} 2058}
2059/*DEF_STRONG(posix_memalign);*/ 2059/*DEF_STRONG(posix_memalign);*/
2060 2060
2061void *
2062aligned_alloc(size_t alignment, size_t size)
2063{
2064 struct dir_info *d;
2065 int saved_errno = errno;
2066 void *r;
2067
2068 /* Make sure that alignment is a positive power of 2. */
2069 if (((alignment - 1) & alignment) != 0 || alignment == 0) {
2070 errno = EINVAL;
2071 return NULL;
2072 };
2073 /* Per spec, size should be a multiple of alignment */
2074 if ((size & (alignment - 1)) != 0) {
2075 errno = EINVAL;
2076 return NULL;
2077 }
2078
2079 d = getpool();
2080 if (d == NULL) {
2081 _malloc_init(0);
2082 d = getpool();
2083 }
2084 _MALLOC_LOCK(d->mutex);
2085 d->func = "aligned_alloc";
2086 if (d->active++) {
2087 malloc_recurse(d);
2088 return NULL;
2089 }
2090 r = omemalign(d, alignment, size, 0, CALLER);
2091 d->active--;
2092 _MALLOC_UNLOCK(d->mutex);
2093 if (r == NULL) {
2094 if (mopts.malloc_xmalloc)
2095 wrterror(d, "out of memory");
2096 return NULL;
2097 }
2098 errno = saved_errno;
2099 return r;
2100}
2101/*DEF_STRONG(aligned_alloc);*/
2102
2061#ifdef MALLOC_STATS 2103#ifdef MALLOC_STATS
2062 2104
2063struct malloc_leak { 2105struct malloc_leak {