Updated to fedora-glibc-20071015T0728 fedora-glibc-2_6_90-21
authorjakub <jakub>
Mon, 15 Oct 2007 07:31:02 +0000 (07:31 +0000)
committerjakub <jakub>
Mon, 15 Oct 2007 07:31:02 +0000 (07:31 +0000)
ChangeLog
fedora/branch.mk
fedora/glibc.spec.in
nscd/nscd_getgr_r.c
posix/glob.c
posix/tst-rfc3484-2.c
posix/tst-rfc3484.c

index 619b6f2..fb7ef42 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,10 +1,20 @@
 2007-10-14  Ulrich Drepper  <drepper@redhat.com>
 
+       * posix/glob.c: Reimplement link_exists_p to use fstatat64.
+
+       * posix/glob.c: Add some branch prediction throughout.
+
+       * nscd/nscd_getgr_r.c (nscd_getgr_r): Store result of successful
+       read from nscd.
+
        * sysdeps/posix/getaddrinfo.c (struct sort_result): Add
        service_order.
-       (rfc3484_sort): Make sure that even of qsort doesn't support
-       stable sorting it is stable by comparing service_order.
+       (rfc3484_sort): Make sure that even if qsort doesn't support
+       stable sorting out sorting here is stable by comparing service_order.
        (getaddrinfo): Initialize service_order.
+       * posix/tst-rfc3484.c (do_test): Adjust for addition of
+       service_order field to sorting structure.
+       * posix/tst-rfc3484-2.c (do_test): Likewise.
 
        * include/time.h: Declare __tzset_parse_tz and __tzset_compute.
        * time/tzset.c (tzset_internal): Break TZ string parsing out into
index a457caf..1dc4e6b 100644 (file)
@@ -3,5 +3,5 @@ glibc-branch := fedora
 glibc-base := HEAD
 DIST_BRANCH := devel
 COLLECTION := dist-f8
-fedora-sync-date := 2007-10-14 21:02 UTC
-fedora-sync-tag := fedora-glibc-20071014T2102
+fedora-sync-date := 2007-10-15 07:28 UTC
+fedora-sync-tag := fedora-glibc-20071015T0728
index 82bbe2d..a00d799 100644 (file)
@@ -1,4 +1,4 @@
-%define glibcrelease 20
+%define glibcrelease 21
 %define run_glibc_tests 1
 %define auxarches i586 i686 athlon sparcv9v sparc64v alphaev6
 %define xenarches i686 athlon
@@ -1010,6 +1010,9 @@ rm -f *.filelist*
 %endif
 
 %changelog
