Updated to fedora-glibc-20080612T1619

This commit is contained in:
Jakub Jelinek 2008-06-12 16:53:43 +00:00
parent 8ba7d5cebb
commit 72d4ac2366
40 changed files with 678 additions and 82 deletions

View File

@ -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> 2008-05-24 Jakub Jelinek <jakub@redhat.com>
* libio/stdio.h (vscanf): Fix -std=c99 redirect. * libio/stdio.h (vscanf): Fix -std=c99 redirect.
@ -5,8 +55,8 @@
(CFLAGS-scanf17.c): New. (CFLAGS-scanf17.c): New.
* stdio-common/scanf14.c (main): Add fscanf and scanf tests. * stdio-common/scanf14.c (main): Add fscanf and scanf tests.
* stdio-common/scanf15.c (main): Likewise. * stdio-common/scanf15.c (main): Likewise.
* stdio-common/scanf16.c: New test. * stdio-common/scanf16.c: New file.
* stdio-common/scanf17.c: New test. * stdio-common/scanf17.c: New file.
2008-05-24 Ulrich Drepper <drepper@redhat.com> 2008-05-24 Ulrich Drepper <drepper@redhat.com>
@ -52,7 +102,7 @@
* sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h * sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h
(__SYSCALL_CLOBBERS): Likewise. (__SYSCALL_CLOBBERS): Likewise.
* scripts/data/localplt-sparc-linux-gnu.data: New file. * 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> 2008-05-21 Jakub Jelinek <jakub@redhat.com>

View File

@ -3,5 +3,5 @@ glibc-branch := fedora
glibc-base := HEAD glibc-base := HEAD
DIST_BRANCH := devel DIST_BRANCH := devel
COLLECTION := dist-f8 COLLECTION := dist-f8
fedora-sync-date := 2008-05-24 22:18 UTC fedora-sync-date := 2008-06-12 16:19 UTC
fedora-sync-tag := fedora-glibc-20080524T2218 fedora-sync-tag := fedora-glibc-20080612T1619

View File

@ -19,7 +19,7 @@
Summary: The GNU libc libraries Summary: The GNU libc libraries
Name: glibc Name: glibc
Version: @glibcversion@ Version: @glibcversion@
Release: 5 Release: 6
# GPLv2+ is used in a bunch of programs, LGPLv2+ is used for libraries. # GPLv2+ is used in a bunch of programs, LGPLv2+ is used for libraries.
# Things that are linked directly into dynamically linked programs # Things that are linked directly into dynamically linked programs
# and shared libraries (e.g. crt files, lib*_nonshared.a) have an additional # and shared libraries (e.g. crt files, lib*_nonshared.a) have an additional
@ -976,6 +976,13 @@ rm -f *.filelist*
%endif %endif
%changelog %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 * Sun May 25 2008 Jakub Jelinek <jakub@redhat.com> 2.8.90-5
- update from trunk - update from trunk

View File

@ -142,8 +142,7 @@ htab_delete (struct hashtab *htab)
int i; int i;
for (i = htab->size - 1; i >= 0; i--) for (i = htab->size - 1; i >= 0; i--)
if (htab->entries[i]) free (htab->entries[i]);
free (htab->entries[i]);
if (htab->free) if (htab->free)
htab->free (htab->entries); htab->free (htab->entries);

View 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. Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
@ -80,8 +80,7 @@ freopen (filename, mode, fp)
if (fd != -1) if (fd != -1)
{ {
__close (fd); __close (fd);
if (filename != NULL) free ((char *) filename);
free ((char *) filename);
} }
_IO_release_lock (fp); _IO_release_lock (fp);
return result; return result;

View 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. Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
@ -64,8 +64,7 @@ freopen64 (filename, mode, fp)
if (fd != -1) if (fd != -1)
{ {
__close (fd); __close (fd);
if (filename != NULL) free ((char *) filename);
free ((char *) filename);
} }
_IO_release_lock (fp); _IO_release_lock (fp);
return result; return result;

View File

@ -2961,8 +2961,7 @@ collate_read (struct linereader *ldfile, struct localedef_t *result,
else else
{ {
col_elem_free: col_elem_free:
if (symbol != NULL) free ((char *) symbol);
free ((char *) symbol);
free (arg->val.str.startmb); free (arg->val.str.startmb);
free (arg->val.str.startwc); 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); arg = lr_token (ldfile, charmap, result, repertoire, verbose);
if (arg->tok != tok_bsymbol) if (arg->tok != tok_bsymbol)
{ {
if (newname != NULL) free ((char *) newname);
free ((char *) newname);
goto err_label; goto err_label;
} }
@ -3157,10 +3155,8 @@ collate_read (struct linereader *ldfile, struct localedef_t *result,
"LC_COLLATE"); "LC_COLLATE");
sym_equiv_free: sym_equiv_free:
if (newname != NULL) free ((char *) newname);
free ((char *) newname); free ((char *) symname);
if (symname != NULL)
free ((char *) symname);
break; break;
} }
if (symname == NULL) if (symname == NULL)

View 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. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -185,6 +186,5 @@ libc_freeres_fn (fstab_free)
char *buffer; char *buffer;
buffer = fstab_state.fs_buffer; buffer = fstab_state.fs_buffer;
if (buffer != NULL) free ((void *) buffer);
free ((void *) buffer);
} }

