Updated to fedora-glibc-20080612T1619 fedora-glibc-2_8_90-6
authorjakub <jakub>
Thu, 12 Jun 2008 16:53:41 +0000 (16:53 +0000)
committerjakub <jakub>
Thu, 12 Jun 2008 16:53:41 +0000 (16:53 +0000)
40 files changed:
ChangeLog
fedora/branch.mk
fedora/glibc.spec.in
include/inline-hashtab.h
libio/freopen.c
libio/freopen64.c
locale/programs/ld-collate.c
misc/fstab.c
misc/regexp.h
nptl/ChangeLog
nptl/Makefile
nptl/sysdeps/pthread/createthread.c
nptl/sysdeps/pthread/pthread.h
nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_barrier_wait.S
nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_broadcast.S
nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_signal.S
nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S
nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S
nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S
nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S
nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S
nptl/sysdeps/unix/sysv/linux/i386/i486/sem_post.S
nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S
nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedwrlock.S
nptl/tst-rwlock2.c
nptl/tst-rwlock2a.c [new file with mode: 0644]
nptl/tst-typesizes.c
nscd/grpcache.c
nscd/hstcache.c
nscd/initgrcache.c
nscd/mem.c
nscd/nscd_getserv_r.c
nscd/pwdcache.c
nscd/servicescache.c
posix/glob.c
resolv/arpa/nameser_compat.h
resolv/nss_dns/dns-host.c
string/Makefile
string/test-memmem.c [new file with mode: 0644]
string/test-string.h

index 03cffb9..fe655a4 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,53 @@
+2008-06-12  Ulrich Drepper  <drepper@redhat.com>
+
+       * nscd/grpcache.c (cache_addgr): Correctly compute size of
+       fixed-size portion of the record.
+       * nscd/servicescache.c (cache_addserv): Likewise.
+       * nscd/pwdcache.c (cache_addpw): Likewise.
+       * nscd/initgrcache.c (addinitgroupsX): Likewise.
+
+2008-06-11  Ulrich Drepper  <drepper@redhat.com>
+
+       * nscd/mem.c (gc): Initialize obstack earlier so that if we jump
+       out we don't use uninitialized memory.
+
+       * nscd/hstcache.c (cache_addhst): Send correct number of bytes to
+       the client.
+
+2008-06-10  Ulrich Drepper  <drepper@redhat.com>
+
+       * resolv/nss_dns/dns-host.c (gaih_getanswer_slice): Also log and
+       ignore T_DNAME messages.
+       * resolv/arpa/nameser_compat.h (T_DNAME): Define.
+
+2008-06-05  Jakub Jelinek  <jakub@redhat.com>
+
+       * misc/regexp.h (compile): Use __REPB_PREFIX macro.
+       Avoid segfault if first GETC returns eof/'\0'/'\n'.
+
+2008-06-03  Jakub Jelinek  <jakub@redhat.com>
+
+       * nscd/nscd_getserv_r.c (__nscd_getservbyport_r): Pass cp
+       instead of portstr to nscd_getserv_r.  Patch by
+       Roman Kagan <rkagan@mail.ru>.
+
+2008-05-26  Jim Meyering  <meyering@redhat.com>
+
+       Remove more useless "if" tests before "free".
+       * include/inline-hashtab.h (htab_delete): Likewise.
+       * libio/freopen.c (freopen): Likewise.
+       * libio/freopen64.c (freopen64): Likewise.
+       * locale/programs/ld-collate.c (collate_read): Likewise.
+       * misc/fstab.c (libc_freeres_fn): Likewise.
+       * posix/glob.c (globfree): Likewise.
+
+2008-05-24  Ulrich Drepper  <drepper@redhat.com>
+
+       * string/Makefile (strop-tests): Add memmem.
+       * string/test-memmem.c: New file.
+       * string/test-string.h (BUF1PAGES): Define to 1 if undefined.
+       (test_init): Size buf1 according to BUF1PAGES.
+
 2008-05-24  Jakub Jelinek  <jakub@redhat.com>
 
        * libio/stdio.h (vscanf): Fix -std=c99 redirect.
@@ -5,8 +55,8 @@
        (CFLAGS-scanf17.c): New.
        * stdio-common/scanf14.c (main): Add fscanf and scanf tests.
        * stdio-common/scanf15.c (main): Likewise.
-       * stdio-common/scanf16.c: New test.
-       * stdio-common/scanf17.c: New test.
+       * stdio-common/scanf16.c: New file.
+       * stdio-common/scanf17.c: New file.
 
 2008-05-24  Ulrich Drepper  <drepper@redhat.com>
 
        * sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h
        (__SYSCALL_CLOBBERS): Likewise.
        * scripts/data/localplt-sparc-linux-gnu.data: New file.
-       * scripts/data/localplt-sparc64-linux-gnu.data: Likewise.
+       * scripts/data/localplt-sparc64-linux-gnu.data: New file.
 
 2008-05-21  Jakub Jelinek  <jakub@redhat.com>
 
index 6e7d3e4..6d65ef0 100644 (file)
@@ -3,5 +3,5 @@ glibc-branch := fedora
 glibc-base := HEAD
 DIST_BRANCH := devel
 COLLECTION := dist-f8
-fedora-sync-date := 2008-05-24 22:18 UTC
-fedora-sync-tag := fedora-glibc-20080524T2218
+fedora-sync-date := 2008-06-12 16:19 UTC
+fedora-sync-tag := fedora-glibc-20080612T1619
index 44aa01c..38ccd97 100644 (file)
@@ -19,7 +19,7 @@
 Summary: The GNU libc libraries
 Name: glibc
 Version: @glibcversion@
-Release: 5
+Release: 6
 # GPLv2+ is used in a bunch of programs, LGPLv2+ is used for libraries.
 # Things that are linked directly into dynamically linked programs
 # and shared libraries (e.g. crt files, lib*_nonshared.a) have an additional
@@ -976,6 +976,13 @@ rm -f *.filelist*
 %endif
 
 %changelog