+* Mon Oct 15 2007 Jakub Jelinek <jakub@redhat.com> 2.6.90-21
+- fix getgr{name,gid}{,_r} with nscd
+
 * Sun Oct 14 2007 Jakub Jelinek <jakub@redhat.com> 2.6.90-20
 - install <bits/error.h> (#330031)
 - disable -D_FORTIFY_SOURCE{,=2} support (with a warning) for
index afb4d20..b84b06b 100644 (file)
@@ -266,18 +266,16 @@ nscd_getgr_r (const char *key, size_t keylen, request_type type,
       /* If there are no group members TOTAL_LEN is zero.  */
       if (gr_name == NULL)
        {
-         if (total_len > 0)
+         if (total_len > 0
+             && __builtin_expect (__readall (sock, resultbuf->gr_mem[0],
+                                             total_len) != total_len, 0))
            {
-             size_t n = __readall (sock, resultbuf->gr_mem[0], total_len);
-             if (__builtin_expect (n != total_len, 0))
-               {
-                 /* The `errno' to some value != ERANGE.  */
-                 __set_errno (ENOENT);
-                 retval = ENOENT;
-               }
-             else
-               *result = resultbuf;
+             /* The `errno' to some value != ERANGE.  */
+             __set_errno (ENOENT);
+             retval = ENOENT;
            }
+         else
+           *result = resultbuf;
        }
       else
        {
index d6a1a4a..b7d9617 100644 (file)
@@ -774,7 +774,7 @@ glob (pattern, flags, errfunc, pglob)
 
       /* Return the directory if we don't check for error or if it exists.  */
       if ((flags & GLOB_NOCHECK)
-         || (((flags & GLOB_ALTDIRFUNC)
+         || (((__builtin_expect (flags & GLOB_ALTDIRFUNC, 0))
               ? ((*pglob->gl_stat) (dirname, &st) == 0
                  && S_ISDIR (st.st_mode))
               : (__stat64 (dirname, &st64) == 0 && S_ISDIR (st64.st_mode)))))
@@ -846,7 +846,7 @@ glob (pattern, flags, errfunc, pglob)
            *(char *) &dirname[--dirlen] = '\0';
        }
 
-      if ((flags & GLOB_ALTDIRFUNC) != 0)
+      if (__builtin_expect ((flags & GLOB_ALTDIRFUNC) != 0, 0))
        {
          /* Use the alternative access functions also in the recursive
             call.  */
@@ -1030,7 +1030,7 @@ glob (pattern, flags, errfunc, pglob)
       struct_stat64 st64;
 
       for (i = oldcount; i < pglob->gl_pathc + pglob->gl_offs; ++i)
-       if (((flags & GLOB_ALTDIRFUNC)
+       if ((__builtin_expect (flags & GLOB_ALTDIRFUNC, 0)
             ? ((*pglob->gl_stat) (pglob->gl_pathv[i], &st) == 0
                && S_ISDIR (st.st_mode))
             : (__stat64 (pglob->gl_pathv[i], &st64) == 0
@@ -1222,21 +1222,42 @@ weak_alias (__glob_pattern_p, glob_pattern_p)
    allocated with alloca to be recycled.  */
 #if !defined _LIBC || !defined GLOB_ONLY_P
 static int
-link_exists_p (const char *dir, size_t dirlen, const char *fname,
-              glob_t *pglob, int flags)
+__attribute_noinline__
+link_exists2_p (const char *dir, size_t dirlen, const char *fname,
+              glob_t *pglob
+# ifndef _LIBC
+               , int flags
+# endif
+               )
 {
   size_t fnamelen = strlen (fname);
   char *fullname = (char *) __alloca (dirlen + 1 + fnamelen + 1);
   struct stat st;
+# ifndef _LIBC
   struct_stat64 st64;
+# endif
 
   mempcpy (mempcpy (mempcpy (fullname, dir, dirlen), "/", 1),
           fname, fnamelen + 1);
 
-  return (((flags & GLOB_ALTDIRFUNC)
+# ifdef _LIBC
+  return (*pglob->gl_stat) (fullname, &st) == 0;
+# else
+  return ((__builtin_expect (flags & GLOB_ALTDIRFUNC, 0)
           ? (*pglob->gl_stat) (fullname, &st)
           : __stat64 (fullname, &st64)) == 0);
+# endif
 }
+# ifdef _LIBC
+#  define link_exists_p(dfd, dirname, dirnamelen, fname, pglob, flags) \
+  (__builtin_expect (flags & GLOB_ALTDIRFUNC, 0)                             \
+   ? link_exists2_p (dirname, dirnamelen, fname, pglob)                              \
+   : ({ struct stat64 st64;                                                  \
+       __fxstatat64 (_STAT_VER, dfd, fname, &st64, 0) == 0; }))
+# else
+#  define link_exists_p(dfd, dirname, dirnamelen, fname, pglob, flags) \
+  link_exists2_p (dirname, dirnamelen, fname, pglob, flags)
+# endif
 #endif
 
 
@@ -1290,7 +1311,7 @@ glob_in_dir (const char *pattern, const char *directory, int flags,
       mempcpy (mempcpy (mempcpy (fullname, directory, dirlen),
                        "/", 1),
               pattern, patlen + 1);
-      if (((flags & GLOB_ALTDIRFUNC)
+      if ((__builtin_expect (flags & GLOB_ALTDIRFUNC, 0)
           ? (*pglob->gl_stat) (fullname, &st)
           : __stat64 (fullname, &st64)) == 0)
        /* We found this file to be existing.  Now tell the rest
@@ -1299,7 +1320,7 @@ glob_in_dir (const char *pattern, const char *directory, int flags,
     }
   else
     {
-      stream = ((flags & GLOB_ALTDIRFUNC)
+      stream = (__builtin_expect (flags & GLOB_ALTDIRFUNC, 0)
                ? (*pglob->gl_opendir) (directory)
                : opendir (directory));
       if (stream == NULL)
@@ -1311,6 +1332,10 @@ glob_in_dir (const char *pattern, const char *directory, int flags,
        }
       else
        {
+#ifdef _LIBC
+         int dfd = (__builtin_expect (flags & GLOB_ALTDIRFUNC, 0)
+                    ? -1 : dirfd ((DIR *) stream));
+#endif
          int fnm_flags = ((!(flags & GLOB_PERIOD) ? FNM_PERIOD : 0)
                           | ((flags & GLOB_NOESCAPE) ? FNM_NOESCAPE : 0)
 #if defined _AMIGA || defined VMS
@@ -1333,7 +1358,7 @@ glob_in_dir (const char *pattern, const char *directory, int flags,
                }
              d64buf;
 
-             if (flags & GLOB_ALTDIRFUNC)
+             if (__builtin_expect (flags & GLOB_ALTDIRFUNC, 0))
                {
                  struct dirent *d32 = (*pglob->gl_readdir) (stream);
                  if (d32 != NULL)
@@ -1347,7 +1372,7 @@ glob_in_dir (const char *pattern, const char *directory, int flags,
              else
                d = __readdir64 (stream);
 #else
-             struct dirent *d = ((flags & GLOB_ALTDIRFUNC)
+             struct dirent *d = (__builtin_expect (flags & GLOB_ALTDIRFUNC, 0)
                                  ? ((struct dirent *)
                                     (*pglob->gl_readdir) (stream))
                                  : __readdir (stream));
@@ -1369,7 +1394,7 @@ glob_in_dir (const char *pattern, const char *directory, int flags,
                  /* If the file we found is a symlink we have to
                     make sure the target file exists.  */
                  if (!DIRENT_MIGHT_BE_SYMLINK (d)
-                     || link_exists_p (directory, dirlen, name, pglob,
+                     || link_exists_p (dfd, directory, dirlen, name, pglob,
                                        flags))
                    {
                      if (cur == names->count)
@@ -1485,7 +1510,7 @@ glob_in_dir (const char *pattern, const char *directory, int flags,
   if (stream != NULL)
     {
       save = errno;
-      if (flags & GLOB_ALTDIRFUNC)
+      if (__builtin_expect (flags & GLOB_ALTDIRFUNC, 0))
        (*pglob->gl_closedir) (stream);
       else
        closedir (stream);
index ae802c0..f318523 100644 (file)
@@ -98,12 +98,14 @@ do_test (void)
   results[0].got_source_addr = true;
   results[0].source_addr_len = sizeof (so1);
   results[0].source_addr_flags = 0;
+  results[0].service_order = 0;
   memcpy (&results[0].source_addr, &so1, sizeof (so1));
 
   results[1].dest_addr = &ai2;
   results[1].got_source_addr = true;
   results[1].source_addr_len = sizeof (so2);
   results[1].source_addr_flags = 0;
+  results[1].service_order = 1;
   memcpy (&results[1].source_addr, &so2, sizeof (so2));
 
 
@@ -122,12 +124,14 @@ do_test (void)
   results[1].got_source_addr = true;
   results[1].source_addr_len = sizeof (so1);
   results[1].source_addr_flags = 0;
+  results[1].service_order = 1;
   memcpy (&results[1].source_addr, &so1, sizeof (so1));
 
   results[0].dest_addr = &ai2;
   results[0].got_source_addr = true;
   results[0].source_addr_len = sizeof (so2);
   results[0].source_addr_flags = 0;
+  results[0].service_order = 0;
   memcpy (&results[0].source_addr, &so2, sizeof (so2));
 
 
index 352a757..08d57a6 100644 (file)
@@ -93,6 +93,7 @@ do_test (void)
       memcpy(&results[i].source_addr, &so, sizeof (so));
       results[i].source_addr_len = sizeof (so);
       results[i].source_addr_flags = 0;
+      results[i].service_order = i;
     }
 
   qsort (results, naddrs, sizeof (results[0]), rfc3484_sort);