openat: don’t close (-1)
[gnulib.git] / lib / aligned_alloc.c
bloba9f43ec0c1e3ab830e9ab8af77572421a292a027
1 /* An aligned_alloc() function that works around platform bugs.
2 Copyright (C) 2020-2024 Free Software Foundation, Inc.
4 This file is free software: you can redistribute it and/or modify
5 it under the terms of the GNU Lesser General Public License as
6 published by the Free Software Foundation; either version 2.1 of the
7 License, or (at your option) any later version.
9 This file is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU Lesser General Public License for more details.
14 You should have received a copy of the GNU Lesser General Public License
15 along with this program. If not, see <https://www.gnu.org/licenses/>. */
17 #include <config.h>
19 /* Specification. */
20 #include <stdlib.h>
22 #include <errno.h>
24 void *
25 aligned_alloc (size_t alignment, size_t size)
26 #undef aligned_alloc
28 if (alignment != 0 && (alignment & (alignment - 1)) == 0)
30 /* alignment is a power of 2. */
31 if (size == 0)
32 size = 1;
33 if (alignment >= sizeof (void *))
35 /* Make size a multiple of alignment. */
36 size = (size + (alignment - 1)) & -alignment;
37 if (size > 0)
38 return aligned_alloc (alignment, size);
39 else
41 errno = ENOMEM;
42 return NULL;
45 else
46 return malloc (size);
48 else
50 errno = EINVAL;
51 return NULL;