diff options
author | Andreas Schwab <schwab@redhat.com> | 2010-11-30 10:38:11 +0100 |
---|---|---|
committer | Andreas Schwab <schwab@redhat.com> | 2010-11-30 10:40:48 +0100 |
commit | 331523bb4b8953eb6f854689426d5e400ac566a9 (patch) | |
tree | 9056974f297ee41fc2d285e1e1a9b569eeeaa64c | |
parent | 55a16942705d2ad448196c90fd0bbe90826f1b67 (diff) | |
parent | 7372b19962badff7e2b400385f8800b3d389f9eb (diff) | |
download | glibc-331523bb4b8953eb6f854689426d5e400ac566a9.tar.gz glibc-331523bb4b8953eb6f854689426d5e400ac566a9.tar.xz glibc-331523bb4b8953eb6f854689426d5e400ac566a9.zip |
Merge commit 'glibc-2.11.3' into fedora/2.11/master
77 files changed, 1083 insertions, 383 deletions
diff --git a/.gitattributes b/.gitattributes index 8947e726a2..ed3e49bf3e 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1,2 @@ timezone/* -whitespace +INSTALL -whitespace diff --git a/ChangeLog b/ChangeLog index 0e1306ef6d..a7c0b0fddd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,9 +1,258 @@ +2010-05-31 Petr Baudis <pasky@suse.cz> + + [BZ #11149] + * elf/ldconfig.c (main): Allow aux_cache_file open()ing to fail + silently even in the chroot mode. + +2010-05-31 Petr Baudis <pasky@suse.cz> + + [BZ #10085] + * nis/nss_compat/compat-initgroups.c (internal_getgrent_r): Fix + initialization of skip_initgroups_dyn. + +2010-09-27 Andreas Schwab <schwab@redhat.com> + + [BZ #11611] + * sysdeps/unix/sysv/linux/internal_statvfs.c (INTERNAL_STATVFS): + Mask out sign-bit copies when constructing f_fsid. + +2010-11-19 Ulrich Drepper <drepper@gmail.com> + + * sysdeps/unix/sysv/linux/i386/bits/mman.h: Define MAP_HUGETLB. + * sysdeps/unix/sysv/linux/x86_64/bits/mman.h: Likewise. + +2010-11-16 Ulrich Drepper <drepper@gmail.com> + + * sysdeps/unix/sysv/linux/sys/swap.h (SWAP_FLAG_DISCARD): Define. + +2010-11-11 Andreas Schwab <schwab@redhat.com> + + * posix/fnmatch_loop.c (NEW_PATTERN): Fix use of alloca. + * posix/Makefile (tests): Add $(objpfx)tst-fnmatch-mem. + (tst-fnmatch-ENV): Set MALLOC_TRACE. + ($(objpfx)tst-fnmatch-mem): New rule. + (generated): Add tst-fnmatch-mem and tst-fnmatch.mtrace. + * posix/tst-fnmatch.c (main): Call mtrace. + +2010-08-09 Ulrich Drepper <drepper@redhat.com> + + [BZ #11883] + * posix/fnmatch.c: Keep track of alloca use and fall back on malloc. + * posix/fnmatch_loop.c: Likewise. + +2010-11-10 Luis Machado <luisgpm@br.ibm.com> + + * sysdeps/ieee754/ldbl-128ibm/e_sqrtl.c (__ieee754_sqrtl): Force + signed comparison. + +2010-11-08 Ulrich Drepper <drepper@gmail.com> + + [BZ #12194] + * sysdeps/i386/bits/byteswap.h: Avoid warning in __bswap_16. + * sysdeps/x86_64/bits/byteswap.h: Likewise. + +2010-09-06 Andreas Schwab <schwab@redhat.com> + + * manual/Makefile: Don't mix pattern rules with normal rules. + +2010-08-12 Andreas Schwab <schwab@redhat.com> + + [BZ #11904] + * locale/programs/locale.c (print_assignment): New function. + (show_locale_vars): Use it. + +2010-10-26 Ulrich Drepper <drepper@gmail.com> + + * elf/rtld.c (dl_main): Move assertion after the point where rtld map + is added to the list. + +2010-10-20 Andreas Krebbel <Andreas.Krebbel@de.ibm.com> + Ulrich Drepper <drepper@gmail.com> + + * elf/dl-object.c (_dl_new_object): Don't append the new object to + the global list here. Move code to... + (_dl_add_to_namespace_list): ...here. New function. + * elf/rtld.c (dl_main): Invoke _dl_add_to_namespace_list. + * sysdeps/generic/ldsodefs.h (_dl_add_to_namespace_list): Declare. + * elf/dl-load.c (lose): Don't remove the element from the list. + (_dl_map_object_from_fd): Invoke _dl_add_to_namespace_list. + (_dl_map_object): Likewise. + +2010-10-24 Ulrich Drepper <drepper@redhat.com> + + [BZ #12140] + * malloc/malloc.c (_int_free): Fill correct number of bytes when + perturbing. + +2010-09-09 Andreas Schwab <schwab@redhat.com> + + * Makeconfig (sysd-rules-patterns): Add rtld-%:rtld-%. + (sysd-rules-targets): Remove duplicates. + * elf/rtld-Rules ($(objpfx)rtld-%.os): Add pattern rules with + rtld-%.$o dependency. + +2010-10-18 Andreas Schwab <schwab@redhat.com> + + * elf/dl-open.c (dl_open_worker): Don't expand DST here, let + _dl_map_object do it. + +2010-10-15 Andreas Schwab <schwab@redhat.com> + + * scripts/data/localplt-s390-linux-gnu.data: New file. + * scripts/data/localplt-s390x-linux-gnu.data: New file. + +2010-10-12 Ulrich Drepper <drepper@redhat.com> + + [BZ #12078] + * posix/regcomp.c (parse_branch): One more memory leak plugged. + * posix/bug-regex31.input: Add test case. + +2010-10-11 Ulrich Drepper <drepper@gmail.com> + + * posix/bug-regex31.c: Rewrite to run multiple tests from stdin. + * posix/bug-regex31.input: New file. + + [BZ #12078] + * posix/regcomp.c (parse_branch): Free memory when allocation failed. + (parse_sub_exp): Fix last change, use postorder. + + * posix/bug-regex31.c: New file. + * posix/Makefile: Add rules to build and run bug-regex31. + + * posix/regcomp.c (parse_bracket_exp): Add missing re_free calls. + + [BZ #12078] + * posix/regcomp.c (parse_sub_exp): Free tree data when it is not used. + + [BZ #12093] + * sysdeps/unix/sysv/linux/check_pf.c (__check_pf): ->ifa_addr might + be NULL. + +2010-09-15 Joseph Myers <joseph@codesourcery.com> + + * sysdeps/unix/sysv/linux/getdents.c (__GETDENTS): When + implementing getdents64 using getdents syscall, set d_type if + __ASSUME_GETDENTS32_D_TYPE. + +2010-09-14 Andreas Schwab <schwab@redhat.com> + + * sysdeps/s390/s390-32/__longjmp.c (__longjmp): Define register + variables after CHECK_SP call. + * sysdeps/s390/s390-64/__longjmp.c (__longjmp): Likewise. + +2010-09-08 Chung-Lin Tang <cltang@codesourcery.com> + Ulrich Drepper <drepper@redhat.com> + + [BZ #11968] + * sysdeps/unix/sysv/linux/x86_64/____longjmp_chk.S + (____longjmp_chk): Use %ebx for saving value across system call. + Add unwind info. + +2010-08-31 Mike Frysinger <vapier@gentoo.org> + + * sysdeps/unix/sysv/linux/sparc/sys/epoll.h (epoll_create2): Delete. + (epoll_create1): Declare. + + * sysdeps/unix/sysv/linux/x86_64/sys/epoll.h: Fix typo. + +2010-08-31 Andreas Schwab <schwab@redhat.com> + + [BZ #7066] + * stdlib/strtod_l.c (____STRTOF_INTERNAL): Fix array overflow when + shifting retval into place. + +2010-09-14 Ulrich Drepper <drepper@redhat.com> + + * resolv/res_init.c (__res_vinit): Count the default server we added. + +2010-08-25 Ulrich Drepper <drepper@redhat.com> + + [BZ #10851] + * resolv/res_init.c (__res_vinit): When no server address at all + is given default to loopback. + +2010-08-12 H.J. Lu <hongjiu.lu@intel.com> + + * sysdeps/i386/elf/Makefile: New file. + +2010-07-31 Samuel Thibault <samuel.thibault@ens-lyon.org> + + * hurd/hurdselect.c (_hurd_select): Round timeout up instead of down + when converting to ms. + +2010-07-29 Roland McGrath <roland@redhat.com> + + [BZ 11856] + * manual/locale.texi (Yes-or-No Questions): Fix example code. + +2010-07-27 Andreas Schwab <schwab@redhat.com> + + * manual/memory.texi (Malloc Tunable Parameters): Document + M_PERTURB. + +2010-07-26 Roland McGrath <roland@redhat.com> + + [BZ #11840] + * configure.in (-fgnu89-inline check): Set and substitute + gnu89_inline, not libc_cv_gnu89_inline. + * configure: Regenerated. + * config.make.in (gnu89-inline-CFLAGS): Use @gnu89_inline@. + +2010-07-20 Roland McGrath <roland@redhat.com> + + * elf/dl-sysdep.c (_dl_important_hwcaps): Add dsocaps mask to + dl_hwcap_mask as well as dl_hwcap. Without this, dsocaps matching in + ld.so.cache was broken. With it, there is no way to disable dsocaps + like LD_HWCAP_MASK can disable hwcaps. + +2010-07-05 Roland McGrath <roland@redhat.com> + + * manual/arith.texi (Rounding Functions): Fix rint description + implicit in round description. + +2010-07-02 Ulrich Drepper <drepper@redhat.com> + + * elf/Makefile: Fix linking for a few tests to make recent linker + happy. + +2010-06-02 Emilio Pozuelo Monfort <pochu27@gmail.com> + + * hurd/lookup-at.c (__file_name_lookup_at): Accept + AT_SYMLINK_FOLLOW in AT_FLAGS. Fail with EINVAL if both + AT_SYMLINK_FOLLOW and AT_SYMLINK_NOFOLLOW are present + in AT_FLAGS. + * hurd/hurd/fd.h (__file_name_lookup_at): Update comment. + * sysdeps/mach/hurd/linkat.c (linkat): Pass O_NOLINK in FLAGS. + +2010-11-03 H.J. Lu <hongjiu.lu@intel.com> + + [BZ #12191] + * sysdeps/x86_64/cacheinfo.c (init_cacheinfo): Round + __x86_64_data_cache_size_half, __x86_64_data_cache_size + __x86_64_shared_cache_size_half and __x86_64_shared_cache_size, + to multiple of 256 bytes. + +2010-11-03 Ulrich Drepper <drepper@gmail.com> + + [BZ #12167] + * sysdeps/unix/sysv/linux/ttyname.c (ttyname): Recognize new mangling + of inacessible symlinks. Verify result of symlink before returning it. + * sysdeps/unix/sysv/linux/ttyname_r.c (__ttyname_r): Likewise. + Patch mostly by Miklos Szeredi <miklos@szeredi.hu>. + +2010-10-25 Ulrich Drepper <drepper@redhat.com> + + [BZ #12159] + * sysdeps/x86_64/multiarch/strchr.S: Fix propagation of search byte + into all bytes of SSE register. + Patch by Richard Li <richardpku@gmail.com>. + 2010-10-22 Andreas Schwab <schwab@redhat.com> * include/dlfcn.h (__RTLD_SECURE): Define. * elf/dl-load.c (_dl_map_object): Remove preloaded parameter. Use mode & __RTLD_SECURE instead. - (open_path): Remove preloaded parameter to secure. + (open_path): Rename preloaded parameter to secure. * sysdeps/generic/ldsodefs.h (_dl_map_object): Adjust declaration. * elf/dl-open.c (dl_open_worker): Adjust call to _dl_map_object. * elf/dl-deps.c (openaux): Likewise. @@ -13,6 +262,44 @@ (do_preload): Use __RTLD_SECURE instead of is_preloaded. (dlmopen_doit): Add __RTLD_SECURE to mode bits. +2010-10-06 Ulrich Drepper <drepper@gmail.com> + + * string/bug-strstr1.c: New file. + * string/Makefile: Add rules to build and run bug-strstr1. + +2010-10-05 Eric Blake <eblake@redhat.com> + + [BZ #12092] + * string/str-two-way.h (two_way_long_needle): Always clear memory + when skipping input due to the shift table. + +2010-10-03 Ulrich Drepper <drepper@gmail.com> + + [BZ #12005] + * malloc/mcheck.c: Handle large requests. + + [BZ #12077] + * sysdeps/x86_64/strcmp.S: Fix handling of remaining bytes in buffer + for strncmp and strncasecmp. + * string/stratcliff.c: Add tests for strcmp and strncmp. + * wcsmbs/wcsatcliff.c: Adjust for stratcliff change. + +2010-06-02 Kirill A. Shutemov <kirill@shutemov.name> + + * elf/dl-reloc.c: Flush cache after solving TEXTRELs if arch + requires it. + +2010-06-02 Andreas Schwab <schwab@redhat.com> + + * nis/nss_nis/nis-initgroups.c (get_uid): Properly resize buffer. + +2010-06-07 Jakub Jelinek <jakub@redhat.com> + + * libio/stdio.h (sscanf, vsscanf): Use __REDIRECT_NTH instead of + __REDIRECT followed by __THROW. + * wcsmbs/wchar.h (swscanf, vswscanf): Likewise. + * posix/getopt.h (getopt): Likewise. + 2010-10-18 Andreas Schwab <schwab@redhat.com> * elf/dl-load.c (is_dst): Remove last parameter. diff --git a/INSTALL b/INSTALL index 8d61b3e489..af5ddacc9b 100644 --- a/INSTALL +++ b/INSTALL @@ -317,11 +317,12 @@ build the GNU C library: Check the FAQ for any special compiler issues on particular platforms. - * GNU `binutils' 2.15 or later + * GNU `binutils' You must use GNU `binutils' (as and ld) to build the GNU C library. No other assembler or linker has the necessary functionality at the - moment. + moment. The configure scripts checks for the appropriate version + for the platform. Too-old versions will prevent building glibc. * GNU `texinfo' 3.12f diff --git a/Makeconfig b/Makeconfig index 2ebe184224..88e5639bf7 100644 --- a/Makeconfig +++ b/Makeconfig @@ -686,7 +686,7 @@ CPPFLAGS = $($(subdir)-CPPFLAGS) $(+includes) $(defines) \ -include $(..)include/libc-symbols.h $(sysdep-CPPFLAGS) \ $(CPPFLAGS-$(suffix $@)) \ $(foreach lib,$(libof-$(basename $(@F))) \ - $(libof-$(<F)) $(libof-$(@F)),$(CPPFLAGS-$(lib))) \ + $(libof-$(<F)) $(libof-$(@F)),$(CPPFLAGS-$(lib))) \ $(CPPFLAGS-$(<F)) $(CPPFLAGS-$(@F)) $(CPPFLAGS-$(basename $(@F))) override CFLAGS = -std=gnu99 $(gnu89-inline-CFLAGS) \ $(filter-out %frame-pointer,$(+cflags)) $(+gccwarn-c) \ @@ -957,7 +957,7 @@ endif # emitted into sysd-rules. A sysdeps Makeconfig fragment can # add its own special object file prefix to this list with e.g. foo-%:% # to have foo-*.? compiled from *.? using $(foo-CPPFLAGS). -sysd-rules-patterns := %:% rtld-%:% m_%:s_% +sysd-rules-patterns := %:% rtld-%:rtld-% rtld-%:% m_%:s_% # Let sysdeps/ subdirs contain a Makeconfig fragment for us to include here. sysdep-makeconfigs := $(wildcard $(+sysdep_dirs:=/Makeconfig)) @@ -966,8 +966,8 @@ include $(sysdep-makeconfigs) endif # Compute just the target patterns. Makeconfig has set sysd-rules-patterns. -sysd-rules-targets := $(foreach p,$(sysd-rules-patterns),\ - $(firstword $(subst :, ,$p))) +sysd-rules-targets := $(sort $(foreach p,$(sysd-rules-patterns),\ + $(firstword $(subst :, ,$p)))) endif # Makeconfig not yet included diff --git a/config.make.in b/config.make.in index d65706ceac..afce048154 100644 --- a/config.make.in +++ b/config.make.in @@ -58,7 +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@ -gnu89-inline-CFLAGS = @libc_cv_gnu89_inline@ +gnu89-inline-CFLAGS = @gnu89_inline@ have-ssp = @libc_cv_ssp@ have-selinux = @have_selinux@ have-libaudit = @have_libaudit@ diff --git a/configure b/configure index ce76653821..1a3f672ec7 100755 --- a/configure +++ b/configure @@ -681,7 +681,7 @@ libc_cv_cc_submachine exceptions no_whole_archive libc_cv_have_initfini -libc_cv_gnu89_inline +gnu89_inline libc_cv_ssp fno_unit_at_a_time libc_cv_hashstyle @@ -6890,9 +6890,9 @@ fi { $as_echo "$as_me:$LINENO: result: $libc_cv_gnu89_inline" >&5 $as_echo "$libc_cv_gnu89_inline" >&6; } if test $libc_cv_gnu89_inline = yes; then - libc_cv_gnu89_inline=-fgnu89-inline + gnu89_inline=-fgnu89-inline else - libc_cv_gnu89_inline= + gnu89_inline= fi diff --git a/configure.in b/configure.in index 182c683e50..7992115417 100644 --- a/configure.in +++ b/configure.in @@ -1776,11 +1776,11 @@ else fi rm -f conftest*]) if test $libc_cv_gnu89_inline = yes; then - libc_cv_gnu89_inline=-fgnu89-inline + gnu89_inline=-fgnu89-inline else - libc_cv_gnu89_inline= + gnu89_inline= fi -AC_SUBST(libc_cv_gnu89_inline) +AC_SUBST(gnu89_inline) if test $elf != yes; then AC_CACHE_CHECK(for .init and .fini sections, libc_cv_have_initfini, diff --git a/elf/Makefile b/elf/Makefile index d57c7fe7ed..34609a0f85 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -759,11 +759,11 @@ $(objpfx)tst-tls8.out: $(objpfx)tst-tlsmod3.so $(objpfx)tst-tlsmod4.so $(objpfx)tst-tls9: $(libdl) $(objpfx)tst-tls9.out: $(objpfx)tst-tlsmod5.so $(objpfx)tst-tlsmod6.so -$(objpfx)tst-tls10: $(objpfx)tst-tlsmod8.so +$(objpfx)tst-tls10: $(objpfx)tst-tlsmod8.so $(objpfx)tst-tlsmod7.so -$(objpfx)tst-tls11: $(objpfx)tst-tlsmod10.so +$(objpfx)tst-tls11: $(objpfx)tst-tlsmod10.so $(objpfx)tst-tlsmod9.so -$(objpfx)tst-tls12: $(objpfx)tst-tlsmod12.so +$(objpfx)tst-tls12: $(objpfx)tst-tlsmod12.so $(objpfx)tst-tlsmod11.so $(objpfx)tst-tls13: $(libdl) $(objpfx)tst-tls13.out: $(objpfx)tst-tlsmod13a.so diff --git a/elf/dl-load.c b/elf/dl-load.c index fa82118409..c573974764 100644 --- a/elf/dl-load.c +++ b/elf/dl-load.c @@ -797,19 +797,7 @@ lose (int code, int fd, const char *name, char *realname, struct link_map *l, /* The file might already be closed. */ if (fd != -1) (void) __close (fd); - if (l != NULL) - { - /* Remove the stillborn object from the list and free it. */ - assert (l->l_next == NULL); - if (l->l_prev == NULL) - /* No other module loaded. This happens only in the static library, - or in rtld under --verify. */ - GL(dl_ns)[l->l_ns]._ns_loaded = NULL; - else - l->l_prev->l_next = NULL; - --GL(dl_ns)[l->l_ns]._ns_nloaded; - free (l); - } + free (l); free (realname); if (r != NULL) @@ -894,6 +882,9 @@ _dl_map_object_from_fd (const char *name, int fd, struct filebuf *fbp, never be unloaded. */ __close (fd); + /* Add the map for the mirrored object to the object list. */ + _dl_add_to_namespace_list (l, nsid); + return l; } #endif @@ -1488,6 +1479,9 @@ cannot enable executable stack as shared object requires"); add_name_to_object (l, ((const char *) D_PTR (l, l_info[DT_STRTAB]) + l->l_info[DT_SONAME]->d_un.d_val)); + /* Now that the object is fully initialized add it to the object list. */ + _dl_add_to_namespace_list (l, nsid); + #ifdef SHARED /* Auditing checkpoint: we have a new object. */ if (__builtin_expect (GLRO(dl_naudit) > 0, 0) @@ -2202,7 +2196,7 @@ _dl_map_object (struct link_map *loader, const char *name, have. */ static const Elf_Symndx dummy_bucket = STN_UNDEF; - /* Enter the new object in the list of loaded objects. */ + /* Allocate a new object map. */ if ((name_copy = local_strdup (name)) == NULL || (l = _dl_new_object (name_copy, name, type, loader, mode, nsid)) == NULL) @@ -2220,6 +2214,9 @@ _dl_map_object (struct link_map *loader, const char *name, l->l_nbuckets = 1; l->l_relocated = 1; + /* Enter the object in the object list. */ + _dl_add_to_namespace_list (l, nsid); + return l; } else if (found_other_class) diff --git a/elf/dl-object.c b/elf/dl-object.c index 788e2c07b9..542a28c2b4 100644 --- a/elf/dl-object.c +++ b/elf/dl-object.c @@ -1,5 +1,5 @@ /* Storage management for the chain of loaded shared objects. - Copyright (C) 1995-2002,2004,2006-2008,2009 Free Software Foundation, Inc. + Copyright (C) 1995-2002,2004,2006-2009,2010 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,16 +26,36 @@ #include <assert.h> +/* Add the new link_map NEW to the end of the namespace list. */ +void +internal_function +_dl_add_to_namespace_list (struct link_map *new, Lmid_t nsid) +{ + if (GL(dl_ns)[nsid]._ns_loaded != NULL) + { + struct link_map *l = GL(dl_ns)[nsid]._ns_loaded; + while (l->l_next != NULL) + l = l->l_next; + new->l_prev = l; + /* new->l_next = NULL; Would be necessary but we use calloc. */ + l->l_next = new; + } + else + GL(dl_ns)[nsid]._ns_loaded = new; + ++GL(dl_ns)[nsid]._ns_nloaded; + new->l_serial = GL(dl_load_adds); + ++GL(dl_load_adds); +} + + /* Allocate a `struct link_map' for a new object being loaded, and enter it into the _dl_loaded list. */ - struct link_map * internal_function _dl_new_object (char *realname, const char *libname, int type, struct link_map *loader, int mode, Lmid_t nsid) { struct link_map *l; - int idx; size_t libname_len = strlen (libname) + 1; struct link_map *new; struct libname_list *newname; @@ -94,25 +114,11 @@ _dl_new_object (char *realname, const char *libname, int type, new->l_scope_max = sizeof (new->l_scope_mem) / sizeof (new->l_scope_mem[0]); /* Counter for the scopes we have to handle. */ - idx = 0; + int idx = 0; if (GL(dl_ns)[nsid]._ns_loaded != NULL) - { - l = GL(dl_ns)[nsid]._ns_loaded; - while (l->l_next != NULL) - l = l->l_next; - new->l_prev = l; - /* new->l_next = NULL; Would be necessary but we use calloc. */ - l->l_next = new; - - /* Add the global scope. */ - new->l_scope[idx++] = &GL(dl_ns)[nsid]._ns_loaded->l_searchlist; - } - else - GL(dl_ns)[nsid]._ns_loaded = new; - ++GL(dl_ns)[nsid]._ns_nloaded; - new->l_serial = GL(dl_load_adds); - ++GL(dl_load_adds); + /* Add the global scope. */ + new->l_scope[idx++] = &GL(dl_ns)[nsid]._ns_loaded->l_searchlist; /* If we have no loader the new object acts as it. */ if (loader == NULL) diff --git a/elf/dl-open.c b/elf/dl-open.c index 2d3932fb0d..0b328cfb00 100644 --- a/elf/dl-open.c +++ b/elf/dl-open.c @@ -220,35 +220,6 @@ dl_open_worker (void *a) assert (_dl_debug_initialize (0, args->nsid)->r_state == RT_CONSISTENT); - /* Maybe we have to expand a DST. */ - if (__builtin_expect (dst != NULL, 0)) - { - size_t len = strlen (file); - - /* Determine how much space we need. We have to allocate the - memory locally. */ - size_t required = DL_DST_REQUIRED (call_map, file, len, - _dl_dst_count (dst, 0)); - - /* Get space for the new file name. */ - char *new_file = (char *) alloca (required + 1); - - /* Generate the new file name. */ - _dl_dst_substitute (call_map, file, new_file, 0); - - /* If the substitution failed don't try to load. */ - if (*new_file == '\0') - _dl_signal_error (0, "dlopen", NULL, - N_("empty dynamic string token substitution")); - - /* Now we have a new file name. */ - file = new_file; - - /* It does not matter whether call_map is set even if we - computed it only because of the DST. Since the path contains - a slash the value is not used. See dl-load.c. */ - } - /* Load the named object. */ struct link_map *new; args->map = new = _dl_map_object (call_map, file, lt_loaded, 0, diff --git a/elf/dl-reloc.c b/elf/dl-reloc.c index 6c0069147d..23cb59cbc8 100644 --- a/elf/dl-reloc.c +++ b/elf/dl-reloc.c @@ -1,5 +1,5 @@ /* Relocate a shared object and resolve its references to other loaded objects. - Copyright (C) 1995-2006, 2008, 2009 Free Software Foundation, Inc. + Copyright (C) 1995-2006, 2008, 2009, 2010 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 @@ -307,6 +307,10 @@ _dl_relocate_object (struct link_map *l, struct r_scope_elem *scope[], goto call_error; } +#ifdef CLEAR_CACHE + CLEAR_CACHE (textrels->start, textrels->start + textrels->len); +#endif + textrels = textrels->next; } diff --git a/elf/dl-sysdep.c b/elf/dl-sysdep.c index 5700272f10..0f4970a786 100644 --- a/elf/dl-sysdep.c +++ b/elf/dl-sysdep.c @@ -424,6 +424,11 @@ _dl_important_hwcaps (const char *platform, size_t platform_len, size_t *sz, { const ElfW(Word) mask = ((const ElfW(Word) *) dsocaps)[-1]; GLRO(dl_hwcap) |= (uint64_t) mask << _DL_FIRST_EXTRA; + /* Note that we add the dsocaps to the set already chosen by the + LD_HWCAP_MASK environment variable (or default HWCAP_IMPORTANT). + So there is no way to request ignoring an OS-supplied dsocap + string and bit like you can ignore an OS-supplied HWCAP bit. */ + GLRO(dl_hwcap_mask) |= (uint64_t) mask << _DL_FIRST_EXTRA; size_t len; for (const char *p = dsocaps; p < dsocaps + dsocapslen; p += len + 1) { diff --git a/elf/ldconfig.c b/elf/ldconfig.c index 5cae93897e..a91ed3b380 100644 --- a/elf/ldconfig.c +++ b/elf/ldconfig.c @@ -1372,14 +1372,9 @@ main (int argc, char **argv) const char *aux_cache_file = _PATH_LDCONFIG_AUX_CACHE; if (opt_chroot) - { - aux_cache_file = chroot_canon (opt_chroot, aux_cache_file); - if (aux_cache_file == NULL) - error (EXIT_FAILURE, errno, _("Can't open cache file %s\n"), - _PATH_LDCONFIG_AUX_CACHE); - } + aux_cache_file = chroot_canon (opt_chroot, aux_cache_file); - if (! opt_ignore_aux_cache) + if (! opt_ignore_aux_cache && aux_cache_file) load_aux_cache (aux_cache_file); else init_aux_cache (); @@ -1389,7 +1384,8 @@ main (int argc, char **argv) if (opt_build_cache) { save_cache (cache_file); - save_aux_cache (aux_cache_file); + if (aux_cache_file) + save_aux_cache (aux_cache_file); } return 0; diff --git a/elf/rtld-Rules b/elf/rtld-Rules index 9f31a560e5..10c9452ce0 100644 --- a/elf/rtld-Rules +++ b/elf/rtld-Rules @@ -1,6 +1,6 @@ # Subroutine makefile for compiling libc modules linked into dynamic linker. -# Copyright (C) 2002, 2003, 2005, 2006, 2008 Free Software Foundation, Inc. +# Copyright (C) 2002,2003,2005,2006,2008,2010 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 @@ -56,7 +56,7 @@ $(objpfx)rtld-libc.a: $(foreach dir,$(rtld-subdirs),\ # Use the verbose option of ar and tar when not running silently. ifeq "$(findstring s,$(MAKEFLAGS))" "" # if not -s verbose := v -else # -s +else # -s verbose := endif # not -s @@ -93,6 +93,12 @@ else # These are the basic compilation rules corresponding to the Makerules ones. # The sysd-rules generated makefile already defines pattern rules for rtld-% # targets built from sysdeps source files. +$(objpfx)rtld-%.os: rtld-%.S $(before-compile) + $(compile-command.S) $(rtld-CPPFLAGS) +$(objpfx)rtld-%.os: rtld-%.s $(before-compile) + $(compile-command.s) $(rtld-CPPFLAGS) +$(objpfx)rtld-%.os: rtld-%.c $(before-compile) + $(compile-command.c) $(rtld-CPPFLAGS) $(objpfx)rtld-%.os: %.S $(before-compile) $(compile-command.S) $(rtld-CPPFLAGS) $(objpfx)rtld-%.os: %.s $(before-compile) @@ -101,6 +107,9 @@ $(objpfx)rtld-%.os: %.c $(before-compile) $(compile-command.c) $(rtld-CPPFLAGS) # The rules for generated source files. +$(objpfx)rtld-%.os: $(objpfx)rtld-%.S $(before-compile); $(compile-command.S) +$(objpfx)rtld-%.os: $(objpfx)rtld-%.s $(before-compile); $(compile-command.s) +$(objpfx)rtld-%.os: $(objpfx)rtld-%.c $(before-compile); $(compile-command.c) $(objpfx)rtld-%.os: $(objpfx)%.S $(before-compile); $(compile-command.S) $(objpfx)rtld-%.os: $(objpfx)%.s $(before-compile); $(compile-command.s) $(objpfx)rtld-%.os: $(objpfx)%.c $(before-compile); $(compile-command.c) diff --git a/elf/rtld.c b/elf/rtld.c index 5b7eabcb85..26096936ce 100644 --- a/elf/rtld.c +++ b/elf/rtld.c @@ -1088,11 +1088,15 @@ of this helper program; chances are you did not intend to run this program.\n\ main_map = _dl_new_object ((char *) "", "", lt_executable, NULL, __RTLD_OPENEXEC, LM_ID_BASE); assert (main_map != NULL); - assert (main_map == GL(dl_ns)[LM_ID_BASE]._ns_loaded); main_map->l_phdr = phdr; main_map->l_phnum = phnum; main_map->l_entry = *user_entry; + /* Even though the link map is not yet fully initialized we can add + it to the map list since there are no possible users running yet. */ + _dl_add_to_namespace_list (main_map, LM_ID_BASE); + assert (main_map == GL(dl_ns)[LM_ID_BASE]._ns_loaded); + /* At this point we are in a bit of trouble. We would have to fill in the values for l_dev and l_ino. But in general we do not know where the file is. We also do not handle AT_EXECFD @@ -1235,7 +1239,7 @@ of this helper program; chances are you did not intend to run this program.\n\ /* We were invoked directly, so the program might not have a PT_INTERP. */ _dl_rtld_libname.name = GL(dl_rtld_map).l_name; - /* _dl_rtld_libname.next = NULL; Already zero. */ + /* _dl_rtld_libname.next = NULL; Already zero. */ GL(dl_rtld_map).l_libname = &_dl_rtld_libname; } else @@ -1360,6 +1364,9 @@ of this helper program; chances are you did not intend to run this program.\n\ l->l_libname->name = memcpy (copy, dsoname, len); } + /* Add the vDSO to the object list. */ + _dl_add_to_namespace_list (l, LM_ID_BASE); + /* Rearrange the list so this DSO appears after rtld_map. */ assert (l->l_next == NULL); assert (l->l_prev == main_map); diff --git a/hurd/hurd/fd.h b/hurd/hurd/fd.h index d1aa867cbf..2473476084 100644 --- a/hurd/hurd/fd.h +++ b/hurd/hurd/fd.h @@ -254,8 +254,9 @@ extern int _hurd_select (int nfds, struct pollfd *pollfds, const sigset_t *sigmask); /* Variant of file_name_lookup used in *at function implementations. - AT_FLAGS should contain only AT_SYMLINK_NOFOLLOW; other bits - cause EINVAL. */ + AT_FLAGS may only contain AT_SYMLINK_FOLLOW or AT_SYMLINK_NOFOLLOW, + which will remove and add O_NOLINK from FLAGS respectively. + Other bits cause EINVAL. */ extern file_t __file_name_lookup_at (int fd, int at_flags, const char *file_name, int flags, mode_t mode); diff --git a/hurd/hurdselect.c b/hurd/hurdselect.c index 544eee9cb5..a7228f0611 100644 --- a/hurd/hurdselect.c +++ b/hurd/hurdselect.c @@ -52,7 +52,7 @@ _hurd_select (int nfds, int firstfd, lastfd; mach_msg_timeout_t to = (timeout != NULL ? (timeout->tv_sec * 1000 + - timeout->tv_nsec / 1000000) : + (timeout->tv_nsec + 999999) / 1000000) : 0); struct { diff --git a/hurd/lookup-at.c b/hurd/lookup-at.c index 7f55527d8b..728a970909 100644 --- a/hurd/lookup-at.c +++ b/hurd/lookup-at.c @@ -30,8 +30,14 @@ __file_name_lookup_at (int fd, int at_flags, error_t err; file_t result; + if ((at_flags & AT_SYMLINK_FOLLOW) && (at_flags & AT_SYMLINK_NOFOLLOW)) + return (__hurd_fail (EINVAL), MACH_PORT_NULL); + flags |= (at_flags & AT_SYMLINK_NOFOLLOW) ? O_NOLINK : 0; at_flags &= ~AT_SYMLINK_NOFOLLOW; + if (at_flags & AT_SYMLINK_FOLLOW) + flags &= ~O_NOLINK; + at_flags &= ~AT_SYMLINK_FOLLOW; if (at_flags != 0) return (__hurd_fail (EINVAL), MACH_PORT_NULL); diff --git a/libio/stdio.h b/libio/stdio.h index 52e921d7d4..a4ced00120 100644 --- a/libio/stdio.h +++ b/libio/stdio.h @@ -429,9 +429,9 @@ extern int __REDIRECT (fscanf, (FILE *__restrict __stream, __isoc99_fscanf) __wur; extern int __REDIRECT (scanf, (__const char *__restrict __format, ...), __isoc99_scanf) __wur; -extern int __REDIRECT (sscanf, (__const char *__restrict __s, - __const char *__restrict __format, ...), - __isoc99_sscanf) __THROW; +extern int __REDIRECT_NTH (sscanf, (__const char *__restrict __s, + __const char *__restrict __format, ...), + __isoc99_sscanf); # else extern int __isoc99_fscanf (FILE *__restrict __stream, __const char *__restrict __format, ...) __wur; @@ -483,11 +483,11 @@ extern int __REDIRECT (vfscanf, extern int __REDIRECT (vscanf, (__const char *__restrict __format, _G_va_list __arg), __isoc99_vscanf) __attribute__ ((__format__ (__scanf__, 1, 0))) __wur; -extern int __REDIRECT (vsscanf, - (__const char *__restrict __s, - __const char *__restrict __format, _G_va_list __arg), - __isoc99_vsscanf) - __THROW __attribute__ ((__format__ (__scanf__, 2, 0))); +extern int __REDIRECT_NTH (vsscanf, + (__const char *__restrict __s, + __const char *__restrict __format, + _G_va_list __arg), __isoc99_vsscanf) + __attribute__ ((__format__ (__scanf__, 2, 0))); # else extern int __isoc99_vfscanf (FILE *__restrict __s, __const char *__restrict __format, diff --git a/locale/programs/locale.c b/locale/programs/locale.c index 77262b7d1c..b842506dc0 100644 --- a/locale/programs/locale.c +++ b/locale/programs/locale.c @@ -762,6 +762,29 @@ write_charmaps (void) twalk (all_data, print_names); } +/* Print a properly quoted assignment of NAME with VAL, using double + quotes iff DQUOTE is true. */ +static void +print_assignment (const char *name, const char *val, bool dquote) +{ + printf ("%s=", name); + if (dquote) + putchar ('"'); + while (*val != '\0') + { + size_t segment + = strcspn (val, dquote ? "$`\"\\" : "~|&;<>()$`\\\"' \t\n"); + printf ("%.*s", (int) segment, val); + val += segment; + if (*val == '\0') + break; + putchar ('\\'); + putchar (*val++); + } + if (dquote) + putchar ('"'); + putchar ('\n'); +} /* We have to show the contents of the environments determining the locale. */ @@ -769,7 +792,7 @@ static void show_locale_vars (void) { size_t cat_no; - const char *lcall = getenv ("LC_ALL"); + const char *lcall = getenv ("LC_ALL") ? : ""; const char *lang = getenv ("LANG") ? : ""; auto void get_source (const char *name); @@ -778,15 +801,15 @@ show_locale_vars (void) { char *val = getenv (name); - if ((lcall ?: "")[0] != '\0' || val == NULL) - printf ("%s=\"%s\"\n", name, - (lcall ?: "")[0] ? lcall : (lang ?: "")[0] ? lang : "POSIX"); + if (lcall[0] != '\0' || val == NULL) + print_assignment (name, lcall[0] ? lcall : lang[0] ? lang : "POSIX", + true); else - printf ("%s=%s\n", name, val); + print_assignment (name, val, false); } /* LANG has to be the first value. */ - printf ("LANG=%s\n", lang); + print_assignment ("LANG", lang, false); /* Now all categories in an unspecified order. */ for (cat_no = 0; cat_no < NCATEGORIES; ++cat_no) @@ -794,7 +817,7 @@ show_locale_vars (void) get_source (category[cat_no].name); /* The last is the LC_ALL value. */ - printf ("LC_ALL=%s\n", lcall ? : ""); + print_assignment ("LC_ALL", lcall, false); } diff --git a/malloc/malloc.c b/malloc/malloc.c index b1d43c6447..29c79923d1 100644 --- a/malloc/malloc.c +++ b/malloc/malloc.c @@ -4850,7 +4850,7 @@ _int_free(mstate av, mchunkptr p) } if (__builtin_expect (perturb_byte, 0)) - free_perturb (chunk2mem(p), size - SIZE_SZ); + free_perturb (chunk2mem(p), size - 2 * SIZE_SZ); set_fastchunks(av); fb = &fastbin (av, fastbin_index(size)); @@ -4938,7 +4938,7 @@ _int_free(mstate av, mchunkptr p) } if (__builtin_expect (perturb_byte, 0)) - free_perturb (chunk2mem(p), size - SIZE_SZ); + free_perturb (chunk2mem(p), size - 2 * SIZE_SZ); /* consolidate backward */ if (!prev_inuse(p)) { diff --git a/malloc/mcheck.c b/malloc/mcheck.c index 28210068ff..01394acd90 100644 --- a/malloc/mcheck.c +++ b/malloc/mcheck.c @@ -1,5 +1,6 @@ /* Standard debugging hooks for `malloc'. - Copyright (C) 1990-1997,1999,2000-2002,2007 Free Software Foundation, Inc. + Copyright (C) 1990-1997,1999,2000-2002,2007,2010 + Free Software Foundation, Inc. This file is part of the GNU C Library. Written May 1989 by Mike Haertel. @@ -26,6 +27,7 @@ # include <stdio.h> # include <stdlib.h> # include <libintl.h> +# include <errno.h> #endif #ifdef _LIBC @@ -225,6 +227,12 @@ mallochook (__malloc_size_t size, const __ptr_t caller) if (pedantic) mcheck_check_all (); + if (size > ~((size_t) 0) - (sizeof (struct hdr) + 1)) + { + __set_errno (ENOMEM); + return NULL; + } + __malloc_hook = old_malloc_hook; if (old_malloc_hook != NULL) hdr = (struct hdr *) (*old_malloc_hook) (sizeof (struct hdr) + size + 1, @@ -257,6 +265,12 @@ memalignhook (__malloc_size_t alignment, __malloc_size_t size, slop = (sizeof *hdr + alignment - 1) & -alignment; + if (size > ~((size_t) 0) - (slop + 1)) + { + __set_errno (ENOMEM); + return NULL; + } + __memalign_hook = old_memalign_hook; if (old_memalign_hook != NULL) block = (*old_memalign_hook) (alignment, slop + size + 1, caller); @@ -292,6 +306,12 @@ reallochook (__ptr_t ptr, __malloc_size_t size, const __ptr_t caller) if (pedantic) mcheck_check_all (); + if (size > ~((size_t) 0) - (sizeof (struct hdr) + 1)) + { + __set_errno (ENOMEM); + return NULL; + } + if (ptr) { hdr = ((struct hdr *) ptr) - 1; diff --git a/manual/Makefile b/manual/Makefile index c5866eb9de..b1f5fa73e5 100644 --- a/manual/Makefile +++ b/manual/Makefile @@ -232,7 +232,10 @@ ifdef objpfx .PHONY: stubs stubs: $(objpfx)stubs endif -$(objpfx)stubs ../po/manual.pot $(objpfx)stamp%: +$(objpfx)stubs ../po/manual.pot: + $(make-target-directory) + touch $@ +$(objpfx)stamp%: $(make-target-directory) touch $@ diff --git a/manual/arith.texi b/manual/arith.texi index b1580a06f5..1b8a8c3d68 100644 --- a/manual/arith.texi +++ b/manual/arith.texi @@ -1407,7 +1407,8 @@ do not raise the inexact exception if @var{x} is not an integer. @comment ISO @deftypefunx {long double} roundl (long double @var{x}) These functions are similar to @code{rint}, but they round halfway -cases away from zero instead of to the nearest even integer. +cases away from zero instead of to the nearest integer (or other +current rounding mode). @end deftypefun @comment math.h diff --git a/manual/install.texi b/manual/install.texi index 0cd4d622de..5ce4617ad6 100644 --- a/manual/install.texi +++ b/manual/install.texi @@ -348,11 +348,12 @@ floating-point support that may be triggered by the math library. Check the FAQ for any special compiler issues on particular platforms. @item -GNU @code{binutils} 2.15 or later +GNU @code{binutils} You must use GNU @code{binutils} (as and ld) to build the GNU C library. No other assembler or linker has the necessary functionality at the -moment. +moment. The configure scripts checks for the appropriate version +for the platform. Too-old versions will prevent building glibc. @item GNU @code{texinfo} 3.12f diff --git a/manual/locale.texi b/manual/locale.texi index e3e0563a36..d1a50cb0f4 100644 --- a/manual/locale.texi +++ b/manual/locale.texi @@ -1210,7 +1210,7 @@ This function would normally be used like this: /* @r{Prepare the @code{getline} call.} */ line = NULL; len = 0; - while (getline (&line, &len, stdout) >= 0) + while (getline (&line, &len, stdin) >= 0) @{ /* @r{Check the response.} */ int res = rpmatch (line); diff --git a/manual/memory.texi b/manual/memory.texi index 59ea1ee342..db63c3313b 100644 --- a/manual/memory.texi +++ b/manual/memory.texi @@ -702,6 +702,11 @@ be allocated via @code{mmap}. @item M_MMAP_MAX The maximum number of chunks to allocate with @code{mmap}. Setting this to zero disables all use of @code{mmap}. +@item M_PERTURB +If non-zero, memory blocks are filled with values depending on some +low order bits of this parameter when they are allocated (except when +allocated by @code{calloc}) and freed. This can be used to debug the +use of uninitialized or freed heap memory. @end table @end deftypefun diff --git a/nis/nss_compat/compat-initgroups.c b/nis/nss_compat/compat-initgroups.c index 07a3b9282c..de8d95c7d1 100644 --- a/nis/nss_compat/compat-initgroups.c +++ b/nis/nss_compat/compat-initgroups.c @@ -474,18 +474,21 @@ internal_getgrent_r (ent_t *ent, char *buffer, size_t buflen, const char *user, /* If the selected module does not support getgrent_r or initgroups_dyn, abort. We cannot find the needed group entries. */ - if (nss_getgrent_r == NULL && nss_initgroups_dyn == NULL) + if (nss_initgroups_dyn == NULL || nss_getgrgid_r == NULL) + { + if (nss_setgrent != NULL) + { + nss_setgrent (1); + ent->need_endgrent = true; + } + ent->skip_initgroups_dyn = true; + } + + if (ent->skip_initgroups_dyn && nss_getgrent_r == NULL) return NSS_STATUS_UNAVAIL; ent->files = false; - if (nss_initgroups_dyn == NULL && nss_setgrent != NULL) - { - nss_setgrent (1); - ent->need_endgrent = true; - } - ent->skip_initgroups_dyn = true; - return getgrent_next_nss (ent, buffer, buflen, user, group, start, size, groupsp, limit, errnop); } diff --git a/nis/nss_nis/nis-initgroups.c b/nis/nss_nis/nis-initgroups.c index a5a3ba6144..85b9eeecc1 100644 --- a/nis/nss_nis/nis-initgroups.c +++ b/nis/nss_nis/nis-initgroups.c @@ -139,7 +139,7 @@ get_uid (const char *user, uid_t *uidp) if (r != ERANGE) break; - extend_alloca (buf, buflen, 2 * buflen); + buf = extend_alloca (buf, buflen, 2 * buflen); } return 1; diff --git a/nptl/ChangeLog b/nptl/ChangeLog index a06b456728..57127d21a5 100644 --- a/nptl/ChangeLog +++ b/nptl/ChangeLog @@ -1,3 +1,23 @@ +2010-08-12 H.J. Lu <hongjiu.lu@intel.com> + + * nptl/sysdeps/unix/sysv/linux/i386/Makefile: New file. + +2010-07-01 Ulrich Drepper <drepper@redhat.com> + + * Makefile (tst-_res1): Add tst-_res1mod1 to dependency list. + +2010-10-13 H.J. Lu <hongjiu.lu@intel.com> + + [BZ #12113] + * sysdeps/x86_64/pthreaddef.h (TCB_ALIGNMENT): Changed to 32. + * sysdeps/x86_64/tls.h (TLS_TCB_ALIGN): Defined with alignment + of "struct pthread". + +2010-06-01 Takashi Yoshii <takashi.yoshii.zj@renesas.com> + + * sysdeps/unix/sysv/linux/sh/lowlevellock.S: Fix incorrect + location of ifndef __ASSUME_FUTEX_CLOCK_REALTIME. + 2009-11-27 Andreas Schwab <schwab@redhat.com> * sysdeps/unix/sysv/linux/x86_64/cancellation.S: Reload diff --git a/nptl/Makefile b/nptl/Makefile index e8180021ec..8a49da73a0 100644 --- a/nptl/Makefile +++ b/nptl/Makefile @@ -490,7 +490,8 @@ $(objpfx)tst-rwlock14: $(common-objpfx)rt/librt.so $(objpfx)tst-_res1mod2.so: $(objpfx)tst-_res1mod1.so LDFLAGS-tst-_res1mod1.so = -Wl,-soname,tst-_res1mod1.so LDFLAGS-tst-_res1mod2.so = -Wl,-soname,tst-_res1mod2.so -$(objpfx)tst-_res1: $(objpfx)tst-_res1mod2.so $(shared-thread-library) +$(objpfx)tst-_res1: $(objpfx)tst-_res1mod1.so $(objpfx)tst-_res1mod2.so \ + $(shared-thread-library) else $(objpfx)tst-cond11: $(common-objpfx)rt/librt.a $(objpfx)tst-cond19: $(common-objpfx)rt/librt.a diff --git a/nptl/sysdeps/unix/sysv/linux/i386/Makefile b/nptl/sysdeps/unix/sysv/linux/i386/Makefile new file mode 100644 index 0000000000..48eef38a24 --- /dev/null +++ b/nptl/sysdeps/unix/sysv/linux/i386/Makefile @@ -0,0 +1,3 @@ +ifeq ($(subdir),nptl) +CFLAGS-pt-initfini.s += -fno-asynchronous-unwind-tables +endif diff --git a/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S b/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S index 49b4e6d6e0..0d02083c46 100644 --- a/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S +++ b/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S @@ -1,4 +1,4 @@ -/* Copyright (C) 2003, 2004, 2005, 2007, 2008, 2009 +/* Copyright (C) 2003, 2004, 2005, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -282,6 +282,7 @@ __lll_timedlock_wait: rts mov.l @r15+, r12 +# ifndef __ASSUME_FUTEX_CLOCK_REALTIME .align 2 # ifdef PIC .Lgot: @@ -293,7 +294,6 @@ __lll_timedlock_wait: .long __have_futex_clock_realtime # endif -# ifndef __ASSUME_FUTEX_CLOCK_REALTIME .Lreltmo: /* Check for a valid timeout value. */ mov.l @(4,r6), r1 diff --git a/nptl/sysdeps/x86_64/pthreaddef.h b/nptl/sysdeps/x86_64/pthreaddef.h index be63a8c74a..8ec135c048 100644 --- a/nptl/sysdeps/x86_64/pthreaddef.h +++ b/nptl/sysdeps/x86_64/pthreaddef.h @@ -27,8 +27,9 @@ /* Minimal stack size after allocating thread descriptor and guard size. */ #define MINIMAL_REST_STACK 2048 -/* Alignment requirement for TCB. */ -#define TCB_ALIGNMENT 16 +/* Alignment requirement for TCB. Need to store post-AVX vector registers + in the TCB and we want the storage to be aligned at 32-byte. */ +#define TCB_ALIGNMENT 32 /* Location of current stack frame. The frame pointer is not usable. */ diff --git a/nptl/sysdeps/x86_64/tls.h b/nptl/sysdeps/x86_64/tls.h index e39eb5f69d..41b5e6daa2 100644 --- a/nptl/sysdeps/x86_64/tls.h +++ b/nptl/sysdeps/x86_64/tls.h @@ -117,12 +117,7 @@ typedef struct # define TLS_TCB_SIZE sizeof (struct pthread) /* Alignment requirements for the TCB. */ -//# define TLS_TCB_ALIGN __alignof__ (struct pthread) -// Normally the above would be correct But we have to store post-AVX -// vector registers in the TCB and we want the storage to be aligned. -// unfortunately there isn't yet a type for these values and hence no -// 32-byte alignment requirement. Make this explicit, for now. -# define TLS_TCB_ALIGN 32 +# define TLS_TCB_ALIGN __alignof__ (struct pthread) /* The TCB can have any size and the memory following the address the thread pointer points to is unspecified. Allocate the TCB there. */ diff --git a/posix/Makefile b/posix/Makefile index 535ed1474d..aec565ca3c 100644 --- a/posix/Makefile +++ b/posix/Makefile @@ -82,7 +82,7 @@ tests := tstgetopt testfnm runtests runptests \ bug-regex17 bug-regex18 bug-regex19 bug-regex20 \ bug-regex21 bug-regex22 bug-regex23 bug-regex24 \ bug-regex25 bug-regex26 bug-regex27 bug-regex28 \ - bug-regex29 bug-regex30 \ + bug-regex29 bug-regex30 bug-regex31 \ tst-nice tst-nanosleep tst-regex2 \ transbug tst-rxspencer tst-pcre tst-boost \ bug-ga1 tst-vfork1 tst-vfork2 tst-vfork3 tst-waitid \ @@ -109,10 +109,12 @@ generated := $(addprefix wordexp-test-result, 1 2 3 4 5 6 7 8 9 10) \ annexc annexc.out wordexp-tst.out bug-regex2-mem \ bug-regex2.mtrace bug-regex14-mem bug-regex14.mtrace \ bug-regex21-mem bug-regex21.mtrace \ + bug-regex31-mem bug-regex31.mtrace \ tst-rxspencer-mem tst-rxspencer.mtrace tst-getconf.out \ tst-pcre-mem tst-pcre.mtrace tst-boost-mem tst-boost.mtrace \ bug-ga2.mtrace bug-ga2-mem bug-glob2.mtrace bug-glob2-mem \ - tst-vfork3-mem tst-vfork3.mtrace getconf.speclist + tst-vfork3-mem tst-vfork3.mtrace getconf.speclist \ + tst-fnmatch-mem tst-fnmatch.mtrace include ../Rules @@ -222,9 +224,9 @@ endif tests: $(objpfx)annexc.out ifeq (no,$(cross-compiling)) tests: $(objpfx)bug-regex2-mem $(objpfx)bug-regex14-mem \ - $(objpfx)bug-regex21-mem $(objpfx)tst-rxspencer-mem \ + $(objpfx)bug-regex21-mem $(objpfx)bug-regex31-mem $(objpfx)tst-rxspencer-mem\ $(objpfx)tst-pcre-mem $(objpfx)tst-boost-mem $(objpfx)tst-getconf.out \ - $(objpfx)bug-glob2-mem $(objpfx)tst-vfork3-mem + $(objpfx)bug-glob2-mem $(objpfx)tst-vfork3-mem $(objpfx)tst-fnmatch-mem xtests: $(objpfx)bug-ga2-mem endif @@ -236,6 +238,11 @@ annexc-CFLAGS = -O $(objpfx)annexc: annexc.c $(native-compile) +tst-fnmatch-ENV += MALLOC_TRACE=$(objpfx)tst-fnmatch.mtrace + +$(objpfx)tst-fnmatch-mem: $(objpfx)tst-fnmatch.out + $(common-objpfx)malloc/mtrace $(objpfx)tst-fnmatch.mtrace > $@ + bug-regex2-ENV = MALLOC_TRACE=$(objpfx)bug-regex2.mtrace $(objpfx)bug-regex2-mem: $(objpfx)bug-regex2.out @@ -251,6 +258,11 @@ bug-regex21-ENV = MALLOC_TRACE=$(objpfx)bug-regex21.mtrace $(objpfx)bug-regex21-mem: $(objpfx)bug-regex21.out $(common-objpfx)malloc/mtrace $(objpfx)bug-regex21.mtrace > $@ +bug-regex31-ENV = MALLOC_TRACE=$(objpfx)bug-regex31.mtrace + +$(objpfx)bug-regex31-mem: $(objpfx)bug-regex31.out + $(common-objpfx)malloc/mtrace $(objpfx)bug-regex31.mtrace > $@ + tst-vfork3-ENV = MALLOC_TRACE=$(objpfx)tst-vfork3.mtrace $(objpfx)tst-vfork3-mem: $(objpfx)tst-vfork3.out diff --git a/posix/bug-regex31.c b/posix/bug-regex31.c new file mode 100644 index 0000000000..974e8603b9 --- /dev/null +++ b/posix/bug-regex31.c @@ -0,0 +1,36 @@ +#include <mcheck.h> +#include <regex.h> +#include <stdio.h> +#include <sys/types.h> + +int +main (void) +{ + mtrace (); + + int res = 0; + char *buf = NULL; + size_t len = 0; + while (! feof (stdin)) + { + ssize_t n = getline (&buf, &len, stdin); + if (n <= 0) + break; + if (buf[n - 1] == '\n') + buf[n - 1] = '\0'; + + regex_t regex; + int rc = regcomp (®ex, buf, REG_EXTENDED); + if (rc != 0) + printf ("%s: Error %d (expected)\n", buf, rc); + else + { + printf ("%s: succeeded !\n", buf); + res = 1; + } + } + + free (buf); + + return 0; +} diff --git a/posix/bug-regex31.input b/posix/bug-regex31.input new file mode 100644 index 0000000000..3d1f531f4e --- /dev/null +++ b/posix/bug-regex31.input @@ -0,0 +1,4 @@ +[[][ +([0] +([0]a +([0]([0]) diff --git a/posix/fnmatch.c b/posix/fnmatch.c index 4baef9e69b..0af5ee6b1e 100644 --- a/posix/fnmatch.c +++ b/posix/fnmatch.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991,1992,1993,1996,1997,1998,1999,2000,2001,2002,2003,2007 +/* Copyright (C) 1991,1992,1993,1996,1997,1998,1999,2000,2001,2002,2003,2007,2010 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -41,6 +41,12 @@ # include <stdlib.h> #endif +#ifdef _LIBC +# include <alloca.h> +#else +# define alloca_account(size., var) alloca (size) +#endif + /* For platform which support the ISO C amendement 1 functionality we support user defined character classes. */ #if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H) @@ -330,8 +336,11 @@ fnmatch (pattern, string, flags) mbstate_t ps; size_t n; const char *p; + wchar_t *wpattern_malloc = NULL; wchar_t *wpattern; + wchar_t *wstring_malloc = NULL; wchar_t *wstring; + size_t alloca_used = 0; /* Convert the strings into wide characters. */ memset (&ps, '\0', sizeof (ps)); @@ -343,7 +352,8 @@ fnmatch (pattern, string, flags) #endif if (__builtin_expect (n < 1024, 1)) { - wpattern = (wchar_t *) alloca ((n + 1) * sizeof (wchar_t)); + wpattern = (wchar_t *) alloca_account ((n + 1) * sizeof (wchar_t), + alloca_used); n = mbsrtowcs (wpattern, &p, n + 1, &ps); if (__builtin_expect (n == (size_t) -1, 0)) /* Something wrong. @@ -365,8 +375,11 @@ fnmatch (pattern, string, flags) XXX Do we have to set `errno' to something which mbsrtows hasn't already done? */ return -1; - wpattern = (wchar_t *) alloca ((n + 1) * sizeof (wchar_t)); + wpattern_malloc = wpattern + = (wchar_t *) malloc ((n + 1) * sizeof (wchar_t)); assert (mbsinit (&ps)); + if (wpattern == NULL) + return -2; (void) mbsrtowcs (wpattern, &pattern, n + 1, &ps); } @@ -379,13 +392,18 @@ fnmatch (pattern, string, flags) p = string; if (__builtin_expect (n < 1024, 1)) { - wstring = (wchar_t *) alloca ((n + 1) * sizeof (wchar_t)); + wstring = (wchar_t *) alloca_account ((n + 1) * sizeof (wchar_t), + alloca_used); n = mbsrtowcs (wstring, &p, n + 1, &ps); if (__builtin_expect (n == (size_t) -1, 0)) - /* Something wrong. - XXX Do we have to set `errno' to something which mbsrtows hasn't - already done? */ - return -1; + { + /* Something wrong. + XXX Do we have to set `errno' to something which + mbsrtows hasn't already done? */ + free_return: + free (wpattern_malloc); + return -1; + } if (p) { memset (&ps, '\0', sizeof (ps)); @@ -400,19 +418,32 @@ fnmatch (pattern, string, flags) /* Something wrong. XXX Do we have to set `errno' to something which mbsrtows hasn't already done? */ - return -1; - wstring = (wchar_t *) alloca ((n + 1) * sizeof (wchar_t)); + goto free_return; + + wstring_malloc = wstring + = (wchar_t *) malloc ((n + 1) * sizeof (wchar_t)); + if (wstring == NULL) + { + free (wpattern_malloc); + return -2; + } assert (mbsinit (&ps)); (void) mbsrtowcs (wstring, &string, n + 1, &ps); } - return internal_fnwmatch (wpattern, wstring, wstring + n, - flags & FNM_PERIOD, flags, NULL); + int res = internal_fnwmatch (wpattern, wstring, wstring + n, + flags & FNM_PERIOD, flags, NULL, + alloca_used); + + free (wstring_malloc); + free (wpattern_malloc); + + return res; } # endif /* mbstate_t and mbsrtowcs or _LIBC. */ return internal_fnmatch (pattern, string, string + strlen (string), - flags & FNM_PERIOD, flags, NULL); + flags & FNM_PERIOD, flags, NULL, 0); } # ifdef _LIBC diff --git a/posix/fnmatch_loop.c b/posix/fnmatch_loop.c index 67c0ee4abb..6b0224ea2c 100644 --- a/posix/fnmatch_loop.c +++ b/posix/fnmatch_loop.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991-1993,1996-2001,2003-2005,2007 +/* Copyright (C) 1991-1993,1996-2001,2003-2005,2007,2010 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -28,22 +28,24 @@ struct STRUCT it matches, nonzero if not. */ static int FCT (const CHAR *pattern, const CHAR *string, const CHAR *string_end, int no_leading_period, int flags, - struct STRUCT *ends) + struct STRUCT *ends, size_t alloca_used) internal_function; static int EXT (INT opt, const CHAR *pattern, const CHAR *string, - const CHAR *string_end, int no_leading_period, int flags) + const CHAR *string_end, int no_leading_period, int flags, + size_t alloca_used) internal_function; static const CHAR *END (const CHAR *patternp) internal_function; static int internal_function -FCT (pattern, string, string_end, no_leading_period, flags, ends) +FCT (pattern, string, string_end, no_leading_period, flags, ends, alloca_used) const CHAR *pattern; const CHAR *string; const CHAR *string_end; int no_leading_period; int flags; struct STRUCT *ends; + size_t alloca_used; { register const CHAR *p = pattern, *n = string; register UCHAR c; @@ -67,10 +69,8 @@ FCT (pattern, string, string_end, no_leading_period, flags, ends) case L('?'): if (__builtin_expect (flags & FNM_EXTMATCH, 0) && *p == '(') { - int res; - - res = EXT (c, p, n, string_end, no_leading_period, - flags); + int res = EXT (c, p, n, string_end, no_leading_period, + flags, alloca_used); if (res != -1) return res; } @@ -99,10 +99,8 @@ FCT (pattern, string, string_end, no_leading_period, flags, ends) case L('*'): if (__builtin_expect (flags & FNM_EXTMATCH, 0) && *p == '(') { - int res; - - res = EXT (c, p, n, string_end, no_leading_period, - flags); + int res = EXT (c, p, n, string_end, no_leading_period, + flags, alloca_used); if (res != -1) return res; } @@ -191,7 +189,7 @@ FCT (pattern, string, string_end, no_leading_period, flags, ends) for (--p; n < endp; ++n, no_leading_period = 0) if (FCT (p, n, string_end, no_leading_period, flags2, - &end) == 0) + &end, alloca_used) == 0) goto found; } else if (c == L('/') && (flags & FNM_FILE_NAME)) @@ -200,7 +198,7 @@ FCT (pattern, string, string_end, no_leading_period, flags, ends) ++n; if (n < string_end && *n == L('/') && (FCT (p, n + 1, string_end, flags & FNM_PERIOD, flags, - NULL) == 0)) + NULL, alloca_used) == 0)) return 0; } else @@ -214,7 +212,7 @@ FCT (pattern, string, string_end, no_leading_period, flags, ends) for (--p; n < endp; ++n, no_leading_period = 0) if (FOLD ((UCHAR) *n) == c && (FCT (p, n, string_end, no_leading_period, flags2, - &end) == 0)) + &end, alloca_used) == 0)) { found: if (end.pattern == NULL) @@ -749,7 +747,7 @@ FCT (pattern, string, string_end, no_leading_period, flags, ends) _NL_COLLATE_SYMB_EXTRAMB); /* Locate the character in the hashing - table. */ + table. */ hash = elem_hash (str, c1); idx = 0; @@ -971,9 +969,8 @@ FCT (pattern, string, string_end, no_leading_period, flags, ends) case L('!'): if (__builtin_expect (flags & FNM_EXTMATCH, 0) && *p == '(') { - int res; - - res = EXT (c, p, n, string_end, no_leading_period, flags); + int res = EXT (c, p, n, string_end, no_leading_period, flags, + alloca_used); if (res != -1) return res; } @@ -1052,26 +1049,32 @@ END (const CHAR *pattern) static int internal_function EXT (INT opt, const CHAR *pattern, const CHAR *string, const CHAR *string_end, - int no_leading_period, int flags) + int no_leading_period, int flags, size_t alloca_used) { const CHAR *startp; int level; struct patternlist { struct patternlist *next; + CHAR malloced; CHAR str[0]; } *list = NULL; struct patternlist **lastp = &list; size_t pattern_len = STRLEN (pattern); + int any_malloced = 0; const CHAR *p; const CHAR *rs; + int retval = 0; /* Parse the pattern. Store the individual parts in the list. */ level = 0; for (startp = p = pattern + 1; level >= 0; ++p) if (*p == L('\0')) - /* This is an invalid pattern. */ - return -1; + { + /* This is an invalid pattern. */ + retval = -1; + goto out; + } else if (*p == L('[')) { /* Handle brackets special. */ @@ -1088,8 +1091,11 @@ EXT (INT opt, const CHAR *pattern, const CHAR *string, const CHAR *string_end, /* Skip over all characters of the list. */ while (*p != L(']')) if (*p++ == L('\0')) - /* This is no valid pattern. */ - return -1; + { + /* This is no valid pattern. */ + retval = -1; + goto out; + } } else if ((*p == L('?') || *p == L('*') || *p == L('+') || *p == L('@') || *p == L('!')) && p[1] == L('(')) @@ -1102,15 +1108,25 @@ EXT (INT opt, const CHAR *pattern, const CHAR *string, const CHAR *string_end, /* This means we found the end of the pattern. */ #define NEW_PATTERN \ struct patternlist *newp; \ - \ - if (opt == L('?') || opt == L('@')) \ - newp = alloca (sizeof (struct patternlist) \ - + (pattern_len * sizeof (CHAR))); \ + size_t slen = (opt == L('?') || opt == L('@') \ + ? pattern_len : (p - startp + 1)); \ + slen = sizeof (struct patternlist) + (slen * sizeof (CHAR)); \ + int malloced = ! __libc_use_alloca (alloca_used + slen); \ + if (__builtin_expect (malloced, 0)) \ + { \ + newp = malloc (slen); \ + if (newp == NULL) \ + { \ + retval = -2; \ + goto out; \ + } \ + any_malloced = 1; \ + } \ else \ - newp = alloca (sizeof (struct patternlist) \ - + ((p - startp + 1) * sizeof (CHAR))); \ - *((CHAR *) MEMPCPY (newp->str, startp, p - startp)) = L('\0'); \ + newp = alloca_account (slen, alloca_used); \ newp->next = NULL; \ + newp->malloced = malloced; \ + *((CHAR *) MEMPCPY (newp->str, startp, p - startp)) = L('\0'); \ *lastp = newp; \ lastp = &newp->next NEW_PATTERN; @@ -1131,8 +1147,9 @@ EXT (INT opt, const CHAR *pattern, const CHAR *string, const CHAR *string_end, switch (opt) { case L('*'): - if (FCT (p, string, string_end, no_leading_period, flags, NULL) == 0) - return 0; + if (FCT (p, string, string_end, no_leading_period, flags, NULL, + alloca_used) == 0) + goto success; /* FALLTHROUGH */ case L('+'): @@ -1143,7 +1160,7 @@ EXT (INT opt, const CHAR *pattern, const CHAR *string, const CHAR *string_end, current pattern. */ if (FCT (list->str, string, rs, no_leading_period, flags & FNM_FILE_NAME ? flags : flags & ~FNM_PERIOD, - NULL) == 0 + NULL, alloca_used) == 0 /* This was successful. Now match the rest with the rest of the pattern. */ && (FCT (p, rs, string_end, @@ -1151,7 +1168,7 @@ EXT (INT opt, const CHAR *pattern, const CHAR *string, const CHAR *string_end, ? no_leading_period : rs[-1] == '/' && NO_LEADING_PERIOD (flags) ? 1 : 0, flags & FNM_FILE_NAME - ? flags : flags & ~FNM_PERIOD, NULL) == 0 + ? flags : flags & ~FNM_PERIOD, NULL, alloca_used) == 0 /* This didn't work. Try the whole pattern. */ || (rs != string && FCT (pattern - 1, rs, string_end, @@ -1160,18 +1177,21 @@ EXT (INT opt, const CHAR *pattern, const CHAR *string, const CHAR *string_end, : (rs[-1] == '/' && NO_LEADING_PERIOD (flags) ? 1 : 0), flags & FNM_FILE_NAME - ? flags : flags & ~FNM_PERIOD, NULL) == 0))) + ? flags : flags & ~FNM_PERIOD, NULL, + alloca_used) == 0))) /* It worked. Signal success. */ - return 0; + goto success; } while ((list = list->next) != NULL); /* None of the patterns lead to a match. */ - return FNM_NOMATCH; + retval = FNM_NOMATCH; + break; case L('?'): - if (FCT (p, string, string_end, no_leading_period, flags, NULL) == 0) - return 0; + if (FCT (p, string, string_end, no_leading_period, flags, NULL, + alloca_used) == 0) + goto success; /* FALLTHROUGH */ case L('@'): @@ -1183,13 +1203,14 @@ EXT (INT opt, const CHAR *pattern, const CHAR *string, const CHAR *string_end, if (FCT (STRCAT (list->str, p), string, string_end, no_leading_period, flags & FNM_FILE_NAME ? flags : flags & ~FNM_PERIOD, - NULL) == 0) + NULL, alloca_used) == 0) /* It worked. Signal success. */ - return 0; + goto success; while ((list = list->next) != NULL); /* None of the patterns lead to a match. */ - return FNM_NOMATCH; + retval = FNM_NOMATCH; + break; case L('!'): for (rs = string; rs <= string_end; ++rs) @@ -1199,7 +1220,7 @@ EXT (INT opt, const CHAR *pattern, const CHAR *string, const CHAR *string_end, for (runp = list; runp != NULL; runp = runp->next) if (FCT (runp->str, string, rs, no_leading_period, flags & FNM_FILE_NAME ? flags : flags & ~FNM_PERIOD, - NULL) == 0) + NULL, alloca_used) == 0) break; /* If none of the patterns matched see whether the rest does. */ @@ -1209,21 +1230,34 @@ EXT (INT opt, const CHAR *pattern, const CHAR *string, const CHAR *string_end, ? no_leading_period : rs[-1] == '/' && NO_LEADING_PERIOD (flags) ? 1 : 0, flags & FNM_FILE_NAME ? flags : flags & ~FNM_PERIOD, - NULL) == 0)) + NULL, alloca_used) == 0)) /* This is successful. */ - return 0; + goto success; } /* None of the patterns together with the rest of the pattern lead to a match. */ - return FNM_NOMATCH; + retval = FNM_NOMATCH; + break; default: assert (! "Invalid extended matching operator"); + retval = -1; break; } - return -1; + success: + out: + if (any_malloced) + while (list != NULL) + { + struct patternlist *old = list; + list = list->next; + if (old->malloced) + free (old); + } + + return retval; } diff --git a/posix/getopt.h b/posix/getopt.h index ff0251dec0..6e2fa27180 100644 --- a/posix/getopt.h +++ b/posix/getopt.h @@ -1,5 +1,5 @@ /* Declarations for getopt. - Copyright (C) 1989-1994,1996-1999,2001,2003,2004,2009 + Copyright (C) 1989-1994,1996-1999,2001,2003,2004,2009,2010 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -158,9 +158,9 @@ extern int getopt (int ___argc, char *const *___argv, const char *__shortopts) additional functionality can be disable at runtime. This redirection helps to also do this at runtime. */ # ifdef __REDIRECT - extern int __REDIRECT (getopt, (int ___argc, char *const *___argv, - const char *__shortopts), - __posix_getopt) __THROW; + extern int __REDIRECT_NTH (getopt, (int ___argc, char *const *___argv, + const char *__shortopts), + __posix_getopt); # else extern int __posix_getopt (int ___argc, char *const *___argv, const char *__shortopts) __THROW; diff --git a/posix/regcomp.c b/posix/regcomp.c index 542b848f14..c48020dcb9 100644 --- a/posix/regcomp.c +++ b/posix/regcomp.c @@ -2154,16 +2154,21 @@ parse_branch (re_string_t *regexp, regex_t *preg, re_token_t *token, exp = parse_expression (regexp, preg, token, syntax, nest, err); if (BE (*err != REG_NOERROR && exp == NULL, 0)) { + if (tree != NULL) + postorder (tree, free_tree, NULL); return NULL; } if (tree != NULL && exp != NULL) { - tree = create_tree (dfa, tree, exp, CONCAT); - if (tree == NULL) + bin_tree_t *newtree = create_tree (dfa, tree, exp, CONCAT); + if (newtree == NULL) { + postorder (exp, free_tree, NULL); + postorder (tree, free_tree, NULL); *err = REG_ESPACE; return NULL; } + tree = newtree; } else if (tree == NULL) tree = exp; @@ -2412,7 +2417,11 @@ parse_sub_exp (re_string_t *regexp, regex_t *preg, re_token_t *token, { tree = parse_reg_exp (regexp, preg, token, syntax, nest, err); if (BE (*err == REG_NOERROR && token->type != OP_CLOSE_SUBEXP, 0)) - *err = REG_EPAREN; + { + if (tree != NULL) + postorder (tree, free_tree, NULL); + *err = REG_EPAREN; + } if (BE (*err != REG_NOERROR, 0)) return NULL; } @@ -3022,6 +3031,10 @@ parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token, if (BE (sbcset == NULL, 0)) #endif /* RE_ENABLE_I18N */ { + re_free (sbcset); +#ifdef RE_ENABLE_I18N + re_free (mbcset); +#endif *err = REG_ESPACE; return NULL; } diff --git a/posix/tst-fnmatch.c b/posix/tst-fnmatch.c index 25471f8e41..7e1f73a975 100644 --- a/posix/tst-fnmatch.c +++ b/posix/tst-fnmatch.c @@ -1,5 +1,5 @@ /* Tests for fnmatch function. - Copyright (C) 2000, 2001 Free Software Foundation, Inc. + Copyright (C) 2000, 2001, 2010 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 @@ -25,6 +25,7 @@ #include <stdlib.h> #include <string.h> #include <sys/types.h> +#include <mcheck.h> static char *next_input (char **line, int first, int last); @@ -46,6 +47,8 @@ main (void) size_t escpatternlen = 0; int nr = 0; + mtrace (); + /* Read lines from stdin with the following format: locale input-string match-string flags result diff --git a/resolv/res_init.c b/resolv/res_init.c index 40dbe7d7e5..74715f34e9 100644 --- a/resolv/res_init.c +++ b/resolv/res_init.c @@ -176,13 +176,6 @@ __res_vinit(res_state statp, int preinit) { statp->id = res_randomid(); } -#ifdef USELOOPBACK - statp->nsaddr.sin_addr = inet_makeaddr(IN_LOOPBACKNET, 1); -#else - statp->nsaddr.sin_addr.s_addr = INADDR_ANY; -#endif - statp->nsaddr.sin_family = AF_INET; - statp->nsaddr.sin_port = htons(NAMESERVER_PORT); statp->nscount = 0; statp->ndots = 1; statp->pfcode = 0; @@ -321,24 +314,24 @@ __res_vinit(res_state statp, int preinit) { nserv++; #ifdef _LIBC nservall++; - } else { - struct in6_addr a6; - char *el; + } else { + struct in6_addr a6; + char *el; - if ((el = strchr(cp, '\n')) != NULL) - *el = '\0'; + if ((el = strchr(cp, '\n')) != NULL) + *el = '\0'; if ((el = strchr(cp, SCOPE_DELIMITER)) != NULL) *el = '\0'; - if ((*cp != '\0') && - (inet_pton(AF_INET6, cp, &a6) > 0)) { - struct sockaddr_in6 *sa6; - - sa6 = malloc(sizeof(*sa6)); - if (sa6 != NULL) { - sa6->sin6_family = AF_INET6; - sa6->sin6_port = htons(NAMESERVER_PORT); + if ((*cp != '\0') && + (inet_pton(AF_INET6, cp, &a6) > 0)) { + struct sockaddr_in6 *sa6; + + sa6 = malloc(sizeof(*sa6)); + if (sa6 != NULL) { + sa6->sin6_family = AF_INET6; + sa6->sin6_port = htons(NAMESERVER_PORT); sa6->sin6_flowinfo = 0; - sa6->sin6_addr = a6; + sa6->sin6_addr = a6; if (__builtin_expect (el == NULL, 1)) sa6->sin6_scope_id = 0; @@ -365,9 +358,9 @@ __res_vinit(res_state statp, int preinit) { statp->_u._ext.nsaddrs[nservall] = sa6; statp->_u._ext.nssocks[nservall] = -1; statp->_u._ext.nsmap[nservall] = MAXNS + 1; - nservall++; - } - } + nservall++; + } + } #endif } continue; @@ -433,6 +426,12 @@ __res_vinit(res_state statp, int preinit) { #endif (void) fclose(fp); } + if (__builtin_expect(statp->nscount == 0, 0)) { + statp->nsaddr.sin_addr = inet_makeaddr(IN_LOOPBACKNET, 1); + statp->nsaddr.sin_family = AF_INET; + statp->nsaddr.sin_port = htons(NAMESERVER_PORT); + statp->nscount = 1; + } if (statp->defdname[0] == 0 && __gethostname(buf, sizeof(statp->defdname) - 1) == 0 && (cp = strchr(buf, '.')) != NULL) @@ -538,12 +537,12 @@ res_setoptions(res_state statp, const char *options, const char *source) { } else if (!strncmp(cp, "no-check-names", sizeof("no-check-names") - 1)) { statp->options |= RES_NOCHECKNAME; - } else if (!strncmp(cp, "edns0", sizeof("edns0") - 1)) { + } else if (!strncmp(cp, "edns0", sizeof("edns0") - 1)) { statp->options |= RES_USE_EDNS0; - } else if (!strncmp(cp, "single-request-reopen", + } else if (!strncmp(cp, "single-request-reopen", sizeof("single-request-reopen") - 1)) { statp->options |= RES_SNGLKUPREOP; - } else if (!strncmp(cp, "single-request", + } else if (!strncmp(cp, "single-request", sizeof("single-request") - 1)) { statp->options |= RES_SNGLKUP; } else { diff --git a/scripts/data/localplt-s390-linux-gnu.data b/scripts/data/localplt-s390-linux-gnu.data new file mode 100644 index 0000000000..8fb56b6086 --- /dev/null +++ b/scripts/data/localplt-s390-linux-gnu.data @@ -0,0 +1,7 @@ +libc.so: _Unwind_Find_FDE +libc.so: calloc +libc.so: free +libc.so: malloc +libc.so: memalign +libc.so: realloc +libm.so: matherr diff --git a/scripts/data/localplt-s390x-linux-gnu.data b/scripts/data/localplt-s390x-linux-gnu.data new file mode 100644 index 0000000000..8fb56b6086 --- /dev/null +++ b/scripts/data/localplt-s390x-linux-gnu.data @@ -0,0 +1,7 @@ +libc.so: _Unwind_Find_FDE +libc.so: calloc +libc.so: free +libc.so: malloc +libc.so: memalign +libc.so: realloc +libm.so: matherr diff --git a/stdlib/strtod_l.c b/stdlib/strtod_l.c index 9ddfa3fa66..099fcf751e 100644 --- a/stdlib/strtod_l.c +++ b/stdlib/strtod_l.c @@ -1491,7 +1491,9 @@ ____STRTOF_INTERNAL (nptr, endptr, group, loc) register int i; (void) __mpn_lshift (&retval[used / BITS_PER_MP_LIMB], - retval, RETURN_LIMB_SIZE, + retval, + (RETURN_LIMB_SIZE + - used / BITS_PER_MP_LIMB), used % BITS_PER_MP_LIMB); for (i = used / BITS_PER_MP_LIMB - 1; i >= 0; --i) retval[i] = 0; diff --git a/string/Makefile b/string/Makefile index db9b5081d5..4ade15007e 100644 --- a/string/Makefile +++ b/string/Makefile @@ -54,7 +54,8 @@ tests := tester inl-tester noinl-tester testcopy test-ffs \ bug-strncat1 bug-strspn1 bug-strpbrk1 tst-bswap \ tst-strtok tst-strxfrm bug-strcoll1 tst-strfry \ bug-strtok1 $(addprefix test-,$(strop-tests)) \ - bug-envz1 tst-strxfrm2 tst-endian tst-svc2 + bug-envz1 tst-strxfrm2 tst-endian tst-svc2 \ + bug-strstr1 distribute := memcopy.h pagecopy.h tst-svc.expect test-string.h \ str-two-way.h @@ -73,6 +74,7 @@ CFLAGS-tst-strlen.c = -fno-builtin CFLAGS-stratcliff.c = -fno-builtin CFLAGS-test-ffs.c = -fno-builtin CFLAGS-tst-inlcall.c = -fno-builtin +CFLAGS-bug-strstr1.c = -fno-builtin ifeq ($(cross-compiling),no) tests: $(objpfx)tst-svc.out diff --git a/string/bug-strstr1.c b/string/bug-strstr1.c new file mode 100644 index 0000000000..889de12955 --- /dev/null +++ b/string/bug-strstr1.c @@ -0,0 +1,26 @@ +#include <stdio.h> +#include <string.h> + +int main (int argc, char** argv) +{ + const char haystack[] = + "F_BD_CE_BD_EF_BF_BD_EF_BF_BD_EF_BF_BD_EF_BF_BD_C3_88_20_EF_BF_BD_EF_BF_BD_EF_BF_BD_C3_A7_20_EF_BF_BD"; + + const char needle[] = + "_EF_BF_BD_EF_BF_BD_EF_BF_BD_EF_BF_BD_EF_BF_BD"; + + const char* sub = strstr (haystack, needle); + + if (sub != NULL) + { + int j; + + fprintf (stderr, "BUG: expected NULL, got:\n%s\n%s\n", sub, needle); + for (j = 0; needle[j] != '\0'; ++j) + putchar (needle[j] == sub[j] ? ' ' : '^'); + puts (""); + return 1; + } + + return 0; +} diff --git a/string/str-two-way.h b/string/str-two-way.h index 87ed8a0366..73c99d9188 100644 --- a/string/str-two-way.h +++ b/string/str-two-way.h @@ -350,8 +350,8 @@ two_way_long_needle (const unsigned char *haystack, size_t haystack_len, a byte out of place, there can be no match until after the mismatch. */ shift = needle_len - period; - memory = 0; } + memory = 0; j += shift; continue; } diff --git a/string/stratcliff.c b/string/stratcliff.c index 2bb59820f9..5165be2d13 100644 --- a/string/stratcliff.c +++ b/string/stratcliff.c @@ -1,5 +1,6 @@ /* Test for string function add boundaries of usable memory. - Copyright (C) 1996,1997,1999-2003,2007, 2009 Free Software Foundation, Inc. + Copyright (C) 1996,1997,1999-2003,2007,2009,2010 + Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. @@ -47,6 +48,8 @@ # define MEMCPY memcpy # define MEMPCPY mempcpy # define MEMCHR memchr +# define STRCMP strcmp +# define STRNCMP strncmp #endif @@ -70,12 +73,12 @@ do_test (void) if (adr == MAP_FAILED || dest == MAP_FAILED) { if (errno == ENOSYS) - puts ("No test, mmap not available."); + puts ("No test, mmap not available."); else - { - printf ("mmap failed: %m"); - result = 1; - } + { + printf ("mmap failed: %m"); + result = 1; + } } else { @@ -93,8 +96,8 @@ do_test (void) /* strlen/wcslen test */ for (outer = nchars - 1; outer >= MAX (0, nchars - 128); --outer) - { - for (inner = MAX (outer, nchars - 64); inner < nchars; ++inner) + { + for (inner = MAX (outer, nchars - 64); inner < nchars; ++inner) { adr[inner] = L('\0'); @@ -107,12 +110,12 @@ do_test (void) adr[inner] = L('T'); } - } + } /* strnlen/wcsnlen test */ for (outer = nchars; outer >= MAX (0, nchars - 128); --outer) - { - for (inner = MAX (outer, nchars - 64); inner < nchars; ++inner) + { + for (inner = MAX (outer, nchars - 64); inner < nchars; ++inner) { adr[inner] = L('\0'); @@ -126,9 +129,9 @@ do_test (void) adr[inner] = L('T'); } - } + } for (outer = nchars; outer >= MAX (0, nchars - 128); --outer) - { + { for (inner = MAX (outer, nchars - 64); inner <= nchars; ++inner) { if (STRNLEN (&adr[outer], inner - outer) @@ -139,11 +142,11 @@ do_test (void) result = 1; } } - } + } /* strchr/wcschr test */ for (outer = nchars - 1; outer >= MAX (0, nchars - 128); --outer) - { + { for (middle = MAX (outer, nchars - 64); middle < nchars; ++middle) { for (inner = middle; inner < nchars; ++inner) @@ -167,7 +170,7 @@ do_test (void) adr[middle] = L('T'); } } - } + } /* Special test. */ adr[nchars - 1] = L('\0'); @@ -180,7 +183,7 @@ do_test (void) /* strrchr/wcsrchr test */ for (outer = nchars - 1; outer >= MAX (0, nchars - 128); --outer) - { + { for (middle = MAX (outer, nchars - 64); middle < nchars; ++middle) { for (inner = middle; inner < nchars; ++inner) @@ -204,11 +207,11 @@ do_test (void) adr[middle] = L('T'); } } - } + } /* memchr test */ for (outer = nchars - 1; outer >= MAX (0, nchars - 128); --outer) - { + { for (middle = MAX (outer, nchars - 64); middle < nchars; ++middle) { adr[middle] = L('V'); @@ -224,9 +227,9 @@ do_test (void) adr[middle] = L('T'); } - } + } for (outer = nchars; outer >= MAX (0, nchars - 128); --outer) - { + { CHAR *cp = MEMCHR (&adr[outer], L('V'), nchars - outer); if (cp != NULL) @@ -235,13 +238,13 @@ do_test (void) STRINGIFY (MEMCHR), outer); result = 1; } - } + } /* This function only exists for single-byte characters. */ #ifndef WCSTEST /* rawmemchr test */ for (outer = nchars - 1; outer >= MAX (0, nchars - 128); --outer) - { + { for (middle = MAX (outer, nchars - 64); middle < nchars; ++middle) { adr[middle] = L('V'); @@ -257,13 +260,13 @@ do_test (void) adr[middle] = L('T'); } - } + } #endif /* strcpy/wcscpy test */ for (outer = nchars - 1; outer >= MAX (0, nchars - 128); --outer) - { - for (inner = MAX (outer, nchars - 64); inner < nchars; ++inner) + { + for (inner = MAX (outer, nchars - 64); inner < nchars; ++inner) { adr[inner] = L('\0'); @@ -277,7 +280,74 @@ do_test (void) adr[inner] = L('T'); } - } + } + + /* strcmp/wcscmp tests */ + for (outer = 1; outer < 32; ++outer) + for (middle = 0; middle < 16; ++middle) + { + MEMSET (adr + middle, L('T'), 256); + adr[256] = L('\0'); + MEMSET (dest + nchars - outer, L('T'), outer - 1); + dest[nchars - 1] = L('\0'); + + if (STRCMP (adr + middle, dest + nchars - outer) <= 0) + { + printf ("%s 1 flunked for outer = %d, middle = %d\n", + STRINGIFY (STRCMP), outer, middle); + result = 1; + } + + if (STRCMP (dest + nchars - outer, adr + middle) >= 0) + { + printf ("%s 2 flunked for outer = %d, middle = %d\n", + STRINGIFY (STRCMP), outer, middle); + result = 1; + } + } + + /* strncmp/wcsncmp tests */ + for (outer = 1; outer < 32; ++outer) + for (middle = 0; middle < 16; ++middle) + { + MEMSET (adr + middle, L('T'), 256); + adr[256] = L('\0'); + MEMSET (dest + nchars - outer, L('T'), outer - 1); + dest[nchars - 1] = L('U'); + + for (inner = 0; inner < outer; ++inner) + { + if (STRNCMP (adr + middle, dest + nchars - outer, inner) != 0) + { + printf ("%s 1 flunked for outer = %d, middle = %d, " + "inner = %d\n", + STRINGIFY (STRNCMP), outer, middle, inner); + result = 1; + } + + if (STRNCMP (dest + nchars - outer, adr + middle, inner) != 0) + { + printf ("%s 2 flunked for outer = %d, middle = %d, " + "inner = %d\n", + STRINGIFY (STRNCMP), outer, middle, inner); + result = 1; + } + } + + if (STRNCMP (adr + middle, dest + nchars - outer, outer) >= 0) + { + printf ("%s 1 flunked for outer = %d, middle = %d, full\n", + STRINGIFY (STRNCMP), outer, middle); + result = 1; + } + + if (STRNCMP (dest + nchars - outer, adr + middle, outer) <= 0) + { + printf ("%s 2 flunked for outer = %d, middle = %d, full\n", + STRINGIFY (STRNCMP), outer, middle); + result = 1; + } + } /* strncpy/wcsncpy tests */ adr[nchars - 1] = L('T'); @@ -295,12 +365,12 @@ do_test (void) result = 1; } } - } + } adr[nchars - 1] = L('\0'); for (outer = nchars - 1; outer >= MAX (0, nchars - 128); --outer) - { - for (inner = MAX (outer, nchars - 64); inner < nchars; ++inner) + { + for (inner = MAX (outer, nchars - 64); inner < nchars; ++inner) { size_t len; @@ -334,12 +404,12 @@ do_test (void) adr[inner] = L('T'); } - } + } /* stpcpy/wcpcpy test */ for (outer = nchars - 1; outer >= MAX (0, nchars - 128); --outer) - { - for (inner = MAX (outer, nchars - 64); inner < nchars; ++inner) + { + for (inner = MAX (outer, nchars - 64); inner < nchars; ++inner) { adr[inner] = L('\0'); @@ -352,7 +422,7 @@ do_test (void) adr[inner] = L('T'); } - } + } /* stpncpy/wcpncpy test */ adr[nchars - 1] = L('T'); @@ -374,8 +444,8 @@ do_test (void) adr[nchars - 1] = L('\0'); for (outer = nchars - 1; outer >= MAX (0, nchars - 128); --outer) - { - for (middle = MAX (outer, nchars - 64); middle < nchars; ++middle) + { + for (middle = MAX (outer, nchars - 64); middle < nchars; ++middle) { adr[middle] = L('\0'); @@ -393,7 +463,7 @@ do_test (void) adr[middle] = L('T'); } - } + } /* memcpy/wmemcpy test */ for (outer = nchars; outer >= MAX (0, nchars - 128); --outer) diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h index 707e859546..99917bb5dc 100644 --- a/sysdeps/generic/ldsodefs.h +++ b/sysdeps/generic/ldsodefs.h @@ -887,8 +887,11 @@ extern lookup_t _dl_lookup_symbol_x (const char *undef, extern ElfW(Addr) _dl_symbol_value (struct link_map *map, const char *name) internal_function; -/* Allocate a `struct link_map' for a new object being loaded, - and enter it into the _dl_main_map list. */ +/* Add the new link_map NEW to the end of the namespace list. */ +extern void _dl_add_to_namespace_list (struct link_map *new, Lmid_t nsid) + internal_function attribute_hidden; + +/* Allocate a `struct link_map' for a new object being loaded. */ extern struct link_map *_dl_new_object (char *realname, const char *libname, int type, struct link_map *loader, int mode, Lmid_t nsid) diff --git a/sysdeps/i386/bits/byteswap.h b/sysdeps/i386/bits/byteswap.h index 1f3fc5e524..c246ae86c6 100644 --- a/sysdeps/i386/bits/byteswap.h +++ b/sysdeps/i386/bits/byteswap.h @@ -1,5 +1,5 @@ /* Macros to swap the order of bytes in integer values. - Copyright (C) 1997, 1998, 2000, 2002, 2003, 2006, 2007, 2008 + Copyright (C) 1997, 1998, 2000, 2002, 2003, 2006, 2007, 2008, 2010 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -27,26 +27,27 @@ /* Swap bytes in 16 bit value. */ #define __bswap_constant_16(x) \ - ((((x) >> 8) & 0xff) | (((x) & 0xff) << 8)) + ((unsigned short int) ((((x) >> 8) & 0xff) | (((x) & 0xff) << 8))) #ifdef __GNUC__ # if __GNUC__ >= 2 # define __bswap_16(x) \ (__extension__ \ - ({ register unsigned short int __v, __x = (x); \ + ({ register unsigned short int __v, __x = (unsigned short int) (x); \ if (__builtin_constant_p (__x)) \ __v = __bswap_constant_16 (__x); \ else \ __asm__ ("rorw $8, %w0" \ : "=r" (__v) \ - : "0" (__x) \ - : "cc"); \ + : "0" (__x) \ + : "cc"); \ __v; })) # else /* This is better than nothing. */ # define __bswap_16(x) \ (__extension__ \ - ({ register unsigned short int __x = (x); __bswap_constant_16 (__x); })) + ({ register unsigned short int __x = (unsigned short int) (x); \ + __bswap_constant_16 (__x); })) # endif #else static __inline unsigned short int @@ -122,7 +123,7 @@ __bswap_32 (unsigned int __bsx) (__extension__ \ ({ union { __extension__ unsigned long long int __ll; \ unsigned long int __l[2]; } __w, __r; \ - if (__builtin_constant_p (x)) \ + if (__builtin_constant_p (x)) \ __r.__ll = __bswap_constant_64 (x); \ else \ { \ diff --git a/sysdeps/i386/elf/Makefile b/sysdeps/i386/elf/Makefile new file mode 100644 index 0000000000..61064d4ef7 --- /dev/null +++ b/sysdeps/i386/elf/Makefile @@ -0,0 +1,4 @@ +ifeq ($(subdir),csu) +# Turn off -fasynchronous-unwind-tables +CFLAGS-initfini.s += -fno-asynchronous-unwind-tables +endif diff --git a/sysdeps/ieee754/ldbl-128ibm/e_sqrtl.c b/sysdeps/ieee754/ldbl-128ibm/e_sqrtl.c index 1f533cae42..fe6bb55b07 100644 --- a/sysdeps/ieee754/ldbl-128ibm/e_sqrtl.c +++ b/sysdeps/ieee754/ldbl-128ibm/e_sqrtl.c @@ -73,9 +73,9 @@ long double __ieee754_sqrtl(long double x) m = ((a.i[2] >> 20) & 0x7ff) - 54; } m += n; - if (m > 0) + if ((int) m > 0) a.i[2] = (a.i[2] & 0x800fffff) | (m << 20); - else if (m <= -54) { + else if ((int) m <= -54) { a.i[2] &= 0x80000000; a.i[3] = 0; } else { diff --git a/sysdeps/mach/hurd/linkat.c b/sysdeps/mach/hurd/linkat.c index 1942144e0f..062d913e3d 100644 --- a/sysdeps/mach/hurd/linkat.c +++ b/sysdeps/mach/hurd/linkat.c @@ -1,5 +1,5 @@ /* Make a link between file names relative to open directories. Hurd version. - Copyright (C) 2006 Free Software Foundation, Inc. + Copyright (C) 2006,2010 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 @@ -38,7 +38,9 @@ linkat (fromfd, from, tofd, to, flags) file_t oldfile, linknode, todir; char *toname; - oldfile = __file_name_lookup_at (fromfd, flags, from, 0, 0); + /* POSIX says linkat doesn't follow symlinks by default, so pass + O_NOLINK. That can be overridden by AT_SYMLINK_FOLLOW in FLAGS. */ + oldfile = __file_name_lookup_at (fromfd, flags, from, O_NOLINK, 0); if (oldfile == MACH_PORT_NULL) return -1; diff --git a/sysdeps/s390/s390-32/__longjmp.c b/sysdeps/s390/s390-32/__longjmp.c index 4abc0ec81c..95f8b71019 100644 --- a/sysdeps/s390/s390-32/__longjmp.c +++ b/sysdeps/s390/s390-32/__longjmp.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2000, 2001, 2005, 2009 Free Software Foundation, Inc. +/* Copyright (C) 2000, 2001, 2005, 2009, 2010 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). @@ -29,16 +29,19 @@ void __longjmp (__jmp_buf env, int val) { - register int r2 __asm ("%r2") = val == 0 ? 1 : val; #ifdef PTR_DEMANGLE - register uintptr_t r3 __asm ("%r3") = THREAD_GET_POINTER_GUARD (); - register void *r1 __asm ("%r1") = (void *) env; + uintptr_t guard = THREAD_GET_POINTER_GUARD (); # ifdef CHECK_SP - CHECK_SP (env, r3); + CHECK_SP (env, guard); # endif #elif defined CHECK_SP CHECK_SP (env, 0); #endif + register int r2 __asm ("%r2") = val == 0 ? 1 : val; +#ifdef PTR_DEMANGLE + register uintptr_t r3 __asm ("%r3") = guard; + register void *r1 __asm ("%r1") = (void *) env; +#endif /* Restore registers and jump back. */ asm volatile ("ld %%f6,48(%1)\n\t" "ld %%f4,40(%1)\n\t" diff --git a/sysdeps/s390/s390-64/__longjmp.c b/sysdeps/s390/s390-64/__longjmp.c index 445bd3baf3..313b338546 100644 --- a/sysdeps/s390/s390-64/__longjmp.c +++ b/sysdeps/s390/s390-64/__longjmp.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2001, 2005, 2009 Free Software Foundation, Inc. +/* Copyright (C) 2001, 2005, 2009, 2010 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). @@ -29,16 +29,19 @@ void __longjmp (__jmp_buf env, int val) { - register long int r2 __asm ("%r2") = val == 0 ? 1 : val; #ifdef PTR_DEMANGLE - register uintptr_t r3 __asm ("%r3") = THREAD_GET_POINTER_GUARD (); - register void *r1 __asm ("%r1") = (void *) env; + uintptr_t guard = THREAD_GET_POINTER_GUARD (); # ifdef CHECK_SP - CHECK_SP (env, r3); + CHECK_SP (env, guard); # endif #elif defined CHECK_SP CHECK_SP (env, 0); #endif + register long int r2 __asm ("%r2") = val == 0 ? 1 : val; +#ifdef PTR_DEMANGLE + register uintptr_t r3 __asm ("%r3") = guard; + register void *r1 __asm ("%r1") = (void *) env; +#endif /* Restore registers and jump back. */ asm volatile ("ld %%f7,104(%1)\n\t" "ld %%f5,96(%1)\n\t" diff --git a/sysdeps/unix/sysv/linux/check_pf.c b/sysdeps/unix/sysv/linux/check_pf.c index 586f1cb169..83df2f451d 100644 --- a/sysdeps/unix/sysv/linux/check_pf.c +++ b/sysdeps/unix/sysv/linux/check_pf.c @@ -1,5 +1,5 @@ /* Determine protocol families for which interfaces exist. Linux version. - Copyright (C) 2003, 2006, 2007, 2008 Free Software Foundation, Inc. + Copyright (C) 2003, 2006, 2007, 2008, 2010 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 @@ -301,10 +301,13 @@ __check_pf (bool *seen_ipv4, bool *seen_ipv6, struct ifaddrs *runp; for (runp = ifa; runp != NULL; runp = runp->ifa_next) - if (runp->ifa_addr->sa_family == PF_INET) - *seen_ipv4 = true; - else if (runp->ifa_addr->sa_family == PF_INET6) - *seen_ipv6 = true; + if (runp->ifa_addr != NULL) + { + if (runp->ifa_addr->sa_family == PF_INET) + *seen_ipv4 = true; + else if (runp->ifa_addr->sa_family == PF_INET6) + *seen_ipv6 = true; + } (void) freeifaddrs (ifa); #endif diff --git a/sysdeps/unix/sysv/linux/getdents.c b/sysdeps/unix/sysv/linux/getdents.c index b33d1789ad..0aa918677d 100644 --- a/sysdeps/unix/sysv/linux/getdents.c +++ b/sysdeps/unix/sysv/linux/getdents.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1993, 1995-2003, 2004, 2006, 2007 +/* Copyright (C) 1993, 1995-2004, 2006, 2007, 2010 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -285,7 +285,11 @@ __GETDENTS (int fd, char *buf, size_t nbytes) DIRENT_SET_DP_INO(dp, kdp->d_ino); dp->d_off = kdp->d_off; dp->d_reclen = new_reclen; +#ifdef __ASSUME_GETDENTS32_D_TYPE + dp->d_type = *((char *) kdp + kdp->d_reclen - 1); +#else dp->d_type = DT_UNKNOWN; +#endif memcpy (dp->d_name, kdp->d_name, kdp->d_reclen - offsetof (struct kernel_dirent, d_name)); diff --git a/sysdeps/unix/sysv/linux/i386/bits/mman.h b/sysdeps/unix/sysv/linux/i386/bits/mman.h index 22aa401e02..7ac1aff08b 100644 --- a/sysdeps/unix/sysv/linux/i386/bits/mman.h +++ b/sysdeps/unix/sysv/linux/i386/bits/mman.h @@ -1,5 +1,6 @@ /* Definitions for POSIX memory map interface. Linux/i386 version. - Copyright (C) 1997,2000,2003,2005,2006,2009 Free Software Foundation, Inc. + Copyright (C) 1997,2000,2003,2005,2006,2009,2010 + 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 @@ -64,6 +65,7 @@ # define MAP_POPULATE 0x08000 /* Populate (prefault) pagetables. */ # define MAP_NONBLOCK 0x10000 /* Do not block on IO. */ # define MAP_STACK 0x20000 /* Allocation is for a stack. */ +# define MAP_HUGETLB 0x40000 /* Create huge page mapping. */ #endif /* Flags to `msync'. */ diff --git a/sysdeps/unix/sysv/linux/internal_statvfs.c b/sysdeps/unix/sysv/linux/internal_statvfs.c index 28c1cb691f..6066c86993 100644 --- a/sysdeps/unix/sysv/linux/internal_statvfs.c +++ b/sysdeps/unix/sysv/linux/internal_statvfs.c @@ -214,7 +214,8 @@ INTERNAL_STATVFS (const char *name, struct STATVFS *buf, buf->f_files = fsbuf->f_files; buf->f_ffree = fsbuf->f_ffree; if (sizeof (buf->f_fsid) == sizeof (fsbuf->f_fsid)) - buf->f_fsid = (fsbuf->f_fsid.__val[0] + buf->f_fsid = ((fsbuf->f_fsid.__val[0] + & ((1UL << (8 * sizeof (fsbuf->f_fsid.__val[0]))) - 1)) | ((unsigned long int) fsbuf->f_fsid.__val[1] << (8 * (sizeof (buf->f_fsid) - sizeof (fsbuf->f_fsid.__val[0]))))); diff --git a/sysdeps/unix/sysv/linux/sparc/sys/epoll.h b/sysdeps/unix/sysv/linux/sparc/sys/epoll.h index cc0ddef69e..9943f21383 100644 --- a/sysdeps/unix/sysv/linux/sparc/sys/epoll.h +++ b/sysdeps/unix/sysv/linux/sparc/sys/epoll.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2002-2006, 2007, 2008 Free Software Foundation, Inc. +/* Copyright (C) 2002-2006, 2007, 2008, 2010 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 @@ -31,7 +31,7 @@ typedef __sigset_t sigset_t; #endif -/* Flags to be passed to epoll_create2. */ +/* Flags to be passed to epoll_create1. */ enum { EPOLL_CLOEXEC = 0x400000, @@ -101,8 +101,9 @@ __BEGIN_DECLS returned by epoll_create() should be closed with close(). */ extern int epoll_create (int __size) __THROW; -/* Same as epoll_create but with an additional FLAGS parameter. */ -extern int epoll_create2 (int __size, int __flags) __THROW; +/* Same as epoll_create but with an FLAGS parameter. The unused SIZE + parameter has been dropped. */ +extern int epoll_create1 (int __flags) __THROW; /* Manipulate an epoll instance "epfd". Returns 0 in case of success, diff --git a/sysdeps/unix/sysv/linux/sys/swap.h b/sysdeps/unix/sysv/linux/sys/swap.h index b6e7bef5d2..961006cbbe 100644 --- a/sysdeps/unix/sysv/linux/sys/swap.h +++ b/sysdeps/unix/sysv/linux/sys/swap.h @@ -1,5 +1,5 @@ /* Calls to enable and disable swapping on specified locations. Linux version. - Copyright (C) 1996, 1998, 1999 Free Software Foundation, Inc. + Copyright (C) 1996, 1998, 1999, 2010 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 @@ -28,6 +28,7 @@ #define SWAP_FLAG_PREFER 0x8000 /* Set if swap priority is specified. */ #define SWAP_FLAG_PRIO_MASK 0x7fff #define SWAP_FLAG_PRIO_SHIFT 0 +#define SWAP_FLAG_DISCARD 0x10000 /* Discard swap cluster after use. */ __BEGIN_DECLS diff --git a/sysdeps/unix/sysv/linux/ttyname.c b/sysdeps/unix/sysv/linux/ttyname.c index 69af6adc65..6cec3a9013 100644 --- a/sysdeps/unix/sysv/linux/ttyname.c +++ b/sysdeps/unix/sysv/linux/ttyname.c @@ -1,4 +1,5 @@ -/* Copyright (C) 1991,92,93,1996-2002,2006,2009 Free Software Foundation, Inc. +/* Copyright (C) 1991-1993,1996-2002,2006,2009,2010 + 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 @@ -131,6 +132,9 @@ ttyname (int fd) if (__builtin_expect (__tcgetattr (fd, &term) < 0, 0)) return NULL; + if (__fxstat64 (_STAT_VER, fd, &st) < 0) + return NULL; + /* We try using the /proc filesystem. */ *_fitoa_word (fd, __stpcpy (procname, "/proc/self/fd/"), 10, 0) = '\0'; @@ -161,13 +165,32 @@ ttyname (int fd) { if ((size_t) len >= buflen) return NULL; + +#define UNREACHABLE_LEN strlen ("(unreachable)") + if (len > UNREACHABLE_LEN + && memcmp (ttyname_buf, "(unreachable)", UNREACHABLE_LEN) == 0) + { + memmove (ttyname_buf, ttyname_buf + UNREACHABLE_LEN, + len - UNREACHABLE_LEN); + len -= UNREACHABLE_LEN; + } + /* readlink need not terminate the string. */ ttyname_buf[len] = '\0'; - return ttyname_buf; - } - if (__fxstat64 (_STAT_VER, fd, &st) < 0) - return NULL; + /* Verify readlink result, fall back on iterating through devices. */ + if (ttyname_buf[0] == '/' + && __xstat64 (_STAT_VER, ttyname_buf, &st1) == 0 +#ifdef _STATBUF_ST_RDEV + && S_ISCHR (st1.st_mode) + && st1.st_rdev == st.st_rdev +#else + && st1.st_ino == st.st_ino + && st1.st_dev == st.st_dev +#endif + ) + return ttyname_buf; + } if (__xstat64 (_STAT_VER, "/dev/pts", &st1) == 0 && S_ISDIR (st1.st_mode)) { diff --git a/sysdeps/unix/sysv/linux/ttyname_r.c b/sysdeps/unix/sysv/linux/ttyname_r.c index cef8624dc6..2fa7503471 100644 --- a/sysdeps/unix/sysv/linux/ttyname_r.c +++ b/sysdeps/unix/sysv/linux/ttyname_r.c @@ -1,4 +1,5 @@ -/* Copyright (C) 1991,92,93,1995-2001,2003,2006 Free Software Foundation, Inc. +/* Copyright (C) 1991-1993,1995-2001,2003,2006,2010 + 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 @@ -122,6 +123,9 @@ __ttyname_r (int fd, char *buf, size_t buflen) if (__builtin_expect (__tcgetattr (fd, &term) < 0, 0)) return errno; + if (__fxstat64 (_STAT_VER, fd, &st) < 0) + return errno; + /* We try using the /proc filesystem. */ *_fitoa_word (fd, __stpcpy (procname, "/proc/self/fd/"), 10, 0) = '\0'; @@ -145,12 +149,30 @@ __ttyname_r (int fd, char *buf, size_t buflen) #endif , 1)) { +#define UNREACHABLE_LEN strlen ("(unreachable)") + if (ret > UNREACHABLE_LEN + && memcmp (buf, "(unreachable)", UNREACHABLE_LEN) == 0) + { + memmove (buf, buf + UNREACHABLE_LEN, ret - UNREACHABLE_LEN); + ret -= UNREACHABLE_LEN; + } + + /* readlink need not terminate the string. */ buf[ret] = '\0'; - return 0; - } - if (__fxstat64 (_STAT_VER, fd, &st) < 0) - return errno; + /* Verify readlink result, fall back on iterating through devices. */ + if (buf[0] == '/' + && __xstat64 (_STAT_VER, buf, &st1) == 0 +#ifdef _STATBUF_ST_RDEV + && S_ISCHR (st1.st_mode) + && st1.st_rdev == st.st_rdev +#else + && st1.st_ino == st.st_ino + && st1.st_dev == st.st_dev +#endif + ) + return 0; + } /* Prepare the result buffer. */ memcpy (buf, "/dev/pts/", sizeof ("/dev/pts/")); diff --git a/sysdeps/unix/sysv/linux/x86_64/____longjmp_chk.S b/sysdeps/unix/sysv/linux/x86_64/____longjmp_chk.S index 5e11540fd4..da35115b9f 100644 --- a/sysdeps/unix/sysv/linux/x86_64/____longjmp_chk.S +++ b/sysdeps/unix/sysv/linux/x86_64/____longjmp_chk.S @@ -1,4 +1,4 @@ -/* Copyright (C) 2001,2004,2005,2006,2009 Free Software Foundation, Inc. +/* Copyright (C) 2001,2004,2005,2006,2009,2010 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 @@ -49,9 +49,9 @@ longjmp_msg: .text ENTRY(____longjmp_chk) /* Restore registers. */ - movq (JB_RSP*8)(%rdi),%r8 - movq (JB_RBP*8)(%rdi),%r9 - movq (JB_PC*8)(%rdi),%rdx + movq (JB_RSP*8)(%rdi), %r8 + movq (JB_RBP*8)(%rdi), %r9 + movq (JB_PC*8)(%rdi), %rdx #ifdef PTR_DEMANGLE PTR_DEMANGLE (%r8) PTR_DEMANGLE (%r9) @@ -63,7 +63,9 @@ ENTRY(____longjmp_chk) /* Save function parameters. */ movq %rdi, %r10 - movl %esi, %ecx + cfi_register (%rdi, %r10) + movl %esi, %ebx + cfi_register (%rsi, %rbx) xorl %edi, %edi leaq -24(%rsp), %rsi @@ -84,7 +86,9 @@ ENTRY(____longjmp_chk) .Lfail: CALL_FAIL .Lok2: movq %r10, %rdi - movl %ecx, %esi + cfi_restore (%rdi) + movl %ebx, %esi + cfi_restore (%rsi) .Lok: /* We add unwind information for the target here. */ cfi_def_cfa(%rdi, 0) @@ -96,11 +100,11 @@ ENTRY(____longjmp_chk) cfi_offset(%r13,JB_R13*8) cfi_offset(%r14,JB_R14*8) cfi_offset(%r15,JB_R15*8) - movq (JB_RBX*8)(%rdi),%rbx - movq (JB_R12*8)(%rdi),%r12 - movq (JB_R13*8)(%rdi),%r13 - movq (JB_R14*8)(%rdi),%r14 - movq (JB_R15*8)(%rdi),%r15 + movq (JB_RBX*8)(%rdi), %rbx + movq (JB_R12*8)(%rdi), %r12 + movq (JB_R13*8)(%rdi), %r13 + movq (JB_R14*8)(%rdi), %r14 + movq (JB_R15*8)(%rdi), %r15 /* Set return value for setjmp. */ movl %esi, %eax movq %r8,%rsp diff --git a/sysdeps/unix/sysv/linux/x86_64/bits/mman.h b/sysdeps/unix/sysv/linux/x86_64/bits/mman.h index 3dcbf9c317..6f3ad0de4f 100644 --- a/sysdeps/unix/sysv/linux/x86_64/bits/mman.h +++ b/sysdeps/unix/sysv/linux/x86_64/bits/mman.h @@ -1,5 +1,5 @@ /* Definitions for POSIX memory map interface. Linux/x86_64 version. - Copyright (C) 2001, 2003, 2005, 2006, 2009 Free Software Foundation, Inc. + Copyright (C) 2001,2003,2005,2006,2009,2010 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,7 @@ # define MAP_POPULATE 0x08000 /* Populate (prefault) pagetables. */ # define MAP_NONBLOCK 0x10000 /* Do not block on IO. */ # define MAP_STACK 0x20000 /* Allocation is for a stack. */ +# define MAP_HUGETLB 0x40000 /* Create huge page mapping. */ #endif /* Flags to `msync'. */ diff --git a/sysdeps/unix/sysv/linux/x86_64/sys/epoll.h b/sysdeps/unix/sysv/linux/x86_64/sys/epoll.h index 234798e4b8..d799c845c1 100644 --- a/sysdeps/unix/sysv/linux/x86_64/sys/epoll.h +++ b/sysdeps/unix/sysv/linux/x86_64/sys/epoll.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2002,2003,2004,2005,2006,2007,2008 Free Software Foundation, Inc. +/* Copyright (C) 2002-2008, 2010 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 @@ -31,7 +31,7 @@ typedef __sigset_t sigset_t; #endif -/* Flags to be passed to epoll_create2. */ +/* Flags to be passed to epoll_create1. */ enum { EPOLL_CLOEXEC = 02000000, diff --git a/sysdeps/x86_64/bits/byteswap.h b/sysdeps/x86_64/bits/byteswap.h index 08b38e8523..e350fb8063 100644 --- a/sysdeps/x86_64/bits/byteswap.h +++ b/sysdeps/x86_64/bits/byteswap.h @@ -1,5 +1,5 @@ /* Macros to swap the order of bytes in integer values. - Copyright (C) 1997, 1998, 2000, 2002, 2003, 2007, 2008 + Copyright (C) 1997, 1998, 2000, 2002, 2003, 2007, 2008, 2010 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -29,12 +29,12 @@ /* Swap bytes in 16 bit value. */ #define __bswap_constant_16(x) \ - ((((x) >> 8) & 0xff) | (((x) & 0xff) << 8)) + ((unsigned short int) ((((x) >> 8) & 0xff) | (((x) & 0xff) << 8))) #if defined __GNUC__ && __GNUC__ >= 2 # define __bswap_16(x) \ (__extension__ \ - ({ register unsigned short int __v, __x = (x); \ + ({ register unsigned short int __v, __x = (unsigned short int) (x); \ if (__builtin_constant_p (__x)) \ __v = __bswap_constant_16 (__x); \ else \ @@ -47,7 +47,8 @@ /* This is better than nothing. */ # define __bswap_16(x) \ (__extension__ \ - ({ register unsigned short int __x = (x); __bswap_constant_16 (__x); })) + ({ register unsigned short int __x = (unsigned short int) (x); \ + __bswap_constant_16 (__x); })) #endif @@ -120,16 +121,16 @@ # define __bswap_64(x) \ (__extension__ \ ({ union { __extension__ unsigned long long int __ll; \ - unsigned int __l[2]; } __w, __r; \ - if (__builtin_constant_p (x)) \ - __r.__ll = __bswap_constant_64 (x); \ - else \ - { \ - __w.__ll = (x); \ - __r.__l[0] = __bswap_32 (__w.__l[1]); \ - __r.__l[1] = __bswap_32 (__w.__l[0]); \ - } \ - __r.__ll; })) + unsigned int __l[2]; } __w, __r; \ + if (__builtin_constant_p (x)) \ + __r.__ll = __bswap_constant_64 (x); \ + else \ + { \ + __w.__ll = (x); \ + __r.__l[0] = __bswap_32 (__w.__l[1]); \ + __r.__l[1] = __bswap_32 (__w.__l[0]); \ + } \ + __r.__ll; })) # endif #endif diff --git a/sysdeps/x86_64/cacheinfo.c b/sysdeps/x86_64/cacheinfo.c index 5b66c62eb3..31da2b888a 100644 --- a/sysdeps/x86_64/cacheinfo.c +++ b/sysdeps/x86_64/cacheinfo.c @@ -453,10 +453,10 @@ __cache_sysconf (int name) /* Half the data cache size for use in memory and string routines, typically - L1 size. */ + L1 size, rounded to multiple of 256 bytes. */ long int __x86_64_data_cache_size_half attribute_hidden = 32 * 1024 / 2; /* Shared cache size for use in memory and string routines, typically - L2 or L3 size. */ + L2 or L3 size, rounded to multiple of 256 bytes. */ long int __x86_64_shared_cache_size_half attribute_hidden = 1024 * 1024 / 2; long int __x86_64_shared_cache_size attribute_hidden = 1024 * 1024; @@ -657,10 +657,16 @@ init_cacheinfo (void) } if (data > 0) - __x86_64_data_cache_size_half = data / 2; + { + /* Round data cache size to multiple of 256 bytes. */ + data = data & ~255L; + __x86_64_data_cache_size_half = data / 2; + } if (shared > 0) { + /* Round shared cache size to multiple of 256 bytes. */ + shared = shared & ~255L; __x86_64_shared_cache_size_half = shared / 2; __x86_64_shared_cache_size = shared; } diff --git a/sysdeps/x86_64/multiarch/strchr.S b/sysdeps/x86_64/multiarch/strchr.S index b35566d1a5..44538aaa81 100644 --- a/sysdeps/x86_64/multiarch/strchr.S +++ b/sysdeps/x86_64/multiarch/strchr.S @@ -1,5 +1,5 @@ /* strchr with SSE4.2 - Copyright (C) 2009 Free Software Foundation, Inc. + Copyright (C) 2009, 2010 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 @@ -87,13 +87,13 @@ __strchr_sse42: pxor %xmm2, %xmm2 movd %esi, %xmm1 movl %edi, %ecx + pshufb %xmm2, %xmm1 andl $15, %ecx movq %rdi, %r8 je L(aligned_start) /* Handle unaligned string. */ andq $-16, %r8 - pshufb %xmm2, %xmm1 movdqa (%r8), %xmm0 pcmpeqb %xmm0, %xmm2 pcmpeqb %xmm1, %xmm0 diff --git a/sysdeps/x86_64/strcmp.S b/sysdeps/x86_64/strcmp.S index 650ec173b6..e0847a201b 100644 --- a/sysdeps/x86_64/strcmp.S +++ b/sysdeps/x86_64/strcmp.S @@ -313,7 +313,7 @@ LABEL(nibble_ashr_1): jnz LABEL(ashr_1_exittail) /* find null char*/ #ifdef USE_AS_STRNCMP - cmp $14, %r11 + cmp $15, %r11 jbe LABEL(ashr_1_exittail) #endif @@ -438,7 +438,7 @@ LABEL(nibble_ashr_2): jnz LABEL(ashr_2_exittail) #ifdef USE_AS_STRNCMP - cmp $13, %r11 + cmp $14, %r11 jbe LABEL(ashr_2_exittail) #endif @@ -560,7 +560,7 @@ LABEL(nibble_ashr_3): jnz LABEL(ashr_3_exittail) #ifdef USE_AS_STRNCMP - cmp $12, %r11 + cmp $13, %r11 jbe LABEL(ashr_3_exittail) #endif @@ -682,7 +682,7 @@ LABEL(nibble_ashr_4): jnz LABEL(ashr_4_exittail) #ifdef USE_AS_STRNCMP - cmp $11, %r11 + cmp $12, %r11 jbe LABEL(ashr_4_exittail) #endif @@ -804,7 +804,7 @@ LABEL(nibble_ashr_5): jnz LABEL(ashr_5_exittail) #ifdef USE_AS_STRNCMP - cmp $10, %r11 + cmp $11, %r11 jbe LABEL(ashr_5_exittail) #endif @@ -926,7 +926,7 @@ LABEL(nibble_ashr_6): jnz LABEL(ashr_6_exittail) #ifdef USE_AS_STRNCMP - cmp $9, %r11 + cmp $10, %r11 jbe LABEL(ashr_6_exittail) #endif @@ -1048,7 +1048,7 @@ LABEL(nibble_ashr_7): jnz LABEL(ashr_7_exittail) #ifdef USE_AS_STRNCMP - cmp $8, %r11 + cmp $9, %r11 jbe LABEL(ashr_7_exittail) #endif @@ -1170,7 +1170,7 @@ LABEL(nibble_ashr_8): jnz LABEL(ashr_8_exittail) #ifdef USE_AS_STRNCMP - cmp $7, %r11 + cmp $8, %r11 jbe LABEL(ashr_8_exittail) #endif @@ -1292,7 +1292,7 @@ LABEL(nibble_ashr_9): jnz LABEL(ashr_9_exittail) #ifdef USE_AS_STRNCMP - cmp $6, %r11 + cmp $7, %r11 jbe LABEL(ashr_9_exittail) #endif @@ -1414,7 +1414,7 @@ LABEL(nibble_ashr_10): jnz LABEL(ashr_10_exittail) #ifdef USE_AS_STRNCMP - cmp $5, %r11 + cmp $6, %r11 jbe LABEL(ashr_10_exittail) #endif @@ -1536,7 +1536,7 @@ LABEL(nibble_ashr_11): jnz LABEL(ashr_11_exittail) #ifdef USE_AS_STRNCMP - cmp $4, %r11 + cmp $5, %r11 jbe LABEL(ashr_11_exittail) #endif @@ -1658,7 +1658,7 @@ LABEL(nibble_ashr_12): jnz LABEL(ashr_12_exittail) #ifdef USE_AS_STRNCMP - cmp $3, %r11 + cmp $4, %r11 jbe LABEL(ashr_12_exittail) #endif @@ -1780,7 +1780,7 @@ LABEL(nibble_ashr_13): jnz LABEL(ashr_13_exittail) #ifdef USE_AS_STRNCMP - cmp $2, %r11 + cmp $3, %r11 jbe LABEL(ashr_13_exittail) #endif @@ -1902,7 +1902,7 @@ LABEL(nibble_ashr_14): jnz LABEL(ashr_14_exittail) #ifdef USE_AS_STRNCMP - cmp $1, %r11 + cmp $2, %r11 jbe LABEL(ashr_14_exittail) #endif @@ -2026,8 +2026,8 @@ LABEL(nibble_ashr_15): jnz LABEL(ashr_15_exittail) #ifdef USE_AS_STRNCMP - test %r11, %r11 - je LABEL(ashr_15_exittail) + cmpq $1, %r11 + jbe LABEL(ashr_15_exittail) #endif pxor %xmm0, %xmm0 diff --git a/version.h b/version.h index 08933b63fc..80b68076d1 100644 --- a/version.h +++ b/version.h @@ -1,4 +1,4 @@ /* This file just defines the current version number of libc. */ #define RELEASE "stable" -#define VERSION "2.11.2" +#define VERSION "2.11.3" diff --git a/wcsmbs/wchar.h b/wcsmbs/wchar.h index 7a659116c3..eb5b244899 100644 --- a/wcsmbs/wchar.h +++ b/wcsmbs/wchar.h @@ -658,10 +658,10 @@ extern int __REDIRECT (fwscanf, (__FILE *__restrict __stream, extern int __REDIRECT (wscanf, (__const wchar_t *__restrict __format, ...), __isoc99_wscanf) /* __attribute__ ((__format__ (__wscanf__, 1, 2))) */; -extern int __REDIRECT (swscanf, (__const wchar_t *__restrict __s, - __const wchar_t *__restrict __format, ...), - __isoc99_swscanf) - __THROW /* __attribute__ ((__format__ (__wscanf__, 2, 3))) */; +extern int __REDIRECT_NTH (swscanf, (__const wchar_t *__restrict __s, + __const wchar_t *__restrict __format, + ...), __isoc99_swscanf) + /* __attribute__ ((__format__ (__wscanf__, 2, 3))) */; # else extern int __isoc99_fwscanf (__FILE *__restrict __stream, __const wchar_t *__restrict __format, ...); @@ -712,10 +712,10 @@ extern int __REDIRECT (vfwscanf, (__FILE *__restrict __s, extern int __REDIRECT (vwscanf, (__const wchar_t *__restrict __format, __gnuc_va_list __arg), __isoc99_vwscanf) /* __attribute__ ((__format__ (__wscanf__, 1, 0))) */; -extern int __REDIRECT (vswscanf, (__const wchar_t *__restrict __s, - __const wchar_t *__restrict __format, - __gnuc_va_list __arg), __isoc99_vswscanf) - __THROW /* __attribute__ ((__format__ (__wscanf__, 2, 0))) */; +extern int __REDIRECT_NTH (vswscanf, (__const wchar_t *__restrict __s, + __const wchar_t *__restrict __format, + __gnuc_va_list __arg), __isoc99_vswscanf) + /* __attribute__ ((__format__ (__wscanf__, 2, 0))) */; # else extern int __isoc99_vfwscanf (__FILE *__restrict __s, __const wchar_t *__restrict __format, diff --git a/wcsmbs/wcsatcliff.c b/wcsmbs/wcsatcliff.c index b29571f294..95afff6098 100644 --- a/wcsmbs/wcsatcliff.c +++ b/wcsmbs/wcsatcliff.c @@ -16,6 +16,8 @@ #define MEMCPY wmemcpy #define MEMPCPY wmempcpy #define MEMCHR wmemchr +#define STRCMP wcscmp +#define STRNCMP wcsncmp #include "../string/stratcliff.c" |