View 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. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
@ -129,8 +130,9 @@ compile (char *__restrict instring, char *__restrict expbuf,
__expr_ptr = (regex_t *) expbuf; __expr_ptr = (regex_t *) expbuf;
/* The remaining space in the buffer can be used for the compiled /* The remaining space in the buffer can be used for the compiled
pattern. */ pattern. */
__expr_ptr->buffer = expbuf + sizeof (regex_t); __expr_ptr->__REPB_PREFIX (buffer) = expbuf + sizeof (regex_t);
__expr_ptr->allocated = endbuf - (char *) __expr_ptr->buffer; __expr_ptr->__REPB_PREFIX (allocated)
= endbuf - (char *) __expr_ptr->__REPB_PREFIX (buffer);
while ((__ch = (GETC ())) != eof) while ((__ch = (GETC ())) != eof)
{ {
@ -162,7 +164,10 @@ compile (char *__restrict instring, char *__restrict expbuf,
} }
__input_buffer[__current_size++] = __ch; __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. */ /* Now compile the pattern. */
__error = regcomp (__expr_ptr, __input_buffer, REG_NEWLINE); __error = regcomp (__expr_ptr, __input_buffer, REG_NEWLINE);
@ -198,7 +203,8 @@ compile (char *__restrict instring, char *__restrict expbuf,
} }
/* Everything is ok. */ /* Everything is ok. */
RETURN ((char *) (__expr_ptr->buffer + __expr_ptr->used)); RETURN ((char *) (__expr_ptr->__REPB_PREFIX (buffer)
+ __expr_ptr->__REPB_PREFIX (used)));
} }
#endif #endif

View 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> 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. * sysdeps/unix/sysv/linux/sparc/sparc64/Makefile: New file.

View File

@ -210,9 +210,9 @@ tests = tst-typesizes \
tst-robust6 tst-robust7 tst-robust8 tst-robust9 \ tst-robust6 tst-robust7 tst-robust8 tst-robust9 \
tst-robustpi1 tst-robustpi2 tst-robustpi3 tst-robustpi4 tst-robustpi5 \ tst-robustpi1 tst-robustpi2 tst-robustpi3 tst-robustpi4 tst-robustpi5 \
tst-robustpi6 tst-robustpi7 tst-robustpi8 tst-robustpi9 \ tst-robustpi6 tst-robustpi7 tst-robustpi8 tst-robustpi9 \
tst-rwlock1 tst-rwlock2 tst-rwlock3 tst-rwlock4 tst-rwlock5 \ tst-rwlock1 tst-rwlock2 tst-rwlock2a tst-rwlock3 tst-rwlock4 \
tst-rwlock6 tst-rwlock7 tst-rwlock8 tst-rwlock9 tst-rwlock10 \ tst-rwlock5 tst-rwlock6 tst-rwlock7 tst-rwlock8 tst-rwlock9 \
tst-rwlock11 tst-rwlock12 tst-rwlock13 tst-rwlock14 \ tst-rwlock10 tst-rwlock11 tst-rwlock12 tst-rwlock13 tst-rwlock14 \
tst-once1 tst-once2 tst-once3 tst-once4 \ tst-once1 tst-once2 tst-once3 tst-once4 \
tst-key1 tst-key2 tst-key3 tst-key4 \ tst-key1 tst-key2 tst-key3 tst-key4 \
tst-sem1 tst-sem2 tst-sem3 tst-sem4 tst-sem5 tst-sem6 tst-sem7 \ tst-sem1 tst-sem2 tst-sem3 tst-sem4 tst-sem5 tst-sem6 tst-sem7 \

View 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. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. 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) if (attr->cpuset != NULL)
{ {
res = INTERNAL_SYSCALL (sched_setaffinity, err, 3, pd->tid, 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)) if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (res, err), 0))
{ {

View 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. Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
@ -127,7 +127,7 @@ enum
# if __WORDSIZE == 64 # if __WORDSIZE == 64
# define PTHREAD_RWLOCK_WRITER_NONRECURSIVE_INITIALIZER_NP \ # define PTHREAD_RWLOCK_WRITER_NONRECURSIVE_INITIALIZER_NP \
{ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP } } PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP } }
# else # else
# if __BYTE_ORDER == __LITTLE_ENDIAN # if __BYTE_ORDER == __LITTLE_ENDIAN
# define PTHREAD_RWLOCK_WRITER_NONRECURSIVE_INITIALIZER_NP \ # 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 /* 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. */ and destroyed with pthread_attr_destroy when no longer needed. */
extern int pthread_getattr_np (pthread_t __th, pthread_attr_t *__attr) extern int pthread_getattr_np (pthread_t __th, pthread_attr_t *__attr)
__THROW __nonnull ((2)); __THROW __nonnull ((2));

View File

@ -27,7 +27,10 @@
.type pthread_barrier_wait,@function .type pthread_barrier_wait,@function
.align 16 .align 16
pthread_barrier_wait: pthread_barrier_wait:
cfi_startproc
pushl %ebx pushl %ebx
cfi_adjust_cfa_offset(4)
cfi_offset(%ebx, -8)
movl 8(%esp), %ebx movl 8(%esp), %ebx
@ -45,6 +48,8 @@ pthread_barrier_wait:
/* There are more threads to come. */ /* There are more threads to come. */
pushl %esi pushl %esi
cfi_adjust_cfa_offset(4)
cfi_offset(%esi, -12)
#if CURR_EVENT == 0 #if CURR_EVENT == 0
movl (%ebx), %edx movl (%ebx), %edx
@ -101,9 +106,16 @@ pthread_barrier_wait:
10: movl %esi, %eax /* != PTHREAD_BARRIER_SERIAL_THREAD */ 10: movl %esi, %eax /* != PTHREAD_BARRIER_SERIAL_THREAD */
popl %esi popl %esi
cfi_adjust_cfa_offset(-4)
cfi_restore(%esi)
popl %ebx popl %ebx
cfi_adjust_cfa_offset(-4)
cfi_restore(%ebx)
ret ret
cfi_adjust_cfa_offset(4)
cfi_offset(%ebx, -8)
/* The necessary number of threads arrived. */ /* The necessary number of threads arrived. */
3: 3:
#if CURR_EVENT == 0 #if CURR_EVENT == 0
@ -140,8 +152,12 @@ pthread_barrier_wait:
5: orl $-1, %eax /* == PTHREAD_BARRIER_SERIAL_THREAD */ 5: orl $-1, %eax /* == PTHREAD_BARRIER_SERIAL_THREAD */
popl %ebx popl %ebx
cfi_adjust_cfa_offset(-4)
cfi_restore(%ebx)
ret ret
cfi_adjust_cfa_offset(4)
cfi_offset(%ebx, -8)
1: movl PRIVATE(%ebx), %ecx 1: movl PRIVATE(%ebx), %ecx
leal MUTEX(%ebx), %edx leal MUTEX(%ebx), %edx
xorl $LLL_SHARED, %ecx xorl $LLL_SHARED, %ecx
@ -154,6 +170,8 @@ pthread_barrier_wait:
call __lll_unlock_wake call __lll_unlock_wake
jmp 5b jmp 5b
cfi_adjust_cfa_offset(4)
cfi_offset(%esi, -12)
6: movl PRIVATE(%ebx), %ecx 6: movl PRIVATE(%ebx), %ecx
leal MUTEX(%ebx), %eax leal MUTEX(%ebx), %eax
xorl $LLL_SHARED, %ecx xorl $LLL_SHARED, %ecx
@ -165,4 +183,5 @@ pthread_barrier_wait:
xorl $LLL_SHARED, %ecx xorl $LLL_SHARED, %ecx
call __lll_unlock_wake call __lll_unlock_wake
jmp 10b jmp 10b
cfi_endproc
.size pthread_barrier_wait,.-pthread_barrier_wait .size pthread_barrier_wait,.-pthread_barrier_wait

