diff options
author | Szabolcs Nagy <szabolcs.nagy@arm.com> | 2022-09-21 15:32:34 +0100 |
---|---|---|
committer | Szabolcs Nagy <szabolcs.nagy@arm.com> | 2022-10-27 14:46:55 +0100 |
commit | c7cfa38968fda587bbd08cd6fe1e105d8e01d229 (patch) | |
tree | 9b56eabc001c236e2e063883c6907fe22135aa5d /sysdeps/generic | |
parent | 131a8501116b1e9f0ac71aeeb513094be5f99b99 (diff) | |
download | glibc-c7cfa38968fda587bbd08cd6fe1e105d8e01d229.tar glibc-c7cfa38968fda587bbd08cd6fe1e105d8e01d229.tar.gz glibc-c7cfa38968fda587bbd08cd6fe1e105d8e01d229.tar.bz2 glibc-c7cfa38968fda587bbd08cd6fe1e105d8e01d229.zip |
cheri: malloc: Initial capability narrowing support
Public interfaces return pointers with narrow bounds, this internally
requires bumping the size and alignment requirement of allocations so
the bounds are representible.
When pointers with narrow bounds need to be turned back to have wide
bounds (free, realloc), the pointer is rederived from DDC. (So this
patch relies on DDC to cover all heap memory with RW permission.)
Allocations above the mmap threshold waste memory for alignment and
realloc often falls back to the inefficient alloc, copy, free sequence
instead of mremap or other inplace solution.
Diffstat (limited to 'sysdeps/generic')
-rw-r--r-- | sysdeps/generic/libc-cap.h | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/sysdeps/generic/libc-cap.h b/sysdeps/generic/libc-cap.h new file mode 100644 index 0000000000..85ff2a6b61 --- /dev/null +++ b/sysdeps/generic/libc-cap.h @@ -0,0 +1,34 @@ +/* Support for allocations with narrow capability bounds. Generic version. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#ifndef _LIBC_CAP_H +#define _LIBC_CAP_H 1 + +/* Larger allocations may need special alignment via cap_align. */ +#define __CAP_ALIGN_THRESHOLD SIZE_MAX + +/* Error if the identifiers bellow are used. */ +void __libc_cap_link_error (void); + +#define __libc_cap_fail(rtype) (__libc_cap_link_error (), (rtype) 0) +#define __libc_cap_roundup(n) __libc_cap_fail (size_t) +#define __libc_cap_align(n) __libc_cap_fail (size_t) +#define __libc_cap_narrow(p, n) __libc_cap_fail (void *) +#define __libc_cap_widen(p) __libc_cap_fail (void *) + +#endif |