summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog15
-rw-r--r--nscd/Makefile9
-rw-r--r--posix/bug-regex11.c72
-rw-r--r--sysdeps/generic/dl-environ.c33
4 files changed, 82 insertions, 47 deletions
diff --git a/ChangeLog b/ChangeLog
index acc4d737fd..828b537452 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,20 @@
+2002-09-11 Roland McGrath <roland@redhat.com>
+
+ * sysdeps/generic/dl-environ.c (unsetenv): Rewritten using strncmp,
+ no longer wrongly matches arbitrary prefixes of NAME.
+ Reported by Jakub Jelinek <jakub@redhat.com>.
+
+2002-09-11 Jakub Jelinek <jakub@redhat.com>
+
+ * posix/bug-regex11.c (tests): New array.
+ (main): Rewritten to run more different tests.
+
2002-09-10 Roland McGrath <roland@redhat.com>
+ * 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 <jakub@redhat.com>, 2002.
@@ -24,37 +24,65 @@
#include <stdio.h>
#include <stdlib.h>
+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;
-
- 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;
- }
+ 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;
return 0;
}