X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fxmalloca.h;h=1a5fb6d0703fb26d4409efa348d26eac50cc26e6;hb=bfbd822767f532ab05e24bda5b67b992f3562321;hp=1aa862e5e397414efe7df7e6ef9c692461ba6d42;hpb=6b4e0b5316b16ee3e6a6b67ac8b99ae3547fdd96;p=gnulib.git diff --git a/lib/xmalloca.h b/lib/xmalloca.h index 1aa862e5e..1a5fb6d07 100644 --- a/lib/xmalloca.h +++ b/lib/xmalloca.h @@ -1,11 +1,11 @@ /* Safe automatic memory allocation with out of memory checking. - Copyright (C) 2003, 2005, 2007 Free Software Foundation, Inc. + Copyright (C) 2003, 2005, 2007, 2009, 2010 Free Software Foundation, Inc. Written by Bruno Haible , 2003. - This program is free software; you can redistribute it and/or modify + This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -13,13 +13,13 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + along with this program. If not, see . */ #ifndef _XMALLOCA_H #define _XMALLOCA_H #include "malloca.h" +#include "xalloc.h" #ifdef __cplusplus @@ -28,11 +28,11 @@ extern "C" { /* xmalloca(N) is a checking safe variant of alloca(N). It allocates N bytes - of memory allocated on the stack, that must be freed using freesa() before + of memory allocated on the stack, that must be freed using freea() before the function returns. Upon failure, it exits with an error message. */ #if HAVE_ALLOCA # define xmalloca(N) \ - ((N) < 4032 - sa_increment \ + ((N) < 4032 - sa_increment \ ? (void *) ((char *) alloca ((N) + sa_increment) + sa_increment) \ : xmmalloca (N)) extern void * xmmalloca (size_t n); @@ -41,9 +41,19 @@ extern void * xmmalloca (size_t n); xmalloc (N) #endif -/* Maybe we should also define a variant - xnmalloca (size_t n, size_t s) - behaves like xmalloca (n * s) - If this would be useful in your application. please speak up. */ +/* xnmalloca(N,S) is an overflow-safe variant of xmalloca (N * S). + It allocates an array of N objects, each with S bytes of memory, + on the stack. S must be positive and N must be nonnegative. + The array must be freed using freea() before the function returns. + Upon failure, it exits with an error message. */ +#if HAVE_ALLOCA +/* Rely on xmalloca (SIZE_MAX) calling xalloc_die (). */ +# define xnmalloca(n, s) \ + xmalloca (xalloc_oversized ((n), (s)) ? (size_t) (-1) : (n) * (s)) +#else +# define xnmalloca(n, s) \ + xnmalloc ((n), (s)) +#endif #ifdef __cplusplus