View File

@ -32,11 +32,19 @@
.type __pthread_cond_broadcast, @function .type __pthread_cond_broadcast, @function
.align 16 .align 16
__pthread_cond_broadcast: __pthread_cond_broadcast:
cfi_startproc
pushl %ebx pushl %ebx
cfi_adjust_cfa_offset(4)
pushl %esi pushl %esi
cfi_adjust_cfa_offset(4)
pushl %edi pushl %edi
cfi_adjust_cfa_offset(4)
pushl %ebp 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 movl 20(%esp), %ebx
@ -114,11 +122,24 @@ __pthread_cond_broadcast:
10: xorl %eax, %eax 10: xorl %eax, %eax
popl %ebp popl %ebp
cfi_adjust_cfa_offset(-4)
cfi_restore(%ebp)
popl %edi popl %edi
cfi_adjust_cfa_offset(-4)
cfi_restore(%edi)
popl %esi popl %esi
cfi_adjust_cfa_offset(-4)
cfi_restore(%esi)
popl %ebx popl %ebx
cfi_adjust_cfa_offset(-4)
cfi_restore(%ebx)
ret ret
cfi_adjust_cfa_offset(16)
cfi_offset(%ebx, -8)
cfi_offset(%esi, -12)
cfi_offset(%edi, -16)
cfi_offset(%ebp, -20)
.align 16 .align 16
/* Unlock. */ /* Unlock. */
4: LOCK 4: LOCK
@ -127,11 +148,24 @@ __pthread_cond_broadcast:
6: xorl %eax, %eax 6: xorl %eax, %eax
popl %ebp popl %ebp
cfi_adjust_cfa_offset(-4)
cfi_restore(%ebp)
popl %edi popl %edi
cfi_adjust_cfa_offset(-4)
cfi_restore(%edi)
popl %esi popl %esi
cfi_adjust_cfa_offset(-4)
cfi_restore(%esi)
popl %ebx popl %ebx
cfi_adjust_cfa_offset(-4)
cfi_restore(%ebx)
ret 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. */ /* Initial locking failed. */
1: 1:
#if cond_lock == 0 #if cond_lock == 0
@ -199,6 +233,7 @@ __pthread_cond_broadcast:
movl $SYS_futex, %eax movl $SYS_futex, %eax
ENTER_KERNEL ENTER_KERNEL
jmp 10b jmp 10b
cfi_endproc
.size __pthread_cond_broadcast, .-__pthread_cond_broadcast .size __pthread_cond_broadcast, .-__pthread_cond_broadcast
versioned_symbol (libpthread, __pthread_cond_broadcast, pthread_cond_broadcast, versioned_symbol (libpthread, __pthread_cond_broadcast, pthread_cond_broadcast,
GLIBC_2_3_2) GLIBC_2_3_2)

View File

@ -33,8 +33,13 @@
.align 16 .align 16
__pthread_cond_signal: __pthread_cond_signal:
cfi_startproc
pushl %ebx pushl %ebx
cfi_adjust_cfa_offset(4)
pushl %edi pushl %edi
cfi_adjust_cfa_offset(4)
cfi_offset(%ebx, -8)
cfi_offset(%edi, -12)
movl 12(%esp), %edi movl 12(%esp), %edi
@ -69,7 +74,12 @@ __pthread_cond_signal:
/* Wake up one thread. */ /* Wake up one thread. */
pushl %esi pushl %esi
cfi_adjust_cfa_offset(4)
pushl %ebp pushl %ebp
cfi_adjust_cfa_offset(4)
cfi_offset(%esi, -16)
cfi_offset(%ebp, -20)
#if FUTEX_PRIVATE_FLAG > 255 #if FUTEX_PRIVATE_FLAG > 255
xorl %ecx, %ecx xorl %ecx, %ecx
#endif #endif
@ -91,7 +101,11 @@ __pthread_cond_signal:
ENTER_KERNEL */ ENTER_KERNEL */
int $0x80 int $0x80
popl %ebp popl %ebp
cfi_adjust_cfa_offset(-4)
cfi_restore(%ebp)
popl %esi popl %esi
cfi_adjust_cfa_offset(-4)
cfi_restore(%esi)
/* For any kind of error, we try again with WAKE. /* For any kind of error, we try again with WAKE.
The general test also covers running on old kernels. */ The general test also covers running on old kernels. */
@ -100,9 +114,17 @@ __pthread_cond_signal:
6: xorl %eax, %eax 6: xorl %eax, %eax
popl %edi popl %edi
cfi_adjust_cfa_offset(-4)
cfi_restore(%edi)
popl %ebx popl %ebx
cfi_adjust_cfa_offset(-4)
cfi_restore(%ebx)
ret ret
cfi_adjust_cfa_offset(8)
cfi_offset(%ebx, -8)
cfi_offset(%edi, -12)
7: /* %ecx should be either FUTEX_WAKE_OP or 7: /* %ecx should be either FUTEX_WAKE_OP or
FUTEX_WAKE_OP|FUTEX_PRIVATE_FLAG from the previous syscall. */ FUTEX_WAKE_OP|FUTEX_PRIVATE_FLAG from the previous syscall. */
xorl $(FUTEX_WAKE ^ FUTEX_WAKE_OP), %ecx xorl $(FUTEX_WAKE ^ FUTEX_WAKE_OP), %ecx
@ -152,6 +174,7 @@ __pthread_cond_signal:
call __lll_lock_wait call __lll_lock_wait
jmp 2b jmp 2b
cfi_endproc
.size __pthread_cond_signal, .-__pthread_cond_signal .size __pthread_cond_signal, .-__pthread_cond_signal
versioned_symbol (libpthread, __pthread_cond_signal, pthread_cond_signal, versioned_symbol (libpthread, __pthread_cond_signal, pthread_cond_signal,
GLIBC_2_3_2) GLIBC_2_3_2)

