diff --git a/ChangeLog b/ChangeLog index abbe3a8bd2..d75612464b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2003-06-16 Ulrich Drepper + + * elf/rtld.c (dl_main): Use l_map_start not l_addr in Phdr + computation so that prelinking wroks. + 2003-06-15 Ulrich Drepper * elf/dl-iteratephdr.c (__dl_iterate_phdr): Don't skip dynamic @@ -51,7 +56,7 @@ * include/netinet/in.h (inet6_option_alloc): Add libc_hidden_proto definition. - * inet/netinet/ip6.h (IP6OPT_PAD1, IP6OPT_PADn): Define. + * inet/netinet/ip6.h (IP6OPT_PAD1, IP6OPT_PADN): Define. * inet/netinet/in.h: Add prototypes for inet6_option_* functions. * inet/Makefile (routines): Add inet6_option. * inet/inet6_option.c: New file. diff --git a/elf/rtld.c b/elf/rtld.c index 5347a5f7b8..4a086c2d32 100644 --- a/elf/rtld.c +++ b/elf/rtld.c @@ -933,8 +933,8 @@ of this helper program; chances are you did not intend to run this program.\n\ /* Set up the program header information for the dynamic linker itself. It is needed in the dl_iterate_phdr() callbacks. */ - ElfW(Ehdr) *rtld_ehdr = (ElfW(Ehdr) *) GL(dl_rtld_map.l_addr); - GL(dl_rtld_map).l_phdr = (ElfW(Phdr) *) (GL(dl_rtld_map.l_addr) + ElfW(Ehdr) *rtld_ehdr = (ElfW(Ehdr) *) GL(dl_rtld_map).l_map_start; + GL(dl_rtld_map).l_phdr = (ElfW(Phdr) *) (GL(dl_rtld_map).l_map_start + rtld_ehdr->e_phoff); GL(dl_rtld_map).l_phnum = rtld_ehdr->e_phnum; diff --git a/localedata/locales/an_ES b/localedata/locales/an_ES new file mode 100644 index 0000000000..30eafaf741 --- /dev/null +++ b/localedata/locales/an_ES @@ -0,0 +1,126 @@ +comment_char % +escape_char / +% +% Aragonese Language Locale for Spain +% Source: +% Address: +% Contact: Jordi Mallach Pérez +% Email: jordi@gnu.org +% Language: an +% Territory: ES +% Revision: 1.0 +% Date: 2003-05-22 +% Application: general +% Users: general +% Charset: ISO-8859-1 +% +% This file is under the +% GNU General Public License. +% Based in the gl_ES Locale + +LC_IDENTIFICATION +title "Aragonese locale for Spain" +source "" +address "" +contact "Jordi Mallach Pérez" +email "bug-glibc@gnu.org" +tel "" +fax "" +language "an" +territory "ES" +revision "1.0" +date "2003-06-15" +% +category "i18n:1999";LC_IDENTIFICATION +category "i18n:1999";LC_CTYPE +category "i18n:1999";LC_COLLATE +category "i18n:1999";LC_TIME +category "posix:1993";LC_NUMERIC +category "i18n:1999";LC_MONETARY +category "i18n:1999";LC_MESSAGES +category "i18n:1999";LC_PAPER +category "i18n:1999";LC_NAME +category "i18n:1999";LC_ADDRESS +category "i18n:1999";LC_TELEPHONE +END LC_IDENTIFICATION + +LC_COLLATE +copy "es_ES" +END LC_COLLATE + +LC_CTYPE +copy "es_ES" +END LC_CTYPE + +LC_MESSAGES +yesexpr "" +noexpr "" +END LC_MESSAGES + +LC_MONETARY +copy "es_ES" +END LC_MONETARY + +LC_NUMERIC +copy "es_ES" +END LC_NUMERIC + +LC_TIME +abday "";"";/ + "";"";/ + "";"";/ + "" +day "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "" +abmon "";"";/ + "";"";/ + "";"";/ + "";"";/ + "";"";/ + "";"" +mon "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "" +d_t_fmt "" +d_fmt "" +t_fmt "" +am_pm "";"" +t_fmt_ampm "" +date_fmt "/ +/ +" +END LC_TIME + +LC_PAPER +copy "es_ES" +END LC_PAPER + +LC_TELEPHONE +copy "es_ES" +END LC_TELEPHONE + +LC_MEASUREMENT +copy "es_ES" +END LC_MEASUREMENT + +LC_NAME +copy "es_ES" +END LC_NAME + +LC_ADDRESS +copy "es_ES" +END LC_ADDRESS diff --git a/localedata/locales/is_IS b/localedata/locales/is_IS index a62aa35f11..d2da32b61b 100644 --- a/localedata/locales/is_IS +++ b/localedata/locales/is_IS @@ -2185,35 +2185,35 @@ grouping 3;3 END LC_NUMERIC LC_TIME -abday "";"";/ - "";"";/ - "";"";/ - "" -day "";/ - "";/ - "";/ - "";/ - "";/ - "";/ - "" -abmon "";"";/ - "";"";/ - "";"";/ - "";"";/ - "";"";/ - "";"" -mon "";/ - "";/ - "";/ - "";/ - "";/ - "";/ - "";/ - "";/ - "";/ - "";/ - "";/ - "" +abday "";"";/ + "";"";/ + "";"";/ + "" +day "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "" +abmon "";"";/ + "";"";/ + "";"";/ + "";"";/ + "";"";/ + "";"" +mon "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "" d_t_fmt "" d_fmt "" t_fmt "" diff --git a/localedata/tst-fmon.c b/localedata/tst-fmon.c index af87335972..091a057a0f 100644 --- a/localedata/tst-fmon.c +++ b/localedata/tst-fmon.c @@ -42,15 +42,12 @@ int main (int argc, char *argv[]) { char *s = malloc (201); - double monval; if (setlocale (LC_MONETARY, argv[1]) == NULL) { fprintf (stderr, "setlocale(LC_MONETARY, \"%s\"): %m\n", argv[1]); exit (EXIT_SETLOCALE); } - /* This is locale-dependent! see setlocale(3) for details */ - monval = strtod (argv[3], NULL); if (strfmon (s, 200, argv[2], (double) atof (argv[3])) == -1) { diff --git a/localedata/tst-fmon.sh b/localedata/tst-fmon.sh index e58db1d344..c8b6d69949 100755 --- a/localedata/tst-fmon.sh +++ b/localedata/tst-fmon.sh @@ -39,25 +39,26 @@ for cns in `cd ./tst-fmon-locales && ls tstfmon_*`; do done # Run the tests. +errcode=0 # There's a TAB for IFS while IFS=" " read locale format value expect; do case "$locale" in '#'*) continue ;; esac if [ -n "$format" ]; then - LOCPATH=${common_objpfx}localedata \ - GCONV_PATH=${common_objpfx}/iconvdata \ - ${run_program_prefix} ${common_objpfx}localedata/tst-fmon \ - "$locale" "$format" "$value" "$expect" - if [ $? -eq 0 ]; then + if LOCPATH=${common_objpfx}localedata \ + GCONV_PATH=${common_objpfx}/iconvdata \ + ${run_program_prefix} ${common_objpfx}localedata/tst-fmon \ + "$locale" "$format" "$value" "$expect" ; then echo "Locale: \"${locale}\" Format: \"${format}\"" \ "Value: \"${value}\" Expect: \"${expect}\" passed" else + errcode=$? echo "Locale: \"${locale}\" Format: \"${format}\"" \ "Value: \"${value}\" Expect: \"${expect}\" failed" fi fi done < $datafile -exit $? +exit $errcode # Local Variables: # mode:shell-script # End: diff --git a/localedata/tst-numeric.sh b/localedata/tst-numeric.sh index f590dfd042..f27eacd078 100644 --- a/localedata/tst-numeric.sh +++ b/localedata/tst-numeric.sh @@ -25,25 +25,27 @@ run_program_prefix=$2 datafile=$3 # Run the tests. +errcode=0 # There's a TAB for IFS while IFS=" " read locale format value expect; do case "$locale" in '#'*) continue ;; esac if [ -n "$format" ]; then - LOCPATH=${common_objpfx}localedata \ - GCONV_PATH=${common_objpfx}/iconvdata \ - ${run_program_prefix} ${common_objpfx}localedata/tst-numeric \ + if LOCPATH=${common_objpfx}localedata \ + GCONV_PATH=${common_objpfx}/iconvdata \ + ${run_program_prefix} ${common_objpfx}localedata/tst-numeric \ "$locale" "$format" "$value" "$expect" - if [ $? -eq 0 ]; then + then echo "Locale: \"${locale}\" Format: \"${format}\"" \ "Value: \"${value}\" Expect: \"${expect}\" passed" else + errcode=$? echo "Locale: \"${locale}\" Format: \"${format}\"" \ "Value: \"${value}\" Expect: \"${expect}\" failed" fi fi done < $datafile -exit $? +exit $errcode # Local Variables: # mode:shell-script # End: diff --git a/nptl/Makefile b/nptl/Makefile index 74ede7775b..28c745aed0 100644 --- a/nptl/Makefile +++ b/nptl/Makefile @@ -192,6 +192,7 @@ tests = tst-attr1 tst-attr2 \ tst-cancel1 tst-cancel2 tst-cancel3 tst-cancel4 tst-cancel5 \ tst-cancel6 tst-cancel7 tst-cancel8 tst-cancel9 tst-cancel10 \ tst-cancel11 tst-cancel12 tst-cancel13 tst-cancel14 tst-cancel15 \ + tst-cancel16 \ tst-cleanup0 tst-cleanup1 tst-cleanup2 tst-cleanup3 \ tst-flock1 tst-flock2 \ tst-signal1 tst-signal2 tst-signal3 tst-signal4 tst-signal5 \ @@ -222,6 +223,7 @@ ifeq ($(have-forced-unwind),yes) tests += tst-cancelx2 tst-cancelx3 tst-cancelx4 tst-cancelx5 \ tst-cancelx6 tst-cancelx7 tst-cancelx8 tst-cancelx9 tst-cancelx10 \ tst-cancelx11 tst-cancelx12 tst-cancelx13 tst-cancelx14 tst-cancelx15\ + tst-cancelx16 \ tst-cleanupx0 tst-cleanupx1 tst-cleanupx2 tst-cleanupx3 endif ifeq ($(build-shared),yes) @@ -336,6 +338,11 @@ CFLAGS-tst-cancelx8.c += -fexceptions CFLAGS-tst-cancelx9.c += -fexceptions CFLAGS-tst-cancelx10.c += -fexceptions CFLAGS-tst-cancelx11.c += -fexceptions +CFLAGS-tst-cancelx12.c += -fexceptions +CFLAGS-tst-cancelx13.c += -fexceptions +CFLAGS-tst-cancelx14.c += -fexceptions +CFLAGS-tst-cancelx15.c += -fexceptions +CFLAGS-tst-cancelx16.c += -fexceptions CFLAGS-tst-cleanupx0.c += -fexceptions -fasynchronous-unwind-tables CFLAGS-tst-cleanupx1.c += -fexceptions -fasynchronous-unwind-tables CFLAGS-tst-cleanupx2.c += -fexceptions diff --git a/nptl/tst-cancel16.c b/nptl/tst-cancel16.c new file mode 100644 index 0000000000..709902e97e --- /dev/null +++ b/nptl/tst-cancel16.c @@ -0,0 +1,231 @@ +/* Copyright (C) 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 2003. + + 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. */ + +#include +#include +#include +#include +#include +#include +#include +#include + + +static pthread_barrier_t b2; +static int fd; +static int called; + + +static void +cl (void *arg) +{ + called = 1; +} + + +static void * +tf (void *arg) +{ + int r = pthread_barrier_wait (&b2); + if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) + { + puts ("child thread: barrier_wait failed"); + exit (1); + } + + pthread_cleanup_push (cl, NULL); + + /* This call should never return. */ + (void) lockf (fd, F_LOCK, 0); + + pthread_cleanup_pop (0); + + return NULL; +} + + +static int +do_test (void) +{ + char fname[] = "/tmp/cancel16XXXXXX"; + fd = mkstemp (fname); + if (fd == -1) + { + puts ("mkstemp failed"); + return 1; + } + unlink (fname); + + char mem[sizeof (pthread_barrier_t)]; + memset (mem, '\0', sizeof (mem)); + if (TEMP_FAILURE_RETRY (pwrite (fd, mem, sizeof (mem), 0)) != sizeof (mem)) + { + puts ("pwrite failed"); + return 1; + } + + void *p = mmap (NULL, sizeof (mem), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); + if (p == MAP_FAILED) + { + puts ("mmap failed"); + return 1; + } + pthread_barrier_t *b = (pthread_barrier_t *) p; + + pthread_barrierattr_t ba; + if (pthread_barrierattr_init (&ba) != 0) + { + puts ("barrierattr_init failed"); + return 1; + } + if (pthread_barrierattr_setpshared (&ba, 1) != 0) + { + puts ("barrierattr_setshared failed"); + return 1; + } + + if (pthread_barrier_init (b, &ba, 2) != 0) + { + puts ("1st barrier_init failed"); + return 1; + } + if (pthread_barrierattr_destroy (&ba) != 0) + { + puts ("barrier_destroy failed"); + return 1; + } + + pid_t pid = fork (); + if (pid == 0) + { + /* Child. Lock the file and wait. */ + if (lockf (fd, F_LOCK, 0) != 0) + { + puts ("child process: lockf failed"); + _exit (1); + } + + int r = pthread_barrier_wait (b); + if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) + { + puts ("child process: 1st barrier_wait failed"); + _exit (1); + } + + /* Make sure the process dies. */ + alarm (5); + + r = pthread_barrier_wait (b); + if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) + { + puts ("child process: 2nd barrier_wait failed"); + _exit (1); + } + + _exit (0); + } + if (pid == -1) + { + puts ("fork failed"); + return 1; + } + + int r = pthread_barrier_wait (b); + if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) + { + puts ("main: 1st barrier_wait failed"); + _exit (1); + } + + if (pthread_barrier_init (&b2, NULL, 2) != 0) + { + puts ("2nd barrier_init failed"); + return 1; + } + + pthread_t th; + if (pthread_create (&th, NULL, tf, NULL) != 0) + { + puts ("create failed"); + return 1; + } + + r = pthread_barrier_wait (&b2); + if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) + { + puts ("main: 2nd barrier_wait failed"); + return 1; + } + + /* Delay. */ + sleep (1); + + if (pthread_cancel (th) != 0) + { + puts ("cancel failed"); + return 1; + } + + void *result; + if (pthread_join (th, &result) != 0) + { + puts ("join failed"); + return 1; + } + if (result != PTHREAD_CANCELED) + { + puts ("thread not canceled"); + return 1; + } + if (called == 0) + { + puts ("cleanup handler not called"); + return 1; + } + + r = pthread_barrier_wait (b); + if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) + { + puts ("main: 3rd barrier_wait failed"); + return 1; + } + + int status; + if (TEMP_FAILURE_RETRY (waitpid (pid, &status, 0)) != pid) + { + puts ("waitpid failed"); + return 1; + } + if (WEXITSTATUS (status) != 0) + { + printf ("child process exits with %d\n", WEXITSTATUS (status)); + return 1; + } + + if (lockf (fd, F_LOCK, 0) != 0) + { + puts ("main: lockf failed"); + return 1; + } + + return 0; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/nptl/tst-cancelx16.c b/nptl/tst-cancelx16.c new file mode 100644 index 0000000000..99af3b197c --- /dev/null +++ b/nptl/tst-cancelx16.c @@ -0,0 +1 @@ +#include "tst-cancel16.c"