aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>2002-09-11 22:16:50 +0000
committerRoland McGrath <roland@gnu.org>2002-09-11 22:16:50 +0000
commit68b68cb3a475ed999d150376c32a30ed97bd6fe9 (patch)
tree7fc4fd1cbc7dd0d6aa6c1fc25315b139333faa2e
parent0d35c2426d7a2682631da0433299e1c912f0ccfa (diff)
downloadglibc-68b68cb3a475ed999d150376c32a30ed97bd6fe9.tar
glibc-68b68cb3a475ed999d150376c32a30ed97bd6fe9.tar.gz
glibc-68b68cb3a475ed999d150376c32a30ed97bd6fe9.tar.bz2
glibc-68b68cb3a475ed999d150376c32a30ed97bd6fe9.zip
* sysdeps/generic/dl-environ.c (unsetenv): Redo last fix without
strncmp, keeps the code smaller for a non-performance-critical case.
-rw-r--r--ChangeLog3
-rw-r--r--sysdeps/generic/dl-environ.c33
2 files changed, 23 insertions, 13 deletions
diff --git a/ChangeLog b/ChangeLog
index 828b537452..5d6a1cb6e0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
2002-09-11 Roland McGrath <roland@redhat.com>
+ * sysdeps/generic/dl-environ.c (unsetenv): Redo last fix without
+ strncmp, keeps the code smaller for a non-performance-critical case.
+
* sysdeps/generic/dl-environ.c (unsetenv): Rewritten using strncmp,
no longer wrongly matches arbitrary prefixes of NAME.
Reported by Jakub Jelinek <jakub@redhat.com>.
diff --git a/sysdeps/generic/dl-environ.c b/sysdeps/generic/dl-environ.c
index 30fe5654d6..089e89e6e7 100644
--- a/sysdeps/generic/dl-environ.c
+++ b/sysdeps/generic/dl-environ.c
@@ -57,23 +57,30 @@ extern char **__environ attribute_hidden;
int
unsetenv (const char *name)
{
- const size_t len = strlen (name);
char **ep;
ep = __environ;
while (*ep != NULL)
- if (!strncmp (*ep, name, len) && (*ep)[len] == '=')
- {
- /* Found it. Remove this pointer by moving later ones back. */
- char **dp = ep;
-
- do
- dp[0] = dp[1];
- while (*dp++);
- /* Continue the loop in case NAME appears again. */
- }
- else
- ++ep;
+ {
+ size_t cnt = 0;
+
+ while ((*ep)[cnt] == name[cnt] && name[cnt] != '\0')
+ ++cnt;
+
+ if (name[cnt] == '\0' && (*ep)[cnt] == '=')
+ {
+ /* Found it. Remove this pointer by moving later ones to
+ the front. */
+ char **dp = ep;
+
+ do
+ dp[0] = dp[1];
+ while (*dp++);
+ /* Continue the loop in case NAME appears again. */
+ }
+ else
+ ++ep;
+ }
return 0;
}