View File

@ -30,8 +30,13 @@
.type __pthread_rwlock_rdlock,@function .type __pthread_rwlock_rdlock,@function
.align 16 .align 16
__pthread_rwlock_rdlock: __pthread_rwlock_rdlock:
cfi_startproc
pushl %esi pushl %esi
cfi_adjust_cfa_offset(4)
pushl %ebx pushl %ebx
cfi_adjust_cfa_offset(4)
cfi_offset(%esi, -8)
cfi_offset(%ebx, -12)
xorl %esi, %esi xorl %esi, %esi
movl 12(%esp), %ebx movl 12(%esp), %ebx
@ -113,9 +118,16 @@ __pthread_rwlock_rdlock:
movl %edx, %eax movl %edx, %eax
popl %ebx popl %ebx
cfi_adjust_cfa_offset(-4)
cfi_restore(%ebx)
popl %esi popl %esi
cfi_adjust_cfa_offset(-4)
cfi_restore(%esi)
ret ret
cfi_adjust_cfa_offset(8)
cfi_offset(%esi, -8)
cfi_offset(%ebx, -12)
1: 1:
#if MUTEX == 0 #if MUTEX == 0
movl %ebx, %edx movl %ebx, %edx
@ -171,6 +183,7 @@ __pthread_rwlock_rdlock:
movzbl PSHARED(%ebx), %ecx movzbl PSHARED(%ebx), %ecx
call __lll_lock_wait call __lll_lock_wait
jmp 13b jmp 13b
cfi_endproc
.size __pthread_rwlock_rdlock,.-__pthread_rwlock_rdlock .size __pthread_rwlock_rdlock,.-__pthread_rwlock_rdlock
.globl pthread_rwlock_rdlock .globl pthread_rwlock_rdlock

View File

@ -30,11 +30,21 @@
.type pthread_rwlock_timedrdlock,@function .type pthread_rwlock_timedrdlock,@function
.align 16 .align 16
pthread_rwlock_timedrdlock: pthread_rwlock_timedrdlock:
cfi_startproc
pushl %esi pushl %esi
cfi_adjust_cfa_offset(4)
pushl %edi pushl %edi
cfi_adjust_cfa_offset(4)
pushl %ebx pushl %ebx
cfi_adjust_cfa_offset(4)
pushl %ebp 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 subl $8, %esp
cfi_adjust_cfa_offset(8)
movl 28(%esp), %ebp movl 28(%esp), %ebp
movl 32(%esp), %edi movl 32(%esp), %edi
@ -150,12 +160,26 @@ pthread_rwlock_timedrdlock:
7: movl %edx, %eax 7: movl %edx, %eax
addl $8, %esp addl $8, %esp
cfi_adjust_cfa_offset(-8)
popl %ebp popl %ebp
cfi_adjust_cfa_offset(-4)
cfi_restore(%ebp)
popl %ebx popl %ebx
cfi_adjust_cfa_offset(-4)
cfi_restore(%ebx)
popl %edi popl %edi
cfi_adjust_cfa_offset(-4)
cfi_restore(%edi)
popl %esi popl %esi
cfi_adjust_cfa_offset(-4)
cfi_restore(%esi)
ret ret
cfi_adjust_cfa_offset(24)
cfi_offset(%esi, -8)
cfi_offset(%edi, -12)
cfi_offset(%ebx, -16)
cfi_offset(%ebp, -20)
1: 1:
#if MUTEX == 0 #if MUTEX == 0
movl %ebp, %edx movl %ebp, %edx
@ -216,4 +240,5 @@ pthread_rwlock_timedrdlock:
19: movl $EINVAL, %edx 19: movl $EINVAL, %edx
jmp 9b jmp 9b
cfi_endproc
.size pthread_rwlock_timedrdlock,.-pthread_rwlock_timedrdlock .size pthread_rwlock_timedrdlock,.-pthread_rwlock_timedrdlock

View File

@ -30,11 +30,21 @@
.type pthread_rwlock_timedwrlock,@function .type pthread_rwlock_timedwrlock,@function
.align 16 .align 16
pthread_rwlock_timedwrlock: pthread_rwlock_timedwrlock:
cfi_startproc
pushl %esi pushl %esi
cfi_adjust_cfa_offset(4)
pushl %edi pushl %edi
cfi_adjust_cfa_offset(4)
pushl %ebx pushl %ebx
cfi_adjust_cfa_offset(4)
pushl %ebp 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 subl $8, %esp
cfi_adjust_cfa_offset(8)
movl 28(%esp), %ebp movl 28(%esp), %ebp
movl 32(%esp), %edi movl 32(%esp), %edi
@ -148,12 +158,26 @@ pthread_rwlock_timedwrlock:
7: movl %edx, %eax 7: movl %edx, %eax
addl $8, %esp addl $8, %esp
cfi_adjust_cfa_offset(-8)
popl %ebp popl %ebp
cfi_adjust_cfa_offset(-4)
cfi_restore(%ebp)
popl %ebx popl %ebx
cfi_adjust_cfa_offset(-4)
cfi_restore(%ebx)
popl %edi popl %edi
cfi_adjust_cfa_offset(-4)
cfi_restore(%edi)
popl %esi popl %esi
cfi_adjust_cfa_offset(-4)
cfi_restore(%esi)
ret ret
cfi_adjust_cfa_offset(24)
cfi_offset(%esi, -8)
cfi_offset(%edi, -12)
cfi_offset(%ebx, -16)
cfi_offset(%ebp, -20)
1: 1:
#if MUTEX == 0 #if MUTEX == 0
movl %ebp, %edx movl %ebp, %edx
@ -209,4 +233,5 @@ pthread_rwlock_timedwrlock:
19: movl $EINVAL, %edx 19: movl $EINVAL, %edx
jmp 9b jmp 9b
cfi_endproc
.size pthread_rwlock_timedwrlock,.-pthread_rwlock_timedwrlock .size pthread_rwlock_timedwrlock,.-pthread_rwlock_timedwrlock

