diff options
Diffstat (limited to 'gl/malloca.h')
| -rw-r--r-- | gl/malloca.h | 35 |
1 files changed, 28 insertions, 7 deletions
diff --git a/gl/malloca.h b/gl/malloca.h index 325c7277..c5208421 100644 --- a/gl/malloca.h +++ b/gl/malloca.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* Safe automatic memory allocation. | 1 | /* Safe automatic memory allocation. |
| 2 | Copyright (C) 2003-2007, 2009-2023 Free Software Foundation, Inc. | 2 | Copyright (C) 2003-2007, 2009-2024 Free Software Foundation, Inc. |
| 3 | Written by Bruno Haible <bruno@clisp.org>, 2003. | 3 | Written by Bruno Haible <bruno@clisp.org>, 2003. |
| 4 | 4 | ||
| 5 | This file is free software: you can redistribute it and/or modify | 5 | This file is free software: you can redistribute it and/or modify |
| @@ -18,10 +18,19 @@ | |||
| 18 | #ifndef _MALLOCA_H | 18 | #ifndef _MALLOCA_H |
| 19 | #define _MALLOCA_H | 19 | #define _MALLOCA_H |
| 20 | 20 | ||
| 21 | /* This file uses _GL_ATTRIBUTE_ALLOC_SIZE, _GL_ATTRIBUTE_DEALLOC, | ||
| 22 | _GL_ATTRIBUTE_MALLOC, HAVE_ALLOCA. */ | ||
| 23 | #if !_GL_CONFIG_H_INCLUDED | ||
| 24 | #error "Please include config.h first." | ||
| 25 | #endif | ||
| 26 | |||
| 21 | #include <alloca.h> | 27 | #include <alloca.h> |
| 22 | #include <stddef.h> | 28 | #include <stddef.h> |
| 23 | #include <stdlib.h> | 29 | #include <stdlib.h> |
| 24 | #include <stdint.h> | 30 | #include <stdint.h> |
| 31 | #if defined __CHERI_PURE_CAPABILITY__ | ||
| 32 | # include <cheri.h> | ||
| 33 | #endif | ||
| 25 | 34 | ||
| 26 | #include "xalloc-oversized.h" | 35 | #include "xalloc-oversized.h" |
| 27 | 36 | ||
| @@ -62,12 +71,24 @@ extern void freea (void *p); | |||
| 62 | memory allocated on the stack, that must be freed using freea() before | 71 | memory allocated on the stack, that must be freed using freea() before |
| 63 | the function returns. Upon failure, it returns NULL. */ | 72 | the function returns. Upon failure, it returns NULL. */ |
| 64 | #if HAVE_ALLOCA | 73 | #if HAVE_ALLOCA |
| 65 | # define malloca(N) \ | 74 | # if defined __CHERI_PURE_CAPABILITY__ |
| 66 | ((N) < 4032 - (2 * sa_alignment_max - 1) \ | 75 | # define malloca(N) \ |
| 67 | ? (void *) (((uintptr_t) (char *) alloca ((N) + 2 * sa_alignment_max - 1) \ | 76 | ((N) < 4032 - (2 * sa_alignment_max - 1) \ |
| 68 | + (2 * sa_alignment_max - 1)) \ | 77 | ? cheri_bounds_set ((void *) (((uintptr_t) \ |
| 69 | & ~(uintptr_t)(2 * sa_alignment_max - 1)) \ | 78 | (char *) \ |
| 70 | : mmalloca (N)) | 79 | alloca ((N) + 2 * sa_alignment_max - 1) \ |
| 80 | + (2 * sa_alignment_max - 1)) \ | ||
| 81 | & ~(uintptr_t)(2 * sa_alignment_max - 1)), \ | ||
| 82 | (N)) \ | ||
| 83 | : mmalloca (N)) | ||
| 84 | # else | ||
| 85 | # define malloca(N) \ | ||
| 86 | ((N) < 4032 - (2 * sa_alignment_max - 1) \ | ||
| 87 | ? (void *) (((uintptr_t) (char *) alloca ((N) + 2 * sa_alignment_max - 1) \ | ||
| 88 | + (2 * sa_alignment_max - 1)) \ | ||
| 89 | & ~(uintptr_t)(2 * sa_alignment_max - 1)) \ | ||
| 90 | : mmalloca (N)) | ||
| 91 | # endif | ||
| 71 | #else | 92 | #else |
| 72 | # define malloca(N) \ | 93 | # define malloca(N) \ |
| 73 | mmalloca (N) | 94 | mmalloca (N) |
