Handle long variable names in putenv

This commit is contained in:
Ulrich Drepper 2011-05-16 10:13:54 -04:00
parent 68a3f91fca
commit ea389b12b3
3 changed files with 32 additions and 11 deletions

View File

@ -1,5 +1,9 @@
2011-05-16 Ulrich Drepper <drepper@gmail.com>
[BZ #11892]
* stdlib/putenv.c (putenv): Don't always create copy of the variable
on the stack.
[BZ #11895]
* misc/pselect.c (__pselect): Handle timeout value errors hidden
through underflows.

14
NEWS
View File

@ -10,13 +10,13 @@ Version 2.14
* The following bugs are resolved with this release:
386, 6420, 7101, 9730, 9732, 9809, 10138, 10149, 10157, 11257, 11258,
11487, 11532, 11578, 11653, 11668, 11697, 11724, 11820, 11895, 11901,
11945, 11947, 11952, 11987, 12052, 12083, 12158, 12178, 12200, 12346,
12393, 12420, 12432, 12445, 12449, 12453, 12454, 12460, 12469, 12489,
12509, 12510, 12511, 12518, 12527, 12541, 12545, 12551, 12582, 12583,
12587, 12597, 12601, 12611, 12625, 12626, 12631, 12650, 12653, 12655,
12660, 12681, 12685, 12711, 12713, 12714, 12717, 12723, 12724, 12734,
12738, 12746, 12766
11487, 11532, 11578, 11653, 11668, 11697, 11724, 11820, 11892, 11895,
11901, 11945, 11947, 11952, 11987, 12052, 12083, 12158, 12178, 12200,
12346, 12393, 12420, 12432, 12445, 12449, 12453, 12454, 12460, 12469,
12489, 12509, 12510, 12511, 12518, 12527, 12541, 12545, 12551, 12582,
12583, 12587, 12597, 12601, 12611, 12625, 12626, 12631, 12650, 12653,
12655, 12660, 12681, 12685, 12711, 12713, 12714, 12717, 12723, 12724,
12734, 12738, 12746, 12766
* The RPC implementation in libc is obsoleted. Old programs keep working
but new programs cannot be linked with the routines in libc anymore.

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1991, 94, 95, 96, 97, 98, 99 Free Software Foundation, Inc.
/* Copyright (C) 1991, 94, 95, 96, 97, 98, 99, 11 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@ -57,14 +57,31 @@ putenv (string)
if (name_end != NULL)
{
char *name;
#ifdef _LIBC
char *name = strndupa (string, name_end - string);
int use_malloc = !__libc_use_alloca (name_end - string + 1);
if (__builtin_expect (use_malloc, 0))
{
name = strndup (string, name_end - string);
if (name == NULL)
return -1;
}
else
name = strndupa (string, name_end - string);
#else
char *name = alloca (name_end - string + 1);
# define use_malloc 1
name = malloc (name_end - string + 1);
if (name == NULL)
return -1;
memcpy (name, string, name_end - string);
name[name_end - string] = '\0';
#endif
return __add_to_environ (name, NULL, string, 1);
int result = __add_to_environ (name, NULL, string, 1);
if (__builtin_expect (use_malloc, 0))
free (name);
return result;
}
__unsetenv (string);