View File

@ -29,8 +29,13 @@
.type __pthread_rwlock_unlock,@function .type __pthread_rwlock_unlock,@function
.align 16 .align 16
__pthread_rwlock_unlock: __pthread_rwlock_unlock:
cfi_startproc
pushl %ebx pushl %ebx
cfi_adjust_cfa_offset(4)
pushl %edi pushl %edi
cfi_adjust_cfa_offset(4)
cfi_offset(%ebx, -8)
cfi_offset(%edi, -12)
movl 12(%esp), %edi movl 12(%esp), %edi
@ -87,9 +92,16 @@ __pthread_rwlock_unlock:
xorl %eax, %eax xorl %eax, %eax
popl %edi popl %edi
cfi_adjust_cfa_offset(-4)
cfi_restore(%edi)
popl %ebx popl %ebx
cfi_adjust_cfa_offset(-4)
cfi_restore(%ebx)
ret ret
cfi_adjust_cfa_offset(8)
cfi_offset(%ebx, -8)
cfi_offset(%edi, -12)
.align 16 .align 16
6: LOCK 6: LOCK
#if MUTEX == 0 #if MUTEX == 0
@ -133,7 +145,7 @@ __pthread_rwlock_unlock:
movzbl PSHARED(%edi), %ecx movzbl PSHARED(%edi), %ecx
call __lll_unlock_wake call __lll_unlock_wake
jmp 8b jmp 8b
cfi_endproc
.size __pthread_rwlock_unlock,.-__pthread_rwlock_unlock .size __pthread_rwlock_unlock,.-__pthread_rwlock_unlock
.globl pthread_rwlock_unlock .globl pthread_rwlock_unlock

View File

@ -30,8 +30,13 @@
.type __pthread_rwlock_wrlock,@function .type __pthread_rwlock_wrlock,@function
.align 16 .align 16
__pthread_rwlock_wrlock: __pthread_rwlock_wrlock:
cfi_startproc
pushl %esi pushl %esi
cfi_adjust_cfa_offset(4)
pushl %ebx pushl %ebx
cfi_adjust_cfa_offset(4)
cfi_offset(%esi, -8)
cfi_offset(%ebx, -12)
xorl %esi, %esi xorl %esi, %esi
movl 12(%esp), %ebx movl 12(%esp), %ebx
@ -111,9 +116,16 @@ __pthread_rwlock_wrlock:
movl %edx, %eax movl %edx, %eax
popl %ebx popl %ebx
cfi_adjust_cfa_offset(-4)
cfi_restore(%ebx)
popl %esi popl %esi
cfi_adjust_cfa_offset(-4)
cfi_restore(%esi)
ret ret
cfi_adjust_cfa_offset(8)
cfi_offset(%esi, -8)
cfi_offset(%ebx, -12)
1: 1:
#if MUTEX == 0 #if MUTEX == 0
movl %ebx, %edx movl %ebx, %edx
@ -162,6 +174,7 @@ __pthread_rwlock_wrlock:
movzbl PSHARED(%ebx), %ecx movzbl PSHARED(%ebx), %ecx
call __lll_lock_wait call __lll_lock_wait
jmp 13b jmp 13b
cfi_endproc
.size __pthread_rwlock_wrlock,.-__pthread_rwlock_wrlock .size __pthread_rwlock_wrlock,.-__pthread_rwlock_wrlock
.globl pthread_rwlock_wrlock .globl pthread_rwlock_wrlock

View File

@ -30,7 +30,10 @@
.type __new_sem_post,@function .type __new_sem_post,@function
.align 16 .align 16
__new_sem_post: __new_sem_post:
cfi_startproc
pushl %ebx pushl %ebx
cfi_adjust_cfa_offset(4)
cfi_offset(%ebx, -8)
movl 8(%esp), %ebx movl 8(%esp), %ebx
@ -64,8 +67,12 @@ __new_sem_post:
2: xorl %eax, %eax 2: xorl %eax, %eax
popl %ebx popl %ebx
cfi_adjust_cfa_offset(-4)
cfi_restore(%ebx)
ret ret
cfi_adjust_cfa_offset(4)
cfi_offset(%ebx, -8)
1: 1:
#ifdef PIC #ifdef PIC
call __i686.get_pc_thunk.bx call __i686.get_pc_thunk.bx
@ -116,14 +123,20 @@ __new_sem_post:
orl $-1, %eax orl $-1, %eax
popl %ebx popl %ebx
cfi_adjust_cfa_offset(-4)
cfi_restore(%ebx)
ret ret
cfi_endproc
.size __new_sem_post,.-__new_sem_post .size __new_sem_post,.-__new_sem_post
versioned_symbol(libpthread, __new_sem_post, sem_post, GLIBC_2_1) versioned_symbol(libpthread, __new_sem_post, sem_post, GLIBC_2_1)
#if SHLIB_COMPAT(libpthread, GLIBC_2_0, GLIBC_2_1) #if SHLIB_COMPAT(libpthread, GLIBC_2_0, GLIBC_2_1)
.global __old_sem_post .global __old_sem_post
.type __old_sem_post,@function .type __old_sem_post,@function
__old_sem_post: __old_sem_post:
cfi_startproc
pushl %ebx pushl %ebx
cfi_adjust_cfa_offset(4)
cfi_offset(%ebx, -8)
movl 8(%esp), %ebx movl 8(%esp), %ebx
LOCK LOCK
@ -139,7 +152,10 @@ __old_sem_post:
xorl %eax, %eax xorl %eax, %eax
popl %ebx popl %ebx
cfi_adjust_cfa_offset(-4)
cfi_restore(%ebx)
ret ret
cfi_endproc
.size __old_sem_post,.-__old_sem_post .size __old_sem_post,.-__old_sem_post
compat_symbol(libpthread, __old_sem_post, sem_post, GLIBC_2_0) compat_symbol(libpthread, __old_sem_post, sem_post, GLIBC_2_0)
#endif #endif

