diff options
author | Joe Simmons-Talbott <josimmon@redhat.com> | 2023-06-30 14:31:45 +0000 |
---|---|---|
committer | Joe Simmons-Talbott <josimmon@redhat.com> | 2023-06-30 14:31:45 +0000 |
commit | 9401024e5e6be0e1c3870e185daae865cd4501f4 (patch) | |
tree | 80b333a6cf8e36e36a428b9b423b35904e4ddc2b /stdlib/setenv.c | |
parent | 9555be54ef94e5d017ce4235e4f7c4e16662e17e (diff) | |
download | glibc-9401024e5e6be0e1c3870e185daae865cd4501f4.tar.gz glibc-9401024e5e6be0e1c3870e185daae865cd4501f4.tar.xz glibc-9401024e5e6be0e1c3870e185daae865cd4501f4.zip |
setenv.c: Get rid of alloca.
Use malloc rather than alloca to avoid potential stack overflow. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Diffstat (limited to 'stdlib/setenv.c')
-rw-r--r-- | stdlib/setenv.c | 40 |
1 files changed, 6 insertions, 34 deletions
diff --git a/stdlib/setenv.c b/stdlib/setenv.c index ba5257d3bf..cc71287fcc 100644 --- a/stdlib/setenv.c +++ b/stdlib/setenv.c @@ -182,18 +182,11 @@ __add_to_environ (const char *name, const char *value, const char *combined, { const size_t varlen = namelen + 1 + vallen; #ifdef USE_TSEARCH - char *new_value; - int use_alloca = __libc_use_alloca (varlen); - if (__builtin_expect (use_alloca, 1)) - new_value = (char *) alloca (varlen); - else + char *new_value = malloc (varlen); + if (new_value == NULL) { - new_value = malloc (varlen); - if (new_value == NULL) - { - UNLOCK; - return -1; - } + UNLOCK; + return -1; } # ifdef _LIBC __mempcpy (__mempcpy (__mempcpy (new_value, name, namelen), "=", 1), @@ -209,35 +202,14 @@ __add_to_environ (const char *name, const char *value, const char *combined, #endif { #ifdef USE_TSEARCH - if (__glibc_unlikely (! use_alloca)) - np = new_value; - else + np = new_value; #endif - { - np = malloc (varlen); - if (__glibc_unlikely (np == NULL)) - { - UNLOCK; - return -1; - } - -#ifdef USE_TSEARCH - memcpy (np, new_value, varlen); -#else - memcpy (np, name, namelen); - np[namelen] = '='; - memcpy (&np[namelen + 1], value, vallen); -#endif - } /* And remember the value. */ STORE_VALUE (np); } #ifdef USE_TSEARCH else - { - if (__glibc_unlikely (! use_alloca)) - free (new_value); - } + free (new_value); #endif } |