* sysdeps/generic/dl-environ.c (unsetenv): Rewritten using strncmp,
authorRoland McGrath <roland@gnu.org>
Wed, 11 Sep 2002 22:04:32 +0000 (22:04 +0000)
committerRoland McGrath <roland@gnu.org>
Wed, 11 Sep 2002 22:04:32 +0000 (22:04 +0000)
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.

* 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
nscd/Makefile
posix/bug-regex11.c
sysdeps/generic/dl-environ.c

index acc4d73..828b537 100644 (file)
--- 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.
index 434cf4d..0bd320e 100644 (file)
@@ -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
index 7ae1304..da1fc35 100644 (file)
@@ -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.
 #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;
 }
index 132dad9..30fe565 100644 (file)
@@ -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;
 }