From 72d4ac23660326e76443cf18f0ed8c2e4792d268 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Thu, 12 Jun 2008 16:53:43 +0000 Subject: Updated to fedora-glibc-20080612T1619 --- ChangeLog | 56 ++++++- fedora/branch.mk | 4 +- fedora/glibc.spec.in | 9 +- include/inline-hashtab.h | 3 +- libio/freopen.c | 5 +- libio/freopen64.c | 5 +- locale/programs/ld-collate.c | 12 +- misc/fstab.c | 6 +- misc/regexp.h | 16 +- nptl/ChangeLog | 42 ++++- nptl/Makefile | 6 +- nptl/sysdeps/pthread/createthread.c | 4 +- nptl/sysdeps/pthread/pthread.h | 6 +- .../sysv/linux/i386/i486/pthread_barrier_wait.S | 19 +++ .../sysv/linux/i386/i486/pthread_cond_broadcast.S | 37 ++++- .../sysv/linux/i386/i486/pthread_cond_signal.S | 23 +++ .../sysv/linux/i386/i486/pthread_rwlock_rdlock.S | 13 ++ .../linux/i386/i486/pthread_rwlock_timedrdlock.S | 25 +++ .../linux/i386/i486/pthread_rwlock_timedwrlock.S | 25 +++ .../sysv/linux/i386/i486/pthread_rwlock_unlock.S | 14 +- .../sysv/linux/i386/i486/pthread_rwlock_wrlock.S | 13 ++ nptl/sysdeps/unix/sysv/linux/i386/i486/sem_post.S | 16 ++ .../sysv/linux/x86_64/pthread_rwlock_timedrdlock.S | 21 +++ .../sysv/linux/x86_64/pthread_rwlock_timedwrlock.S | 21 +++ nptl/tst-rwlock2.c | 28 +++- nptl/tst-rwlock2a.c | 2 + nptl/tst-typesizes.c | 29 +++- nscd/grpcache.c | 5 +- nscd/hstcache.c | 42 +++-- nscd/initgrcache.c | 6 +- nscd/mem.c | 9 +- nscd/nscd_getserv_r.c | 2 +- nscd/pwdcache.c | 20 ++- nscd/servicescache.c | 2 +- posix/glob.c | 5 +- resolv/arpa/nameser_compat.h | 5 +- resolv/nss_dns/dns-host.c | 5 +- string/Makefile | 2 +- string/test-memmem.c | 185 +++++++++++++++++++++ string/test-string.h | 12 +- 40 files changed, 678 insertions(+), 82 deletions(-) create mode 100644 nptl/tst-rwlock2a.c create mode 100644 string/test-memmem.c diff --git a/ChangeLog b/ChangeLog index 03cffb9713..fe655a4f8f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,53 @@ +2008-06-12 Ulrich Drepper + + * 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 + + * 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 + + * 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 + + * misc/regexp.h (compile): Use __REPB_PREFIX macro. + Avoid segfault if first GETC returns eof/'\0'/'\n'. + +2008-06-03 Jakub Jelinek + + * nscd/nscd_getserv_r.c (__nscd_getservbyport_r): Pass cp + instead of portstr to nscd_getserv_r. Patch by + Roman Kagan . + +2008-05-26 Jim Meyering + + 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 + + * 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 * 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 @@ -52,7 +102,7 @@ * 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 diff --git a/fedora/branch.mk b/fedora/branch.mk index 6e7d3e4540..6d65ef07e6 100644 --- a/fedora/branch.mk +++ b/fedora/branch.mk @@ -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 diff --git a/fedora/glibc.spec.in b/fedora/glibc.spec.in index 44aa01c1b2..38ccd97492 100644 --- a/fedora/glibc.spec.in +++ b/fedora/glibc.spec.in @@ -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 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 2.8.90-5 - update from trunk diff --git a/include/inline-hashtab.h b/include/inline-hashtab.h index ad361cd1ed..c359161c54 100644 --- a/include/inline-hashtab.h +++ b/include/inline-hashtab.h @@ -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); diff --git a/libio/freopen.c b/libio/freopen.c index d94a5629f1..d80815f918 100644 --- a/libio/freopen.c +++ b/libio/freopen.c @@ -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; diff --git a/libio/freopen64.c b/libio/freopen64.c index f8da78c46e..2dad6d7b4e 100644 --- a/libio/freopen64.c +++ b/libio/freopen64.c @@ -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; diff --git a/locale/programs/ld-collate.c b/locale/programs/ld-collate.c index 7af3b8aa92..bf50e77aab 100644 --- a/locale/programs/ld-collate.c +++ b/locale/programs/ld-collate.c @@ -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) diff --git a/misc/fstab.c b/misc/fstab.c index b434203a86..ab5581e9b7 100644 --- a/misc/fstab.c +++ b/misc/fstab.c @@ -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); } diff --git a/misc/regexp.h b/misc/regexp.h index b7b50b7105..0e979d2d87 100644 --- a/misc/regexp.h +++ b/misc/regexp.h @@ -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 , 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 diff --git a/nptl/ChangeLog b/nptl/ChangeLog index 95e478af2e..f74463b6f1 100644 --- a/nptl/ChangeLog +++ b/nptl/ChangeLog @@ -1,5 +1,45 @@ +2008-06-12 Ulrich Drepper + + * sysdeps/pthread/pthread.h: Remove inadvertant checkin. + +2008-05-17 Samuel Thibault + + * sysdeps/pthread/pthread.h: Fix typo in comment. + +2008-05-28 Ulrich Drepper + + * sysdeps/pthread/createthread.c (do_clone): Pass accurate length + of CPU set to the kernel. + +2008-05-23 Paul Pluzhnikov + + * 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 + + * 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 + + * tst-typesizes.c: Explicitly check __SIZEOF_PTHREAD_* constants. + 2008-05-20 Jakub Jelinek - David S. Miller + + David S. Miller * sysdeps/unix/sysv/linux/sparc/sparc64/Makefile: New file. diff --git a/nptl/Makefile b/nptl/Makefile index 5bfa9e0ba6..76d9e383e0 100644 --- a/nptl/Makefile +++ b/nptl/Makefile @@ -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 \ diff --git a/nptl/sysdeps/pthread/createthread.c b/nptl/sysdeps/pthread/createthread.c index 59e62c2dcf..66fafe8050 100644 --- a/nptl/sysdeps/pthread/createthread.c +++ b/nptl/sysdeps/pthread/createthread.c @@ -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 , 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)) { diff --git a/nptl/sysdeps/pthread/pthread.h b/nptl/sysdeps/pthread/pthread.h index f3ab0ae711..d5ffd383f5 100644 --- a/nptl/sysdeps/pthread/pthread.h +++ b/nptl/sysdeps/pthread/pthread.h @@ -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)); diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_barrier_wait.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_barrier_wait.S index 77d252de8f..040d7f8c33 100644 --- a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_barrier_wait.S +++ b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_barrier_wait.S @@ -27,7 +27,10 @@ .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 diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_broadcast.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_broadcast.S index 776c47f6cc..f46b4b874a 100644 --- a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_broadcast.S +++ b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_broadcast.S @@ -32,11 +32,19 @@ .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) diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_signal.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_signal.S index 36a18036c5..4909f49107 100644 --- a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_signal.S +++ b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_signal.S @@ -33,8 +33,13 @@ .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) diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S index 2ddeed072f..4e5f0c5b2a 100644 --- a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S +++ b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S @@ -30,8 +30,13 @@ .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 diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S index 89027284ec..2b84cd06c2 100644 --- a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S +++ b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S @@ -30,11 +30,21 @@ .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 diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S index 0cf02e057e..91652467c4 100644 --- a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S +++ b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S @@ -30,11 +30,21 @@ .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 diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S index bf9c33ea9f..aabb92960b 100644 --- a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S +++ b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S @@ -29,8 +29,13 @@ .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 diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S index d13bb5132c..100736499b 100644 --- a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S +++ b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S @@ -30,8 +30,13 @@ .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 diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_post.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_post.S index 2edcdde4f0..86992c877e 100644 --- a/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_post.S +++ b/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_post.S @@ -30,7 +30,10 @@ .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 diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S index 0fa2714426..366c96fc36 100644 --- a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S +++ b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S @@ -33,10 +33,19 @@ .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 diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedwrlock.S b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedwrlock.S index 1e43933ca9..dde6b58836 100644 --- a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedwrlock.S +++ b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedwrlock.S @@ -33,10 +33,19 @@ .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 diff --git a/nptl/tst-rwlock2.c b/nptl/tst-rwlock2.c index 6f38682b85..2d2e8e4a3e 100644 --- a/nptl/tst-rwlock2.c +++ b/nptl/tst-rwlock2.c @@ -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 index 0000000000..615de5c015 --- /dev/null +++ b/nptl/tst-rwlock2a.c @@ -0,0 +1,2 @@ +#define TYPE PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP +#include "tst-rwlock2.c" diff --git a/nptl/tst-typesizes.c b/nptl/tst-typesizes.c index 17a1e297d3..545cee6bd1 100644 --- a/nptl/tst-typesizes.c +++ b/nptl/tst-typesizes.c @@ -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 , 2005. @@ -21,6 +21,25 @@ #include #include +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; } diff --git a/nscd/grpcache.c b/nscd/grpcache.c index e391dc3984..c49c0e1906 100644 --- a/nscd/grpcache.c +++ b/nscd/grpcache.c @@ -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) diff --git a/nscd/hstcache.c b/nscd/hstcache.c index d4dd51f11a..4333917ba0 100644 --- a/nscd/hstcache.c +++ b/nscd/hstcache.c @@ -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, ¬found, total, - MSG_NOSIGNAL)); + if (fd != -1 && + TEMP_FAILURE_RETRY (send (fd, ¬found, 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__, diff --git a/nscd/initgrcache.c b/nscd/initgrcache.c index 3355df5164..c5693c6be5 100644 --- a/nscd/initgrcache.c +++ b/nscd/initgrcache.c @@ -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) diff --git a/nscd/mem.c b/nscd/mem.c index 96ff03f0df..e821729dab 100644 --- a/nscd/mem.c +++ b/nscd/mem.c @@ -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) { diff --git a/nscd/nscd_getserv_r.c b/nscd/nscd_getserv_r.c index 3cd5a24298..b1ad7e2e43 100644 --- a/nscd/nscd_getserv_r.c +++ b/nscd/nscd_getserv_r.c @@ -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); } diff --git a/nscd/pwdcache.c b/nscd/pwdcache.c index 4a0cabd240..782b101371 100644 --- a/nscd/pwdcache.c +++ b/nscd/pwdcache.c @@ -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 diff --git a/nscd/servicescache.c b/nscd/servicescache.c index c952fa12c8..44f12a3c69 100644 --- a/nscd/servicescache.c +++ b/nscd/servicescache.c @@ -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)); diff --git a/posix/glob.c b/posix/glob.c index b7d9617267..73081ece66 100644 --- a/posix/glob.c +++ b/posix/glob.c @@ -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; } diff --git a/resolv/arpa/nameser_compat.h b/resolv/arpa/nameser_compat.h index 43bcd3affe..8bc6e913dc 100644 --- a/resolv/arpa/nameser_compat.h +++ b/resolv/arpa/nameser_compat.h @@ -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 diff --git a/resolv/nss_dns/dns-host.c b/resolv/nss_dns/dns-host.c index d998ebf4f5..f99db1c64f 100644 --- a/resolv/nss_dns/dns-host.c +++ b/resolv/nss_dns/dns-host.c @@ -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)); diff --git a/string/Makefile b/string/Makefile index a15ae14644..cccd68cf45 100644 --- a/string/Makefile +++ b/string/Makefile @@ -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 index 0000000000..91b661b163 --- /dev/null +++ b/string/test-memmem.c @@ -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 , 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" diff --git a/string/test-string.h b/string/test-string.h index 381c140d9f..1aea4c9cb9 100644 --- a/string/test-string.h +++ b/string/test-string.h @@ -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 , 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); } -- cgit v1.2.3