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>
* libio/stdio.h (vscanf): Fix -std=c99 redirect.
@ -5,8 +55,8 @@
(CFLAGS-scanf17.c): New.
* stdio-common/scanf14.c (main): Add fscanf and scanf tests.
* stdio-common/scanf15.c (main): Likewise.
* stdio-common/scanf16.c: New test.
* stdio-common/scanf17.c: New test.
* stdio-common/scanf16.c: New file.
* stdio-common/scanf17.c: New file.
2008-05-24 Ulrich Drepper <drepper@redhat.com>
@ -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 <jakub@redhat.com>

View File

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

View File

@ -19,7 +19,7 @@
Summary: The GNU libc libraries
Name: glibc
Version: @glibcversion@
Release: 5
Release: 6
# GPLv2+ is used in a bunch of programs, LGPLv2+ is used for libraries.
# Things that are linked directly into dynamically linked programs
# and shared libraries (e.g. crt files, lib*_nonshared.a) have an additional
@ -976,6 +976,13 @@ rm -f *.filelist*
%endif
%changelog
* Thu Jun 12 2008 Jakub Jelinek <jakub@redhat.com> 2.8.90-6
- update from trunk
- nscd fixes (#450704)
- fix getservbyport (#449358)
- fix regexp.h (#446406)
- avoid crashing on T_DNAME in DNS responses (#450766)
* Sun May 25 2008 Jakub Jelinek <jakub@redhat.com> 2.8.90-5
- update from trunk

View File

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

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.
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;

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.
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;

View File

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

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.
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);
}

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

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>
David S. Miller <davem@davemloft.net>
David S. Miller <davem@davemloft.net>
* 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-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 \

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.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
@ -98,7 +98,7 @@ do_clone (struct pthread *pd, const struct pthread_attr *attr,
if (attr->cpuset != NULL)
{
res = INTERNAL_SYSCALL (sched_setaffinity, err, 3, pd->tid,
sizeof (cpu_set_t), attr->cpuset);
attr->cpusetsize, attr->cpuset);
if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (res, err), 0))
{

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.
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));

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -26,15 +26,41 @@ static int
do_test (void)
{
pthread_rwlock_t r;
pthread_rwlockattr_t at;
int e;
if (pthread_rwlock_init (&r, NULL) != 0)
if (pthread_rwlockattr_init (&at) != 0)
{
puts ("rwlockattr_init failed");
return 1;
}
puts ("rwlockattr_init succeeded");
#ifndef TYPE
# define TYPE PTHREAD_RWLOCK_PREFER_READER_NP
#endif
if (pthread_rwlockattr_setkind_np (&at, TYPE) != 0)
{
puts ("rwlockattr_setkind failed");
return 1;
}
puts ("rwlockattr_setkind succeeded");
if (pthread_rwlock_init (&r, &at) != 0)
{
puts ("rwlock_init failed");
return 1;
}
puts ("rwlock_init succeeded");
if (pthread_rwlockattr_destroy (&at) != 0)
{
puts ("rwlockattr_destroy failed");
return 1;
}
puts ("rwlockattr_destroy succeeded");
if (pthread_rwlock_wrlock (&r) != 0)
{
puts ("1st rwlock_wrlock failed");

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.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2005.
@ -21,6 +21,25 @@
#include <pthreadP.h>
#include <semaphore.h>
static const struct
{
const char *name;
size_t expected;
size_t is;
} types[] =
{
#define T(t, c) \
{ #t, c, sizeof (t) }
T (pthread_attr_t, __SIZEOF_PTHREAD_ATTR_T),
T (pthread_mutex_t, __SIZEOF_PTHREAD_MUTEX_T),
T (pthread_mutexattr_t, __SIZEOF_PTHREAD_MUTEXATTR_T),
T (pthread_cond_t, __SIZEOF_PTHREAD_COND_T),
T (pthread_condattr_t, __SIZEOF_PTHREAD_CONDATTR_T),
T (pthread_rwlock_t, __SIZEOF_PTHREAD_RWLOCK_T),
T (pthread_rwlockattr_t, __SIZEOF_PTHREAD_RWLOCKATTR_T),
T (pthread_barrier_t, __SIZEOF_PTHREAD_BARRIER_T),
T (pthread_barrierattr_t, __SIZEOF_PTHREAD_BARRIERATTR_T)
};
static int
do_test (void)
@ -62,6 +81,14 @@ do_test (void)
TEST_TYPE2 (sem_t, struct new_sem);
TEST_TYPE2 (sem_t, struct old_sem);
for (size_t i = 0; i < sizeof (types) / sizeof (types[0]); ++i)
if (types[i].expected != types[i].is)
{
printf ("%s: expected %zu, is %zu\n",
types[i].name, types[i].expected, types[i].is);
result = 1;
}
return result;
}

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];
}
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)

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

View File

@ -246,7 +246,8 @@ addinitgroupsX (struct database_dyn *db, int fd, request_header *req,
else
{
written = total = sizeof (struct dataset) + start * sizeof (int32_t);
written = total = (offsetof (struct dataset, strdata)
+ start * sizeof (int32_t));
/* If we refill the cache, first assume the reconrd did not
change. Allocate memory on the cache since it is likely
@ -307,6 +308,9 @@ addinitgroupsX (struct database_dyn *db, int fd, request_header *req,
/* Finally the user name. */
memcpy (cp, key, req->key_len);
assert (cp == dataset->strdata + total - offsetof (struct dataset,
strdata));
/* Now we can determine whether on refill we have to create a new
record or not. */
if (he != NULL)

View File

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

View File

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

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',
&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

View File

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

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.
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;
}

View File

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

View File

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

View File

@ -48,7 +48,7 @@ o-objects.ob := memcpy.o memset.o memchr.o
strop-tests := memchr memcmp memcpy memmove mempcpy memset memccpy \
stpcpy stpncpy strcat strchr strcmp strcpy strcspn \
strlen strncmp strncpy strpbrk strrchr strspn
strlen strncmp strncpy strpbrk strrchr strspn memmem
tests := tester inl-tester noinl-tester testcopy test-ffs \
tst-strlen stratcliff tst-svc tst-inlcall \
bug-strncat1 bug-strspn1 bug-strpbrk1 tst-bswap \

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