summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2006-05-15 18:57:25 +0000
committerUlrich Drepper <drepper@redhat.com>2006-05-15 18:57:25 +0000
commit02264020bfda957aa0b48ed00d449fe0ed95a4e2 (patch)
treedbb35d35d76e249e84e6d9d711efaae6212e520f
parentfd5ea23820c6a51289a92e99219870027f38e27d (diff)
downloadglibc-02264020bfda957aa0b48ed00d449fe0ed95a4e2.tar.gz
* misc/getusershell.c (okshells): Don't use static initializers,
do it dynamically.
-rw-r--r--ChangeLog3
-rw-r--r--misc/getusershell.c23
2 files changed, 19 insertions, 7 deletions
diff --git a/ChangeLog b/ChangeLog
index 509b44403e..b7fe215f23 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
2006-05-15 Ulrich Drepper <drepper@redhat.com>
+ * misc/getusershell.c (okshells): Don't use static initializers,
+ do it dynamically.
+
* stdlib/fmtmsg.c (keywords): Change type of len element to
uint32_t to not waste space on 64bit machines.
diff --git a/misc/getusershell.c b/misc/getusershell.c
index f41c6fa5f0..255b579b1a 100644
--- a/misc/getusershell.c
+++ b/misc/getusershell.c
@@ -46,7 +46,15 @@ static char sccsid[] = "@(#)getusershell.c 8.1 (Berkeley) 6/4/93";
* /etc/shells.
*/
+/* NB: we do not initialize okshells here. The initialization needs
+ relocations. These interfaces are used so rarely that this is not
+ justified. Instead explicitly initialize the array when it is
+ used. */
+#if 0
static const char *const okshells[] = { _PATH_BSHELL, _PATH_CSHELL, NULL };
+#else
+static const char *okshells[3];
+#endif
static char **curshell, **shells, *strings;
static char **initshells (void) __THROW;
@@ -97,21 +105,22 @@ initshells()
free(strings);
strings = NULL;
if ((fp = fopen(_PATH_SHELLS, "rc")) == NULL)
- return (char **) okshells;
+ goto init_okshells_noclose;
if (fstat64(fileno(fp), &statb) == -1) {
+ init_okshells:
(void)fclose(fp);
+ init_okshells_noclose:
+ okshells[0] = _PATH_BSHELL;
+ okshells[1] = _PATH_CSHELL;
return (char **) okshells;
}
- if ((strings = malloc((u_int)statb.st_size + 1)) == NULL) {
- (void)fclose(fp);
- return (char **) okshells;
- }
+ if ((strings = malloc((u_int)statb.st_size + 1)) == NULL)
+ goto init_okshells;
shells = calloc((unsigned)statb.st_size / 3, sizeof (char *));
if (shells == NULL) {
- (void)fclose(fp);
free(strings);
strings = NULL;
- return (char **) okshells;
+ goto init_okshells;
}
sp = shells;
cp = strings;