diff options
author | Jakub Jelinek <jakub@redhat.com> | 2005-07-21 08:25:57 +0000 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2005-07-21 08:25:57 +0000 |
commit | 736e2ab430e006ba09a2fe34d7887d3812ac808f (patch) | |
tree | f2d5948776e91112fcfd9199a757cd58e1be867a | |
parent | 366c71f353afc163b8d31c9db6e90919b5c2e1c0 (diff) | |
download | glibc-736e2ab430e006ba09a2fe34d7887d3812ac808f.tar.gz glibc-736e2ab430e006ba09a2fe34d7887d3812ac808f.tar.xz glibc-736e2ab430e006ba09a2fe34d7887d3812ac808f.zip |
Updated to fedora-glibc-20050721T0814
138 files changed, 3786 insertions, 872 deletions
diff --git a/ChangeLog b/ChangeLog index 66ad07ce84..9f8bfa838b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,281 @@ +2005-07-20 Ulrich Drepper <drepper@redhat.com> + + * sysdeps/x86_64/fpu/libm-test-ulps: Adjust expected atan2f results. + * sysdeps/powerpc/fpu/libm-test-ulps: Likewise. + * sysdeps/s390/fpu/libm-test-ulps: Likewise. + +2005-07-20 Bob Wilson <bob.wilson@acm.org> + Darin Petkov <darin@tensilica.com> + + * sysdeps/ieee754/flt-32/e_atan2f.c (pi_lo): Correct exponent value. + +2005-07-20 Jakub Jelinek <jakub@redhat.com> + + * include/stdio.h (__fxprintf): Remove wfmt argument. + * stdio-common/fxprintf.c: Include assert.h, ctype.h and wchar.h. + (__fxprintf): Remove wfmt argument, create wfmt format string on + the fly from fmt. + * argp/argp-fmtstream.c: Adjust all __fxprintf callers. + * argp/argp-help.c: Likewise. + * assert/assert-perr.c: Likewise. + * assert/assert.c: Likewise. + * gmon/gmon.c: Likewise. + * inet/rcmd.c: Likewise. + * malloc/obstack.c: Likewise. + * misc/error.c: Likewise. + * misc/getpass.c: Likewise. + * posix/getopt.c: Likewise. + * resolv/res_hconf.c: Likewise. + * stdio-common/perror.c: Likewise. + * stdio-common/psignal.c: Likewise. + * stdlib/fmtmsg.c: Likewise. + * sunrpc/auth_unix.c: Likewise. + * sunrpc/clnt_perr.c: Likewise. + * sunrpc/clnt_tcp.c: Likewise. + * sunrpc/clnt_udp.c: Likewise. + * sunrpc/clnt_unix.c: Likewise. + * sunrpc/svc_simple.c: Likewise. + * sunrpc/svc_tcp.c: Likewise. + * sunrpc/svc_udp.c: Likewise. + * sunrpc/svc_unix.c: Likewise. + * sunrpc/xdr.c: Likewise. + * sunrpc/xdr_array.c: Likewise. + * sunrpc/xdr_rec.c: Likewise. + * sunrpc/xdr_ref.c: Likewise. + * sysdeps/generic/wordexp.c: Likewise. + +2005-07-20 Ulrich Drepper <drepper@redhat.com> + + * wcsmbs/bits/wchar2.h: Add definitions for wcrtomb, mbsrtowcs, + wcsrtombs, mbsnrtowcs, and wcsnrtombs. + * debug/Makefile (routines): Add wcrtomb_chk, mbsrtowcs_chk, + wcsrtombs_chk, mbsnrtowcs_chk, and wcsnrtombs_chk. + * debug/Versions: Add __wcrtomb_chk, __mbsrtowcs_chk, + __wcsrtombs_chk, __mbsnrtowcs_chk, and __wcsnrtombs_chk. + * debug/tst-chk1.c: Add tests for new functions. + * debug/mbsnrtowcs_chk.c: New file. + * debug/mbsrtowcs_chk.c: New file. + * debug/wcrtomb_chk.c: New file. + * debug/wcsnrtombs_chk.c: New file. + * debug/wcsrtombs_chk.c: New file. + +2005-07-19 Ulrich Drepper <drepper@redhat.com> + + * stdio-common/Makefile (aux): Add fxprintf. + * stdio-common/fxprintf.c: New file. + * include/stdio.h: Add declaration for __fxprintf. + * argp/argp-fmtstream.c: Use __fxprintf instead of inline stream + orientation test and two separate function calls. + * argp/argp-help.c: Likewise. + * assert/assert-perr.c: Likewise. + * assert/assert.c: Likewise. + * gmon/gmon.c: Likewise. + * inet/rcmd.c: Likewise. + * malloc/obstack.c: Likewise. + * misc/error.c: Likewise. + * misc/getpass.c: Likewise. + * posix/getopt.c: Likewise. + * resolv/res_hconf.c: Likewise. + * stdio-common/perror.c: Likewise. + * stdio-common/psignal.c: Likewise. + * stdlib/fmtmsg.c: Likewise. + * sunrpc/auth_unix.c: Likewise. + * sunrpc/clnt_perr.c: Likewise. + * sunrpc/clnt_tcp.c: Likewise. + * sunrpc/clnt_udp.c: Likewise. + * sunrpc/clnt_unix.c: Likewise. + * sunrpc/svc_simple.c: Likewise. + * sunrpc/svc_tcp.c: Likewise. + * sunrpc/svc_udp.c: Likewise. + * sunrpc/svc_unix.c: Likewise. + * sunrpc/xdr.c: Likewise. + * sunrpc/xdr_array.c: Likewise. + * sunrpc/xdr_rec.c: Likewise. + * sunrpc/xdr_ref.c: Likewise. + * sysdeps/generic/wordexp.c: Likewise. + + * misc/Makefile: Add rules to build and run tst-error1. + * misc/tst-error1.c: New file. + * misc/error.c: Fix memory leak and possibly endless loop. + + * configure.in: Check for -fstack-protector gcc option. + * config.make.in (have-ssp): Add template. + * nscd/Makefile (nscd-cflags): Add -fstack-protector if supported. + + * nscd/nscd.c (main): Don't ignore result of chdir call. + +2005-07-18 Roland McGrath <roland@redhat.com> + + [BZ #869] + * Makerules ($(objpfx)stubs): Do cd into $(objdir) to reduce size of + objdump command line. + +2005-07-18 Ulrich Drepper <drepper@redhat.com> + + * nscd/Makefile (nscd-cflags): Add _FORTIFY_SOURCE. + + * nscd/connections.c: Fix a few wur warnings. + + [BZ #1113] + * nscd/grpcache.c (cache_addgr): Use correct maximum for group ID + length. Patch by Ivan Gyurdiev <ivg2@cornell.edu>. + + * debug/confstr_chk.c: New file. + * debug/getdomainname_chk.c: New file. + * debug/getgroups_chk.c: New file. + * debug/gethostname_chk.c: New file. + * debug/getlogin_r_chk.c: New file. + * debug/ttyname_r_chk.c: New file. + * posix/bits/unistd.h: Add definitions for new debug versions. + * debug/tst-chk1.c: Add tests for new functions. + * debug/Versions: Export new functions. + * debug/Makefile (routines): Add new files. + + * stdlib/bits/stdlib.h: Fix typo. + +2005-07-13 Thorsten Kukuk <kukuk@suse.de> + + * manual/Makefile (libc/index.html): Depend on dir-add.texi. + +2005-07-15 Ulrich Drepper <drepper@redhat.com> + + * stdlib/bits/stdlib.h: Use __REDIRECT_NTH instead of __REDIRECT + where necessary. + * wcsmbs/bits/wchar2.h: Likewise. + +2005-07-15 Andreas Jaeger <aj@suse.de> + + * debug/Makefile (tst-lfschk3-ENV): New, set locale. + (tst-lfschk2-ENV): New. + (tst-lfschk1-ENV): New. + (tst-chk3-ENV): New. + (tst-chk2-ENV): New. + (tst-chk1-ENV): New. + + [BZ #1079] + * include/stdlib.h: Remove malloc attribute from __posix_memalign. + * stdlib/stdlib.h: Likewise. + +2005-07-15 Ulrich Drepper <drepper@redhat.com> + + * wcsmbs/bits/wchar2.h: New file. + * include/bits/wchar2.h: New file. + * wcsmbs/wchar.h: Include <bits/wchar2.h> if fortification is + requested. + * wcsmbs/wcsncpy.c: Add __wcsncpy alias. + * string/bits/string3.h: Add fortified stpncpy definitions. + * sysdeps/generic/stpncpy_chk.c: New file. + * libio/vswprintf.c: Move _IO_wstrnfile definition to strfile.h. + Export _IO_wstrn_jumps. + * libio/strfile.h: Define _IO_wstrnfile and declare _IO_wstrn_jumps. + * include/wchar.h: Declare __wcsncpy and __vswprintf_chk. + * debug/fgetws_chk.c: New file. + * debug/fgetws_u_chk.c: New file. + * debug/fwprintf_chk.c: New file. + * debug/swprintf_chk.c: New file. + * debug/vfwprintf_chk.c: New file. + * debug/vswprintf_chk.c: New file. + * debug/vwprintf_chk.c: New file. + * debug/wcpcpy_chk.c: New file. + * debug/wcpncpy_chk.c: New file. + * debug/wcscat_chk.c: New file. + * debug/wcscpy_chk.c: New file. + * debug/wcsncat_chk.c: New file. + * debug/wcsncpy_chk.c: New file. + * debug/wmemcpy_chk.c: New file. + * debug/wmemmove_chk.c: New file. + * debug/wmempcpy_chk.c: New file. + * debug/wmemset_chk.c: New file. + * debug/wprintf_chk.c: New file. + * debug/tst-chk1.c: Add tests for new functions. + * debug/Versions: Export new functions. + * debug/Makefile (routines): Add new functions. + +2005-07-13 Ulrich Drepper <drepper@redhat.com> + + * nscd/nscd_helper.c: Add a few __builtin_expect. + + [BZ #1080] + * nscd/connections.c (send_ro_fd): Make sure BUF is aligned correctly. + * nscd/nscd_helper.c (wait_on_socket): New function. + (get_mapping): Use wait_on_socket instead of poll. The former handles + EINTR of poll correctly. + (__nscd_open_socket): Likewise. + (get_mapping): Make sure BUF is aligned correctly. + (get_mapping): Use munmap on correct pointer. + +2005-07-12 Ulrich Drepper <drepper@redhat.com> + + * include/libc-symbols.h: Define macros for librt hidden symbols. + * include/time.h: Add librt_hidden_proto definition for clock_gettime. + * sysdeps/generic/clock_gettime.c: Add librt_hidden_def. + * sysdeps/unix/clock_gettime.c: Likewise. + + * stdlib/bits/stdlib.h: New file. + * stdlib/stdlib.h: Include <bits/stdlib.h> if fortification is + requested. + * Makefile (headers): Add bits/stdlib.h. + * include/bits/stdlib.h: New file. + * debug/Depend: New file. + * debug/ptsname_r_chk.c: New file. + * debug/realpath_chk.c: New file. + * debug/wctomb_chk.c: New file. + * debug/Makefile (routines): Add ptsname_r_chk, realpath_chk, and + wctomb_chk. + * debug/Versions: Export __ptsname_r_chk, __realpath_chk, and + __wctomb_chk. + * debug/tst-chk1.c: Add tests for __ptsname_r_chk, __realpath_chk, and + __wctomb_chk. + +2005-07-12 Jakub Jelinek <jakub@redhat.com> + + [BZ #1106] + * sysdeps/unix/sysv/linux/ia64/has_cpuclock.c: Include not-cancel.h. + (has_cpuclock): Use open_not_cancel_2 instead of open, read_not_cancel + instead of read and close_not_cancel_no_status instead of close. + + [BZ #1106] + * sysdeps/s390/s390-64/bcopy.S (__bcopy): Use + HIDDEN_BUILTIN_JUMPTARGET to jump to memmove. + +2005-06-27 Carlos O'Donell <carlos@systemhalted.org> + + * posix/regcomp.c (re_compile_internal): Call __libc_lock_init + after init_dfa. + +2005-07-08 Ulrich Drepper <drepper@redhat.com> + + * sysdeps/x86_64/fpu/s_sincosl.S: Use retq not ret. Remove + alignment. + * sysdeps/x86_64/fpu/s_sincos.S: New file. + + * include/fenv.h: Add libm_hidden_proto for fesetround and + feholdexcept. + * sysdeps/alpha/fpu/feholdexcpt.c: Add libm_hidden_def. + * sysdeps/alpha/fpu/fesetround.c: Likewise. + * sysdeps/generic/feholdexcpt.c: Likewise. + * sysdeps/generic/fesetround.c: Likewise. + * sysdeps/i386/fpu/feholdexcpt.c: Likewise. + * sysdeps/i386/fpu/fesetround.c: Likewise. + * sysdeps/ia64/fpu/feholdexcpt.c: Likewise. + * sysdeps/ia64/fpu/fesetround.c: Likewise. + * sysdeps/powerpc/fpu/feholdexcpt.c: Likewise. + * sysdeps/powerpc/fpu/fesetround.c: Likewise. + * sysdeps/s390/fpu/feholdexcpt.c: Likewise. + * sysdeps/s390/fpu/fesetround.c: Likewise. + * sysdeps/sh/sh4/fpu/feholdexcpt.c: Likewise. + * sysdeps/sh/sh4/fpu/fesetround.c: Likewise. + * sysdeps/sparc/fpu/feholdexcpt.c: Likewise. + * sysdeps/sparc/fpu/fesetround.c: Likewise. + * sysdeps/x86_64/fpu/feholdexcpt.c: Likewise. + * sysdeps/x86_64/fpu/fesetround.c: Likewise. + * sysdeps/generic/s_significand.c (__significand): Use __ilogb not + ilogb. + * sysdeps/generic/s_significandf.c (__significandf): Use __ilogbf + not ilogbf. + * sysdeps/ieee754/dbl-64/s_sincos.c (__sincos): Use __sin and + __cos, not sin and cos. + 2005-07-07 Ulrich Drepper <drepper@redhat.com> * resolv/res_send.c (send_dg): Recognize referral results and @@ -86,6 +364,7 @@ 2005-07-05 Thorsten Kukuk <kukuk@suse.de> + [BZ #1111] * nis/nss_compat/compat-grp.c (internal_getgrgid_r): Check if NSS module provides getgrgid_r. (getgrnam_plusgroup): Preserve original return value. @@ -95,6 +374,7 @@ 2005-07-05 Ulrich Drepper <drepper@redhat.com> + [BZ #1101] * posix/regex_internal.c (build_wcs_buffer): Use MB_LEN_MAX not MB_CUR_MAX. (build_wcs_upper_buffer): Likewise. @@ -129,11 +409,13 @@ 2005-06-23 Thorsten Kukuk <kukuk@suse.de> + [BZ #1109] * nscd/nscd_stat.c (receive_print_stats): Replace YESSTR/NOSTR with own translation. 2005-06-25 Jakub Jelinek <jakub@redhat.com> + [BZ #1097] * sunrpc/xdr.c (xdr_hyper, xdr_u_hyper): When decoding, cast t2 to uint32_t instead of ulong. * sunrpc/Makefile (tests): Add tst-xdrmem. @@ -185,6 +467,7 @@ 2005-06-20 Jakub Jelinek <jakub@redhat.com> + [BZ #653] * sysdeps/unix/sysv/linux/sys/quota.h: Add definitions and types for _LINUX_QUOTA_VERSION >= 2. (_LINUX_QUOTA_VERSION): Define if not yet defined. @@ -204,9 +487,11 @@ 2005-06-17 Ulrich Drepper <drepper@redhat.com> + [BZ #1106] * time/mktime.c: Always include <string.h> for prototype of implicitly used memcpy. + [BZ #1104] * sysdeps/unix/sysv/linux/powerpc/powerpc32/truncate64.c (truncate64): Use __truncate, not truncate. (__have_no_truncate64): Renamed from have_no_truncate64. @@ -280,6 +565,7 @@ 2005-06-17 Ulrich Drepper <drepper@redhat.com> + [BZ #1106] * sysdeps/posix/sigignore.c: Include <string.h> to tell the compiler to use __GI_memset. * sysdeps/posix/signal.c: Likewise. @@ -291,12 +577,14 @@ 2005-06-15 Jakub Jelinek <jakub@redhat.com> + [BZ #1088] * hesiod/hesiod.c (hesiod_init): Don't check for ctx->classes[0] == 0 or both classes equal here. (parse_config_file): If both classes are equal, clear the second one. 2005-06-08 Karl Kelley <kekelley@iastate.edu> + [BZ #1088] * hesiod/hesiod_p.h (struct hesiod_p): Add classes array. * hesiod/hesiod.c (hesiod_init): Initialize classes. Fail if no valid classes were given or if both are equal. @@ -307,6 +595,7 @@ 2005-06-14 Ulrich Drepper <drepper@redhat.com> + [BZ #1085] * configure.in: Add test for availability of libaudit. * config.h.in: Define HAVE_LIBAUDIT. * config.make.in: Define have-libaudit. @@ -339,6 +628,7 @@ 2005-06-13 Jakub Jelinek <jakub@redhat.com> + [BZ #1096] * sysdeps/unix/sysv/linux/netlinkaccess.h (__netlink_sendreq, __netlink_receive): Remove prototypes. (__netlink_request): New prototype. @@ -547,6 +837,7 @@ 2005-05-23 Ulrich Drepper <drepper@redhat.com> + [BZ #1086] * sunrpc/bindrsvprt.c (LOWPORT): Apparently some mountd implementations are broken and don't accept ports < 512. @@ -558,6 +849,7 @@ 2005-05-23 Ulrich Drepper <drepper@redhat.com> + [BZ #1086] * sunrpc/pm_getport.c (__get_socket): New function. (pmap_getport): Use it to open a non-reserved socket to the portmapper for TCP. @@ -566,6 +858,7 @@ non-reserved socket for the portmapper. Based on a patch by Steve Dickson <steved@redhat.com>. + [BZ #1086] * sunrpc/bindrsvprt.c (bindresvport): Try harder to find a port. If we tried looking at the usual range without success extend the range to even lower ports. @@ -831,6 +1124,7 @@ 2005-04-29 Jakub Jelinek <jakub@redhat.com> + [BZ #1083] * sysdeps/posix/posix_fallocate.c (posix_fallocate): If len == 0, call ftruncate if offset is bigger than current size. Make sure the file is offset + len bytes long if that is more than current size. @@ -854,6 +1148,7 @@ 2005-04-29 Ulrich Drepper <drepper@redhat.com> + [BZ #1093] * nis/nis_table.c: Fix realloc handling. * nis/nis_removemember.c: Likewise. @@ -935,6 +1230,7 @@ 2005-04-27 Ulrich Drepper <drepper@redhat.com> + [BZ #1094] * nscd/connections.c (nscd_run): Use time() value in prune_cache call, not timeout value, since the latter might be from another clock. @@ -1004,6 +1300,7 @@ 2005-04-26 Ulrich Drepper <drepper@redhat.com> + [BZ #1105] * time/strptime_l.c (__strptime_internal): Handle 'z' to set tm_gmtoff. * time/Makefile (tests): Add tst-strptime2. @@ -1011,6 +1308,7 @@ 2005-04-26 Jakub Jelinek <jakub@redhat.com> + [BZ #1081] * elf/dl-close.c: Include stddef.h. (_dl_close): If called recursively, just remember GC needs to be rerun and decrease l_direct_opencount. Avoid GC if l_direct_opencount @@ -1037,6 +1335,7 @@ 2005-04-26 Ulrich Drepper <drepper@redhat.com> + [BZ #1110] * stdio-common/vfscanf.c: Correctly account for characters of decimal points right after +-. @@ -1056,6 +1355,7 @@ 2005-04-24 Ulrich Drepper <drepper@redhat.com> + [BZ #1110] * stdio-common/vfscanf.c: Fix parsing of decimal point after +-. Patch by Hamed Malek <hamed@bamdad.org>. @@ -1136,6 +1436,7 @@ 2005-04-12 Ulrich Drepper <drepper@redhat.com> + [BZ #1090] * stdlib/random_r.c (__initstate_r): Don't use non-existing state. * string/tst-strfry.c: New file. * string/Makefile (tests): Add tst-strfry. @@ -1315,6 +1616,7 @@ 2005-04-04 Jakub Jelinek <jakub@redhat.com> + [BZ #1082] * sunrpc/pmap_rmt.c (xdr_rmtcall_args): Use a dummy arglen instead of trying to encode uninitialized arglen. @@ -1519,6 +1821,7 @@ 2005-03-29 Jakub Jelinek <jakub@redhat.com> + [BZ #1087] * posix/fnmatch.c (fnmatch): For short patterns or strings attempt to avoid calling mbsrtowcs twice. @@ -1675,6 +1978,7 @@ 2005-03-21 Thorsten Kukuk <kukuk@suse.de> + [BZ #1098] * sunrpc/xdr_stdio.c (xdrstdio_getlong, xdrstdio_putlong): Convert correctly between long/int on 64bit big-endian. @@ -1731,7 +2035,7 @@ 2005-02-27 Denis Barbier <barbier@debian.org> - [BZ #38] + [BZ #549] * locale/iso-4217.def: Add CSD currency. 2005-03-19 Ulrich Drepper <drepper@redhat.com> @@ -2031,6 +2335,7 @@ * iconv/gconv_simple.c (internal_utf8_loop): Make start unsigned to avoid warning. + [BZ #1101] * posix/regex_internal.c [_LIBC] (build_wcs_buffer): Avoid using dynamically sized array. (build_wcs_upper_buffer): Likewise. @@ -2298,12 +2603,14 @@ 2005-02-22 Jakub Jelinek <jakub@redhat.com> + [BZ #1095] * malloc/Makefile (CFLAGS-mcheck-init.c): Add. * sunrpc/Makefile: Add $(PIC-ccflag) to CFLAGS-x* for librpcsvc.a objects. 2005-02-21 Ulrich Drepper <drepper@redhat.com> + [BZ #1107] * iconvdata/ibm930.h: Correct Yen mapping. * iconvdata/ibm939.h: Likewise. * iconvdata/testdata/IBM930..UTF8: Adjust test data. @@ -2602,6 +2909,7 @@ 2005-02-11 Jakub Jelinek <jakub@redhat.com> + [BZ #1100] * debug/chk_fail.c (__chk_fail): Add a while (1) loop around __libc_message to kill GCC warning about noreturn function returning. @@ -2839,6 +3147,7 @@ 2005-01-30 Ulrich Drepper <drepper@redhat.com> + [BZ #1103] * nscd/nscd_helper.c (get_mapping): Use MSG_NOSIGNAL if available. * nscd/connections.c (send_ro_fd): Likewise. @@ -2967,6 +3276,7 @@ 2005-01-26 Ulrich Drepper <drepper@redhat.com> + [BZ #1100] * debug/chk_fail.c (__chk_fail): Print program name in final message. * sysdeps/unix/sysv/linux/kernel-features.h: Found reference to @@ -2994,6 +3304,7 @@ 2005-01-14 GOTO Masanori <gotom@debian.or.jp> + [BZ #1108] * sunrpc/rpc_main.c (s_output): Generate #include <rpc/pmap_clnt.h> irrespective of Cflag. @@ -3218,6 +3529,7 @@ as backlog. * sunrpc/svc_unix.c (svcunix_create): Likewise. + [BZ #1099] * grp/putgrent.c (putgrent): Don't write 0 as group ID if groupname starts with + or -. * pwd/putpwent.c (putpwent): Don't write 0 as user or diff --git a/Makerules b/Makerules index 63b07a24a6..e95d3107ec 100644 --- a/Makerules +++ b/Makerules @@ -1390,7 +1390,7 @@ objs-for-stubs := $(foreach o,$(object-suffixes-for-libc),$(o-objects)) \ $(addprefix $(objpfx),$(extra-objs)) $(objpfx)stubs: $(objs-for-stubs) ifneq (,$(strip $(objs-for-stubs))) - $(OBJDUMP) -h $^ | \ + (cd $(objdir); $(OBJDUMP) -h $(patsubst $(objpfx)%,%,$^)) | \ $(AWK) '/\.gnu\.glibc-stub\./ { \ sub(/\.gnu\.glibc-stub\./, "", $$2); \ stubs[$$2] = 1; } \ diff --git a/argp/argp-fmtstream.c b/argp/argp-fmtstream.c index 215160bdcd..1004e6762a 100644 --- a/argp/argp-fmtstream.c +++ b/argp/argp-fmtstream.c @@ -1,5 +1,5 @@ /* Word-wrapping and line-truncating streams - Copyright (C) 1997,1998,1999,2001,2002,2003 Free Software Foundation, Inc. + Copyright (C) 1997-1999,2001,2002,2003,2005 Free Software Foundation, Inc. This file is part of the GNU C Library. Written by Miles Bader <miles@gnu.ai.mit.edu>. @@ -102,11 +102,10 @@ __argp_fmtstream_free (argp_fmtstream_t fs) if (fs->p > fs->buf) { #ifdef USE_IN_LIBIO - if (_IO_fwide (fs->stream, 0) > 0) - __fwprintf (fs->stream, L"%.*s", (int) (fs->p - fs->buf), fs->buf); - else + __fxprintf (fs->stream, "%.*s", (int) (fs->p - fs->buf), fs->buf); +#else + fwrite_unlocked (fs->buf, 1, fs->p - fs->buf, fs->stream); #endif - fwrite_unlocked (fs->buf, 1, fs->p - fs->buf, fs->stream); } free (fs->buf); free (fs); @@ -291,17 +290,15 @@ __argp_fmtstream_update (argp_fmtstream_t fs) else /* Output the first line so we can use the space. */ { -#ifdef USE_IN_LIBIO - if (_IO_fwide (fs->stream, 0) > 0) - __fwprintf (fs->stream, L"%.*s\n", - (int) (nl - fs->buf), fs->buf); - else +#ifdef _LIBC + __fxprintf (fs->stream, "%.*s\n", + (int) (nl - fs->buf), fs->buf); +#else + if (nl > fs->buf) + fwrite_unlocked (fs->buf, 1, nl - fs->buf, fs->stream); + putc_unlocked ('\n', fs->stream); #endif - { - if (nl > fs->buf) - fwrite_unlocked (fs->buf, 1, nl - fs->buf, fs->stream); - putc_unlocked ('\n', fs->stream); - } + len += buf - fs->buf; nl = buf = fs->buf; } @@ -360,15 +357,12 @@ __argp_fmtstream_ensure (struct argp_fmtstream *fs, size_t amount) /* Flush FS's buffer. */ __argp_fmtstream_update (fs); -#ifdef USE_IN_LIBIO - if (_IO_fwide (fs->stream, 0) > 0) - { - __fwprintf (fs->stream, L"%.*s", (int) (fs->p - fs->buf), fs->buf); - wrote = fs->p - fs->buf; - } - else +#ifdef _LIBC + __fxprintf (fs->stream, "%.*s", (int) (fs->p - fs->buf), fs->buf); + wrote = fs->p - fs->buf; +#else + wrote = fwrite_unlocked (fs->buf, 1, fs->p - fs->buf, fs->stream); #endif - wrote = fwrite_unlocked (fs->buf, 1, fs->p - fs->buf, fs->stream); if (wrote == fs->p - fs->buf) { fs->p = fs->buf; diff --git a/argp/argp-help.c b/argp/argp-help.c index 67018709d3..ee61ed4d5c 100644 --- a/argp/argp-help.c +++ b/argp/argp-help.c @@ -1,5 +1,5 @@ /* Hierarchial argument parsing help output - Copyright (C) 1995-2003, 2004 Free Software Foundation, Inc. + Copyright (C) 1995-2003, 2004, 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. Written by Miles Bader <miles@gnu.ai.mit.edu>. @@ -1763,33 +1763,26 @@ __argp_error (const struct argp_state *state, const char *fmt, ...) va_start (ap, fmt); -#ifdef USE_IN_LIBIO - if (_IO_fwide (stream, 0) > 0) - { - char *buf; +#ifdef _LIBC + char *buf; - if (__asprintf (&buf, fmt, ap) < 0) - buf = NULL; + if (__asprintf (&buf, fmt, ap) < 0) + buf = NULL; - __fwprintf (stream, L"%s: %s\n", - state ? state->name : __argp_short_program_name (), - buf); + __fxprintf (stream, "%s: %s\n", + state ? state->name : __argp_short_program_name (), buf); - free (buf); - } - else -#endif - { - fputs_unlocked (state - ? state->name : __argp_short_program_name (), - stream); - putc_unlocked (':', stream); - putc_unlocked (' ', stream); + free (buf); +#else + fputs_unlocked (state ? state->name : __argp_short_program_name (), + stream); + putc_unlocked (':', stream); + putc_unlocked (' ', stream); - vfprintf (stream, fmt, ap); + vfprintf (stream, fmt, ap); - putc_unlocked ('\n', stream); - } + putc_unlocked ('\n', stream); +#endif __argp_state_help (state, stream, ARGP_HELP_STD_ERR); @@ -1827,41 +1820,34 @@ __argp_failure (const struct argp_state *state, int status, int errnum, __flockfile (stream); #endif -#ifdef USE_IN_LIBIO - if (_IO_fwide (stream, 0) > 0) - __fwprintf (stream, L"%s", - state ? state->name : __argp_short_program_name ()); - else +#ifdef _LIBC + __fxprintf (stream, "%s", + state ? state->name : __argp_short_program_name ()); +#else + fputs_unlocked (state ? state->name : __argp_short_program_name (), + stream); #endif - fputs_unlocked (state - ? state->name : __argp_short_program_name (), - stream); if (fmt) { va_list ap; va_start (ap, fmt); -#ifdef USE_IN_LIBIO - if (_IO_fwide (stream, 0) > 0) - { - char *buf; +#ifdef _LIBC + char *buf; - if (__asprintf (&buf, fmt, ap) < 0) - buf = NULL; + if (__asprintf (&buf, fmt, ap) < 0) + buf = NULL; - __fwprintf (stream, L": %s", buf); + __fxprintf (stream, ": %s", buf); - free (buf); - } - else -#endif - { - putc_unlocked (':', stream); - putc_unlocked (' ', stream); + free (buf); +#else + putc_unlocked (':', stream); + putc_unlocked (' ', stream); - vfprintf (stream, fmt, ap); - } + vfprintf (stream, fmt, ap); +#endif va_end (ap); } @@ -1870,21 +1856,18 @@ __argp_failure (const struct argp_state *state, int status, int errnum, { char buf[200]; -#ifdef USE_IN_LIBIO - if (_IO_fwide (stream, 0) > 0) - __fwprintf (stream, L": %s", - __strerror_r (errnum, buf, sizeof (buf))); - else -#endif - { - putc_unlocked (':', stream); - putc_unlocked (' ', stream); -#if defined _LIBC || defined HAVE_STRERROR_R - fputs (__strerror_r (errnum, buf, sizeof (buf)), stream); +#ifdef _LIBC + __fxprintf (stream, ": %s", + __strerror_r (errnum, buf, sizeof (buf))); #else - fputs (strerror (errnum), stream); + putc_unlocked (':', stream); + putc_unlocked (' ', stream); +# ifdef HAVE_STRERROR_R + fputs (__strerror_r (errnum, buf, sizeof (buf)), stream); +# else + fputs (strerror (errnum), stream); +# endif #endif - } } #ifdef USE_IN_LIBIO diff --git a/assert/assert-perr.c b/assert/assert-perr.c index 3017c9fd9c..dd54246360 100644 --- a/assert/assert-perr.c +++ b/assert/assert-perr.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1994-1998,2001,2002 Free Software Foundation, Inc. +/* Copyright (C) 1994-1998,2001,2002,2005 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 @@ -61,13 +61,7 @@ __assert_perror_fail (int errnum, __strerror_r (errnum, errbuf, sizeof errbuf)) >= 0) { /* Print the message. */ -#ifdef USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - (void) __fwprintf (stderr, L"%s", buf); - else -#endif - (void) fputs (buf, stderr); - + (void) __fxprintf (NULL, "%s", buf); (void) fflush (stderr); /* We have to free the buffer since the appplication might catch the diff --git a/assert/assert.c b/assert/assert.c index 20c86eba52..0ef4ca62e4 100644 --- a/assert/assert.c +++ b/assert/assert.c @@ -1,4 +1,5 @@ -/* Copyright (C) 1991,1994-1996,1998,2001,2002 Free Software Foundation, Inc. +/* Copyright (C) 1991,1994-1996,1998,2001,2002,2005 + 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 @@ -60,13 +61,7 @@ __assert_fail (const char *assertion, const char *file, unsigned int line, assertion) >= 0) { /* Print the message. */ -#ifdef USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - (void) __fwprintf (stderr, L"%s", buf); - else -#endif - (void) fputs (buf, stderr); - + (void) __fxprintf (NULL, "%s", buf); (void) fflush (stderr); /* We have to free the buffer since the application might catch the diff --git a/config.make.in b/config.make.in index 1ab4bfbfc4..3687507a17 100644 --- a/config.make.in +++ b/config.make.in @@ -58,6 +58,7 @@ have-cpp-asm-debuginfo = @libc_cv_cpp_asm_debuginfo@ enable-check-abi = @enable_check_abi@ have-forced-unwind = @libc_cv_forced_unwind@ have-fpie = @libc_cv_fpie@ +have-ssp = @libc_cv_ssp@ have-selinux = @have_selinux@ have-libaudit = @have_libaudit@ have-cc-with-libunwind = @libc_cv_cc_with_libunwind@ diff --git a/configure b/configure index 402da463f9..a449415c01 100755 --- a/configure +++ b/configure @@ -313,7 +313,7 @@ ac_includes_default="\ # include <unistd.h> #endif" -ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS with_fp with_cvs enable_check_abi oldest_abi bindnow force_install all_warnings build build_cpu build_vendor build_os host host_cpu host_vendor host_os subdirs add_ons base_machine sysnames INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA LN_S CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC OBJEXT BUILD_CC cross_compiling CPP CXX CXXFLAGS ac_ct_CXX AR OBJDUMP RANLIB ac_ct_RANLIB MIG AS LD PWD_P MAKE MSGFMT MAKEINFO SED AUTOCONF SYSINCLUDES libc_cv_gcc_static_libgcc BASH libc_cv_have_bash2 KSH libc_cv_have_ksh AWK PERL INSTALL_INFO BISON VERSIONING libc_cv_asm_protected_directive libc_cv_initfinit_array libc_cv_cc_with_libunwind libc_cv_z_nodelete libc_cv_z_nodlopen libc_cv_z_initfirst libc_cv_z_relro libc_cv_Bgroup libc_cv_libgcc_s_suffix libc_cv_as_needed ASFLAGS_config libc_cv_z_combreloc libc_cv_z_execstack libc_cv_fpie fno_unit_at_a_time libc_cv_have_initfini no_whole_archive exceptions LIBGD have_libaudit have_selinux EGREP sizeof_long_double libc_cv_gcc_unwind_find_fde uname_sysname uname_release uname_version old_glibc_headers libc_cv_slibdir libc_cv_localedir libc_cv_sysconfdir libc_cv_rootsbindir libc_cv_forced_unwind use_ldconfig ldd_rewrite_script gnu_ld gnu_as elf xcoff static shared pic_default profile omitfp bounded static_nss nopic_initfini DEFINES mach_interface_list VERSION RELEASE LIBOBJS LTLIBOBJS' +ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS with_fp with_cvs enable_check_abi oldest_abi bindnow force_install all_warnings build build_cpu build_vendor build_os host host_cpu host_vendor host_os subdirs add_ons base_machine sysnames INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA LN_S CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC OBJEXT BUILD_CC cross_compiling CPP CXX CXXFLAGS ac_ct_CXX AR OBJDUMP RANLIB ac_ct_RANLIB MIG AS LD PWD_P MAKE MSGFMT MAKEINFO SED AUTOCONF SYSINCLUDES libc_cv_gcc_static_libgcc BASH libc_cv_have_bash2 KSH libc_cv_have_ksh AWK PERL INSTALL_INFO BISON VERSIONING libc_cv_asm_protected_directive libc_cv_initfinit_array libc_cv_cc_with_libunwind libc_cv_z_nodelete libc_cv_z_nodlopen libc_cv_z_initfirst libc_cv_z_relro libc_cv_Bgroup libc_cv_libgcc_s_suffix libc_cv_as_needed ASFLAGS_config libc_cv_z_combreloc libc_cv_z_execstack libc_cv_fpie fno_unit_at_a_time libc_cv_ssp libc_cv_have_initfini no_whole_archive exceptions LIBGD have_libaudit have_selinux EGREP sizeof_long_double libc_cv_gcc_unwind_find_fde uname_sysname uname_release uname_version old_glibc_headers libc_cv_slibdir libc_cv_localedir libc_cv_sysconfdir libc_cv_rootsbindir libc_cv_forced_unwind use_ldconfig ldd_rewrite_script gnu_ld gnu_as elf xcoff static shared pic_default profile omitfp bounded static_nss nopic_initfini DEFINES mach_interface_list VERSION RELEASE LIBOBJS LTLIBOBJS' ac_subst_files='' # Initialize some variables set by options. @@ -5799,6 +5799,33 @@ if test $libc_cv_fno_unit_at_a_time = yes; then fi +echo "$as_me:$LINENO: checking for -fstack-protector" >&5 +echo $ECHO_N "checking for -fstack-protector... $ECHO_C" >&6 +if test "${libc_cv_ssp+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat > conftest.c <<EOF +int foo; +main () { return 0;} +EOF +if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -fstack-protector + -o conftest conftest.c 1>&5' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } +then + libc_cv_ssp=yes +else + libc_cv_ssp=no +fi +rm -f conftest* +fi +echo "$as_me:$LINENO: result: $libc_cv_ssp" >&5 +echo "${ECHO_T}$libc_cv_ssp" >&6 + + if test $elf != yes; then echo "$as_me:$LINENO: checking for .init and .fini sections" >&5 echo $ECHO_N "checking for .init and .fini sections... $ECHO_C" >&6 @@ -8434,6 +8461,7 @@ s,@libc_cv_z_combreloc@,$libc_cv_z_combreloc,;t t s,@libc_cv_z_execstack@,$libc_cv_z_execstack,;t t s,@libc_cv_fpie@,$libc_cv_fpie,;t t s,@fno_unit_at_a_time@,$fno_unit_at_a_time,;t t +s,@libc_cv_ssp@,$libc_cv_ssp,;t t s,@libc_cv_have_initfini@,$libc_cv_have_initfini,;t t s,@no_whole_archive@,$no_whole_archive,;t t s,@exceptions@,$exceptions,;t t diff --git a/configure.in b/configure.in index 4396891db5..21756e00a8 100644 --- a/configure.in +++ b/configure.in @@ -1508,6 +1508,21 @@ if test $libc_cv_fno_unit_at_a_time = yes; then fi AC_SUBST(fno_unit_at_a_time) +AC_CACHE_CHECK(for -fstack-protector, libc_cv_ssp, [dnl +cat > conftest.c <<EOF +int foo; +main () { return 0;} +EOF +if AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -fstack-protector + -o conftest conftest.c 1>&AS_MESSAGE_LOG_FD]) +then + libc_cv_ssp=yes +else + libc_cv_ssp=no +fi +rm -f conftest*]) +AC_SUBST(libc_cv_ssp) + if test $elf != yes; then AC_CACHE_CHECK(for .init and .fini sections, libc_cv_have_initfini, [AC_TRY_COMPILE(, [asm (".section .init"); diff --git a/debug/Depend b/debug/Depend new file mode 100644 index 0000000000..f3e1156a4e --- /dev/null +++ b/debug/Depend @@ -0,0 +1 @@ +localedata diff --git a/debug/Makefile b/debug/Makefile index 6ec08dc94a..009c05c9d9 100644 --- a/debug/Makefile +++ b/debug/Makefile @@ -26,12 +26,21 @@ distribute = sigcontextinfo.h register-dump.h frame.h routines = backtrace backtracesyms backtracesymsfd noophooks \ memcpy_chk memmove_chk mempcpy_chk memset_chk stpcpy_chk \ - strcat_chk strcpy_chk strncat_chk strncpy_chk \ + strcat_chk strcpy_chk strncat_chk strncpy_chk stpncpy_chk \ sprintf_chk vsprintf_chk snprintf_chk vsnprintf_chk \ printf_chk fprintf_chk vprintf_chk vfprintf_chk \ gets_chk chk_fail readonly-area fgets_chk fgets_u_chk \ read_chk pread_chk pread64_chk recv_chk recvfrom_chk \ - readlink_chk getwd_chk getcwd_chk stack_chk_fail \ + readlink_chk getwd_chk getcwd_chk realpath_chk ptsname_r_chk \ + wctomb_chk wcscpy_chk wmemcpy_chk wmemmove_chk wmempcpy_chk \ + wcpcpy_chk wcsncpy_chk wcscat_chk wcsncat_chk wmemset_chk \ + wcpncpy_chk \ + swprintf_chk vswprintf_chk wprintf_chk fwprintf_chk \ + vwprintf_chk vfwprintf_chk fgetws_chk fgetws_u_chk \ + confstr_chk getgroups_chk ttyname_r_chk getlogin_r_chk \ + gethostname_chk getdomainname_chk wcrtomb_chk mbsnrtowcs_chk \ + wcsnrtombs_chk mbsrtowcs_chk wcsrtombs_chk \ + stack_chk_fail \ $(static-only-routines) static-only-routines := warning-nop stack_chk_fail_local @@ -47,12 +56,27 @@ CFLAGS-vfprintf_chk.c = -D_IO_MTSAFE_IO $(exceptions) CFLAGS-gets_chk.c = -D_IO_MTSAFE_IO $(exceptions) CFLAGS-fgets_chk.c = -D_IO_MTSAFE_IO $(exceptions) CFLAGS-fgets_u_chk.c = -D_IO_MTSAFE_IO $(exceptions) +CFLAGS-swprintf_chk.c = -D_IO_MTSAFE_IO +CFLAGS-vswprintf_chk.c = -D_IO_MTSAFE_IO +CFLAGS-wprintf_chk.c = -D_IO_MTSAFE_IO $(exceptions) +CFLAGS-fwprintf_chk.c = -D_IO_MTSAFE_IO $(exceptions) +CFLAGS-vwprintf_chk.c = -D_IO_MTSAFE_IO $(exceptions) +CFLAGS-vfwprintf_chk.c = -D_IO_MTSAFE_IO $(exceptions) +CFLAGS-fgetws_chk.c = -D_IO_MTSAFE_IO $(exceptions) +CFLAGS-fgetws_u_chk.c = -D_IO_MTSAFE_IO $(exceptions) CFLAGS-read_chk.c = -fexceptions -fasynchronous-unwind-tables CFLAGS-pread_chk.c = -fexceptions -fasynchronous-unwind-tables CFLAGS-pread64_chk.c = -fexceptions -fasynchronous-unwind-tables CFLAGS-recv_chk.c = -fexceptions -fasynchronous-unwind-tables CFLAGS-recvfrom_chk.c = -fexceptions -fasynchronous-unwind-tables +tst-chk1-ENV = LOCPATH=$(common-objpfx)localedata +tst-chk2-ENV = LOCPATH=$(common-objpfx)localedata +tst-chk3-ENV = LOCPATH=$(common-objpfx)localedata +tst-lfschk1-ENV = LOCPATH=$(common-objpfx)localedata +tst-lfschk2-ENV = LOCPATH=$(common-objpfx)localedata +tst-lfschk3-ENV = LOCPATH=$(common-objpfx)localedata + tests = backtrace-tst tst-chk1 tst-chk2 tst-chk3 \ tst-lfschk1 tst-lfschk2 tst-lfschk3 test-strcpy_chk test-stpcpy_chk diff --git a/debug/Versions b/debug/Versions index 051f4df000..2f4183bceb 100644 --- a/debug/Versions +++ b/debug/Versions @@ -23,6 +23,15 @@ libc { __read_chk; __pread_chk; __pread64_chk; __readlink_chk; __getcwd_chk; __getwd_chk; __recv_chk; __recvfrom_chk; + __realpath_chk; __ptsname_r_chk; __wctomb_chk; + __stpncpy_chk; + __wcscpy_chk; __wmemcpy_chk; __wmemmove_chk; __wmempcpy_chk; __wcpcpy_chk; + __wcsncpy_chk; __wcscat_chk; __wcsncat_chk; __wmemset_chk; __wcpncpy_chk; + __swprintf_chk; __vswprintf_chk; __wprintf_chk; __fwprintf_chk; + __vwprintf_chk; __vfwprintf_chk; __fgetws_chk; __fgetws_unlocked_chk; + __confstr_chk; __getgroups_chk; __ttyname_r_chk; __getlogin_r_chk; + __gethostname_chk; __getdomainname_chk; __wcrtomb_chk; __mbsnrtowcs_chk; + __wcsnrtombs_chk; __mbsrtowcs_chk; __wcsrtombs_chk; __stack_chk_fail; } diff --git a/debug/confstr_chk.c b/debug/confstr_chk.c new file mode 100644 index 0000000000..dae7714fcf --- /dev/null +++ b/debug/confstr_chk.c @@ -0,0 +1,30 @@ +/* Copyright (C) 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@readhat.com>, 20055. + + 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 <unistd.h> + + +size_t +__confstr_chk (int name, char *buf, size_t len, size_t buflen) +{ + if (__builtin_expect (buflen < len, 0)) + __chk_fail (); + + return confstr (name, buf, len); +} diff --git a/debug/fgetws_chk.c b/debug/fgetws_chk.c new file mode 100644 index 0000000000..d080ccb473 --- /dev/null +++ b/debug/fgetws_chk.c @@ -0,0 +1,54 @@ +/* Copyright (C) 1993, 1995, 1996, 1997, 1998, 1999, 2001, 2005 + 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 + 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 "libioP.h" +#include <wchar.h> +#include <sys/param.h> + +wchar_t * +__fgetws_chk (wchar_t *buf, size_t size, int n, _IO_FILE *fp) +{ + _IO_size_t count; + wchar_t *result; + int old_error; + CHECK_FILE (fp, NULL); + if (n <= 0) + return NULL; + _IO_acquire_lock (fp); + /* This is very tricky since a file descriptor may be in the + non-blocking mode. The error flag doesn't mean much in this + case. We return an error only when there is a new error. */ + old_error = fp->_IO_file_flags & _IO_ERR_SEEN; + fp->_IO_file_flags &= ~_IO_ERR_SEEN; + count = _IO_getwline (fp, buf, MIN ((size_t) n - 1, size), L'\n', 1); + /* If we read in some bytes and errno is EAGAIN, that error will + be reported for next read. */ + if (count == 0 || (_IO_ferror_unlocked (fp) && errno != EAGAIN)) + result = NULL; + else if (count >= size) + __chk_fail (); + else + { + buf[count] = '\0'; + result = buf; + } + fp->_IO_file_flags |= old_error; + _IO_release_lock (fp); + return result; +} diff --git a/debug/fgetws_u_chk.c b/debug/fgetws_u_chk.c new file mode 100644 index 0000000000..b6cc87b80d --- /dev/null +++ b/debug/fgetws_u_chk.c @@ -0,0 +1,61 @@ +/* Copyright (C) 1993, 95, 96, 97, 98, 99, 2005 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 + 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. + + As a special exception, if you link the code in this file with + files compiled with a GNU compiler to produce an executable, + that does not cause the resulting executable to be covered by + the GNU Lesser General Public License. This exception does not + however invalidate any other reasons why the executable file + might be covered by the GNU Lesser General Public License. + This exception applies to code released by its copyright holders + in files containing the exception. */ + +#include "libioP.h" +#include <wchar.h> +#include <sys/param.h> + +wchar_t * +__fgetws_unlocked_chk (wchar_t *buf, size_t size, int n, _IO_FILE *fp) +{ + _IO_size_t count; + wchar_t *result; + int old_error; + CHECK_FILE (fp, NULL); + if (n <= 0) + return NULL; + /* This is very tricky since a file descriptor may be in the + non-blocking mode. The error flag doesn't mean much in this + case. We return an error only when there is a new error. */ + old_error = fp->_IO_file_flags & _IO_ERR_SEEN; + fp->_IO_file_flags &= ~_IO_ERR_SEEN; + count = _IO_getwline (fp, buf, MIN ((size_t) n - 1, size), L'\n', 1); + /* If we read in some bytes and errno is EAGAIN, that error will + be reported for next read. */ + if (count == 0 || ((fp->_IO_file_flags & _IO_ERR_SEEN) + && errno != EAGAIN)) + result = NULL; + else if (count >= size) + __chk_fail (); + else + { + buf[count] = '\0'; + result = buf; + } + fp->_IO_file_flags |= old_error; + return result; +} diff --git a/debug/fwprintf_chk.c b/debug/fwprintf_chk.c new file mode 100644 index 0000000000..710c89f3c8 --- /dev/null +++ b/debug/fwprintf_chk.c @@ -0,0 +1,45 @@ +/* Copyright (C) 1991, 1995, 1996, 1997, 2001, 2004, 2005 + 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 + 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 <stdarg.h> +#include <wchar.h> +#include "../libio/libioP.h" + + +/* Write formatted output to FP from the format string FORMAT. */ +int +__fwprintf_chk (FILE *fp, int flag, const wchar_t *format, ...) +{ + va_list ap; + int done; + + _IO_acquire_lock (fp); + if (flag > 0) + fp->_flags2 |= _IO_FLAGS2_FORTIFY; + + va_start (ap, format); + done = _IO_vfwprintf (fp, format, ap); + va_end (ap); + + if (flag > 0) + fp->_flags2 &= ~_IO_FLAGS2_FORTIFY; + _IO_release_lock (fp); + + return done; +} diff --git a/debug/getdomainname_chk.c b/debug/getdomainname_chk.c new file mode 100644 index 0000000000..a85464589b --- /dev/null +++ b/debug/getdomainname_chk.c @@ -0,0 +1,29 @@ +/* Copyright (C) 2005 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 + 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 <unistd.h> + + +int +__getdomainname_chk (char *buf, size_t buflen, size_t nreal) +{ + if (buflen > nreal) + __chk_fail (); + + return getdomainname (buf, buflen); +} diff --git a/debug/getgroups_chk.c b/debug/getgroups_chk.c new file mode 100644 index 0000000000..6401b023d3 --- /dev/null +++ b/debug/getgroups_chk.c @@ -0,0 +1,30 @@ +/* Copyright (C) 2005 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 + 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 <errno.h> +#include <unistd.h> + + +char * +__getgroups_chk (int size, __gid_t list[], size_t listlen) +{ + if (__builtin_expect (size * sizeof (__gid_t) > listlen, 0)) + __chk_fail (); + + return __getgroups (size, list); +} diff --git a/debug/gethostname_chk.c b/debug/gethostname_chk.c new file mode 100644 index 0000000000..734cc56b0b --- /dev/null +++ b/debug/gethostname_chk.c @@ -0,0 +1,29 @@ +/* Copyright (C) 2005 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 + 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 <unistd.h> + + +int +__gethostname_chk (char *buf, size_t buflen, size_t nreal) +{ + if (buflen > nreal) + __chk_fail (); + + return __gethostname (buf, buflen); +} diff --git a/debug/getlogin_r_chk.c b/debug/getlogin_r_chk.c new file mode 100644 index 0000000000..ae495cd7ab --- /dev/null +++ b/debug/getlogin_r_chk.c @@ -0,0 +1,29 @@ +/* Copyright (C) 2005 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 + 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 <unistd.h> + + +int +__getlogin_r_chk (char *buf, size_t buflen, size_t nreal) +{ + if (buflen > nreal) + __chk_fail (); + + return getlogin_r (buf, buflen); +} diff --git a/debug/mbsnrtowcs_chk.c b/debug/mbsnrtowcs_chk.c new file mode 100644 index 0000000000..2041eac87f --- /dev/null +++ b/debug/mbsnrtowcs_chk.c @@ -0,0 +1,31 @@ +/* Copyright (C) 2005 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 + 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 <locale.h> +#include <wchar.h> + + +size_t +__mbsnrtowcs_chk (wchar_t *dst, __const char **src, size_t nmc, size_t len, + mbstate_t *ps, size_t dstlen) +{ + if (__builtin_expect (dstlen < len * sizeof (wchar_t), 0)) + __chk_fail (); + + return __mbsnrtowcs (dst, src, nmc, len, ps); +} diff --git a/debug/mbsrtowcs_chk.c b/debug/mbsrtowcs_chk.c new file mode 100644 index 0000000000..fd4b3bf76b --- /dev/null +++ b/debug/mbsrtowcs_chk.c @@ -0,0 +1,31 @@ +/* Copyright (C) 2005 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 + 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 <locale.h> +#include <wchar.h> + + +size_t +__mbsrtowcs_chk (wchar_t *dst, __const char **src, size_t len, + mbstate_t *ps, size_t dstlen) +{ + if (__builtin_expect (dstlen < len * sizeof (wchar_t), 0)) + __chk_fail (); + + return __mbsrtowcs (dst, src, len, ps); +} diff --git a/debug/ptsname_r_chk.c b/debug/ptsname_r_chk.c new file mode 100644 index 0000000000..5f03592bd1 --- /dev/null +++ b/debug/ptsname_r_chk.c @@ -0,0 +1,29 @@ +/* Copyright (C) 2005 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 + 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 <stdlib.h> + + +int +__ptsname_r_chk (int fd, char *buf, size_t buflen, size_t nreal) +{ + if (buflen > nreal) + __chk_fail (); + + return __ptsname_r (fd, buf, buflen); +} diff --git a/debug/realpath_chk.c b/debug/realpath_chk.c new file mode 100644 index 0000000000..961aea0b85 --- /dev/null +++ b/debug/realpath_chk.c @@ -0,0 +1,60 @@ +/* Copyright (C) 2005 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 + 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 <limits.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + + +char * +__realpath_chk (const char *buf, char *resolved, size_t resolvedlen) +{ +#ifdef PATH_MAX + if (resolvedlen < PATH_MAX) + __chk_fail (); + + return __realpath (buf, resolved); +#else + long int pathmax =__pathconf (buf, _PC_PATH_MAX); + if (pathmax != -1) + { + /* We do have a fixed limit. */ + if (resolvedlen < pathmax) + __chk_fail (); + + return __realpath (buf, resolved); + } + + /* Since there is no fixed limit we check whether the size is large + enough. */ + char *res = __realpath (buf, NULL); + if (res != NULL) + { + size_t actlen = strlen (res) + 1; + if (actlen > resolvedlen) + __chk_fail (); + + memcpy (resolved, res, actlen); + free (res); + res = resolved; + } + + return res; +#endif +} diff --git a/debug/swprintf_chk.c b/debug/swprintf_chk.c new file mode 100644 index 0000000000..554cbe66a3 --- /dev/null +++ b/debug/swprintf_chk.c @@ -0,0 +1,37 @@ +/* Copyright (C) 1991,1995,1997,1998,1999,2000,2003,2005 + 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 + 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 <stdarg.h> +#include <wchar.h> + +/* Write formatted output into S, according to the format string FORMAT. */ +/* VARARGS5 */ +int +__swprintf_chk (wchar_t *s, size_t n, int flag, size_t s_len, + const wchar_t *format, ...) +{ + va_list arg; + int done; + + va_start (arg, format); + done = __vswprintf_chk (s, n, flag, s_len, format, arg); + va_end (arg); + + return done; +} diff --git a/debug/tst-chk1.c b/debug/tst-chk1.c index dca41ab6dc..f444a14c2a 100644 --- a/debug/tst-chk1.c +++ b/debug/tst-chk1.c @@ -21,15 +21,17 @@ #define __noreturn__ #include <fcntl.h> +#include <locale.h> #include <paths.h> #include <setjmp.h> #include <signal.h> #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <unistd.h> +#include <wchar.h> #include <sys/socket.h> #include <sys/un.h> -#include <unistd.h> char *temp_filename; static void do_prepare (void); @@ -74,13 +76,20 @@ handler (int sig) } char buf[10]; +wchar_t wbuf[10]; volatile size_t l0; volatile char *p; +volatile wchar_t *wp; const char *str1 = "JIHGFEDCBA"; const char *str2 = "F"; const char *str3 = "%s%n%s%n"; const char *str4 = "Hello, "; const char *str5 = "World!\n"; +const wchar_t *wstr1 = L"JIHGFEDCBA"; +const wchar_t *wstr2 = L"F"; +const wchar_t *wstr3 = L"%s%n%s%n"; +const wchar_t *wstr4 = L"Hello, "; +const wchar_t *wstr5 = L"World!\n"; char buf2[10] = "%s"; int num1 = 67; int num2 = 987654; @@ -125,6 +134,7 @@ do_test (void) setenv ("LIBC_FATAL_STDERR_", "1", 1); struct A { char buf1[9]; char buf2[1]; } a; + struct wA { wchar_t buf1[9]; wchar_t buf2[1]; } wa; printf ("Test checking routines at fortify level %d\n", #ifdef __USE_FORTIFY_LEVEL @@ -140,7 +150,8 @@ do_test (void) if (memcmp (buf, "aabcdefghi", 10)) FAIL (); - if (mempcpy (buf + 5, "abcde", 5) != buf + 10 || memcmp (buf, "aabcdabcde", 10)) + if (mempcpy (buf + 5, "abcde", 5) != buf + 10 + || memcmp (buf, "aabcdabcde", 10)) FAIL (); memset (buf + 8, 'j', 2); @@ -171,7 +182,8 @@ do_test (void) if (memcmp (buf, "aabcdefghi", 10)) FAIL (); - if (mempcpy (buf + 5, "abcde", l0 + 5) != buf + 10 || memcmp (buf, "aabcdabcde", 10)) + if (mempcpy (buf + 5, "abcde", l0 + 5) != buf + 10 + || memcmp (buf, "aabcdabcde", 10)) FAIL (); memset (buf + 8, 'j', l0 + 2); @@ -189,20 +201,24 @@ do_test (void) if (memcmp (buf, "aabcEDX\0\0", 10)) FAIL (); - if (sprintf (buf + 7, "%d", num1) != 2 || memcmp (buf, "aabcEDX67", 10)) + if (stpncpy (buf + 5, "cd", l0 + 5) != buf + 7 + || memcmp (buf, "aabcEcd\0\0", 10)) + FAIL (); + + if (sprintf (buf + 7, "%d", num1) != 2 || memcmp (buf, "aabcEcd67", 10)) FAIL (); - if (snprintf (buf + 7, 3, "%d", num2) != 6 || memcmp (buf, "aabcEDX98", 10)) + if (snprintf (buf + 7, 3, "%d", num2) != 6 || memcmp (buf, "aabcEcd98", 10)) FAIL (); buf[l0 + 8] = '\0'; strcat (buf, "A"); - if (memcmp (buf, "aabcEDX9A", 10)) + if (memcmp (buf, "aabcEcd9A", 10)) FAIL (); buf[l0 + 7] = '\0'; strncat (buf, "ZYXWV", l0 + 2); - if (memcmp (buf, "aabcEDXZY", 10)) + if (memcmp (buf, "aabcEcdZY", 10)) FAIL (); memcpy (a.buf1, "abcdefghij", l0 + 10); @@ -226,14 +242,16 @@ do_test (void) if (memcmp (a.buf1, "aabcEDCBA", 10)) FAIL (); - if (stpcpy (a.buf1 + 8, str2) != a.buf1 + 9 || memcmp (a.buf1, "aabcEDCBF", 10)) + if (stpcpy (a.buf1 + 8, str2) != a.buf1 + 9 + || memcmp (a.buf1, "aabcEDCBF", 10)) FAIL (); strncpy (a.buf1 + 6, "X", l0 + 4); if (memcmp (a.buf1, "aabcEDX\0\0", 10)) FAIL (); - if (sprintf (a.buf1 + 7, "%d", num1) != 2 || memcmp (a.buf1, "aabcEDX67", 10)) + if (sprintf (a.buf1 + 7, "%d", num1) != 2 + || memcmp (a.buf1, "aabcEDX67", 10)) FAIL (); if (snprintf (a.buf1 + 7, 3, "%d", num2) != 6 @@ -284,6 +302,10 @@ do_test (void) CHK_FAIL_END CHK_FAIL_START + stpncpy (buf + 6, "cd", l0 + 5); + CHK_FAIL_END + + CHK_FAIL_START sprintf (buf + 8, "%d", num1); CHK_FAIL_END @@ -354,6 +376,215 @@ do_test (void) CHK_FAIL_END #endif + + /* These ops can be done without runtime checking of object size. */ + wmemcpy (wbuf, L"abcdefghij", 10); + wmemmove (wbuf + 1, wbuf, 9); + if (wmemcmp (wbuf, L"aabcdefghi", 10)) + FAIL (); + + if (wmempcpy (wbuf + 5, L"abcde", 5) != wbuf + 10 + || wmemcmp (wbuf, L"aabcdabcde", 10)) + FAIL (); + + wmemset (wbuf + 8, L'j', 2); + if (wmemcmp (wbuf, L"aabcdabcjj", 10)) + FAIL (); + + wcscpy (wbuf + 4, L"EDCBA"); + if (wmemcmp (wbuf, L"aabcEDCBA", 10)) + FAIL (); + + if (wcpcpy (wbuf + 8, L"F") != wbuf + 9 || wmemcmp (wbuf, L"aabcEDCBF", 10)) + FAIL (); + + wcsncpy (wbuf + 6, L"X", 4); + if (wmemcmp (wbuf, L"aabcEDX\0\0", 10)) + FAIL (); + + if (swprintf (wbuf + 7, 3, L"%ls", L"987654") >= 0 + || wmemcmp (wbuf, L"aabcEDX98", 10)) + FAIL (); + + /* These ops need runtime checking, but shouldn't __chk_fail. */ + wmemcpy (wbuf, L"abcdefghij", l0 + 10); + wmemmove (wbuf + 1, wbuf, l0 + 9); + if (wmemcmp (wbuf, L"aabcdefghi", 10)) + FAIL (); + + if (wmempcpy (wbuf + 5, L"abcde", l0 + 5) != wbuf + 10 + || wmemcmp (wbuf, L"aabcdabcde", 10)) + FAIL (); + + wmemset (wbuf + 8, L'j', l0 + 2); + if (wmemcmp (wbuf, L"aabcdabcjj", 10)) + FAIL (); + + wcscpy (wbuf + 4, wstr1 + 5); + if (wmemcmp (wbuf, L"aabcEDCBA", 10)) + FAIL (); + + if (wcpcpy (wbuf + 8, wstr2) != wbuf + 9 || wmemcmp (wbuf, L"aabcEDCBF", 10)) + FAIL (); + + wcsncpy (wbuf + 6, L"X", l0 + 4); + if (wmemcmp (wbuf, L"aabcEDX\0\0", 10)) + FAIL (); + + if (wcpncpy (wbuf + 5, L"cd", l0 + 5) != wbuf + 7 + || wmemcmp (wbuf, L"aabcEcd\0\0", 10)) + FAIL (); + + if (swprintf (wbuf + 7, 3, L"%d", num2) >= 0 + || wmemcmp (wbuf, L"aabcEcd98", 10)) + FAIL (); + + wbuf[l0 + 8] = L'\0'; + wcscat (wbuf, L"A"); + if (wmemcmp (wbuf, L"aabcEcd9A", 10)) + FAIL (); + + wbuf[l0 + 7] = L'\0'; + wcsncat (wbuf, L"ZYXWV", l0 + 2); + if (wmemcmp (wbuf, L"aabcEcdZY", 10)) + FAIL (); + + wmemcpy (wa.buf1, L"abcdefghij", l0 + 10); + wmemmove (wa.buf1 + 1, wa.buf1, l0 + 9); + if (wmemcmp (wa.buf1, L"aabcdefghi", 10)) + FAIL (); + + if (wmempcpy (wa.buf1 + 5, L"abcde", l0 + 5) != wa.buf1 + 10 + || wmemcmp (wa.buf1, L"aabcdabcde", 10)) + FAIL (); + + wmemset (wa.buf1 + 8, L'j', l0 + 2); + if (wmemcmp (wa.buf1, L"aabcdabcjj", 10)) + FAIL (); + +#if __USE_FORTIFY_LEVEL < 2 + /* The following tests are supposed to crash with -D_FORTIFY_SOURCE=2 + and sufficient GCC support, as the string operations overflow + from a.buf1 into a.buf2. */ + wcscpy (wa.buf1 + 4, wstr1 + 5); + if (wmemcmp (wa.buf1, L"aabcEDCBA", 10)) + FAIL (); + + if (wcpcpy (wa.buf1 + 8, wstr2) != wa.buf1 + 9 + || wmemcmp (wa.buf1, L"aabcEDCBF", 10)) + FAIL (); + + wcsncpy (wa.buf1 + 6, L"X", l0 + 4); + if (wmemcmp (wa.buf1, L"aabcEDX\0\0", 10)) + FAIL (); + + if (swprintf (wa.buf1 + 7, 3, L"%d", num2) >= 0 + || wmemcmp (wa.buf1, L"aabcEDX98", 10)) + FAIL (); + + wa.buf1[l0 + 8] = L'\0'; + wcscat (wa.buf1, L"A"); + if (wmemcmp (wa.buf1, L"aabcEDX9A", 10)) + FAIL (); + + wa.buf1[l0 + 7] = L'\0'; + wcsncat (wa.buf1, L"ZYXWV", l0 + 2); + if (wmemcmp (wa.buf1, L"aabcEDXZY", 10)) + FAIL (); + +#endif + +#if __USE_FORTIFY_LEVEL >= 1 + /* Now check if all buffer overflows are caught at runtime. */ + + CHK_FAIL_START + wmemcpy (wbuf + 1, L"abcdefghij", l0 + 10); + CHK_FAIL_END + + CHK_FAIL_START + wmemmove (wbuf + 2, wbuf + 1, l0 + 9); + CHK_FAIL_END + + CHK_FAIL_START + wp = wmempcpy (wbuf + 6, L"abcde", l0 + 5); + CHK_FAIL_END + + CHK_FAIL_START + wmemset (wbuf + 9, L'j', l0 + 2); + CHK_FAIL_END + + CHK_FAIL_START + wcscpy (wbuf + 5, wstr1 + 5); + CHK_FAIL_END + + CHK_FAIL_START + wp = wcpcpy (wbuf + 9, wstr2); + CHK_FAIL_END + + CHK_FAIL_START + wcsncpy (wbuf + 7, L"X", l0 + 4); + CHK_FAIL_END + + CHK_FAIL_START + wcpncpy (wbuf + 6, L"cd", l0 + 5); + CHK_FAIL_END + + wmemcpy (wbuf, wstr1 + 2, l0 + 9); + CHK_FAIL_START + wcscat (wbuf, L"AB"); + CHK_FAIL_END + + wmemcpy (wbuf, wstr1 + 3, l0 + 8); + CHK_FAIL_START + wcsncat (wbuf, L"ZYXWV", l0 + 3); + CHK_FAIL_END + + CHK_FAIL_START + wmemcpy (wa.buf1 + 1, L"abcdefghij", l0 + 10); + CHK_FAIL_END + + CHK_FAIL_START + wmemmove (wa.buf1 + 2, wa.buf1 + 1, l0 + 9); + CHK_FAIL_END + + CHK_FAIL_START + wp = wmempcpy (wa.buf1 + 6, L"abcde", l0 + 5); + CHK_FAIL_END + + CHK_FAIL_START + wmemset (wa.buf1 + 9, L'j', l0 + 2); + CHK_FAIL_END + +#if __USE_FORTIFY_LEVEL >= 2 +# define O 0 +#else +# define O 1 +#endif + + CHK_FAIL_START + wcscpy (wa.buf1 + (O + 4), wstr1 + 5); + CHK_FAIL_END + + CHK_FAIL_START + wp = wcpcpy (wa.buf1 + (O + 8), wstr2); + CHK_FAIL_END + + CHK_FAIL_START + wcsncpy (wa.buf1 + (O + 6), L"X", l0 + 4); + CHK_FAIL_END + + wmemcpy (wa.buf1, wstr1 + (3 - O), l0 + 8 + O); + CHK_FAIL_START + wcscat (wa.buf1, L"AB"); + CHK_FAIL_END + + wmemcpy (wa.buf1, wstr1 + (4 - O), l0 + 7 + O); + CHK_FAIL_START + wcsncat (wa.buf1, L"ZYXWV", l0 + 3); + CHK_FAIL_END +#endif + + /* Now checks for %n protection. */ /* Constant literals passed directly are always ok @@ -794,5 +1025,236 @@ do_test (void) if (rmdir (fname) != 0) FAIL (); + +#if PATH_MAX > 0 + char largebuf[PATH_MAX]; + char *realres = realpath (".", largebuf); +#endif +#if __USE_FORTIFY_LEVEL >= 1 + CHK_FAIL_START + char realbuf[1]; + realres = realpath (".", realbuf); + CHK_FAIL_END +#endif + + if (setlocale (LC_ALL, "de_DE.UTF-8") != NULL) + { + /* First a simple test. */ + char enough[MB_CUR_MAX]; + if (wctomb (enough, L'A') != 1) + { + puts ("first wctomb test failed"); + ret = 1; + } + +#if __USE_FORTIFY_LEVEL >= 1 + /* We know the wchar_t encoding is ISO 10646. So pick a + character which has a multibyte representation which does not + fit. */ + CHK_FAIL_START + char smallbuf[2]; + if (wctomb (smallbuf, L'\x100') != 2) + { + puts ("second wctomb test failed"); + ret = 1; + } + CHK_FAIL_END +#endif + + mbstate_t s; + memset (&s, '\0', sizeof (s)); + if (wcrtomb (enough, L'A', &s) != 1) + { + puts ("first wcrtomb test failed"); + ret = 1; + } + +#if __USE_FORTIFY_LEVEL >= 1 + /* We know the wchar_t encoding is ISO 10646. So pick a + character which has a multibyte representation which does not + fit. */ + CHK_FAIL_START + char smallbuf[2]; + if (wcrtomb (smallbuf, L'\x100', &s) != 2) + { + puts ("second wcrtomb test failed"); + ret = 1; + } + CHK_FAIL_END +#endif + + wchar_t wenough[10]; + memset (&s, '\0', sizeof (s)); + const char *cp = "A"; + if (mbsrtowcs (wenough, &cp, 10, &s) != 1) + { + puts ("first mbsrtowcs test failed"); + ret = 1; + } + +#if __USE_FORTIFY_LEVEL >= 1 + /* We know the wchar_t encoding is ISO 10646. So pick a + character which has a multibyte representation which does not + fit. */ + CHK_FAIL_START + wchar_t wsmallbuf[2]; + cp = "ABC"; + mbsrtowcs (wsmallbuf, &cp, 10, &s); + CHK_FAIL_END +#endif + + memset (&s, '\0', sizeof (s)); + cp = "A"; + if (mbsnrtowcs (wenough, &cp, 1, 10, &s) != 1) + { + puts ("first mbsnrtowcs test failed"); + ret = 1; + } + +#if __USE_FORTIFY_LEVEL >= 1 + /* We know the wchar_t encoding is ISO 10646. So pick a + character which has a multibyte representation which does not + fit. */ + CHK_FAIL_START + wchar_t wsmallbuf[2]; + cp = "ABC"; + mbsnrtowcs (wsmallbuf, &cp, 3, 10, &s); + CHK_FAIL_END +#endif + + memset (&s, '\0', sizeof (s)); + const wchar_t *wcp = L"A"; + if (wcsrtombs (enough, &wcp, 10, &s) != 1) + { + puts ("first wcsrtombs test failed"); + ret = 1; + } + +#if __USE_FORTIFY_LEVEL >= 1 + /* We know the wchar_t encoding is ISO 10646. So pick a + character which has a multibyte representation which does not + fit. */ + CHK_FAIL_START + char smallbuf[2]; + wcp = L"ABC"; + wcsrtombs (smallbuf, &wcp, 10, &s); + CHK_FAIL_END +#endif + + memset (&s, '\0', sizeof (s)); + wcp = L"A"; + if (wcsnrtombs (enough, &wcp, 1, 10, &s) != 1) + { + puts ("first wcsnrtombs test failed"); + ret = 1; + } + +#if __USE_FORTIFY_LEVEL >= 1 + /* We know the wchar_t encoding is ISO 10646. So pick a + character which has a multibyte representation which does not + fit. */ + CHK_FAIL_START + char smallbuf[2]; + wcp = L"ABC"; + wcsnrtombs (smallbuf, &wcp, 3, 10, &s); + CHK_FAIL_END +#endif + } + else + { + puts ("cannot set locale"); + ret = 1; + } + + fd = posix_openpt (O_RDWR); + if (fd != -1) + { + char enough[1000]; + if (ptsname_r (fd, enough, sizeof (enough)) != 0) + { + puts ("first ptsname_r failed"); + ret = 1; + } + +#if __USE_FORTIFY_LEVEL >= 1 + CHK_FAIL_START + char smallbuf[2]; + if (ptsname_r (fd, smallbuf, sizeof (smallbuf) + 1) == 0) + { + puts ("second ptsname_r somehow suceeded"); + ret = 1; + } + CHK_FAIL_END +#endif + close (fd); + } + + confstr (_CS_GNU_LIBC_VERSION, largebuf, sizeof (largebuf)); +#if __USE_FORTIFY_LEVEL >= 1 + CHK_FAIL_START + char smallbuf[1]; + confstr (_CS_GNU_LIBC_VERSION, smallbuf, sizeof (largebuf)); + CHK_FAIL_END +#endif + + gid_t grpslarge[5]; + int ngr = getgroups (5, grpslarge); +#if __USE_FORTIFY_LEVEL >= 1 + CHK_FAIL_START + char smallbuf[1]; + ngr = getgroups (5, (gid_t *) smallbuf); + CHK_FAIL_END +#endif + + fd = open (_PATH_TTY, O_RDONLY); + if (fd != -1) + { + char enough[1000]; + if (ttyname_r (fd, enough, sizeof (enough)) != 0) + { + puts ("first ttyname_r failed"); + ret = 1; + } + +#if __USE_FORTIFY_LEVEL >= 1 + CHK_FAIL_START + char smallbuf[2]; + if (ttyname_r (fd, smallbuf, sizeof (smallbuf) + 1) == 0) + { + puts ("second ttyname_r somehow suceeded"); + ret = 1; + } + CHK_FAIL_END +#endif + close (fd); + } + + char hostnamelarge[1000]; + gethostname (hostnamelarge, sizeof (hostnamelarge)); +#if __USE_FORTIFY_LEVEL >= 1 + CHK_FAIL_START + char smallbuf[1]; + gethostname (smallbuf, sizeof (hostnamelarge)); + CHK_FAIL_END +#endif + + char loginlarge[1000]; + getlogin_r (loginlarge, sizeof (hostnamelarge)); +#if __USE_FORTIFY_LEVEL >= 1 + CHK_FAIL_START + char smallbuf[1]; + getlogin_r (smallbuf, sizeof (loginlarge)); + CHK_FAIL_END +#endif + + char domainnamelarge[1000]; + int res = getdomainname (domainnamelarge, sizeof (domainnamelarge)); +#if __USE_FORTIFY_LEVEL >= 1 + CHK_FAIL_START + char smallbuf[1]; + res = getdomainname (smallbuf, sizeof (domainnamelarge)); + CHK_FAIL_END +#endif + return ret; } diff --git a/debug/ttyname_r_chk.c b/debug/ttyname_r_chk.c new file mode 100644 index 0000000000..9b06d5a718 --- /dev/null +++ b/debug/ttyname_r_chk.c @@ -0,0 +1,29 @@ +/* Copyright (C) 2005 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 + 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 <unistd.h> + + +int +__ttyname_r_chk (int fd, char *buf, size_t buflen, size_t nreal) +{ + if (buflen > nreal) + __chk_fail (); + + return __ttyname_r (fd, buf, buflen); +} diff --git a/debug/vfwprintf_chk.c b/debug/vfwprintf_chk.c new file mode 100644 index 0000000000..d4af557ae4 --- /dev/null +++ b/debug/vfwprintf_chk.c @@ -0,0 +1,42 @@ +/* Copyright (C) 1991, 1995, 1996, 1997, 2001, 2004, 2005 + 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 + 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 <stdarg.h> +#include <wchar.h> +#include "../libio/libioP.h" + + +/* Write formatted output to FP from the format string FORMAT. */ +int +__vfwprintf_chk (FILE *fp, int flag, const wchar_t *format, va_list ap) +{ + int done; + + _IO_acquire_lock (fp); + if (flag > 0) + fp->_flags2 |= _IO_FLAGS2_FORTIFY; + + done = _IO_vfwprintf (fp, format, ap); + + if (flag > 0) + fp->_flags2 &= ~_IO_FLAGS2_FORTIFY; + _IO_release_lock (fp); + + return done; +} diff --git a/debug/vswprintf_chk.c b/debug/vswprintf_chk.c new file mode 100644 index 0000000000..f9a50c6e5d --- /dev/null +++ b/debug/vswprintf_chk.c @@ -0,0 +1,75 @@ +/* Copyright (C) 1991,1995,1997,1998,2004,2005 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 + 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 <stdarg.h> +#include <wchar.h> +#include "../libio/libioP.h" +#include "../libio/strfile.h" + + +/* Write formatted output into S, according to the format + string FORMAT, writing no more than MAXLEN characters. */ +/* VARARGS5 */ +int +__vswprintf_chk (wchar_t *s, size_t maxlen, int flags, size_t slen, + const wchar_t *format, va_list args) +{ + /* XXX Maybe for less strict version do not fail immediately. + Though, maxlen is supposed to be the size of buffer pointed + to by s, so a conforming program can't pass such maxlen + to *snprintf. */ + if (__builtin_expect (slen < maxlen, 0)) + __chk_fail (); + + _IO_wstrnfile sf; + struct _IO_wide_data wd; + int ret; +#ifdef _IO_MTSAFE_IO + sf.f._sbf._f._lock = NULL; +#endif + + /* We need to handle the special case where MAXLEN is 0. Use the + overflow buffer right from the start. */ + if (__builtin_expect (maxlen == 0, 0)) + /* Since we have to write at least the terminating L'\0' a buffer + length of zero always makes the function fail. */ + return -1; + + _IO_no_init (&sf.f._sbf._f, _IO_USER_LOCK, 0, &wd, &_IO_wstrn_jumps); + _IO_fwide (&sf.f._sbf._f, 1); + s[0] = L'\0'; + + /* For flags > 0 (i.e. __USE_FORTIFY_LEVEL > 1) request that %n + can only come from read-only format strings. */ + if (flags > 0) + sf.f._sbf._f._flags2 |= _IO_FLAGS2_FORTIFY; + + _IO_wstr_init_static (&sf.f._sbf._f, s, maxlen - 1, s); + ret = _IO_vfwprintf ((_IO_FILE *) &sf.f._sbf, format, args); + + if (sf.f._sbf._f._wide_data->_IO_buf_base == sf.overflow_buf) + /* ISO C99 requires swprintf/vswprintf to return an error if the + output does not fit int he provided buffer. */ + return -1; + + /* Terminate the string. */ + *sf.f._sbf._f._wide_data->_IO_write_ptr = '\0'; + + return ret; +} +libc_hidden_def (__vswprintf_chk) diff --git a/debug/vwprintf_chk.c b/debug/vwprintf_chk.c new file mode 100644 index 0000000000..3b959b2968 --- /dev/null +++ b/debug/vwprintf_chk.c @@ -0,0 +1,43 @@ +/* Copyright (C) 1991, 1995, 1996, 1997, 2001, 2004, 2005 + 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 + 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 <stdarg.h> +#include <stdio.h> +#include <wchar.h> +#include "../libio/libioP.h" + + +/* Write formatted output to stdout from the format string FORMAT. */ +int +__vwprintf_chk (int flag, const wchar_t *format, va_list ap) +{ + int done; + + _IO_acquire_lock (stdout); + if (flag > 0) + stdout->_flags2 |= _IO_FLAGS2_FORTIFY; + + done = _IO_vfwprintf (stdout, format, ap); + + if (flag > 0) + stdout->_flags2 &= ~_IO_FLAGS2_FORTIFY; + _IO_release_lock (stdout); + + return done; +} diff --git a/debug/wcpcpy_chk.c b/debug/wcpcpy_chk.c new file mode 100644 index 0000000000..c48ec68ccc --- /dev/null +++ b/debug/wcpcpy_chk.c @@ -0,0 +1,45 @@ +/* Copyright (C) 1996, 1997, 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996. + + 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 <wchar.h> + +#define __need_ptrdiff_t +#include <stddef.h> + + +/* Copy SRC to DEST, returning the address of the terminating L'\0' in + DEST. Check for overflows. */ +wchar_t * +__wcpcpy_chk (wchar_t *dest, const wchar_t *src, size_t destlen) +{ + wchar_t *wcp = (wchar_t *) dest - 1; + wint_t c; + const ptrdiff_t off = src - dest + 1; + + do + { + if (__builtin_expect (destlen-- == 0, 0)) + __chk_fail (); + c = wcp[off]; + *++wcp = c; + } + while (c != L'\0'); + + return wcp; +} diff --git a/debug/wcpncpy_chk.c b/debug/wcpncpy_chk.c new file mode 100644 index 0000000000..ea1340191a --- /dev/null +++ b/debug/wcpncpy_chk.c @@ -0,0 +1,33 @@ +/* Copyright (C) 1995, 1996, 1997, 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. + + 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 <wchar.h> + + +/* Copy no more than N wide-characters of SRC to DEST. */ +wchar_t * +__wcpncpy_chk (wchar_t *dest, const wchar_t *src, size_t n, size_t destlen) +{ + if (__builtin_expect (destlen < n, 0)) + __chk_fail (); + + /* This function is not often enough used to justify not using a + tail call. */ + return __wcpncpy (dest, src, n); +} diff --git a/debug/wcrtomb_chk.c b/debug/wcrtomb_chk.c new file mode 100644 index 0000000000..228430f373 --- /dev/null +++ b/debug/wcrtomb_chk.c @@ -0,0 +1,35 @@ +/* Copyright (C) 2005 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 + 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 <langinfo.h> +#include <locale.h> +#include <stdlib.h> +#include <wchar.h> +#include <locale/localeinfo.h> + + +size_t +__wcrtomb_chk (char *s, wchar_t wchar, mbstate_t *ps, size_t buflen) +{ + /* We do not have to implement the full wctomb semantics since we + know that S cannot be NULL when we come here. */ + if (buflen < MB_CUR_MAX) + __chk_fail (); + + return __wcrtomb (s, wchar, ps); +} diff --git a/debug/wcscat_chk.c b/debug/wcscat_chk.c new file mode 100644 index 0000000000..eef04519fd --- /dev/null +++ b/debug/wcscat_chk.c @@ -0,0 +1,55 @@ +/* Copyright (C) 1995, 1996, 1997, 2001, 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. + + 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 <wchar.h> + + +/* Append SRC on the end of DEST. Check for overflows. */ +wchar_t * +__wcscat_chk (wchar_t *dest, const wchar_t *src, size_t destlen) +{ + register wchar_t *s1 = dest; + register const wchar_t *s2 = src; + wchar_t c; + + /* Find the end of the string. */ + do + { + if (__builtin_expect (destlen-- == 0, 0)) + __chk_fail (); + c = *s1++; + } + while (c != L'\0'); + + /* Make S1 point before the next character, so we can increment + it while memory is read (wins on pipelined cpus). */ + s1 -= 2; + ++destlen; + + do + { + if (__builtin_expect (destlen-- == 0, 0)) + __chk_fail (); + c = *s2++; + *++s1 = c; + } + while (c != L'\0'); + + return dest; +} diff --git a/debug/wcscpy_chk.c b/debug/wcscpy_chk.c new file mode 100644 index 0000000000..93b78cd01c --- /dev/null +++ b/debug/wcscpy_chk.c @@ -0,0 +1,61 @@ +/* Copyright (C) 1995, 1996, 1997, 2003, 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. + + 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 <stddef.h> +#include <wchar.h> + + +/* Copy SRC to DEST. */ +wchar_t * +__wcscpy_chk (wchar_t *dest, const wchar_t *src, size_t n) +{ + wint_t c; + wchar_t *wcp; + + if (__alignof__ (wchar_t) >= sizeof (wchar_t)) + { + const ptrdiff_t off = dest - src - 1; + + wcp = (wchar_t *) src; + + do + { + if (__builtin_expect (n-- == 0, 0)) + __chk_fail (); + c = *wcp++; + wcp[off] = c; + } + while (c != L'\0'); + } + else + { + wcp = dest; + + do + { + if (__builtin_expect (n-- == 0, 0)) + __chk_fail (); + c = *src++; + *wcp++ = c; + } + while (c != L'\0'); + } + + return dest; +} diff --git a/debug/wcsncat_chk.c b/debug/wcsncat_chk.c new file mode 100644 index 0000000000..b28773ff27 --- /dev/null +++ b/debug/wcsncat_chk.c @@ -0,0 +1,96 @@ +/* Copyright (C) 1995, 1996, 1997, 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. + + 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 <wchar.h> + + +/* Append no more than N wide-character of SRC onto DEST. */ +wchar_t * +__wcsncat_chk (wchar_t *dest, const wchar_t *src, size_t n, size_t destlen) +{ + wchar_t c; + wchar_t * const s = dest; + + /* Find the end of DEST. */ + do + { + if (__builtin_expect (destlen-- == 0, 0)) + __chk_fail (); + c = *dest++; + } + while (c != L'\0'); + + /* Make DEST point before next character, so we can increment + it while memory is read (wins on pipelined cpus). */ + ++destlen; + dest -= 2; + + if (n >= 4) + { + size_t n4 = n >> 2; + do + { + if (__builtin_expect (destlen-- == 0, 0)) + __chk_fail (); + c = *src++; + *++dest = c; + if (c == L'\0') + return s; + if (__builtin_expect (destlen-- == 0, 0)) + __chk_fail (); + c = *src++; + *++dest = c; + if (c == L'\0') + return s; + if (__builtin_expect (destlen-- == 0, 0)) + __chk_fail (); + c = *src++; + *++dest = c; + if (c == L'\0') + return s; + if (__builtin_expect (destlen-- == 0, 0)) + __chk_fail (); + c = *src++; + *++dest = c; + if (c == L'\0') + return s; + } while (--n4 > 0); + n &= 3; + } + + while (n > 0) + { + if (__builtin_expect (destlen-- == 0, 0)) + __chk_fail (); + c = *src++; + *++dest = c; + if (c == L'\0') + return s; + n--; + } + + if (c != L'\0') + { + if (__builtin_expect (destlen-- == 0, 0)) + __chk_fail (); + *++dest = L'\0'; + } + + return s; +} diff --git a/debug/wcsncpy_chk.c b/debug/wcsncpy_chk.c new file mode 100644 index 0000000000..199e4b01ab --- /dev/null +++ b/debug/wcsncpy_chk.c @@ -0,0 +1,33 @@ +/* Copyright (C) 1995, 1996, 1997, 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. + + 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 <wchar.h> + + +/* Copy no more than N wide-characters of SRC to DEST. */ +wchar_t * +__wcsncpy_chk (wchar_t *dest, const wchar_t *src, size_t n, size_t destlen) +{ + if (__builtin_expect (destlen < n, 0)) + __chk_fail (); + + /* This function is not often enough used to justify not using a + tail call. */ + return __wcsncpy (dest, src, n); +} diff --git a/debug/wcsnrtombs_chk.c b/debug/wcsnrtombs_chk.c new file mode 100644 index 0000000000..67644bd557 --- /dev/null +++ b/debug/wcsnrtombs_chk.c @@ -0,0 +1,31 @@ +/* Copyright (C) 2005 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 + 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 <locale.h> +#include <wchar.h> + + +size_t +__wcsnrtombs_chk (char *dst, __const wchar_t **src, size_t nwc, size_t len, + mbstate_t *ps, size_t dstlen) +{ + if (__builtin_expect (dstlen < len, 0)) + __chk_fail (); + + return __wcsnrtombs (dst, src, nwc, len, ps); +} diff --git a/debug/wcsrtombs_chk.c b/debug/wcsrtombs_chk.c new file mode 100644 index 0000000000..9334267bae --- /dev/null +++ b/debug/wcsrtombs_chk.c @@ -0,0 +1,31 @@ +/* Copyright (C) 2005 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 + 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 <locale.h> +#include <wchar.h> + + +size_t +__wcsrtombs_chk (char *dst, __const wchar_t **src, size_t len, + mbstate_t *ps, size_t dstlen) +{ + if (__builtin_expect (dstlen < len, 0)) + __chk_fail (); + + return __wcsrtombs (dst, src, len, ps); +} diff --git a/debug/wctomb_chk.c b/debug/wctomb_chk.c new file mode 100644 index 0000000000..d0366346b8 --- /dev/null +++ b/debug/wctomb_chk.c @@ -0,0 +1,36 @@ +/* Copyright (C) 2005 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 + 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 <locale.h> +#include <stdlib.h> +#include <wcsmbs/wcsmbsload.h> + + +extern mbstate_t __no_r_state attribute_hidden; /* Defined in mbtowc.c. */ + + +int +__wctomb_chk (char *s, wchar_t wchar, size_t buflen) +{ + /* We do not have to implement the full wctomb semantics since we + know that S cannot be NULL when we come here. */ + if (buflen < MB_CUR_MAX) + __chk_fail (); + + return __wcrtomb (s, wchar, &__no_r_state); +} diff --git a/debug/wmemcpy_chk.c b/debug/wmemcpy_chk.c new file mode 100644 index 0000000000..eeee927e91 --- /dev/null +++ b/debug/wmemcpy_chk.c @@ -0,0 +1,30 @@ +/* Copyright (C) 1996, 1997, 1999, 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.org>, 1996. + + 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 <wchar.h> +#include <string.h> + + +wchar_t * +__wmemcpy_chk (wchar_t *s1, const wchar_t *s2, size_t n, size_t ns1) +{ + if (__builtin_expect (ns1 < n, 0)) + __chk_fail (); + return (wchar_t *) memcpy ((char *) s1, (char *) s2, n * sizeof (wchar_t)); +} diff --git a/debug/wmemmove_chk.c b/debug/wmemmove_chk.c new file mode 100644 index 0000000000..da0446eb28 --- /dev/null +++ b/debug/wmemmove_chk.c @@ -0,0 +1,30 @@ +/* Copyright (C) 1996, 1997, 1999, 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu> + + 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 <wchar.h> +#include <string.h> + + +wchar_t * +__wmemmove_chk (wchar_t *s1, const wchar_t *s2, size_t n, size_t ns1) +{ + if (__builtin_expect (ns1 < n, 0)) + __chk_fail (); + return (wchar_t *) memmove ((char *) s1, (char *) s2, n * sizeof (wchar_t)); +} diff --git a/debug/wmempcpy_chk.c b/debug/wmempcpy_chk.c new file mode 100644 index 0000000000..52c629a354 --- /dev/null +++ b/debug/wmempcpy_chk.c @@ -0,0 +1,31 @@ +/* Copyright (C) 1999, 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.org>, 1999. + + 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 <wchar.h> +#include <string.h> + + +wchar_t * +__wmempcpy_chk (wchar_t *s1, const wchar_t *s2, size_t n, size_t ns1) +{ + if (__builtin_expect (ns1 < n, 0)) + __chk_fail (); + return (wchar_t *) __mempcpy ((char *) s1, (char *) s2, + n * sizeof (wchar_t)); +} diff --git a/debug/wmemset_chk.c b/debug/wmemset_chk.c new file mode 100644 index 0000000000..5ed88e83a2 --- /dev/null +++ b/debug/wmemset_chk.c @@ -0,0 +1,30 @@ +/* Copyright (C) 1996,97,99,2002,2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.org>, 1996. + + 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 <wchar.h> + + +wchar_t * +__wmemset_chk (wchar_t *s, wchar_t c, size_t n, size_t dstlen) +{ + if (__builtin_expect (dstlen < n, 0)) + __chk_fail (); + + return wmemset (s, c, n); +} diff --git a/debug/wprintf_chk.c b/debug/wprintf_chk.c new file mode 100644 index 0000000000..e0a82617ad --- /dev/null +++ b/debug/wprintf_chk.c @@ -0,0 +1,46 @@ +/* Copyright (C) 1991, 1995, 1996, 1997, 2001, 2004, 2005 + 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 + 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 <stdarg.h> +#include <stdio.h> +#include <wchar.h> +#include "../libio/libioP.h" + + +/* Write formatted output to stdout from the format string FORMAT. */ +int +__wprintf_chk (int flag, const wchar_t *format, ...) +{ + va_list ap; + int done; + + _IO_acquire_lock (stdout); + if (flag > 0) + stdout->_flags2 |= _IO_FLAGS2_FORTIFY; + + va_start (ap, format); + done = _IO_vfwprintf (stdout, format, ap); + va_end (ap); + + if (flag > 0) + stdout->_flags2 &= ~_IO_FLAGS2_FORTIFY; + _IO_release_lock (stdout); + + return done; +} diff --git a/fedora/branch.mk b/fedora/branch.mk index 7aea6ca945..c00168229f 100644 --- a/fedora/branch.mk +++ b/fedora/branch.mk @@ -1,5 +1,5 @@ # This file is updated automatically by Makefile. glibc-branch := fedora glibc-base := HEAD -fedora-sync-date := 2005-07-08 08:11 UTC -fedora-sync-tag := fedora-glibc-20050708T0811 +fedora-sync-date := 2005-07-21 08:14 UTC +fedora-sync-tag := fedora-glibc-20050721T0814 diff --git a/gmon/gmon.c b/gmon/gmon.c index 8eb0736193..d292454ab5 100644 --- a/gmon/gmon.c +++ b/gmon/gmon.c @@ -331,7 +331,7 @@ write_gmon (void) { size_t len = strlen (env); char buf[len + 20]; - sprintf (buf, "%s.%u", env, __getpid ()); + snprintf (buf, sizeof (buf), "%s.%u", env, __getpid ()); fd = open_not_cancel (buf, O_CREAT|O_TRUNC|O_WRONLY|O_NOFOLLOW, 0666); } @@ -343,14 +343,8 @@ write_gmon (void) { char buf[300]; int errnum = errno; -#ifdef USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - __fwprintf (stderr, L"_mcleanup: gmon.out: %s\n", - __strerror_r (errnum, buf, sizeof buf)); - else -#endif - fprintf (stderr, "_mcleanup: gmon.out: %s\n", - __strerror_r (errnum, buf, sizeof buf)); + __fxprintf (NULL, "_mcleanup: gmon.out: %s\n", + __strerror_r (errnum, buf, sizeof buf)); return; } } diff --git a/include/bits/stdlib.h b/include/bits/stdlib.h new file mode 100644 index 0000000000..8541e278c7 --- /dev/null +++ b/include/bits/stdlib.h @@ -0,0 +1 @@ +#include <stdlib/bits/stdlib.h> diff --git a/include/bits/wchar2.h b/include/bits/wchar2.h new file mode 100644 index 0000000000..a18dccfc55 --- /dev/null +++ b/include/bits/wchar2.h @@ -0,0 +1 @@ +#include <wcsmbs/bits/wchar2.h> diff --git a/include/fenv.h b/include/fenv.h index 206309179f..673eb4b977 100644 --- a/include/fenv.h +++ b/include/fenv.h @@ -13,5 +13,7 @@ extern int __feupdateenv (__const fenv_t *__envp); libm_hidden_proto (feraiseexcept) libm_hidden_proto (fesetenv) +libm_hidden_proto (fesetround) +libm_hidden_proto (feholdexcept) #endif diff --git a/include/libc-symbols.h b/include/libc-symbols.h index cdbc4ef202..4fef305814 100644 --- a/include/libc-symbols.h +++ b/include/libc-symbols.h @@ -708,6 +708,24 @@ for linking") # define libresolv_hidden_data_ver(local, name) #endif +#if defined NOT_IN_libc && defined IS_IN_librt +# define librt_hidden_proto(name, attrs...) hidden_proto (name, ##attrs) +# define librt_hidden_def(name) hidden_def (name) +# define librt_hidden_weak(name) hidden_weak (name) +# define librt_hidden_ver(local, name) hidden_ver (local, name) +# define librt_hidden_data_def(name) hidden_data_def (name) +# define librt_hidden_data_weak(name) hidden_data_weak (name) +# define librt_hidden_data_ver(local, name) hidden_data_ver (local, name) +#else +# define librt_hidden_proto(name, attrs...) +# define librt_hidden_def(name) +# define librt_hidden_weak(name) +# define librt_hidden_ver(local, name) +# define librt_hidden_data_def(name) +# define librt_hidden_data_weak(name) +# define librt_hidden_data_ver(local, name) +#endif + #if defined NOT_IN_libc && defined IS_IN_libdl # define libdl_hidden_proto(name, attrs...) hidden_proto (name, ##attrs) # define libdl_hidden_def(name) hidden_def (name) diff --git a/include/stdio.h b/include/stdio.h index c8c89ad878..9220db5b80 100644 --- a/include/stdio.h +++ b/include/stdio.h @@ -79,6 +79,8 @@ extern int __ftrylockfile (FILE *__stream); extern int __getc_unlocked (FILE *__fp); extern wint_t __getwc_unlocked (FILE *__fp); +extern int __fxprintf (FILE *__fp, const char *__fmt, ...) + __attribute__ ((__format__ (__printf__, 2, 3))); extern __const char *__const _sys_errlist_internal[] attribute_hidden; extern int _sys_nerr_internal attribute_hidden; diff --git a/include/stdlib.h b/include/stdlib.h index 7723bf6856..49e87576f3 100644 --- a/include/stdlib.h +++ b/include/stdlib.h @@ -95,8 +95,8 @@ extern int __cxa_atexit_internal (void (*func) (void *), void *arg, void *d) extern void __cxa_finalize (void *d); -extern int __posix_memalign (void **memptr, size_t alignment, size_t size) - __attribute_malloc__; +extern int __posix_memalign (void **memptr, size_t alignment, size_t size); + extern void *__libc_memalign (size_t alignment, size_t size) __attribute_malloc__; diff --git a/include/time.h b/include/time.h index 795eb5f504..3d8fef8bf9 100644 --- a/include/time.h +++ b/include/time.h @@ -17,6 +17,8 @@ libc_hidden_proto (localtime) libc_hidden_proto (strftime) libc_hidden_proto (strptime) +librt_hidden_proto (clock_gettime) + /* Now define the internal interfaces. */ struct tm; diff --git a/include/wchar.h b/include/wchar.h index 0f91114c41..e8079e6d80 100644 --- a/include/wchar.h +++ b/include/wchar.h @@ -82,6 +82,8 @@ extern size_t __wcsnrtombs (char *__restrict __dst, __const wchar_t **__restrict __src, size_t __nwc, size_t __len, __mbstate_t *__restrict __ps); +extern wchar_t *__wcsncpy (wchar_t *__restrict __dest, + __const wchar_t *__restrict __src, size_t __n); extern wchar_t *__wcpcpy (wchar_t *__dest, __const wchar_t *__src); extern wchar_t *__wcpncpy (wchar_t *__dest, __const wchar_t *__src, size_t __n); @@ -112,6 +114,13 @@ extern int __vfwprintf (__FILE *__restrict __s, /* __attribute__ ((__format__ (__wprintf__, 3, 0))) */; +extern int __vswprintf_chk (wchar_t *__restrict __s, size_t __n, + int __flag, size_t __s_len, + __const wchar_t *__restrict __format, + __gnuc_va_list __arg) + /* __attribute__ ((__format__ (__wprintf__, 5, 0))) */; +libc_hidden_proto (__vswprintf_chk) + /* Internal functions. */ extern size_t __mbsrtowcs_l (wchar_t *dst, const char **src, size_t len, mbstate_t *ps, __locale_t l) attribute_hidden; diff --git a/inet/rcmd.c b/inet/rcmd.c index 0bcb731a16..da6c070764 100644 --- a/inet/rcmd.c +++ b/inet/rcmd.c @@ -137,21 +137,13 @@ rcmd_af(ahost, rport, locuser, remuser, cmd, fd2p, af) (void)__snprintf(num, sizeof(num), "%d", ntohs(rport)); error = getaddrinfo(*ahost, num, &hints, &res); if (error) { - if (error == EAI_NONAME && *ahost != NULL) { - if (_IO_fwide (stderr, 0) > 0) - __fwprintf(stderr, L"%s: Unknown host\n", - *ahost); - else - fprintf(stderr, "%s: Unknown host\n", *ahost); - } else { - if (_IO_fwide (stderr, 0) > 0) - __fwprintf(stderr, L"rcmd: getaddrinfo: %s\n", - gai_strerror(error)); - else - fprintf(stderr, "rcmd: getaddrinfo: %s\n", - gai_strerror(error)); - } - return (-1); + if (error == EAI_NONAME && *ahost != NULL) + __fxprintf(NULL, "%s: Unknown host\n", *ahost); + else + __fxprintf(NULL, "rcmd: getaddrinfo: %s\n", + gai_strerror(error)); + + return -1; } pfd[0].events = POLLIN; @@ -161,13 +153,9 @@ rcmd_af(ahost, rport, locuser, remuser, cmd, fd2p, af) free (ahostbuf); ahostbuf = strdup (res->ai_canonname); if (ahostbuf == NULL) { - if (_IO_fwide (stderr, 0) > 0) - __fwprintf(stderr, L"%s", - _("rcmd: Cannot allocate memory\n")); - else - fputs(_("rcmd: Cannot allocate memory\n"), - stderr); - return (-1); + __fxprintf(NULL, "%s", + _("rcmd: Cannot allocate memory\n")); + return -1; } *ahost = ahostbuf; } else @@ -180,20 +168,12 @@ rcmd_af(ahost, rport, locuser, remuser, cmd, fd2p, af) s = rresvport_af(&lport, ai->ai_family); if (s < 0) { - if (errno == EAGAIN) { - if (_IO_fwide (stderr, 0) > 0) - __fwprintf(stderr, L"%s", - _("rcmd: socket: All ports in use\n")); - else - fputs(_("rcmd: socket: All ports in use\n"), - stderr); - } else { - if (_IO_fwide (stderr, 0) > 0) - __fwprintf(stderr, - L"rcmd: socket: %m\n"); - else - fprintf(stderr, "rcmd: socket: %m\n"); - } + if (errno == EAGAIN) + __fxprintf(NULL, "%s", _("\ +rcmd: socket: All ports in use\n")); + else + __fxprintf(NULL, "rcmd: socket: %m\n"); + __sigsetmask(oldmask); freeaddrinfo(res); return -1; @@ -220,10 +200,7 @@ rcmd_af(ahost, rport, locuser, remuser, cmd, fd2p, af) if (__asprintf (&buf, _("connect to address %s: "), paddr) >= 0) { - if (_IO_fwide (stderr, 0) > 0) - __fwprintf(stderr, L"%s", buf); - else - fputs (buf, stderr); + __fxprintf(NULL, "%s", buf); free (buf); } __set_errno (oerrno); @@ -235,10 +212,7 @@ rcmd_af(ahost, rport, locuser, remuser, cmd, fd2p, af) NI_NUMERICHOST); if (__asprintf (&buf, _("Trying %s...\n"), paddr) >= 0) { - if (_IO_fwide (stderr, 0) > 0) - __fwprintf (stderr, L"%s", buf); - else - fputs (buf, stderr); + __fxprintf (NULL, "%s", buf); free (buf); } continue; @@ -251,14 +225,8 @@ rcmd_af(ahost, rport, locuser, remuser, cmd, fd2p, af) continue; } freeaddrinfo(res); - if (_IO_fwide (stderr, 0) > 0) - (void)__fwprintf(stderr, L"%s: %s\n", *ahost, - __strerror_r(errno, - errbuf, sizeof (errbuf))); - else - (void)fprintf(stderr, "%s: %s\n", *ahost, - __strerror_r(errno, - errbuf, sizeof (errbuf))); + (void)__fxprintf(NULL, "%s: %s\n", *ahost, + __strerror_r(errno, errbuf, sizeof (errbuf))); __sigsetmask(oldmask); return -1; } @@ -281,10 +249,7 @@ rcmd_af(ahost, rport, locuser, remuser, cmd, fd2p, af) if (__asprintf (&buf, _("\ rcmd: write (setting up stderr): %m\n")) >= 0) { - if (_IO_fwide (stderr, 0) > 0) - __fwprintf(stderr, L"%s", buf); - else - fputs (buf, stderr); + __fxprintf(NULL, "%s", buf); free (buf); } (void)__close(s2); @@ -303,10 +268,7 @@ rcmd: poll (setting up stderr): %m\n")) >= 0) && __asprintf(&buf, _("\ poll: protocol failure in circuit setup\n")) >= 0)) { - if (_IO_fwide (stderr, 0) > 0) - __fwprintf (stderr, L"%s", buf); - else - fputs (buf, stderr); + __fxprintf (NULL, "%s", buf); free (buf); } (void)__close(s2); @@ -327,12 +289,7 @@ poll: protocol failure in circuit setup\n")) >= 0)) } (void)__close(s2); if (s3 < 0) { - if (_IO_fwide (stderr, 0) > 0) - (void)__fwprintf(stderr, - L"rcmd: accept: %m\n"); - else - (void)fprintf(stderr, - "rcmd: accept: %m\n"); + (void)__fxprintf(NULL, "rcmd: accept: %m\n"); lport = 0; goto bad; } @@ -344,10 +301,7 @@ poll: protocol failure in circuit setup\n")) >= 0)) if (__asprintf(&buf, _("\ socket: protocol failure in circuit setup\n")) >= 0) { - if (_IO_fwide (stderr, 0) > 0) - __fwprintf (stderr, L"%s", buf); - else - fputs (buf, stderr); + __fxprintf (NULL, "%s", buf); free (buf); } goto bad2; @@ -373,10 +327,7 @@ socket: protocol failure in circuit setup\n")) >= 0) || (n != 0 && __asprintf(&buf, "rcmd: %s: %m\n", *ahost) >= 0)) { - if (_IO_fwide (stderr, 0) > 0) - __fwprintf (stderr, L"%s", buf); - else - fputs (buf, stderr); + __fxprintf (NULL, "%s", buf); free (buf); } goto bad2; diff --git a/libio/strfile.h b/libio/strfile.h index b91111a9d6..53a36a3db8 100644 --- a/libio/strfile.h +++ b/libio/strfile.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1993, 1997, 1998, 1999 Free Software Foundation, Inc. +/* Copyright (C) 1993, 1997, 1998, 1999, 2005 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 @@ -73,3 +73,14 @@ typedef struct } _IO_strnfile; extern const struct _IO_jump_t _IO_strn_jumps attribute_hidden; + + +typedef struct +{ + _IO_strfile f; + /* This is used for the characters which do not fit in the buffer + provided by the user. */ + wchar_t overflow_buf[64]; +} _IO_wstrnfile; + +extern const struct _IO_jump_t _IO_wstrn_jumps attribute_hidden; diff --git a/libio/vswprintf.c b/libio/vswprintf.c index 42168aade4..eda8495241 100644 --- a/libio/vswprintf.c +++ b/libio/vswprintf.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1994,1997,1999-2002,2004 Free Software Foundation, Inc. +/* Copyright (C) 1994,1997,1999-2002,2004,2005 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 @@ -29,15 +29,6 @@ #include "strfile.h" -typedef struct -{ - _IO_strfile f; - /* This is used for the characters which do not fit in the buffer - provided by the user. */ - wchar_t overflow_buf[64]; -} _IO_wstrnfile; - - static wint_t _IO_wstrn_overflow (_IO_FILE *fp, wint_t c) __THROW; static wint_t @@ -75,7 +66,7 @@ _IO_wstrn_overflow (fp, c) } -static const struct _IO_jump_t _IO_wstrn_jumps = +const struct _IO_jump_t _IO_wstrn_jumps attribute_hidden = { JUMP_INIT_DUMMY, JUMP_INIT(finish, _IO_wstr_finish), diff --git a/localedata/ChangeLog b/localedata/ChangeLog index d80d6cef79..4095ee0782 100644 --- a/localedata/ChangeLog +++ b/localedata/ChangeLog @@ -1,3 +1,8 @@ +2005-07-08 Ulrich Drepper <drepper@redhat.com> + + [BZ #408] + * locales/vi_VN: Update locale. + 2005-07-05 Ulrich Drepper <drepper@redhat.com> * locales/en_US: Remove duplicate am_pn entry. @@ -10,14 +15,17 @@ 2005-05-22 Ulrich Drepper <drepper@redhat.com> + [BZ #1092] * locales/mn_MN: Update. Patch by Sanlig Badral <s_badral@yahoo.com>. 2005-04-28 Jakub Jelinek <jakub@redhat.com> + [BZ #1084] * SUPPORTED: Add UTF-8 locales where UTF-8 was not already supported. 2005-04-26 Ulrich Drepper <drepper@redhat.com> + [BZ #1091] * locales/fa_IR: Add alt_digits, change date and time representation, and various cleanups. Patch by Hamed Malek <hamed@bamdad.org>. @@ -36,10 +44,12 @@ 2005-03-18 Andreas Schwab <schwab@suse.de> + [BZ #622] * locales/pa_IN (am_pm): Fix character names. 2005-03-18 Ulrich Drepper <drepper@redhat.com> + [BZ #1084] * SUPPORTED (SUPPORTED-LOCALES): Add af_ZA.UTF-8. 2004-12-19 Roland McGrath <roland@frob.com> diff --git a/localedata/locales/vi_VN b/localedata/locales/vi_VN index df8fe35f6b..7fc8018552 100644 --- a/localedata/locales/vi_VN +++ b/localedata/locales/vi_VN @@ -1,23 +1,35 @@ -comment_char % -escape_char / -% Vietnamese language locale for Vietnam. -% Contributed by Kentaroh Noji <knoji@jp.ibm.com> and -% Tetsuji Orita <orita@jp.ibm.com>. - -% Revised by Le Hong Boi +escape_char / +comment_char % +% +% Vietnamese language locale for Vietnam +% Source: TCVN table and info from vietnamese native speakers +% Address: +% Contact: Pablo Saratxaga +% Email: srtxg@chanae.alphanet.ch +% Tel: +% Fax: +% Language: vi +% Territory: VN +% Revision: 0.7 +% Date: 2003-02-06 +% Users: general +% Repertoiremap: +% Charset: UTF-8 +% Distribution and use is free, also +% for commercial purposes. LC_IDENTIFICATION title "Vietnamese language locale for Vietnam" -source "IBM Globalization Center of Competency, Yamato Software Laboratory" -address "1623-14, Shimotsuruma, Yamato-shi, Kanagawa-ken, 242-8502, Japan" -contact "" -email "bug-glibc-locales@gnu.org" +source "TCVN table and info from vietnamese native speakers" +address "" +contact "Pablo Saratxaga" +email "srtxg@chanae.alphanet.ch" tel "" fax "" language "Vietnamese" territory "Vietnam" -revision "1.0" -date "2000-07-20" +revision "0.6" +date "2001-01-29" % category "vi_VN:2000";LC_IDENTIFICATION category "vi_VN:2000";LC_CTYPE @@ -30,200 +42,248 @@ category "vi_VN:2000";LC_PAPER category "vi_VN:2000";LC_NAME category "vi_VN:2000";LC_ADDRESS category "vi_VN:2000";LC_TELEPHONE +category "vi_VN:2000";LC_MEASUREMENT END LC_IDENTIFICATION LC_CTYPE copy "i18n" +translit_start + +% dong sign -> d// -> dd +<U20AB> "<U0111>";"<U0064><U0064>" + +translit_end END LC_CTYPE LC_COLLATE - % Copy the template from ISO/IEC 14651 copy "iso14651_t1" +% A( A^ E^ O+ U+ DD are treatead as base letters +% ordering of accents is: grave, hook, tilde, acute, dot below +% a a( a> b c d d/ e e> f g h i j k l m n o o+ p q r s t u u+ v w x y z + +collating-symbol <a(> +collating-symbol <a/>> +collating-symbol <d//> +collating-symbol <e/>> +collating-symbol <o/>> +collating-symbol <o9> +collating-symbol <u9> + +collating-symbol <HOK> + +reorder-after <BAS> +<GRA> +<HOK> +<TIL> +<ACA> +<PCT> + +reorder-after <a> +<a(> +<a/>> +reorder-after <d> +<d//> +reorder-after <e> +<e/>> +reorder-after <o> +<o/>> +<o9> +reorder-after <u> +<u9> + +reorder-after <U0061> +<U1EA3> <a>;<HOK>;<MIN>;IGNORE +<U0103> <a(>;<BAS>;<MIN>;IGNORE +<U1EB1> <a(>;<GRA>;<MIN>;IGNORE +<U1EB3> <a(>;<HOK>;<MIN>;IGNORE +<U1EB5> <a(>;<TIL>;<MIN>;IGNORE +<U1EAF> <a(>;<ACA>;<MIN>;IGNORE +<U1EB7> <a(>;<PCT>;<MIN>;IGNORE +<U00E2> <a/>>;<BAS>;<MIN>;IGNORE +<U1EA7> <a/>>;<GRA>;<MIN>;IGNORE +<U1EA9> <a/>>;<HOK>;<MIN>;IGNORE +<U1EAB> <a/>>;<TIL>;<MIN>;IGNORE +<U1EA5> <a/>>;<ACA>;<MIN>;IGNORE +<U1EAD> <a/>>;<PCT>;<MIN>;IGNORE +reorder-after <U0041> +<U1EA2> <a>;<HOK>;<CAP>;IGNORE +<U0102> <a(>;<BAS>;<CAP>;IGNORE +<U1EB0> <a(>;<GRA>;<CAP>;IGNORE +<U1EB3> <a(>;<HOK>;<CAP>;IGNORE +<U1EB4> <a(>;<TIL>;<CAP>;IGNORE +<U1EAE> <a(>;<ACA>;<CAP>;IGNORE +<U1EB6> <a(>;<PCT>;<CAP>;IGNORE +<U00C2> <a/>>;<BAS>;<CAP>;IGNORE +<U1EA6> <a/>>;<GRA>;<CAP>;IGNORE +<U1EA8> <a/>>;<HOK>;<CAP>;IGNORE +<U1EAA> <a/>>;<TIL>;<CAP>;IGNORE +<U1EA4> <a/>>;<ACA>;<CAP>;IGNORE +<U1EAC> <a/>>;<PCT>;<CAP>;IGNORE + +reorder-after <U0064> +<U0111> <d//>;<BAS>;<MIN>;IGNORE +<U00F0> <d//>;<PCL>;<MIN>;IGNORE +reorder-after <U0044> +<U0110> <d//>;<BAS>;<CAP>;IGNORE +<U00D0> <d//>;<PCL>;<CAP>;IGNORE + +reorder-after <U0065> +<U1EBB> <e>;<HOK>;<MIN>;IGNORE +<U00EA> <e/>>;<BAS>;<MIN>;IGNORE +<U1EC1> <e/>>;<GRA>;<MIN>;IGNORE +<U1EC3> <e/>>;<HOK>;<MIN>;IGNORE +<U1EC5> <e/>>;<TIL>;<MIN>;IGNORE +<U1EBF> <e/>>;<ACA>;<MIN>;IGNORE +<U1EC7> <e/>>;<PCT>;<MIN>;IGNORE +reorder-after <U0045> +<U1EBA> <e>;<HOK>;<CAP>;IGNORE +<U00CA> <e/>>;<BAS>;<CAP>;IGNORE +<U1EC0> <e/>>;<GRA>;<CAP>;IGNORE +<U1EC2> <e/>>;<HOK>;<CAP>;IGNORE +<U1EC4> <e/>>;<TIL>;<CAP>;IGNORE +<U1EBE> <e/>>;<ACA>;<CAP>;IGNORE +<U1EC6> <e/>>;<PCT>;<CAP>;IGNORE + +reorder-after <U0069> +<U1EC9> <i>;<HOK>;<MIN>;IGNORE +reorder-after <U0049> +<U1EC8> <i>;<HOK>;<CAP>;IGNORE + +reorder-after <U006F> +<U1ECF> <o>;<HOK>;<MIN>;IGNORE +<U00F4> <o/>>;<BAS>;<MIN>;IGNORE +<U1ED3> <o/>>;<GRA>;<MIN>;IGNORE +<U1ED5> <o/>>;<HOK>;<MIN>;IGNORE +<U1ED7> <o/>>;<TIL>;<MIN>;IGNORE +<U1ED1> <o/>>;<ACA>;<MIN>;IGNORE +<U1ED9> <o/>>;<PCT>;<MIN>;IGNORE +<U01A1> <o9>;<BAS>;<MIN>;IGNORE +<U1EDD> <o9>;<GRA>;<MIN>;IGNORE +<U1EDF> <o9>;<HOK>;<MIN>;IGNORE +<U1EE1> <o9>;<TIL>;<MIN>;IGNORE +<U1EDB> <o9>;<ACA>;<MIN>;IGNORE +<U1EE3> <o9>;<PCT>;<MIN>;IGNORE +reorder-after <U004F> +<U1ECE> <o>;<HOK>;<CAP>;IGNORE +<U00D4> <o/>>;<BAS>;<CAP>;IGNORE +<U1ED2> <o/>>;<GRA>;<CAP>;IGNORE +<U1ED4> <o/>>;<HOK>;<CAP>;IGNORE +<U1ED6> <o/>>;<TIL>;<CAP>;IGNORE +<U1ED0> <o/>>;<ACA>;<CAP>;IGNORE +<U1ED8> <o/>>;<PCT>;<CAP>;IGNORE +<U01A0> <o9>;<BAS>;<CAP>;IGNORE +<U1EDC> <o9>;<GRA>;<CAP>;IGNORE +<U1EDE> <o9>;<HOK>;<CAP>;IGNORE +<U1EE0> <o9>;<TIL>;<CAP>;IGNORE +<U1EDA> <o9>;<ACA>;<CAP>;IGNORE +<U1EE2> <o9>;<PCT>;<CAP>;IGNORE + +reorder-after <U0075> +<U1EE7> <u>;<HOK>;<MIN>;IGNORE +<U01B0> <u9>;<BAS>;<MIN>;IGNORE +<U1EEB> <u9>;<GRA>;<MIN>;IGNORE +<U1EED> <u9>;<HOK>;<MIN>;IGNORE +<U1EEF> <u9>;<TIL>;<MIN>;IGNORE +<U1EE9> <u9>;<ACA>;<MIN>;IGNORE +<U1EF1> <u9>;<PCT>;<MIN>;IGNORE +reorder-after <U0055> +<U1EE6> <u>;<HOK>;<CAP>;IGNORE +<U01AF> <u9>;<BAS>;<CAP>;IGNORE +<U1EEA> <u9>;<GRA>;<CAP>;IGNORE +<U1EEC> <u9>;<HOK>;<CAP>;IGNORE +<U1EEE> <u9>;<TIL>;<CAP>;IGNORE +<U1EE8> <u9>;<ACA>;<CAP>;IGNORE +<U1EF0> <u9>;<PCT>;<CAP>;IGNORE + +reorder-after <U0079> +<U1EF7> <y>;<HOK>;<MIN>;IGNORE +reorder-after <U0059> +<U1EF6> <y>;<HOK>;<CAP>;IGNORE + +reorder-end + END LC_COLLATE LC_MONETARY -% This is the POSIX Locale definition the LC_MONETARY category. -% These are generated based on XML base Locale difintion file -% for IBM Class for Unicode/Java -% int_curr_symbol "<U0056><U004E><U0044><U0020>" currency_symbol "<U20AB>" mon_decimal_point "<U002C>" mon_thousands_sep "<U002E>" -mon_grouping 3 +mon_grouping 3;3 positive_sign "" negative_sign "<U002D>" -int_frac_digits 2 -frac_digits 2 +int_frac_digits 4 +frac_digits 4 p_cs_precedes 0 p_sep_by_space 0 n_cs_precedes 1 n_sep_by_space 0 p_sign_posn 1 n_sign_posn 1 -% END LC_MONETARY - LC_NUMERIC -% This is the POSIX Locale definition for the LC_NUMERIC category. -% -decimal_point "<U002C>" -thousands_sep "<U002E>" -grouping 3 -% +decimal_point "<U002C>" +thousands_sep "<U002E>" +grouping 3;3 END LC_NUMERIC - LC_TIME -% This is the POSIX Locale definition for the LC_TIME category. -% These are generated based on XML base Locale difintion file -% for IBM Class for Unicode/Java -% -% Abbreviated weekday names (%a) -abday "<U0043><U004E><U0020>";/ - "<U0054><U0068><U0020><U0032><U0020>";/ - "<U0054><U0068><U0020><U0033><U0020>";/ - "<U0054><U0068><U0020><U0034><U0020>";/ - "<U0054><U0068><U0020><U0035><U0020>";/ - "<U0054><U0068><U0020><U0036><U0020>";/ - "<U0054><U0068><U0020><U0037><U0020>" -% -% Full weekday names (%A) -day "<U0043><U0068><U0075><U0309><U0020><U006E><U0068><U00E2><U0323>/ -<U0074><U0020>";/ - "<U0054><U0068><U01B0><U0301><U0020><U0068><U0061><U0069><U0020>";/ - "<U0054><U0068><U01B0><U0301><U0020><U0062><U0061><U0020>";/ - "<U0054><U0068><U01B0><U0301><U0020><U0074><U01B0><U0020>";/ - "<U0054><U0068><U01B0><U0301><U0020><U006E><U0103><U006D><U0020>";/ - "<U0054><U0068><U01B0><U0301><U0020><U0073><U00E1><U0075><U0020>";/ - "<U0054><U0068><U01B0><U0301><U0020><U0062><U0061><U0309><U0079>/ -<U0020>" -% -% Abbreviated month names (%b) -abmon "<U0054><U0068><U0067><U0020><U0031>";/ - "<U0054><U0068><U0067><U0020><U0032>";/ - "<U0054><U0068><U0067><U0020><U0033>";/ - "<U0054><U0068><U0067><U0020><U0034>";/ - "<U0054><U0068><U0067><U0020><U0035>";/ - "<U0054><U0068><U0067><U0020><U0036>";/ - "<U0054><U0068><U0067><U0020><U0037>";/ - "<U0054><U0068><U0067><U0020><U0038>";/ - "<U0054><U0068><U0067><U0020><U0039>";/ - "<U0054><U0068><U0067><U0020><U0031><U0030>";/ - "<U0054><U0068><U0067><U0020><U0031><U0031>";/ - "<U0054><U0068><U0067><U0020><U0031><U0032>" -% -% Full month names (%B) -mon "<U0054><U0068><U00E1><U006E><U0067><U0020><U006D><U00F4><U0323>/ -<U0074>";/ - "<U0054><U0068><U00E1><U006E><U0067><U0020><U0068><U0061><U0069>";/ - "<U0054><U0068><U00E1><U006E><U0067><U0020><U0062><U0061>";/ - "<U0054><U0068><U00E1><U006E><U0067><U0020><U0074><U01B0>";/ - "<U0054><U0068><U00E1><U006E><U0067><U0020><U006E><U0103><U006D>";/ - "<U0054><U0068><U00E1><U006E><U0067><U0020><U0073><U00E1><U0075>";/ - "<U0054><U0068><U00E1><U006E><U0067><U0020><U0062><U0061><U0309>/ -<U0079>";/ - "<U0054><U0068><U00E1><U006E><U0067><U0020><U0074><U00E1><U006D>";/ - "<U0054><U0068><U00E1><U006E><U0067><U0020><U0063><U0068><U00ED>/ -<U006E>";/ - "<U0054><U0068><U00E1><U006E><U0067><U0020><U006D><U01B0><U01A1>/ -<U0300><U0069>";/ - "<U0054><U0068><U00E1><U006E><U0067><U0020><U006D><U01B0><U01A1>/ -<U0300><U0069><U0020><U006D><U00F4><U0323><U0074>";/ - "<U0054><U0068><U00E1><U006E><U0067><U0020><U006D><U01B0><U01A1>/ -<U0300><U0069><U0020><U0068><U0061><U0069>" -% -% Equivalent of AM PM -am_pm "";"" -% -% Appropriate date and time representation -% %A %d %b %Y%H:%M:%S %Z -d_t_fmt "<U0025><U0048><U003A><U0025><U004D><U003A><U0025><U0053>/ -<U0020><U0025><U005A><U0020><U0025><U0041><U0020><U0025><U0064><U0020>/ -<U0025><U0062><U0020><U0025><U0059>" -% -% Appropriate date representation -% %A %d %b %Y -d_fmt "<U0025><U0041><U0020><U0025><U0064><U0020><U0025><U0062>/ -<U0020><U0025><U0059>" -% -% Appropriate time representation -% %H:%M:%S %Z -t_fmt "<U0025><U0048><U003A><U0025><U004D><U003A><U0025><U0053>/ -<U0020><U0025><U005A>" -% -% Appropriate 12 h time representation (%r) -t_fmt_ampm "" -% -% Appropriate date representation (date(1)) "%H:%M:%S %a %e %b %Y %Z" -date_fmt "<U0025><U0048><U003A><U0025><U004D><U003A><U0025><U0053>/ -<U0020><U0025><U0061><U0020><U0025><U0065><U0020><U0025><U0062>/ -<U0020><U0025><U0059><U0020><U0025><U005A>" +abday "<U0043><U004E>";"<U0054><U0068><U0032>";/ + "<U0054><U0068><U0033>";"<U0054><U0068><U0034>";/ + "<U0054><U0068><U0035>";"<U0054><U0068><U0036>";/ + "<U0054><U0068><U0037>" +day "<U0063><U0068><U1EE7><U0020><U006E><U0068><U1EAD><U0074>";/ + "<U0074><U0068><U1EE9><U0020><U0068><U0061><U0069>";/ + "<U0074><U0068><U1EE9><U0020><U0062><U0061>";/ + "<U0074><U0068><U1EE9><U0020><U0074><U01B0>";/ + "<U0074><U0068><U1EE9><U0020><U006E><U0103><U006D>";/ + "<U0074><U0068><U1EE9><U0020><U0073><U00E1><U0075>";/ + "<U0074><U0068><U1EE9><U0020><U0062><U1EA3><U0079>" +abmon "<U0054><U0068><U0067><U0031>";"<U0054><U0068><U0067><U0032>";/ + "<U0054><U0068><U0067><U0033>";"<U0054><U0068><U0067><U0034>";/ + "<U0054><U0068><U0067><U0035>";"<U0054><U0068><U0067><U0036>";/ + "<U0054><U0068><U0067><U0037>";"<U0054><U0068><U0067><U0038>";/ + "<U0054><U0068><U0067><U0039>";"<U0054><U0068><U0067><U0031><U0030>";/ + "<U0054><U0068><U0067><U0031><U0031>";"<U0054><U0068><U0067><U0031><U0032>" +mon "<U0074><U0068><U00E1><U006E><U0067><U0020><U0067><U0069><U00EA><U006E><U0067>";/ + "<U0074><U0068><U00E1><U006E><U0067><U0020><U0068><U0061><U0069>";/ + "<U0074><U0068><U00E1><U006E><U0067><U0020><U0062><U0061>";/ + "<U0074><U0068><U00E1><U006E><U0067><U0020><U0074><U01B0>";/ + "<U0074><U0068><U00E1><U006E><U0067><U0020><U006E><U0103><U006D>";/ + "<U0074><U0068><U00E1><U006E><U0067><U0020><U0073><U00E1><U0075>";/ + "<U0074><U0068><U00E1><U006E><U0067><U0020><U0062><U1EA3><U0079>";/ + "<U0074><U0068><U00E1><U006E><U0067><U0020><U0074><U00E1><U006D>";/ + "<U0074><U0068><U00E1><U006E><U0067><U0020><U0063><U0068><U00ED><U006E>";/ + "<U0074><U0068><U00E1><U006E><U0067><U0020><U006D><U01B0><U1EDD><U0069>";/ + "<U0074><U0068><U00E1><U006E><U0067><U0020><U006D><U1ED9><U0074>";/ + "<U0074><U0068><U00E1><U006E><U0067><U0020><U0063><U0068><U1EA1><U0070>" +d_t_fmt "<U0025><U0041><U002C><U0020><U0025><U0064><U0020><U0025><U0042><U0020><U006E><U0103><U006D><U0020><U0025><U0059><U0020><U0025><U0054><U0020><U0025><U005A>" +d_fmt "<U0025><U0064><U002F><U0025><U006D><U002F><U0025><U0059>" +t_fmt "<U0025><U0054>" +am_pm "<U0073><U00E1><U006E><U0067>";"<U0063><U0068><U0069><U1EC1><U0075>" +t_fmt_ampm "<U0025><U0049><U003A><U0025><U004D><U0020><U0025><U0070>" +date_fmt "<U0025><U0041><U002C><U0020><U0025><U0064><U0020><U0025><U0042><U0020><U006E><U0103><U006D><U0020><U0025><U0059><U0020><U0025><U0054><U0020><U0025><U005A>" END LC_TIME - +% yes: Va^ng / Da. +% no: Kho^ng LC_MESSAGES -yesexpr "<U005E><U005B><U0079><U0059><U005D><U002E><U002A>" -noexpr "<U005E><U005B><U006E><U004E><U005D><U002E><U002A>" +yesstr "<U0056><U00E2><U006E><U0067>" +nostr "<U004B><U0068><U00F4><U006E><U0067>" +yesexpr "<U005E><U005B><U0031><U0079><U0059><U0076><U0056><U0064><U0044><U0063><U0043><U005D><U002E><U002A>" +noexpr "<U005E><U005B><U0030><U006E><U004E><U006B><U004B><U005D><U002E><U002A>" END LC_MESSAGES - LC_PAPER -% This is the ISO_IEC TR14652 Locale definition for the -% LC_PAPER category height 297 width 210 - END LC_PAPER - -LC_NAME -% This is the ISO_IEC TR14652 Locale definition for the -% LC_NAME category. -% -name_fmt "<U0025><U0070><U0025><U0074><U0025><U0066><U0025><U0074>/ -<U0025><U0067>" -name_gen "" -name_mr "<U00D4><U002E>" -name_mrs "<U0042><U002E>" -name_miss "<U0043><U002E>" -name_ms "" - -END LC_NAME - - -LC_ADDRESS -% This is the ISO_IEC TR14652 Locale definition for the -% LC_ADDRESS -postal_fmt "<U0025><U007A><U0025><U0063><U0025><U0054><U0025><U0073>/ -<U0025><U0062><U0025><U0065><U0025><U0072>" -country_name "<U0056><U0069><U1EC7><U0074><U0020><U006E><U0061><U006D>" -lang_name "<U0056><U0069><U1EC7><U0074><U0020><U006E><U0067><U1EEF>" - -country_ab2 "<U0056><U004E>" -country_ab3 "<U0056><U004E><U004D>" -country_num 704 -END LC_ADDRESS - - -LC_TELEPHONE -% This is the ISO_IEC TR14652 Locale definition for the -% -tel_int_fmt "<U002B><U0025><U0063><U0020><U003B><U0025><U0061><U0020>/ -<U003B><U0025><U006C>" -int_prefix "<U0038><U0034>" -int_select "<U0030><U0030>" - -END LC_TELEPHONE - - LC_MEASUREMENT -% This is the ISO_IEC TR14652 Locale definition for the -% measurement 1 - END LC_MEASUREMENT + diff --git a/malloc/obstack.c b/malloc/obstack.c index fddda3ec5b..aba21f9aac 100644 --- a/malloc/obstack.c +++ b/malloc/obstack.c @@ -1,6 +1,6 @@ /* obstack.c - subroutines used implicitly by object stack macros - Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1996, 1997, - 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1996, 1997, 1998, + 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. Its master source is NOT part of the C library, however. The master source lives in /gd/gnu/lib. @@ -410,12 +410,7 @@ print_and_abort (void) happen because the "memory exhausted" message appears in other places like this and the translation should be reused instead of creating a very similar string which requires a separate translation. */ -# if defined _LIBC && defined USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - __fwprintf (stderr, L"%s\n", _("memory exhausted")); - else -# endif - fprintf (stderr, "%s\n", _("memory exhausted")); + (void) __fxprintf (NULL, "%s\n", _("memory exhausted")); exit (obstack_exit_failure); } diff --git a/manual/Makefile b/manual/Makefile index a29fdd29a3..c007b2cc4e 100644 --- a/manual/Makefile +++ b/manual/Makefile @@ -80,7 +80,7 @@ libc.dvi libc.pdf libc.info: chapters.texi top-menu.texi dir-add.texi \ libc.dvi libc.pdf: texinfo.tex html: libc/index.html -libc/index.html: chapters.texi top-menu.texi libm-err.texi +libc/index.html: chapters.texi top-menu.texi dir-add.texi libm-err.texi $(MAKEINFO) --html libc.texinfo # Generate the summary from the Texinfo source files for each chapter. diff --git a/misc/Makefile b/misc/Makefile index 862eb1b800..cd5b64e7ab 100644 --- a/misc/Makefile +++ b/misc/Makefile @@ -1,4 +1,4 @@ -# Copyright (C) 1991-2002, 2003, 2004 Free Software Foundation, Inc. +# Copyright (C) 1991-2002, 2003, 2004, 2005 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 @@ -65,6 +65,8 @@ routines := brk sbrk sstk ioctl \ distribute := device-nrs.h +generated := tst-error1.mtrace tst-error1-mem + include ../Makeconfig aux := init-misc @@ -73,7 +75,11 @@ install-lib := libbsd-compat.a libg.a endif gpl2lgpl := error.c error.h -tests := tst-dirname tst-tsearch tst-fdset tst-efgcvt tst-mntent tst-hsearch +tests := tst-dirname tst-tsearch tst-fdset tst-efgcvt tst-mntent tst-hsearch \ + tst-error1 +ifeq (no,$(cross-compiling)) +tests: $(objpfx)tst-error1-mem +endif CFLAGS-tsearch.c = $(uses-callbacks) CFLAGS-lsearch.c = $(uses-callbacks) @@ -106,3 +112,8 @@ endif ifeq ($(build-bounded),yes) $(objpfx)tst-tsearch-bp: $(common-objpfx)math/libm_b.a endif + +tst-error1-ENV = MALLOC_TRACE=$(objpfx)tst-error1.mtrace +tst-error1-ARGS = $(objpfx)tst-error1.out +$(objpfx)tst-error1-mem: $(objpfx)tst-error1.out + $(common-objpfx)malloc/mtrace $(objpfx)tst-error1.mtrace > $@ diff --git a/misc/error.c b/misc/error.c index 2501583366..29060e94de 100644 --- a/misc/error.c +++ b/misc/error.c @@ -1,7 +1,6 @@ /* Error handler for noninteractive utilities - Copyright (C) 1990-1998, 2000-2003, 2004 Free Software Foundation, Inc. - This file is part of the GNU C Library. Its master source is NOT part of - the C library, however. The master source lives in /gd/gnu/lib. + Copyright (C) 1990-1998, 2000-2004, 2005 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 modify it under the terms of the GNU Lesser General Public @@ -74,6 +73,7 @@ unsigned int error_message_count; # define program_name program_invocation_name # include <errno.h> +# include <limits.h> # include <libio/libioP.h> /* In GNU libc we want do not want to use the common name `error' directly. @@ -158,14 +158,10 @@ print_errno_message (int errnum) #endif #if _LIBC - if (_IO_fwide (stderr, 0) > 0) - { - __fwprintf (stderr, L": %s", s); - return; - } -#endif - + __fxprintf (NULL, ": %s", s); +#else fprintf (stderr, ": %s", s); +#endif } #ifdef VA_START @@ -182,14 +178,15 @@ error_tail (int status, int errnum, const char *message, va_list args) mbstate_t st; size_t res; const char *tmp; + bool use_malloc = false; - do + while (1) { - if (len < ALLOCA_LIMIT) + if (__libc_use_alloca (len * sizeof (wchar_t))) wmessage = (wchar_t *) alloca (len * sizeof (wchar_t)); else { - if (wmessage != NULL && len / 2 < ALLOCA_LIMIT) + if (!use_malloc) wmessage = NULL; wchar_t *p = (wchar_t *) realloc (wmessage, @@ -201,18 +198,38 @@ error_tail (int status, int errnum, const char *message, va_list args) return; } wmessage = p; + use_malloc = true; } memset (&st, '\0', sizeof (st)); tmp = message; + + res = mbsrtowcs (wmessage, &tmp, len, &st); + if (res != len) + break; + + if (__builtin_expect (len >= SIZE_MAX / 2, 0)) + { + /* This reallyy should not happen if everything is fine. */ + res = (size_t) -1; + break; + } + + len *= 2; } - while ((res = mbsrtowcs (wmessage, &tmp, len, &st)) == len); if (res == (size_t) -1) - /* The string cannot be converted. */ - wmessage = (wchar_t *) L"???"; + { + /* The string cannot be converted. */ + if (use_malloc) + free (wmessage); + wmessage = (wchar_t *) L"???"; + } __vfwprintf (stderr, wmessage, args); + + if (use_malloc) + free (wmessage); } else # endif @@ -226,11 +243,10 @@ error_tail (int status, int errnum, const char *message, va_list args) if (errnum) print_errno_message (errnum); # if _LIBC - if (_IO_fwide (stderr, 0) > 0) - putwc (L'\n', stderr); - else + __fxprintf (NULL, "\n"); +# else + putc ('\n', stderr); # endif - putc ('\n', stderr); fflush (stderr); if (status) exit (status); @@ -275,11 +291,10 @@ error (status, errnum, message, va_alist) else { #if _LIBC - if (_IO_fwide (stderr, 0) > 0) - __fwprintf (stderr, L"%s: ", program_name); - else + __fxprintf (NULL, "%s: ", program_name); +#else + fprintf (stderr, "%s: ", program_name); #endif - fprintf (stderr, "%s: ", program_name); } #ifdef VA_START @@ -359,21 +374,19 @@ error_at_line (status, errnum, file_name, line_number, message, va_alist) else { #if _LIBC - if (_IO_fwide (stderr, 0) > 0) - __fwprintf (stderr, L"%s: ", program_name); - else + __fxprintf (NULL, "%s:", program_name); +#else + fprintf (stderr, "%s:", program_name); #endif - fprintf (stderr, "%s:", program_name); } if (file_name != NULL) { #if _LIBC - if (_IO_fwide (stderr, 0) > 0) - __fwprintf (stderr, L"%s:%d: ", file_name, line_number); - else + __fxprintf (NULL, "%s:%d: ", file_name, line_number); +#else + fprintf (stderr, "%s:%d: ", file_name, line_number); #endif - fprintf (stderr, "%s:%d: ", file_name, line_number); } #ifdef VA_START diff --git a/misc/getpass.c b/misc/getpass.c index 62e56866a1..5290c3c7d3 100644 --- a/misc/getpass.c +++ b/misc/getpass.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1992-1999, 2001, 2003, 2004 Free Software Foundation, Inc. +/* Copyright (C) 1992-1999,2001,2003,2004,2005 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 @@ -91,12 +91,7 @@ getpass (prompt) tty_changed = 0; /* Write the prompt. */ -#ifdef USE_IN_LIBIO - if (_IO_fwide (out, 0) > 0) - __fwprintf (out, L"%s", prompt); - else -#endif - fputs_unlocked (prompt, out); + __fxprintf (out, "%s", prompt); fflush_unlocked (out); /* Read the password. */ @@ -110,15 +105,8 @@ getpass (prompt) /* Remove the newline. */ buf[nread - 1] = '\0'; if (tty_changed) - { - /* Write the newline that was not echoed. */ -#ifdef USE_IN_LIBIO - if (_IO_fwide (out, 0) > 0) - putwc_unlocked (L'\n', out); - else -#endif - putc_unlocked ('\n', out); - } + /* Write the newline that was not echoed. */ + __fxprintf (out, "\n"); } } diff --git a/misc/tst-error1.c b/misc/tst-error1.c new file mode 100644 index 0000000000..e84843ed2f --- /dev/null +++ b/misc/tst-error1.c @@ -0,0 +1,26 @@ +#include <error.h> +#include <mcheck.h> +#include <stdio.h> +#include <string.h> +#include <wchar.h> + +static int +do_test (int argc, char *argv[]) +{ + mtrace (); + (void) freopen (argc == 1 ? "/dev/stdout" : argv[1], "a", stderr); + /* Orient the stream. */ + fwprintf (stderr, L"hello world\n"); + char buf[20000]; + static const char str[] = "hello world! "; + for (int i = 0; i < 1000; ++i) + memcpy (&buf[i * (sizeof (str) - 1)], str, sizeof (str)); + error (0, 0, str); + error (0, 0, buf); + error (0, 0, buf); + error (0, 0, str); + return 0; +} + +#define TEST_FUNCTION do_test (argc, argv) +#include "../test-skeleton.c" diff --git a/nptl/ChangeLog b/nptl/ChangeLog index aa5874a243..0128865672 100644 --- a/nptl/ChangeLog +++ b/nptl/ChangeLog @@ -1,3 +1,23 @@ +2005-07-11 Jakub Jelinek <jakub@redhat.com> + + [BZ #1102] + * sysdeps/pthread/pthread.h (PTHREAD_MUTEX_INITIALIZER, + PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP, + PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP, + PTHREAD_MUTEX_ADAPTIVE_NP, PTHREAD_RWLOCK_INITIALIZER, + PTHREAD_RWLOCK_WRITER_NONRECURSIVE_INITIALIZER_NP, + PTHREAD_COND_INITIALIZER): Supply zeros for all fields + in the structure. + * Makefile (tests): Add tst-initializers1. + (CFLAGS-tst-initializers1.c): Set. + * tst-initializers1.c: New test. + +2005-07-11 Jakub Jelinek <jakub@redhat.com> + + * sysdeps/unix/sysv/linux/alpha/bits/pthreadtypes.h (pthread_rwlock_t): + Make sure __flags are located at offset 48 from the start of the + structure. + 2005-07-02 Roland McGrath <roland@redhat.com> * Makeconfig: Comment fix. @@ -122,6 +142,7 @@ 2005-04-05 Jakub Jelinek <jakub@redhat.com> + [BZ #1102] * sysdeps/pthread/pthread.h (__pthread_cleanup_routine): Use __inline instead of inline. * sysdeps/pthread/bits/libc-lock.h (__libc_cleanup_routine): Likewise. diff --git a/nptl/Makefile b/nptl/Makefile index 184375a461..1fbe464518 100644 --- a/nptl/Makefile +++ b/nptl/Makefile @@ -241,7 +241,7 @@ tests = tst-attr1 tst-attr2 tst-attr3 \ tst-backtrace1 \ tst-oddstacklimit \ tst-vfork1 tst-vfork2 tst-vfork1x tst-vfork2x \ - tst-getpid1 tst-getpid2 + tst-getpid1 tst-getpid2 tst-initializers1 xtests = tst-setuid1 tst-setuid1-static # Files which must not be linked with libpthread. @@ -412,6 +412,7 @@ CFLAGS-tst-cleanupx4.c += -fexceptions CFLAGS-tst-oncex3.c += -fexceptions CFLAGS-tst-oncex4.c += -fexceptions CFLAGS-tst-align.c += $(stack-align-test-flags) +CFLAGS-tst-initializers1.c += -W -Wall -Werror tst-cancel7-ARGS = --command "$(built-program-cmd)" tst-cancelx7-ARGS = $(tst-cancel7-ARGS) diff --git a/nptl/sysdeps/pthread/pthread.h b/nptl/sysdeps/pthread/pthread.h index 05f3b31fb5..92e66f7c72 100644 --- a/nptl/sysdeps/pthread/pthread.h +++ b/nptl/sysdeps/pthread/pthread.h @@ -62,22 +62,22 @@ enum /* Mutex initializers. */ #define PTHREAD_MUTEX_INITIALIZER \ - { { 0, } } + { { 0, 0, 0, 0, 0, 0 } } #ifdef __USE_GNU # if __WORDSIZE == 64 # define PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP \ - { { 0, 0, 0, 0, PTHREAD_MUTEX_RECURSIVE_NP } } + { { 0, 0, 0, 0, PTHREAD_MUTEX_RECURSIVE_NP, 0 } } # define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP \ - { { 0, 0, 0, 0, PTHREAD_MUTEX_ERRORCHECK_NP } } + { { 0, 0, 0, 0, PTHREAD_MUTEX_ERRORCHECK_NP, 0 } } # define PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP \ - { { 0, 0, 0, 0, PTHREAD_MUTEX_ADAPTIVE_NP } } + { { 0, 0, 0, 0, PTHREAD_MUTEX_ADAPTIVE_NP, 0 } } # else # define PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP \ - { { 0, 0, 0, PTHREAD_MUTEX_RECURSIVE_NP } } + { { 0, 0, 0, PTHREAD_MUTEX_RECURSIVE_NP, 0, 0 } } # define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP \ - { { 0, 0, 0, PTHREAD_MUTEX_ERRORCHECK_NP } } + { { 0, 0, 0, PTHREAD_MUTEX_ERRORCHECK_NP, 0, 0 } } # define PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP \ - { { 0, 0, 0, PTHREAD_MUTEX_ADAPTIVE_NP } } + { { 0, 0, 0, PTHREAD_MUTEX_ADAPTIVE_NP, 0, 0 } } # endif #endif @@ -93,8 +93,13 @@ enum }; /* Read-write lock initializers. */ -# define PTHREAD_RWLOCK_INITIALIZER \ - { { 0, } } +# if __WORDSIZE == 64 +# define PTHREAD_RWLOCK_INITIALIZER \ + { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } } +# else +# define PTHREAD_RWLOCK_INITIALIZER \ + { { 0, 0, 0, 0, 0, 0, 0, 0 } } +# endif # ifdef __USE_GNU # if __WORDSIZE == 64 # define PTHREAD_RWLOCK_WRITER_NONRECURSIVE_INITIALIZER_NP \ @@ -102,7 +107,7 @@ enum PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP } } # else # define PTHREAD_RWLOCK_WRITER_NONRECURSIVE_INITIALIZER_NP \ - { { 0, 0, 0, 0, 0, 0, PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP } } + { { 0, 0, 0, 0, 0, 0, PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP, 0 } } # endif # endif #endif /* Unix98 or XOpen2K */ @@ -140,7 +145,7 @@ enum /* Conditional variable handling. */ -#define PTHREAD_COND_INITIALIZER { { 0, } } +#define PTHREAD_COND_INITIALIZER { { 0, 0, 0, 0, 0, (void *) 0, 0, 0 } } /* Cleanup buffers */ diff --git a/nptl/sysdeps/unix/sysv/linux/alpha/bits/pthreadtypes.h b/nptl/sysdeps/unix/sysv/linux/alpha/bits/pthreadtypes.h index d13d6e86a4..86b47037e4 100644 --- a/nptl/sysdeps/unix/sysv/linux/alpha/bits/pthreadtypes.h +++ b/nptl/sysdeps/unix/sysv/linux/alpha/bits/pthreadtypes.h @@ -1,5 +1,5 @@ /* Machine-specific pthread type layouts. Alpha version. - Copyright (C) 2003, 2004 Free Software Foundation, Inc. + Copyright (C) 2003, 2004, 2005 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 @@ -117,8 +117,9 @@ typedef union unsigned int __nr_readers_queued; unsigned int __nr_writers_queued; int __writer; - - unsigned int __reserved[6]; + int __pad1; + unsigned long int __pad2; + unsigned long int __pad3; /* FLAGS must stay at this position in the structure to maintain binary compatibility. */ unsigned int __flags; diff --git a/nptl/tst-initializers1.c b/nptl/tst-initializers1.c new file mode 100644 index 0000000000..ccd27286e8 --- /dev/null +++ b/nptl/tst-initializers1.c @@ -0,0 +1,48 @@ +/* Copyright (C) 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Jakub Jelinek <jakub@redhat.com>, 2005. + + 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 <pthread.h> + +pthread_mutex_t mtx_normal = PTHREAD_MUTEX_INITIALIZER; +pthread_mutex_t mtx_recursive = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP; +pthread_mutex_t mtx_errorchk = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP; +pthread_mutex_t mtx_adaptive = PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP; +pthread_rwlock_t rwl_normal = PTHREAD_RWLOCK_INITIALIZER; +pthread_rwlock_t rwl_writer + = PTHREAD_RWLOCK_WRITER_NONRECURSIVE_INITIALIZER_NP; +pthread_cond_t cond = PTHREAD_COND_INITIALIZER; + +int +main (void) +{ + if (mtx_normal.__data.__kind != PTHREAD_MUTEX_TIMED_NP) + return 1; + if (mtx_recursive.__data.__kind != PTHREAD_MUTEX_RECURSIVE_NP) + return 1; + if (mtx_errorchk.__data.__kind != PTHREAD_MUTEX_ERRORCHECK_NP) + return 1; + if (mtx_adaptive.__data.__kind != PTHREAD_MUTEX_ADAPTIVE_NP) + return 1; + if (rwl_normal.__data.__flags != PTHREAD_RWLOCK_PREFER_READER_NP) + return 1; + if (rwl_writer.__data.__flags + != PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP) + return 1; + return 0; +} diff --git a/nscd/Makefile b/nscd/Makefile index 2ebd90b989..5a2d29a0a5 100644 --- a/nscd/Makefile +++ b/nscd/Makefile @@ -84,10 +84,13 @@ CFLAGS-nscd_gethst_r.c = -fexceptions CFLAGS-nscd_getai.c = -fexceptions CFLAGS-nscd_initgroups.c = -fexceptions -nscd-cflags = -DIS_IN_nscd=1 +nscd-cflags = -DIS_IN_nscd=1 -D_FORTIFY_SOURCE=2 ifeq (yesyes,$(have-fpie)$(build-shared)) nscd-cflags += -fpie endif +ifeq (yes,$(have-ssp)) +nscd-cflags += -fstack-protector +endif CFLAGS-nscd.c += $(nscd-cflags) CFLAGS-connections.c += $(nscd-cflags) diff --git a/nscd/connections.c b/nscd/connections.c index 0ca7585f14..d18851f828 100644 --- a/nscd/connections.c +++ b/nscd/connections.c @@ -393,20 +393,23 @@ cannot create read-only descriptor for \"%s\"; no mmap"), if (offset % ps != 0) { towrite = MIN (remaining, ps - (offset % ps)); - pwrite (fd, tmpbuf, towrite, offset); + if (pwrite (fd, tmpbuf, towrite, offset) != towrite) + goto write_fail; offset += towrite; remaining -= towrite; } while (remaining > ps) { - pwrite (fd, tmpbuf, ps, offset); + if (pwrite (fd, tmpbuf, ps, offset) == -1) + goto write_fail; offset += ps; remaining -= ps; } - if (remaining > 0) - pwrite (fd, tmpbuf, remaining, offset); + if (remaining > 0 + && pwrite (fd, tmpbuf, remaining, offset) != remaining) + goto write_fail; /* Create the header of the file. */ struct database_pers_head head = @@ -426,6 +429,7 @@ cannot create read-only descriptor for \"%s\"; no mmap"), || (mem = mmap (NULL, total, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)) == MAP_FAILED) { + write_fail: unlink (dbs[cnt].db_filename); dbg_log (_("cannot write to database file %s: %s"), dbs[cnt].db_filename, strerror (errno)); @@ -604,9 +608,14 @@ send_ro_fd (struct database_dyn *db, char *key, int fd) iov[0].iov_len = strlen (key) + 1; /* Prepare the control message to transfer the descriptor. */ - char buf[CMSG_SPACE (sizeof (int))]; + union + { + struct cmsghdr hdr; + char bytes[CMSG_SPACE (sizeof (int))]; + } buf; struct msghdr msg = { .msg_iov = iov, .msg_iovlen = 1, - .msg_control = buf, .msg_controllen = sizeof (buf) }; + .msg_control = buf.bytes, + .msg_controllen = sizeof (buf) }; struct cmsghdr *cmsg = CMSG_FIRSTHDR (&msg); cmsg->cmsg_level = SOL_SOCKET; @@ -960,7 +969,9 @@ cannot change to old working directory: %s; disabling paranoia mode"), setuid (server_uid); setgid (server_gid); } - chdir ("/"); + if (chdir ("/") != 0) + dbg_log (_("cannot change current working directory to \"/\": %s"), + strerror (errno)); paranoia = 0; } diff --git a/nscd/grpcache.c b/nscd/grpcache.c index 5d327f360c..c938554b25 100644 --- a/nscd/grpcache.c +++ b/nscd/grpcache.c @@ -167,7 +167,7 @@ cache_addgr (struct database_dyn *db, int fd, request_header *req, char *gr_name; char *cp; const size_t key_len = strlen (key); - const size_t buf_len = 3 + sizeof (grp->gr_gid) + key_len + 1; + const size_t buf_len = 3 * sizeof (grp->gr_gid) + key_len + 1; char *buf = alloca (buf_len); ssize_t n; size_t cnt; diff --git a/nscd/nscd.c b/nscd/nscd.c index e6921c2ceb..4d14f06ecf 100644 --- a/nscd/nscd.c +++ b/nscd/nscd.c @@ -243,7 +243,9 @@ main (int argc, char **argv) setsid (); - chdir ("/"); + if (chdir ("/") != 0) + error (EXIT_FAILURE, errno, + _("cannot change current working cirectory to \"/\"")); openlog ("nscd", LOG_CONS | LOG_ODELAY, LOG_DAEMON); diff --git a/nscd/nscd_helper.c b/nscd/nscd_helper.c index c99cb430aa..65e78a1174 100644 --- a/nscd/nscd_helper.c +++ b/nscd/nscd_helper.c @@ -26,6 +26,7 @@ #include <sys/poll.h> #include <sys/socket.h> #include <sys/stat.h> +#include <sys/time.h> #include <sys/uio.h> #include <sys/un.h> #include <not-cancel.h> @@ -135,6 +136,36 @@ __nscd_unmap (struct mapped_database *mapped) } +static int +wait_on_socket (int sock) +{ + struct pollfd fds[1]; + fds[0].fd = sock; + fds[0].events = POLLIN | POLLERR | POLLHUP; + int n = __poll (fds, 1, 5 * 1000); + if (n == -1 && __builtin_expect (errno == EINTR, 0)) + { + /* Handle the case where the poll() call is interrupted by a + signal. We cannot just use TEMP_FAILURE_RETRY since it might + lead to infinite loops. */ + struct timeval now; + (void) __gettimeofday (&now, NULL); + long int end = (now.tv_sec + 5) * 1000 + (now.tv_usec + 500) / 1000; + while (1) + { + long int timeout = end - (now.tv_sec * 1000 + + (now.tv_usec + 500) / 1000); + n = __poll (fds, 1, timeout); + if (n != -1 || errno != EINTR) + break; + (void) __gettimeofday (&now, NULL); + } + } + + return n; +} + + /* Try to get a file descriptor for the shared meory segment containing the database. */ static struct mapped_database * @@ -166,8 +197,8 @@ get_mapping (request_type type, const char *key, iov[1].iov_base = (void *) key; iov[1].iov_len = keylen; - if (TEMP_FAILURE_RETRY (__writev (sock, iov, 2)) - != iov[0].iov_len + iov[1].iov_len) + if (__builtin_expect (TEMP_FAILURE_RETRY (__writev (sock, iov, 2)) + != iov[0].iov_len + iov[1].iov_len, 0)) /* We cannot even write the request. */ goto out_close2; @@ -176,73 +207,80 @@ get_mapping (request_type type, const char *key, iov[0].iov_base = resdata; iov[0].iov_len = keylen; - char buf[CMSG_SPACE (sizeof (int))]; + union + { + struct cmsghdr hdr; + char bytes[CMSG_SPACE (sizeof (int))]; + } buf; struct msghdr msg = { .msg_iov = iov, .msg_iovlen = 1, - .msg_control = buf, .msg_controllen = sizeof (buf) }; + .msg_control = buf.bytes, + .msg_controllen = sizeof (buf) }; struct cmsghdr *cmsg = CMSG_FIRSTHDR (&msg); cmsg->cmsg_level = SOL_SOCKET; cmsg->cmsg_type = SCM_RIGHTS; cmsg->cmsg_len = CMSG_LEN (sizeof (int)); + /* This access is well-aligned since BUF is correctly aligned for an + int and CMSG_DATA preserves this alignment. */ *(int *) CMSG_DATA (cmsg) = -1; msg.msg_controllen = cmsg->cmsg_len; - struct pollfd fds[1]; - fds[0].fd = sock; - fds[0].events = POLLIN | POLLERR | POLLHUP; - if (__poll (fds, 1, 5 * 1000) <= 0) - /* Failure or timeout. */ + if (wait_on_socket (sock) <= 0) goto out_close2; #ifndef MSG_NOSIGNAL # define MSG_NOSIGNAL 0 #endif - if (TEMP_FAILURE_RETRY (__recvmsg (sock, &msg, MSG_NOSIGNAL)) != keylen) + if (__builtin_expect (TEMP_FAILURE_RETRY (__recvmsg (sock, &msg, + MSG_NOSIGNAL)) + != keylen, 0)) goto out_close2; mapfd = *(int *) CMSG_DATA (cmsg); - if (CMSG_FIRSTHDR (&msg)->cmsg_len != CMSG_LEN (sizeof (int))) + if (__builtin_expect (CMSG_FIRSTHDR (&msg)->cmsg_len + != CMSG_LEN (sizeof (int)), 0)) goto out_close; struct stat64 st; - if (strcmp (resdata, key) != 0 - || fstat64 (mapfd, &st) != 0 - || st.st_size < sizeof (struct database_pers_head)) + if (__builtin_expect (strcmp (resdata, key) != 0, 0) + || __builtin_expect (fstat64 (mapfd, &st) != 0, 0) + || __builtin_expect (st.st_size < sizeof (struct database_pers_head), 0)) goto out_close; struct database_pers_head head; - if (TEMP_FAILURE_RETRY (__pread (mapfd, &head, sizeof (head), 0)) - != sizeof (head)) + if (__builtin_expect (TEMP_FAILURE_RETRY (__pread (mapfd, &head, + sizeof (head), 0)) + != sizeof (head), 0)) goto out_close; - if (head.version != DB_VERSION || head.header_size != sizeof (head) + if (__builtin_expect (head.version != DB_VERSION, 0) + || __builtin_expect (head.header_size != sizeof (head), 0) /* This really should not happen but who knows, maybe the update thread got stuck. */ - || (! head.nscd_certainly_running - && head.timestamp + MAPPING_TIMEOUT < time (NULL))) + || __builtin_expect (! head.nscd_certainly_running + && head.timestamp + MAPPING_TIMEOUT < time (NULL), + 0)) goto out_close; size_t size = (sizeof (head) + roundup (head.module * sizeof (ref_t), ALIGN) + head.data_size); - if (st.st_size < size) + if (__builtin_expect (st.st_size < size, 0)) goto out_close; /* The file is large enough, map it now. */ void *mapping = __mmap (NULL, size, PROT_READ, MAP_SHARED, mapfd, 0); - if (mapping != MAP_FAILED) + if (__builtin_expect (mapping != MAP_FAILED, 1)) { /* Allocate a record for the mapping. */ - struct mapped_database *newp; - - newp = malloc (sizeof (*newp)); + struct mapped_database *newp = malloc (sizeof (*newp)); if (newp == NULL) { /* Ugh, after all we went through the memory allocation failed. */ - __munmap (result, size); + __munmap (mapping, size); goto out_close; } @@ -372,19 +410,13 @@ __nscd_open_socket (const char *key, size_t keylen, request_type type, vec[1].iov_len = keylen; ssize_t nbytes = TEMP_FAILURE_RETRY (__writev (sock, vec, 2)); - if (nbytes == (ssize_t) (sizeof (request_header) + keylen)) - { + if (nbytes == (ssize_t) (sizeof (request_header) + keylen) /* Wait for data. */ - struct pollfd fds[1]; - fds[0].fd = sock; - fds[0].events = POLLIN | POLLERR | POLLHUP; - if (__poll (fds, 1, 5 * 1000) > 0) - { - nbytes = TEMP_FAILURE_RETRY (__read (sock, response, - responselen)); - if (nbytes == (ssize_t) responselen) - return sock; - } + && wait_on_socket (sock) > 0) + { + nbytes = TEMP_FAILURE_RETRY (__read (sock, response, responselen)); + if (nbytes == (ssize_t) responselen) + return sock; } close_not_cancel_no_status (sock); diff --git a/posix/bits/unistd.h b/posix/bits/unistd.h index cb82818ade..b6c756a9de 100644 --- a/posix/bits/unistd.h +++ b/posix/bits/unistd.h @@ -128,3 +128,101 @@ __NTH (getwd (char *__buf)) return __getwd_alias (__buf); } #endif + +extern size_t __confstr_chk (int __name, char *__buf, size_t __len, + size_t __buflen) __THROW; +extern size_t __REDIRECT_NTH (__confstr_alias, (int __name, char *__buf, + size_t __len), confstr); + +extern __always_inline size_t +confstr (int __name, char *__buf, size_t __len) +{ + if (__bos (__buf) != (size_t) -1 + && (!__builtin_constant_p (__len) || __bos (__buf) < __len)) + return __confstr_chk (__name, __buf, __len, __bos (__buf)); + return __confstr_alias (__name, __buf, __len); +} + + +extern int __getgroups_chk (int __size, __gid_t __list[], size_t listlen) + __THROW __wur; +extern int __REDIRECT_NTH (__getgroups_alias, (int __size, __gid_t __list[]), + getgroups) __wur; + +extern __always_inline int +getgroups (int __size, __gid_t __list[]) +{ + if (__bos (__list) != (size_t) -1 + && (!__builtin_constant_p (__size) + || __size * sizeof (__gid_t) > __bos (__list))) + return __getgroups_chk (__size, __list, __bos (__list)); + return __getgroups_alias (__size, __list); +} + + +extern int __ttyname_r_chk (int __fd, char *__buf, size_t __buflen, + size_t __nreal) __THROW __nonnull ((2)); +extern int __REDIRECT_NTH (__ttyname_r_alias, (int __fd, char *__buf, + size_t __buflen), ttyname_r) + __nonnull ((2)); + +extern __always_inline int +ttyname_r (int __fd, char *__buf, size_t __buflen) +{ + if (__bos (__buf) != (size_t) -1 + && (!__builtin_constant_p (__buflen) || __buflen > __bos (__buf))) + return __ttyname_r_chk (__fd, __buf, __buflen, __bos (__buf)); + return __ttyname_r_alias (__fd, __buf, __buflen); +} + + +#if defined __USE_REENTRANT || defined __USE_UNIX98 +extern int __getlogin_r_chk (char *__buf, size_t __buflen, size_t __nreal) + __nonnull ((1)); +extern int __REDIRECT (__getlogin_r_alias, (char *__buf, size_t __buflen), + getlogin_r) __nonnull ((1)); + +extern __always_inline int +getlogin_r (char *__buf, size_t __buflen) +{ + if (__bos (__buf) != (size_t) -1 + && (!__builtin_constant_p (__buflen) || __buflen > __bos (__buf))) + return __getlogin_r_chk (__buf, __buflen, __bos (__buf)); + return __getlogin_r_alias (__buf, __buflen); +} +#endif + + +#if defined __USE_BSD || defined __USE_UNIX98 +extern int __gethostname_chk (char *__buf, size_t __buflen, size_t __nreal) + __THROW __nonnull ((1)); +extern int __REDIRECT_NTH (__gethostname_alias, (char *__buf, size_t __buflen), + gethostname) __nonnull ((1)); + +extern __always_inline int +gethostname (char *__buf, size_t __buflen) +{ + if (__bos (__buf) != (size_t) -1 + && (!__builtin_constant_p (__buflen) || __buflen > __bos (__buf))) + return __gethostname_chk (__buf, __buflen, __bos (__buf)); + return __gethostname_alias (__buf, __buflen); +} +#endif + + +#if defined __USE_BSD || (defined __USE_XOPEN && !defined __USE_UNIX98) +extern int __getdomainname_chk (char *__buf, size_t __buflen, size_t __nreal) + __THROW __nonnull ((1)) __wur; +extern int __REDIRECT_NTH (__getdomainname_alias, (char *__buf, + size_t __buflen), + getdomainname) __nonnull ((1)) __wur; + +extern __always_inline int +getdomainname (char *__buf, size_t __buflen) +{ + if (__bos (__buf) != (size_t) -1 + && (!__builtin_constant_p (__buflen) || __buflen > __bos (__buf))) + return __getdomainname_chk (__buf, __buflen, __bos (__buf)); + return __getdomainname_alias (__buf, __buflen); +} +#endif diff --git a/posix/getopt.c b/posix/getopt.c index 9ad13a4a92..b1cecd31aa 100644 --- a/posix/getopt.c +++ b/posix/getopt.c @@ -576,10 +576,7 @@ _getopt_internal_r (int argc, char *const *argv, const char *optstring, int old_flags2 = ((_IO_FILE *) stderr)->_flags2; ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; - if (_IO_fwide (stderr, 0) > 0) - __fwprintf (stderr, L"%s", buf); - else - fputs (buf, stderr); + __fxprintf (NULL, "%s", buf); ((_IO_FILE *) stderr)->_flags2 = old_flags2; _IO_funlockfile (stderr); @@ -654,10 +651,7 @@ _getopt_internal_r (int argc, char *const *argv, const char *optstring, ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; - if (_IO_fwide (stderr, 0) > 0) - __fwprintf (stderr, L"%s", buf); - else - fputs (buf, stderr); + __fxprintf (NULL, "%s", buf); ((_IO_FILE *) stderr)->_flags2 = old_flags2; _IO_funlockfile (stderr); @@ -694,10 +688,7 @@ _getopt_internal_r (int argc, char *const *argv, const char *optstring, ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; - if (_IO_fwide (stderr, 0) > 0) - __fwprintf (stderr, L"%s", buf); - else - fputs (buf, stderr); + __fxprintf (NULL, "%s", buf); ((_IO_FILE *) stderr)->_flags2 = old_flags2; _IO_funlockfile (stderr); @@ -771,10 +762,7 @@ _getopt_internal_r (int argc, char *const *argv, const char *optstring, int old_flags2 = ((_IO_FILE *) stderr)->_flags2; ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; - if (_IO_fwide (stderr, 0) > 0) - __fwprintf (stderr, L"%s", buf); - else - fputs (buf, stderr); + __fxprintf (NULL, "%s", buf); ((_IO_FILE *) stderr)->_flags2 = old_flags2; _IO_funlockfile (stderr); @@ -837,10 +825,7 @@ _getopt_internal_r (int argc, char *const *argv, const char *optstring, int old_flags2 = ((_IO_FILE *) stderr)->_flags2; ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; - if (_IO_fwide (stderr, 0) > 0) - __fwprintf (stderr, L"%s", buf); - else - fputs (buf, stderr); + __fxprintf (NULL, "%s", buf); ((_IO_FILE *) stderr)->_flags2 = old_flags2; _IO_funlockfile (stderr); @@ -888,10 +873,7 @@ _getopt_internal_r (int argc, char *const *argv, const char *optstring, int old_flags2 = ((_IO_FILE *) stderr)->_flags2; ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; - if (_IO_fwide (stderr, 0) > 0) - __fwprintf (stderr, L"%s", buf); - else - fputs (buf, stderr); + __fxprintf (NULL, "%s", buf); ((_IO_FILE *) stderr)->_flags2 = old_flags2; _IO_funlockfile (stderr); @@ -960,10 +942,7 @@ _getopt_internal_r (int argc, char *const *argv, const char *optstring, int old_flags2 = ((_IO_FILE *) stderr)->_flags2; ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; - if (_IO_fwide (stderr, 0) > 0) - __fwprintf (stderr, L"%s", buf); - else - fputs (buf, stderr); + __fxprintf (NULL, "%s", buf); ((_IO_FILE *) stderr)->_flags2 = old_flags2; _IO_funlockfile (stderr); @@ -1005,10 +984,7 @@ _getopt_internal_r (int argc, char *const *argv, const char *optstring, ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; - if (_IO_fwide (stderr, 0) > 0) - __fwprintf (stderr, L"%s", buf); - else - fputs (buf, stderr); + __fxprintf (NULL, "%s", buf); ((_IO_FILE *) stderr)->_flags2 = old_flags2; _IO_funlockfile (stderr); @@ -1047,10 +1023,7 @@ _getopt_internal_r (int argc, char *const *argv, const char *optstring, ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; - if (_IO_fwide (stderr, 0) > 0) - __fwprintf (stderr, L"%s", buf); - else - fputs (buf, stderr); + __fxprintf (NULL, "%s", buf); ((_IO_FILE *) stderr)->_flags2 = old_flags2; _IO_funlockfile (stderr); @@ -1121,10 +1094,7 @@ _getopt_internal_r (int argc, char *const *argv, const char *optstring, int old_flags2 = ((_IO_FILE *) stderr)->_flags2; ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; - if (_IO_fwide (stderr, 0) > 0) - __fwprintf (stderr, L"%s", buf); - else - fputs (buf, stderr); + __fxprintf (NULL, "%s", buf); ((_IO_FILE *) stderr)->_flags2 = old_flags2; _IO_funlockfile (stderr); diff --git a/posix/regcomp.c b/posix/regcomp.c index 2053b024dc..37e06797ac 100644 --- a/posix/regcomp.c +++ b/posix/regcomp.c @@ -774,8 +774,6 @@ re_compile_internal (preg, pattern, length, syntax) } preg->used = sizeof (re_dfa_t); - __libc_lock_init (dfa->lock); - err = init_dfa (dfa, length); if (BE (err != REG_NOERROR, 0)) { @@ -789,6 +787,8 @@ re_compile_internal (preg, pattern, length, syntax) strncpy (dfa->re_str, pattern, length + 1); #endif + __libc_lock_init (dfa->lock); + err = re_string_construct (®exp, pattern, length, preg->translate, syntax & RE_ICASE, dfa); if (BE (err != REG_NOERROR, 0)) diff --git a/resolv/res_hconf.c b/resolv/res_hconf.c index 91cd300482..9beb881701 100644 --- a/resolv/res_hconf.c +++ b/resolv/res_hconf.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1993, 1995-2003, 2004 Free Software Foundation, Inc. +/* Copyright (C) 1993, 1995-2003, 2004, 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by David Mosberger (davidm@azstarnet.com). @@ -150,12 +150,7 @@ arg_service_list (const char *fname, int line_num, const char *args, fname, line_num, start) < 0) return 0; -#ifdef USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - __fwprintf (stderr, L"%s", buf); - else -#endif - fputs (buf, stderr); + __fxprintf (NULL, "%s", buf); free (buf); return 0; @@ -169,12 +164,7 @@ arg_service_list (const char *fname, int line_num, const char *args, fname, line_num, SERVICE_MAX) < 0) return 0; -#ifdef USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - __fwprintf (stderr, L"%s", buf); - else -#endif - fputs (buf, stderr); + __fxprintf (NULL, "%s", buf); free (buf); return 0; @@ -197,12 +187,7 @@ arg_service_list (const char *fname, int line_num, const char *args, fname, line_num) < 0) return 0; -#ifdef USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - __fwprintf (stderr, L"%s", buf); - else -#endif - fputs (buf, stderr); + __fxprintf (NULL, "%s", buf); free (buf); return 0; @@ -238,14 +223,9 @@ arg_trimdomain_list (const char *fname, int line_num, const char *args, fname, line_num, TRIMDOMAINS_MAX) < 0) return 0; -#ifdef USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - __fwprintf (stderr, L"%s", buf); - else -#endif - fputs (buf, stderr); + __fxprintf (NULL, "%s", buf); - free (buf); + free (buf); return 0; } _res_hconf.trimdomain[_res_hconf.num_trimdomains++] = @@ -264,12 +244,7 @@ arg_trimdomain_list (const char *fname, int line_num, const char *args, fname, line_num) < 0) return 0; -#ifdef USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - __fwprintf (stderr, L"%s", buf); - else -#endif - fputs (buf, stderr); + __fxprintf (NULL, "%s", buf); free (buf); return 0; @@ -327,12 +302,7 @@ arg_bool (const char *fname, int line_num, const char *args, unsigned flag) fname, line_num, args) < 0) return 0; -#ifdef USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - __fwprintf (stderr, L"%s", buf); - else -#endif - fputs (buf, stderr); + __fxprintf (NULL, "%s", buf); free (buf); return 0; @@ -375,12 +345,7 @@ parse_line (const char *fname, int line_num, const char *str) fname, line_num, start) < 0) return; -#ifdef USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - __fwprintf (stderr, L"%s", buf); - else -#endif - fputs (buf, stderr); + __fxprintf (NULL, "%s", buf); free (buf); return; @@ -405,12 +370,7 @@ parse_line (const char *fname, int line_num, const char *str) fname, line_num, str) < 0) break; -#ifdef USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - __fwprintf (stderr, L"%s", buf); - else -#endif - fputs (buf, stderr); + __fxprintf (NULL, "%s", buf); free (buf); } diff --git a/stdio-common/Makefile b/stdio-common/Makefile index 2e797e4dfe..d860d75dee 100644 --- a/stdio-common/Makefile +++ b/stdio-common/Makefile @@ -40,7 +40,7 @@ install-others = $(inst_includedir)/bits/stdio_lim.h include ../Makeconfig -aux := errlist siglist printf-parsemb printf-parsewc +aux := errlist siglist printf-parsemb printf-parsewc fxprintf distribute := _itoa.h _itowa.h _i18n_number.h \ printf-parse.h stdio_lim.h.in tst-unbputc.sh tst-printf.sh diff --git a/stdio-common/fxprintf.c b/stdio-common/fxprintf.c new file mode 100644 index 0000000000..298e5f22b0 --- /dev/null +++ b/stdio-common/fxprintf.c @@ -0,0 +1,54 @@ +/* Copyright (C) 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.org>. + + 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 <assert.h> +#include <ctype.h> +#include <stdarg.h> +#include <stdio.h> +#include <wchar.h> + + +int +__fxprintf (FILE *fp, const char *fmt, ...) +{ + if (fp == NULL) + fp = stderr; + + va_list ap; + va_start (ap, fmt); + + int res; + if (_IO_fwide (fp, 0) > 0) + { + size_t len = strlen (fmt) + 1, i; + wchar_t wfmt[len]; + for (i = 0; i < len; ++i) + { + assert (isascii (fmt[i])); + wfmt[i] = fmt[i]; + } + res = __vfwprintf (fp, wfmt, ap); + } + else + res = _IO_vfprintf (fp, fmt, ap); + + va_end (ap); + + return res; +} diff --git a/stdio-common/perror.c b/stdio-common/perror.c index f0751375b5..3ee61520f4 100644 --- a/stdio-common/perror.c +++ b/stdio-common/perror.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991-1993,1997,1998,2000-2004 Free Software Foundation, Inc. +/* Copyright (C) 1991-1993,1997,1998,2000-2005 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 @@ -37,10 +37,7 @@ perror_internal (FILE *fp, const char *s, int errnum) errstring = __strerror_r (errnum, buf, sizeof buf); - if (_IO_fwide (fp, 0) > 0) - (void) __fwprintf (fp, L"%s%s%s\n", s, colon, errstring); - else - (void) fprintf (fp, "%s%s%s\n", s, colon, errstring); + (void) __fxprintf (fp, "%s%s%s\n", s, colon, errstring); } diff --git a/stdio-common/psignal.c b/stdio-common/psignal.c index 2e6588c692..be95095350 100644 --- a/stdio-common/psignal.c +++ b/stdio-common/psignal.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991, 1992, 1995, 1996, 1997, 2001, 2002, 2004 +/* Copyright (C) 1991, 1992, 1995, 1996, 1997, 2001, 2002, 2004, 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -47,29 +47,16 @@ psignal (int sig, const char *s) colon = ": "; if (sig >= 0 && sig < NSIG && (desc = INTUSE(_sys_siglist)[sig]) != NULL) - { - if (_IO_fwide (stderr, 0) > 0) - (void) __fwprintf (stderr, L"%s%s%s\n", s, colon, _(desc)); - else - (void) fprintf (stderr, "%s%s%s\n", s, colon, _(desc)); - } + (void) __fxprintf (NULL, "%s%s%s\n", s, colon, _(desc)); else { char *buf; if (__asprintf (&buf, _("%s%sUnknown signal %d\n"), s, colon, sig) < 0) - { - if (_IO_fwide (stderr, 0) > 0) - (void) __fwprintf (stderr, L"%s%s%s\n", s, colon, _("Unknown signal")); - else - (void) fprintf (stderr, "%s%s%s\n", s, colon, _("Unknown signal")); - } + (void) __fxprintf (NULL, "%s%s%s\n", s, colon, _("Unknown signal")); else { - if (_IO_fwide (stderr, 0) > 0) - (void) __fwprintf (stderr, L"%s", buf); - else - (void) fputs (buf, stderr); + (void) __fxprintf (NULL, "%s", buf); free (buf); } diff --git a/stdlib/Makefile b/stdlib/Makefile index fafe6061a0..841663129d 100644 --- a/stdlib/Makefile +++ b/stdlib/Makefile @@ -23,7 +23,7 @@ subdir := stdlib headers := stdlib.h alloca.h monetary.h fmtmsg.h ucontext.h sys/ucontext.h \ inttypes.h stdint.h bits/wordsize.h bits/wchar.h \ - errno.h sys/errno.h bits/errno.h + errno.h sys/errno.h bits/errno.h bits/stdlib.h routines := \ atof atoi atol atoll \ diff --git a/stdlib/bits/stdlib.h b/stdlib/bits/stdlib.h new file mode 100644 index 0000000000..7ca6c8613c --- /dev/null +++ b/stdlib/bits/stdlib.h @@ -0,0 +1,75 @@ +/* Checking macros for stdlib functions. + Copyright (C) 2005 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 + 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. */ + +#ifndef _STDLIB_H +# error "Never include <bits/stdlib.h> directly; use <stdlib.h> instead." +#endif + +extern char *__realpath_chk (__const char *__restrict __name, + char *__restrict __resolved, + size_t __resolvedlen) __THROW __wur; +extern char *__REDIRECT_NTH (__realpath_alias, + (__const char *__restrict __name, + char *__restrict __resolved), realpath) __wur; + +extern __always_inline __wur char * +realpath (const char *__name, char *__resolved) +{ + if (__bos (__resolved) != (size_t) -1) + return __realpath_chk (__name, __resolved, __bos (__resolved)); + + return __realpath_alias (__name, __resolved); +} + + +extern int __ptsname_r_chk (int __fd, char *__buf, size_t __buflen, + size_t __nreal) __THROW __nonnull ((2)); +extern int __REDIRECT_NTH (__ptsname_r_alias, (int __fd, char *__buf, + size_t __buflen), ptsname_r) + __nonnull ((2)); + +extern __always_inline int +ptsname_r (int __fd, char *__buf, size_t __buflen) +{ + if (__bos (__buf) != (size_t) -1 + && (!__builtin_constant_p (__buflen) || __buflen > __bos (__buf))) + return __ptsname_r_chk (__fd, __buf, __buflen, __bos (__buf)); + return __ptsname_r_alias (__fd, __buf, __buflen); +} + + +extern int __wctomb_chk (char *__s, wchar_t __wchar, size_t __buflen) + __THROW __wur; +extern int __REDIRECT_NTH (__wctomb_alias, (char *__s, wchar_t __wchar), + wctomb) __wur; + +extern __always_inline __wur int +wctomb (char *__s, wchar_t __wchar) +{ + /* We would have to include <limits.h> to get a definition of MB_LEN_MAX. + But this would only disturb the namespace. So we define our own + version here. */ +#define __STDLIB_MB_LEN_MAX 16 +#if defined MB_LEN_MAX && MB_LEN_MAX != __STDLIB_MB_LEN_MAX +# error "Assumed value of MB_LEN_MAX wrong" +#endif + if (__bos (__s) != (size_t) -1 && __STDLIB_MB_LEN_MAX > __bos (__s)) + return __wctomb_chk (__s, __wchar, __bos (__s)); + return __wctomb_alias (__s, __wchar); +} diff --git a/stdlib/fmtmsg.c b/stdlib/fmtmsg.c index b5d7436956..e0f4061cee 100644 --- a/stdlib/fmtmsg.c +++ b/stdlib/fmtmsg.c @@ -154,42 +154,21 @@ fmtmsg (long int classification, const char *label, int severity, int do_action = (print & action_mask) && action != MM_NULLACT; int do_tag = (print & tag_mask) && tag != MM_NULLTAG; -#ifdef USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - { - if (__fwprintf (stderr, L"%s%s%s%s%s%s%s%s%s%s\n", - do_label ? label : "", - do_label - && (do_severity | do_text | do_action | do_tag) - ? ": " : "", - do_severity ? severity_rec->string : "", - do_severity && (do_text | do_action | do_tag) - ? ": " : "", - do_text ? text : "", - do_text && (do_action | do_tag) ? "\n" : "", - do_action ? "TO FIX: " : "", - do_action ? action : "", - do_action && do_tag ? " " : "", - do_tag ? tag : "") < 0) - /* Oh, oh. An error occurred during the output. */ - result = MM_NOMSG; - } - else -#endif - if (fprintf (stderr, "%s%s%s%s%s%s%s%s%s%s\n", - do_label ? label : "", - do_label && (do_severity | do_text | do_action | do_tag) - ? ": " : "", - do_severity ? severity_rec->string : "", - do_severity && (do_text | do_action | do_tag) ? ": " : "", - do_text ? text : "", - do_text && (do_action | do_tag) ? "\n" : "", - do_action ? "TO FIX: " : "", - do_action ? action : "", - do_action && do_tag ? " " : "", - do_tag ? tag : "") < 0) - /* Oh, oh. An error occurred during the output. */ - result = MM_NOMSG; + if (__fxprintf (stderr, "%s%s%s%s%s%s%s%s%s%s\n", + do_label ? label : "", + do_label && (do_severity | do_text | do_action | do_tag) + ? ": " : "", + do_severity ? severity_rec->string : "", + do_severity && (do_text | do_action | do_tag) + ? ": " : "", + do_text ? text : "", + do_text && (do_action | do_tag) ? "\n" : "", + do_action ? "TO FIX: " : "", + do_action ? action : "", + do_action && do_tag ? " " : "", + do_tag ? tag : "") < 0) + /* Oh, oh. An error occurred during the output. */ + result = MM_NOMSG; } if (classification & MM_CONSOLE) diff --git a/stdlib/stdlib.h b/stdlib/stdlib.h index 4a1571e7db..bff7722e2c 100644 --- a/stdlib/stdlib.h +++ b/stdlib/stdlib.h @@ -618,7 +618,7 @@ extern void *valloc (size_t __size) __THROW __attribute_malloc__ __wur; #ifdef __USE_XOPEN2K /* Allocate memory of SIZE bytes with an alignment of ALIGNMENT. */ extern int posix_memalign (void **__memptr, size_t __alignment, size_t __size) - __THROW __attribute_malloc__ __nonnull ((1)) __wur; + __THROW __nonnull ((1)) __wur; #endif __BEGIN_NAMESPACE_STD @@ -961,6 +961,12 @@ extern int getloadavg (double __loadavg[], int __nelem) __THROW __nonnull ((1)); #endif + +/* Define some macros helping to catch buffer overflows. */ +#if __USE_FORTIFY_LEVEL > 0 && !defined __cplusplus +# include <bits/stdlib.h> +#endif + #endif /* don't just need malloc and calloc */ #undef __need_malloc_and_calloc diff --git a/string/bits/string3.h b/string/bits/string3.h index bcda42a232..8da73ffde2 100644 --- a/string/bits/string3.h +++ b/string/bits/string3.h @@ -144,6 +144,22 @@ __strncpy_ichk (char *__restrict __dest, const char *__restrict __src, } +// XXX We have no corresponding builtin yet. +extern char *__stpncpy_chk (char *__dest, const char *__src, size_t __n, + size_t __destlen) __THROW; +extern char *__REDIRECT (__stpncpy_alias, (char *__dest, const char *__src, + size_t __n), stpncpy) __THROW; + +extern __always_inline char * +stpncpy (char *__dest, const char *__src, size_t __n) +{ + if (__bos (__dest) != (size_t) -1 + && (!__builtin_constant_p (__n) || __n <= __bos (__dest))) + return __stpncpy_chk (__dest, __src, __n, __bos (__dest)); + return __stpncpy_alias (__dest, __src, __n); +} + + #define strcat(dest, src) \ ((__bos (dest) != (size_t) -1) \ ? __builtin___strcat_chk (dest, src, __bos (dest)) \ diff --git a/sunrpc/auth_unix.c b/sunrpc/auth_unix.c index 1cf18cb6b3..c5a874bbbe 100644 --- a/sunrpc/auth_unix.c +++ b/sunrpc/auth_unix.c @@ -111,13 +111,7 @@ authunix_create (char *machname, uid_t uid, gid_t gid, int len, if (auth == NULL || au == NULL) { no_memory: -#ifdef USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - (void) __fwprintf (stderr, L"%s", - _("authunix_create: out of memory\n")); - else -#endif - (void) fputs (_("authunix_create: out of memory\n"), stderr); + (void) __fxprintf (NULL, "%s", _("authunix_create: out of memory\n")); mem_free (auth, sizeof (*auth)); mem_free (au, sizeof (*au)); return NULL; diff --git a/sunrpc/clnt_perr.c b/sunrpc/clnt_perr.c index 4fa5e62c0f..6446b32740 100644 --- a/sunrpc/clnt_perr.c +++ b/sunrpc/clnt_perr.c @@ -155,12 +155,7 @@ libc_hidden_def (clnt_sperror) void clnt_perror (CLIENT * rpch, const char *msg) { -#ifdef USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - (void) __fwprintf (stderr, L"%s", clnt_sperror (rpch, msg)); - else -#endif - (void) fputs (clnt_sperror (rpch, msg), stderr); + (void) __fxprintf (NULL, "%s", clnt_sperror (rpch, msg)); } libc_hidden_def (clnt_perror) @@ -289,12 +284,7 @@ libc_hidden_def (clnt_sperrno) void clnt_perrno (enum clnt_stat num) { -#ifdef USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - (void) __fwprintf (stderr, L"%s", clnt_sperrno (num)); - else -#endif - (void) fputs (clnt_sperrno (num), stderr); + (void) __fxprintf (NULL, "%s", clnt_sperrno (num)); } @@ -337,12 +327,7 @@ libc_hidden_def (clnt_spcreateerror) void clnt_pcreateerror (const char *msg) { -#ifdef USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - (void) __fwprintf (stderr, L"%s", clnt_spcreateerror (msg)); - else -#endif - (void) fputs (clnt_spcreateerror (msg), stderr); + (void) __fxprintf (NULL, "%s", clnt_spcreateerror (msg)); } struct auth_errtab diff --git a/sunrpc/clnt_tcp.c b/sunrpc/clnt_tcp.c index 5d02cd99cb..095baa87aa 100644 --- a/sunrpc/clnt_tcp.c +++ b/sunrpc/clnt_tcp.c @@ -128,13 +128,7 @@ clnttcp_create (struct sockaddr_in *raddr, u_long prog, u_long vers, if (h == NULL || ct == NULL) { struct rpc_createerr *ce = &get_rpc_createerr (); -#ifdef USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - (void) __fwprintf (stderr, L"%s", - _("clnttcp_create: out of memory\n")); - else -#endif - (void) fputs (_("clnttcp_create: out of memory\n"), stderr); + (void) __fxprintf (NULL, "%s", _("clnttcp_create: out of memory\n")); ce->cf_stat = RPC_SYSTEMERROR; ce->cf_error.re_errno = ENOMEM; goto fooy; diff --git a/sunrpc/clnt_udp.c b/sunrpc/clnt_udp.c index f3787dd1a5..f4a46b5036 100644 --- a/sunrpc/clnt_udp.c +++ b/sunrpc/clnt_udp.c @@ -136,13 +136,7 @@ clntudp_bufcreate (struct sockaddr_in *raddr, u_long program, u_long version, if (cl == NULL || cu == NULL) { struct rpc_createerr *ce = &get_rpc_createerr (); -#ifdef USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - (void) __fwprintf (stderr, L"%s", - _("clntudp_create: out of memory\n")); - else -#endif - (void) fputs (_("clntudp_create: out of memory\n"), stderr); + (void) __fxprintf (NULL, "%s", _("clntudp_create: out of memory\n")); ce->cf_stat = RPC_SYSTEMERROR; ce->cf_error.re_errno = ENOMEM; goto fooy; diff --git a/sunrpc/clnt_unix.c b/sunrpc/clnt_unix.c index fae1cd8229..4e93e0d855 100644 --- a/sunrpc/clnt_unix.c +++ b/sunrpc/clnt_unix.c @@ -125,13 +125,7 @@ clntunix_create (struct sockaddr_un *raddr, u_long prog, u_long vers, if (h == NULL || ct == NULL) { struct rpc_createerr *ce = &get_rpc_createerr (); -#ifdef USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - (void) __fwprintf (stderr, L"%s", - _("clntunix_create: out of memory\n")); - else -#endif - (void) fputs (_("clntunix_create: out of memory\n"), stderr); + (void) __fxprintf (NULL, "%s", _("clntunix_create: out of memory\n")); ce->cf_stat = RPC_SYSTEMERROR; ce->cf_error.re_errno = ENOMEM; goto fooy; diff --git a/sunrpc/svc_simple.c b/sunrpc/svc_simple.c index 5ac21ffdbd..6c1c9c914e 100644 --- a/sunrpc/svc_simple.c +++ b/sunrpc/svc_simple.c @@ -125,12 +125,7 @@ registerrpc (u_long prognum, u_long versnum, u_long procnum, err_out: if (buf == NULL) return -1; -#ifdef USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - (void) __fwprintf (stderr, L"%s", buf); - else -#endif - (void) fputs (buf, stderr); + (void) __fxprintf (NULL, "%s", buf); free (buf); return -1; } @@ -189,12 +184,7 @@ universal (struct svc_req *rqstp, SVCXPRT *transp_l) err_out2: if (buf == NULL) exit (1); -#ifdef USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - __fwprintf (stderr, L"%s", buf); - else -#endif - fputs (buf, stderr); + __fxprintf (NULL, "%s", buf); free (buf); exit (1); } diff --git a/sunrpc/svc_tcp.c b/sunrpc/svc_tcp.c index 873d39d52a..539a2b8d98 100644 --- a/sunrpc/svc_tcp.c +++ b/sunrpc/svc_tcp.c @@ -176,12 +176,7 @@ svctcp_create (int sock, u_int sendsize, u_int recvsize) xprt = (SVCXPRT *) mem_alloc (sizeof (SVCXPRT)); if (r == NULL || xprt == NULL) { -#ifdef USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - (void) __fwprintf (stderr, L"%s", _("svctcp_create: out of memory\n")); - else -#endif - (void) fputs (_("svctcp_create: out of memory\n"), stderr); + (void) __fxprintf (NULL, "%s", _("svctcp_create: out of memory\n")); mem_free (r, sizeof (*r)); mem_free (xprt, sizeof (SVCXPRT)); return NULL; @@ -219,13 +214,8 @@ makefd_xprt (int fd, u_int sendsize, u_int recvsize) cd = (struct tcp_conn *) mem_alloc (sizeof (struct tcp_conn)); if (xprt == (SVCXPRT *) NULL || cd == NULL) { -#ifdef USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - (void) __fwprintf (stderr, L"%s", - _("svc_tcp: makefd_xprt: out of memory\n")); - else -#endif - (void) fputs (_("svc_tcp: makefd_xprt: out of memory\n"), stderr); + (void) __fxprintf (NULL, "%s", + _("svc_tcp: makefd_xprt: out of memory\n")); mem_free (xprt, sizeof (SVCXPRT)); mem_free (cd, sizeof (struct tcp_conn)); return NULL; diff --git a/sunrpc/svc_udp.c b/sunrpc/svc_udp.c index 45f99440b2..c0c115abeb 100644 --- a/sunrpc/svc_udp.c +++ b/sunrpc/svc_udp.c @@ -149,12 +149,7 @@ svcudp_bufcreate (sock, sendsz, recvsz) buf = mem_alloc (((MAX (sendsz, recvsz) + 3) / 4) * 4); if (xprt == NULL || su == NULL || buf == NULL) { -#ifdef USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - (void) __fwprintf (stderr, L"%s", _("svcudp_create: out of memory\n")); - else -#endif - (void) fputs (_("svcudp_create: out of memory\n"), stderr); + (void) __fxprintf (NULL, "%s", _("svcudp_create: out of memory\n")); mem_free (xprt, sizeof (SVCXPRT)); mem_free (su, sizeof (*su)); mem_free (buf, ((MAX (sendsz, recvsz) + 3) / 4) * 4); @@ -176,14 +171,8 @@ svcudp_bufcreate (sock, sendsz, recvsz) + sizeof(struct cmsghdr) + sizeof (struct in_pktinfo)) > sizeof (xprt->xp_pad)) { -# ifdef USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - (void) __fwprintf (stderr, L"%s", - _("svcudp_create: xp_pad is too small for IP_PKTINFO\n")); - else -# endif - (void) fputs (_("svcudp_create: xp_pad is too small for IP_PKTINFO\n"), - stderr); + (void) __fxprintf (NULL,"%s", _("\ +svcudp_create: xp_pad is too small for IP_PKTINFO\n")); return NULL; } pad = 1; @@ -411,16 +400,8 @@ svcudp_destroy (xprt) #define SPARSENESS 4 /* 75% sparse */ -#ifdef USE_IN_LIBIO -# define CACHE_PERROR(msg) \ - if (_IO_fwide (stderr, 0) > 0) \ - (void) __fwprintf(stderr, L"%s\n", msg); \ - else \ - (void) fprintf(stderr, "%s\n", msg) -#else -# define CACHE_PERROR(msg) \ - (void) fprintf(stderr,"%s\n", msg) -#endif +#define CACHE_PERROR(msg) \ + (void) __fxprintf(NULL, "%s\n", msg) #define ALLOC(type, size) \ (type *) mem_alloc((unsigned) (sizeof(type) * (size))) diff --git a/sunrpc/svc_unix.c b/sunrpc/svc_unix.c index d95e884434..1b7b1fbd4f 100644 --- a/sunrpc/svc_unix.c +++ b/sunrpc/svc_unix.c @@ -173,12 +173,7 @@ svcunix_create (int sock, u_int sendsize, u_int recvsize, char *path) xprt = (SVCXPRT *) mem_alloc (sizeof (SVCXPRT)); if (r == NULL || xprt == NULL) { -#ifdef USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - __fwprintf (stderr, L"%s", _("svcunix_create: out of memory\n")); - else -#endif - fputs (_("svcunix_create: out of memory\n"), stderr); + __fxprintf (NULL, "%s", _("svcunix_create: out of memory\n")); mem_free (r, sizeof (*r)); mem_free (xprt, sizeof (SVCXPRT)); return NULL; @@ -216,13 +211,8 @@ makefd_xprt (int fd, u_int sendsize, u_int recvsize) cd = (struct unix_conn *) mem_alloc (sizeof (struct unix_conn)); if (xprt == (SVCXPRT *) NULL || cd == (struct unix_conn *) NULL) { -#ifdef USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - (void) __fwprintf (stderr, L"%s", - _("svc_unix: makefd_xprt: out of memory\n")); - else -#endif - (void) fputs (_("svc_unix: makefd_xprt: out of memory\n"), stderr); + (void) __fxprintf (NULL, "%s", + _("svc_unix: makefd_xprt: out of memory\n")); mem_free (xprt, sizeof (SVCXPRT)); mem_free (cd, sizeof (struct unix_conn)); return NULL; diff --git a/sunrpc/xdr.c b/sunrpc/xdr.c index 1f25e3e9c0..21e339b4ee 100644 --- a/sunrpc/xdr.c +++ b/sunrpc/xdr.c @@ -563,12 +563,7 @@ xdr_bytes (xdrs, cpp, sizep, maxsize) } if (sp == NULL) { -#ifdef USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - (void) __fwprintf (stderr, L"%s", _("xdr_bytes: out of memory\n")); - else -#endif - (void) fputs (_("xdr_bytes: out of memory\n"), stderr); + (void) __fxprintf (NULL, "%s", _("xdr_bytes: out of memory\n")); return FALSE; } /* fall into ... */ @@ -720,13 +715,7 @@ xdr_string (xdrs, cpp, maxsize) *cpp = sp = (char *) mem_alloc (nodesize); if (sp == NULL) { -#ifdef USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - (void) __fwprintf (stderr, L"%s", - _("xdr_string: out of memory\n")); - else -#endif - (void) fputs (_("xdr_string: out of memory\n"), stderr); + (void) __fxprintf (NULL, "%s", _("xdr_string: out of memory\n")); return FALSE; } sp[size] = 0; diff --git a/sunrpc/xdr_array.c b/sunrpc/xdr_array.c index 9f67e7fe62..765f8995d3 100644 --- a/sunrpc/xdr_array.c +++ b/sunrpc/xdr_array.c @@ -105,13 +105,7 @@ xdr_array (xdrs, addrp, sizep, maxsize, elsize, elproc) *addrp = target = mem_alloc (nodesize); if (target == NULL) { -#ifdef USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - (void) __fwprintf (stderr, L"%s", - _("xdr_array: out of memory\n")); - else -#endif - (void) fputs (_("xdr_array: out of memory\n"), stderr); + (void) __fxprintf (NULL, "%s", _("xdr_array: out of memory\n")); return FALSE; } __bzero (target, nodesize); diff --git a/sunrpc/xdr_rec.c b/sunrpc/xdr_rec.c index 5e59c88523..1be3a4ad26 100644 --- a/sunrpc/xdr_rec.c +++ b/sunrpc/xdr_rec.c @@ -153,12 +153,7 @@ xdrrec_create (XDR *xdrs, u_int sendsize, if (rstrm == NULL || buf == NULL) { -#ifdef USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - (void) __fwprintf (stderr, L"%s", _("xdrrec_create: out of memory\n")); - else -#endif - (void) fputs (_("xdrrec_create: out of memory\n"), stderr); + (void) __fxprintf (NULL, "%s", _("xdrrec_create: out of memory\n")); mem_free (rstrm, sizeof (RECSTREAM)); mem_free (buf, sendsize + recvsize + BYTES_PER_XDR_UNIT); /* diff --git a/sunrpc/xdr_ref.c b/sunrpc/xdr_ref.c index ab706d7f84..961c82edd2 100644 --- a/sunrpc/xdr_ref.c +++ b/sunrpc/xdr_ref.c @@ -82,13 +82,8 @@ xdr_reference (xdrs, pp, size, proc) *pp = loc = (caddr_t) mem_alloc (size); if (loc == NULL) { -#ifdef USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - (void) __fwprintf (stderr, L"%s", - _("xdr_reference: out of memory\n")); - else -#endif - (void) fputs (_("xdr_reference: out of memory\n"), stderr); + (void) __fxprintf (NULL, "%s", + _("xdr_reference: out of memory\n")); return FALSE; } __bzero (loc, (int) size); diff --git a/sysdeps/alpha/fpu/feholdexcpt.c b/sysdeps/alpha/fpu/feholdexcpt.c index 77d4cc1180..79aa970ac0 100644 --- a/sysdeps/alpha/fpu/feholdexcpt.c +++ b/sysdeps/alpha/fpu/feholdexcpt.c @@ -1,5 +1,5 @@ /* Store current floating-point environment and clear exceptions. - Copyright (C) 1997, 2000 Free Software Foundation, Inc. + Copyright (C) 1997, 2000, 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Richard Henderson <rth@tamu.edu>, 1997 @@ -31,3 +31,4 @@ feholdexcept (fenv_t *envp) return 0; } +libm_hidden_def (feholdexcept) diff --git a/sysdeps/alpha/fpu/fesetround.c b/sysdeps/alpha/fpu/fesetround.c index c4dc196016..54b2bcf673 100644 --- a/sysdeps/alpha/fpu/fesetround.c +++ b/sysdeps/alpha/fpu/fesetround.c @@ -1,5 +1,5 @@ /* Set current rounding direction. - Copyright (C) 1997, 2000 Free Software Foundation, Inc. + Copyright (C) 1997, 2000, 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Richard Henderson <rth@tamu.edu>, 1997 @@ -40,3 +40,4 @@ fesetround (int round) return 0; } +libm_hidden_def (fesetround) diff --git a/sysdeps/generic/clock_gettime.c b/sysdeps/generic/clock_gettime.c index 85bb79c548..ff306120ba 100644 --- a/sysdeps/generic/clock_gettime.c +++ b/sysdeps/generic/clock_gettime.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1999 Free Software Foundation, Inc. +/* Copyright (C) 1999, 2005 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 @@ -26,5 +26,6 @@ clock_gettime (clockid_t clock_id, struct timespec *tp) __set_errno (ENOSYS); return -1; } +librt_hidden_def (clock_gettime) stub_warning (clock_gettime) #include <stub-tag.h> diff --git a/sysdeps/generic/feholdexcpt.c b/sysdeps/generic/feholdexcpt.c index 927a6dc95c..8680d1e492 100644 --- a/sysdeps/generic/feholdexcpt.c +++ b/sysdeps/generic/feholdexcpt.c @@ -1,5 +1,5 @@ /* Store current floating-point environment and clear exceptions. - Copyright (C) 1997 Free Software Foundation, Inc. + Copyright (C) 1997, 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. @@ -25,5 +25,6 @@ feholdexcept (fenv_t *envp) { return 1; /* Signal failure. */ } +libm_hidden_def (feholdexcept) stub_warning (feholdexcept) #include <stub-tag.h> diff --git a/sysdeps/generic/fesetround.c b/sysdeps/generic/fesetround.c index e5a27d2aa0..5b14826390 100644 --- a/sysdeps/generic/fesetround.c +++ b/sysdeps/generic/fesetround.c @@ -1,5 +1,5 @@ /* Set current rounding direction. - Copyright (C) 1997 Free Software Foundation, Inc. + Copyright (C) 1997, 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. @@ -25,5 +25,6 @@ fesetround (int round) { return 1; /* Signal we are unable to set the direction. */ } +libm_hidden_def (fesetround) stub_warning (fesetround) #include <stub-tag.h> diff --git a/sysdeps/generic/s_significand.c b/sysdeps/generic/s_significand.c index 4ab078c473..f95b6481c2 100644 --- a/sysdeps/generic/s_significand.c +++ b/sysdeps/generic/s_significand.c @@ -30,7 +30,7 @@ static char rcsid[] = "$NetBSD: s_significand.c,v 1.6 1995/05/10 20:48:11 jtc Ex double x; #endif { - return __ieee754_scalb(x,(double) -ilogb(x)); + return __ieee754_scalb(x,(double) -__ilogb(x)); } weak_alias (__significand, significand) #ifdef NO_LONG_DOUBLE diff --git a/sysdeps/generic/s_significandf.c b/sysdeps/generic/s_significandf.c index 2893a4e1b7..cf5eb59efc 100644 --- a/sysdeps/generic/s_significandf.c +++ b/sysdeps/generic/s_significandf.c @@ -8,7 +8,7 @@ * * Developed at SunPro, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice + * software is freely granted, provided that this notice * is preserved. * ==================================================== */ @@ -27,6 +27,6 @@ static char rcsid[] = "$NetBSD: s_significandf.c,v 1.3 1995/05/10 20:48:13 jtc E float x; #endif { - return __ieee754_scalbf(x,(float) -ilogbf(x)); + return __ieee754_scalbf(x,(float) -__ilogbf(x)); } weak_alias (__significandf, significandf) diff --git a/sysdeps/generic/stpncpy_chk.c b/sysdeps/generic/stpncpy_chk.c new file mode 100644 index 0000000000..d136339dea --- /dev/null +++ b/sysdeps/generic/stpncpy_chk.c @@ -0,0 +1,85 @@ +/* Copyright (C) 1993,1995,1996,1997,2002,2005 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 + 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. */ + +/* This is almost copied from strncpy.c, written by Torbjorn Granlund. */ + +#include <string.h> + + +/* Copy no more than N characters of SRC to DEST, returning the address of + the terminating '\0' in DEST, if any, or else DEST + N. */ +char * +__stpncpy_chk (char *dest, const char *src, size_t n, size_t destlen) +{ + char c; + char *s = dest; + + if (__builtin_expect (destlen < n, 0)) + __chk_fail (); + + if (n >= 4) + { + size_t n4 = n >> 2; + + for (;;) + { + c = *src++; + *dest++ = c; + if (c == '\0') + break; + c = *src++; + *dest++ = c; + if (c == '\0') + break; + c = *src++; + *dest++ = c; + if (c == '\0') + break; + c = *src++; + *dest++ = c; + if (c == '\0') + break; + if (--n4 == 0) + goto last_chars; + } + n -= dest - s; + goto zero_fill; + } + + last_chars: + n &= 3; + if (n == 0) + return dest; + + for (;;) + { + c = *src++; + --n; + *dest++ = c; + if (c == '\0') + break; + if (n == 0) + return dest; + } + + zero_fill: + while (n-- > 0) + dest[n] = '\0'; + + return dest - 1; +} diff --git a/sysdeps/generic/wordexp.c b/sysdeps/generic/wordexp.c index 06d38f6b24..2eb58089c4 100644 --- a/sysdeps/generic/wordexp.c +++ b/sysdeps/generic/wordexp.c @@ -1798,12 +1798,7 @@ envsubst: if (str[0] == '\0') str = _("parameter null or not set"); -#ifdef USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - __fwprintf (stderr, L"%s: %s\n", env, str); - else -#endif - fprintf (stderr, "%s: %s\n", env, str); + __fxprintf (NULL, "%s: %s\n", env, str); } if (free_value) diff --git a/sysdeps/i386/fpu/feholdexcpt.c b/sysdeps/i386/fpu/feholdexcpt.c index 55096869a1..feaa24b8d9 100644 --- a/sysdeps/i386/fpu/feholdexcpt.c +++ b/sysdeps/i386/fpu/feholdexcpt.c @@ -1,5 +1,5 @@ /* Store current floating-point environment and clear exceptions. - Copyright (C) 1997, 1999, 2003, 2004 Free Software Foundation, Inc. + Copyright (C) 1997, 1999, 2003, 2004, 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. @@ -51,3 +51,4 @@ feholdexcept (fenv_t *envp) return 0; } +libm_hidden_def (feholdexcept) diff --git a/sysdeps/i386/fpu/fesetround.c b/sysdeps/i386/fpu/fesetround.c index 2746f3ebf3..a868f275f0 100644 --- a/sysdeps/i386/fpu/fesetround.c +++ b/sysdeps/i386/fpu/fesetround.c @@ -1,5 +1,5 @@ /* Set current rounding direction. - Copyright (C) 1997, 2003, 2004 Free Software Foundation, Inc. + Copyright (C) 1997, 2003, 2004, 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. @@ -50,3 +50,4 @@ fesetround (int round) return 0; } +libm_hidden_def (fesetround) diff --git a/sysdeps/ia64/fpu/feholdexcpt.c b/sysdeps/ia64/fpu/feholdexcpt.c index fd13de6c35..27c9a1109e 100644 --- a/sysdeps/ia64/fpu/feholdexcpt.c +++ b/sysdeps/ia64/fpu/feholdexcpt.c @@ -1,5 +1,5 @@ /* Store current floating-point environment and clear exceptions. - Copyright (C) 1997, 1999, 2000 Free Software Foundation, Inc. + Copyright (C) 1997, 1999, 2000, 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Christian Boissat <Christian.Boissat@cern.ch>, 1999 @@ -31,3 +31,4 @@ feholdexcept (fenv_t *envp) return 1; } +libm_hidden_def (feholdexcept) diff --git a/sysdeps/ia64/fpu/fesetround.c b/sysdeps/ia64/fpu/fesetround.c index 26a6be4ea3..351bcc2f10 100644 --- a/sysdeps/ia64/fpu/fesetround.c +++ b/sysdeps/ia64/fpu/fesetround.c @@ -1,5 +1,5 @@ /* Set current rounding direction. - Copyright (C) 1999, 2000 Free Software Foundation, Inc. + Copyright (C) 1999, 2000, 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Christian Boissat <Christian.Boissat@cern.ch>, 1999. @@ -39,3 +39,4 @@ fesetround (int round) return 1; } +libm_hidden_def (fesetround) diff --git a/sysdeps/ieee754/dbl-64/s_sincos.c b/sysdeps/ieee754/dbl-64/s_sincos.c index f0542c500c..e946f9f976 100644 --- a/sysdeps/ieee754/dbl-64/s_sincos.c +++ b/sysdeps/ieee754/dbl-64/s_sincos.c @@ -1,5 +1,5 @@ /* Compute sine and cosine of argument. - Copyright (C) 1997, 2001 Free Software Foundation, Inc. + Copyright (C) 1997, 2001, 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. @@ -40,8 +40,8 @@ __sincos (double x, double *sinx, double *cosx) } else { - *sinx = sin (x); - *cosx = cos (x); + *sinx = __sin (x); + *cosx = __cos (x); } } weak_alias (__sincos, sincos) diff --git a/sysdeps/ieee754/flt-32/e_atan2f.c b/sysdeps/ieee754/flt-32/e_atan2f.c index 8b3398c0a3..c0cafb16b8 100644 --- a/sysdeps/ieee754/flt-32/e_atan2f.c +++ b/sysdeps/ieee754/flt-32/e_atan2f.c @@ -30,7 +30,7 @@ zero = 0.0, pi_o_4 = 7.8539818525e-01, /* 0x3f490fdb */ pi_o_2 = 1.5707963705e+00, /* 0x3fc90fdb */ pi = 3.1415927410e+00, /* 0x40490fdb */ -pi_lo = -8.7422776573e-07; /* 0xb3bbbd2e */ +pi_lo = -8.7422776573e-08; /* 0xb3bbbd2e */ #ifdef __STDC__ float __ieee754_atan2f(float y, float x) diff --git a/sysdeps/powerpc/fpu/feholdexcpt.c b/sysdeps/powerpc/fpu/feholdexcpt.c index 8ac875cc72..150becd678 100644 --- a/sysdeps/powerpc/fpu/feholdexcpt.c +++ b/sysdeps/powerpc/fpu/feholdexcpt.c @@ -1,5 +1,5 @@ /* Store current floating-point environment and clear exceptions. - Copyright (C) 1997 Free Software Foundation, Inc. + Copyright (C) 1997, 2005 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 @@ -36,3 +36,4 @@ feholdexcept (fenv_t *envp) return 0; } +libm_hidden_def (feholdexcept) diff --git a/sysdeps/powerpc/fpu/fesetround.c b/sysdeps/powerpc/fpu/fesetround.c index f7cd6af135..67518d0df4 100644 --- a/sysdeps/powerpc/fpu/fesetround.c +++ b/sysdeps/powerpc/fpu/fesetround.c @@ -1,5 +1,5 @@ /* Set current rounding direction. - Copyright (C) 1997 Free Software Foundation, Inc. + Copyright (C) 1997, 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. @@ -39,3 +39,4 @@ fesetround (int round) return 0; } +libm_hidden_def (fesetround) diff --git a/sysdeps/powerpc/fpu/libm-test-ulps b/sysdeps/powerpc/fpu/libm-test-ulps index 850a10746c..1ea3b60d9d 100644 --- a/sysdeps/powerpc/fpu/libm-test-ulps +++ b/sysdeps/powerpc/fpu/libm-test-ulps @@ -2,17 +2,14 @@ # atan2 Test "atan2 (-0.75, -1.0) == -2.49809154479650885165983415456218025": -float: 3 -ifloat: 3 +float: 1 +ifloat: 1 Test "atan2 (0.75, -1.0) == 2.49809154479650885165983415456218025": -float: 3 -ifloat: 3 +float: 1 +ifloat: 1 Test "atan2 (1.390625, 0.9296875) == 0.981498387184244311516296577615519772": float: 1 ifloat: 1 -Test "atan2 (-0.00756827042671106339, -.001792735857538728036) == -1.80338464113663849327153994379639112": -float: 6 -ifloat: 6 # atanh Test "atanh (0.75) == 0.972955074527656652552676371721589865": @@ -623,8 +620,8 @@ idouble: 1 # Maximal error of functions: Function: "atan2": -float: 6 -ifloat: 6 +float: 1 +ifloat: 1 Function: "atanh": float: 1 diff --git a/sysdeps/s390/fpu/feholdexcpt.c b/sysdeps/s390/fpu/feholdexcpt.c index 7fd7ea53ca..dee44dcee3 100644 --- a/sysdeps/s390/fpu/feholdexcpt.c +++ b/sysdeps/s390/fpu/feholdexcpt.c @@ -1,5 +1,5 @@ /* Store current floating-point environment and clear exceptions. - Copyright (C) 2000 Free Software Foundation, Inc. + Copyright (C) 2000, 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Denis Joseph Barrow (djbarrow@de.ibm.com). @@ -32,3 +32,4 @@ int feholdexcept (fenv_t *envp) _FPU_SETCW ((envp->fpc & ~(FE_ALL_EXCEPT << FPC_EXCEPTION_MASK_SHIFT))); return 0; } +libm_hidden_def (feholdexcept) diff --git a/sysdeps/s390/fpu/fesetround.c b/sysdeps/s390/fpu/fesetround.c index 5f510fe0ad..d99f1db181 100644 --- a/sysdeps/s390/fpu/fesetround.c +++ b/sysdeps/s390/fpu/fesetround.c @@ -1,5 +1,5 @@ /* Set current rounding direction. - Copyright (C) 2000 Free Software Foundation, Inc. + Copyright (C) 2000, 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Denis Joseph Barrow (djbarrow@de.ibm.com). @@ -35,3 +35,4 @@ fesetround (int round) return 0; } +libm_hidden_def (fesetround) diff --git a/sysdeps/s390/fpu/libm-test-ulps b/sysdeps/s390/fpu/libm-test-ulps index cfade822a3..552ad4afae 100644 --- a/sysdeps/s390/fpu/libm-test-ulps +++ b/sysdeps/s390/fpu/libm-test-ulps @@ -2,17 +2,14 @@ # atan2 Test "atan2 (-0.75, -1.0) == -2.49809154479650885165983415456218025": -float: 3 -ifloat: 3 +float: 1 +ifloat: 1 Test "atan2 (0.75, -1.0) == 2.49809154479650885165983415456218025": -float: 3 -ifloat: 3 +float: 1 +ifloat: 1 Test "atan2 (1.390625, 0.9296875) == 0.981498387184244311516296577615519772": float: 1 ifloat: 1 -Test "atan2 (-0.00756827042671106339, -.001792735857538728036) == -1.80338464113663849327153994379639112": -float: 6 -ifloat: 6 # atanh Test "atanh (0.75) == 0.972955074527656652552676371721589865": @@ -664,8 +661,8 @@ idouble: 1 # Maximal error of functions: Function: "atan2": -float: 6 -ifloat: 6 +float: 1 +ifloat: 1 Function: "atanh": float: 1 diff --git a/sysdeps/s390/s390-64/bcopy.S b/sysdeps/s390/s390-64/bcopy.S index ff7966723b..abcb1fb1b4 100644 --- a/sysdeps/s390/s390-64/bcopy.S +++ b/sysdeps/s390/s390-64/bcopy.S @@ -1,6 +1,6 @@ /* bcopy -- copy a block from source to destination. 64 bit S/390 version. This file is part of the GNU C Library. - Copyright (C) 2000, 2001 Free Software Foundation, Inc. + Copyright (C) 2000, 2001, 2005 Free Software Foundation, Inc. Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). The GNU C Library is free software; you can redistribute it and/or @@ -59,14 +59,10 @@ ENTRY(__bcopy) jo .L6 br %r14 .L7: # destructive overlay, can not use mvcle - lgr %r1,%r2 # bcopy is called with source,dest - lgr %r2,%r3 # memmove with dest,source! Oh, well... - lgr %r3,%r1 -#ifdef PIC - jg memmove@PLT -#else - jg memmove -#endif + lgr %r1,%r2 # bcopy is called with source,dest + lgr %r2,%r3 # memmove with dest,source! Oh, well... + lgr %r3,%r1 + jg HIDDEN_BUILTIN_JUMPTARGET(memmove) END(__bcopy) diff --git a/sysdeps/sh/sh4/fpu/feholdexcpt.c b/sysdeps/sh/sh4/fpu/feholdexcpt.c index dafb4f7daa..7aac5a0d39 100644 --- a/sysdeps/sh/sh4/fpu/feholdexcpt.c +++ b/sysdeps/sh/sh4/fpu/feholdexcpt.c @@ -1,5 +1,5 @@ /* Store current floating-point environment and clear exceptions. - Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation, Inc. + Copyright (C) 1997, 1998, 1999, 2000, 2005 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 @@ -35,3 +35,4 @@ feholdexcept (fenv_t *envp) return 1; } +libm_hidden_def (feholdexcept) diff --git a/sysdeps/sh/sh4/fpu/fesetround.c b/sysdeps/sh/sh4/fpu/fesetround.c index 9966838387..cf4349004e 100644 --- a/sysdeps/sh/sh4/fpu/fesetround.c +++ b/sysdeps/sh/sh4/fpu/fesetround.c @@ -1,5 +1,5 @@ /* Set current rounding direction. - Copyright (C) 1998, 2000 Free Software Foundation, Inc. + Copyright (C) 1998, 2000, 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Andreas Jaeger <aj@arthur.rhein-neckar.de>, 1998. @@ -41,3 +41,4 @@ fesetround (int round) return 1; } +libm_hidden_def (fesetround) diff --git a/sysdeps/sparc/fpu/feholdexcpt.c b/sysdeps/sparc/fpu/feholdexcpt.c index 3bd2b16cf1..729637ad1b 100644 --- a/sysdeps/sparc/fpu/feholdexcpt.c +++ b/sysdeps/sparc/fpu/feholdexcpt.c @@ -1,5 +1,5 @@ /* Store current floating-point environment and clear exceptions. - Copyright (C) 1997, 1998 Free Software Foundation, Inc. + Copyright (C) 1997, 1998, 2005 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 @@ -33,3 +33,4 @@ feholdexcept (fenv_t *envp) return 0; } +libm_hidden_def (feholdexcept) diff --git a/sysdeps/sparc/fpu/fesetround.c b/sysdeps/sparc/fpu/fesetround.c index b18b344516..e3b441cd53 100644 --- a/sysdeps/sparc/fpu/fesetround.c +++ b/sysdeps/sparc/fpu/fesetround.c @@ -1,5 +1,5 @@ /* Set current rounding direction. - Copyright (C) 1997 Free Software Foundation, Inc. + Copyright (C) 1997, 2005 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 @@ -35,3 +35,4 @@ fesetround (int round) return 0; } +libm_hidden_def (fesetround) diff --git a/sysdeps/unix/clock_gettime.c b/sysdeps/unix/clock_gettime.c index 8f82ac848d..f698f0151b 100644 --- a/sysdeps/unix/clock_gettime.c +++ b/sysdeps/unix/clock_gettime.c @@ -131,3 +131,4 @@ clock_gettime (clockid_t clock_id, struct timespec *tp) return retval; } +librt_hidden_def (clock_gettime) diff --git a/sysdeps/unix/sysv/linux/ia64/has_cpuclock.c b/sysdeps/unix/sysv/linux/ia64/has_cpuclock.c index ee19161272..39511cd2c5 100644 --- a/sysdeps/unix/sysv/linux/ia64/has_cpuclock.c +++ b/sysdeps/unix/sysv/linux/ia64/has_cpuclock.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2000, 2001, 2003, 2004 Free Software Foundation, Inc. +/* Copyright (C) 2000, 2001, 2003, 2004, 2005 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 @@ -21,7 +21,7 @@ #include <unistd.h> #include <sys/stat.h> #include <sys/types.h> - +#include <not-cancel.h> static int itc_usable; @@ -31,18 +31,18 @@ has_cpuclock (void) if (__builtin_expect (itc_usable == 0, 0)) { int newval = 1; - int fd = open ("/proc/sal/itc_drift", O_RDONLY); + int fd = open_not_cancel_2 ("/proc/sal/itc_drift", O_RDONLY); if (__builtin_expect (fd != -1, 1)) { char buf[16]; /* We expect the file to contain a single digit followed by a newline. If the format changes we better not rely on the file content. */ - if (read (fd, buf, sizeof buf) != 2 || buf[0] != '0' - || buf[1] != '\n') + if (read_not_cancel (fd, buf, sizeof buf) != 2 + || buf[0] != '0' || buf[1] != '\n') newval = -1; - close (fd); + close_not_cancel_no_status (fd); } itc_usable = newval; diff --git a/sysdeps/x86_64/fpu/feholdexcpt.c b/sysdeps/x86_64/fpu/feholdexcpt.c index db53d0f07f..a9b21a3c25 100644 --- a/sysdeps/x86_64/fpu/feholdexcpt.c +++ b/sysdeps/x86_64/fpu/feholdexcpt.c @@ -1,5 +1,5 @@ /* Store current floating-point environment and clear exceptions. - Copyright (C) 2001 Free Software Foundation, Inc. + Copyright (C) 2001, 2005 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 @@ -39,3 +39,4 @@ feholdexcept (fenv_t *envp) return 0; } +libm_hidden_def (feholdexcept) diff --git a/sysdeps/x86_64/fpu/fesetround.c b/sysdeps/x86_64/fpu/fesetround.c index 429b7f1d0c..408116eee8 100644 --- a/sysdeps/x86_64/fpu/fesetround.c +++ b/sysdeps/x86_64/fpu/fesetround.c @@ -1,5 +1,5 @@ /* Set current rounding direction. - Copyright (C) 2001 Free Software Foundation, Inc. + Copyright (C) 2001, 2005 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 @@ -44,3 +44,4 @@ fesetround (int round) return 0; } +libm_hidden_def (fesetround) diff --git a/sysdeps/x86_64/fpu/libm-test-ulps b/sysdeps/x86_64/fpu/libm-test-ulps index b3ce8bfeee..425549dd0e 100644 --- a/sysdeps/x86_64/fpu/libm-test-ulps +++ b/sysdeps/x86_64/fpu/libm-test-ulps @@ -24,17 +24,14 @@ ldouble: 1 # atan2 Test "atan2 (-0.75, -1.0) == -2.49809154479650885165983415456218025": -float: 3 -ifloat: 3 +float: 1 +ifloat: 1 Test "atan2 (0.75, -1.0) == 2.49809154479650885165983415456218025": -float: 3 -ifloat: 3 +float: 1 +ifloat: 1 Test "atan2 (1.390625, 0.9296875) == 0.981498387184244311516296577615519772": float: 1 ifloat: 1 -Test "atan2 (-0.00756827042671106339, -.001792735857538728036) == -1.80338464113663849327153994379639112": -float: 6 -ifloat: 6 # atanh Test "atanh (0.75) == 0.972955074527656652552676371721589865": @@ -953,8 +950,8 @@ ildouble: 1 ldouble: 1 Function: "atan2": -float: 6 -ifloat: 6 +float: 1 +ifloat: 1 Function: "atanh": float: 1 diff --git a/sysdeps/x86_64/fpu/s_sincos.S b/sysdeps/x86_64/fpu/s_sincos.S new file mode 100644 index 0000000000..9a33615340 --- /dev/null +++ b/sysdeps/x86_64/fpu/s_sincos.S @@ -0,0 +1,61 @@ +/* Compute sine and cosine of argument. + Copyright (C) 1997, 2000, 2001, 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. + + 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 <machine/asm.h> +#include "bp-sym.h" +#include "bp-asm.h" + +#define PARMS LINKAGE /* no space for saved regs */ +#define ANGLE PARMS +#define SINP ANGLE+12 +#define COSP SINP+PTR_SIZE + + .text +ENTRY (BP_SYM (__sincos)) + ENTER + + movsd %xmm0, -8(%rsp) + fldl -8(%rsp) + fsincos + fnstsw %ax + testl $0x400,%eax + jnz 1f + fstpl (%rsi) + fstpl (%rdi) + + LEAVE + retq + +1: fldpi + fadd %st(0) + fxch %st(1) +2: fprem1 + fnstsw %ax + testl $0x400,%eax + jnz 2b + fstp %st(1) + fsincos + fstpl (%rsi) + fstpl (%rdi) + + LEAVE + retq +END (BP_SYM (__sincos)) +weak_alias (BP_SYM (__sincos), BP_SYM (sincos)) diff --git a/sysdeps/x86_64/fpu/s_sincosl.S b/sysdeps/x86_64/fpu/s_sincosl.S index 9a3025ab5f..b17eabe767 100644 --- a/sysdeps/x86_64/fpu/s_sincosl.S +++ b/sysdeps/x86_64/fpu/s_sincosl.S @@ -1,5 +1,5 @@ /* Compute sine and cosine of argument. - Copyright (C) 1997, 2000, 2001 Free Software Foundation, Inc. + Copyright (C) 1997, 2000, 2001, 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. @@ -40,9 +40,8 @@ ENTRY (BP_SYM (__sincosl)) fstpt (%rdi) LEAVE - ret + retq - .align ALIGNARG(4) 1: fldpi fadd %st(0) fxch %st(1) @@ -56,6 +55,6 @@ ENTRY (BP_SYM (__sincosl)) fstpt (%rdi) LEAVE - ret + retq END (BP_SYM (__sincosl)) weak_alias (BP_SYM (__sincosl), BP_SYM (sincosl)) diff --git a/wcsmbs/bits/wchar2.h b/wcsmbs/bits/wchar2.h new file mode 100644 index 0000000000..c102948f11 --- /dev/null +++ b/wcsmbs/bits/wchar2.h @@ -0,0 +1,398 @@ +/* Checking macros for wchar functions. + Copyright (C) 2005 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 + 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. */ + +#ifndef _WCHAR_H +# error "Never include <bits/wchar.h> directly; use <wchar.h> instead." +#endif + + +extern wchar_t *__wmemcpy_chk (wchar_t *__restrict __s1, + __const wchar_t *__restrict __s2, size_t __n, + size_t __ns1) __THROW; +extern wchar_t *__REDIRECT_NTH (__wmemcpy_alias, + (wchar_t *__restrict __s1, + __const wchar_t *__restrict __s2, size_t __n), + wmemcpy); + +extern __always_inline wchar_t * +wmemcpy (wchar_t *__restrict __s1, __const wchar_t *__restrict __s2, + size_t __n) +{ + if (__bos0 (__s1) != (size_t) -1) + return __wmemcpy_chk (__s1, __s2, __n, __bos0 (__s1) / sizeof (wchar_t)); + return __wmemcpy_alias (__s1, __s2, __n); +} + + +extern wchar_t *__wmemmove_chk (wchar_t *__s1, __const wchar_t *__s2, + size_t __n, size_t __ns1) __THROW; +extern wchar_t *__REDIRECT_NTH (__wmemmove_alias, (wchar_t *__s1, + __const wchar_t *__s2, + size_t __n), wmemmove); + +extern __always_inline wchar_t * +wmemmove (wchar_t *__restrict __s1, __const wchar_t *__restrict __s2, + size_t __n) +{ + if (__bos0 (__s1) != (size_t) -1) + return __wmemmove_chk (__s1, __s2, __n, __bos0 (__s1) / sizeof (wchar_t)); + return __wmemmove_alias (__s1, __s2, __n); +} + + +#ifdef __USE_GNU +extern wchar_t *__wmempcpy_chk (wchar_t *__restrict __s1, + __const wchar_t *__restrict __s2, size_t __n, + size_t __ns1) __THROW; +extern wchar_t *__REDIRECT_NTH (__wmempcpy_alias, + (wchar_t *__restrict __s1, + __const wchar_t *__restrict __s2, + size_t __n), wmempcpy); + +extern __always_inline wchar_t * +wmempcpy (wchar_t *__restrict __s1, __const wchar_t *__restrict __s2, + size_t __n) +{ + if (__bos0 (__s1) != (size_t) -1) + return __wmempcpy_chk (__s1, __s2, __n, __bos0 (__s1) / sizeof (wchar_t)); + return __wmempcpy_alias (__s1, __s2, __n); +} +#endif + + +extern wchar_t *__wmemset_chk (wchar_t *__s, wchar_t __c, size_t __n, + size_t __ns) __THROW; +extern wchar_t *__REDIRECT_NTH (__wmemset_alias, (wchar_t *__s, wchar_t __c, + size_t __n), wmemset); + +extern __always_inline wchar_t * +wmemset (wchar_t *__restrict __s, wchar_t __c, size_t __n) +{ + if (__bos0 (__s) != (size_t) -1) + return __wmemset_chk (__s, __c, __n, __bos0 (__s) / sizeof (wchar_t)); + return __wmemset_alias (__s, __c, __n); +} + + +extern wchar_t *__wcscpy_chk (wchar_t *__restrict __dest, + __const wchar_t *__restrict __src, + size_t __n) __THROW; +extern wchar_t *__REDIRECT_NTH (__wcscpy_alias, + (wchar_t *__restrict __dest, + __const wchar_t *__restrict __src), wcscpy); + +extern __always_inline wchar_t * +wcscpy (wchar_t *__dest, __const wchar_t *__src) +{ + if (__bos (__dest) != (size_t) -1) + return __wcscpy_chk (__dest, __src, __bos (__dest) / sizeof (wchar_t)); + return __wcscpy_alias (__dest, __src); +} + + +extern wchar_t *__wcpcpy_chk (wchar_t *__dest, __const wchar_t *__src, + size_t __destlen) __THROW; +extern wchar_t *__REDIRECT_NTH (__wcpcpy_alias, (wchar_t *__dest, + __const wchar_t *__src), + wcpcpy); + +extern __always_inline wchar_t * +wcpcpy (wchar_t *__dest, __const wchar_t *__src) +{ + if (__bos (__dest) != (size_t) -1) + return __wcpcpy_chk (__dest, __src, __bos (__dest) / sizeof (wchar_t)); + return __wcpcpy_alias (__dest, __src); +} + + +extern wchar_t *__wcsncpy_chk (wchar_t *__restrict __dest, + __const wchar_t *__restrict __src, size_t __n, + size_t __destlen) __THROW; +extern wchar_t *__REDIRECT_NTH (__wcsncpy_alias, + (wchar_t *__restrict __dest, + __const wchar_t *__restrict __src, + size_t __n), wcsncpy); + +extern __always_inline wchar_t * +wcsncpy (wchar_t *__dest, __const wchar_t *__src, size_t __n) +{ + if (__bos (__dest) != (size_t) -1 + && (!__builtin_constant_p (__n) || __bos (__dest) >= __n)) + return __wcsncpy_chk (__dest, __src, __n, + __bos (__dest) / sizeof (wchar_t)); + return __wcsncpy_alias (__dest, __src, __n); +} + + +extern wchar_t *__wcpncpy_chk (wchar_t *__restrict __dest, + __const wchar_t *__restrict __src, size_t __n, + size_t __destlen) __THROW; +extern wchar_t *__REDIRECT_NTH (__wcpncpy_alias, + (wchar_t *__restrict __dest, + __const wchar_t *__restrict __src, + size_t __n), wcpncpy); + +extern __always_inline wchar_t * +wcpncpy (wchar_t *__dest, __const wchar_t *__src, size_t __n) +{ + if (__bos (__dest) != (size_t) -1 + && (!__builtin_constant_p (__n) || __bos (__dest) >= __n)) + return __wcpncpy_chk (__dest, __src, __n, + __bos (__dest) / sizeof (wchar_t)); + return __wcpncpy_alias (__dest, __src, __n); +} + + +extern wchar_t *__wcscat_chk (wchar_t *__restrict __dest, + __const wchar_t *__restrict __src, + size_t __destlen) __THROW; +extern wchar_t *__REDIRECT_NTH (__wcscat_alias, + (wchar_t *__restrict __dest, + __const wchar_t *__restrict __src), wcscat); + +extern __always_inline wchar_t * +wcscat (wchar_t *__dest, __const wchar_t *__src) +{ + if (__bos (__dest) != (size_t) -1) + return __wcscat_chk (__dest, __src, __bos (__dest) / sizeof (wchar_t)); + return __wcscat_alias (__dest, __src); +} + + +extern wchar_t *__wcsncat_chk (wchar_t *__restrict __dest, + __const wchar_t *__restrict __src, + size_t __n, size_t __destlen) __THROW; +extern wchar_t *__REDIRECT_NTH (__wcsncat_alias, + (wchar_t *__restrict __dest, + __const wchar_t *__restrict __src, + size_t __n), wcsncat); + +extern __always_inline wchar_t * +wcsncat (wchar_t *__dest, __const wchar_t *__src, size_t __n) +{ + if (__bos (__dest) != (size_t) -1) + return __wcsncat_chk (__dest, __src, __n, + __bos (__dest) / sizeof (wchar_t)); + return __wcsncat_alias (__dest, __src, __n); +} + + +extern int __swprintf_chk (wchar_t *__restrict __s, size_t __n, + int __flag, size_t __s_len, + __const wchar_t *__restrict __format, ...) + __THROW /* __attribute__ ((__format__ (__wprintf__, 5, 6))) */; + +/* XXX We might want to have support in gcc for swprintf. */ +#define swprintf(s, n, format, ...) \ + (__bos (s) != (size_t) -1 || __USE_FORTIFY_LEVEL > 1 \ + ? __swprintf_chk (s, n, __USE_FORTIFY_LEVEL - 1, __bos (s), format, \ + __VA_ARGS__) \ + : swprintf (s, n, format, __VA_ARGS__)) + + +extern int __vswprintf_chk (wchar_t *__restrict __s, size_t __n, + int __flag, size_t __s_len, + __const wchar_t *__restrict __format, + __gnuc_va_list __arg) + __THROW /* __attribute__ ((__format__ (__wprintf__, 5, 0))) */; +extern int __REDIRECT_NTH (__vswprintf_alias, + (wchar_t *__restrict __s, size_t __n, + __const wchar_t *__restrict __format, + __gnuc_va_list __arg), vswprintf) + /* __attribute__ ((__format__ (__wprintf__, 3, 0))) */; + + +extern __always_inline int +vswprintf (wchar_t *__s, size_t __n, __const wchar_t *__format, + __gnuc_va_list __arg) +{ + if (__bos (__s) != (size_t) -1 || __USE_FORTIFY_LEVEL > 1) + return __vswprintf_chk (__s, __n, __USE_FORTIFY_LEVEL - 1, __bos (__s), + __format, __arg); + return vswprintf (__s, __n, __format, __arg); +} + + +#if __USE_FORTIFY_LEVEL > 1 + +extern int __fwprintf_chk (FILE *__restrict __stream, int __flag, + __const wchar_t *__restrict __format, ...); +extern int __wprintf_chk (int __flag, __const wchar_t *__restrict __format, + ...); +extern int __vfwprintf_chk (FILE *__restrict __stream, int __flag, + __const wchar_t *__restrict __format, + _G_va_list __ap); +extern int __vwprintf_chk (int __flag, __const wchar_t *__restrict __format, + _G_va_list __ap); + +# define wprintf(...) \ + __wprintf_chk (__USE_FORTIFY_LEVEL - 1, __VA_ARGS__) +# define fwprintf(stream, ...) \ + __fwprintf_chk (stream, __USE_FORTIFY_LEVEL - 1, __VA_ARGS__) +# define vwprintf(format, ap) \ + __vwprintf_chk (__USE_FORTIFY_LEVEL - 1, format, ap) +# define vfwprintf(stream, format, ap) \ + __vfwprintf_chk (stream, __USE_FORTIFY_LEVEL - 1, format, ap) + +#endif + +extern wchar_t *__fgetws_chk (wchar_t *__restrict __s, size_t __size, int __n, + FILE *__restrict __stream) __wur; +extern wchar_t *__REDIRECT (__fgetws_alias, + (wchar_t *__restrict __s, int __n, + FILE *__restrict __stream), fgetws) __wur; + +extern __always_inline __wur wchar_t * +fgetws (wchar_t *__restrict __s, int __n, FILE *__restrict __stream) +{ + if (__bos (__s) != (size_t) -1 + && (!__builtin_constant_p (__n) || (size_t) __n > __bos (__s))) + return __fgetws_chk (__s, __bos (__s), __n, __stream); + return __fgetws_alias (__s, __n, __stream); +} + +#ifdef __USE_GNU +extern wchar_t *__fgetws_unlocked_chk (wchar_t *__restrict __s, size_t __size, + int __n, FILE *__restrict __stream) + __wur; +extern wchar_t *__REDIRECT (__fgetws_unlocked_alias, + (wchar_t *__restrict __s, int __n, + FILE *__restrict __stream), fgetws_unlocked) + __wur; + +extern __always_inline __wur wchar_t * +fgetws_unlocked (wchar_t *__restrict __s, int __n, FILE *__restrict __stream) +{ + if (__bos (__s) != (size_t) -1 + && (!__builtin_constant_p (__n) || (size_t) __n > __bos (__s))) + return __fgetws_unlocked_chk (__s, __bos (__s), __n, __stream); + return __fgetws_unlocked_alias (__s, __n, __stream); +} +#endif + + +extern size_t __wcrtomb_chk (char *__s, wchar_t __wchar, mbstate_t *__p, + size_t __buflen) __THROW __wur; +extern size_t __REDIRECT_NTH (__wcrtomb_alias, + (char *__restrict __s, wchar_t __wchar, + mbstate_t *__restrict __ps), wcrtomb) __wur; + +extern __always_inline __wur size_t +wcrtomb (char *__s, wchar_t __wchar, mbstate_t *__ps) +{ + /* We would have to include <limits.h> to get a definition of MB_LEN_MAX. + But this would only disturb the namespace. So we define our own + version here. */ +#define __WCHAR_MB_LEN_MAX 16 +#if defined MB_LEN_MAX && MB_LEN_MAX != __WCHAR_MB_LEN_MAX +# error "Assumed value of MB_LEN_MAX wrong" +#endif + if (__bos (__s) != (size_t) -1 && __WCHAR_MB_LEN_MAX > __bos (__s)) + return __wcrtomb_chk (__s, __wchar, __ps, __bos (__s)); + return __wcrtomb_alias (__s, __wchar, __ps); +} + + +extern size_t __mbsrtowcs_chk (wchar_t *__restrict __dst, + __const char **__restrict __src, + size_t __len, mbstate_t *__restrict __ps, + size_t __dstlen) __THROW; +extern size_t __REDIRECT_NTH (__mbsrtowcs_alias, + (wchar_t *__restrict __dst, + __const char **__restrict __src, + size_t __len, mbstate_t *__restrict __ps), + mbsrtowcs); + +extern __always_inline size_t +mbsrtowcs (wchar_t *__restrict __dst, __const char **__restrict __src, + size_t __len, mbstate_t *__restrict __ps) +{ + if (__bos (__dst) != (size_t) -1 + && (!__builtin_constant_p (__len) + || __len * sizeof (wchar_t) > __bos (__dst))) + return __mbsrtowcs_chk (__dst, __src, __len, __ps, __bos (__dst)); + return __mbsrtowcs_alias (__dst, __src, __len, __ps); +} + + +extern size_t __wcsrtombs_chk (char *__restrict __dst, + __const wchar_t **__restrict __src, + size_t __len, mbstate_t *__restrict __ps, + size_t __dstlen) __THROW; +extern size_t __REDIRECT_NTH (__wcsrtombs_alias, + (char *__restrict __dst, + __const wchar_t **__restrict __src, + size_t __len, mbstate_t *__restrict __ps), + wcsrtombs); + +extern __always_inline size_t +wcsrtombs (char *__restrict __dst, __const wchar_t **__restrict __src, + size_t __len, mbstate_t *__restrict __ps) +{ + if (__bos (__dst) != (size_t) -1 + && (!__builtin_constant_p (__len) || __len > __bos (__dst))) + return __wcsrtombs_chk (__dst, __src, __len, __ps, __bos (__dst)); + return __wcsrtombs_alias (__dst, __src, __len, __ps); +} + + +#ifdef __USE_GNU +extern size_t __mbsnrtowcs_chk (wchar_t *__restrict __dst, + __const char **__restrict __src, size_t __nmc, + size_t __len, mbstate_t *__restrict __ps, + size_t __dstlen) __THROW; +extern size_t __REDIRECT_NTH (__mbsnrtowcs_alias, + (wchar_t *__restrict __dst, + __const char **__restrict __src, size_t __nmc, + size_t __len, mbstate_t *__restrict __ps), + mbsnrtowcs); + +extern __always_inline size_t +mbsnrtowcs (wchar_t *__restrict __dst, __const char **__restrict __src, + size_t __nmc, size_t __len, mbstate_t *__restrict __ps) +{ + if (__bos (__dst) != (size_t) -1 + && (!__builtin_constant_p (__len) + || __len * sizeof (wchar_t) > __bos (__dst))) + return __mbsnrtowcs_chk (__dst, __src, __nmc, __len, __ps, __bos (__dst)); + return __mbsnrtowcs_alias (__dst, __src, __nmc, __len, __ps); +} + + +extern size_t __wcsnrtombs_chk (char *__restrict __dst, + __const wchar_t **__restrict __src, + size_t __nwc, size_t __len, + mbstate_t *__restrict __ps, size_t __dstlen) + __THROW; +extern size_t __REDIRECT_NTH (__wcsnrtombs_alias, + (char *__restrict __dst, + __const wchar_t **__restrict __src, + size_t __nwc, size_t __len, + mbstate_t *__restrict __ps), wcsnrtombs); + +extern __always_inline size_t +wcsnrtombs (char *__restrict __dst, __const wchar_t **__restrict __src, + size_t __nwc, size_t __len, mbstate_t *__restrict __ps) +{ + if (__bos (__dst) != (size_t) -1 + && (!__builtin_constant_p (__len) || __len > __bos (__dst))) + return __wcsnrtombs_chk (__dst, __src, __nwc, __len, __ps, __bos (__dst)); + return __wcsnrtombs_alias (__dst, __src, __nwc, __len, __ps); +} +#endif diff --git a/wcsmbs/wchar.h b/wcsmbs/wchar.h index fe4ee80bff..0c02dcc574 100644 --- a/wcsmbs/wchar.h +++ b/wcsmbs/wchar.h @@ -833,6 +833,13 @@ extern size_t wcsftime_l (wchar_t *__restrict __s, size_t __maxsize, # include <wctype.h> #endif + +/* Define some macros helping to catch buffer overflows. */ +#if __USE_FORTIFY_LEVEL > 0 && !defined __cplusplus +# include <bits/wchar2.h> +#endif + + __END_DECLS #endif /* _WCHAR_H defined */ diff --git a/wcsmbs/wcsncpy.c b/wcsmbs/wcsncpy.c index 8469d94d79..06a20d2333 100644 --- a/wcsmbs/wcsncpy.c +++ b/wcsmbs/wcsncpy.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. +/* Copyright (C) 1995, 1996, 1997, 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. @@ -22,7 +22,7 @@ /* Copy no more than N wide-characters of SRC to DEST. */ wchar_t * -wcsncpy (dest, src, n) +__wcsncpy (dest, src, n) wchar_t *dest; const wchar_t *src; size_t n; @@ -84,3 +84,4 @@ wcsncpy (dest, src, n) return s; } +weak_alias (__wcsncpy, wcsncpy) |