+* Thu Jun 12 2008 Jakub Jelinek <jakub@redhat.com> 2.8.90-6
+- update from trunk
+  - nscd fixes (#450704)
+  - fix getservbyport (#449358)
+  - fix regexp.h (#446406)
+  - avoid crashing on T_DNAME in DNS responses (#450766)
+
 * Sun May 25 2008 Jakub Jelinek <jakub@redhat.com> 2.8.90-5
 - update from trunk
 
index ad361cd..c359161 100644 (file)
@@ -142,8 +142,7 @@ htab_delete (struct hashtab *htab)
   int i;
 
   for (i = htab->size - 1; i >= 0; i--)
-    if (htab->entries[i])
-      free (htab->entries[i]);
+    free (htab->entries[i]);
 
   if (htab->free)
     htab->free (htab->entries);
index d94a562..d80815f 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1993,95,96,97,98,2000,2001,2002,2003
+/* Copyright (C) 1993,95,96,97,98,2000,2001,2002,2003,2008
        Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
@@ -80,8 +80,7 @@ freopen (filename, mode, fp)
   if (fd != -1)
     {
       __close (fd);
-      if (filename != NULL)
-       free ((char *) filename);
+      free ((char *) filename);
     }
   _IO_release_lock (fp);
   return result;
index f8da78c..2dad6d7 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1993,1995,1996,1997,1998,2000,2001,2002, 2003
+/* Copyright (C) 1993,1995,1996,1997,1998,2000,2001,2002, 2003, 2008
    Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
@@ -64,8 +64,7 @@ freopen64 (filename, mode, fp)
   if (fd != -1)
     {
       __close (fd);
-      if (filename != NULL)
-       free ((char *) filename);
+      free ((char *) filename);
     }
   _IO_release_lock (fp);
   return result;
index 7af3b8a..bf50e77 100644 (file)
@@ -2961,8 +2961,7 @@ collate_read (struct linereader *ldfile, struct localedef_t *result,
              else
                {
                col_elem_free:
-                 if (symbol != NULL)
-                   free ((char *) symbol);
+                 free ((char *) symbol);
                  free (arg->val.str.startmb);
                  free (arg->val.str.startwc);
                }
@@ -3142,8 +3141,7 @@ collate_read (struct linereader *ldfile, struct localedef_t *result,
              arg = lr_token (ldfile, charmap, result, repertoire, verbose);
              if (arg->tok != tok_bsymbol)
                {
-                 if (newname != NULL)
-                   free ((char *) newname);
+                 free ((char *) newname);
                  goto err_label;
                }
 
@@ -3157,10 +3155,8 @@ collate_read (struct linereader *ldfile, struct localedef_t *result,
                            "LC_COLLATE");
 
                sym_equiv_free:
-                 if (newname != NULL)
-                   free ((char *) newname);
-                 if (symname != NULL)
-                   free ((char *) symname);
+                 free ((char *) newname);
+                 free ((char *) symname);
                  break;
                }
              if (symname == NULL)
index b434203..ab5581e 100644 (file)
@@ -1,4 +1,5 @@
-/* Copyright (C) 1995, 1996, 1997, 1998, 2000 Free Software Foundation, Inc.
+/* Copyright (C) 1995, 1996, 1997, 1998, 2000, 2008
+   Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -185,6 +186,5 @@ libc_freeres_fn (fstab_free)
   char *buffer;
 
   buffer = fstab_state.fs_buffer;
-  if (buffer != NULL)
-    free ((void *) buffer);
+  free ((void *) buffer);
 }
index b7b50b7..0e979d2 100644 (file)
@@ -1,4 +1,5 @@
-/* Copyright (C) 1996, 1997, 1998, 1999, 2004 Free Software Foundation, Inc.
+/* Copyright (C) 1996, 1997, 1998, 1999, 2004, 2008
+   Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
 
@@ -129,8 +130,9 @@ compile (char *__restrict instring, char *__restrict expbuf,
   __expr_ptr = (regex_t *) expbuf;
   /* The remaining space in the buffer can be used for the compiled
      pattern.  */
-  __expr_ptr->buffer = expbuf + sizeof (regex_t);
-  __expr_ptr->allocated = endbuf -  (char *) __expr_ptr->buffer;
+  __expr_ptr->__REPB_PREFIX (buffer) = expbuf + sizeof (regex_t);
+  __expr_ptr->__REPB_PREFIX (allocated)
+    = endbuf - (char *) __expr_ptr->__REPB_PREFIX (buffer);
 
   while ((__ch = (GETC ())) != eof)
     {
@@ -162,7 +164,10 @@ compile (char *__restrict instring, char *__restrict expbuf,
        }
       __input_buffer[__current_size++] = __ch;
     }
-  __input_buffer[__current_size++] = '\0';
+  if (__current_size)
+    __input_buffer[__current_size++] = '\0';
+  else
+    __input_buffer = "";
 
   /* Now compile the pattern.  */
   __error = regcomp (__expr_ptr, __input_buffer, REG_NEWLINE);
@@ -198,7 +203,8 @@ compile (char *__restrict instring, char *__restrict expbuf,
       }
 
   /* Everything is ok.  */
-  RETURN ((char *) (__expr_ptr->buffer + __expr_ptr->used));
+  RETURN ((char *) (__expr_ptr->__REPB_PREFIX (buffer)
+                   + __expr_ptr->__REPB_PREFIX (used)));
 }
 #endif
 
index 95e478a..f74463b 100644 (file)
@@ -1,5 +1,45 @@
+2008-06-12  Ulrich Drepper  <drepper@redhat.com>
+
+       * sysdeps/pthread/pthread.h: Remove inadvertant checkin.
+
+2008-05-17  Samuel Thibault  <samuel.thibault@ens-lyon.org>
+
+       * sysdeps/pthread/pthread.h: Fix typo in comment.
+
+2008-05-28  Ulrich Drepper  <drepper@redhat.com>
+
+       * sysdeps/pthread/createthread.c (do_clone): Pass accurate length
+       of CPU set to the kernel.
+
+2008-05-23  Paul Pluzhnikov  <ppluzhnikov@google.com>
+
+       * sysdeps/unix/sysv/linux/i386/i486/pthread_barrier_wait.S: Add
+       cfi directives.
+       * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_broadcast.S: Likewise.
+       * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_signal.S: Likewise.
+       * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S: Likewise.
+       * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S: Likewise.
+       * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S: Likewise.
+       * sysdeps/unix/sysv/linux/i386/i486/sem_post.S: Likewise.
+
+2008-05-22  Paul Pluzhnikov  <ppluzhnikov@google.com>
+
+       * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S: Add
+       cfi directives.
+       * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S:
+       Likewise.
+       * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S:
+       Likewise.
+       * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedwrlock.S:
+       Likewise.
+
+2008-05-26  Ulrich Drepper  <drepper@redhat.com>
+
+       * tst-typesizes.c: Explicitly check __SIZEOF_PTHREAD_* constants.
+
 2008-05-20  Jakub Jelinek  <jakub@redhat.com>
-           David S. Miller  <davem@davemloft.net>
+
+       David S. Miller  <davem@davemloft.net>
 
        * sysdeps/unix/sysv/linux/sparc/sparc64/Makefile: New file.
 
index 5bfa9e0..76d9e38 100644 (file)
@@ -210,9 +210,9 @@ tests = tst-typesizes \
        tst-robust6 tst-robust7 tst-robust8 tst-robust9 \
        tst-robustpi1 tst-robustpi2 tst-robustpi3 tst-robustpi4 tst-robustpi5 \
        tst-robustpi6 tst-robustpi7 tst-robustpi8 tst-robustpi9 \
-       tst-rwlock1 tst-rwlock2 tst-rwlock3 tst-rwlock4 tst-rwlock5 \
-       tst-rwlock6 tst-rwlock7 tst-rwlock8 tst-rwlock9 tst-rwlock10 \
-       tst-rwlock11 tst-rwlock12 tst-rwlock13 tst-rwlock14 \
+       tst-rwlock1 tst-rwlock2 tst-rwlock2a tst-rwlock3 tst-rwlock4 \
+       tst-rwlock5 tst-rwlock6 tst-rwlock7 tst-rwlock8 tst-rwlock9 \
+       tst-rwlock10 tst-rwlock11 tst-rwlock12 tst-rwlock13 tst-rwlock14 \
        tst-once1 tst-once2 tst-once3 tst-once4 \
        tst-key1 tst-key2 tst-key3 tst-key4 \
        tst-sem1 tst-sem2 tst-sem3 tst-sem4 tst-sem5 tst-sem6 tst-sem7 \
index 59e62c2..66fafe8 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002, 2003, 2004, 2006, 2007 Free Software Foundation, Inc.
+/* Copyright (C) 2002-2007, 2008 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
 
@@ -98,7 +98,7 @@ do_clone (struct pthread *pd, const struct pthread_attr *attr,
       if (attr->cpuset != NULL)
        {
          res = INTERNAL_SYSCALL (sched_setaffinity, err, 3, pd->tid,
-                                 sizeof (cpu_set_t), attr->cpuset);
+                                 attr->cpusetsize, attr->cpuset);
 
          if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (res, err), 0))
            {
index f3ab0ae..d5ffd38 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007
+/* Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008
    Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
@@ -127,7 +127,7 @@ enum
 #  if __WORDSIZE == 64
 #   define PTHREAD_RWLOCK_WRITER_NONRECURSIVE_INITIALIZER_NP \
   { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,                                          \
-      PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP } }
+       PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP } }
 #  else
 #   if __BYTE_ORDER == __LITTLE_ENDIAN
 #    define PTHREAD_RWLOCK_WRITER_NONRECURSIVE_INITIALIZER_NP \
@@ -399,7 +399,7 @@ extern int pthread_attr_getaffinity_np (__const pthread_attr_t *__attr,
 
 
 /* Initialize thread attribute *ATTR with attributes corresponding to the
-   already running thread TH.  It shall be called on unitialized ATTR
+   already running thread TH.  It shall be called on uninitialized ATTR
    and destroyed with pthread_attr_destroy when no longer needed.  */
 extern int pthread_getattr_np (pthread_t __th, pthread_attr_t *__attr)
      __THROW __nonnull ((2));
index 77d252d..040d7f8 100644 (file)
        .type   pthread_barrier_wait,@function
        .align  16
 pthread_barrier_wait:
+       cfi_startproc
        pushl   %ebx
+       cfi_adjust_cfa_offset(4)
+       cfi_offset(%ebx, -8)
 
        movl    8(%esp), %ebx
 
@@ -45,6 +48,8 @@ pthread_barrier_wait:
 
        /* There are more threads to come.  */
        pushl   %esi
+       cfi_adjust_cfa_offset(4)
+       cfi_offset(%esi, -12)
 
 #if CURR_EVENT == 0
        movl    (%ebx), %edx
@@ -101,9 +106,16 @@ pthread_barrier_wait:
 10:    movl    %esi, %eax              /* != PTHREAD_BARRIER_SERIAL_THREAD */
 
        popl    %esi
+       cfi_adjust_cfa_offset(-4)
+       cfi_restore(%esi)
        popl    %ebx
+       cfi_adjust_cfa_offset(-4)
+       cfi_restore(%ebx)
        ret
 
+       cfi_adjust_cfa_offset(4)
+       cfi_offset(%ebx, -8)
+       
        /* The necessary number of threads arrived.  */
 3:
 #if CURR_EVENT == 0
@@ -140,8 +152,12 @@ pthread_barrier_wait:
 5:     orl     $-1, %eax               /* == PTHREAD_BARRIER_SERIAL_THREAD */
 
        popl    %ebx
+       cfi_adjust_cfa_offset(-4)
+       cfi_restore(%ebx)
        ret
 
+       cfi_adjust_cfa_offset(4)
+       cfi_offset(%ebx, -8)
 1:     movl    PRIVATE(%ebx), %ecx
        leal    MUTEX(%ebx), %edx
        xorl    $LLL_SHARED, %ecx
@@ -154,6 +170,8 @@ pthread_barrier_wait:
        call    __lll_unlock_wake
        jmp     5b
 
+       cfi_adjust_cfa_offset(4)
+       cfi_offset(%esi, -12)
 6:     movl    PRIVATE(%ebx), %ecx
        leal    MUTEX(%ebx), %eax
        xorl    $LLL_SHARED, %ecx
@@ -165,4 +183,5 @@ pthread_barrier_wait:
        xorl    $LLL_SHARED, %ecx
        call    __lll_unlock_wake
        jmp     10b
+       cfi_endproc
        .size   pthread_barrier_wait,.-pthread_barrier_wait
index 776c47f..f46b4b8 100644 (file)
        .type   __pthread_cond_broadcast, @function
        .align  16
 __pthread_cond_broadcast:
-
+       cfi_startproc
        pushl   %ebx
+       cfi_adjust_cfa_offset(4)
        pushl   %esi
+       cfi_adjust_cfa_offset(4)
        pushl   %edi
+       cfi_adjust_cfa_offset(4)
        pushl   %ebp
+       cfi_adjust_cfa_offset(4)
+       cfi_offset(%ebx, -8)
+       cfi_offset(%esi, -12)
+       cfi_offset(%edi, -16)
+       cfi_offset(%ebp, -20)
 
        movl    20(%esp), %ebx
 
@@ -114,11 +122,24 @@ __pthread_cond_broadcast:
 
 10:    xorl    %eax, %eax
        popl    %ebp
+       cfi_adjust_cfa_offset(-4)
+       cfi_restore(%ebp)
        popl    %edi
+       cfi_adjust_cfa_offset(-4)
+       cfi_restore(%edi)
        popl    %esi
+       cfi_adjust_cfa_offset(-4)
+       cfi_restore(%esi)
        popl    %ebx
+       cfi_adjust_cfa_offset(-4)
+       cfi_restore(%ebx)
        ret
 
+       cfi_adjust_cfa_offset(16)
+       cfi_offset(%ebx, -8)
+       cfi_offset(%esi, -12)
+       cfi_offset(%edi, -16)
+       cfi_offset(%ebp, -20)
        .align  16
        /* Unlock.  */
 4:     LOCK
@@ -127,11 +148,24 @@ __pthread_cond_broadcast:
 
 6:     xorl    %eax, %eax
        popl    %ebp
+       cfi_adjust_cfa_offset(-4)
+       cfi_restore(%ebp)
        popl    %edi
+       cfi_adjust_cfa_offset(-4)
+       cfi_restore(%edi)
        popl    %esi
+       cfi_adjust_cfa_offset(-4)
+       cfi_restore(%esi)
        popl    %ebx
+       cfi_adjust_cfa_offset(-4)
+       cfi_restore(%ebx)
        ret
 
+       cfi_adjust_cfa_offset(16)
+       cfi_offset(%ebx, -8)
+       cfi_offset(%esi, -12)
+       cfi_offset(%edi, -16)
+       cfi_offset(%ebp, -20)
        /* Initial locking failed.  */
 1:
 #if cond_lock == 0
@@ -199,6 +233,7 @@ __pthread_cond_broadcast:
        movl    $SYS_futex, %eax
        ENTER_KERNEL
        jmp     10b
+       cfi_endproc
        .size   __pthread_cond_broadcast, .-__pthread_cond_broadcast
 versioned_symbol (libpthread, __pthread_cond_broadcast, pthread_cond_broadcast,
                  GLIBC_2_3_2)
index 36a1803..4909f49 100644 (file)
        .align  16
 __pthread_cond_signal:
 
+       cfi_startproc
        pushl   %ebx
+       cfi_adjust_cfa_offset(4)
        pushl   %edi
+       cfi_adjust_cfa_offset(4)
+       cfi_offset(%ebx, -8)
+       cfi_offset(%edi, -12)
 
        movl    12(%esp), %edi
 
@@ -69,7 +74,12 @@ __pthread_cond_signal:
 
        /* Wake up one thread.  */
        pushl   %esi
+       cfi_adjust_cfa_offset(4)
        pushl   %ebp
+       cfi_adjust_cfa_offset(4)
+       cfi_offset(%esi, -16)
+       cfi_offset(%ebp, -20)
+
 #if FUTEX_PRIVATE_FLAG > 255
        xorl    %ecx, %ecx
 #endif
@@ -91,7 +101,11 @@ __pthread_cond_signal:
        ENTER_KERNEL  */
        int     $0x80
        popl    %ebp
+       cfi_adjust_cfa_offset(-4)
+       cfi_restore(%ebp)
        popl    %esi
+       cfi_adjust_cfa_offset(-4)
+       cfi_restore(%esi)
 
        /* For any kind of error, we try again with WAKE.
           The general test also covers running on old kernels.  */
@@ -100,9 +114,17 @@ __pthread_cond_signal:
 
 6:     xorl    %eax, %eax
        popl    %edi
+       cfi_adjust_cfa_offset(-4)
+       cfi_restore(%edi)
        popl    %ebx
+       cfi_adjust_cfa_offset(-4)
+       cfi_restore(%ebx)
        ret
 
+       cfi_adjust_cfa_offset(8)
+       cfi_offset(%ebx, -8)
+       cfi_offset(%edi, -12)
+
 7:     /* %ecx should be either FUTEX_WAKE_OP or
           FUTEX_WAKE_OP|FUTEX_PRIVATE_FLAG from the previous syscall.  */
        xorl    $(FUTEX_WAKE ^ FUTEX_WAKE_OP), %ecx
@@ -152,6 +174,7 @@ __pthread_cond_signal:
        call    __lll_lock_wait
        jmp     2b
 
+       cfi_endproc
        .size   __pthread_cond_signal, .-__pthread_cond_signal
 versioned_symbol (libpthread, __pthread_cond_signal, pthread_cond_signal,
                  GLIBC_2_3_2)
index 2ddeed0..4e5f0c5 100644 (file)
        .type   __pthread_rwlock_rdlock,@function
        .align  16
 __pthread_rwlock_rdlock:
+       cfi_startproc
        pushl   %esi
+       cfi_adjust_cfa_offset(4)
        pushl   %ebx
+       cfi_adjust_cfa_offset(4)
+       cfi_offset(%esi, -8)
+       cfi_offset(%ebx, -12)
 
        xorl    %esi, %esi
        movl    12(%esp), %ebx
@@ -113,9 +118,16 @@ __pthread_rwlock_rdlock:
 
        movl    %edx, %eax
        popl    %ebx
+       cfi_adjust_cfa_offset(-4)
+       cfi_restore(%ebx)
        popl    %esi
+       cfi_adjust_cfa_offset(-4)
+       cfi_restore(%esi)
        ret
 
+       cfi_adjust_cfa_offset(8)
+       cfi_offset(%esi, -8)
+       cfi_offset(%ebx, -12)
 1:
 #if MUTEX == 0
        movl    %ebx, %edx
@@ -171,6 +183,7 @@ __pthread_rwlock_rdlock:
        movzbl  PSHARED(%ebx), %ecx
        call    __lll_lock_wait
        jmp     13b
+       cfi_endproc
        .size   __pthread_rwlock_rdlock,.-__pthread_rwlock_rdlock
 
        .globl  pthread_rwlock_rdlock
index 8902728..2b84cd0 100644 (file)
        .type   pthread_rwlock_timedrdlock,@function
        .align  16
 pthread_rwlock_timedrdlock:
+       cfi_startproc
        pushl   %esi
+       cfi_adjust_cfa_offset(4)
        pushl   %edi
+       cfi_adjust_cfa_offset(4)
        pushl   %ebx
+       cfi_adjust_cfa_offset(4)
        pushl   %ebp
+       cfi_adjust_cfa_offset(4)
+       cfi_offset(%esi, -8)
+       cfi_offset(%edi, -12)
+       cfi_offset(%ebx, -16)
+       cfi_offset(%ebp, -20)
        subl    $8, %esp
+       cfi_adjust_cfa_offset(8)
 
        movl    28(%esp), %ebp
        movl    32(%esp), %edi
@@ -150,12 +160,26 @@ pthread_rwlock_timedrdlock:
 7:     movl    %edx, %eax
 
        addl    $8, %esp
+       cfi_adjust_cfa_offset(-8)
        popl    %ebp
+       cfi_adjust_cfa_offset(-4)
+       cfi_restore(%ebp)
        popl    %ebx
+       cfi_adjust_cfa_offset(-4)
+       cfi_restore(%ebx)
        popl    %edi
+       cfi_adjust_cfa_offset(-4)
+       cfi_restore(%edi)
        popl    %esi
+       cfi_adjust_cfa_offset(-4)
+       cfi_restore(%esi)
        ret
 
+       cfi_adjust_cfa_offset(24)
+       cfi_offset(%esi, -8)
+       cfi_offset(%edi, -12)
+       cfi_offset(%ebx, -16)
+       cfi_offset(%ebp, -20)
 1:
 #if MUTEX == 0
        movl    %ebp, %edx
@@ -216,4 +240,5 @@ pthread_rwlock_timedrdlock:
 
 19:    movl    $EINVAL, %edx
        jmp     9b
+       cfi_endproc
        .size   pthread_rwlock_timedrdlock,.-pthread_rwlock_timedrdlock
index 0cf02e0..9165246 100644 (file)
        .type   pthread_rwlock_timedwrlock,@function
        .align  16
 pthread_rwlock_timedwrlock:
+       cfi_startproc
        pushl   %esi
+       cfi_adjust_cfa_offset(4)
        pushl   %edi
+       cfi_adjust_cfa_offset(4)
        pushl   %ebx
+       cfi_adjust_cfa_offset(4)
        pushl   %ebp
+       cfi_adjust_cfa_offset(4)
+       cfi_offset(%esi, -8)
+       cfi_offset(%edi, -12)
+       cfi_offset(%ebx, -16)
+       cfi_offset(%ebp, -20)
        subl    $8, %esp
+       cfi_adjust_cfa_offset(8)
 
        movl    28(%esp), %ebp
        movl    32(%esp), %edi
@@ -148,12 +158,26 @@ pthread_rwlock_timedwrlock:
 7:     movl    %edx, %eax
 
        addl    $8, %esp
+       cfi_adjust_cfa_offset(-8)
        popl    %ebp
+       cfi_adjust_cfa_offset(-4)
+       cfi_restore(%ebp)
        popl    %ebx
+       cfi_adjust_cfa_offset(-4)
+       cfi_restore(%ebx)
        popl    %edi
+       cfi_adjust_cfa_offset(-4)
+       cfi_restore(%edi)
        popl    %esi
+       cfi_adjust_cfa_offset(-4)
+       cfi_restore(%esi)
        ret
 
+       cfi_adjust_cfa_offset(24)
+       cfi_offset(%esi, -8)
+       cfi_offset(%edi, -12)
+       cfi_offset(%ebx, -16)
+       cfi_offset(%ebp, -20)
 1:
 #if MUTEX == 0
        movl    %ebp, %edx
@@ -209,4 +233,5 @@ pthread_rwlock_timedwrlock:
 
 19:    movl    $EINVAL, %edx
        jmp     9b
+       cfi_endproc
        .size   pthread_rwlock_timedwrlock,.-pthread_rwlock_timedwrlock
index bf9c33e..aabb929 100644 (file)
        .type   __pthread_rwlock_unlock,@function
        .align  16
 __pthread_rwlock_unlock:
+       cfi_startproc
        pushl   %ebx
+       cfi_adjust_cfa_offset(4)
        pushl   %edi
+       cfi_adjust_cfa_offset(4)
+       cfi_offset(%ebx, -8)
+       cfi_offset(%edi, -12)
 
        movl    12(%esp), %edi
 
@@ -87,9 +92,16 @@ __pthread_rwlock_unlock:
 
        xorl    %eax, %eax
        popl    %edi
+       cfi_adjust_cfa_offset(-4)
+       cfi_restore(%edi)
        popl    %ebx
+       cfi_adjust_cfa_offset(-4)
+       cfi_restore(%ebx)
        ret
 
+       cfi_adjust_cfa_offset(8)
+       cfi_offset(%ebx, -8)
+       cfi_offset(%edi, -12)
        .align  16
 6:     LOCK
 #if MUTEX == 0
@@ -133,7 +145,7 @@ __pthread_rwlock_unlock:
        movzbl  PSHARED(%edi), %ecx
        call    __lll_unlock_wake
        jmp     8b
-
+       cfi_endproc
        .size   __pthread_rwlock_unlock,.-__pthread_rwlock_unlock
 
        .globl  pthread_rwlock_unlock
index d13bb51..1007364 100644 (file)
        .type   __pthread_rwlock_wrlock,@function
        .align  16
 __pthread_rwlock_wrlock:
+       cfi_startproc
        pushl   %esi
+       cfi_adjust_cfa_offset(4)
        pushl   %ebx
+       cfi_adjust_cfa_offset(4)
+       cfi_offset(%esi, -8)
+       cfi_offset(%ebx, -12)
 
        xorl    %esi, %esi
        movl    12(%esp), %ebx
@@ -111,9 +116,16 @@ __pthread_rwlock_wrlock:
 
        movl    %edx, %eax
        popl    %ebx
+       cfi_adjust_cfa_offset(-4)
+       cfi_restore(%ebx)
        popl    %esi
+       cfi_adjust_cfa_offset(-4)
+       cfi_restore(%esi)
        ret
 
+       cfi_adjust_cfa_offset(8)
+       cfi_offset(%esi, -8)
+       cfi_offset(%ebx, -12)
 1:
 #if MUTEX == 0
        movl    %ebx, %edx
@@ -162,6 +174,7 @@ __pthread_rwlock_wrlock:
        movzbl  PSHARED(%ebx), %ecx
        call    __lll_lock_wait
        jmp     13b
+       cfi_endproc
        .size   __pthread_rwlock_wrlock,.-__pthread_rwlock_wrlock
 
        .globl  pthread_rwlock_wrlock
index 2edcdde..86992c8 100644 (file)
        .type   __new_sem_post,@function
        .align  16
 __new_sem_post:
+       cfi_startproc
        pushl   %ebx
+       cfi_adjust_cfa_offset(4)
+       cfi_offset(%ebx, -8)
 
        movl    8(%esp), %ebx
 
@@ -64,8 +67,12 @@ __new_sem_post:
 
 2:     xorl    %eax, %eax
        popl    %ebx
+       cfi_adjust_cfa_offset(-4)
+       cfi_restore(%ebx)
        ret
 
+       cfi_adjust_cfa_offset(4)
+       cfi_offset(%ebx, -8)
 1:
 #ifdef PIC
        call    __i686.get_pc_thunk.bx
@@ -116,14 +123,20 @@ __new_sem_post:
 
        orl     $-1, %eax
        popl    %ebx
+       cfi_adjust_cfa_offset(-4)
+       cfi_restore(%ebx)
        ret
+       cfi_endproc
        .size   __new_sem_post,.-__new_sem_post
        versioned_symbol(libpthread, __new_sem_post, sem_post, GLIBC_2_1)
 #if SHLIB_COMPAT(libpthread, GLIBC_2_0, GLIBC_2_1)
        .global __old_sem_post
        .type   __old_sem_post,@function
 __old_sem_post:
+       cfi_startproc
        pushl   %ebx
+       cfi_adjust_cfa_offset(4)
+       cfi_offset(%ebx, -8)
 
        movl    8(%esp), %ebx
        LOCK
@@ -139,7 +152,10 @@ __old_sem_post:
 
        xorl    %eax, %eax
        popl    %ebx
+       cfi_adjust_cfa_offset(-4)
+       cfi_restore(%ebx)
        ret
+       cfi_endproc
        .size   __old_sem_post,.-__old_sem_post
        compat_symbol(libpthread, __old_sem_post, sem_post, GLIBC_2_0)
 #endif
index 0fa2714..366c96f 100644 (file)
        .type   pthread_rwlock_timedrdlock,@function
        .align  16
 pthread_rwlock_timedrdlock:
+       cfi_startproc
        pushq   %r12
+       cfi_adjust_cfa_offset(8)
        pushq   %r13
+       cfi_adjust_cfa_offset(8)
        pushq   %r14
+       cfi_adjust_cfa_offset(8)
+       cfi_offset(%r12, -16)
+       cfi_offset(%r13, -24)
+       cfi_offset(%r14, -32)
+
        subq    $16, %rsp
+       cfi_adjust_cfa_offset(16)
 
        movq    %rdi, %r12
        movq    %rsi, %r13
@@ -155,11 +164,22 @@ pthread_rwlock_timedrdlock:
 7:     movq    %rdx, %rax
 
        addq    $16, %rsp
+       cfi_adjust_cfa_offset(-16)
        popq    %r14
+       cfi_adjust_cfa_offset(-8)
+       cfi_restore(%r14)
        popq    %r13
+       cfi_adjust_cfa_offset(-8)
+       cfi_restore(%r13)
        popq    %r12
+       cfi_adjust_cfa_offset(-8)
+       cfi_restore(%r12)
        retq
 
+       cfi_adjust_cfa_offset(40)
+       cfi_offset(%r12, -16)
+       cfi_offset(%r13, -24)
+       cfi_offset(%r14, -32)
 1:     movl    PSHARED(%rdi), %esi
 #if MUTEX != 0
        addq    $MUTEX, %rdi
@@ -214,4 +234,5 @@ pthread_rwlock_timedrdlock:
 
 19:    movl    $EINVAL, %edx
        jmp     9b
+       cfi_endproc
        .size   pthread_rwlock_timedrdlock,.-pthread_rwlock_timedrdlock
index 1e43933..dde6b58 100644 (file)
        .type   pthread_rwlock_timedwrlock,@function
        .align  16
 pthread_rwlock_timedwrlock:
+       cfi_startproc
        pushq   %r12
+       cfi_adjust_cfa_offset(8)
        pushq   %r13
+       cfi_adjust_cfa_offset(8)
        pushq   %r14
+       cfi_adjust_cfa_offset(8)
+       cfi_offset(%r12, -16)
+       cfi_offset(%r13, -24)
+       cfi_offset(%r14, -32)
+
        subq    $16, %rsp
+       cfi_adjust_cfa_offset(16)
 
        movq    %rdi, %r12
        movq    %rsi, %r13
@@ -152,11 +161,22 @@ pthread_rwlock_timedwrlock:
 7:     movq    %rdx, %rax
 
        addq    $16, %rsp
+       cfi_adjust_cfa_offset(-16)
        popq    %r14
+       cfi_adjust_cfa_offset(-8)
+       cfi_restore(%r14)
        popq    %r13
+       cfi_adjust_cfa_offset(-8)
+       cfi_restore(%r13)
        popq    %r12
+       cfi_adjust_cfa_offset(-8)
+       cfi_restore(%r12)
        retq
 
+       cfi_adjust_cfa_offset(40)
+       cfi_offset(%r12, -16)
+       cfi_offset(%r13, -24)
+       cfi_offset(%r14, -32)
 1:     movl    PSHARED(%rdi), %esi
 #if MUTEX != 0
        addq    $MUTEX, %rdi
@@ -206,4 +226,5 @@ pthread_rwlock_timedwrlock:
 
 19:    movl    $EINVAL, %edx
        jmp     9b
+       cfi_endproc
        .size   pthread_rwlock_timedwrlock,.-pthread_rwlock_timedwrlock
index 6f38682..2d2e8e4 100644 (file)
@@ -26,15 +26,41 @@ static int
 do_test (void)
 {
   pthread_rwlock_t r;
+  pthread_rwlockattr_t at;
   int e;
 
-  if (pthread_rwlock_init (&r, NULL) != 0)
+  if (pthread_rwlockattr_init (&at) != 0)
+    {
+      puts ("rwlockattr_init failed");
+      return 1;
+    }
+  puts ("rwlockattr_init succeeded");
+
+#ifndef TYPE
+# define TYPE PTHREAD_RWLOCK_PREFER_READER_NP
+#endif
+
+  if (pthread_rwlockattr_setkind_np (&at, TYPE) != 0)
+    {
+      puts ("rwlockattr_setkind failed");
+      return 1;
+    }
+  puts ("rwlockattr_setkind succeeded");
+
+  if (pthread_rwlock_init (&r, &at) != 0)
     {
       puts ("rwlock_init failed");
       return 1;
     }
   puts ("rwlock_init succeeded");
 
+  if (pthread_rwlockattr_destroy (&at) != 0)
+    {
+      puts ("rwlockattr_destroy failed");
+      return 1;
+    }
+  puts ("rwlockattr_destroy succeeded");
+
   if (pthread_rwlock_wrlock (&r) != 0)
     {
       puts ("1st rwlock_wrlock failed");
diff --git a/nptl/tst-rwlock2a.c b/nptl/tst-rwlock2a.c
new file mode 100644 (file)
index 0000000..615de5c
--- /dev/null
@@ -0,0 +1,2 @@
+#define TYPE PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP
+#include "tst-rwlock2.c"
index 17a1e29..545cee6 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2005, 2007 Free Software Foundation, Inc.
+/* Copyright (C) 2005, 2007, 2008 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@redhat.com>, 2005.
 
 #include <pthreadP.h>
 #include <semaphore.h>
 
+static const struct
+{
+  const char *name;
+  size_t expected;
+  size_t is;
+} types[] =
+  {
+#define T(t, c) \
+    { #t, c, sizeof (t) }
+    T (pthread_attr_t, __SIZEOF_PTHREAD_ATTR_T),
+    T (pthread_mutex_t, __SIZEOF_PTHREAD_MUTEX_T),
+    T (pthread_mutexattr_t, __SIZEOF_PTHREAD_MUTEXATTR_T),
+    T (pthread_cond_t, __SIZEOF_PTHREAD_COND_T),
+    T (pthread_condattr_t, __SIZEOF_PTHREAD_CONDATTR_T),
+    T (pthread_rwlock_t, __SIZEOF_PTHREAD_RWLOCK_T),
+    T (pthread_rwlockattr_t, __SIZEOF_PTHREAD_RWLOCKATTR_T),
+    T (pthread_barrier_t, __SIZEOF_PTHREAD_BARRIER_T),
+    T (pthread_barrierattr_t, __SIZEOF_PTHREAD_BARRIERATTR_T)
+  };
 
 static int
 do_test (void)
@@ -62,6 +81,14 @@ do_test (void)
   TEST_TYPE2 (sem_t, struct new_sem);
   TEST_TYPE2 (sem_t, struct old_sem);
 
+  for (size_t i = 0; i < sizeof (types) / sizeof (types[0]); ++i)
+    if (types[i].expected != types[i].is)
+      {
+       printf ("%s: expected %zu, is %zu\n",
+               types[i].name, types[i].expected, types[i].is);
+       result = 1;
+      }
+
   return result;
 }
 
index e391dc3..c49c0e1 100644 (file)
@@ -190,7 +190,7 @@ cache_addgr (struct database_dyn *db, int fd, request_header *req,
          gr_mem_len_total += gr_mem_len[gr_mem_cnt];
        }
 
-      written = total = (sizeof (struct dataset)
+      written = total = (offsetof (struct dataset, strdata)
                         + gr_mem_cnt * sizeof (uint32_t)
                         + gr_name_len + gr_passwd_len + gr_mem_len_total);
 
@@ -252,6 +252,9 @@ cache_addgr (struct database_dyn *db, int fd, request_header *req,
       char *key_copy = cp + key_offset;
       assert (key_copy == (char *) rawmemchr (cp, '\0') + 1);
 
+      assert (cp == dataset->strdata + total - offsetof (struct dataset,
+                                                        strdata));
+
       /* Now we can determine whether on refill we have to create a new
         record or not.  */
       if (he != NULL)
index d4dd51f..4333917 100644 (file)
@@ -83,8 +83,7 @@ cache_addhst (struct database_dyn *db, int fd, request_header *req,
              struct hashentry *he, struct datahead *dh, int errval,
              int32_t ttl)
 {
-  ssize_t total;
-  ssize_t written;
+  bool all_written = true;
   time_t t = time (NULL);
 
   /* We allocate all data in one memory block: the iov vector,
@@ -108,18 +107,17 @@ cache_addhst (struct database_dyn *db, int fd, request_header *req,
          if (reload_count != UINT_MAX)
            /* Do not reset the value if we never not reload the record.  */
            dh->nreloads = reload_count - 1;
-
-         written = total = 0;
        }
       else
        {
          /* We have no data.  This means we send the standard reply for this
             case.  */
-         written = total = sizeof (notfound);
+         ssize_t total = sizeof (notfound);
 
-         if (fd != -1)
-           written = TEMP_FAILURE_RETRY (send (fd, &notfound, total,
-                                               MSG_NOSIGNAL));
+         if (fd != -1 &&
+             TEMP_FAILURE_RETRY (send (fd, &notfound, total,
+                                       MSG_NOSIGNAL)) != total)
+           all_written = false;
 
          dataset = mempool_alloc (db, sizeof (struct dataset) + req->key_len,
                                   IDX_result_data);
@@ -181,6 +179,7 @@ cache_addhst (struct database_dyn *db, int fd, request_header *req,
       char *key_copy = NULL;
       char *cp;
       size_t cnt;
+      ssize_t total;
 
       /* Determine the number of aliases.  */
       h_aliases_cnt = 0;
@@ -208,7 +207,6 @@ cache_addhst (struct database_dyn *db, int fd, request_header *req,
                + h_name_len
                + h_aliases_cnt * sizeof (uint32_t)
                + h_addr_list_cnt * hst->h_length);
-      written = total;
 
       /* If we refill the cache, first assume the reconrd did not
         change.  Allocate memory on the cache since it is likely
@@ -260,6 +258,9 @@ cache_addhst (struct database_dyn *db, int fd, request_header *req,
       dataset->resp.h_addr_list_cnt = h_addr_list_cnt;
       dataset->resp.error = NETDB_SUCCESS;
 
+      /* Make sure there is no gap.  */
+      assert ((char *) (&dataset->resp.error + 1) == dataset->strdata);
+
       cp = dataset->strdata;
 
       cp = mempcpy (cp, hst->h_name, h_name_len);
@@ -286,6 +287,8 @@ cache_addhst (struct database_dyn *db, int fd, request_header *req,
         we explicitly add the name here.  */
       key_copy = memcpy (cp, key, req->key_len);
 
+      assert ((char *) &dataset->resp + dataset->head.recsize == cp);
+
       /* Now we can determine whether on refill we have to create a new
         record or not.  */
       if (he != NULL)
@@ -351,20 +354,27 @@ cache_addhst (struct database_dyn *db, int fd, request_header *req,
                      <= (sizeof (struct database_pers_head)
                          + db->head->module * sizeof (ref_t)
                          + db->head->data_size));
-             written = sendfileall (fd, db->wr_fd,
-                                    (char *) &dataset->resp
-                                    - (char *) db->head, total);
+             ssize_t written = sendfileall (fd, db->wr_fd,
+                                            (char *) &dataset->resp
+                                            - (char *) db->head,
+                                            dataset->head.recsize);
+             if (written != dataset->head.recsize)
+               {
 # ifndef __ASSUME_SENDFILE
-             if (written == -1 && errno == ENOSYS)
-               goto use_write;
+                 if (written == -1 && errno == ENOSYS)
+                   goto use_write;
 # endif
+                 all_written = false;
+               }
            }
          else
 # ifndef __ASSUME_SENDFILE
          use_write:
 # endif
 #endif
-           written = writeall (fd, &dataset->resp, total);
+           if (writeall (fd, &dataset->resp, dataset->head.recsize)
+               != dataset->head.recsize)
+             all_written = false;
        }
 
       /* Add the record to the database.  But only if it has not been
@@ -414,7 +424,7 @@ cache_addhst (struct database_dyn *db, int fd, request_header *req,
        }
     }
 
-  if (__builtin_expect (written != total, 0) && debug_level > 0)
+  if (__builtin_expect (!all_written, 0) && debug_level > 0)
     {
       char buf[256];
       dbg_log (_("short write in %s: %s"),  __FUNCTION__,
index 3355df5..c5693c6 100644 (file)
@@ -246,7 +246,8 @@ addinitgroupsX (struct database_dyn *db, int fd, request_header *req,
   else
     {
 
-      written = total = sizeof (struct dataset) + start * sizeof (int32_t);
+      written = total = (offsetof (struct dataset, strdata)
+                        + start * sizeof (int32_t));
 
       /* If we refill the cache, first assume the reconrd did not
         change.  Allocate memory on the cache since it is likely
@@ -307,6 +308,9 @@ addinitgroupsX (struct database_dyn *db, int fd, request_header *req,
       /* Finally the user name.  */
       memcpy (cp, key, req->key_len);
 
+      assert (cp == dataset->strdata + total - offsetof (struct dataset,
+                                                        strdata));
+
       /* Now we can determine whether on refill we have to create a new
         record or not.  */
       if (he != NULL)
index 96ff03f..e821729 100644 (file)
@@ -235,6 +235,11 @@ gc (struct database_dyn *db)
   /* Sort the entries by their address.  */
   qsort (he, cnt, sizeof (struct hashentry *), sort_he);
 
+#define obstack_chunk_alloc xmalloc
+#define obstack_chunk_free free
+  struct obstack ob;
+  obstack_init (&ob);
+
   /* Determine the highest used address.  */
   size_t high = nmark;
   while (high > 0 && mark[high - 1] == 0)
@@ -307,10 +312,6 @@ gc (struct database_dyn *db)
     size_t size;
     struct moveinfo *next;
   } *moves = NULL;
-#define obstack_chunk_alloc xmalloc
-#define obstack_chunk_free free
-  struct obstack ob;
-  obstack_init (&ob);
 
   while (byte < high)
     {
index 3cd5a24..b1ad7e2 100644 (file)
@@ -53,7 +53,7 @@ __nscd_getservbyport_r (int port, const char *proto,
   portstr[sizeof (portstr) - 1] = '\0';
   char *cp = _itoa_word (port, portstr + sizeof (portstr) - 1, 10, 0);
 
-  return nscd_getserv_r (portstr, portstr + sizeof (portstr) - cp, proto,
+  return nscd_getserv_r (cp, portstr + sizeof (portstr) - cp, proto,
                         GETSERVBYPORT, result_buf, buf, buflen, result);
 }
 
index 4a0cabd..782b101 100644 (file)
@@ -185,7 +185,8 @@ cache_addpw (struct database_dyn *db, int fd, request_header *req,
       n = snprintf (buf, buf_len, "%d%c%n%s", pwd->pw_uid, '\0',
                    &key_offset, (char *) key) + 1;
 
-      written = total = (sizeof (struct dataset) + pw_name_len + pw_passwd_len
+      written = total = (offsetof (struct dataset, strdata)
+                        + pw_name_len + pw_passwd_len
                         + pw_gecos_len + pw_dir_len + pw_shell_len);
 
       /* If we refill the cache, first assume the reconrd did not
@@ -247,16 +248,28 @@ cache_addpw (struct database_dyn *db, int fd, request_header *req,
       char *key_copy = cp + key_offset;
       assert (key_copy == (char *) rawmemchr (cp, '\0') + 1);
 
+      assert (cp == dataset->strdata + total - offsetof (struct dataset,
+                                                        strdata));
+
       /* Now we can determine whether on refill we have to create a new
         record or not.  */
       if (he != NULL)
        {
          assert (fd == -1);
 
-         if (total + n == dh->allocsize
-             && total - offsetof (struct dataset, resp) == dh->recsize
+#if 0
+         if (dataset->head.datasize == dh->allocsize
+             && dataset->head.recsize == dh->recsize
              && memcmp (&dataset->resp, dh->data,
                         dh->allocsize - offsetof (struct dataset, resp)) == 0)
+#else
+         if (dataset->head.allocsize != dh->allocsize)
+           goto nnn;
+         if (dataset->head.recsize != dh->recsize)
+           goto nnn;
+         if(memcmp (&dataset->resp, dh->data,
+                        dh->allocsize - offsetof (struct dataset, resp)) == 0)
+#endif
            {
              /* The data has not changed.  We will just bump the
                 timeout value.  Note that the new record has been
@@ -266,6 +279,7 @@ cache_addpw (struct database_dyn *db, int fd, request_header *req,
            }
          else
            {
+ nnn:;
              /* We have to create a new record.  Just allocate
                 appropriate memory and copy it.  */
              struct dataset *newp
index c952fa1..44f12a3 100644 (file)
@@ -173,7 +173,7 @@ cache_addserv (struct database_dyn *db, int fd, request_header *req,
          total += s_aliases_len[cnt];
        }
 
-      total += (sizeof (struct dataset)
+      total += (offsetof (struct dataset, strdata)
                + s_name_len
                + s_proto_len
                + s_aliases_cnt * sizeof (uint32_t));
index b7d9617..73081ec 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991-2002, 2003, 2004, 2005, 2006, 2007
+/* Copyright (C) 1991-2002, 2003, 2004, 2005, 2006, 2007, 2008
    Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
@@ -1075,8 +1075,7 @@ globfree (pglob)
     {
       size_t i;
       for (i = 0; i < pglob->gl_pathc; ++i)
-       if (pglob->gl_pathv[pglob->gl_offs + i] != NULL)
-         free (pglob->gl_pathv[pglob->gl_offs + i]);
+       free (pglob->gl_pathv[pglob->gl_offs + i]);
       free (pglob->gl_pathv);
       pglob->gl_pathv = NULL;
     }
index 43bcd3a..8bc6e91 100644 (file)
@@ -1,6 +1,6 @@
 /* Copyright (c) 1983, 1989
  *    The Regents of the University of California.  All rights reserved.
- * 
+ *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
@@ -12,7 +12,7 @@
  * 4. Neither the name of the University nor the names of its contributors
  *    may be used to endorse or promote products derived from this software
  *    without specific prior written permission.
- * 
+ *
  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
@@ -161,6 +161,7 @@ typedef struct {
 #define        T_SRV           ns_t_srv
 #define T_ATMA         ns_t_atma
 #define T_NAPTR                ns_t_naptr
+#define T_DNAME                ns_t_dname
 #define        T_TSIG          ns_t_tsig
 #define        T_IXFR          ns_t_ixfr
 #define T_AXFR         ns_t_axfr
index d998ebf..f99db1c 100644 (file)
@@ -1072,12 +1072,13 @@ gaih_getanswer_slice (const querybuf *answer, int anslen, const char *qname,
       if (__builtin_expect (type == T_SIG, 0)
          || __builtin_expect (type == T_KEY, 0)
          || __builtin_expect (type == T_NXT, 0)
-         || __builtin_expect (type == T_PTR, 0))
+         || __builtin_expect (type == T_PTR, 0)
+         || __builtin_expect (type == T_DNAME, 0))
        {
          /* We don't support DNSSEC yet.  For now, ignore the record
             and send a low priority message to syslog.
 
-            We also don't expect T_PTR messages.  */
+            We also don't expect T_PTR or T_DNAME messages.  */
          syslog (LOG_DEBUG | LOG_AUTH,
                  "getaddrinfo*.gaih_getanswer: got type \"%s\"",
                  p_type (type));
index a15ae14..cccd68c 100644 (file)
@@ -48,7 +48,7 @@ o-objects.ob  := memcpy.o memset.o memchr.o
 
 strop-tests    := memchr memcmp memcpy memmove mempcpy memset memccpy  \
                   stpcpy stpncpy strcat strchr strcmp strcpy strcspn   \
-                  strlen strncmp strncpy strpbrk strrchr strspn
+                  strlen strncmp strncpy strpbrk strrchr strspn memmem
 tests          := tester inl-tester noinl-tester testcopy test-ffs     \
                   tst-strlen stratcliff tst-svc tst-inlcall            \
                   bug-strncat1 bug-strspn1 bug-strpbrk1 tst-bswap      \
diff --git a/string/test-memmem.c b/string/test-memmem.c
new file mode 100644 (file)
index 0000000..91b661b
--- /dev/null
@@ -0,0 +1,185 @@
+/* Test and measure memmem functions.
+   Copyright (C) 2008 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Written by Ulrich Drepper <drepper@redhat.com>, 2008.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#define TEST_MAIN
+#define BUF1PAGES 20
+#define ITERATIONS 500
+#include "test-string.h"
+
+typedef char *(*proto_t) (const void *, size_t, const void *, size_t);
+void *simple_memmem (const void *, size_t, const void *, size_t);
+
+IMPL (simple_memmem, 0)
+IMPL (memmem, 1)
+
+void *
+simple_memmem (const void *haystack, size_t haystack_len, const void *needle,
+              size_t needle_len)
+{
+  const char *begin;
+  const char *const last_possible
+    = (const char *) haystack + haystack_len - needle_len;
+
+  if (needle_len == 0)
+    /* The first occurrence of the empty string is deemed to occur at
+       the beginning of the string.  */
+    return (void *) haystack;
+
+  /* Sanity check, otherwise the loop might search through the whole
+     memory.  */
+  if (__builtin_expect (haystack_len < needle_len, 0))
+    return NULL;
+
+  for (begin = (const char *) haystack; begin <= last_possible; ++begin)
+    if (begin[0] == ((const char *) needle)[0] &&
+        !memcmp ((const void *) &begin[1],
+                 (const void *) ((const char *) needle + 1),
+                 needle_len - 1))
+      return (void *) begin;
+
+  return NULL;
+}
+
+static void
+do_one_test (impl_t *impl, const void *haystack, size_t haystack_len,
+            const void *needle, size_t needle_len, const void *expected)
+{
+  void *res;
+
+  res = CALL (impl, haystack, haystack_len, needle, needle_len);
+  if (res != expected)
+    {
+      error (0, 0, "Wrong result in function %s %p %p", impl->name,
+            res, expected);
+      ret = 1;
+      return;
+    }
+
+  if (HP_TIMING_AVAIL)
+    {
+      hp_timing_t start __attribute ((unused));
+      hp_timing_t stop __attribute ((unused));
+      hp_timing_t best_time = ~ (hp_timing_t) 0;
+      size_t i;
+
+      for (i = 0; i < 32; ++i)
+       {
+         HP_TIMING_NOW (start);
+         CALL (impl, haystack, haystack_len, needle, needle_len);
+         HP_TIMING_NOW (stop);
+         HP_TIMING_BEST (best_time, start, stop);
+       }
+
+      printf ("\t%zd", (size_t) best_time);
+    }
+}
+
+static void
+do_test (const char *str, size_t len, size_t idx)
+{
+  char tmpbuf[len];
+
+  memcpy (tmpbuf, buf1 + idx, len);
+  memcpy (buf1 + idx, str, len);
+
+  if (HP_TIMING_AVAIL)
+    printf ("String %s, offset %zd:", str, idx);
+
+  FOR_EACH_IMPL (impl, 0)
+    do_one_test (impl, buf1, BUF1PAGES * page_size, str, len, buf1 + idx);
+
+  memcpy (buf1 + idx, tmpbuf, len);
+
+  if (HP_TIMING_AVAIL)
+    putchar ('\n');
+}
+
+static void
+do_random_tests (void)
+{
+  for (size_t n = 0; n < ITERATIONS; ++n)
+    {
+      char tmpbuf[32];
+
+      size_t shift = random () % 11;
+      size_t rel = random () % ((2 << (shift + 1)) * 64);
+      size_t idx = MIN ((2 << shift) * 64 + rel, BUF1PAGES * page_size - 2);
+      size_t len = random () % (sizeof (tmpbuf) - 1) + 1;
+      len = MIN (len, BUF1PAGES * page_size - idx - 1);
+      memcpy (tmpbuf, buf1 + idx, len);
+      for (size_t i = random () % len / 2 + 1; i > 0; --i)
+       {
+         size_t off = random () % len;
+         char ch = '0' + random () % 10;
+
+         buf1[idx + off] = ch;
+       }
+
+      if (HP_TIMING_AVAIL)
+       printf ("String %.*s, offset %zd:", (int) len, buf1 + idx, idx);
+
+      FOR_EACH_IMPL (impl, 0)
+       do_one_test (impl, buf1, BUF1PAGES * page_size, buf1 + idx, len,
+                    buf1 + idx);
+
+      if (HP_TIMING_AVAIL)
+       putchar ('\n');
+
+      memcpy (buf1 + idx, tmpbuf, len);
+    }
+}
+
+
+static const char *const strs[] =
+  {
+    "00000", "00112233", "0123456789", "0000111100001111",
+    "00000111110000022222", "012345678901234567890",
+    "abc0", "aaaa0", "abcabc0"
+  };
+
+
+int
+test_main (void)
+{
+  size_t i;
+
+  test_init ();
+
+  printf ("%23s", "");
+  FOR_EACH_IMPL (impl, 0)
+    printf ("\t%s", impl->name);
+  putchar ('\n');
+
+  for (i = 0; i < BUF1PAGES * page_size; ++i)
+    buf1[i] = 60 + random () % 32;
+
+  for (i = 0; i < sizeof (strs) / sizeof (strs[0]); ++i)
+    for (size_t j = 0; j < 120; j += 7)
+      {
+       size_t len = strlen (strs[i]);
+
+       do_test (strs[i], len, j);
+      }
+
+  do_random_tests ();
+  return ret;
+}
+
+#include "../test-skeleton.c"
index 381c140..1aea4c9 100644 (file)
@@ -1,5 +1,5 @@
 /* Test and measure string and memory functions.
-   Copyright (C) 1999, 2002, 2004 Free Software Foundation, Inc.
+   Copyright (C) 1999, 2002, 2004, 2008 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Written by Jakub Jelinek <jakub@redhat.com>, 1999.
 
@@ -118,6 +118,10 @@ size_t iterations = 100000;
     }                                                                  \
   while (0)
 
+#ifndef BUF1PAGES
+# define BUF1PAGES 1
+#endif
+
 static void
 test_init (void)
 {
@@ -126,11 +130,11 @@ test_init (void)
   if (page_size < MIN_PAGE_SIZE)
     page_size = MIN_PAGE_SIZE;
 #endif
-  buf1 = mmap (0, 2 * page_size, PROT_READ | PROT_WRITE,
+  buf1 = mmap (0, (BUF1PAGES + 1) * page_size, PROT_READ | PROT_WRITE,
               MAP_PRIVATE | MAP_ANON, -1, 0);
   if (buf1 == MAP_FAILED)
     error (EXIT_FAILURE, errno, "mmap failed");
-  if (mprotect (buf1 + page_size, page_size, PROT_NONE))
+  if (mprotect (buf1 + BUF1PAGES * page_size, page_size, PROT_NONE))
     error (EXIT_FAILURE, errno, "mprotect failed");
   buf2 = mmap (0, 2 * page_size, PROT_READ | PROT_WRITE,
               MAP_PRIVATE | MAP_ANON, -1, 0);
@@ -145,7 +149,7 @@ test_init (void)
       srandom (seed);
     }
 
-  memset (buf1, 0xa5, page_size);
+  memset (buf1, 0xa5, BUF1PAGES * page_size);
   memset (buf2, 0x5a, page_size);
 }