View File

@ -33,10 +33,19 @@
.type pthread_rwlock_timedrdlock,@function .type pthread_rwlock_timedrdlock,@function
.align 16 .align 16
pthread_rwlock_timedrdlock: pthread_rwlock_timedrdlock:
cfi_startproc
pushq %r12 pushq %r12
cfi_adjust_cfa_offset(8)
pushq %r13 pushq %r13
cfi_adjust_cfa_offset(8)
pushq %r14 pushq %r14
cfi_adjust_cfa_offset(8)
cfi_offset(%r12, -16)
cfi_offset(%r13, -24)
cfi_offset(%r14, -32)
subq $16, %rsp subq $16, %rsp
cfi_adjust_cfa_offset(16)
movq %rdi, %r12 movq %rdi, %r12
movq %rsi, %r13 movq %rsi, %r13
@ -155,11 +164,22 @@ pthread_rwlock_timedrdlock:
7: movq %rdx, %rax 7: movq %rdx, %rax
addq $16, %rsp addq $16, %rsp
cfi_adjust_cfa_offset(-16)
popq %r14 popq %r14
cfi_adjust_cfa_offset(-8)
cfi_restore(%r14)
popq %r13 popq %r13
cfi_adjust_cfa_offset(-8)
cfi_restore(%r13)
popq %r12 popq %r12
cfi_adjust_cfa_offset(-8)
cfi_restore(%r12)
retq retq
cfi_adjust_cfa_offset(40)
cfi_offset(%r12, -16)
cfi_offset(%r13, -24)
cfi_offset(%r14, -32)
1: movl PSHARED(%rdi), %esi 1: movl PSHARED(%rdi), %esi
#if MUTEX != 0 #if MUTEX != 0
addq $MUTEX, %rdi addq $MUTEX, %rdi
@ -214,4 +234,5 @@ pthread_rwlock_timedrdlock:
19: movl $EINVAL, %edx 19: movl $EINVAL, %edx
jmp 9b jmp 9b
cfi_endproc
.size pthread_rwlock_timedrdlock,.-pthread_rwlock_timedrdlock .size pthread_rwlock_timedrdlock,.-pthread_rwlock_timedrdlock

View File

@ -33,10 +33,19 @@
.type pthread_rwlock_timedwrlock,@function .type pthread_rwlock_timedwrlock,@function
.align 16 .align 16
pthread_rwlock_timedwrlock: pthread_rwlock_timedwrlock:
cfi_startproc
pushq %r12 pushq %r12
cfi_adjust_cfa_offset(8)
pushq %r13 pushq %r13
cfi_adjust_cfa_offset(8)
pushq %r14 pushq %r14
cfi_adjust_cfa_offset(8)
cfi_offset(%r12, -16)
cfi_offset(%r13, -24)
cfi_offset(%r14, -32)
subq $16, %rsp subq $16, %rsp
cfi_adjust_cfa_offset(16)
movq %rdi, %r12 movq %rdi, %r12
movq %rsi, %r13 movq %rsi, %r13
@ -152,11 +161,22 @@ pthread_rwlock_timedwrlock:
7: movq %rdx, %rax 7: movq %rdx, %rax
addq $16, %rsp addq $16, %rsp
cfi_adjust_cfa_offset(-16)
popq %r14 popq %r14
cfi_adjust_cfa_offset(-8)
cfi_restore(%r14)
popq %r13 popq %r13
cfi_adjust_cfa_offset(-8)
cfi_restore(%r13)
popq %r12 popq %r12
cfi_adjust_cfa_offset(-8)
cfi_restore(%r12)
retq retq
cfi_adjust_cfa_offset(40)
cfi_offset(%r12, -16)
cfi_offset(%r13, -24)
cfi_offset(%r14, -32)
1: movl PSHARED(%rdi), %esi 1: movl PSHARED(%rdi), %esi
#if MUTEX != 0 #if MUTEX != 0
addq $MUTEX, %rdi addq $MUTEX, %rdi
@ -206,4 +226,5 @@ pthread_rwlock_timedwrlock:
19: movl $EINVAL, %edx 19: movl $EINVAL, %edx
jmp 9b jmp 9b
cfi_endproc
.size pthread_rwlock_timedwrlock,.-pthread_rwlock_timedwrlock .size pthread_rwlock_timedwrlock,.-pthread_rwlock_timedwrlock

View File

@ -26,15 +26,41 @@ static int
do_test (void) do_test (void)
{ {
pthread_rwlock_t r; pthread_rwlock_t r;
pthread_rwlockattr_t at;
int e; 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"); puts ("rwlock_init failed");
return 1; return 1;
} }
puts ("rwlock_init succeeded"); 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) if (pthread_rwlock_wrlock (&r) != 0)
{ {
puts ("1st rwlock_wrlock failed"); puts ("1st rwlock_wrlock failed");

2
nptl/tst-rwlock2a.c Normal file
View File

@ -0,0 +1,2 @@
#define TYPE PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP
#include "tst-rwlock2.c"

View 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. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2005. Contributed by Ulrich Drepper <drepper@redhat.com>, 2005.
@ -21,6 +21,25 @@
#include <pthreadP.h> #include <pthreadP.h>
#include <semaphore.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 static int
do_test (void) do_test (void)
@ -62,6 +81,14 @@ do_test (void)
TEST_TYPE2 (sem_t, struct new_sem); TEST_TYPE2 (sem_t, struct new_sem);
TEST_TYPE2 (sem_t, struct old_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; return result;
} }

View 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]; 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_mem_cnt * sizeof (uint32_t)
+ gr_name_len + gr_passwd_len + gr_mem_len_total); + 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; char *key_copy = cp + key_offset;
assert (key_copy == (char *) rawmemchr (cp, '\0') + 1); 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 /* Now we can determine whether on refill we have to create a new
record or not. */ record or not. */
if (he != NULL) if (he != NULL)

