bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Bug-gnulib] setenv update


From: Bruno Haible
Subject: [Bug-gnulib] setenv update
Date: Tue, 20 Jan 2004 18:02:54 +0100
User-agent: KMail/1.5

Hi,

I've changes setenv.c to use allocsa() instead of the relatively dangerous
alloca().


2004-01-20  Bruno Haible  <address@hidden>

        Safer stack allocation.
        * modules/setenv: Depend on allocsa instead of alloca.
        * lib/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.

*** modules/setenv      20 Jan 2003 10:02:38 -0000      1.4
--- modules/setenv      20 Jan 2004 17:02:53 -0000
***************
*** 9,15 ****
  m4/setenv.m4
  
  Depends-on:
! alloca
  
  configure.ac:
  gt_FUNC_SETENV
--- 9,15 ----
  m4/setenv.m4
  
  Depends-on:
! allocsa
  
  configure.ac:
  gt_FUNC_SETENV
*** lib/setenv.c        12 Sep 2003 18:24:51 -0000      1.9
--- lib/setenv.c        20 Jan 2004 17:02:53 -0000
***************
*** 34,46 ****
  # include <unistd.h>
  #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)
  #endif
  
  #if !_LIBC
--- 34,41 ----
  # include <unistd.h>
  #endif
  
! #if !_LIBC
! # include "allocsa.h"
  #endif
  
  #if !_LIBC
***************
*** 163,173 ****
        {
          /* See whether the value is already known.  */
  #ifdef USE_TSEARCH
-         new_value = (char *) alloca (namelen + 1 + vallen);
  # ifdef _LIBC
          __mempcpy (__mempcpy (__mempcpy (new_value, name, namelen), "=", 1),
                     value, vallen);
  # else
          memcpy (new_value, name, namelen);
          new_value[namelen] = '=';
          memcpy (&new_value[namelen + 1], value, vallen);
--- 158,175 ----
        {
          /* See whether the value is already known.  */
  #ifdef USE_TSEARCH
  # 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,187 ****
              new_environ[size] = (char *) malloc (namelen + 1 + vallen);
              if (new_environ[size] == NULL)
                {
! #ifdef USE_TSEARCH
!                 freea (new_value);
  #endif
                  __set_errno (ENOMEM);
                  UNLOCK;
--- 182,189 ----
              new_environ[size] = (char *) malloc (namelen + 1 + vallen);
              if (new_environ[size] == NULL)
                {
! #if defined USE_TSEARCH && !defined _LIBC
!                 freesa (new_value);
  #endif
                  __set_errno (ENOMEM);
                  UNLOCK;
***************
*** 200,207 ****
                 user string or not.  */
              STORE_VALUE (new_environ[size]);
            }
! #ifdef USE_TSEARCH
!         freea (new_value);
  #endif
        }
  
--- 202,209 ----
                 user string or not.  */
              STORE_VALUE (new_environ[size]);
            }
! #if defined USE_TSEARCH && !defined _LIBC
!         freesa (new_value);
  #endif
        }
  
***************
*** 223,233 ****
        else
        {
  #ifdef USE_TSEARCH
!         char *new_value = alloca (namelen + 1 + vallen);
  # ifdef _LIBC
          __mempcpy (__mempcpy (__mempcpy (new_value, name, namelen), "=", 1),
                     value, vallen);
  # else
          memcpy (new_value, name, namelen);
          new_value[namelen] = '=';
          memcpy (&new_value[namelen + 1], value, vallen);
--- 225,243 ----
        else
        {
  #ifdef USE_TSEARCH
!         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,248 ****
              np = malloc (namelen + 1 + vallen);
              if (np == NULL)
                {
! #ifdef USE_TSEARCH
!                 freea (new_value);
  #endif
                  UNLOCK;
                  return -1;
                }
--- 250,259 ----
              np = malloc (namelen + 1 + vallen);
              if (np == NULL)
                {
! #if defined USE_TSEARCH && !defined _LIBC
!                 freesa (new_value);
  #endif
+                 __set_errno (ENOMEM);
                  UNLOCK;
                  return -1;
                }
***************
*** 257,264 ****
              /* And remember the value.  */
              STORE_VALUE (np);
            }
! #ifdef USE_TSEARCH
!         freea (new_value);
  #endif
        }
  
--- 268,275 ----
              /* And remember the value.  */
              STORE_VALUE (np);
            }
! #if defined USE_TSEARCH && !defined _LIBC
!         freesa (new_value);
  #endif
        }
  





reply via email to

[Prev in Thread] Current Thread [Next in Thread]