From 54a043ffd13f3d896b58c6a9f0a4a5bb2170b9ab Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Mon, 15 Apr 2024 21:38:58 +0200 Subject: Merging upstream version 2.12.1. Signed-off-by: Daniel Baumann --- gl/lib/ialloc.h | 45 ++++++++++++++++++++++++++++++++++----------- 1 file changed, 34 insertions(+), 11 deletions(-) (limited to 'gl/lib/ialloc.h') diff --git a/gl/lib/ialloc.h b/gl/lib/ialloc.h index 22f57a4..2aa94ae 100644 --- a/gl/lib/ialloc.h +++ b/gl/lib/ialloc.h @@ -1,6 +1,6 @@ /* ialloc.h -- malloc with idx_t rather than size_t - Copyright 2021-2023 Free Software Foundation, Inc. + Copyright 2021-2024 Free Software Foundation, Inc. This file is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as @@ -29,6 +29,9 @@ #include #include #include +#if defined __CHERI_PURE_CAPABILITY__ +# include +#endif _GL_INLINE_HEADER_BEGIN #ifndef IALLOC_INLINE @@ -65,9 +68,19 @@ IALLOC_INLINE void * irealloc (void *p, idx_t s) { - /* Work around GNU realloc glitch by treating a zero size as if it - were 1, so that returning NULL is equivalent to failing. */ - return s <= SIZE_MAX ? realloc (p, s | !s) : _gl_alloc_nomem (); + if (s <= SIZE_MAX) + { + /* Work around GNU realloc glitch by treating a zero size as if it + were 1, so that returning NULL is equivalent to failing. */ + p = realloc (p, s | !s); +#if defined __CHERI_PURE_CAPABILITY__ + if (p != NULL) + p = cheri_bounds_set (p, s); +#endif + return p; + } + else + return _gl_alloc_nomem (); } /* icalloc (num, size) is like calloc (num, size). @@ -99,13 +112,23 @@ icalloc (idx_t n, idx_t s) IALLOC_INLINE void * ireallocarray (void *p, idx_t n, idx_t s) { - /* Work around GNU reallocarray glitch by treating a zero size as if - it were 1, so that returning NULL is equivalent to failing. */ - if (n == 0 || s == 0) - n = s = 1; - return (n <= SIZE_MAX && s <= SIZE_MAX - ? reallocarray (p, n, s) - : _gl_alloc_nomem ()); + if (n <= SIZE_MAX && s <= SIZE_MAX) + { + /* Work around GNU reallocarray glitch by treating a zero size as if + it were 1, so that returning NULL is equivalent to failing. */ + size_t nx = n; + size_t sx = s; + if (n == 0 || s == 0) + nx = sx = 1; + p = reallocarray (p, nx, sx); +#if defined __CHERI_PURE_CAPABILITY__ + if (p != NULL && (n == 0 || s == 0)) + p = cheri_bounds_set (p, 0); +#endif + return p; + } + else + return _gl_alloc_nomem (); } #ifdef __cplusplus -- cgit v1.2.3