View File

@ -83,8 +83,7 @@ cache_addhst (struct database_dyn *db, int fd, request_header *req,
struct hashentry *he, struct datahead *dh, int errval, struct hashentry *he, struct datahead *dh, int errval,
int32_t ttl) int32_t ttl)
{ {
ssize_t total; bool all_written = true;
ssize_t written;
time_t t = time (NULL); time_t t = time (NULL);
/* We allocate all data in one memory block: the iov vector, /* 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) if (reload_count != UINT_MAX)
/* Do not reset the value if we never not reload the record. */ /* Do not reset the value if we never not reload the record. */
dh->nreloads = reload_count - 1; dh->nreloads = reload_count - 1;
written = total = 0;
} }
else else
{ {
/* We have no data. This means we send the standard reply for this /* We have no data. This means we send the standard reply for this
case. */ case. */
written = total = sizeof (notfound); ssize_t total = sizeof (notfound);
if (fd != -1) if (fd != -1 &&
written = TEMP_FAILURE_RETRY (send (fd, &notfound, total, TEMP_FAILURE_RETRY (send (fd, &notfound, total,
MSG_NOSIGNAL)); MSG_NOSIGNAL)) != total)
all_written = false;
dataset = mempool_alloc (db, sizeof (struct dataset) + req->key_len, dataset = mempool_alloc (db, sizeof (struct dataset) + req->key_len,
IDX_result_data); IDX_result_data);
@ -181,6 +179,7 @@ cache_addhst (struct database_dyn *db, int fd, request_header *req,
char *key_copy = NULL; char *key_copy = NULL;
char *cp; char *cp;
size_t cnt; size_t cnt;
ssize_t total;
/* Determine the number of aliases. */ /* Determine the number of aliases. */
h_aliases_cnt = 0; h_aliases_cnt = 0;
@ -208,7 +207,6 @@ cache_addhst (struct database_dyn *db, int fd, request_header *req,
+ h_name_len + h_name_len
+ h_aliases_cnt * sizeof (uint32_t) + h_aliases_cnt * sizeof (uint32_t)
+ h_addr_list_cnt * hst->h_length); + h_addr_list_cnt * hst->h_length);
written = total;
/* If we refill the cache, first assume the reconrd did not /* If we refill the cache, first assume the reconrd did not
change. Allocate memory on the cache since it is likely 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.h_addr_list_cnt = h_addr_list_cnt;
dataset->resp.error = NETDB_SUCCESS; dataset->resp.error = NETDB_SUCCESS;
/* Make sure there is no gap. */
assert ((char *) (&dataset->resp.error + 1) == dataset->strdata);
cp = dataset->strdata; cp = dataset->strdata;
cp = mempcpy (cp, hst->h_name, h_name_len); 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. */ we explicitly add the name here. */
key_copy = memcpy (cp, key, req->key_len); 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 /* Now we can determine whether on refill we have to create a new
record or not. */ record or not. */
if (he != NULL) if (he != NULL)
@ -351,20 +354,27 @@ cache_addhst (struct database_dyn *db, int fd, request_header *req,
<= (sizeof (struct database_pers_head) <= (sizeof (struct database_pers_head)
+ db->head->module * sizeof (ref_t) + db->head->module * sizeof (ref_t)
+ db->head->data_size)); + db->head->data_size));
written = sendfileall (fd, db->wr_fd, ssize_t written = sendfileall (fd, db->wr_fd,
(char *) &dataset->resp (char *) &dataset->resp
- (char *) db->head, total); - (char *) db->head,
dataset->head.recsize);
if (written != dataset->head.recsize)
{
# ifndef __ASSUME_SENDFILE # ifndef __ASSUME_SENDFILE
if (written == -1 && errno == ENOSYS) if (written == -1 && errno == ENOSYS)
goto use_write; goto use_write;
# endif # endif
all_written = false;
}
} }
else else
# ifndef __ASSUME_SENDFILE # ifndef __ASSUME_SENDFILE
use_write: use_write:
# endif # endif
#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 /* 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]; char buf[256];
dbg_log (_("short write in %s: %s"), __FUNCTION__, dbg_log (_("short write in %s: %s"), __FUNCTION__,

View File

@ -246,7 +246,8 @@ addinitgroupsX (struct database_dyn *db, int fd, request_header *req,
else 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 /* If we refill the cache, first assume the reconrd did not
change. Allocate memory on the cache since it is likely 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. */ /* Finally the user name. */
memcpy (cp, key, req->key_len); 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 /* Now we can determine whether on refill we have to create a new
record or not. */ record or not. */
if (he != NULL) if (he != NULL)

View File

@ -235,6 +235,11 @@ gc (struct database_dyn *db)
/* Sort the entries by their address. */ /* Sort the entries by their address. */
qsort (he, cnt, sizeof (struct hashentry *), sort_he); 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. */ /* Determine the highest used address. */
size_t high = nmark; size_t high = nmark;
while (high > 0 && mark[high - 1] == 0) while (high > 0 && mark[high - 1] == 0)
@ -307,10 +312,6 @@ gc (struct database_dyn *db)
size_t size; size_t size;
struct moveinfo *next; struct moveinfo *next;
} *moves = NULL; } *moves = NULL;
#define obstack_chunk_alloc xmalloc
#define obstack_chunk_free free
struct obstack ob;
obstack_init (&ob);
while (byte < high) while (byte < high)
{ {

View File

@ -53,7 +53,7 @@ __nscd_getservbyport_r (int port, const char *proto,
portstr[sizeof (portstr) - 1] = '\0'; portstr[sizeof (portstr) - 1] = '\0';
char *cp = _itoa_word (port, portstr + sizeof (portstr) - 1, 10, 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); GETSERVBYPORT, result_buf, buf, buflen, result);
} }

View 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', n = snprintf (buf, buf_len, "%d%c%n%s", pwd->pw_uid, '\0',
&key_offset, (char *) key) + 1; &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); + pw_gecos_len + pw_dir_len + pw_shell_len);
/* If we refill the cache, first assume the reconrd did not /* 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; char *key_copy = cp + key_offset;
assert (key_copy == (char *) rawmemchr (cp, '\0') + 1); 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 /* Now we can determine whether on refill we have to create a new
record or not. */ record or not. */
if (he != NULL) if (he != NULL)
{ {
assert (fd == -1); assert (fd == -1);
if (total + n == dh->allocsize #if 0
&& total - offsetof (struct dataset, resp) == dh->recsize if (dataset->head.datasize == dh->allocsize
&& dataset->head.recsize == dh->recsize
&& memcmp (&dataset->resp, dh->data, && memcmp (&dataset->resp, dh->data,
dh->allocsize - offsetof (struct dataset, resp)) == 0) 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 /* The data has not changed. We will just bump the
timeout value. Note that the new record has been 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 else
{ {
nnn:;
/* We have to create a new record. Just allocate /* We have to create a new record. Just allocate
appropriate memory and copy it. */ appropriate memory and copy it. */
struct dataset *newp struct dataset *newp

View File

@ -173,7 +173,7 @@ cache_addserv (struct database_dyn *db, int fd, request_header *req,
total += s_aliases_len[cnt]; total += s_aliases_len[cnt];
} }
total += (sizeof (struct dataset) total += (offsetof (struct dataset, strdata)
+ s_name_len + s_name_len
+ s_proto_len + s_proto_len
+ s_aliases_cnt * sizeof (uint32_t)); + s_aliases_cnt * sizeof (uint32_t));

View 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. Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
@ -1075,8 +1075,7 @@ globfree (pglob)
{ {
size_t i; size_t i;
for (i = 0; i < pglob->gl_pathc; ++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); free (pglob->gl_pathv);
pglob->gl_pathv = NULL; pglob->gl_pathv = NULL;
} }

View File

@ -1,6 +1,6 @@
/* Copyright (c) 1983, 1989 /* Copyright (c) 1983, 1989
* The Regents of the University of California. All rights reserved. * The Regents of the University of California. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
* are met: * are met:
@ -12,7 +12,7 @@
* 4. Neither the name of the University nor the names of its contributors * 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 * may be used to endorse or promote products derived from this software
* without specific prior written permission. * without specific prior written permission.
* *
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
@ -161,6 +161,7 @@ typedef struct {
#define T_SRV ns_t_srv #define T_SRV ns_t_srv
#define T_ATMA ns_t_atma #define T_ATMA ns_t_atma
#define T_NAPTR ns_t_naptr #define T_NAPTR ns_t_naptr
#define T_DNAME ns_t_dname
#define T_TSIG ns_t_tsig #define T_TSIG ns_t_tsig
#define T_IXFR ns_t_ixfr #define T_IXFR ns_t_ixfr
#define T_AXFR ns_t_axfr #define T_AXFR ns_t_axfr

View File

@ -1072,12 +1072,13 @@ gaih_getanswer_slice (const querybuf *answer, int anslen, const char *qname,
if (__builtin_expect (type == T_SIG, 0) if (__builtin_expect (type == T_SIG, 0)
|| __builtin_expect (type == T_KEY, 0) || __builtin_expect (type == T_KEY, 0)
|| __builtin_expect (type == T_NXT, 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 /* We don't support DNSSEC yet. For now, ignore the record
and send a low priority message to syslog. 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, syslog (LOG_DEBUG | LOG_AUTH,
"getaddrinfo*.gaih_getanswer: got type \"%s\"", "getaddrinfo*.gaih_getanswer: got type \"%s\"",
p_type (type)); p_type (type));

View File

@ -48,7 +48,7 @@ o-objects.ob := memcpy.o memset.o memchr.o
strop-tests := memchr memcmp memcpy memmove mempcpy memset memccpy \ strop-tests := memchr memcmp memcpy memmove mempcpy memset memccpy \
stpcpy stpncpy strcat strchr strcmp strcpy strcspn \ 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 \ tests := tester inl-tester noinl-tester testcopy test-ffs \
tst-strlen stratcliff tst-svc tst-inlcall \ tst-strlen stratcliff tst-svc tst-inlcall \
bug-strncat1 bug-strspn1 bug-strpbrk1 tst-bswap \ bug-strncat1 bug-strspn1 bug-strpbrk1 tst-bswap \

185
string/test-memmem.c Normal file
View File

@ -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"

View File

@ -1,5 +1,5 @@
/* Test and measure string and memory functions. /* 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. This file is part of the GNU C Library.
Written by Jakub Jelinek <jakub@redhat.com>, 1999. Written by Jakub Jelinek <jakub@redhat.com>, 1999.
@ -118,6 +118,10 @@ size_t iterations = 100000;
} \ } \
while (0) while (0)
#ifndef BUF1PAGES
# define BUF1PAGES 1
#endif
static void static void
test_init (void) test_init (void)
{ {
@ -126,11 +130,11 @@ test_init (void)
if (page_size < MIN_PAGE_SIZE) if (page_size < MIN_PAGE_SIZE)
page_size = MIN_PAGE_SIZE; page_size = MIN_PAGE_SIZE;
#endif #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); MAP_PRIVATE | MAP_ANON, -1, 0);
if (buf1 == MAP_FAILED) if (buf1 == MAP_FAILED)
error (EXIT_FAILURE, errno, "mmap 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"); error (EXIT_FAILURE, errno, "mprotect failed");
buf2 = mmap (0, 2 * page_size, PROT_READ | PROT_WRITE, buf2 = mmap (0, 2 * page_size, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANON, -1, 0); MAP_PRIVATE | MAP_ANON, -1, 0);
@ -145,7 +149,7 @@ test_init (void)
srandom (seed); srandom (seed);
} }
memset (buf1, 0xa5, page_size); memset (buf1, 0xa5, BUF1PAGES * page_size);
memset (buf2, 0x5a, page_size); memset (buf2, 0x5a, page_size);
} }