From 0d35c2426d7a2682631da0433299e1c912f0ccfa Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Wed, 11 Sep 2002 22:04:32 +0000 Subject: [PATCH] * sysdeps/generic/dl-environ.c (unsetenv): Rewritten using strncmp, no longer wrongly matches arbitrary prefixes of NAME. Reported by Jakub Jelinek . 2002-09-11 Jakub Jelinek * posix/bug-regex11.c (tests): New array. (main): Rewritten to run more different tests. * nscd/Makefile (CPPFLAGS-nscd, CPPFLAGS-nscd_conf, CPPFLAGS-dbg_log) (CPPFLAGS-connections, CPPFLAGS-hstcache): Variables removed. Instead, catch all of $(nscd-modules) via cppflags-iterator.mk. --- ChangeLog | 15 ++++++++ nscd/Makefile | 9 ++--- posix/bug-regex11.c | 72 +++++++++++++++++++++++++----------- sysdeps/generic/dl-environ.c | 31 ++++++---------- 4 files changed, 81 insertions(+), 46 deletions(-) diff --git a/ChangeLog b/ChangeLog index acc4d737fd..828b537452 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,20 @@ +2002-09-11 Roland McGrath + + * sysdeps/generic/dl-environ.c (unsetenv): Rewritten using strncmp, + no longer wrongly matches arbitrary prefixes of NAME. + Reported by Jakub Jelinek . + +2002-09-11 Jakub Jelinek + + * posix/bug-regex11.c (tests): New array. + (main): Rewritten to run more different tests. + 2002-09-10 Roland McGrath + * nscd/Makefile (CPPFLAGS-nscd, CPPFLAGS-nscd_conf, CPPFLAGS-dbg_log) + (CPPFLAGS-connections, CPPFLAGS-hstcache): Variables removed. + Instead, catch all of $(nscd-modules) via cppflags-iterator.mk. + * sysdeps/powerpc/fpu/s_isnan.c: Do macro hackery on __GI___isnanf as well so we don't get it declared by include/math.h's hidden_proto. Then do hidden_proto for __isnanf locally so hidden_def works right. diff --git a/nscd/Makefile b/nscd/Makefile index 434cf4d759..0bd320e402 100644 --- a/nscd/Makefile +++ b/nscd/Makefile @@ -53,11 +53,10 @@ distribute := nscd.h nscd-client.h dbg_log.h \ include ../Rules -CPPFLAGS-nscd = -DNOT_IN_libc -CPPFLAGS-nscd_conf = -DNOT_IN_libc -CPPFLAGS-dbg_log = -DNOT_IN_libc -CPPFLAGS-connections = -DNOT_IN_libc -CPPFLAGS-hstcache = -DNOT_IN_libc +# This makes sure -DNOT_IN_libc is passed for all these modules. +cpp-srcs-left := $(nscd-modules:=.c) +lib := nscd +include $(patsubst %,$(..)cppflags-iterator.mk,$(cpp-srcs-left)) $(objpfx)nscd: $(nscd-modules:%=$(objpfx)%.o) $(objpfx)nscd_nischeck: $(objpfx)nscd_nischeck.o diff --git a/posix/bug-regex11.c b/posix/bug-regex11.c index 7ae13048f6..da1fc353d7 100644 --- a/posix/bug-regex11.c +++ b/posix/bug-regex11.c @@ -1,4 +1,4 @@ -/* Test for newline handling in regex. +/* Regular expression tests. Copyright (C) 2002 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Jakub Jelinek , 2002. @@ -24,37 +24,65 @@ #include #include +struct +{ + const char *pattern; + const char *string; + int nmatch; + regmatch_t rm[4]; +} tests[] = { + /* Test for newline handling in regex. */ + { "[^~]*~", "\nx~y", 2, { { 0, 3 }, { -1, -1 } } }, + /* Other tests. */ + { ".*|\\([KIO]\\)\\([^|]*\\).*|?[KIO]", "10~.~|P|K0|I10|O16|?KSb", 3, + { { 0, 21 }, { 15, 16 }, { 16, 18 } } }, + { ".*|\\([KIO]\\)\\([^|]*\\).*|?\\1", "10~.~|P|K0|I10|O16|?KSb", 3, + { { 0, 21 }, { 8, 9 }, { 9, 10 } } } +}; + int main (void) { regex_t re; - regmatch_t rm[2]; - int n; + regmatch_t rm[4]; + int n, i, ret = 0; mtrace (); - n = regcomp (&re, "[^~]*~", 0); - if (n != 0) + for (i = 0; i < sizeof (tests) / sizeof (tests[0]); ++i) { - char buf[500]; - regerror (n, &re, buf, sizeof (buf)); - printf ("regcomp failed: %s\n", buf); - exit (1); - } + n = regcomp (&re, tests[i].pattern, 0); + if (n != 0) + { + char buf[500]; + regerror (n, &re, buf, sizeof (buf)); + printf ("regcomp %d failed: %s\n", i, buf); + ret = 1; + continue; + } - if (regexec (&re, "\nx~y", 2, rm, 0)) - { - puts ("regexec failed"); - exit (2); - } - if (rm[0].rm_so != 0 || rm[0].rm_eo != 3) - { - printf ("regexec match failure: %d %d\n", - rm[0].rm_so, rm[0].rm_eo); - exit (3); - } + if (regexec (&re, tests[i].string, tests[i].nmatch, rm, 0)) + { + printf ("regexec %d failed\n", i); + ret = 1; + regfree (&re); + continue; + } - regfree (&re); + for (n = 0; n < tests[i].nmatch; ++n) + if (rm[n].rm_so != tests[i].rm[n].rm_so + || rm[n].rm_eo != tests[i].rm[n].rm_eo) + { + if (tests[i].rm[n].rm_so == -1 && tests[i].rm[n].rm_eo == -1) + break; + printf ("regexec match failure rm[%d] %d..%d\n", + n, rm[n].rm_so, rm[n].rm_eo); + ret = 1; + break; + } + + regfree (&re); + } return 0; } diff --git a/sysdeps/generic/dl-environ.c b/sysdeps/generic/dl-environ.c index 132dad9c3e..30fe5654d6 100644 --- a/sysdeps/generic/dl-environ.c +++ b/sysdeps/generic/dl-environ.c @@ -57,30 +57,23 @@ extern char **__environ attribute_hidden; int unsetenv (const char *name) { + const size_t len = strlen (name); char **ep; ep = __environ; while (*ep != NULL) - { - size_t cnt = 0; + if (!strncmp (*ep, name, len) && (*ep)[len] == '=') + { + /* Found it. Remove this pointer by moving later ones back. */ + char **dp = ep; - while ((*ep)[cnt] == name[cnt] && name[cnt] != '\0') - ++cnt; - - if ((*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; - } + do + dp[0] = dp[1]; + while (*dp++); + /* Continue the loop in case NAME appears again. */ + } + else + ++ep; return 0; }