aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2001-08-11 05:32:47 +0000
committerUlrich Drepper <drepper@redhat.com>2001-08-11 05:32:47 +0000
commit6ae9b99ef23691204c5e1e8128425f1a78465a4f (patch)
treea062a94ad8ac565bcb85c58a4547a70cb472025f
parentc020d48c6e91b351cefebbc7a82a9c1ec2d9d83b (diff)
downloadglibc-6ae9b99ef23691204c5e1e8128425f1a78465a4f.zip
glibc-6ae9b99ef23691204c5e1e8128425f1a78465a4f.tar.gz
glibc-6ae9b99ef23691204c5e1e8128425f1a78465a4f.tar.bz2
Update.
* posix/getopt_init.c (__getopt_clean_environment): Avoid making the strncmp calls most of the time by testing for '_' as the first character of the name.
-rw-r--r--ChangeLog4
-rw-r--r--posix/getopt_init.c10
2 files changed, 10 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index 1f3d91c..3fbb34f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
2001-08-10 Ulrich Drepper <drepper@redhat.com>
+ * posix/getopt_init.c (__getopt_clean_environment): Avoid making
+ the strncmp calls most of the time by testing for '_' as the first
+ character of the name.
+
* elf/dl-open.c (add_to_global): Remove stale comment.
* elf/dl-load.c (fillin_rpath): In SUID binaries, don't mark
diff --git a/posix/getopt_init.c b/posix/getopt_init.c
index 611135b..dd3d433 100644
--- a/posix/getopt_init.c
+++ b/posix/getopt_init.c
@@ -1,5 +1,5 @@
/* Perform additional initialization for getopt functions in GNU libc.
- Copyright (C) 1997, 1998 Free Software Foundation, Inc.
+ Copyright (C) 1997, 1998, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
@@ -45,7 +45,7 @@ __getopt_clean_environment (char **env)
of file name wildcard expansion and therefore should not be
considered as options. */
static const char envvar_tail[] = "_GNU_nonoption_argv_flags_=";
- char var[100];
+ char var[50];
char *cp, **ep;
size_t len;
@@ -54,11 +54,13 @@ __getopt_clean_environment (char **env)
cp = memcpy (&var[sizeof (var) - sizeof (envvar_tail)], envvar_tail,
sizeof (envvar_tail));
cp = _itoa_word (__getpid (), cp, 10, 0);
- *--cp = '_';
+ /* Note: we omit adding the leading '_' since we explicitly test for
+ it before calling strncmp. */
len = (var + sizeof (var) - 1) - cp;
for (ep = env; *ep != NULL; ++ep)
- if (!strncmp (*ep, cp, len))
+ if ((*ep)[0] == '_'
+ && __builtin_expect (strncmp (*ep + 1, cp, len) == 0, 0))
{
/* Found it. Store this pointer and move later ones back. */
char **dp = ep;