From cca613ab9274178a7655f1974539428f25728f72 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Tue, 20 Jan 2004 17:05:34 +0000 Subject: [PATCH] Use allocsa instead of alloca. --- ChangeLog | 4 ++++ lib/ChangeLog | 9 +++++++++ lib/setenv.c | 45 ++++++++++++++++++++++++++++----------------- modules/setenv | 2 +- 4 files changed, 42 insertions(+), 18 deletions(-) diff --git a/ChangeLog b/ChangeLog index 7e9e9a7c5b..1323ac07b7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2004-01-20 Bruno Haible + + * modules/setenv: Depend on allocsa instead of alloca. + 2004-01-20 Bruno Haible * modules/xallocsa: New file. diff --git a/lib/ChangeLog b/lib/ChangeLog index cbd116408c..319b66d146 100644 --- a/lib/ChangeLog +++ b/lib/ChangeLog @@ -1,3 +1,12 @@ +2003-11-30 Bruno Haible + + Safer stack allocation. + * setenv.c: Include allocsa.h. + (alloca): Remove fallback definition. + (freea): Remove macro. + (__add_to_environ) [!_LIBC]: Use allocsa instead of alloca. Use freesa + instead of freea. + 2003-10-17 Bruno Haible * binary-io.h: Avoid warnings on Cygwin. diff --git a/lib/setenv.c b/lib/setenv.c index f185e04db0..c3f9dc4ca4 100644 --- a/lib/setenv.c +++ b/lib/setenv.c @@ -34,13 +34,8 @@ extern int errno; # include #endif -/* For those losing systems which don't have 'alloca' we have to add - some additional code emulating it. */ -#if _LIBC || HAVE_ALLOCA -# define freea(p) /* nothing */ -#else -# define alloca(n) malloc (n) -# define freea(p) free (p) +#if !_LIBC +# include "allocsa.h" #endif #if !_LIBC @@ -163,11 +158,18 @@ __add_to_environ (const char *name, const char *value, const char *combined, { /* See whether the value is already known. */ #ifdef USE_TSEARCH - new_value = (char *) alloca (namelen + 1 + vallen); # ifdef _LIBC + new_value = (char *) alloca (namelen + 1 + vallen); __mempcpy (__mempcpy (__mempcpy (new_value, name, namelen), "=", 1), value, vallen); # else + new_value = (char *) allocsa (namelen + 1 + vallen); + if (new_value == NULL) + { + __set_errno (ENOMEM); + UNLOCK; + return -1; + } memcpy (new_value, name, namelen); new_value[namelen] = '='; memcpy (&new_value[namelen + 1], value, vallen); @@ -180,8 +182,8 @@ __add_to_environ (const char *name, const char *value, const char *combined, new_environ[size] = (char *) malloc (namelen + 1 + vallen); if (new_environ[size] == NULL) { -#ifdef USE_TSEARCH - freea (new_value); +#if defined USE_TSEARCH && !defined _LIBC + freesa (new_value); #endif __set_errno (ENOMEM); UNLOCK; @@ -200,8 +202,8 @@ __add_to_environ (const char *name, const char *value, const char *combined, user string or not. */ STORE_VALUE (new_environ[size]); } -#ifdef USE_TSEARCH - freea (new_value); +#if defined USE_TSEARCH && !defined _LIBC + freesa (new_value); #endif } @@ -223,11 +225,19 @@ __add_to_environ (const char *name, const char *value, const char *combined, else { #ifdef USE_TSEARCH - char *new_value = alloca (namelen + 1 + vallen); + char *new_value; # ifdef _LIBC + new_value = alloca (namelen + 1 + vallen); __mempcpy (__mempcpy (__mempcpy (new_value, name, namelen), "=", 1), value, vallen); # else + new_value = allocsa (namelen + 1 + vallen); + if (new_value == NULL) + { + __set_errno (ENOMEM); + UNLOCK; + return -1; + } memcpy (new_value, name, namelen); new_value[namelen] = '='; memcpy (&new_value[namelen + 1], value, vallen); @@ -240,9 +250,10 @@ __add_to_environ (const char *name, const char *value, const char *combined, np = malloc (namelen + 1 + vallen); if (np == NULL) { -#ifdef USE_TSEARCH - freea (new_value); +#if defined USE_TSEARCH && !defined _LIBC + freesa (new_value); #endif + __set_errno (ENOMEM); UNLOCK; return -1; } @@ -257,8 +268,8 @@ __add_to_environ (const char *name, const char *value, const char *combined, /* And remember the value. */ STORE_VALUE (np); } -#ifdef USE_TSEARCH - freea (new_value); +#if defined USE_TSEARCH && !defined _LIBC + freesa (new_value); #endif } diff --git a/modules/setenv b/modules/setenv index 074823ed90..5f95ae6f12 100644 --- a/modules/setenv +++ b/modules/setenv @@ -9,7 +9,7 @@ lib/unsetenv.c m4/setenv.m4 Depends-on: -alloca +allocsa configure.ac: gt_FUNC_SETENV -- 2.30.2