From b408267a1529407ba8bae80a03e6c2f7f3c37da7 Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: Oct 31 2019 07:37:54 +0000 Subject: import compat-glibc-2.12-4.el7 --- diff --git a/.compat-glibc.metadata b/.compat-glibc.metadata new file mode 100644 index 0000000..2fe025e --- /dev/null +++ b/.compat-glibc.metadata @@ -0,0 +1,2 @@ +2929deef5e735cedfbe50fae8652fcfbabd85b00 SOURCES/glibc-2.12-2-gc4ccff1-fedora.tar.bz2 +9d52a929c93f099e1db80c846cda27309df07345 SOURCES/glibc-2.12-2-gc4ccff1.tar.bz2 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6eef238 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +SOURCES/glibc-2.12-2-gc4ccff1-fedora.tar.bz2 +SOURCES/glibc-2.12-2-gc4ccff1.tar.bz2 diff --git a/SOURCES/dummylib.sh b/SOURCES/dummylib.sh new file mode 100644 index 0000000..4059496 --- /dev/null +++ b/SOURCES/dummylib.sh @@ -0,0 +1,51 @@ +#!/bin/sh +if [ $# -lt 3 ]; then echo Usage: dummylib.sh orig_lib_path dummy_lib_path mapfile; exit 1; fi +TMPDIR=`mktemp -d dummylib.sh.XXXXXX` || exit 1 +F=`file -L $1` +C= +S=8 +case "$F" in + *ELF\ 64-bit*shared\ object*x86-64*) C=-m64;; + *ELF\ 32-bit*shared\ object*80?86*) C=-m32; S=4;; + *ELF\ 64-bit*shared\ object*PowerPC*) C=-m64;; + *ELF\ 32-bit*shared\ object*PowerPC*) C=-m32; S=4;; + *ELF\ 64-bit*shared\ object*cisco*) C=-m64;; + *ELF\ 32-bit*shared\ object*cisco*) C=-m32; S=4;; + *ELF\ 64-bit*shared\ object*IA-64*) C=;; + *ELF\ 64-bit*shared\ object*Alpha*) C=;; + *ELF\ 64-bit*shared\ object*390*) C=-m64;; + *ELF\ 32-bit*shared\ object*390*) C=-m31; S=4;; + *ELF\ 64-bit*shared\ object*SPARC*) C=-m64;; + *ELF\ 32-bit*shared\ object*SPARC*) C=-m32; S=4;; + *ELF\ 64-bit*shared\ object*Alpha*) C=;; +esac +readelf -Ws $1 | awk ' +/\.dynsym.* contains/ { start=1 } +/^$/ { start=0 } +/ WEAK.* UND [^@]*$/ { if (start) { + print ".data"; print ".weak " $8; print ".balign 8" + print ".'$S'byte " $8 +} } +/ UND / { next } +/@/ { if (start) { + fn=$8 + intfn="HACK" hack+0 + hack++ + if ($4 ~ /FUNC/) { print ".text"; size=16; print ".type " intfn ",@function" } + else if ($4 ~ /OBJECT/) { print ".data"; size=$3; print ".type " intfn ",@object" } + else if ($4 ~ /NOTYPE/) { print ".data"; size=$3 } + else if ($4 ~ /TLS/) { print ".section .tdata,\"awT\",@progbits"; size=$3; print ".type " intfn ",@object" } + else exit(1); + print ".globl " intfn + if ($5 ~ /WEAK/) { print ".weak " intfn } + else if ($5 !~ /GLOBAL/) exit(1); + print intfn ": .skip " size + print ".size " intfn "," size + print ".symver " intfn "," fn +} } +' > $TMPDIR/lib.s || exit +soname=`readelf -Wd $1 | grep SONAME | sed 's/^.*\[//;s/\].*$//'` +gcc $C -Wl,-z,noexecstack -shared -Wl,-soname,$soname,-version-script,$3 \ + -o $2 $TMPDIR/lib.s -nostdlib +strip $2 +rm -rf $TMPDIR diff --git a/SOURCES/glibc-aliasing.patch b/SOURCES/glibc-aliasing.patch new file mode 100644 index 0000000..016a4d4 --- /dev/null +++ b/SOURCES/glibc-aliasing.patch @@ -0,0 +1,87 @@ +Index: glibc-2.12-2-gc4ccff1/elf/Makefile +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/elf/Makefile ++++ glibc-2.12-2-gc4ccff1/elf/Makefile +@@ -129,6 +129,7 @@ include ../Makeconfig + ifeq ($(unwind-find-fde),yes) + routines += unwind-dw2-fde-glibc + shared-only-routines += unwind-dw2-fde-glibc ++CFLAGS-unwind-dw2-fde-glibc.c += -fno-strict-aliasing + endif + + before-compile = $(objpfx)trusted-dirs.h +Index: glibc-2.12-2-gc4ccff1/inet/Makefile +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/inet/Makefile ++++ glibc-2.12-2-gc4ccff1/inet/Makefile +@@ -57,6 +57,8 @@ tests := htontest test_ifindex tst-ntoa + + include ../Rules + ++CFLAGS-tst-inet6_rth.c += -fno-strict-aliasing ++ + ifeq ($(have-thread-library),yes) + + CFLAGS-gethstbyad_r.c = -DUSE_NSCD=1 -fexceptions +Index: glibc-2.12-2-gc4ccff1/nis/Makefile +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/nis/Makefile ++++ glibc-2.12-2-gc4ccff1/nis/Makefile +@@ -69,6 +69,8 @@ libnss_nisplus-inhibit-o = $(filter-out + + include ../Rules + ++CFLAGS-nis_findserv.c += -fno-strict-aliasing ++CFLAGS-ypclnt.c += -fno-strict-aliasing + + $(objpfx)libnss_compat.so: $(objpfx)libnsl.so$(libnsl.so-version) + $(objpfx)libnss_nis.so: $(objpfx)libnsl.so$(libnsl.so-version) \ +Index: glibc-2.12-2-gc4ccff1/nss/Makefile +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/nss/Makefile ++++ glibc-2.12-2-gc4ccff1/nss/Makefile +@@ -74,6 +74,7 @@ endif + + include ../Rules + ++CFLAGS-files-hosts.c += -fno-strict-aliasing + + ifeq (yes,$(build-static-nss)) + $(objpfx)getent: $(objpfx)libnss_files.a +Index: glibc-2.12-2-gc4ccff1/resolv/Makefile +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/resolv/Makefile ++++ glibc-2.12-2-gc4ccff1/resolv/Makefile +@@ -77,6 +77,7 @@ CPPFLAGS += -Dgethostbyname=res_gethostb + -Dgetnetbyaddr=res_getnetbyaddr + + CFLAGS-res_hconf.c = -fexceptions ++CFLAGS-res_send.c += -fno-strict-aliasing + + # The BIND code elicits some harmless warnings. + +cflags += -Wno-strict-prototypes -Wno-write-strings +Index: glibc-2.12-2-gc4ccff1/sunrpc/Makefile +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/sunrpc/Makefile ++++ glibc-2.12-2-gc4ccff1/sunrpc/Makefile +@@ -129,6 +129,10 @@ CFLAGS-openchild.c = -fexceptions + + CPPFLAGS += -D_RPC_THREAD_SAFE_ + ++CFLAGS-clnt_tcp.c += -fno-strict-aliasing ++CFLAGS-clnt_udp.c += -fno-strict-aliasing ++CFLAGS-clnt_unix.c += -fno-strict-aliasing ++ + include ../Rules + + $(objpfx)rpcgen: $(addprefix $(objpfx),$(rpcgen-objs)) \ +Index: glibc-2.12-2-gc4ccff1/sysdeps/powerpc/powerpc64/elf/Makefile +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/sysdeps/powerpc/powerpc64/elf/Makefile ++++ glibc-2.12-2-gc4ccff1/sysdeps/powerpc/powerpc64/elf/Makefile +@@ -9,3 +9,5 @@ CFLAGS-rtld-mempcpy.os = $(no-special-re + CFLAGS-rtld-memmove.os = $(no-special-regs) + CFLAGS-rtld-memchr.os = $(no-special-regs) + CFLAGS-rtld-strnlen.os = $(no-special-regs) ++ ++CFLAGS-gmon-start.c += -fno-strict-aliasing diff --git a/SOURCES/glibc-fedora.patch b/SOURCES/glibc-fedora.patch new file mode 100644 index 0000000..5a7fce9 --- /dev/null +++ b/SOURCES/glibc-fedora.patch @@ -0,0 +1,2106 @@ +--- glibc-2.12-2-gc4ccff1/ChangeLog ++++ glibc-2.12-1/ChangeLog +@@ -241,6 +241,12 @@ + + * Makerules (libc-abis): Fix search for libc-abis in add-ons. + ++2010-04-06 Ulrich Drepper ++ ++ * sysdeps/posix/getaddrinfo.c (default_scopes): Assign global ++ scope to RFC 1918 addresses. ++ * posix/gai.conf: Document difference from RFC 3484. ++ + 2010-04-05 Thomas Schwinge + + * sysdeps/gnu/unwind-resume.c: New, moved from nptl/sysdeps/pthread/. +@@ -995,6 +1001,19 @@ + * sysdeps/x86_64/fpu/fegetenv.c: Likewise + * sysdeps/s390/fpu/fegetenv.c: Likewise. Remove unused headers. + ++2009-10-27 Aurelien Jarno ++ ++ [BZ #10855] ++ * locale/programs/locarchive.c: use MMAP_SHARED to reserve memory ++ used later with MMAP_FIXED | MMAP_SHARED to cope with different ++ alignment restrictions. ++ ++2010-02-08 Andreas Schwab ++ ++ [BZ #11155] ++ * sysdeps/unix/sysv/linux/sparc/sparc64/fxstat.c: Include i386 ++ version. ++ + 2010-02-05 H.J. Lu + + [BZ #11230] +@@ -2938,6 +2957,11 @@ d2009-10-30 Ulrich Drepper ++ ++ * Makeconfig (ASFLAGS): Append $(sysdep-ASFLAGS). ++ * sysdeps/i386/Makefile (sysdep-ASFLAGS): Add -U__i686. ++ + 2009-07-21 Ulrich Drepper + + * sysdeps/x86_64/multiarch/strstr.c: Minor cleanups. Remove +@@ -3203,6 +3227,11 @@ d2009-10-30 Ulrich Drepper ++ ++ * timezone/zic.c (stringzone): Don't try to generate a POSIX TZ ++ string when the timezone ends in DST. ++ + 2009-06-26 Ulrich Drepper + + * resolv/resolv.h: Define RES_SNGLKUPREOP. +@@ -11896,6 +11925,10 @@ d2009-10-30 Ulrich Drepper ++ ++ * locale/programs/locarchive.c (add_alias, insert_name): Remove static. ++ + 2007-04-16 Ulrich Drepper + + [BZ #4364] +@@ -13153,6 +13186,15 @@ d2009-10-30 Ulrich Drepper ++ ++ * sysdeps/unix/sysv/linux/netlinkaccess.h: Include linux/if_addr.h ++ if IFA_MAX is not defined. ++ (IFA_RTA, IFA_PAYLOAD, IFLA_RTA, IFLA_PAYLOAD): Define if not ++ defined. ++ * sysdeps/unix/sysv/linux/check_pf.c: Include netlinkaccess.h ++ instead of asm/types.h, linux/netlink.h and linux/rtnetlink.h. ++ + 2006-12-09 Ulrich Drepper + + [BZ #3632] +--- glibc-2.12-2-gc4ccff1/ChangeLog.15 ++++ glibc-2.12-1/ChangeLog.15 +@@ -477,6 +477,14 @@ + + 2004-11-26 Jakub Jelinek + ++ * posix/Makefile (generated: Add getconf.speclist. ++ ($(inst_libexecdir)/getconf): Use getconf.speclist instead of ++ getconf output. ++ ($(objpfx)getconf.speclist): New rule. ++ * posix/getconf.speclist.h: New file. ++ ++2004-11-26 Jakub Jelinek ++ + * sysdeps/generic/unsecvars.h (UNSECURE_ENVVARS): Add GETCONF_DIR. + + 2004-11-26 Kaz Kojima +@@ -1103,6 +1111,13 @@ + * sysdeps/generic/tempname.c (__path_search): Add missing argument + TRY_TMPDIR. + ++2004-11-02 Jakub Jelinek ++ ++ * include/features.h (__USE_FORTIFY_LEVEL): Also set for Red Hat ++ GCC 3.4.x-RH >= 3.4.2-8. ++ * debug/tst-chk1.c (do_test): Deal with GCC 3.4.x-RH not ++ being able to recognize subobjects. ++ + 2004-10-31 Mariusz Mazur + + * sysdeps/unix/sysv/linux/alpha/setregid.c: New file. +@@ -1443,6 +1458,11 @@ + * sysdeps/generic/readonly-area.c (__readonly_str): Renamed to ... + (__readonly_area): ... this. + ++2004-10-19 Jakub Jelinek ++ ++ * include/features.h (__USE_FORTIFY_LEVEL): Enable even with ++ Red Hat gcc4 4.0.0 and above. ++ + 2004-10-18 Jakub Jelinek + + * sysdeps/generic/strcpy_chk.c (__strcpy_chk): Speed up by checking +@@ -3182,6 +3202,23 @@ + before return type. + * locale/localename.c (__current_locale_name): Likewise. + ++2004-08-31 Jakub Jelinek ++ ++ * elf/ldconfig.c (parse_conf): Add prefix argument, prepend it ++ before arguments to add_dir and pass to parse_conf_include. ++ (parse_conf_include): Add prefix argument, pass it down to ++ parse_conf. ++ (main): Call arch_startup. Adjust parse_conf caller. ++ Call add_arch_dirs. ++ * sysdeps/generic/dl-cache.h (arch_startup, add_arch_dirs): Define. ++ * sysdeps/unix/sysv/linux/i386/dl-cache.h: New file. ++ * sysdeps/unix/sysv/linux/ia64/dl-cache.h (EMUL_HACK, arch_startup, ++ add_arch_dirs): Define. ++ * sysdeps/unix/sysv/linux/ia64/ldd-rewrite.sed: Prepend ++ /emul/ia32-linux before the 32-bit ld.so pathname. ++ * sysdeps/unix/sysv/linux/ia64/dl-procinfo.c: New file. ++ * sysdeps/unix/sysv/linux/ia64/dl-procinfo.h: New file. ++ + 2004-08-30 Roland McGrath + + * scripts/extract-abilist.awk: If `lastversion' variable defined, omit +--- glibc-2.12-2-gc4ccff1/ChangeLog.16 ++++ glibc-2.12-1/ChangeLog.16 +@@ -2042,6 +2042,9 @@ + (__MATHDECL_2): Use __REDIRECT_NTH instead of __REDIRECT + followed by __THROW. + ++ * sysdeps/unix/sysv/linux/futimesat.c (futimesat): If ++ file == NULL, use __futimes unconditionally. ++ + 2006-02-02 Ulrich Drepper + + * sysdeps/unix/sysv/linux/futimesat.c [__NR_futimesat] +@@ -2101,6 +2104,11 @@ + * sysdeps/ieee754/ldbl-128/s_llrintl.c (__llrintl): Fix a typo. + * sysdeps/s390/fpu/libm-test-ulps: Remove llrint ulps. + ++2006-01-30 Jakub Jelinek ++ ++ * include/bits/stdlib-ldbl.h: New file. ++ * include/bits/wchar-ldbl.h: New file. ++ + 2006-01-19 Thomas Schwinge + + * libio/genops.c: Include . +@@ -8922,6 +8930,12 @@ + * argp/argp-help.c (__argp_error): __asprintf -> vasprintf. + (__argp_failure): Likewise. + ++2005-08-08 Jakub Jelinek ++ ++ * sysdeps/unix/sysv/linux/dl-osinfo.h (_dl_setup_stack_chk_guard): ++ Shift marked &errno down on big-endian instead of up. ++ * elf/tst-stackguard1.c (do_test): Fix a typo. ++ + 2005-08-08 Ulrich Drepper + + * nscd/cache.c (cache_add): Commit hash table and header to disk. +@@ -9046,6 +9060,17 @@ + __syslog_chk. + * misc/Versions: Export __syslog_chk and __vsyslog_chk. + ++2005-07-29 Jakub Jelinek ++ ++ * sysdeps/unix/sysv/linux/dl-osinfo.h: Include errno.h, hp-timing.h, ++ endian.h. ++ (_dl_setup_stack_chk_guard): Even without ++ --enable-stackguard-randomization attempt to do some guard ++ randomization using hp-timing (if available) and kernel stack and ++ mmap randomization. ++ * elf/tst-stackguard1.c (do_test): Don't fail if the poor man's ++ randomization doesn't work well enough. ++ + 2005-07-28 Thomas Schwinge + + [BZ #1137] +--- glibc-2.12-2-gc4ccff1/Makeconfig ++++ glibc-2.12-1/Makeconfig +@@ -789,12 +789,12 @@ endif + # The assembler can generate debug information too. + ifndef ASFLAGS + ifeq ($(have-cpp-asm-debuginfo),yes) +-ASFLAGS := $(filter -g% -fdebug-prefix-map=%,$(CFLAGS)) ++ASFLAGS = $(filter -g% -fdebug-prefix-map=%,$(CFLAGS)) + else +-ASFLAGS := ++ASFLAGS = + endif + endif +-ASFLAGS += $(ASFLAGS-config) $(asflags-cpu) ++ASFLAGS += $(ASFLAGS-config) $(asflags-cpu) $(sysdep-ASFLAGS) + + ifndef BUILD_CC + BUILD_CC = $(CC) +--- glibc-2.12-2-gc4ccff1/csu/Makefile ++++ glibc-2.12-1/csu/Makefile +@@ -93,7 +93,8 @@ omit-deps += $(crtstuff) + $(crtstuff:%=$(objpfx)%.o): %.o: %.S $(objpfx)defs.h + $(compile.S) -g0 $(ASFLAGS-.os) -o $@ + +-CFLAGS-initfini.s = -g0 -fPIC -fno-inline-functions $(fno-unit-at-a-time) ++CFLAGS-initfini.s = -g0 -fPIC -fno-inline-functions $(fno-unit-at-a-time) \ ++ -fno-asynchronous-unwind-tables + + vpath initfini.c $(sysdirs) + +--- glibc-2.12-2-gc4ccff1/csu/elf-init.c ++++ glibc-2.12-1/csu/elf-init.c +@@ -63,6 +63,23 @@ extern void (*__init_array_end []) (int, + extern void (*__fini_array_start []) (void) attribute_hidden; + extern void (*__fini_array_end []) (void) attribute_hidden; + ++#if defined HAVE_VISIBILITY_ATTRIBUTE \ ++ && (defined SHARED || defined LIBC_NONSHARED) ++# define hidden_undef_2(x) #x ++# define hidden_undef_1(x) hidden_undef_2 (x) ++# define hidden_undef(x) \ ++ __asm (hidden_undef_1 (ASM_GLOBAL_DIRECTIVE) " " #x); \ ++ __asm (".hidden " #x); ++#else ++# define hidden_undef(x) ++#endif ++ ++hidden_undef (__preinit_array_start) ++hidden_undef (__preinit_array_end) ++hidden_undef (__init_array_start) ++hidden_undef (__init_array_end) ++hidden_undef (__fini_array_start) ++hidden_undef (__fini_array_end) + + /* These function symbols are provided for the .init/.fini section entry + points automagically by the linker. */ +--- glibc-2.12-2-gc4ccff1/debug/tst-chk1.c ++++ glibc-2.12-1/debug/tst-chk1.c +@@ -17,6 +17,9 @@ + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + ++/* Hack: make sure GCC doesn't know __chk_fail () will not return. */ ++#define __noreturn__ ++ + #include + #include + #include +@@ -242,7 +245,7 @@ do_test (void) + if (memcmp (a.buf1, "aabcdabcjj", 10)) + FAIL (); + +-#if __USE_FORTIFY_LEVEL < 2 ++#if __USE_FORTIFY_LEVEL < 2 || !__GNUC_PREREQ (4, 0) + /* The following tests are supposed to crash with -D_FORTIFY_SOURCE=2 + and sufficient GCC support, as the string operations overflow + from a.buf1 into a.buf2. */ +@@ -357,7 +360,7 @@ do_test (void) + memset (a.buf1 + 9, 'j', l0 + 2); + CHK_FAIL_END + +-# if __USE_FORTIFY_LEVEL >= 2 ++# if __USE_FORTIFY_LEVEL >= 2 && __GNUC_PREREQ (4, 0) + # define O 0 + # else + # define O 1 +--- glibc-2.12-2-gc4ccff1/elf/ldconfig.c ++++ glibc-2.12-1/elf/ldconfig.c +@@ -1031,17 +1031,19 @@ search_dirs (void) + + + static void parse_conf_include (const char *config_file, unsigned int lineno, +- bool do_chroot, const char *pattern); ++ const char *prefix, bool do_chroot, ++ const char *pattern); + + /* Parse configuration file. */ + static void +-parse_conf (const char *filename, bool do_chroot) ++parse_conf (const char *filename, const char *prefix, bool do_chroot) + { + FILE *file = NULL; + char *line = NULL; + const char *canon; + size_t len = 0; + unsigned int lineno; ++ size_t prefix_len = prefix ? strlen (prefix) : 0; + + if (do_chroot && opt_chroot) + { +@@ -1102,7 +1104,14 @@ parse_conf (const char *filename, bool d + cp += 8; + while ((dir = strsep (&cp, " \t")) != NULL) + if (dir[0] != '\0') +- parse_conf_include (filename, lineno, do_chroot, dir); ++ parse_conf_include (filename, lineno, prefix, do_chroot, dir); ++ } ++ else if (prefix != NULL) ++ { ++ size_t cp_len = strlen (cp); ++ char new_cp [prefix_len + cp_len + 1]; ++ memcpy (mempcpy (new_cp, prefix, prefix_len), cp, cp_len + 1); ++ add_dir (new_cp); + } + else if (!strncasecmp (cp, "hwcap", 5) && isblank (cp[5])) + { +@@ -1165,7 +1174,7 @@ parse_conf (const char *filename, bool d + config files to read. */ + static void + parse_conf_include (const char *config_file, unsigned int lineno, +- bool do_chroot, const char *pattern) ++ const char *prefix, bool do_chroot, const char *pattern) + { + if (opt_chroot && pattern[0] != '/') + error (EXIT_FAILURE, 0, +@@ -1197,7 +1206,7 @@ parse_conf_include (const char *config_f + { + case 0: + for (size_t i = 0; i < gl.gl_pathc; ++i) +- parse_conf (gl.gl_pathv[i], false); ++ parse_conf (gl.gl_pathv[i], prefix, false); + globfree64 (&gl); + break; + +@@ -1240,6 +1249,8 @@ main (int argc, char **argv) + /* Set the text message domain. */ + textdomain (_libc_intl_domainname); + ++ arch_startup (argc, argv); ++ + /* Parse and process arguments. */ + int remaining; + argp_parse (&argp, argc, argv, 0, &remaining, NULL); +@@ -1349,12 +1360,14 @@ main (int argc, char **argv) + + if (!opt_only_cline) + { +- parse_conf (config_file, true); ++ parse_conf (config_file, NULL, true); + + /* Always add the standard search paths. */ + add_system_dir (SLIBDIR); + if (strcmp (SLIBDIR, LIBDIR)) + add_system_dir (LIBDIR); ++ ++ add_arch_dirs (config_file); + } + + char *aux_cache_file = _PATH_LDCONFIG_AUX_CACHE; +--- glibc-2.12-2-gc4ccff1/elf/tst-stackguard1.c ++++ glibc-2.12-1/elf/tst-stackguard1.c +@@ -160,17 +160,21 @@ do_test (void) + the 16 runs, something is very wrong. */ + int ndifferences = 0; + int ndefaults = 0; ++ int npartlyrandomized = 0; + for (i = 0; i < N; ++i) + { + if (child_stack_chk_guards[i] != child_stack_chk_guards[i+1]) + ndifferences++; + else if (child_stack_chk_guards[i] == default_guard) + ndefaults++; ++ else if (*(char *) &child_stack_chk_guards[i] == 0) ++ npartlyrandomized++; + } + +- printf ("differences %d defaults %d\n", ndifferences, ndefaults); ++ printf ("differences %d defaults %d partly randomized %d\n", ++ ndifferences, ndefaults, npartlyrandomized); + +- if (ndifferences < N / 2 && ndefaults < N / 2) ++ if ((ndifferences + ndefaults + npartlyrandomized) < 3 * N / 4) + { + puts ("stack guard canaries are not randomized enough"); + puts ("nor equal to the default canary value"); +--- glibc-2.12-2-gc4ccff1/include/bits/stdlib-ldbl.h ++++ glibc-2.12-1/include/bits/stdlib-ldbl.h +@@ -0,0 +1 @@ ++#include +--- glibc-2.12-2-gc4ccff1/include/bits/wchar-ldbl.h ++++ glibc-2.12-1/include/bits/wchar-ldbl.h +@@ -0,0 +1 @@ ++#include +--- glibc-2.12-2-gc4ccff1/include/features.h ++++ glibc-2.12-1/include/features.h +@@ -308,8 +308,13 @@ + #endif + + #if defined _FORTIFY_SOURCE && _FORTIFY_SOURCE > 0 \ +- && __GNUC_PREREQ (4, 1) && defined __OPTIMIZE__ && __OPTIMIZE__ > 0 +-# if _FORTIFY_SOURCE > 1 ++ && defined __OPTIMIZE__ && __OPTIMIZE__ > 0 ++# if !__GNUC_PREREQ (4, 1) ++# ifdef __GNUC_RH_RELEASE__ ++# warning _FORTIFY_SOURCE supported only with GCC 4.1 and later ++# endif ++# define __USE_FORTIFY_LEVEL 0 ++# elif _FORTIFY_SOURCE > 1 + # define __USE_FORTIFY_LEVEL 2 + # else + # define __USE_FORTIFY_LEVEL 1 +--- glibc-2.12-2-gc4ccff1/intl/locale.alias ++++ glibc-2.12-1/intl/locale.alias +@@ -57,8 +57,6 @@ korean ko_KR.eucKR + korean.euc ko_KR.eucKR + ko_KR ko_KR.eucKR + lithuanian lt_LT.ISO-8859-13 +-no_NO nb_NO.ISO-8859-1 +-no_NO.ISO-8859-1 nb_NO.ISO-8859-1 + norwegian nb_NO.ISO-8859-1 + nynorsk nn_NO.ISO-8859-1 + polish pl_PL.ISO-8859-2 +--- glibc-2.12-2-gc4ccff1/libio/stdio.h ++++ glibc-2.12-1/libio/stdio.h +@@ -165,10 +165,12 @@ typedef _G_fpos64_t fpos64_t; + extern struct _IO_FILE *stdin; /* Standard input stream. */ + extern struct _IO_FILE *stdout; /* Standard output stream. */ + extern struct _IO_FILE *stderr; /* Standard error output stream. */ ++#ifdef __STDC__ + /* C89/C99 say they're macros. Make them happy. */ + #define stdin stdin + #define stdout stdout + #define stderr stderr ++#endif + + __BEGIN_NAMESPACE_STD + /* Remove file FILENAME. */ +--- glibc-2.12-2-gc4ccff1/locale/iso-4217.def ++++ glibc-2.12-1/locale/iso-4217.def +@@ -8,6 +8,7 @@ + * + * !!! The list has to be sorted !!! + */ ++DEFINE_INT_CURR("ADP") /* Andorran Peseta -> EUR */ + DEFINE_INT_CURR("AED") /* United Arab Emirates Dirham */ + DEFINE_INT_CURR("AFN") /* Afghanistan Afgani */ + DEFINE_INT_CURR("ALL") /* Albanian Lek */ +@@ -15,12 +16,14 @@ DEFINE_INT_CURR("AMD") /* Armenia Dram + DEFINE_INT_CURR("ANG") /* Netherlands Antilles */ + DEFINE_INT_CURR("AOA") /* Angolan Kwanza */ + DEFINE_INT_CURR("ARS") /* Argentine Peso */ ++DEFINE_INT_CURR("ATS") /* Austrian Schilling -> EUR */ + DEFINE_INT_CURR("AUD") /* Australian Dollar */ + DEFINE_INT_CURR("AWG") /* Aruba Guilder */ + DEFINE_INT_CURR("AZM") /* Azerbaijan Manat */ + DEFINE_INT_CURR("BAM") /* Bosnian and Herzegovina Convertible Mark */ + DEFINE_INT_CURR("BBD") /* Barbados Dollar */ + DEFINE_INT_CURR("BDT") /* Bangladesh Taka */ ++DEFINE_INT_CURR("BEF") /* Belgian Franc -> EUR */ + DEFINE_INT_CURR("BGN") /* Bulgarian Lev */ + DEFINE_INT_CURR("BHD") /* Bahraini Dinar */ + DEFINE_INT_CURR("BIF") /* Burundi Franc */ +@@ -44,6 +47,7 @@ DEFINE_INT_CURR("CUP") /* Cuban Peso * + DEFINE_INT_CURR("CVE") /* Cape Verde Escudo */ + DEFINE_INT_CURR("CYP") /* Cypriot Pound */ + DEFINE_INT_CURR("CZK") /* Czech Koruna */ ++DEFINE_INT_CURR("DEM") /* German Mark -> EUR */ + DEFINE_INT_CURR("DJF") /* Djibouti Franc */ + DEFINE_INT_CURR("DKK") /* Danish Krone (Faroe Islands, Greenland) */ + DEFINE_INT_CURR("DOP") /* Dominican Republic */ +@@ -51,16 +55,20 @@ DEFINE_INT_CURR("DZD") /* Algerian Dina + DEFINE_INT_CURR("EEK") /* Estonian Kroon */ + DEFINE_INT_CURR("EGP") /* Egyptian Pound */ + DEFINE_INT_CURR("ERN") /* Eritrean Nakfa */ ++DEFINE_INT_CURR("ESP") /* Spanish Peseta -> EUR */ + DEFINE_INT_CURR("ETB") /* Ethiopian Birr */ + DEFINE_INT_CURR("EUR") /* European Union Euro */ ++DEFINE_INT_CURR("FIM") /* Finnish Markka -> EUR */ + DEFINE_INT_CURR("FJD") /* Fiji Dollar */ + DEFINE_INT_CURR("FKP") /* Falkland Islands Pound (Malvinas) */ ++DEFINE_INT_CURR("FRF") /* French Franc -> EUR */ + DEFINE_INT_CURR("GBP") /* British Pound */ + DEFINE_INT_CURR("GEL") /* Georgia Lari */ + DEFINE_INT_CURR("GHC") /* Ghana Cedi */ + DEFINE_INT_CURR("GIP") /* Gibraltar Pound */ + DEFINE_INT_CURR("GMD") /* Gambian Dalasi */ + DEFINE_INT_CURR("GNF") /* Guinea Franc */ ++DEFINE_INT_CURR("GRD") /* Greek Drachma -> EUR */ + DEFINE_INT_CURR("GTQ") /* Guatemala Quetzal */ + DEFINE_INT_CURR("GYD") /* Guyana Dollar */ + DEFINE_INT_CURR("HKD") /* Hong Kong Dollar */ +@@ -69,12 +77,14 @@ DEFINE_INT_CURR("HRK") /* Croatia Kuna + DEFINE_INT_CURR("HTG") /* Haiti Gourde */ + DEFINE_INT_CURR("HUF") /* Hungarian Forint */ + DEFINE_INT_CURR("IDR") /* Indonesia Rupiah */ ++DEFINE_INT_CURR("IEP") /* Irish Pound -> EUR */ + DEFINE_INT_CURR("ILS") /* Israeli Shekel */ + DEFINE_INT_CURR("IMP") /* Isle of Man Pounds */ + DEFINE_INT_CURR("INR") /* Indian Rupee (Bhutan) */ + DEFINE_INT_CURR("IQD") /* Iraqi Dinar */ + DEFINE_INT_CURR("IRR") /* Iranian Rial */ + DEFINE_INT_CURR("ISK") /* Iceland Krona */ ++DEFINE_INT_CURR("ITL") /* Italian Lira -> EUR */ + DEFINE_INT_CURR("JEP") /* Jersey Pound */ + DEFINE_INT_CURR("JMD") /* Jamaican Dollar */ + DEFINE_INT_CURR("JOD") /* Jordanian Dinar */ +@@ -94,6 +104,7 @@ DEFINE_INT_CURR("LKR") /* Sri Lankan Ru + DEFINE_INT_CURR("LRD") /* Liberian Dollar */ + DEFINE_INT_CURR("LSL") /* Lesotho Maloti */ + DEFINE_INT_CURR("LTL") /* Lithuanian Litas */ ++DEFINE_INT_CURR("LUF") /* Luxembourg Franc -> EUR */ + DEFINE_INT_CURR("LVL") /* Latvia Lat */ + DEFINE_INT_CURR("LYD") /* Libyan Arab Jamahiriya Dinar */ + DEFINE_INT_CURR("MAD") /* Moroccan Dirham */ +@@ -114,6 +125,7 @@ DEFINE_INT_CURR("MZM") /* Mozambique Me + DEFINE_INT_CURR("NAD") /* Namibia Dollar */ + DEFINE_INT_CURR("NGN") /* Nigeria Naira */ + DEFINE_INT_CURR("NIO") /* Nicaragua Cordoba Oro */ ++DEFINE_INT_CURR("NLG") /* Netherlands Guilder -> EUR */ + DEFINE_INT_CURR("NOK") /* Norwegian Krone */ + DEFINE_INT_CURR("NPR") /* Nepalese Rupee */ + DEFINE_INT_CURR("NZD") /* New Zealand Dollar */ +@@ -124,6 +136,7 @@ DEFINE_INT_CURR("PGK") /* Papau New Gui + DEFINE_INT_CURR("PHP") /* Philippines Peso */ + DEFINE_INT_CURR("PKR") /* Pakistan Rupee */ + DEFINE_INT_CURR("PLN") /* Polish Zloty */ ++DEFINE_INT_CURR("PTE") /* Portugese Escudo -> EUR */ + DEFINE_INT_CURR("PYG") /* Paraguay Guarani */ + DEFINE_INT_CURR("QAR") /* Qatar Rial */ + DEFINE_INT_CURR("ROL") /* Romanian Leu */ +--- glibc-2.12-2-gc4ccff1/locale/programs/locarchive.c ++++ glibc-2.12-1/locale/programs/locarchive.c +@@ -134,7 +134,7 @@ create_archive (const char *archivefname + size_t reserved = RESERVE_MMAP_SIZE; + int xflags = 0; + if (total < reserved +- && ((p = mmap64 (NULL, reserved, PROT_NONE, MAP_PRIVATE | MAP_ANON, ++ && ((p = mmap64 (NULL, reserved, PROT_NONE, MAP_SHARED | MAP_ANON, + -1, 0)) != MAP_FAILED)) + xflags = MAP_FIXED; + else +@@ -241,9 +241,9 @@ oldlocrecentcmp (const void *a, const vo + /* forward decls for below */ + static uint32_t add_locale (struct locarhandle *ah, const char *name, + locale_data_t data, bool replace); +-static void add_alias (struct locarhandle *ah, const char *alias, +- bool replace, const char *oldname, +- uint32_t *locrec_offset_p); ++void add_alias (struct locarhandle *ah, const char *alias, ++ bool replace, const char *oldname, ++ uint32_t *locrec_offset_p); + + + static bool +@@ -396,7 +396,7 @@ enlarge_archive (struct locarhandle *ah, + size_t reserved = RESERVE_MMAP_SIZE; + int xflags = 0; + if (total < reserved +- && ((p = mmap64 (NULL, reserved, PROT_NONE, MAP_PRIVATE | MAP_ANON, ++ && ((p = mmap64 (NULL, reserved, PROT_NONE, MAP_SHARED | MAP_ANON, + -1, 0)) != MAP_FAILED)) + xflags = MAP_FIXED; + else +@@ -614,7 +614,7 @@ open_archive (struct locarhandle *ah, bo + int xflags = 0; + void *p; + if (st.st_size < reserved +- && ((p = mmap64 (NULL, reserved, PROT_NONE, MAP_PRIVATE | MAP_ANON, ++ && ((p = mmap64 (NULL, reserved, PROT_NONE, MAP_SHARED | MAP_ANON, + -1, 0)) != MAP_FAILED)) + xflags = MAP_FIXED; + else +@@ -649,7 +649,7 @@ close_archive (struct locarhandle *ah) + #include "../../intl/explodename.c" + #include "../../intl/l10nflist.c" + +-static struct namehashent * ++struct namehashent * + insert_name (struct locarhandle *ah, + const char *name, size_t name_len, bool replace) + { +@@ -707,7 +707,7 @@ insert_name (struct locarhandle *ah, + return &namehashtab[idx]; + } + +-static void ++void + add_alias (struct locarhandle *ah, const char *alias, bool replace, + const char *oldname, uint32_t *locrec_offset_p) + { +--- glibc-2.12-2-gc4ccff1/localedata/Makefile ++++ glibc-2.12-1/localedata/Makefile +@@ -227,6 +227,7 @@ $(INSTALL-SUPPORTED-LOCALES): install-lo + echo -n '...'; \ + input=`echo $$locale | sed 's/\([^.]*\)[^@]*\(.*\)/\1\2/'`; \ + $(LOCALEDEF) --alias-file=../intl/locale.alias \ ++ --no-archive \ + -i locales/$$input -c -f charmaps/$$charset \ + $(addprefix --prefix=,$(install_root)) $$locale; \ + echo ' done'; \ +--- glibc-2.12-2-gc4ccff1/localedata/SUPPORTED ++++ glibc-2.12-1/localedata/SUPPORTED +@@ -85,6 +85,7 @@ cy_GB.UTF-8/UTF-8 \ + cy_GB/ISO-8859-14 \ + da_DK.UTF-8/UTF-8 \ + da_DK/ISO-8859-1 \ ++da_DK.ISO-8859-15/ISO-8859-15 \ + de_AT.UTF-8/UTF-8 \ + de_AT/ISO-8859-1 \ + de_AT@euro/ISO-8859-15 \ +@@ -116,6 +117,7 @@ en_DK.UTF-8/UTF-8 \ + en_DK/ISO-8859-1 \ + en_GB.UTF-8/UTF-8 \ + en_GB/ISO-8859-1 \ ++en_GB.ISO-8859-15/ISO-8859-15 \ + en_HK.UTF-8/UTF-8 \ + en_HK/ISO-8859-1 \ + en_IE.UTF-8/UTF-8 \ +@@ -131,6 +133,7 @@ en_SG.UTF-8/UTF-8 \ + en_SG/ISO-8859-1 \ + en_US.UTF-8/UTF-8 \ + en_US/ISO-8859-1 \ ++en_US.ISO-8859-15/ISO-8859-15 \ + en_ZA.UTF-8/UTF-8 \ + en_ZA/ISO-8859-1 \ + en_ZW.UTF-8/UTF-8 \ +@@ -307,6 +310,8 @@ nl_NL/ISO-8859-1 \ + nl_NL@euro/ISO-8859-15 \ + nn_NO.UTF-8/UTF-8 \ + nn_NO/ISO-8859-1 \ ++no_NO.UTF-8/UTF-8 \ ++no_NO/ISO-8859-1 \ + nr_ZA/UTF-8 \ + nso_ZA/UTF-8 \ + oc_FR.UTF-8/UTF-8 \ +@@ -367,6 +372,7 @@ sv_FI/ISO-8859-1 \ + sv_FI@euro/ISO-8859-15 \ + sv_SE.UTF-8/UTF-8 \ + sv_SE/ISO-8859-1 \ ++sv_SE.ISO-8859-15/ISO-8859-15 \ + ta_IN/UTF-8 \ + te_IN/UTF-8 \ + tg_TJ.UTF-8/UTF-8 \ +--- glibc-2.12-2-gc4ccff1/localedata/locales/cy_GB ++++ glibc-2.12-1/localedata/locales/cy_GB +@@ -248,8 +248,11 @@ mon "" + d_fmt "" + t_fmt "" +-am_pm "";"" +-t_fmt_ampm "" ++am_pm "";"" ++t_fmt_ampm "" ++date_fmt "/ ++/ ++" + END LC_TIME + + LC_MESSAGES +--- glibc-2.12-2-gc4ccff1/localedata/locales/en_GB ++++ glibc-2.12-1/localedata/locales/en_GB +@@ -116,8 +116,8 @@ mon "" + d_fmt "" + t_fmt "" +-am_pm "";"" +-t_fmt_ampm "" ++am_pm "";"" ++t_fmt_ampm "" + date_fmt "/ + / + " +--- glibc-2.12-2-gc4ccff1/localedata/locales/no_NO ++++ glibc-2.12-1/localedata/locales/no_NO +@@ -0,0 +1,69 @@ ++escape_char / ++comment_char % ++ ++% Norwegian language locale for Norway ++% Source: Norsk Standardiseringsforbund ++% Address: University Library, ++% Drammensveien 41, N-9242 Oslo, Norge ++% Contact: Kolbjoern Aamboe ++% Tel: +47 - 22859109 ++% Fax: +47 - 22434497 ++% Email: kolbjorn.aambo@usit.uio.no ++% Language: no ++% Territory: NO ++% Revision: 4.3 ++% Date: 1996-10-15 ++% Application: general ++% Users: general ++% Repertoiremap: mnemonic.ds ++% Charset: ISO-8859-1 ++% Distribution and use is free, also ++% for commercial purposes. ++ ++LC_IDENTIFICATION ++copy "nb_NO" ++END LC_IDENTIFICATION ++ ++LC_COLLATE ++copy "nb_NO" ++END LC_COLLATE ++ ++LC_CTYPE ++copy "nb_NO" ++END LC_CTYPE ++ ++LC_MONETARY ++copy "nb_NO" ++END LC_MONETARY ++ ++LC_NUMERIC ++copy "nb_NO" ++END LC_NUMERIC ++ ++LC_TIME ++copy "nb_NO" ++END LC_TIME ++ ++LC_MESSAGES ++copy "nb_NO" ++END LC_MESSAGES ++ ++LC_PAPER ++copy "nb_NO" ++END LC_PAPER ++ ++LC_TELEPHONE ++copy "nb_NO" ++END LC_TELEPHONE ++ ++LC_MEASUREMENT ++copy "nb_NO" ++END LC_MEASUREMENT ++ ++LC_NAME ++copy "nb_NO" ++END LC_NAME ++ ++LC_ADDRESS ++copy "nb_NO" ++END LC_ADDRESS +--- glibc-2.12-2-gc4ccff1/localedata/locales/zh_TW ++++ glibc-2.12-1/localedata/locales/zh_TW +@@ -1,7 +1,7 @@ + comment_char % + escape_char / + % +-% Chinese language locale for Taiwan R.O.C. ++% Chinese language locale for Taiwan + % charmap: BIG5-CP950 + % + % Original Author: +@@ -17,7 +17,7 @@ escape_char / + % Reference: http://wwwold.dkuug.dk/JTC1/SC22/WG20/docs/n690.pdf + + LC_IDENTIFICATION +-title "Chinese locale for Taiwan R.O.C." ++title "Chinese locale for Taiwan" + source "" + address "" + contact "" +@@ -25,7 +25,7 @@ email "bug-glibc-locales@gnu.org" + tel "" + fax "" + language "Chinese" +-territory "Taiwan R.O.C." ++territory "Taiwan" + revision "0.2" + date "2000-08-02" + % +--- glibc-2.12-2-gc4ccff1/malloc/mcheck.c ++++ glibc-2.12-1/malloc/mcheck.c +@@ -24,9 +24,25 @@ + # include + # include + # include ++# include + # include + #endif + ++#ifdef _LIBC ++extern __typeof (malloc) __libc_malloc; ++extern __typeof (free) __libc_free; ++extern __typeof (realloc) __libc_realloc; ++libc_hidden_proto (__libc_malloc) ++libc_hidden_proto (__libc_realloc) ++libc_hidden_proto (__libc_free) ++libc_hidden_proto (__libc_memalign) ++#else ++# define __libc_malloc(sz) malloc (sz) ++# define __libc_free(ptr) free (ptr) ++# define __libc_realloc(ptr, sz) realloc (ptr, sz) ++# define __libc_memalign(al, sz) memalign (al, sz) ++#endif ++ + /* Old hook values. */ + static void (*old_free_hook) (__ptr_t ptr, __const __ptr_t); + static __ptr_t (*old_malloc_hook) (__malloc_size_t size, const __ptr_t); +@@ -197,7 +213,7 @@ freehook (__ptr_t ptr, const __ptr_t cal + if (old_free_hook != NULL) + (*old_free_hook) (ptr, caller); + else +- free (ptr); ++ __libc_free (ptr); + __free_hook = freehook; + } + +@@ -214,7 +230,7 @@ mallochook (__malloc_size_t size, const + hdr = (struct hdr *) (*old_malloc_hook) (sizeof (struct hdr) + size + 1, + caller); + else +- hdr = (struct hdr *) malloc (sizeof (struct hdr) + size + 1); ++ hdr = (struct hdr *) __libc_malloc (sizeof (struct hdr) + size + 1); + __malloc_hook = mallochook; + if (hdr == NULL) + return NULL; +@@ -245,7 +261,7 @@ memalignhook (__malloc_size_t alignment, + if (old_memalign_hook != NULL) + block = (*old_memalign_hook) (alignment, slop + size + 1, caller); + else +- block = memalign (alignment, slop + size + 1); ++ block = __libc_memalign (alignment, slop + size + 1); + __memalign_hook = memalignhook; + if (block == NULL) + return NULL; +@@ -300,8 +316,8 @@ reallochook (__ptr_t ptr, __malloc_size_ + sizeof (struct hdr) + size + 1, + caller); + else +- hdr = (struct hdr *) realloc ((__ptr_t) hdr, +- sizeof (struct hdr) + size + 1); ++ hdr = (struct hdr *) __libc_realloc ((__ptr_t) hdr, ++ sizeof (struct hdr) + size + 1); + __free_hook = freehook; + __malloc_hook = mallochook; + __memalign_hook = memalignhook; +@@ -361,8 +377,8 @@ mcheck (func) + if (__malloc_initialized <= 0 && !mcheck_used) + { + /* We call malloc() once here to ensure it is initialized. */ +- void *p = malloc (0); +- free (p); ++ void *p = __libc_malloc (0); ++ __libc_free (p); + + old_free_hook = __free_hook; + __free_hook = freehook; +--- glibc-2.12-2-gc4ccff1/manual/libc.texinfo ++++ glibc-2.12-1/manual/libc.texinfo +@@ -5,7 +5,7 @@ + @c setchapternewpage odd + + @comment Tell install-info what to do. +-@dircategory Software libraries ++@dircategory Libraries + @direntry + * Libc: (libc). C library. + @end direntry +--- glibc-2.12-2-gc4ccff1/misc/sys/cdefs.h ++++ glibc-2.12-1/misc/sys/cdefs.h +@@ -132,7 +132,10 @@ + #define __bos(ptr) __builtin_object_size (ptr, __USE_FORTIFY_LEVEL > 1) + #define __bos0(ptr) __builtin_object_size (ptr, 0) + +-#if __GNUC_PREREQ (4,3) ++#if __GNUC_PREREQ (4,3) \ ++ || (defined __GNUC_RH_RELEASE__ && __GNUC__ == 4 \ ++ && __GNUC_MINOR__ == 1 && __GNUC_PATCHLEVEL__ == 2 \ ++ && __GNUC_RH_RELEASE__ >= 31) + # define __warndecl(name, msg) \ + extern void name (void) __attribute__((__warning__ (msg))) + # define __warnattr(msg) __attribute__((__warning__ (msg))) +@@ -291,10 +294,16 @@ + + /* GCC 4.3 and above with -std=c99 or -std=gnu99 implements ISO C99 + inline semantics, unless -fgnu89-inline is used. */ +-#if !defined __cplusplus || __GNUC_PREREQ (4,3) ++#if !defined __cplusplus || __GNUC_PREREQ (4,3) \ ++ || (defined __GNUC_RH_RELEASE__ && __GNUC__ == 4 \ ++ && __GNUC_MINOR__ == 1 && __GNUC_PATCHLEVEL__ == 2 \ ++ && __GNUC_RH_RELEASE__ >= 31) + # if defined __GNUC_STDC_INLINE__ || defined __cplusplus + # define __extern_inline extern __inline __attribute__ ((__gnu_inline__)) +-# if __GNUC_PREREQ (4,3) ++# if __GNUC_PREREQ (4,3) \ ++ || (defined __GNUC_RH_RELEASE__ && __GNUC__ == 4 \ ++ && __GNUC_MINOR__ == 1 && __GNUC_PATCHLEVEL__ == 2 \ ++ && __GNUC_RH_RELEASE__ >= 31) + # define __extern_always_inline \ + extern __always_inline __attribute__ ((__gnu_inline__, __artificial__)) + # else +@@ -314,7 +323,10 @@ + + /* GCC 4.3 and above allow passing all anonymous arguments of an + __extern_always_inline function to some other vararg function. */ +-#if __GNUC_PREREQ (4,3) ++#if __GNUC_PREREQ (4,3) \ ++ || (defined __GNUC_RH_RELEASE__ && __GNUC__ == 4 \ ++ && __GNUC_MINOR__ == 1 && __GNUC_PATCHLEVEL__ == 2 \ ++ && __GNUC_RH_RELEASE__ >= 31) + # define __va_arg_pack() __builtin_va_arg_pack () + # define __va_arg_pack_len() __builtin_va_arg_pack_len () + #endif +--- glibc-2.12-2-gc4ccff1/nis/nss ++++ glibc-2.12-1/nis/nss +@@ -25,7 +25,7 @@ + # memory with every getXXent() call. Otherwise each getXXent() call + # might result into a network communication with the server to get + # the next entry. +-#SETENT_BATCH_READ=TRUE ++SETENT_BATCH_READ=TRUE + # + # ADJUNCT_AS_SHADOW + # If set to TRUE, the passwd routines in the NIS NSS module will not +--- glibc-2.12-2-gc4ccff1/nptl/ChangeLog ++++ glibc-2.12-1/nptl/ChangeLog +@@ -3884,6 +3884,15 @@ + Use __sigfillset. Document that sigfillset does the right thing wrt + to SIGSETXID. + ++2005-08-08 Jakub Jelinek ++ ++ * tst-stackguard1.c (do_test): Likewise. ++ ++2005-07-29 Jakub Jelinek ++ ++ * tst-stackguard1.c (do_test): Don't fail if the poor man's ++ randomization doesn't work well enough. ++ + 2005-07-11 Jakub Jelinek + + [BZ #1102] +@@ -4620,6 +4629,11 @@ + Move definition inside libpthread, libc, librt check. Provide + definition for rtld. + ++2004-09-02 Jakub Jelinek ++ ++ * pthread_cond_destroy.c (__pthread_cond_destroy): If there are ++ waiters, awake all waiters on the associated mutex. ++ + 2004-09-02 Ulrich Drepper + + * sysdeps/alpha/jmpbuf-unwind.h: Define __libc_unwind_longjmp. +@@ -6694,6 +6708,11 @@ + + * Makefile [$(build-shared) = yes] (tests): Depend on $(test-modules). + ++2003-07-22 Jakub Jelinek ++ ++ * descr.h: Don't include lowlevellock.h, pthreaddef.h and dl-sysdep.h ++ if __need_struct_pthread_size, instead define lll_lock_t. ++ + 2003-07-25 Jakub Jelinek + + * tst-cancel17.c (do_test): Check if aio_cancel failed. +--- glibc-2.12-2-gc4ccff1/nptl/Makefile ++++ glibc-2.12-1/nptl/Makefile +@@ -341,7 +341,8 @@ endif + extra-objs += $(crti-objs) $(crtn-objs) + omit-deps += crti crtn + +-CFLAGS-pt-initfini.s = -g0 -fPIC -fno-inline-functions $(fno-unit-at-a-time) ++CFLAGS-pt-initfini.s = -g0 -fPIC -fno-inline-functions $(fno-unit-at-a-time) \ ++ -fno-asynchronous-unwind-tables + endif + + CFLAGS-flockfile.c = -D_IO_MTSAFE_IO +@@ -527,15 +528,19 @@ $(addprefix $(objpfx), \ + $(tests) $(xtests) $(test-srcs))): $(objpfx)libpthread.so \ + $(objpfx)libpthread_nonshared.a + $(objpfx)tst-unload: $(common-objpfx)dlfcn/libdl.so +-# $(objpfx)../libc.so is used instead of $(common-objpfx)libc.so, ++# $(objpfx)linklibc.so is used instead of $(common-objpfx)libc.so, + # since otherwise libpthread.so comes before libc.so when linking. + $(addprefix $(objpfx), $(tests-reverse)): \ +- $(objpfx)../libc.so $(objpfx)libpthread.so \ ++ $(objpfx)linklibc.so $(objpfx)libpthread.so \ + $(objpfx)libpthread_nonshared.a + $(objpfx)../libc.so: $(common-objpfx)libc.so ; + $(addprefix $(objpfx),$(tests-static) $(xtests-static)): $(objpfx)libpthread.a + + $(objpfx)tst-atfork2.out: $(objpfx)tst-atfork2mod.so ++ ++$(objpfx)linklibc.so: $(common-objpfx)libc.so ++ ln -s ../libc.so $@ ++generated += libclink.so + else + $(addprefix $(objpfx),$(tests) $(test-srcs)): $(objpfx)libpthread.a + endif +--- glibc-2.12-2-gc4ccff1/nptl/sysdeps/unix/sysv/linux/bits/posix_opt.h ++++ glibc-2.12-1/nptl/sysdeps/unix/sysv/linux/bits/posix_opt.h +@@ -189,4 +189,7 @@ + /* Typed memory objects are not available. */ + #define _POSIX_TYPED_MEMORY_OBJECTS -1 + ++/* Streams are not available. */ ++#define _XOPEN_STREAMS -1 ++ + #endif /* bits/posix_opt.h */ +--- glibc-2.12-2-gc4ccff1/nptl/sysdeps/unix/sysv/linux/kernel-features.h ++++ glibc-2.12-1/nptl/sysdeps/unix/sysv/linux/kernel-features.h +@@ -0,0 +1,6 @@ ++#include_next ++ ++/* NPTL can always assume all clone thread flags work. */ ++#ifndef __ASSUME_CLONE_THREAD_FLAGS ++# define __ASSUME_CLONE_THREAD_FLAGS 1 ++#endif +--- glibc-2.12-2-gc4ccff1/nptl/tst-stackguard1.c ++++ glibc-2.12-1/nptl/tst-stackguard1.c +@@ -190,17 +190,21 @@ do_test (void) + the 16 runs, something is very wrong. */ + int ndifferences = 0; + int ndefaults = 0; ++ int npartlyrandomized = 0; + for (i = 0; i < N; ++i) + { + if (child_stack_chk_guards[i] != child_stack_chk_guards[i+1]) + ndifferences++; + else if (child_stack_chk_guards[i] == default_guard) + ndefaults++; ++ else if (*(char *) &child_stack_chk_guards[i] == 0) ++ npartlyrandomized++; + } + +- printf ("differences %d defaults %d\n", ndifferences, ndefaults); ++ printf ("differences %d defaults %d partly randomized %d\n", ++ ndifferences, ndefaults, npartlyrandomized); + +- if (ndifferences < N / 2 && ndefaults < N / 2) ++ if ((ndifferences + ndefaults + npartlyrandomized) < 3 * N / 4) + { + puts ("stack guard canaries are not randomized enough"); + puts ("nor equal to the default canary value"); +--- glibc-2.12-2-gc4ccff1/nscd/nscd.conf ++++ glibc-2.12-1/nscd/nscd.conf +@@ -33,7 +33,7 @@ + # logfile /var/log/nscd.log + # threads 4 + # max-threads 32 +-# server-user nobody ++ server-user nscd + # stat-user somebody + debug-level 0 + # reload-count 5 +--- glibc-2.12-2-gc4ccff1/nscd/nscd.init ++++ glibc-2.12-1/nscd/nscd.init +@@ -9,6 +9,7 @@ + # slow naming services like NIS, NIS+, LDAP, or hesiod. + # processname: /usr/sbin/nscd + # config: /etc/nscd.conf ++# config: /etc/sysconfig/nscd + # + ### BEGIN INIT INFO + # Provides: nscd +@@ -28,20 +29,8 @@ + # Source function library. + . /etc/init.d/functions + +-# nscd does not run on any kernel lower than 2.2.0 because of threading +-# problems, so we require that in first place. +-case $(uname -r) in +- 2.[2-9].*) +- # this is okay +- ;; +- [3-9]*) +- # these are of course also okay +- ;; +- *) +- #this is not +- exit 1 +- ;; +-esac ++# Source an auxiliary options file if we have one, and pick up NSCD_OPTIONS. ++[ -r /etc/sysconfig/nscd ] && . /etc/sysconfig/nscd + + RETVAL=0 + prog=nscd +@@ -50,7 +39,7 @@ start () { + [ -d /var/run/nscd ] || mkdir /var/run/nscd + [ -d /var/db/nscd ] || mkdir /var/db/nscd + echo -n $"Starting $prog: " +- daemon /usr/sbin/nscd ++ daemon /usr/sbin/nscd $NSCD_OPTIONS + RETVAL=$? + echo + [ $RETVAL -eq 0 ] && touch /var/lock/subsys/nscd +@@ -83,7 +72,7 @@ restart() { + # See how we were called. + case "$1" in + start) +- start ++ [ -e /var/lock/subsys/nscd ] || start + RETVAL=$? + ;; + stop) +@@ -99,14 +88,17 @@ case "$1" in + RETVAL=$? + ;; + try-restart | condrestart) +- [ -e /var/lock/subsys/nscd ] && restart ++ [ ! -e /var/lock/subsys/nscd ] || restart + RETVAL=$? + ;; + force-reload | reload) + echo -n $"Reloading $prog: " +- killproc /usr/sbin/nscd -HUP +- RETVAL=$? +- echo ++ RETVAL=0 ++ /usr/sbin/nscd -i passwd || RETVAL=$? ++ /usr/sbin/nscd -i group || RETVAL=$? ++ /usr/sbin/nscd -i hosts || RETVAL=$? ++ /usr/sbin/nscd -i services || RETVAL=$? ++ echo + ;; + *) + echo $"Usage: $0 {start|stop|status|restart|reload|condrestart}" +--- glibc-2.12-2-gc4ccff1/posix/Makefile ++++ glibc-2.12-1/posix/Makefile +@@ -305,15 +305,8 @@ $(inst_libexecdir)/getconf: $(inst_bindi + mv -f $@/$$spec.new $@/$$spec; \ + done < $(objpfx)getconf.speclist + +-$(objpfx)getconf.speclist: $(objpfx)getconf +-ifeq (no,$(cross-compiling)) +- LC_ALL=C GETCONF_DIR=/dev/null \ +- $(run-program-prefix) $< _POSIX_V7_WIDTH_RESTRICTED_ENVS > $@.new +- LC_ALL=C GETCONF_DIR=/dev/null \ +- $(run-program-prefix) $< _POSIX_V6_WIDTH_RESTRICTED_ENVS >> $@.new +- LC_ALL=C GETCONF_DIR=/dev/null \ +- $(run-program-prefix) $< _XBS5_WIDTH_RESTRICTED_ENVS >> $@.new +-else +- > $@.new +-endif ++$(objpfx)getconf.speclist: getconf.speclist.h ++ $(CC) -E $(CFLAGS) $(CPPFLAGS) $< \ ++ | sed -n -e '/START_OF_STRINGS/,$${/\(POSIX_V[67]\|_XBS5\)_/{s/^[^"]*"//;s/".*$$//;p}}' \ ++ > $@.new + mv -f $@.new $@ +--- glibc-2.12-2-gc4ccff1/posix/gai.conf ++++ glibc-2.12-1/posix/gai.conf +@@ -41,7 +41,7 @@ + # + # precedence + # Add another rule to the RFC 3484 precedence table. See section 2.1 +-# and 10.3 in RFC 3484. The default is: ++# and 10.3 in RFC 3484. The RFC requires: + # + #precedence ::1/128 50 + #precedence ::/0 40 +@@ -58,7 +58,7 @@ + # Add another rule to the RFC 3484 scope table for IPv4 addresses. + # By default the scope IDs described in section 3.2 in RFC 3484 are + # used. Changing these defaults should hardly ever be necessary. +-# The defaults are equivalent to: ++# The definitions in RFC 1918 are equivalent to: + # + #scopev4 ::ffff:169.254.0.0/112 2 + #scopev4 ::ffff:127.0.0.0/104 2 +@@ -75,3 +75,5 @@ + #scopev4 ::ffff:169.254.0.0/112 2 + #scopev4 ::ffff:127.0.0.0/104 2 + #scopev4 ::ffff:0.0.0.0/96 14 ++# ++# This is what the Red Hat setting currently uses. +--- glibc-2.12-2-gc4ccff1/posix/getconf.speclist.h ++++ glibc-2.12-1/posix/getconf.speclist.h +@@ -0,0 +1,39 @@ ++#include ++const char *START_OF_STRINGS = ++#if _POSIX_V7_ILP32_OFF32 == 1 ++"POSIX_V7_ILP32_OFF32" ++#endif ++#if _POSIX_V7_ILP32_OFFBIG == 1 ++"POSIX_V7_ILP32_OFFBIG" ++#endif ++#if _POSIX_V7_LP64_OFF64 == 1 ++"POSIX_V7_LP64_OFF64" ++#endif ++#if _POSIX_V7_LPBIG_OFFBIG == 1 ++"POSIX_V7_LPBIG_OFFBIG" ++#endif ++#if _POSIX_V6_ILP32_OFF32 == 1 ++"POSIX_V6_ILP32_OFF32" ++#endif ++#if _POSIX_V6_ILP32_OFFBIG == 1 ++"POSIX_V6_ILP32_OFFBIG" ++#endif ++#if _POSIX_V6_LP64_OFF64 == 1 ++"POSIX_V6_LP64_OFF64" ++#endif ++#if _POSIX_V6_LPBIG_OFFBIG == 1 ++"POSIX_V6_LPBIG_OFFBIG" ++#endif ++#if _XBS5_ILP32_OFF32 == 1 ++"XBS5_ILP32_OFF32" ++#endif ++#if _XBS5_ILP32_OFFBIG == 1 ++"XBS5_ILP32_OFFBIG" ++#endif ++#if _XBS5_LP64_OFF64 == 1 ++"XBS5_LP64_OFF64" ++#endif ++#if _XBS5_LPBIG_OFFBIG == 1 ++"XBS5_LPBIG_OFFBIG" ++#endif ++""; +--- glibc-2.12-2-gc4ccff1/streams/Makefile ++++ glibc-2.12-1/streams/Makefile +@@ -21,7 +21,7 @@ + # + subdir := streams + +-headers = stropts.h sys/stropts.h bits/stropts.h bits/xtitypes.h ++#headers = stropts.h sys/stropts.h bits/stropts.h bits/xtitypes.h + routines = isastream getmsg getpmsg putmsg putpmsg fattach fdetach + + include ../Rules +--- glibc-2.12-2-gc4ccff1/sysdeps/generic/dl-cache.h ++++ glibc-2.12-1/sysdeps/generic/dl-cache.h +@@ -36,6 +36,14 @@ + # define add_system_dir(dir) add_dir (dir) + #endif + ++#ifndef arch_startup ++# define arch_startup(argc, argv) do { } while (0) ++#endif ++ ++#ifndef add_arch_dirs ++# define add_arch_dirs(config_file) do { } while (0) ++#endif ++ + #define CACHEMAGIC "ld.so-1.7.0" + + /* libc5 and glibc 2.0/2.1 use the same format. For glibc 2.2 another +--- glibc-2.12-2-gc4ccff1/sysdeps/i386/Makefile ++++ glibc-2.12-1/sysdeps/i386/Makefile +@@ -2,6 +2,8 @@ + # Every i386 port in use uses gas syntax (I think). + asm-CPPFLAGS += -DGAS_SYNTAX + ++sysdep-ASFLAGS += -U__i686 ++ + # The i386 `long double' is a distinct type we support. + long-double-fcts = yes + +@@ -64,6 +66,14 @@ endif + + ifneq (,$(filter -mno-tls-direct-seg-refs,$(CFLAGS))) + defines += -DNO_TLS_DIRECT_SEG_REFS ++else ++# .a libraries are not performance critical and so we ++# build them without direct TLS segment references ++# always. ++CPPFLAGS-.o += -DNO_TLS_DIRECT_SEG_REFS ++CFLAGS-.o += -mno-tls-direct-seg-refs ++CPPFLAGS-.oS += -DNO_TLS_DIRECT_SEG_REFS ++CFLAGS-.oS += -mno-tls-direct-seg-refs + endif + + ifeq ($(subdir),elf) +--- glibc-2.12-2-gc4ccff1/sysdeps/ia64/Makefile ++++ glibc-2.12-1/sysdeps/ia64/Makefile +@@ -12,8 +12,8 @@ elide-routines.os += hp-timing + + ifeq (yes,$(build-shared)) + # Compatibility +-sysdep_routines += ia64libgcc +-shared-only-routines += ia64libgcc ++sysdep_routines += libgcc-compat ++shared-only-routines += libgcc-compat + endif + endif + +--- glibc-2.12-2-gc4ccff1/sysdeps/ia64/ia64libgcc.S ++++ glibc-2.12-1/sysdeps/ia64/ia64libgcc.S +@@ -1,350 +0,0 @@ +-/* From the Intel IA-64 Optimization Guide, choose the minimum latency +- alternative. */ +- +-#include +-#undef ret +- +-#include +- +-#if SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_2_6) +- +-/* __divtf3 +- Compute a 80-bit IEEE double-extended quotient. +- farg0 holds the dividend. farg1 holds the divisor. */ +- +-ENTRY(___divtf3) +- cmp.eq p7, p0 = r0, r0 +- frcpa.s0 f10, p6 = farg0, farg1 +- ;; +-(p6) cmp.ne p7, p0 = r0, r0 +- .pred.rel.mutex p6, p7 +-(p6) fnma.s1 f11 = farg1, f10, f1 +-(p6) fma.s1 f12 = farg0, f10, f0 +- ;; +-(p6) fma.s1 f13 = f11, f11, f0 +-(p6) fma.s1 f14 = f11, f11, f11 +- ;; +-(p6) fma.s1 f11 = f13, f13, f11 +-(p6) fma.s1 f13 = f14, f10, f10 +- ;; +-(p6) fma.s1 f10 = f13, f11, f10 +-(p6) fnma.s1 f11 = farg1, f12, farg0 +- ;; +-(p6) fma.s1 f11 = f11, f10, f12 +-(p6) fnma.s1 f12 = farg1, f10, f1 +- ;; +-(p6) fma.s1 f10 = f12, f10, f10 +-(p6) fnma.s1 f12 = farg1, f11, farg0 +- ;; +-(p6) fma.s0 fret0 = f12, f10, f11 +-(p7) mov fret0 = f10 +- br.ret.sptk rp +-END(___divtf3) +- .symver ___divtf3, __divtf3@GLIBC_2.2 +- +-/* __divdf3 +- Compute a 64-bit IEEE double quotient. +- farg0 holds the dividend. farg1 holds the divisor. */ +- +-ENTRY(___divdf3) +- cmp.eq p7, p0 = r0, r0 +- frcpa.s0 f10, p6 = farg0, farg1 +- ;; +-(p6) cmp.ne p7, p0 = r0, r0 +- .pred.rel.mutex p6, p7 +-(p6) fmpy.s1 f11 = farg0, f10 +-(p6) fnma.s1 f12 = farg1, f10, f1 +- ;; +-(p6) fma.s1 f11 = f12, f11, f11 +-(p6) fmpy.s1 f13 = f12, f12 +- ;; +-(p6) fma.s1 f10 = f12, f10, f10 +-(p6) fma.s1 f11 = f13, f11, f11 +- ;; +-(p6) fmpy.s1 f12 = f13, f13 +-(p6) fma.s1 f10 = f13, f10, f10 +- ;; +-(p6) fma.d.s1 f11 = f12, f11, f11 +-(p6) fma.s1 f10 = f12, f10, f10 +- ;; +-(p6) fnma.d.s1 f8 = farg1, f11, farg0 +- ;; +-(p6) fma.d fret0 = f8, f10, f11 +-(p7) mov fret0 = f10 +- br.ret.sptk rp +- ;; +-END(___divdf3) +- .symver ___divdf3, __divdf3@GLIBC_2.2 +- +-/* __divsf3 +- Compute a 32-bit IEEE float quotient. +- farg0 holds the dividend. farg1 holds the divisor. */ +- +-ENTRY(___divsf3) +- cmp.eq p7, p0 = r0, r0 +- frcpa.s0 f10, p6 = farg0, farg1 +- ;; +-(p6) cmp.ne p7, p0 = r0, r0 +- .pred.rel.mutex p6, p7 +-(p6) fmpy.s1 f8 = farg0, f10 +-(p6) fnma.s1 f9 = farg1, f10, f1 +- ;; +-(p6) fma.s1 f8 = f9, f8, f8 +-(p6) fmpy.s1 f9 = f9, f9 +- ;; +-(p6) fma.s1 f8 = f9, f8, f8 +-(p6) fmpy.s1 f9 = f9, f9 +- ;; +-(p6) fma.d.s1 f10 = f9, f8, f8 +- ;; +-(p6) fnorm.s.s0 fret0 = f10 +-(p7) mov fret0 = f10 +- br.ret.sptk rp +- ;; +-END(___divsf3) +- .symver ___divsf3, __divsf3@GLIBC_2.2 +- +-/* __divdi3 +- Compute a 64-bit integer quotient. +- in0 holds the dividend. in1 holds the divisor. */ +- +-ENTRY(___divdi3) +- .regstk 2,0,0,0 +- /* Transfer inputs to FP registers. */ +- setf.sig f8 = in0 +- setf.sig f9 = in1 +- ;; +- /* Convert the inputs to FP, so that they won't be treated as +- unsigned. */ +- fcvt.xf f8 = f8 +- fcvt.xf f9 = f9 +- ;; +- /* Compute the reciprocal approximation. */ +- frcpa.s1 f10, p6 = f8, f9 +- ;; +- /* 3 Newton-Raphson iterations. */ +-(p6) fnma.s1 f11 = f9, f10, f1 +-(p6) fmpy.s1 f12 = f8, f10 +- ;; +-(p6) fmpy.s1 f13 = f11, f11 +-(p6) fma.s1 f12 = f11, f12, f12 +- ;; +-(p6) fma.s1 f10 = f11, f10, f10 +-(p6) fma.s1 f11 = f13, f12, f12 +- ;; +-(p6) fma.s1 f10 = f13, f10, f10 +-(p6) fnma.s1 f12 = f9, f11, f8 +- ;; +-(p6) fma.s1 f10 = f12, f10, f11 +- ;; +- /* Round quotient to an integer. */ +- fcvt.fx.trunc.s1 f10 = f10 +- ;; +- /* Transfer result to GP registers. */ +- getf.sig ret0 = f10 +- br.ret.sptk rp +- ;; +-END(___divdi3) +- .symver ___divdi3, __divdi3@GLIBC_2.2 +- +-/* __moddi3 +- Compute a 64-bit integer modulus. +- in0 holds the dividend (a). in1 holds the divisor (b). */ +- +-ENTRY(___moddi3) +- .regstk 2,0,0,0 +- /* Transfer inputs to FP registers. */ +- setf.sig f14 = in0 +- setf.sig f9 = in1 +- ;; +- /* Convert the inputs to FP, so that they won't be treated as +- unsigned. */ +- fcvt.xf f8 = f14 +- fcvt.xf f9 = f9 +- ;; +- /* Compute the reciprocal approximation. */ +- frcpa.s1 f10, p6 = f8, f9 +- ;; +- /* 3 Newton-Raphson iterations. */ +-(p6) fmpy.s1 f12 = f8, f10 +-(p6) fnma.s1 f11 = f9, f10, f1 +- ;; +-(p6) fma.s1 f12 = f11, f12, f12 +-(p6) fmpy.s1 f13 = f11, f11 +- ;; +-(p6) fma.s1 f10 = f11, f10, f10 +-(p6) fma.s1 f11 = f13, f12, f12 +- ;; +- sub in1 = r0, in1 +-(p6) fma.s1 f10 = f13, f10, f10 +-(p6) fnma.s1 f12 = f9, f11, f8 +- ;; +- setf.sig f9 = in1 +-(p6) fma.s1 f10 = f12, f10, f11 +- ;; +- fcvt.fx.trunc.s1 f10 = f10 +- ;; +- /* r = q * (-b) + a */ +- xma.l f10 = f10, f9, f14 +- ;; +- /* Transfer result to GP registers. */ +- getf.sig ret0 = f10 +- br.ret.sptk rp +- ;; +-END(___moddi3) +- .symver ___moddi3, __moddi3@GLIBC_2.2 +- +-/* __udivdi3 +- Compute a 64-bit unsigned integer quotient. +- in0 holds the dividend. in1 holds the divisor. */ +- +-ENTRY(___udivdi3) +- .regstk 2,0,0,0 +- /* Transfer inputs to FP registers. */ +- setf.sig f8 = in0 +- setf.sig f9 = in1 +- ;; +- /* Convert the inputs to FP, to avoid FP software-assist faults. */ +- fcvt.xuf.s1 f8 = f8 +- fcvt.xuf.s1 f9 = f9 +- ;; +- /* Compute the reciprocal approximation. */ +- frcpa.s1 f10, p6 = f8, f9 +- ;; +- /* 3 Newton-Raphson iterations. */ +-(p6) fnma.s1 f11 = f9, f10, f1 +-(p6) fmpy.s1 f12 = f8, f10 +- ;; +-(p6) fmpy.s1 f13 = f11, f11 +-(p6) fma.s1 f12 = f11, f12, f12 +- ;; +-(p6) fma.s1 f10 = f11, f10, f10 +-(p6) fma.s1 f11 = f13, f12, f12 +- ;; +-(p6) fma.s1 f10 = f13, f10, f10 +-(p6) fnma.s1 f12 = f9, f11, f8 +- ;; +-(p6) fma.s1 f10 = f12, f10, f11 +- ;; +- /* Round quotient to an unsigned integer. */ +- fcvt.fxu.trunc.s1 f10 = f10 +- ;; +- /* Transfer result to GP registers. */ +- getf.sig ret0 = f10 +- br.ret.sptk rp +- ;; +-END(___udivdi3) +- .symver ___udivdi3, __udivdi3@GLIBC_2.2 +- +-/* __umoddi3 +- Compute a 64-bit unsigned integer modulus. +- in0 holds the dividend (a). in1 holds the divisor (b). */ +- +-ENTRY(___umoddi3) +- .regstk 2,0,0,0 +- /* Transfer inputs to FP registers. */ +- setf.sig f14 = in0 +- setf.sig f9 = in1 +- ;; +- /* Convert the inputs to FP, to avoid FP software assist faults. */ +- fcvt.xuf.s1 f8 = f14 +- fcvt.xuf.s1 f9 = f9 +- ;; +- /* Compute the reciprocal approximation. */ +- frcpa.s1 f10, p6 = f8, f9 +- ;; +- /* 3 Newton-Raphson iterations. */ +-(p6) fmpy.s1 f12 = f8, f10 +-(p6) fnma.s1 f11 = f9, f10, f1 +- ;; +-(p6) fma.s1 f12 = f11, f12, f12 +-(p6) fmpy.s1 f13 = f11, f11 +- ;; +-(p6) fma.s1 f10 = f11, f10, f10 +-(p6) fma.s1 f11 = f13, f12, f12 +- ;; +- sub in1 = r0, in1 +-(p6) fma.s1 f10 = f13, f10, f10 +-(p6) fnma.s1 f12 = f9, f11, f8 +- ;; +- setf.sig f9 = in1 +-(p6) fma.s1 f10 = f12, f10, f11 +- ;; +- /* Round quotient to an unsigned integer. */ +- fcvt.fxu.trunc.s1 f10 = f10 +- ;; +- /* r = q * (-b) + a */ +- xma.l f10 = f10, f9, f14 +- ;; +- /* Transfer result to GP registers. */ +- getf.sig ret0 = f10 +- br.ret.sptk rp +- ;; +-END(___umoddi3) +- .symver ___umoddi3, __umoddi3@GLIBC_2.2 +- +-/* __multi3 +- Compute a 128-bit multiply of 128-bit multiplicands. +- in0/in1 holds one multiplicand (a), in2/in3 holds the other one (b). */ +- +-ENTRY(___multi3) +- .regstk 4,0,0,0 +- setf.sig f6 = in1 +- movl r19 = 0xffffffff +- setf.sig f7 = in2 +- ;; +- and r14 = r19, in0 +- ;; +- setf.sig f10 = r14 +- and r14 = r19, in2 +- xmpy.l f9 = f6, f7 +- ;; +- setf.sig f6 = r14 +- shr.u r14 = in0, 32 +- ;; +- setf.sig f7 = r14 +- shr.u r14 = in2, 32 +- ;; +- setf.sig f8 = r14 +- xmpy.l f11 = f10, f6 +- xmpy.l f6 = f7, f6 +- ;; +- getf.sig r16 = f11 +- xmpy.l f7 = f7, f8 +- ;; +- shr.u r14 = r16, 32 +- and r16 = r19, r16 +- getf.sig r17 = f6 +- setf.sig f6 = in0 +- ;; +- setf.sig f11 = r14 +- getf.sig r21 = f7 +- setf.sig f7 = in3 +- ;; +- xma.l f11 = f10, f8, f11 +- xma.l f6 = f6, f7, f9 +- ;; +- getf.sig r18 = f11 +- ;; +- add r18 = r18, r17 +- ;; +- and r15 = r19, r18 +- cmp.ltu p7, p6 = r18, r17 +- ;; +- getf.sig r22 = f6 +-(p7) adds r14 = 1, r19 +- ;; +-(p7) add r21 = r21, r14 +- shr.u r14 = r18, 32 +- shl r15 = r15, 32 +- ;; +- add r20 = r21, r14 +- ;; +- add ret0 = r15, r16 +- add ret1 = r22, r20 +- br.ret.sptk rp +- ;; +-END(___multi3) +- .symver ___multi3, __multi3@GLIBC_2.2 +- +-#endif +--- glibc-2.12-2-gc4ccff1/sysdeps/ia64/libgcc-compat.c ++++ glibc-2.12-1/sysdeps/ia64/libgcc-compat.c +@@ -0,0 +1,84 @@ ++/* pre-.hidden libgcc compatibility ++ Copyright (C) 2002 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, write to the Free ++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++ 02111-1307 USA. */ ++ ++ ++#include ++#include ++ ++#if SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_2_6) ++ ++typedef int int128_t __attribute__((__mode__(TI))); ++ ++extern long double __divtf3 (long double, long double) attribute_hidden; ++long double INTUSE (__divtf3) (long double x, long double y) ++{ ++ return __divtf3 (x, y); ++} ++symbol_version (INTUSE (__divtf3), __divtf3, GLIBC_2.2); ++ ++extern double __divdf3 (double, double) attribute_hidden; ++double INTUSE (__divdf3) (double x, double y) ++{ ++ return __divdf3 (x, y); ++} ++symbol_version (INTUSE (__divdf3), __divdf3, GLIBC_2.2); ++ ++extern float __divsf3 (float, float) attribute_hidden; ++float INTUSE (__divsf3) (float x, float y) ++{ ++ return __divsf3 (x, y); ++} ++symbol_version (INTUSE (__divsf3), __divsf3, GLIBC_2.2); ++ ++extern int64_t __divdi3 (int64_t, int64_t) attribute_hidden; ++int64_t INTUSE (__divdi3) (int64_t x, int64_t y) ++{ ++ return __divdi3 (x, y); ++} ++symbol_version (INTUSE (__divdi3), __divdi3, GLIBC_2.2); ++ ++extern int64_t __moddi3 (int64_t, int64_t) attribute_hidden; ++int64_t INTUSE (__moddi3) (int64_t x, int64_t y) ++{ ++ return __moddi3 (x, y); ++} ++symbol_version (INTUSE (__moddi3), __moddi3, GLIBC_2.2); ++ ++extern uint64_t __udivdi3 (uint64_t, uint64_t) attribute_hidden; ++uint64_t INTUSE (__udivdi3) (uint64_t x, uint64_t y) ++{ ++ return __udivdi3 (x, y); ++} ++symbol_version (INTUSE (__udivdi3), __udivdi3, GLIBC_2.2); ++ ++extern uint64_t __umoddi3 (uint64_t, uint64_t) attribute_hidden; ++uint64_t INTUSE (__umoddi3) (uint64_t x, uint64_t y) ++{ ++ return __umoddi3 (x, y); ++} ++symbol_version (INTUSE (__umoddi3), __umoddi3, GLIBC_2.2); ++ ++extern int128_t __multi3 (int128_t, int128_t) attribute_hidden; ++int128_t INTUSE (__multi3) (int128_t x, int128_t y) ++{ ++ return __multi3 (x, y); ++} ++symbol_version (INTUSE (__multi3), __multi3, GLIBC_2.2); ++ ++#endif +--- glibc-2.12-2-gc4ccff1/sysdeps/posix/getaddrinfo.c ++++ glibc-2.12-1/sysdeps/posix/getaddrinfo.c +@@ -1099,10 +1099,12 @@ static const struct scopeentry + /* Link-local addresses: scope 2. */ + { { { 169, 254, 0, 0 } }, htonl_c (0xffff0000), 2 }, + { { { 127, 0, 0, 0 } }, htonl_c (0xff000000), 2 }, ++#if 0 + /* Site-local addresses: scope 5. */ + { { { 10, 0, 0, 0 } }, htonl_c (0xff000000), 5 }, + { { { 172, 16, 0, 0 } }, htonl_c (0xfff00000), 5 }, + { { { 192, 168, 0, 0 } }, htonl_c (0xffff0000), 5 }, ++#endif + /* Default: scope 14. */ + { { { 0, 0, 0, 0 } }, htonl_c (0x00000000), 14 } + }; +--- glibc-2.12-2-gc4ccff1/sysdeps/powerpc/powerpc64/Makefile ++++ glibc-2.12-1/sysdeps/powerpc/powerpc64/Makefile +@@ -30,6 +30,7 @@ ifneq ($(elf),no) + # we use -fpic instead which is much better. + CFLAGS-initfini.s += -fpic -O1 + endif ++CFLAGS-libc-start.c += -fno-asynchronous-unwind-tables + endif + + ifeq ($(subdir),elf) +--- glibc-2.12-2-gc4ccff1/sysdeps/unix/nice.c ++++ glibc-2.12-1/sysdeps/unix/nice.c +@@ -42,7 +42,12 @@ nice (int incr) + __set_errno (save); + } + +- result = setpriority (PRIO_PROCESS, 0, prio + incr); ++ prio += incr; ++ if (prio < PRIO_MIN) ++ prio = PRIO_MIN; ++ else if (prio >= PRIO_MAX) ++ prio = PRIO_MAX - 1; ++ result = setpriority (PRIO_PROCESS, 0, prio); + if (result == -1) + { + if (errno == EACCES) +--- glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/check_pf.c ++++ glibc-2.12-1/sysdeps/unix/sysv/linux/check_pf.c +@@ -27,13 +27,10 @@ + #include + #include + +-#include +-#include +-#include +- + #include + #include + ++#include "netlinkaccess.h" + + #ifndef IFA_F_HOMEADDRESS + # define IFA_F_HOMEADDRESS 0 +--- glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/dl-osinfo.h ++++ glibc-2.12-1/sysdeps/unix/sysv/linux/dl-osinfo.h +@@ -17,10 +17,13 @@ + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + ++#include + #include + #include + #include + #include ++#include ++#include + + #ifndef MIN + # define MIN(a,b) (((a)<(b))?(a):(b)) +@@ -80,6 +83,32 @@ _dl_setup_stack_chk_guard (void *dl_rand + unsigned char *p = (unsigned char *) &ret; + p[sizeof (ret) - 1] = 255; + p[sizeof (ret) - 2] = '\n'; ++#ifdef HP_TIMING_NOW ++ hp_timing_t hpt; ++ HP_TIMING_NOW (hpt); ++ hpt = (hpt & 0xffff) << 8; ++ ret ^= hpt; ++#endif ++ uintptr_t stk; ++ /* Avoid GCC being too smart. */ ++ asm ("" : "=r" (stk) : "r" (p)); ++ stk &= 0x7ffff0; ++#if __BYTE_ORDER == __LITTLE_ENDIAN ++ stk <<= (__WORDSIZE - 23); ++#elif __WORDSIZE == 64 ++ stk <<= 31; ++#endif ++ ret ^= stk; ++ /* Avoid GCC being too smart. */ ++ p = (unsigned char *) &errno; ++ asm ("" : "=r" (stk) : "r" (p)); ++ stk &= 0x7fff00; ++#if __BYTE_ORDER == __LITTLE_ENDIAN ++ stk <<= (__WORDSIZE - 29); ++#else ++ stk >>= 8; ++#endif ++ ret ^= stk; + } + else + #endif +--- glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/futimesat.c ++++ glibc-2.12-1/sysdeps/unix/sysv/linux/futimesat.c +@@ -37,14 +37,14 @@ futimesat (fd, file, tvp) + { + int result; + ++ if (file == NULL) ++ return __futimes (fd, tvp); ++ + #ifdef __NR_futimesat + # ifndef __ASSUME_ATFCTS + if (__have_atfcts >= 0) + # endif + { +- if (file == NULL) +- return __futimes (fd, tvp); +- + result = INLINE_SYSCALL (futimesat, 3, fd, file, tvp); + # ifndef __ASSUME_ATFCTS + if (result == -1 && errno == ENOSYS) +@@ -58,22 +58,7 @@ futimesat (fd, file, tvp) + #ifndef __ASSUME_ATFCTS + char *buf = NULL; + +- if (file == NULL) +- { +- static const char procfd[] = "/proc/self/fd/%d"; +- /* Buffer for the path name we are going to use. It consists of +- - the string /proc/self/fd/ +- - the file descriptor number. +- The final NUL is included in the sizeof. A bit of overhead +- due to the format elements compensates for possible negative +- numbers. */ +- size_t buflen = sizeof (procfd) + sizeof (int) * 3; +- buf = alloca (buflen); +- +- __snprintf (buf, buflen, procfd, fd); +- file = buf; +- } +- else if (fd != AT_FDCWD && file[0] != '/') ++ if (fd != AT_FDCWD && file[0] != '/') + { + size_t filelen = strlen (file); + if (__builtin_expect (filelen == 0, 0)) +--- glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/i386/dl-cache.h ++++ glibc-2.12-1/sysdeps/unix/sysv/linux/i386/dl-cache.h +@@ -0,0 +1,59 @@ ++/* Support for reading /etc/ld.so.cache files written by Linux ldconfig. ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, write to the Free ++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++ 02111-1307 USA. */ ++ ++static inline int ++is_ia64 (void) ++{ ++ unsigned int fl1, fl2; ++ ++ /* See if we can use cpuid. */ ++ __asm__ ("pushfl; pushfl; popl %0; movl %0,%1; xorl %2,%0;" ++ "pushl %0; popfl; pushfl; popl %0; popfl" ++ : "=&r" (fl1), "=&r" (fl2) ++ : "i" (0x00200000)); ++ if (((fl1 ^ fl2) & 0x00200000) == 0) ++ return 0; ++ ++ /* Host supports cpuid. See if cpuid gives capabilities, try ++ CPUID(0). Preserve %ebx and %ecx; cpuid insn clobbers these, we ++ don't need their CPUID values here, and %ebx may be the PIC ++ register. */ ++ __asm__ ("pushl %%ecx; pushl %%ebx; cpuid; popl %%ebx; popl %%ecx" ++ : "=a" (fl1) : "0" (0) : "edx", "cc"); ++ if (fl1 == 0) ++ return 0; ++ ++ /* Invoke CPUID(1), return %edx; caller can examine bits to ++ determine what's supported. */ ++ __asm__ ("pushl %%ecx; pushl %%ebx; cpuid; popl %%ebx; popl %%ecx" ++ : "=d" (fl2), "=a" (fl1) : "1" (1) : "cc"); ++ return (fl2 & (1 << 30)) != 0; ++} ++ ++#define arch_startup(argc, argv) \ ++ do { \ ++ /* On IA-64, try to execute 64-bit ldconfig if possible. \ ++ This is because the badly designed /emul/ia32-linux hack \ ++ will cause 32-bit ldconfig to do all sorts of weird things. */ \ ++ if (is_ia64 ()) \ ++ execv ("/emul/ia32-linux/../../sbin/ldconfig", \ ++ (char *const *) argv); \ ++ } while (0) ++ ++#include_next +--- glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/ia64/dl-cache.h ++++ glibc-2.12-1/sysdeps/unix/sysv/linux/ia64/dl-cache.h +@@ -22,4 +22,31 @@ + #define _dl_cache_check_flags(flags) \ + ((flags) == _DL_CACHE_DEFAULT_ID) + ++#define EMUL_HACK "/emul/ia32-linux" ++ ++#define arch_startup(argc, argv) unlink (EMUL_HACK LD_SO_CACHE) ++ ++#define add_arch_dirs(config_file) \ ++ do { \ ++ int save_verbose = opt_verbose; \ ++ opt_verbose = 0; \ ++ \ ++ parse_conf (config_file, EMUL_HACK, true); \ ++ \ ++ /* Always add the standard search paths. */ \ ++ add_system_dir (EMUL_HACK SLIBDIR); \ ++ if (strcmp (SLIBDIR, LIBDIR)) \ ++ add_system_dir (EMUL_HACK LIBDIR); \ ++ \ ++ char emul_config_file[strlen (config_file) \ ++ + sizeof EMUL_HACK]; \ ++ strcpy (mempcpy (emul_config_file, EMUL_HACK, \ ++ strlen (EMUL_HACK)), config_file); \ ++ \ ++ if (! access (emul_config_file, R_OK)) \ ++ parse_conf (emul_config_file, EMUL_HACK, true); \ ++ \ ++ opt_verbose = save_verbose; \ ++ } while (0) ++ + #include_next +--- glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/ia64/dl-procinfo.c ++++ glibc-2.12-1/sysdeps/unix/sysv/linux/ia64/dl-procinfo.c +@@ -0,0 +1,5 @@ ++#ifdef IS_IN_ldconfig ++#include ++#else ++#include ++#endif +--- glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/ia64/dl-procinfo.h ++++ glibc-2.12-1/sysdeps/unix/sysv/linux/ia64/dl-procinfo.h +@@ -0,0 +1,5 @@ ++#ifdef IS_IN_ldconfig ++#include ++#else ++#include ++#endif +--- glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/ia64/ldd-rewrite.sed ++++ glibc-2.12-1/sysdeps/unix/sysv/linux/ia64/ldd-rewrite.sed +@@ -1 +1 @@ +-s_^\(RTLDLIST=\)\([^ ]*\)-ia64\(\.so\.[0-9.]*\)[ ]*$_\1"\2-ia64\3 \2\3"_ ++s_^\(RTLDLIST=\)\([^ ]*\)-ia64\(\.so\.[0-9.]*\)[ ]*$_\1"\2-ia64\3 /emul/ia32-linux\2\3"_ +--- glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/netlinkaccess.h ++++ glibc-2.12-1/sysdeps/unix/sysv/linux/netlinkaccess.h +@@ -25,6 +25,24 @@ + + #include + ++#ifndef IFA_MAX ++/* 2.6.19 kernel headers helpfully removed some macros and ++ moved lots of stuff into new headers, some of which aren't ++ included by linux/rtnetlink.h. */ ++#include ++#endif ++ ++#ifndef IFA_RTA ++# define IFA_RTA(r) \ ++ ((struct rtattr*) ((char*)(r) + NLMSG_ALIGN (sizeof (struct ifaddrmsg)))) ++# define IFA_PAYLOAD(n) NLMSG_PAYLOAD (n, sizeof (struct ifaddrmsg)) ++#endif ++ ++#ifndef IFLA_RTA ++# define IFLA_RTA(r) \ ++ ((struct rtattr*) ((char*)(r) + NLMSG_ALIGN (sizeof (struct ifinfomsg)))) ++# define IFLA_PAYLOAD(n) NLMSG_PAYLOAD (n, sizeof (struct ifinfomsg)) ++#endif + + struct netlink_res + { +--- glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/paths.h ++++ glibc-2.12-1/sysdeps/unix/sysv/linux/paths.h +@@ -62,7 +62,7 @@ + #define _PATH_TTY "/dev/tty" + #define _PATH_UNIX "/boot/vmlinux" + #define _PATH_UTMP "/var/run/utmp" +-#define _PATH_VI "/usr/bin/vi" ++#define _PATH_VI "/bin/vi" + #define _PATH_WTMP "/var/log/wtmp" + + /* Provide trailing slash, since mostly used for building pathnames. */ +--- glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/sparc/sparc64/fxstat.c ++++ glibc-2.12-1/sysdeps/unix/sysv/linux/sparc/sparc64/fxstat.c +@@ -1 +1 @@ +-#include "../../fxstat.c" ++#include "../../i386/fxstat.c" +--- glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/tcsetattr.c ++++ glibc-2.12-1/sysdeps/unix/sysv/linux/tcsetattr.c +@@ -49,6 +49,7 @@ tcsetattr (fd, optional_actions, termios + { + struct __kernel_termios k_termios; + unsigned long int cmd; ++ int retval; + + switch (optional_actions) + { +@@ -80,6 +81,35 @@ tcsetattr (fd, optional_actions, termios + memcpy (&k_termios.c_cc[0], &termios_p->c_cc[0], + __KERNEL_NCCS * sizeof (cc_t)); + +- return INLINE_SYSCALL (ioctl, 3, fd, cmd, &k_termios); ++ retval = INLINE_SYSCALL (ioctl, 3, fd, cmd, &k_termios); ++ ++ if (retval == 0 && cmd == TCSETS) ++ { ++ /* The Linux kernel has a bug which silently ignore the invalid ++ c_cflag on pty. We have to check it here. */ ++ int save = errno; ++ retval = INLINE_SYSCALL (ioctl, 3, fd, TCGETS, &k_termios); ++ if (retval) ++ { ++ /* We cannot verify if the setting is ok. We don't return ++ an error (?). */ ++ __set_errno (save); ++ retval = 0; ++ } ++ else if ((termios_p->c_cflag & (PARENB | CREAD)) ++ != (k_termios.c_cflag & (PARENB | CREAD)) ++ || ((termios_p->c_cflag & CSIZE) ++ && ((termios_p->c_cflag & CSIZE) ++ != (k_termios.c_cflag & CSIZE)))) ++ { ++ /* It looks like the Linux kernel silently changed the ++ PARENB/CREAD/CSIZE bits in c_cflag. Report it as an ++ error. */ ++ __set_errno (EINVAL); ++ retval = -1; ++ } ++ } ++ ++ return retval; + } + libc_hidden_def (tcsetattr) +--- glibc-2.12-2-gc4ccff1/timezone/zic.c ++++ glibc-2.12-1/timezone/zic.c +@@ -1921,7 +1921,7 @@ const int zonecount; + if (stdrp != NULL && stdrp->r_hiyear == 2037) + return; + } +- if (stdrp == NULL && zp->z_nrules != 0) ++ if (stdrp == NULL && (zp->z_nrules != 0 || zp->z_stdoff != 0)) + return; + abbrvar = (stdrp == NULL) ? "" : stdrp->r_abbrvar; + doabbr(result, zp->z_format, abbrvar, FALSE, TRUE); diff --git a/SOURCES/glibc-fix-implicit-rule.patch b/SOURCES/glibc-fix-implicit-rule.patch new file mode 100644 index 0000000..7c21696 --- /dev/null +++ b/SOURCES/glibc-fix-implicit-rule.patch @@ -0,0 +1,16 @@ +diff -rup a/manual/Makefile b/manual/Makefile +--- a/manual/Makefile 2010-05-04 05:27:23.000000000 -0600 ++++ b/manual/Makefile 2012-05-07 15:18:52.443176136 -0600 +@@ -232,7 +232,11 @@ 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/SOURCES/glibc-gcc47-ctordtor.patch b/SOURCES/glibc-gcc47-ctordtor.patch new file mode 100644 index 0000000..cf456d0 --- /dev/null +++ b/SOURCES/glibc-gcc47-ctordtor.patch @@ -0,0 +1,263 @@ +diff -Nrup a/config.h.in b/config.h.in +--- a/config.h.in 2012-06-07 10:17:05.004639296 -0600 ++++ b/config.h.in 2012-06-07 10:17:45.289449200 -0600 +@@ -204,6 +204,9 @@ + /* Define if Systemtap probes should be defined. */ + #undef USE_STAP_PROBE + ++/* Define if `.ctors' and `.dtors' sections shouldn't be used. */ ++#undef NO_CTORS_DTORS_SECTIONS ++ + /* + */ + +diff -Nrup a/configure b/configure +--- a/configure 2012-06-07 10:17:05.427637302 -0600 ++++ b/configure 2012-06-07 10:18:20.452282885 -0600 +@@ -577,7 +577,7 @@ as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr + exec 7<&0 &1 + + # Name of the host. +-# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, ++# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, + # so uname gets run too. + ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +@@ -1307,8 +1307,8 @@ target=$target_alias + if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe +- $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. +- If a cross compiler is detected then cross compile mode will be used." >&2 ++ $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. ++ If a cross compiler is detected then cross compile mode will be used" >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +@@ -1412,7 +1412,7 @@ Configuration: + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit +- -q, --quiet, --silent do not print \`checking...' messages ++ -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files +@@ -1725,11 +1725,9 @@ trap 'exit_status=$? + { + echo + +- cat <<\_ASBOX +-## ---------------- ## ++ $as_echo "## ---------------- ## + ## Cache variables. ## +-## ---------------- ## +-_ASBOX ++## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, + ( +@@ -1763,11 +1761,9 @@ $as_echo "$as_me: WARNING: cache variabl + ) + echo + +- cat <<\_ASBOX +-## ----------------- ## ++ $as_echo "## ----------------- ## + ## Output variables. ## +-## ----------------- ## +-_ASBOX ++## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do +@@ -1780,11 +1776,9 @@ _ASBOX + echo + + if test -n "$ac_subst_files"; then +- cat <<\_ASBOX +-## ------------------- ## ++ $as_echo "## ------------------- ## + ## File substitutions. ## +-## ------------------- ## +-_ASBOX ++## ------------------- ##" + echo + for ac_var in $ac_subst_files + do +@@ -1798,11 +1792,9 @@ _ASBOX + fi + + if test -s confdefs.h; then +- cat <<\_ASBOX +-## ----------- ## ++ $as_echo "## ----------- ## + ## confdefs.h. ## +-## ----------- ## +-_ASBOX ++## ----------- ##" + echo + cat confdefs.h + echo +@@ -1855,7 +1847,12 @@ _ACEOF + ac_site_file1=NONE + ac_site_file2=NONE + if test -n "$CONFIG_SITE"; then +- ac_site_file1=$CONFIG_SITE ++ # We do not want a PATH search for config.site. ++ case $CONFIG_SITE in #(( ++ -*) ac_site_file1=./$CONFIG_SITE;; ++ */*) ac_site_file1=$CONFIG_SITE;; ++ *) ac_site_file1=./$CONFIG_SITE;; ++ esac + elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +@@ -1870,7 +1867,11 @@ do + { $as_echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 + $as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 +- . "$ac_site_file" ++ . "$ac_site_file" \ ++ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++as_fn_error $? "failed to load site script $ac_site_file ++See \`config.log' for more details" "$LINENO" 5; } + fi + done + +@@ -6520,9 +6521,15 @@ fi + { $as_echo "$as_me:$LINENO: result: $libc_cv_initfini_array" >&5 + $as_echo "$libc_cv_initfini_array" >&6; } + if test $libc_cv_initfini_array != yes; then +- { { $as_echo "$as_me:$LINENO: error: Need linker with .init_array/.fini_array support." >&5 +-$as_echo "$as_me: error: Need linker with .init_array/.fini_array support." >&2;} +- { (exit 1); exit 1; }; } ++ as_fn_error $? "Need linker with .init_array/.fini_array support." "$LINENO" 5 ++ elif { ac_try='${CC-cc} -Wl,--verbose 2>&1|grep SORT_BY_INIT_PRIORITY 1>&5' ++ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 ++ test $ac_status = 0; }; }; then ++ $as_echo "#define NO_CTORS_DTORS_SECTIONS 1" >>confdefs.h ++ + fi + + { $as_echo "$as_me:$LINENO: checking for libunwind-support in compiler" >&5 +@@ -9054,6 +9061,7 @@ DEFS=-DHAVE_CONFIG_H + + ac_libobjs= + ac_ltlibobjs= ++U= + for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' +diff -Nrup a/configure.in b/configure.in +--- a/configure.in 2012-06-07 10:17:05.009639273 -0600 ++++ b/configure.in 2012-06-07 10:17:45.349448917 -0600 +@@ -1536,6 +1536,8 @@ EOF + rm -f conftest*]) + if test $libc_cv_initfini_array != yes; then + AC_MSG_ERROR([Need linker with .init_array/.fini_array support.]) ++ elif AC_TRY_COMMAND([${CC-cc} -Wl,--verbose 2>&1|grep SORT_BY_INIT_PRIORITY 1>&AS_MESSAGE_LOG_FD]); then ++ AC_DEFINE(NO_CTORS_DTORS_SECTIONS) + fi + + AC_CACHE_CHECK(for libunwind-support in compiler, +diff -Nrup a/elf/sofini.c b/elf/sofini.c +--- a/elf/sofini.c 2010-05-04 05:27:23.000000000 -0600 ++++ b/elf/sofini.c 2012-06-07 10:17:45.350448913 -0600 +@@ -1,12 +1,14 @@ + /* Finalizer module for ELF shared C library. This provides terminating + null pointer words in the `.ctors' and `.dtors' sections. */ + ++#ifndef NO_CTORS_DTORS_SECTIONS + static void (*const __CTOR_END__[1]) (void) + __attribute__ ((used, section (".ctors"))) + = { 0 }; + static void (*const __DTOR_END__[1]) (void) + __attribute__ ((used, section (".dtors"))) + = { 0 }; ++#endif + + /* Terminate the frame unwind info section with a 4byte 0 as a sentinel; + this would be the 'length' field in a real FDE. */ +diff -Nrup a/elf/soinit.c b/elf/soinit.c +--- a/elf/soinit.c 2010-05-04 05:27:23.000000000 -0600 ++++ b/elf/soinit.c 2012-06-07 10:17:45.351448908 -0600 +@@ -3,6 +3,7 @@ + the `.ctors' and `.dtors' sections so the lists are terminated, and + calling those lists of functions. */ + ++#ifndef NO_CTORS_DTORS_SECTIONS + #include + #include + +@@ -40,3 +41,4 @@ __libc_fini (void) + + void (*_fini_ptr) (void) __attribute__ ((section (".fini_array"))) + = &__libc_fini; ++#endif +diff -Nrup a/sysdeps/i386/init-first.c b/sysdeps/i386/init-first.c +--- a/sysdeps/i386/init-first.c 2010-05-04 05:27:23.000000000 -0600 ++++ b/sysdeps/i386/init-first.c 2012-06-07 10:17:45.353448898 -0600 +@@ -59,7 +59,9 @@ _init (int argc, ...) + { + init (&argc); + ++#ifndef NO_CTORS_DTORS_SECTIONS + __libc_global_ctors (); ++#endif + } + #endif + +diff -Nrup a/sysdeps/mach/hurd/i386/init-first.c b/sysdeps/mach/hurd/i386/init-first.c +--- a/sysdeps/mach/hurd/i386/init-first.c 2010-05-04 05:27:23.000000000 -0600 ++++ b/sysdeps/mach/hurd/i386/init-first.c 2012-06-07 10:17:45.354448893 -0600 +@@ -92,7 +92,7 @@ posixland_init (int argc, char **argv, c + __getopt_clean_environment (envp); + #endif + +-#ifdef SHARED ++#if defined SHARED && !defined NO_CTORS_DTORS_SECTIONS + __libc_global_ctors (); + #endif + } +diff -Nrup a/sysdeps/mach/hurd/powerpc/init-first.c b/sysdeps/mach/hurd/powerpc/init-first.c +--- a/sysdeps/mach/hurd/powerpc/init-first.c 2010-05-04 05:27:23.000000000 -0600 ++++ b/sysdeps/mach/hurd/powerpc/init-first.c 2012-06-07 10:17:45.354448893 -0600 +@@ -82,7 +82,7 @@ posixland_init (int argc, char **argv, c + __getopt_clean_environment (__environ); + #endif + +-#ifdef SHARED ++#if defined SHARED && !defined NO_CTORS_DTORS_SECTIONS + __libc_global_ctors (); + #endif + } +diff -Nrup a/sysdeps/sh/init-first.c b/sysdeps/sh/init-first.c +--- a/sysdeps/sh/init-first.c 2010-05-04 05:27:23.000000000 -0600 ++++ b/sysdeps/sh/init-first.c 2012-06-07 10:17:45.355448888 -0600 +@@ -59,7 +59,9 @@ _init (int argc, ...) + { + init (&argc); + ++#ifndef NO_CTORS_DTORS_SECTIONS + __libc_global_ctors (); ++#endif + } + #endif + +diff -Nrup a/sysdeps/unix/sysv/linux/init-first.c b/sysdeps/unix/sysv/linux/init-first.c +--- a/sysdeps/unix/sysv/linux/init-first.c 2010-05-04 05:27:23.000000000 -0600 ++++ b/sysdeps/unix/sysv/linux/init-first.c 2012-06-07 10:17:45.356448884 -0600 +@@ -93,7 +93,7 @@ _init (int argc, char **argv, char **env + __getopt_clean_environment (envp); + #endif + +-#ifdef SHARED ++#if defined SHARED && !defined NO_CTORS_DTORS_SECTIONS + __libc_global_ctors (); + #endif + } diff --git a/SOURCES/glibc-getlogin-r.patch b/SOURCES/glibc-getlogin-r.patch new file mode 100644 index 0000000..9181ce1 --- /dev/null +++ b/SOURCES/glibc-getlogin-r.patch @@ -0,0 +1,36 @@ +2010-05-05 Ulrich Drepper + + [BZ #11571] + * sysdeps/unix/sysv/linux/getlogin_r.c (__getlogin_r_loginuid): Handle + too small buffers according to the standard. + +Index: glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/getlogin_r.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/sysdeps/unix/sysv/linux/getlogin_r.c ++++ glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/getlogin_r.c +@@ -81,13 +81,22 @@ __getlogin_r_loginuid (name, namesize) + if (tpwd == NULL) + goto fail; + +- strncpy (name, pwd.pw_name, namesize - 1); +- name[namesize - 1] = '\0'; ++ int result = 0; ++ size_t needed = strlen (pwd.pw_name) + 1; ++ if (needed > namesize) ++ { ++ __set_errno (ERANGE); ++ result = ERANGE; ++ goto out; ++ } + ++ memcpy (name, pwd.pw_name, needed); ++ ++ out: + if (use_malloc) + free (buf); + +- return 0; ++ return result; + } + + diff --git a/SOURCES/glibc-ia64-lib64.patch b/SOURCES/glibc-ia64-lib64.patch new file mode 100644 index 0000000..05fd922 --- /dev/null +++ b/SOURCES/glibc-ia64-lib64.patch @@ -0,0 +1,92 @@ +2004-05-14 Jakub Jelinek + + * sysdeps/unix/sysv/linux/configure.in: Use */lib64 even for ia64. + * sysdeps/unix/sysv/linux/configure: Rebuilt. + * sysdeps/unix/sysv/linux/ia64/dl-procinfo.c: New file. + * sysdeps/unix/sysv/linux/ia64/dl-procinfo.h: New file. + * sysdeps/unix/sysv/linux/ia64/ldd-rewrite.sed: Change /lib64/ld* + into /lib/ld*. Add LD_LIBRARY_VERSION. + * sysdeps/unix/sysv/linux/ia64/ldconfig.h + (SYSDEP_KNOWN_INTERPRETER_NAMES): Add /lib64/ld-linux-ia64.so.2. + * sysdeps/unix/sysv/linux/ia64/dl-cache.h: Include sparc-linux + dl-cache.h instead of generic dl-cache.h. + +--- libc/sysdeps/unix/sysv/linux/configure.jj 2003-03-23 03:10:04.000000000 +0100 ++++ libc/sysdeps/unix/sysv/linux/configure 2004-05-14 15:54:35.669802684 +0200 +@@ -225,7 +225,7 @@ case "$prefix" in + # 64-bit libraries on bi-arch platforms go in /lib64 instead of /lib + case $machine in + sparc/sparc64 | x86_64 | powerpc/powerpc64 | s390/s390-64 | \ +- mips/mips64/n64/* ) ++ mips/mips64/n64/* | ia64 ) + libc_cv_slibdir="/lib64" + if test "$libdir" = '${exec_prefix}/lib'; then + libdir='${exec_prefix}/lib64'; +--- libc/sysdeps/unix/sysv/linux/configure.in.jj 2003-03-23 03:10:04.000000000 +0100 ++++ libc/sysdeps/unix/sysv/linux/configure.in 2004-05-14 15:53:44.355998785 +0200 +@@ -158,7 +158,7 @@ case "$prefix" in + # 64-bit libraries on bi-arch platforms go in /lib64 instead of /lib + case $machine in + sparc/sparc64 | x86_64 | powerpc/powerpc64 | s390/s390-64 | \ +- mips/mips64/n64/* ) ++ mips/mips64/n64/* | ia64 ) + libc_cv_slibdir="/lib64" + if test "$libdir" = '${exec_prefix}/lib'; then + libdir='${exec_prefix}/lib64'; +--- libc/sysdeps/unix/sysv/linux/ia64/dl-procinfo.c.jj 2004-05-14 15:42:09.307560515 +0200 ++++ libc/sysdeps/unix/sysv/linux/ia64/dl-procinfo.c 2003-09-30 00:23:24.000000000 +0200 +@@ -0,0 +1,5 @@ ++#ifdef IS_IN_ldconfig ++#include ++#else ++#include ++#endif +--- libc/sysdeps/unix/sysv/linux/ia64/ldd-rewrite.sed.jj 2002-01-17 07:49:28.000000000 +0100 ++++ libc/sysdeps/unix/sysv/linux/ia64/ldd-rewrite.sed 2004-05-14 16:21:03.041325040 +0200 +@@ -1 +1,4 @@ +-s_^\(RTLDLIST=\)\([^ ]*\)-ia64\(\.so\.[0-9.]*\)[ ]*$_\1"\2-ia64\3 \2\3"_ ++/LD_TRACE_LOADED_OBJECTS=1/a\ ++add_env="$add_env LD_LIBRARY_VERSION=\\$verify_out" ++s_^\(RTLDLIST=\)/lib64/ld\([^ ]*\)-ia64\(\.so\.[0-9.]*\)[ ]*$_\1"/lib/ld\2-ia64\3 /lib/ld\2\3"_ ++s_^\(RTLDLIST=\)\([^"][^ ]*\)-ia64\(\.so\.[0-9.]*\)[ ]*$_\1"\2-ia64\3 \2\3"_ +--- libc/sysdeps/unix/sysv/linux/ia64/ldconfig.h.jj 2001-07-06 06:56:17.000000000 +0200 ++++ libc/sysdeps/unix/sysv/linux/ia64/ldconfig.h 2004-05-14 15:45:40.103783087 +0200 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 2001 Free Software Foundation, Inc. ++/* Copyright (C) 2001, 2004 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 +@@ -19,7 +19,8 @@ + #include + + #define SYSDEP_KNOWN_INTERPRETER_NAMES \ +- { "/lib/ld-linux.so.2", FLAG_ELF_LIBC6 }, ++ { "/lib/ld-linux.so.2", FLAG_ELF_LIBC6 }, \ ++ { "/lib64/ld-linux-ia64.so.2", FLAG_ELF_LIBC6 }, + #define SYSDEP_KNOWN_LIBRARY_NAMES \ + { "libc.so.6", FLAG_ELF_LIBC6 }, \ + { "libm.so.6", FLAG_ELF_LIBC6 }, +--- libc/sysdeps/unix/sysv/linux/ia64/dl-cache.h.jj 2001-07-06 06:56:17.000000000 +0200 ++++ libc/sysdeps/unix/sysv/linux/ia64/dl-cache.h 2004-05-14 15:41:11.658891907 +0200 +@@ -1,5 +1,5 @@ + /* Support for reading /etc/ld.so.cache files written by Linux ldconfig. +- Copyright (C) 2000 Free Software Foundation, Inc. ++ Copyright (C) 2000, 2004 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 +@@ -22,4 +22,4 @@ + #define _dl_cache_check_flags(flags) \ + ((flags) == _DL_CACHE_DEFAULT_ID) + +-#include_next ++#include +--- libc/sysdeps/unix/sysv/linux/ia64/dl-procinfo.h.jj 2004-05-14 15:42:13.018895395 +0200 ++++ libc/sysdeps/unix/sysv/linux/ia64/dl-procinfo.h 2003-07-23 00:06:23.000000000 +0200 +@@ -0,0 +1,5 @@ ++#ifdef IS_IN_ldconfig ++#include ++#else ++#include ++#endif diff --git a/SOURCES/glibc-localedata.patch b/SOURCES/glibc-localedata.patch new file mode 100644 index 0000000..15de7c6 --- /dev/null +++ b/SOURCES/glibc-localedata.patch @@ -0,0 +1,18 @@ +2010-05-04 Andreas Schwab + + * SUPPORTED (SUPPORTED-LOCALES): Fix name of tt_RU.UTF-8@iqtelif + locale. + +Index: glibc-2.12-2-gc4ccff1/localedata/SUPPORTED +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/localedata/SUPPORTED ++++ glibc-2.12-2-gc4ccff1/localedata/SUPPORTED +@@ -392,7 +392,7 @@ tr_TR.UTF-8/UTF-8 \ + tr_TR/ISO-8859-9 \ + ts_ZA/UTF-8 \ + tt_RU.UTF-8/UTF-8 \ +-tt_RU@iqtelif.UTF-8/UTF-8 \ ++tt_RU.UTF-8@iqtelif/UTF-8 \ + ug_CN/UTF-8 \ + uk_UA.UTF-8/UTF-8 \ + uk_UA/KOI8-U \ diff --git a/SOURCES/glibc-ppc-mnemonics.patch b/SOURCES/glibc-ppc-mnemonics.patch new file mode 100644 index 0000000..b805892 --- /dev/null +++ b/SOURCES/glibc-ppc-mnemonics.patch @@ -0,0 +1,11 @@ +diff -Nrup a/sysdeps/powerpc/Makefile b/sysdeps/powerpc/Makefile +--- a/sysdeps/powerpc/Makefile 2010-05-04 05:27:23.000000000 -0600 ++++ b/sysdeps/powerpc/Makefile 2013-05-28 09:56:51.056475174 -0600 +@@ -1,7 +1,3 @@ +-# We always want to use the new mnemonic syntax even if we are on a RS6000 +-# machine. +-+cflags += -mnew-mnemonics +- + ifeq ($(subdir),gmon) + sysdep_routines += ppc-mcount + endif diff --git a/SOURCES/glibc-recvmmsg.patch b/SOURCES/glibc-recvmmsg.patch new file mode 100644 index 0000000..9e3aa7a --- /dev/null +++ b/SOURCES/glibc-recvmmsg.patch @@ -0,0 +1,182 @@ +2010-05-21 Andreas Schwab + + * sysdeps/unix/sysv/linux/Makefile (sysdep_routines): Add recvmmsg + and internal_recvmmsg. + * sysdeps/unix/sysv/linux/recvmmsg.c: New file. + * sysdeps/unix/sysv/linux/internal_recvmmsg.S: New file. + * sysdeps/unix/sysv/linux/socketcall.h (SOCKOP_recvmmsg): Define. + * sysdeps/unix/sysv/linux/syscalls.list (recvmmsg): Remove. + +Index: glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/Makefile +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/sysdeps/unix/sysv/linux/Makefile ++++ glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/Makefile +@@ -12,7 +12,7 @@ CFLAGS-malloc.c += -DMORECORE_CLEARS=2 + endif + + ifeq ($(subdir),socket) +-sysdep_routines += internal_accept4 ++sysdep_routines += internal_accept4 recvmmsg internal_recvmmsg + endif + + ifeq ($(subdir),misc) +Index: glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/internal_recvmmsg.S +=================================================================== +--- /dev/null ++++ glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/internal_recvmmsg.S +@@ -0,0 +1,14 @@ ++#include ++#include ++#if !defined __NR_recvmmsg && defined __NR_socketcall ++# define socket recvmmsg ++# ifdef __ASSUME_RECVMMSG ++# define __socket recvmmsg ++# else ++# define __socket __internal_recvmmsg ++# endif ++# define NARGS 5 ++# define NEED_CANCELLATION ++# define NO_WEAK_ALIAS ++# include ++#endif +Index: glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/kernel-features.h +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/sysdeps/unix/sysv/linux/kernel-features.h ++++ glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/kernel-features.h +@@ -547,3 +547,8 @@ + #if __LINUX_KERNEL_VERSION >= 0x020620 + # define __ASSUME_F_GETOWN_EX 1 + #endif ++ ++/* Support for the recvmmsg syscall was added in 2.6.33. */ ++#if __LINUX_KERNEL_VERSION >= 0x020621 ++# define __ASSUME_RECVMMSG 1 ++#endif +Index: glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/recvmmsg.c +=================================================================== +--- /dev/null ++++ glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/recvmmsg.c +@@ -0,0 +1,100 @@ ++/* Copyright (C) 2010 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Andreas Schwab , 2010. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, write to the Free ++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++ 02111-1307 USA. */ ++ ++#include ++#include ++ ++#include ++#include ++#include ++ ++ ++#ifdef __NR_recvmmsg ++int ++recvmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags, ++ const struct timespec *tmo) ++{ ++ if (SINGLE_THREAD_P) ++ return INLINE_SYSCALL (recvmmsg, 5, fd, vmessages, vlen, flags, tmo); ++ ++ int oldtype = LIBC_CANCEL_ASYNC (); ++ ++ int result = INLINE_SYSCALL (recvmmsg, 5, fd, vmessages, vlen, flags, tmo); ++ ++ LIBC_CANCEL_RESET (oldtype); ++ ++ return result; ++} ++#elif defined __NR_socketcall ++# ifndef __ASSUME_RECVMMSG ++extern int __internal_recvmmsg (int fd, struct mmsghdr *vmessages, ++ unsigned int vlen, int flags, ++ const struct timespec *tmo) ++ attribute_hidden; ++ ++static int have_recvmmsg; ++ ++int ++recvmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags, ++ const struct timespec *tmo) ++{ ++ if (__builtin_expect (have_recvmmsg >= 0, 1)) ++ { ++ int ret = __internal_recvmmsg (fd, vmessages, vlen, flags, tmo); ++ /* The kernel returns -EINVAL for unknown socket operations. ++ We need to convert that error to an ENOSYS error. */ ++ if (__builtin_expect (ret < 0, 0) ++ && have_recvmmsg == 0 ++ && errno == EINVAL) ++ { ++ /* Try another call, this time with an invalid file ++ descriptor and all other parameters cleared. This call ++ will not cause any harm and it will return ++ immediately. */ ++ ret = __internal_recvmmsg (-1, 0, 0, 0, 0); ++ if (errno == EINVAL) ++ { ++ have_recvmmsg = -1; ++ __set_errno (ENOSYS); ++ } ++ else ++ { ++ have_recvmmsg = 1; ++ __set_errno (EINVAL); ++ } ++ return -1; ++ } ++ return ret; ++ } ++ __set_errno (ENOSYS); ++ return -1; ++} ++# else ++/* When __ASSUME_RECVMMSG recvmmsg is defined in internal_recvmmsg.S. */ ++# endif ++#else ++int ++recvmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags, ++ const struct timespec *tmo) ++{ ++ __set_errno (ENOSYS); ++ return -1; ++} ++stub_warning (recvmmsg) ++#endif +Index: glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/socketcall.h +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/sysdeps/unix/sysv/linux/socketcall.h ++++ glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/socketcall.h +@@ -44,5 +44,6 @@ + #define SOCKOP_sendmsg 16 + #define SOCKOP_recvmsg 17 + #define SOCKOP_accept4 18 ++#define SOCKOP_recvmmsg 19 + + #endif /* sys/socketcall.h */ +Index: glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/syscalls.list +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/sysdeps/unix/sysv/linux/syscalls.list ++++ glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/syscalls.list +@@ -53,7 +53,6 @@ prctl EXTRA prctl i:iiiii __prctl prc + putpmsg - putpmsg i:ippii putpmsg + query_module EXTRA query_module i:sipip query_module + quotactl EXTRA quotactl i:isip quotactl +-recvmmsg EXTRA recvmmsg Ci:ipiip recvmmsg + remap_file_pages - remap_file_pages i:piiii __remap_file_pages remap_file_pages + sched_getp - sched_getparam i:ip __sched_getparam sched_getparam + sched_gets - sched_getscheduler i:i __sched_getscheduler sched_getscheduler diff --git a/SOURCES/glibc-rh1048853.patch b/SOURCES/glibc-rh1048853.patch new file mode 100644 index 0000000..b6ad0d8 --- /dev/null +++ b/SOURCES/glibc-rh1048853.patch @@ -0,0 +1,20 @@ +diff -pruN a/include/sys/uio.h b/include/sys/uio.h +--- a/include/sys/uio.h ++++ b/include/sys/uio.h +@@ -2,12 +2,12 @@ + #include + + /* Now define the internal interfaces. */ +-extern ssize_t __readv (int __fd, __const struct iovec *__vector, ++extern ssize_t __readv (int __fd, const struct iovec *__iovec, + int __count); +-extern ssize_t __libc_readv (int __fd, __const struct iovec *__vector, ++extern ssize_t __libc_readv (int __fd, const struct iovec *__iovec, + int __count); +-extern ssize_t __writev (int __fd, __const struct iovec *__vector, ++extern ssize_t __writev (int __fd, const struct iovec *__iovec, + int __count); +-extern ssize_t __libc_writev (int __fd, __const struct iovec *__vector, ++extern ssize_t __libc_writev (int __fd, const struct iovec *__iovec, + int __count); + #endif diff --git a/SOURCES/glibc-rh580498.patch b/SOURCES/glibc-rh580498.patch new file mode 100644 index 0000000..05b673a --- /dev/null +++ b/SOURCES/glibc-rh580498.patch @@ -0,0 +1,296 @@ +2010-07-03 Ulrich Drepper + + * tst-abstime.c (do_test): Some more cleanups + +2010-07-02 Ulrich Drepper + + * tst-abstime.c: Correct testing and add test for sem_timedwait. + +2010-07-01 Andreas Schwab + Ulrich Drepper + + * Makefile (tests): Add tst-abstime. + * tst-abstime.c: New file. + * sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S + (__lll_timedlock_wait): Check for timestamp before the Epoch. + * sysdeps/unix/sysv/linux/x86_64/lowlevellock.S + (__lll_timedlock_wait): Likewise. + * sysdeps/unix/sysv/linux/x86_64/lowlevelrobustlock.S + (__lll_robust_timedlock_wait): Likewise. + * sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S + (__pthread_cond_timedwait): Likewise. + * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S + (pthread_rwlock_timedrdlock): Likewise. + * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedwrlock.S + (pthread_rwlock_timedwrlock): Likewise. + * sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S (sem_timedwait): + Likewise. + +Index: glibc-2.12-2-gc4ccff1/nptl/Makefile +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/nptl/Makefile ++++ glibc-2.12-2-gc4ccff1/nptl/Makefile +@@ -256,6 +256,7 @@ tests = tst-typesizes \ + tst-sched1 \ + tst-backtrace1 \ + tst-oddstacklimit \ ++ tst-abstime \ + tst-vfork1 tst-vfork2 tst-vfork1x tst-vfork2x \ + tst-getpid1 tst-getpid2 tst-getpid3 \ + tst-initializers1 $(patsubst %,tst-initializers1-%,c89 gnu89 c99 gnu99) +Index: glibc-2.12-2-gc4ccff1/nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S ++++ glibc-2.12-2-gc4ccff1/nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S +@@ -188,6 +188,9 @@ __lll_timedlock_wait: + je .Lreltmo + # endif + ++ cmpl $0, (%edx) ++ js 8f ++ + movl %ecx, %ebx + movl %esi, %ecx + movl %edx, %esi +@@ -223,6 +226,9 @@ __lll_timedlock_wait: + cfi_restore(%ebp) + ret + ++8: movl $ETIMEDOUT, %eax ++ jmp 7b ++ + # ifndef __ASSUME_FUTEX_CLOCK_REALTIME + .Lreltmo: + /* Check for a valid timeout value. */ +Index: glibc-2.12-2-gc4ccff1/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S ++++ glibc-2.12-2-gc4ccff1/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S +@@ -169,9 +169,13 @@ __lll_timedlock_wait: + je .Lreltmo + # endif + ++ cmpq $0, (%rdx) ++ js 5f ++ + pushq %r9 + cfi_adjust_cfa_offset(8) + cfi_rel_offset(%r9, 0) ++ + movq %rdx, %r10 + movl $0xffffffff, %r9d + LOAD_FUTEX_WAIT_ABS (%esi) +@@ -202,6 +206,9 @@ __lll_timedlock_wait: + cfi_restore(%r9) + retq + ++5: movl $ETIMEDOUT, %eax ++ retq ++ + # ifndef __ASSUME_FUTEX_CLOCK_REALTIME + .Lreltmo: + /* Check for a valid timeout value. */ +Index: glibc-2.12-2-gc4ccff1/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevelrobustlock.S +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevelrobustlock.S ++++ glibc-2.12-2-gc4ccff1/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevelrobustlock.S +@@ -125,6 +125,9 @@ __lll_robust_timedlock_wait: + je .Lreltmo + # endif + ++ cmpq $0, (%rdx) ++ js 7f ++ + pushq %r9 + cfi_adjust_cfa_offset(8) + cfi_rel_offset(%r9, 0) +@@ -180,6 +183,9 @@ __lll_robust_timedlock_wait: + cfi_adjust_cfa_offset(-8) + cfi_restore(%r9) + ++7: movl $ETIMEDOUT, %eax ++ retq ++ + + # ifndef __ASSUME_FUTEX_CLOCK_REALTIME + .Lreltmo: +Index: glibc-2.12-2-gc4ccff1/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S ++++ glibc-2.12-2-gc4ccff1/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S +@@ -144,6 +144,10 @@ __pthread_cond_timedwait: + movq %r9, 24(%rsp) + movl %edx, 4(%rsp) + ++ cmpq $0, (%r13) ++ movq $-ETIMEDOUT, %r14 ++ js 36f ++ + 38: movl cond_futex(%rdi), %r12d + + /* Unlock. */ +Index: glibc-2.12-2-gc4ccff1/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S ++++ glibc-2.12-2-gc4ccff1/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S +@@ -102,6 +102,9 @@ pthread_rwlock_timedrdlock: + je .Lreltmo + #endif + ++ cmpq $0, (%r13) ++ js 16f /* Time is already up. */ ++ + movl $FUTEX_PRIVATE_FLAG|FUTEX_WAIT_BITSET|FUTEX_CLOCK_REALTIME, %esi + xorl PSHARED(%r12), %esi + movq %r13, %r10 +Index: glibc-2.12-2-gc4ccff1/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedwrlock.S +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedwrlock.S ++++ glibc-2.12-2-gc4ccff1/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedwrlock.S +@@ -99,6 +99,9 @@ pthread_rwlock_timedwrlock: + je .Lreltmo + #endif + ++ cmpq $0, (%r13) ++ js 16f /* Time is already up. */ ++ + movl $FUTEX_PRIVATE_FLAG|FUTEX_WAIT_BITSET|FUTEX_CLOCK_REALTIME, %esi + xorl PSHARED(%r12), %esi + movq %r13, %r10 +Index: glibc-2.12-2-gc4ccff1/nptl/sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/nptl/sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S ++++ glibc-2.12-2-gc4ccff1/nptl/sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S +@@ -77,6 +77,9 @@ sem_timedwait: + je .Lreltmo + #endif + ++ cmpq $0, (%rsi) ++ js 16f ++ + /* This push is only needed to store the sem_t pointer for the + exception handler. */ + pushq %rdi +@@ -169,6 +172,19 @@ sem_timedwait: + + retq + ++16: ++#if USE___THREAD ++ movq errno@gottpoff(%rip), %rdx ++ movl $ETIMEDOUT, %fs:(%rdx) ++#else ++ callq __errno_location@plt ++ movl $ETIMEDOUT, (%rax) ++#endif ++ ++ orl $-1, %eax ++ ++ retq ++ + #ifndef __ASSUME_FUTEX_CLOCK_REALTIME + .Lreltmo: + pushq %r12 +Index: glibc-2.12-2-gc4ccff1/nptl/tst-abstime.c +=================================================================== +--- /dev/null ++++ glibc-2.12-2-gc4ccff1/nptl/tst-abstime.c +@@ -0,0 +1,98 @@ ++/* Copyright (C) 2010 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Andreas Schwab , 2010. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, write to the Free ++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++ 02111-1307 USA. */ ++ ++#include ++#include ++#include ++#include ++ ++static pthread_cond_t c = PTHREAD_COND_INITIALIZER; ++static pthread_mutex_t m1 = PTHREAD_MUTEX_INITIALIZER; ++static pthread_mutex_t m2 = PTHREAD_MUTEX_INITIALIZER; ++static pthread_rwlock_t rw1 = PTHREAD_RWLOCK_INITIALIZER; ++static pthread_rwlock_t rw2 = PTHREAD_RWLOCK_INITIALIZER; ++static sem_t sem; ++ ++static void * ++th (void *arg) ++{ ++ long int res = 0; ++ int r; ++ struct timespec t = { -2, 0 }; ++ ++ r = pthread_mutex_timedlock (&m1, &t); ++ if (r != ETIMEDOUT) ++ { ++ puts ("pthread_mutex_timedlock did not return ETIMEDOUT"); ++ res = 1; ++ } ++ r = pthread_rwlock_timedrdlock (&rw1, &t); ++ if (r != ETIMEDOUT) ++ { ++ puts ("pthread_rwlock_timedrdlock did not return ETIMEDOUT"); ++ res = 1; ++ } ++ r = pthread_rwlock_timedwrlock (&rw2, &t); ++ if (r != ETIMEDOUT) ++ { ++ puts ("pthread_rwlock_timedwrlock did not return ETIMEDOUT"); ++ res = 1; ++ } ++ return (void *) res; ++} ++ ++static int ++do_test (void) ++{ ++ int res = 0; ++ int r; ++ struct timespec t = { -2, 0 }; ++ pthread_t pth; ++ ++ sem_init (&sem, 0, 0); ++ r = sem_timedwait (&sem, &t); ++ if (r != -1 || errno != ETIMEDOUT) ++ { ++ puts ("sem_timedwait did not fail with ETIMEDOUT"); ++ res = 1; ++ } ++ ++ pthread_mutex_lock (&m1); ++ pthread_rwlock_wrlock (&rw1); ++ pthread_rwlock_rdlock (&rw2); ++ pthread_mutex_lock (&m2); ++ if (pthread_create (&pth, 0, th, 0) != 0) ++ { ++ puts ("cannot create thread"); ++ return 1; ++ } ++ r = pthread_cond_timedwait (&c, &m2, &t); ++ if (r != ETIMEDOUT) ++ { ++ puts ("pthread_cond_timedwait did not return ETIMEDOUT"); ++ res = 1; ++ } ++ void *thres; ++ pthread_join (pth, &thres); ++ return res | (thres != NULL); ++} ++ ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" diff --git a/SOURCES/glibc-rh582738.patch b/SOURCES/glibc-rh582738.patch new file mode 100644 index 0000000..40f7b80 --- /dev/null +++ b/SOURCES/glibc-rh582738.patch @@ -0,0 +1,13 @@ +Index: glibc-2.11-382-g1cdb215/nscd/nscd.init +=================================================================== +--- glibc-2.11-382-g1cdb215.orig/nscd/nscd.init ++++ glibc-2.11-382-g1cdb215/nscd/nscd.init +@@ -76,7 +76,7 @@ case "$1" in + RETVAL=$? + ;; + stop) +- stop ++ [ ! -e /var/lock/subsys/nscd ] || stop + RETVAL=$? + ;; + status) diff --git a/SOURCES/glibc-rh587360.patch b/SOURCES/glibc-rh587360.patch new file mode 100644 index 0000000..07b62e6 --- /dev/null +++ b/SOURCES/glibc-rh587360.patch @@ -0,0 +1,13 @@ +Index: glibc-2.11-382-g1cdb215/posix/regexec.c +=================================================================== +--- glibc-2.11-382-g1cdb215.orig/posix/regexec.c ++++ glibc-2.11-382-g1cdb215/posix/regexec.c +@@ -4031,7 +4031,7 @@ find_collation_sequence_value (const uns + /* Skip the collation sequence value. */ + idx += sizeof (uint32_t); + /* Skip the wide char sequence of the collating element. */ +- idx = idx + sizeof (uint32_t) * (extra[idx] + 1); ++ idx = idx + sizeof (uint32_t) * (*(int32_t *) (extra + idx) + 1); + /* If we found the entry, return the sequence value. */ + if (found) + return *(uint32_t *) (extra + idx); diff --git a/SOURCES/glibc-rh593396.patch b/SOURCES/glibc-rh593396.patch new file mode 100644 index 0000000..b907a36 --- /dev/null +++ b/SOURCES/glibc-rh593396.patch @@ -0,0 +1,42 @@ +2010-05-06 Ulrich Drepper + + * malloc/malloc.c (_int_free): Possible race in the most recently + added check. Only act on the data if no current modification + happened. + +Index: glibc-2.12-2-gc4ccff1/malloc/malloc.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/malloc/malloc.c ++++ glibc-2.12-2-gc4ccff1/malloc/malloc.c +@@ -4859,6 +4859,7 @@ _int_free(mstate av, mchunkptr p) + #ifdef ATOMIC_FASTBINS + mchunkptr fd; + mchunkptr old = *fb; ++ unsigned int old_idx = ~0u; + do + { + /* Another simple check: make sure the top of the bin is not the +@@ -4868,15 +4869,17 @@ _int_free(mstate av, mchunkptr p) + errstr = "double free or corruption (fasttop)"; + goto errout; + } +- if (old != NULL +- && __builtin_expect (fastbin_index(chunksize(old)) != idx, 0)) +- { +- errstr = "invalid fastbin entry (free)"; +- goto errout; +- } ++ if (old != NULL) ++ old_idx = fastbin_index(chunksize(old)); + p->fd = fd = old; + } + while ((old = catomic_compare_and_exchange_val_rel (fb, p, fd)) != fd); ++ ++ if (fd != NULL && __builtin_expect (old_idx != idx, 0)) ++ { ++ errstr = "invalid fastbin entry (free)"; ++ goto errout; ++ } + #else + /* Another simple check: make sure the top of the bin is not the + record we are going to add (i.e., double free). */ diff --git a/SOURCES/glibc-rh593686.patch b/SOURCES/glibc-rh593686.patch new file mode 100644 index 0000000..3eceb68 --- /dev/null +++ b/SOURCES/glibc-rh593686.patch @@ -0,0 +1,179 @@ +2010-05-26 Andreas Schwab + + * elf/Makefile: Add rules to build and run unload8 test. + * elf/unload8.c: New file. + * elf/unload8mod1.c: New file. + * elf/unload8mod1x.c: New file. + * elf/unload8mod2.c: New file. + * elf/unload8mod3.c: New file. + + * elf/dl-close.c (_dl_close_worker): Reset private search list if + it wasn't used. + +Index: glibc-2.12-2-gc4ccff1/elf/Makefile +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/elf/Makefile ++++ glibc-2.12-2-gc4ccff1/elf/Makefile +@@ -89,6 +89,7 @@ distribute := rtld-Rules \ + unload4mod1.c unload4mod2.c unload4mod3.c unload4mod4.c \ + unload6mod1.c unload6mod2.c unload6mod3.c \ + unload7mod1.c unload7mod2.c \ ++ unload8mod1.c unload8mod1x.c unload8mod2.c unload8mod3.c \ + tst-audit1.c tst-audit2.c tst-audit3.c tst-audit4.c \ + tst-auditmod1.c tst-auditmod3a.c tst-auditmod3b.c \ + tst-auditmod4a.c tst-auditmod4b.c \ +@@ -196,7 +197,7 @@ tests += loadtest restest1 preloadtest l + tst-align tst-align2 $(tests-execstack-$(have-z-execstack)) \ + tst-dlmodcount tst-dlopenrpath tst-deep1 \ + tst-dlmopen1 tst-dlmopen2 tst-dlmopen3 \ +- unload3 unload4 unload5 unload6 unload7 tst-global1 order2 \ ++ unload3 unload4 unload5 unload6 unload7 unload8 tst-global1 order2 \ + tst-audit1 tst-audit2 \ + tst-stackguard1 tst-addr1 tst-thrlock \ + tst-unique1 tst-unique2 +@@ -247,6 +248,7 @@ modules-names = testobj1 testobj2 testob + unload4mod1 unload4mod2 unload4mod3 unload4mod4 \ + unload6mod1 unload6mod2 unload6mod3 \ + unload7mod1 unload7mod2 \ ++ unload8mod1 unload8mod1x unload8mod2 unload8mod3 \ + order2mod1 order2mod2 order2mod3 order2mod4 \ + tst-unique1mod1 tst-unique1mod2 \ + tst-unique2mod1 tst-unique2mod2 +@@ -522,6 +524,9 @@ $(objpfx)unload6mod2.so: $(libdl) + $(objpfx)unload6mod3.so: $(libdl) + $(objpfx)unload7mod1.so: $(libdl) + $(objpfx)unload7mod2.so: $(objpfx)unload7mod1.so ++$(objpfx)unload8mod1.so: $(objpfx)unload8mod2.so ++$(objpfx)unload8mod2.so: $(objpfx)unload8mod3.so ++$(objpfx)unload8mod3.so: $(libdl) + + LDFLAGS-tst-tlsmod5.so = -nostdlib + LDFLAGS-tst-tlsmod6.so = -nostdlib +@@ -823,6 +828,9 @@ $(objpfx)unload7: $(libdl) + $(objpfx)unload7.out: $(objpfx)unload7mod1.so $(objpfx)unload7mod2.so + unload7-ENV = MALLOC_PERTURB_=85 + ++$(objpfx)unload8: $(libdl) ++$(objpfx)unload8.out: $(objpfx)unload8mod1.so $(objpfx)unload8mod1x.so ++ + ifdef libdl + $(objpfx)tst-tls9-static: $(common-objpfx)dlfcn/libdl.a + $(objpfx)tst-tls9-static.out: $(objpfx)tst-tlsmod5.so $(objpfx)tst-tlsmod6.so +Index: glibc-2.12-2-gc4ccff1/elf/dl-close.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/elf/dl-close.c ++++ glibc-2.12-2-gc4ccff1/elf/dl-close.c +@@ -421,6 +421,13 @@ _dl_close_worker (struct link_map *map) + + imap->l_scope_max = new_size; + } ++ else if (new_list != NULL) ++ { ++ /* We didn't change the scope array, so reset the search ++ list. */ ++ imap->l_searchlist.r_list = NULL; ++ imap->l_searchlist.r_nlist = 0; ++ } + + /* The loader is gone, so mark the object as not having one. + Note: l_idx != IDX_STILL_USED -> object will be removed. */ +Index: glibc-2.12-2-gc4ccff1/elf/unload8.c +=================================================================== +--- /dev/null ++++ glibc-2.12-2-gc4ccff1/elf/unload8.c +@@ -0,0 +1,33 @@ ++#include ++#include ++ ++int ++main (void) ++{ ++ void *h = dlopen ("$ORIGIN/unload8mod1.so", RTLD_LAZY); ++ if (h == NULL) ++ { ++ puts ("dlopen unload8mod1.so failed"); ++ return 1; ++ } ++ ++ void *h2 = dlopen ("$ORIGIN/unload8mod1x.so", RTLD_LAZY); ++ if (h2 == NULL) ++ { ++ puts ("dlopen unload8mod1x.so failed"); ++ return 1; ++ } ++ dlclose (h2); ++ ++ int (*mod1) (void) = dlsym (h, "mod1"); ++ if (mod1 == NULL) ++ { ++ puts ("dlsym failed"); ++ return 1; ++ } ++ ++ mod1 (); ++ dlclose (h); ++ ++ return 0; ++} +Index: glibc-2.12-2-gc4ccff1/elf/unload8mod1.c +=================================================================== +--- /dev/null ++++ glibc-2.12-2-gc4ccff1/elf/unload8mod1.c +@@ -0,0 +1,7 @@ ++extern void mod2 (void); ++ ++void ++mod1 (void) ++{ ++ mod2 (); ++} +Index: glibc-2.12-2-gc4ccff1/elf/unload8mod1x.c +=================================================================== +--- /dev/null ++++ glibc-2.12-2-gc4ccff1/elf/unload8mod1x.c +@@ -0,0 +1 @@ ++int mod1x; +Index: glibc-2.12-2-gc4ccff1/elf/unload8mod2.c +=================================================================== +--- /dev/null ++++ glibc-2.12-2-gc4ccff1/elf/unload8mod2.c +@@ -0,0 +1,7 @@ ++extern void mod3 (void); ++ ++void ++mod2 (void) ++{ ++ mod3 (); ++} +Index: glibc-2.12-2-gc4ccff1/elf/unload8mod3.c +=================================================================== +--- /dev/null ++++ glibc-2.12-2-gc4ccff1/elf/unload8mod3.c +@@ -0,0 +1,27 @@ ++#include ++#include ++#include ++ ++void ++mod3_fini2 (void) ++{ ++} ++ ++void ++mod3_fini (void) ++{ ++ mod3_fini2 (); ++} ++ ++void ++mod3 (void) ++{ ++ void *h = dlopen ("$ORIGIN/unload8mod2.so", RTLD_LAZY); ++ if (h == NULL) ++ { ++ puts ("dlopen unload8mod2.so failed"); ++ exit (1); ++ } ++ ++ atexit (mod3_fini); ++} diff --git a/SOURCES/glibc-rh601686.patch b/SOURCES/glibc-rh601686.patch new file mode 100644 index 0000000..01e42dc --- /dev/null +++ b/SOURCES/glibc-rh601686.patch @@ -0,0 +1,4640 @@ +2010-11-09 H.J. Lu + + [BZ #12205] + * string/test-strncasecmp.c (check_result): New function. + (do_one_test): Use it. + (check1): New function. + (test_main): Use it. + * sysdeps/i386/i686/multiarch/strcmp.S (nibble_ashr_use_sse4_2_exit): + Support strcasecmp and strncasecmp. + +2010-10-03 Ulrich Drepper + + [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-09-20 Ulrich Drepper + + * sysdeps/x86_64/strcmp.S: Fix another type in strncasecmp limit + detection. + +2010-08-19 Ulrich Drepper + + * sysdeps/x86_64/multiarch/strcmp.S: Fix two typos in strncasecmp + handling. + +2010-08-15 Ulrich Drepper + + * sysdeps/x86_64/strcmp.S: Use correct register for fourth parameter + of strncasecmp_l. + * sysdeps/multiarch/strcmp.S: Likewise. + +2010-08-14 Ulrich Drepper + + * sysdeps/x86_64/Makefile [subdir=string] (sysdep_routines): Add + strncase_l-nonascii. + * sysdeps/x86_64/multiarch/Makefile [subdir=string] (sysdep_routines): + Add strncase_l-ssse3. + * sysdeps/x86_64/multiarch/strcmp.S: Prepare for use as strncasecmp. + * sysdeps/x86_64/strcmp.S: Likewise. + * sysdeps/x86_64/multiarch/strncase_l-ssse3.S: New file. + * sysdeps/x86_64/multiarch/strncase_l.S: New file. + * sysdeps/x86_64/strncase.S: New file. + * sysdeps/x86_64/strncase_l-nonascii.c: New file. + * sysdeps/x86_64/strncase_l.S: New file. + * string/Makefile (strop-tests): Add strncasecmp. + * string/test-strncasecmp.c: New file. + + * sysdeps/x86_64/strcasecmp_l-nonascii.c: Add prototype to avoid + warning. + + * sysdeps/x86_64/strcmp.S: Move definition of NO_NOLOCALE_ALIAS to... + * sysdeps/x86_64/multiarch/strcasecmp_l-ssse3.S: ... here. + +2010-07-31 Ulrich Drepper + + * sysdeps/x86_64/multiarch/Makefile [subdir=string] (sysdep_routines): + Add strcasecmp_l-ssse3. + * sysdeps/x86_64/multiarch/strcmp.S: Add support to compile for + strcasecmp. + * sysdeps/x86_64/strcmp.S: Allow more flexible compiling of strcasecmp. + * sysdeps/x86_64/multiarch/strcasecmp_l.S: New file. + * sysdeps/x86_64/multiarch/strcasecmp_l-ssse3.S: New file. + +2010-07-30 Ulrich Drepper + + * sysdeps/x86_64/multiarch/strcmp.S: Pretty printing. + + * string/Makefile (strop-tests): Add strcasecmp. + * sysdeps/x86_64/Makefile [subdir=string] (sysdep_routines): Add + strcasecmp_l-nonascii. + (gen-as-const-headers): Add locale-defines.sym. + * sysdeps/x86_64/strcmp.S: Add support for strcasecmp implementation. + * sysdeps/x86_64/strcasecmp.S: New file. + * sysdeps/x86_64/strcasecmp_l.S: New file. + * sysdeps/x86_64/strcasecmp_l-nonascii.c: New file. + * sysdeps/x86_64/locale-defines.sym: New file. + * string/test-strcasecmp.c: New file. + + * string/test-strcasestr.c: Test both ends of the range of characters. + * sysdeps/x86_64/multiarch/strstr.c: Fix UCHIGH definition. + +2010-07-26 Ulrich Drepper + + * string/test-strnlen.c: New file. + * string/Makefile (strop-tests): Add strnlen. + * string/tester.c (test_strnlen): Add a few more test cases. + * string/tst-strlen.c: Better error reporting. + + * sysdeps/x86_64/strnlen.S: New file. + +2010-07-24 Ulrich Drepper + + * sysdeps/x86_64/multiarch/strstr.c (__m128i_strloadu_tolower): Use + lower-latency instructions. + +2010-07-23 Ulrich Drepper + + * string/test-strcasestr.c: New file. + * string/test-strstr.c: New file. + * string/Makefile (strop-tests): Add strstr and strcasestr. + * string/str-two-way.h: Don't undefine MAX. + * string/strcasestr.c: Don't define alias if NO_ALIAS is defined. + +2010-07-21 Andreas Schwab + + * sysdeps/i386/i686/multiarch/Makefile (sysdep_routines): Add + strcasestr-nonascii. + (CFLAGS-strcasestr-nonascii.c): Define. + * sysdeps/i386/i686/multiarch/strcasestr-nonascii.c: New file. + * sysdeps/x86_64/multiarch/strcasestr-nonascii.c (STRSTR_SSE42): + Remove unused attribute. + +2010-07-16 Ulrich Drepper + + * sysdeps/x86_64/multiarch/strstr.c: Rewrite to avoid indirect function + call in strcasestr. + * sysdeps/x86_64/multiarch/strcasestr.c: Declare + __strcasestr_sse42_nonascii. + * sysdeps/x86_64/multiarch/Makefile: Add rules to build + strcasestr-nonascii.c. + * sysdeps/x86_64/multiarch/strcasestr-nonascii.c: New file. + +Index: glibc-2.12-2-gc4ccff1/string/Makefile +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/string/Makefile ++++ glibc-2.12-2-gc4ccff1/string/Makefile +@@ -48,7 +48,8 @@ o-objects.ob := memcpy.o memset.o memchr + + strop-tests := memchr memcmp memcpy memmove mempcpy memset memccpy \ + stpcpy stpncpy strcat strchr strcmp strcpy strcspn \ +- strlen strncmp strncpy strpbrk strrchr strspn memmem ++ strlen strncmp strncpy strpbrk strrchr strspn memmem \ ++ strstr strcasestr strnlen strcasecmp strncasecmp + tests := tester inl-tester noinl-tester testcopy test-ffs \ + tst-strlen stratcliff tst-svc tst-inlcall \ + bug-strncat1 bug-strspn1 bug-strpbrk1 tst-bswap \ +Index: glibc-2.12-2-gc4ccff1/string/str-two-way.h +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/string/str-two-way.h ++++ glibc-2.12-2-gc4ccff1/string/str-two-way.h +@@ -426,5 +426,4 @@ two_way_long_needle (const unsigned char + #undef AVAILABLE + #undef CANON_ELEMENT + #undef CMP_FUNC +-#undef MAX + #undef RETURN_TYPE +Index: glibc-2.12-2-gc4ccff1/string/stratcliff.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/string/stratcliff.c ++++ glibc-2.12-2-gc4ccff1/string/stratcliff.c +@@ -47,6 +47,8 @@ + # define MEMCPY memcpy + # define MEMPCPY mempcpy + # define MEMCHR memchr ++# define STRCMP strcmp ++# define STRNCMP strncmp + #endif + + +@@ -277,7 +279,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'); +Index: glibc-2.12-2-gc4ccff1/string/strcasestr.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/string/strcasestr.c ++++ glibc-2.12-2-gc4ccff1/string/strcasestr.c +@@ -103,4 +103,6 @@ STRCASESTR (const char *haystack_start, + + #undef LONG_NEEDLE_THRESHOLD + ++#ifndef NO_ALIAS + weak_alias (__strcasestr, strcasestr) ++#endif +Index: glibc-2.12-2-gc4ccff1/string/test-strcasecmp.c +=================================================================== +--- /dev/null ++++ glibc-2.12-2-gc4ccff1/string/test-strcasecmp.c +@@ -0,0 +1,276 @@ ++/* Test and measure strcasecmp functions. ++ Copyright (C) 1999, 2002, 2003, 2005, 2010 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Written by Jakub Jelinek , 1999. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, write to the Free ++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++ 02111-1307 USA. */ ++ ++#include ++#define TEST_MAIN ++#include "test-string.h" ++ ++typedef int (*proto_t) (const char *, const char *); ++static int simple_strcasecmp (const char *, const char *); ++static int stupid_strcasecmp (const char *, const char *); ++ ++IMPL (stupid_strcasecmp, 0) ++IMPL (simple_strcasecmp, 0) ++IMPL (strcasecmp, 1) ++ ++static int ++simple_strcasecmp (const char *s1, const char *s2) ++{ ++ int ret; ++ ++ while ((ret = ((unsigned char) tolower (*s1) ++ - (unsigned char) tolower (*s2))) == 0 ++ && *s1++) ++ ++s2; ++ return ret; ++} ++ ++static int ++stupid_strcasecmp (const char *s1, const char *s2) ++{ ++ size_t ns1 = strlen (s1) + 1, ns2 = strlen (s2) + 1; ++ size_t n = ns1 < ns2 ? ns1 : ns2; ++ int ret = 0; ++ ++ while (n--) ++ { ++ if ((ret = ((unsigned char) tolower (*s1) ++ - (unsigned char) tolower (*s2))) != 0) ++ break; ++ ++s1; ++ ++s2; ++ } ++ return ret; ++} ++ ++static void ++do_one_test (impl_t *impl, const char *s1, const char *s2, int exp_result) ++{ ++ int result = CALL (impl, s1, s2); ++ if ((exp_result == 0 && result != 0) ++ || (exp_result < 0 && result >= 0) ++ || (exp_result > 0 && result <= 0)) ++ { ++ error (0, 0, "Wrong result in function %s %d %d", impl->name, ++ result, exp_result); ++ ret = 1; ++ return; ++ } ++ ++ if (HP_TIMING_AVAIL) ++ { ++ hp_timing_t start __attribute ((unused)); ++ hp_timing_t stop __attribute ((unused)); ++ hp_timing_t best_time = ~ (hp_timing_t) 0; ++ size_t i; ++ ++ for (i = 0; i < 32; ++i) ++ { ++ HP_TIMING_NOW (start); ++ CALL (impl, s1, s2); ++ HP_TIMING_NOW (stop); ++ HP_TIMING_BEST (best_time, start, stop); ++ } ++ ++ printf ("\t%zd", (size_t) best_time); ++ } ++} ++ ++static void ++do_test (size_t align1, size_t align2, size_t len, int max_char, ++ int exp_result) ++{ ++ size_t i; ++ char *s1, *s2; ++ ++ if (len == 0) ++ return; ++ ++ align1 &= 7; ++ if (align1 + len + 1 >= page_size) ++ return; ++ ++ align2 &= 7; ++ if (align2 + len + 1 >= page_size) ++ return; ++ ++ s1 = (char *) (buf1 + align1); ++ s2 = (char *) (buf2 + align2); ++ ++ for (i = 0; i < len; i++) ++ { ++ s1[i] = toupper (1 + 23 * i % max_char); ++ s2[i] = tolower (s1[i]); ++ } ++ ++ s1[len] = s2[len] = 0; ++ s1[len + 1] = 23; ++ s2[len + 1] = 24 + exp_result; ++ if ((s2[len - 1] == 'z' && exp_result == -1) ++ || (s2[len - 1] == 'a' && exp_result == 1)) ++ s1[len - 1] += exp_result; ++ else ++ s2[len - 1] -= exp_result; ++ ++ if (HP_TIMING_AVAIL) ++ printf ("Length %4zd, alignment %2zd/%2zd:", len, align1, align2); ++ ++ FOR_EACH_IMPL (impl, 0) ++ do_one_test (impl, s1, s2, exp_result); ++ ++ if (HP_TIMING_AVAIL) ++ putchar ('\n'); ++} ++ ++static void ++do_random_tests (void) ++{ ++ size_t i, j, n, align1, align2, pos, len1, len2; ++ int result; ++ long r; ++ unsigned char *p1 = buf1 + page_size - 512; ++ unsigned char *p2 = buf2 + page_size - 512; ++ ++ for (n = 0; n < ITERATIONS; n++) ++ { ++ align1 = random () & 31; ++ if (random () & 1) ++ align2 = random () & 31; ++ else ++ align2 = align1 + (random () & 24); ++ pos = random () & 511; ++ j = align1 > align2 ? align1 : align2; ++ if (pos + j >= 511) ++ pos = 510 - j - (random () & 7); ++ len1 = random () & 511; ++ if (pos >= len1 && (random () & 1)) ++ len1 = pos + (random () & 7); ++ if (len1 + j >= 512) ++ len1 = 511 - j - (random () & 7); ++ if (pos >= len1) ++ len2 = len1; ++ else ++ len2 = len1 + (len1 != 511 - j ? random () % (511 - j - len1) : 0); ++ j = (pos > len2 ? pos : len2) + align1 + 64; ++ if (j > 512) ++ j = 512; ++ for (i = 0; i < j; ++i) ++ { ++ p1[i] = tolower (random () & 255); ++ if (i < len1 + align1 && !p1[i]) ++ { ++ p1[i] = tolower (random () & 255); ++ if (!p1[i]) ++ p1[i] = tolower (1 + (random () & 127)); ++ } ++ } ++ for (i = 0; i < j; ++i) ++ { ++ p2[i] = toupper (random () & 255); ++ if (i < len2 + align2 && !p2[i]) ++ { ++ p2[i] = toupper (random () & 255); ++ if (!p2[i]) ++ toupper (p2[i] = 1 + (random () & 127)); ++ } ++ } ++ ++ result = 0; ++ memcpy (p2 + align2, p1 + align1, pos); ++ if (pos < len1) ++ { ++ if (tolower (p2[align2 + pos]) == p1[align1 + pos]) ++ { ++ p2[align2 + pos] = toupper (random () & 255); ++ if (tolower (p2[align2 + pos]) == p1[align1 + pos]) ++ p2[align2 + pos] = toupper (p1[align1 + pos] ++ + 3 + (random () & 127)); ++ } ++ ++ if (p1[align1 + pos] < tolower (p2[align2 + pos])) ++ result = -1; ++ else ++ result = 1; ++ } ++ p1[len1 + align1] = 0; ++ p2[len2 + align2] = 0; ++ ++ FOR_EACH_IMPL (impl, 1) ++ { ++ r = CALL (impl, (char *) (p1 + align1), (char *) (p2 + align2)); ++ /* Test whether on 64-bit architectures where ABI requires ++ callee to promote has the promotion been done. */ ++ asm ("" : "=g" (r) : "0" (r)); ++ if ((r == 0 && result) ++ || (r < 0 && result >= 0) ++ || (r > 0 && result <= 0)) ++ { ++ error (0, 0, "Iteration %zd - wrong result in function %s (%zd, %zd, %zd, %zd, %zd) %ld != %d, p1 %p p2 %p", ++ n, impl->name, align1, align2, len1, len2, pos, r, result, p1, p2); ++ ret = 1; ++ } ++ } ++ } ++} ++ ++int ++test_main (void) ++{ ++ size_t i; ++ ++ test_init (); ++ ++ printf ("%23s", ""); ++ FOR_EACH_IMPL (impl, 0) ++ printf ("\t%s", impl->name); ++ putchar ('\n'); ++ ++ for (i = 1; i < 16; ++i) ++ { ++ do_test (i, i, i, 127, 0); ++ do_test (i, i, i, 127, 1); ++ do_test (i, i, i, 127, -1); ++ } ++ ++ for (i = 1; i < 10; ++i) ++ { ++ do_test (0, 0, 2 << i, 127, 0); ++ do_test (0, 0, 2 << i, 254, 0); ++ do_test (0, 0, 2 << i, 127, 1); ++ do_test (0, 0, 2 << i, 254, 1); ++ do_test (0, 0, 2 << i, 127, -1); ++ do_test (0, 0, 2 << i, 254, -1); ++ } ++ ++ for (i = 1; i < 8; ++i) ++ { ++ do_test (i, 2 * i, 8 << i, 127, 0); ++ do_test (2 * i, i, 8 << i, 254, 0); ++ do_test (i, 2 * i, 8 << i, 127, 1); ++ do_test (2 * i, i, 8 << i, 254, 1); ++ do_test (i, 2 * i, 8 << i, 127, -1); ++ do_test (2 * i, i, 8 << i, 254, -1); ++ } ++ ++ do_random_tests (); ++ return ret; ++} ++ ++#include "../test-skeleton.c" +Index: glibc-2.12-2-gc4ccff1/string/test-strcasestr.c +=================================================================== +--- /dev/null ++++ glibc-2.12-2-gc4ccff1/string/test-strcasestr.c +@@ -0,0 +1,197 @@ ++/* Test and measure strcasestr functions. ++ Copyright (C) 2010 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Written by Ulrich Drepper , 2010. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, write to the Free ++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++ 02111-1307 USA. */ ++ ++#define TEST_MAIN ++#include "test-string.h" ++ ++ ++#define STRCASESTR simple_strcasestr ++#define NO_ALIAS ++#define __strncasecmp strncasecmp ++#include "strcasestr.c" ++ ++ ++static char * ++stupid_strcasestr (const char *s1, const char *s2) ++{ ++ ssize_t s1len = strlen (s1); ++ ssize_t s2len = strlen (s2); ++ ++ if (s2len > s1len) ++ return NULL; ++ ++ for (ssize_t i = 0; i <= s1len - s2len; ++i) ++ { ++ size_t j; ++ for (j = 0; j < s2len; ++j) ++ if (tolower (s1[i + j]) != tolower (s2[j])) ++ break; ++ if (j == s2len) ++ return (char *) s1 + i; ++ } ++ ++ return NULL; ++} ++ ++ ++typedef char *(*proto_t) (const char *, const char *); ++ ++IMPL (stupid_strcasestr, 0) ++IMPL (simple_strcasestr, 0) ++IMPL (strcasestr, 1) ++ ++ ++static void ++do_one_test (impl_t *impl, const char *s1, const char *s2, char *exp_result) ++{ ++ char *result = CALL (impl, s1, s2); ++ if (result != exp_result) ++ { ++ error (0, 0, "Wrong result in function %s %s %s", impl->name, ++ result, exp_result); ++ ret = 1; ++ return; ++ } ++ ++ if (HP_TIMING_AVAIL) ++ { ++ hp_timing_t start __attribute ((unused)); ++ hp_timing_t stop __attribute ((unused)); ++ hp_timing_t best_time = ~(hp_timing_t) 0; ++ size_t i; ++ ++ for (i = 0; i < 32; ++i) ++ { ++ HP_TIMING_NOW (start); ++ CALL (impl, s1, s2); ++ HP_TIMING_NOW (stop); ++ HP_TIMING_BEST (best_time, start, stop); ++ } ++ ++ printf ("\t%zd", (size_t) best_time); ++ } ++} ++ ++ ++static void ++do_test (size_t align1, size_t align2, size_t len1, size_t len2, ++ int fail) ++{ ++ char *s1 = (char *) (buf1 + align1); ++ char *s2 = (char *) (buf2 + align2); ++ ++ static const char d[] = "1234567890abcxyz"; ++#define dl (sizeof (d) - 1) ++ char *ss2 = s2; ++ for (size_t l = len2; l > 0; l = l > dl ? l - dl : 0) ++ { ++ size_t t = l > dl ? dl : l; ++ ss2 = mempcpy (ss2, d, t); ++ } ++ s2[len2] = '\0'; ++ ++ if (fail) ++ { ++ char *ss1 = s1; ++ for (size_t l = len1; l > 0; l = l > dl ? l - dl : 0) ++ { ++ size_t t = l > dl ? dl : l; ++ memcpy (ss1, d, t); ++ ++ss1[len2 > 7 ? 7 : len2 - 1]; ++ ss1 += t; ++ } ++ } ++ else ++ { ++ memset (s1, '0', len1); ++ for (size_t i = 0; i < len2; ++i) ++ s1[len1 - len2 + i] = toupper (s2[i]); ++ } ++ s1[len1] = '\0'; ++ ++ if (HP_TIMING_AVAIL) ++ printf ("Length %4zd/%zd, alignment %2zd/%2zd, %s:", ++ len1, len2, align1, align2, fail ? "fail" : "found"); ++ ++ FOR_EACH_IMPL (impl, 0) ++ do_one_test (impl, s1, s2, fail ? NULL : s1 + len1 - len2); ++ ++ if (HP_TIMING_AVAIL) ++ putchar ('\n'); ++} ++ ++ ++static int ++test_main (void) ++{ ++ test_init (); ++ ++ printf ("%23s", ""); ++ FOR_EACH_IMPL (impl, 0) ++ printf ("\t%s", impl->name); ++ putchar ('\n'); ++ ++ for (size_t klen = 2; klen < 32; ++klen) ++ for (size_t hlen = 2 * klen; hlen < 16 * klen; hlen += klen) ++ { ++ do_test (0, 0, hlen, klen, 0); ++ do_test (0, 0, hlen, klen, 1); ++ do_test (0, 3, hlen, klen, 0); ++ do_test (0, 3, hlen, klen, 1); ++ do_test (0, 9, hlen, klen, 0); ++ do_test (0, 9, hlen, klen, 1); ++ do_test (0, 15, hlen, klen, 0); ++ do_test (0, 15, hlen, klen, 1); ++ ++ do_test (3, 0, hlen, klen, 0); ++ do_test (3, 0, hlen, klen, 1); ++ do_test (3, 3, hlen, klen, 0); ++ do_test (3, 3, hlen, klen, 1); ++ do_test (3, 9, hlen, klen, 0); ++ do_test (3, 9, hlen, klen, 1); ++ do_test (3, 15, hlen, klen, 0); ++ do_test (3, 15, hlen, klen, 1); ++ ++ do_test (9, 0, hlen, klen, 0); ++ do_test (9, 0, hlen, klen, 1); ++ do_test (9, 3, hlen, klen, 0); ++ do_test (9, 3, hlen, klen, 1); ++ do_test (9, 9, hlen, klen, 0); ++ do_test (9, 9, hlen, klen, 1); ++ do_test (9, 15, hlen, klen, 0); ++ do_test (9, 15, hlen, klen, 1); ++ ++ do_test (15, 0, hlen, klen, 0); ++ do_test (15, 0, hlen, klen, 1); ++ do_test (15, 3, hlen, klen, 0); ++ do_test (15, 3, hlen, klen, 1); ++ do_test (15, 9, hlen, klen, 0); ++ do_test (15, 9, hlen, klen, 1); ++ do_test (15, 15, hlen, klen, 0); ++ do_test (15, 15, hlen, klen, 1); ++ } ++ ++ do_test (0, 0, page_size - 1, 16, 0); ++ do_test (0, 0, page_size - 1, 16, 1); ++ ++ return ret; ++} ++ ++#include "../test-skeleton.c" +Index: glibc-2.12-2-gc4ccff1/string/test-strncasecmp.c +=================================================================== +--- /dev/null ++++ glibc-2.12-2-gc4ccff1/string/test-strncasecmp.c +@@ -0,0 +1,349 @@ ++/* Test and measure strncasecmp functions. ++ Copyright (C) 1999, 2002, 2003, 2005, 2010 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Written by Jakub Jelinek , 1999. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, write to the Free ++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++ 02111-1307 USA. */ ++ ++#include ++#define TEST_MAIN ++#include "test-string.h" ++ ++typedef int (*proto_t) (const char *, const char *, size_t); ++static int simple_strncasecmp (const char *, const char *, size_t); ++static int stupid_strncasecmp (const char *, const char *, size_t); ++ ++IMPL (stupid_strncasecmp, 0) ++IMPL (simple_strncasecmp, 0) ++IMPL (strncasecmp, 1) ++ ++static int ++simple_strncasecmp (const char *s1, const char *s2, size_t n) ++{ ++ int ret; ++ ++ if (n == 0) ++ return 0; ++ ++ while ((ret = ((unsigned char) tolower (*s1) ++ - (unsigned char) tolower (*s2))) == 0 ++ && *s1++) ++ { ++ if (--n == 0) ++ return 0; ++ ++s2; ++ } ++ return ret; ++} ++ ++static int ++stupid_strncasecmp (const char *s1, const char *s2, size_t max) ++{ ++ size_t ns1 = strlen (s1) + 1; ++ size_t ns2 = strlen (s2) + 1; ++ size_t n = ns1 < ns2 ? ns1 : ns2; ++ if (n > max) ++ n = max; ++ int ret = 0; ++ ++ while (n--) ++ { ++ if ((ret = ((unsigned char) tolower (*s1) ++ - (unsigned char) tolower (*s2))) != 0) ++ break; ++ ++s1; ++ ++s2; ++ } ++ return ret; ++} ++ ++static int ++check_result (impl_t *impl, const char *s1, const char *s2, size_t n, ++ int exp_result) ++{ ++ int result = CALL (impl, s1, s2, n); ++ if ((exp_result == 0 && result != 0) ++ || (exp_result < 0 && result >= 0) ++ || (exp_result > 0 && result <= 0)) ++ { ++ error (0, 0, "Wrong result in function %s %d %d", impl->name, ++ result, exp_result); ++ ret = 1; ++ return -1; ++ } ++ ++ return 0; ++} ++ ++static void ++do_one_test (impl_t *impl, const char *s1, const char *s2, size_t n, ++ int exp_result) ++{ ++ if (check_result (impl, s1, s2, n, exp_result) < 0) ++ return; ++ ++ if (HP_TIMING_AVAIL) ++ { ++ hp_timing_t start __attribute ((unused)); ++ hp_timing_t stop __attribute ((unused)); ++ hp_timing_t best_time = ~ (hp_timing_t) 0; ++ size_t i; ++ ++ for (i = 0; i < 32; ++i) ++ { ++ HP_TIMING_NOW (start); ++ CALL (impl, s1, s2, n); ++ HP_TIMING_NOW (stop); ++ HP_TIMING_BEST (best_time, start, stop); ++ } ++ ++ printf ("\t%zd", (size_t) best_time); ++ } ++} ++ ++static void ++do_test (size_t align1, size_t align2, size_t n, size_t len, int max_char, ++ int exp_result) ++{ ++ size_t i; ++ char *s1, *s2; ++ ++ if (len == 0) ++ return; ++ ++ align1 &= 7; ++ if (align1 + len + 1 >= page_size) ++ return; ++ ++ align2 &= 7; ++ if (align2 + len + 1 >= page_size) ++ return; ++ ++ s1 = (char *) (buf1 + align1); ++ s2 = (char *) (buf2 + align2); ++ ++ for (i = 0; i < len; i++) ++ { ++ s1[i] = toupper (1 + 23 * i % max_char); ++ s2[i] = tolower (s1[i]); ++ } ++ ++ s1[len] = s2[len] = 0; ++ s1[len + 1] = 23; ++ s2[len + 1] = 24 + exp_result; ++ if ((s2[len - 1] == 'z' && exp_result == -1) ++ || (s2[len - 1] == 'a' && exp_result == 1)) ++ s1[len - 1] += exp_result; ++ else ++ s2[len - 1] -= exp_result; ++ ++ if (HP_TIMING_AVAIL) ++ printf ("Length %4zd, alignment %2zd/%2zd:", len, align1, align2); ++ ++ FOR_EACH_IMPL (impl, 0) ++ do_one_test (impl, s1, s2, n, exp_result); ++ ++ if (HP_TIMING_AVAIL) ++ putchar ('\n'); ++} ++ ++static void ++do_random_tests (void) ++{ ++ size_t i, j, n, align1, align2, pos, len1, len2; ++ int result; ++ long r; ++ unsigned char *p1 = buf1 + page_size - 512; ++ unsigned char *p2 = buf2 + page_size - 512; ++ ++ for (n = 0; n < ITERATIONS; n++) ++ { ++ align1 = random () & 31; ++ if (random () & 1) ++ align2 = random () & 31; ++ else ++ align2 = align1 + (random () & 24); ++ pos = random () & 511; ++ j = align1 > align2 ? align1 : align2; ++ if (pos + j >= 511) ++ pos = 510 - j - (random () & 7); ++ len1 = random () & 511; ++ if (pos >= len1 && (random () & 1)) ++ len1 = pos + (random () & 7); ++ if (len1 + j >= 512) ++ len1 = 511 - j - (random () & 7); ++ if (pos >= len1) ++ len2 = len1; ++ else ++ len2 = len1 + (len1 != 511 - j ? random () % (511 - j - len1) : 0); ++ j = (pos > len2 ? pos : len2) + align1 + 64; ++ if (j > 512) ++ j = 512; ++ for (i = 0; i < j; ++i) ++ { ++ p1[i] = tolower (random () & 255); ++ if (i < len1 + align1 && !p1[i]) ++ { ++ p1[i] = tolower (random () & 255); ++ if (!p1[i]) ++ p1[i] = tolower (1 + (random () & 127)); ++ } ++ } ++ for (i = 0; i < j; ++i) ++ { ++ p2[i] = toupper (random () & 255); ++ if (i < len2 + align2 && !p2[i]) ++ { ++ p2[i] = toupper (random () & 255); ++ if (!p2[i]) ++ toupper (p2[i] = 1 + (random () & 127)); ++ } ++ } ++ ++ result = 0; ++ memcpy (p2 + align2, p1 + align1, pos); ++ if (pos < len1) ++ { ++ if (tolower (p2[align2 + pos]) == p1[align1 + pos]) ++ { ++ p2[align2 + pos] = toupper (random () & 255); ++ if (tolower (p2[align2 + pos]) == p1[align1 + pos]) ++ p2[align2 + pos] = toupper (p1[align1 + pos] ++ + 3 + (random () & 127)); ++ } ++ ++ if (p1[align1 + pos] < tolower (p2[align2 + pos])) ++ result = -1; ++ else ++ result = 1; ++ } ++ p1[len1 + align1] = 0; ++ p2[len2 + align2] = 0; ++ ++ FOR_EACH_IMPL (impl, 1) ++ { ++ r = CALL (impl, (char *) (p1 + align1), (char *) (p2 + align2), ++ pos + 1 + (random () & 255)); ++ /* Test whether on 64-bit architectures where ABI requires ++ callee to promote has the promotion been done. */ ++ asm ("" : "=g" (r) : "0" (r)); ++ if ((r == 0 && result) ++ || (r < 0 && result >= 0) ++ || (r > 0 && result <= 0)) ++ { ++ error (0, 0, "Iteration %zd - wrong result in function %s (%zd, %zd, %zd, %zd, %zd) %ld != %d, p1 %p p2 %p", ++ n, impl->name, align1, align2, len1, len2, pos, r, result, p1, p2); ++ ret = 1; ++ } ++ } ++ } ++} ++ ++ ++static void ++check1 (void) ++{ ++ static char cp [4096+16] __attribute__ ((aligned(4096))); ++ static char gotrel[4096] __attribute__ ((aligned(4096))); ++ char *s1 = cp + 0xffa; ++ char *s2 = gotrel + 0xcbe; ++ int exp_result; ++ size_t n = 6; ++ ++ strcpy (s1, "gottpoff"); ++ strcpy (s2, "GOTPLT"); ++ ++ exp_result = simple_strncasecmp (s1, s2, n); ++ FOR_EACH_IMPL (impl, 0) ++ check_result (impl, s1, s2, n, exp_result); ++} ++ ++int ++test_main (void) ++{ ++ size_t i; ++ ++ test_init (); ++ ++ check1 (); ++ ++ printf ("%23s", ""); ++ FOR_EACH_IMPL (impl, 0) ++ printf ("\t%s", impl->name); ++ putchar ('\n'); ++ ++ for (i = 1; i < 16; ++i) ++ { ++ do_test (i, i, i - 1, i, 127, 0); ++ ++ do_test (i, i, i, i, 127, 0); ++ do_test (i, i, i, i, 127, 1); ++ do_test (i, i, i, i, 127, -1); ++ ++ do_test (i, i, i + 1, i, 127, 0); ++ do_test (i, i, i + 1, i, 127, 1); ++ do_test (i, i, i + 1, i, 127, -1); ++ } ++ ++ for (i = 1; i < 10; ++i) ++ { ++ do_test (0, 0, (2 << i) - 1, 2 << i, 127, 0); ++ do_test (0, 0, 2 << i, 2 << i, 254, 0); ++ do_test (0, 0, (2 << i) + 1, 2 << i, 127, 0); ++ ++ do_test (0, 0, (2 << i) + 1, 2 << i, 254, 0); ++ ++ do_test (0, 0, 2 << i, 2 << i, 127, 1); ++ do_test (0, 0, (2 << i) + 10, 2 << i, 127, 1); ++ ++ do_test (0, 0, 2 << i, 2 << i, 254, 1); ++ do_test (0, 0, (2 << i) + 10, 2 << i, 254, 1); ++ ++ do_test (0, 0, 2 << i, 2 << i, 127, -1); ++ do_test (0, 0, (2 << i) + 10, 2 << i, 127, -1); ++ ++ do_test (0, 0, 2 << i, 2 << i, 254, -1); ++ do_test (0, 0, (2 << i) + 10, 2 << i, 254, -1); ++ } ++ ++ for (i = 1; i < 8; ++i) ++ { ++ do_test (i, 2 * i, (8 << i) - 1, 8 << i, 127, 0); ++ do_test (i, 2 * i, 8 << i, 8 << i, 127, 0); ++ do_test (i, 2 * i, (8 << i) + 100, 8 << i, 127, 0); ++ ++ do_test (2 * i, i, (8 << i) - 1, 8 << i, 254, 0); ++ do_test (2 * i, i, 8 << i, 8 << i, 254, 0); ++ do_test (2 * i, i, (8 << i) + 100, 8 << i, 254, 0); ++ ++ do_test (i, 2 * i, 8 << i, 8 << i, 127, 1); ++ do_test (i, 2 * i, (8 << i) + 100, 8 << i, 127, 1); ++ ++ do_test (2 * i, i, 8 << i, 8 << i, 254, 1); ++ do_test (2 * i, i, (8 << i) + 100, 8 << i, 254, 1); ++ ++ do_test (i, 2 * i, 8 << i, 8 << i, 127, -1); ++ do_test (i, 2 * i, (8 << i) + 100, 8 << i, 127, -1); ++ ++ do_test (2 * i, i, 8 << i, 8 << i, 254, -1); ++ do_test (2 * i, i, (8 << i) + 100, 8 << i, 254, -1); ++ } ++ ++ do_random_tests (); ++ return ret; ++} ++ ++#include "../test-skeleton.c" +Index: glibc-2.12-2-gc4ccff1/string/test-strnlen.c +=================================================================== +--- /dev/null ++++ glibc-2.12-2-gc4ccff1/string/test-strnlen.c +@@ -0,0 +1,197 @@ ++/* Test and measure strlen functions. ++ Copyright (C) 1999, 2002, 2003, 2005, 2010 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Written by Jakub Jelinek , 1999. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, write to the Free ++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++ 02111-1307 USA. */ ++ ++#define TEST_MAIN ++#include "test-string.h" ++ ++typedef size_t (*proto_t) (const char *, size_t); ++size_t simple_strnlen (const char *, size_t); ++ ++IMPL (simple_strnlen, 0) ++IMPL (strnlen, 1) ++ ++size_t ++simple_strnlen (const char *s, size_t maxlen) ++{ ++ size_t i; ++ ++ for (i = 0; i < maxlen && s[i]; ++i); ++ return i; ++} ++ ++static void ++do_one_test (impl_t *impl, const char *s, size_t maxlen, size_t exp_len) ++{ ++ size_t len = CALL (impl, s, maxlen); ++ if (len != exp_len) ++ { ++ error (0, 0, "Wrong result in function %s %zd %zd", impl->name, ++ len, exp_len); ++ ret = 1; ++ return; ++ } ++ ++ if (HP_TIMING_AVAIL) ++ { ++ hp_timing_t start __attribute ((unused)); ++ hp_timing_t stop __attribute ((unused)); ++ hp_timing_t best_time = ~ (hp_timing_t) 0; ++ size_t i; ++ ++ for (i = 0; i < 32; ++i) ++ { ++ HP_TIMING_NOW (start); ++ CALL (impl, s, maxlen); ++ HP_TIMING_NOW (stop); ++ HP_TIMING_BEST (best_time, start, stop); ++ } ++ ++ printf ("\t%zd", (size_t) best_time); ++ } ++} ++ ++static void ++do_test (size_t align, size_t len, size_t maxlen, int max_char) ++{ ++ size_t i; ++ ++ align &= 7; ++ if (align + len >= page_size) ++ return; ++ ++ for (i = 0; i < len; ++i) ++ buf1[align + i] = 1 + 7 * i % max_char; ++ buf1[align + len] = 0; ++ ++ if (HP_TIMING_AVAIL) ++ printf ("Length %4zd, alignment %2zd:", len, align); ++ ++ FOR_EACH_IMPL (impl, 0) ++ do_one_test (impl, (char *) (buf1 + align), maxlen, MIN (len, maxlen)); ++ ++ if (HP_TIMING_AVAIL) ++ putchar ('\n'); ++} ++ ++static void ++do_random_tests (void) ++{ ++ size_t i, j, n, align, len; ++ unsigned char *p = buf1 + page_size - 512; ++ ++ for (n = 0; n < ITERATIONS; n++) ++ { ++ align = random () & 15; ++ len = random () & 511; ++ if (len + align > 510) ++ len = 511 - align - (random () & 7); ++ j = len + align + 64; ++ if (j > 512) ++ j = 512; ++ ++ for (i = 0; i < j; i++) ++ { ++ if (i == len + align) ++ p[i] = 0; ++ else ++ { ++ p[i] = random () & 255; ++ if (i >= align && i < len + align && !p[i]) ++ p[i] = (random () & 127) + 1; ++ } ++ } ++ ++ FOR_EACH_IMPL (impl, 1) ++ { ++ if (len > 0 ++ && CALL (impl, (char *) (p + align), len - 1) != len - 1) ++ { ++ error (0, 0, "Iteration %zd (limited) - wrong result in function %s (%zd) %zd != %zd, p %p", ++ n, impl->name, align, ++ CALL (impl, (char *) (p + align), len - 1), len - 1, p); ++ ret = 1; ++ } ++ if (CALL (impl, (char *) (p + align), len) != len) ++ { ++ error (0, 0, "Iteration %zd (exact) - wrong result in function %s (%zd) %zd != %zd, p %p", ++ n, impl->name, align, ++ CALL (impl, (char *) (p + align), len), len, p); ++ ret = 1; ++ } ++ if (CALL (impl, (char *) (p + align), len + 1) != len) ++ { ++ error (0, 0, "Iteration %zd (long) - wrong result in function %s (%zd) %zd != %zd, p %p", ++ n, impl->name, align, ++ CALL (impl, (char *) (p + align), len + 1), len, p); ++ ret = 1; ++ } ++ } ++ } ++} ++ ++int ++test_main (void) ++{ ++ size_t i; ++ ++ test_init (); ++ ++ printf ("%20s", ""); ++ FOR_EACH_IMPL (impl, 0) ++ printf ("\t%s", impl->name); ++ putchar ('\n'); ++ ++ for (i = 1; i < 8; ++i) ++ { ++ do_test (0, i, i - 1, 127); ++ do_test (0, i, i, 127); ++ do_test (0, i, i + 1, 127); ++ } ++ ++ for (i = 1; i < 8; ++i) ++ { ++ do_test (i, i, i - 1, 127); ++ do_test (i, i, i, 127); ++ do_test (i, i, i + 1, 127); ++ } ++ ++ for (i = 2; i <= 10; ++i) ++ { ++ do_test (0, 1 << i, 5000, 127); ++ do_test (1, 1 << i, 5000, 127); ++ } ++ ++ for (i = 1; i < 8; ++i) ++ do_test (0, i, 5000, 255); ++ ++ for (i = 1; i < 8; ++i) ++ do_test (i, i, 5000, 255); ++ ++ for (i = 2; i <= 10; ++i) ++ { ++ do_test (0, 1 << i, 5000, 255); ++ do_test (1, 1 << i, 5000, 255); ++ } ++ ++ do_random_tests (); ++ return ret; ++} ++ ++#include "../test-skeleton.c" +Index: glibc-2.12-2-gc4ccff1/string/test-strstr.c +=================================================================== +--- /dev/null ++++ glibc-2.12-2-gc4ccff1/string/test-strstr.c +@@ -0,0 +1,194 @@ ++/* Test and measure strstr functions. ++ Copyright (C) 2010 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Written by Ulrich Drepper , 2010. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, write to the Free ++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++ 02111-1307 USA. */ ++ ++#define TEST_MAIN ++#include "test-string.h" ++ ++ ++#define STRSTR simple_strstr ++#include "strstr.c" ++ ++ ++static char * ++stupid_strstr (const char *s1, const char *s2) ++{ ++ ssize_t s1len = strlen (s1); ++ ssize_t s2len = strlen (s2); ++ ++ if (s2len > s1len) ++ return NULL; ++ ++ for (ssize_t i = 0; i <= s1len - s2len; ++i) ++ { ++ size_t j; ++ for (j = 0; j < s2len; ++j) ++ if (s1[i + j] != s2[j]) ++ break; ++ if (j == s2len) ++ return (char *) s1 + i; ++ } ++ ++ return NULL; ++} ++ ++ ++typedef char *(*proto_t) (const char *, const char *); ++ ++IMPL (stupid_strstr, 0) ++IMPL (simple_strstr, 0) ++IMPL (strstr, 1) ++ ++ ++static void ++do_one_test (impl_t *impl, const char *s1, const char *s2, char *exp_result) ++{ ++ char *result = CALL (impl, s1, s2); ++ if (result != exp_result) ++ { ++ error (0, 0, "Wrong result in function %s %s %s", impl->name, ++ result, exp_result); ++ ret = 1; ++ return; ++ } ++ ++ if (HP_TIMING_AVAIL) ++ { ++ hp_timing_t start __attribute ((unused)); ++ hp_timing_t stop __attribute ((unused)); ++ hp_timing_t best_time = ~(hp_timing_t) 0; ++ size_t i; ++ ++ for (i = 0; i < 32; ++i) ++ { ++ HP_TIMING_NOW (start); ++ CALL (impl, s1, s2); ++ HP_TIMING_NOW (stop); ++ HP_TIMING_BEST (best_time, start, stop); ++ } ++ ++ printf ("\t%zd", (size_t) best_time); ++ } ++} ++ ++ ++static void ++do_test (size_t align1, size_t align2, size_t len1, size_t len2, ++ int fail) ++{ ++ char *s1 = (char *) (buf1 + align1); ++ char *s2 = (char *) (buf2 + align2); ++ ++ static const char d[] = "1234567890abcdef"; ++#define dl (sizeof (d) - 1) ++ char *ss2 = s2; ++ for (size_t l = len2; l > 0; l = l > dl ? l - dl : 0) ++ { ++ size_t t = l > dl ? dl : l; ++ ss2 = mempcpy (ss2, d, t); ++ } ++ s2[len2] = '\0'; ++ ++ if (fail) ++ { ++ char *ss1 = s1; ++ for (size_t l = len1; l > 0; l = l > dl ? l - dl : 0) ++ { ++ size_t t = l > dl ? dl : l; ++ memcpy (ss1, d, t); ++ ++ss1[len2 > 7 ? 7 : len2 - 1]; ++ ss1 += t; ++ } ++ } ++ else ++ { ++ memset (s1, '0', len1); ++ memcpy (s1 + len1 - len2, s2, len2); ++ } ++ s1[len1] = '\0'; ++ ++ if (HP_TIMING_AVAIL) ++ printf ("Length %4zd/%zd, alignment %2zd/%2zd, %s:", ++ len1, len2, align1, align2, fail ? "fail" : "found"); ++ ++ FOR_EACH_IMPL (impl, 0) ++ do_one_test (impl, s1, s2, fail ? NULL : s1 + len1 - len2); ++ ++ if (HP_TIMING_AVAIL) ++ putchar ('\n'); ++} ++ ++ ++static int ++test_main (void) ++{ ++ test_init (); ++ ++ printf ("%23s", ""); ++ FOR_EACH_IMPL (impl, 0) ++ printf ("\t%s", impl->name); ++ putchar ('\n'); ++ ++ for (size_t klen = 2; klen < 32; ++klen) ++ for (size_t hlen = 2 * klen; hlen < 16 * klen; hlen += klen) ++ { ++ do_test (0, 0, hlen, klen, 0); ++ do_test (0, 0, hlen, klen, 1); ++ do_test (0, 3, hlen, klen, 0); ++ do_test (0, 3, hlen, klen, 1); ++ do_test (0, 9, hlen, klen, 0); ++ do_test (0, 9, hlen, klen, 1); ++ do_test (0, 15, hlen, klen, 0); ++ do_test (0, 15, hlen, klen, 1); ++ ++ do_test (3, 0, hlen, klen, 0); ++ do_test (3, 0, hlen, klen, 1); ++ do_test (3, 3, hlen, klen, 0); ++ do_test (3, 3, hlen, klen, 1); ++ do_test (3, 9, hlen, klen, 0); ++ do_test (3, 9, hlen, klen, 1); ++ do_test (3, 15, hlen, klen, 0); ++ do_test (3, 15, hlen, klen, 1); ++ ++ do_test (9, 0, hlen, klen, 0); ++ do_test (9, 0, hlen, klen, 1); ++ do_test (9, 3, hlen, klen, 0); ++ do_test (9, 3, hlen, klen, 1); ++ do_test (9, 9, hlen, klen, 0); ++ do_test (9, 9, hlen, klen, 1); ++ do_test (9, 15, hlen, klen, 0); ++ do_test (9, 15, hlen, klen, 1); ++ ++ do_test (15, 0, hlen, klen, 0); ++ do_test (15, 0, hlen, klen, 1); ++ do_test (15, 3, hlen, klen, 0); ++ do_test (15, 3, hlen, klen, 1); ++ do_test (15, 9, hlen, klen, 0); ++ do_test (15, 9, hlen, klen, 1); ++ do_test (15, 15, hlen, klen, 0); ++ do_test (15, 15, hlen, klen, 1); ++ } ++ ++ do_test (0, 0, page_size - 1, 16, 0); ++ do_test (0, 0, page_size - 1, 16, 1); ++ ++ return ret; ++} ++ ++#include "../test-skeleton.c" +Index: glibc-2.12-2-gc4ccff1/string/tester.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/string/tester.c ++++ glibc-2.12-2-gc4ccff1/string/tester.c +@@ -441,20 +441,21 @@ test_strnlen (void) + check (strnlen ("", 10) == 0, 1); /* Empty. */ + check (strnlen ("a", 10) == 1, 2); /* Single char. */ + check (strnlen ("abcd", 10) == 4, 3); /* Multiple chars. */ +- check (strnlen ("foo", (size_t)-1) == 3, 4); /* limits of n. */ ++ check (strnlen ("foo", (size_t) -1) == 3, 4); /* limits of n. */ ++ check (strnlen ("abcd", 0) == 0, 5); /* Restricted. */ ++ check (strnlen ("abcd", 1) == 1, 6); /* Restricted. */ ++ check (strnlen ("abcd", 2) == 2, 7); /* Restricted. */ ++ check (strnlen ("abcd", 3) == 3, 8); /* Restricted. */ ++ check (strnlen ("abcd", 4) == 4, 9); /* Restricted. */ + +- { +- char buf[4096]; +- int i; +- char *p; +- for (i=0; i < 0x100; i++) +- { +- p = (char *) ((unsigned long int)(buf + 0xff) & ~0xff) + i; +- strcpy (p, "OK"); +- strcpy (p+3, "BAD/WRONG"); +- check (strnlen (p, 100) == 2, 5+i); +- } +- } ++ char buf[4096]; ++ for (int i = 0; i < 0x100; ++i) ++ { ++ char *p = (char *) ((unsigned long int)(buf + 0xff) & ~0xff) + i; ++ strcpy (p, "OK"); ++ strcpy (p + 3, "BAD/WRONG"); ++ check (strnlen (p, 100) == 2, 10 + i); ++ } + } + + static void +Index: glibc-2.12-2-gc4ccff1/string/tst-strlen.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/string/tst-strlen.c ++++ glibc-2.12-2-gc4ccff1/string/tst-strlen.c +@@ -31,11 +31,21 @@ main(int argc, char *argv[]) + buf[words * 4 + 3] = (last & 8) != 0 ? 'e' : '\0'; + buf[words * 4 + 4] = '\0'; + +- if (strlen (buf) != words * 4 + lens[last] +- || strnlen (buf, -1) != words * 4 + lens[last]) ++ if (strlen (buf) != words * 4 + lens[last]) + { +- printf ("failed for base=%Zu, words=%Zu, and last=%Zu\n", +- base, words, last); ++ printf ("\ ++strlen failed for base=%Zu, words=%Zu, and last=%Zu (is %zd, expected %zd)\n", ++ base, words, last, ++ strlen (buf), words * 4 + lens[last]); ++ return 1; ++ } ++ ++ if (strnlen (buf, -1) != words * 4 + lens[last]) ++ { ++ printf ("\ ++strnlen failed for base=%Zu, words=%Zu, and last=%Zu (is %zd, expected %zd)\n", ++ base, words, last, ++ strnlen (buf, -1), words * 4 + lens[last]); + return 1; + } + } +Index: glibc-2.12-2-gc4ccff1/sysdeps/i386/i686/multiarch/Makefile +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/sysdeps/i386/i686/multiarch/Makefile ++++ glibc-2.12-2-gc4ccff1/sysdeps/i386/i686/multiarch/Makefile +@@ -9,7 +9,7 @@ sysdep_routines += bzero-sse2 memset-sse + memmove-ssse3-rep bcopy-ssse3 bcopy-ssse3-rep \ + memset-sse2-rep bzero-sse2-rep strcmp-ssse3 \ + strcmp-sse4 strncmp-c strncmp-ssse3 strncmp-sse4 \ +- memcmp-ssse3 memcmp-sse4 ++ memcmp-ssse3 memcmp-sse4 strcasestr-nonascii + ifeq (yes,$(config-cflags-sse4)) + sysdep_routines += strcspn-c strpbrk-c strspn-c strstr-c strcasestr-c + CFLAGS-strcspn-c.c += -msse4 +@@ -17,6 +17,7 @@ CFLAGS-strpbrk-c.c += -msse4 + CFLAGS-strspn-c.c += -msse4 + CFLAGS-strstr.c += -msse4 + CFLAGS-strcasestr.c += -msse4 ++CFLAGS-strcasestr-nonascii.c += -msse4 + endif + endif + +Index: glibc-2.12-2-gc4ccff1/sysdeps/i386/i686/multiarch/strcasestr-nonascii.c +=================================================================== +--- /dev/null ++++ glibc-2.12-2-gc4ccff1/sysdeps/i386/i686/multiarch/strcasestr-nonascii.c +@@ -0,0 +1,2 @@ ++#include ++#include +Index: glibc-2.12-2-gc4ccff1/sysdeps/x86_64/Makefile +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/sysdeps/x86_64/Makefile ++++ glibc-2.12-2-gc4ccff1/sysdeps/x86_64/Makefile +@@ -12,7 +12,8 @@ sysdep_routines += _mcount + endif + + ifeq ($(subdir),string) +-sysdep_routines += cacheinfo ++sysdep_routines += cacheinfo strcasecmp_l-nonascii strncase_l-nonascii ++gen-as-const-headers += locale-defines.sym + endif + + ifeq ($(subdir),elf) +Index: glibc-2.12-2-gc4ccff1/sysdeps/x86_64/locale-defines.sym +=================================================================== +--- /dev/null ++++ glibc-2.12-2-gc4ccff1/sysdeps/x86_64/locale-defines.sym +@@ -0,0 +1,11 @@ ++#include ++#include ++#include ++ ++-- ++ ++LOCALE_T___LOCALES offsetof (struct __locale_struct, __locales) ++LC_CTYPE ++_NL_CTYPE_NONASCII_CASE ++LOCALE_DATA_VALUES offsetof (struct __locale_data, values) ++SIZEOF_VALUES sizeof (((struct __locale_data *) 0)->values[0]) +Index: glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/Makefile +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/sysdeps/x86_64/multiarch/Makefile ++++ glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/Makefile +@@ -5,7 +5,9 @@ endif + + ifeq ($(subdir),string) + sysdep_routines += stpncpy-c strncpy-c strcmp-ssse3 strncmp-ssse3 \ +- strend-sse4 memcmp-sse4 ++ strend-sse4 memcmp-sse4 \ ++ strcasestr-nonascii strcasecmp_l-ssse3 \ ++ strncase_l-ssse3 + ifeq (yes,$(config-cflags-sse4)) + sysdep_routines += strcspn-c strpbrk-c strspn-c strstr-c strcasestr-c + CFLAGS-strcspn-c.c += -msse4 +@@ -13,5 +15,6 @@ CFLAGS-strpbrk-c.c += -msse4 + CFLAGS-strspn-c.c += -msse4 + CFLAGS-strstr.c += -msse4 + CFLAGS-strcasestr.c += -msse4 ++CFLAGS-strcasestr-nonascii.c += -msse4 + endif + endif +Index: glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/strcasecmp_l-ssse3.S +=================================================================== +--- /dev/null ++++ glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/strcasecmp_l-ssse3.S +@@ -0,0 +1,6 @@ ++#define USE_SSSE3 1 ++#define USE_AS_STRCASECMP_L ++#define NO_NOLOCALE_ALIAS ++#define STRCMP __strcasecmp_l_ssse3 ++#define __strcasecmp __strcasecmp_ssse3 ++#include "../strcmp.S" +Index: glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/strcasecmp_l.S +=================================================================== +--- /dev/null ++++ glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/strcasecmp_l.S +@@ -0,0 +1,6 @@ ++#define STRCMP __strcasecmp_l ++#define USE_AS_STRCASECMP_L ++#include "strcmp.S" ++ ++weak_alias (__strcasecmp_l, strcasecmp_l) ++libc_hidden_def (strcasecmp_l) +Index: glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/strcasestr-nonascii.c +=================================================================== +--- /dev/null ++++ glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/strcasestr-nonascii.c +@@ -0,0 +1,50 @@ ++/* strstr with SSE4.2 intrinsics ++ Copyright (C) 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 ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, write to the Free ++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++ 02111-1307 USA. */ ++ ++# include ++ ++ ++/* Similar to __m128i_strloadu. Convert to lower case for none-POSIX/C ++ locale. */ ++static inline __m128i ++__m128i_strloadu_tolower (const unsigned char *p) ++{ ++ union ++ { ++ char b[16]; ++ __m128i x; ++ } u; ++ ++ for (int i = 0; i < 16; ++i) ++ if (p[i] == 0) ++ { ++ u.b[i] = 0; ++ break; ++ } ++ else ++ u.b[i] = tolower (p[i]); ++ ++ return u.x; ++} ++ ++ ++#define STRCASESTR_NONASCII ++#define USE_AS_STRCASESTR ++#define STRSTR_SSE42 __strcasestr_sse42_nonascii ++#include "strstr.c" +Index: glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/strcasestr.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/sysdeps/x86_64/multiarch/strcasestr.c ++++ glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/strcasestr.c +@@ -1,3 +1,7 @@ ++extern char *__strcasestr_sse42_nonascii (const unsigned char *s1, ++ const unsigned char *s2) ++ attribute_hidden; ++ + #define USE_AS_STRCASESTR + #define STRSTR_SSE42 __strcasestr_sse42 + #include "strstr.c" +Index: glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/strcmp.S +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/sysdeps/x86_64/multiarch/strcmp.S ++++ glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/strcmp.S +@@ -24,7 +24,7 @@ + #ifdef USE_AS_STRNCMP + /* Since the counter, %r11, is unsigned, we branch to strcmp_exitz + if the new counter > the old one or is 0. */ +-#define UPDATE_STRNCMP_COUNTER \ ++# define UPDATE_STRNCMP_COUNTER \ + /* calculate left number to compare */ \ + lea -16(%rcx, %r11), %r9; \ + cmp %r9, %r11; \ +@@ -33,23 +33,50 @@ + je LABEL(strcmp_exitz_sse4_2); \ + mov %r9, %r11 + +-#define STRCMP_SSE42 __strncmp_sse42 +-#define STRCMP_SSSE3 __strncmp_ssse3 +-#define STRCMP_SSE2 __strncmp_sse2 +-#define __GI_STRCMP __GI_strncmp ++# define STRCMP_SSE42 __strncmp_sse42 ++# define STRCMP_SSSE3 __strncmp_ssse3 ++# define STRCMP_SSE2 __strncmp_sse2 ++# define __GI_STRCMP __GI_strncmp ++#elif defined USE_AS_STRCASECMP_L ++# include "locale-defines.h" ++ ++# define UPDATE_STRNCMP_COUNTER ++ ++# define STRCMP_SSE42 __strcasecmp_l_sse42 ++# define STRCMP_SSSE3 __strcasecmp_l_ssse3 ++# define STRCMP_SSE2 __strcasecmp_l_sse2 ++# define __GI_STRCMP __GI___strcasecmp_l ++#elif defined USE_AS_STRNCASECMP_L ++# include "locale-defines.h" ++ ++/* Since the counter, %r11, is unsigned, we branch to strcmp_exitz ++ if the new counter > the old one or is 0. */ ++# define UPDATE_STRNCMP_COUNTER \ ++ /* calculate left number to compare */ \ ++ lea -16(%rcx, %r11), %r9; \ ++ cmp %r9, %r11; \ ++ jb LABEL(strcmp_exitz_sse4_2); \ ++ test %r9, %r9; \ ++ je LABEL(strcmp_exitz_sse4_2); \ ++ mov %r9, %r11 ++ ++# define STRCMP_SSE42 __strncasecmp_l_sse42 ++# define STRCMP_SSSE3 __strncasecmp_l_ssse3 ++# define STRCMP_SSE2 __strncasecmp_l_sse2 ++# define __GI_STRCMP __GI___strncasecmp_l + #else +-#define UPDATE_STRNCMP_COUNTER +-#ifndef STRCMP +-#define STRCMP strcmp +-#define STRCMP_SSE42 __strcmp_sse42 +-#define STRCMP_SSSE3 __strcmp_ssse3 +-#define STRCMP_SSE2 __strcmp_sse2 +-#define __GI_STRCMP __GI_strcmp +-#endif ++# define UPDATE_STRNCMP_COUNTER ++# ifndef STRCMP ++# define STRCMP strcmp ++# define STRCMP_SSE42 __strcmp_sse42 ++# define STRCMP_SSSE3 __strcmp_ssse3 ++# define STRCMP_SSE2 __strcmp_sse2 ++# define __GI_STRCMP __GI_strcmp ++# endif + #endif + + #ifndef LABEL +-#define LABEL(l) L(l) ++# define LABEL(l) L(l) + #endif + + /* Define multiple versions only for the definition in libc. Don't +@@ -73,6 +100,43 @@ ENTRY(STRCMP) + 2: ret + END(STRCMP) + ++# ifdef USE_AS_STRCASECMP_L ++ENTRY(__strcasecmp) ++ .type __strcasecmp, @gnu_indirect_function ++ cmpl $0, __cpu_features+KIND_OFFSET(%rip) ++ jne 1f ++ call __init_cpu_features ++1: ++ leaq __strcasecmp_sse42(%rip), %rax ++ testl $bit_SSE4_2, __cpu_features+CPUID_OFFSET+index_SSE4_2(%rip) ++ jnz 2f ++ leaq __strcasecmp_ssse3(%rip), %rax ++ testl $bit_SSSE3, __cpu_features+CPUID_OFFSET+index_SSSE3(%rip) ++ jnz 2f ++ leaq __strcasecmp_sse2(%rip), %rax ++2: ret ++END(__strcasecmp) ++weak_alias (__strcasecmp, strcasecmp) ++# endif ++# ifdef USE_AS_STRNCASECMP_L ++ENTRY(__strncasecmp) ++ .type __strncasecmp, @gnu_indirect_function ++ cmpl $0, __cpu_features+KIND_OFFSET(%rip) ++ jne 1f ++ call __init_cpu_features ++1: ++ leaq __strncasecmp_sse42(%rip), %rax ++ testl $bit_SSE4_2, __cpu_features+CPUID_OFFSET+index_SSE4_2(%rip) ++ jnz 2f ++ leaq __strncasecmp_ssse3(%rip), %rax ++ testl $bit_SSSE3, __cpu_features+CPUID_OFFSET+index_SSSE3(%rip) ++ jnz 2f ++ leaq __strncasecmp_sse2(%rip), %rax ++2: ret ++END(__strncasecmp) ++weak_alias (__strncasecmp, strncasecmp) ++# endif ++ + /* We use 0x1a: + _SIDD_SBYTE_OPS + | _SIDD_CMP_EQUAL_EACH +@@ -101,8 +165,31 @@ END(STRCMP) + + /* Put all SSE 4.2 functions together. */ + .section .text.sse4.2,"ax",@progbits +- .align 16 ++ .align 16 + .type STRCMP_SSE42, @function ++# ifdef USE_AS_STRCASECMP_L ++ENTRY (__strcasecmp_sse42) ++ movq __libc_tsd_LOCALE@gottpoff(%rip),%rax ++ movq %fs:(%rax),%rdx ++ ++ // XXX 5 byte should be before the function ++ /* 5-byte NOP. */ ++ .byte 0x0f,0x1f,0x44,0x00,0x00 ++END (__strcasecmp_sse42) ++ /* FALLTHROUGH to strcasecmp_l. */ ++# endif ++# ifdef USE_AS_STRNCASECMP_L ++ENTRY (__strncasecmp_sse42) ++ movq __libc_tsd_LOCALE@gottpoff(%rip),%rax ++ movq %fs:(%rax),%rcx ++ ++ // XXX 5 byte should be before the function ++ /* 5-byte NOP. */ ++ .byte 0x0f,0x1f,0x44,0x00,0x00 ++END (__strncasecmp_sse42) ++ /* FALLTHROUGH to strncasecmp_l. */ ++# endif ++ + STRCMP_SSE42: + cfi_startproc + CALL_MCOUNT +@@ -110,24 +197,87 @@ STRCMP_SSE42: + /* + * This implementation uses SSE to compare up to 16 bytes at a time. + */ +-#ifdef USE_AS_STRNCMP ++# ifdef USE_AS_STRCASECMP_L ++ /* We have to fall back on the C implementation for locales ++ with encodings not matching ASCII for single bytes. */ ++# if LOCALE_T___LOCALES != 0 || LC_CTYPE != 0 ++ movq LOCALE_T___LOCALES+LC_CTYPE*8(%rdx), %rax ++# else ++ movq (%rdx), %rax ++# endif ++ testl $0, LOCALE_DATA_VALUES+_NL_CTYPE_NONASCII_CASE*SIZEOF_VALUES(%rax) ++ jne __strcasecmp_l_nonascii ++# endif ++# ifdef USE_AS_STRNCASECMP_L ++ /* We have to fall back on the C implementation for locales ++ with encodings not matching ASCII for single bytes. */ ++# if LOCALE_T___LOCALES != 0 || LC_CTYPE != 0 ++ movq LOCALE_T___LOCALES+LC_CTYPE*8(%rcx), %rax ++# else ++ movq (%rcx), %rax ++# endif ++ testl $0, LOCALE_DATA_VALUES+_NL_CTYPE_NONASCII_CASE*SIZEOF_VALUES(%rax) ++ jne __strncasecmp_l_nonascii ++# endif ++ ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + test %rdx, %rdx + je LABEL(strcmp_exitz_sse4_2) + cmp $1, %rdx + je LABEL(Byte0_sse4_2) + mov %rdx, %r11 +-#endif ++# endif + mov %esi, %ecx + mov %edi, %eax + /* Use 64bit AND here to avoid long NOP padding. */ + and $0x3f, %rcx /* rsi alignment in cache line */ + and $0x3f, %rax /* rdi alignment in cache line */ ++# if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L ++ .section .rodata.cst16,"aM",@progbits,16 ++ .align 16 ++.Lbelowupper_sse4: ++ .quad 0x4040404040404040 ++ .quad 0x4040404040404040 ++.Ltopupper_sse4: ++ .quad 0x5b5b5b5b5b5b5b5b ++ .quad 0x5b5b5b5b5b5b5b5b ++.Ltouppermask_sse4: ++ .quad 0x2020202020202020 ++ .quad 0x2020202020202020 ++ .previous ++ movdqa .Lbelowupper_sse4(%rip), %xmm4 ++# define UCLOW_reg %xmm4 ++ movdqa .Ltopupper_sse4(%rip), %xmm5 ++# define UCHIGH_reg %xmm5 ++ movdqa .Ltouppermask_sse4(%rip), %xmm6 ++# define LCQWORD_reg %xmm6 ++# endif + cmp $0x30, %ecx + ja LABEL(crosscache_sse4_2)/* rsi: 16-byte load will cross cache line */ + cmp $0x30, %eax + ja LABEL(crosscache_sse4_2)/* rdi: 16-byte load will cross cache line */ + movdqu (%rdi), %xmm1 + movdqu (%rsi), %xmm2 ++# if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L ++# define TOLOWER(reg1, reg2) \ ++ movdqa reg1, %xmm7; \ ++ movdqa UCHIGH_reg, %xmm8; \ ++ movdqa reg2, %xmm9; \ ++ movdqa UCHIGH_reg, %xmm10; \ ++ pcmpgtb UCLOW_reg, %xmm7; \ ++ pcmpgtb reg1, %xmm8; \ ++ pcmpgtb UCLOW_reg, %xmm9; \ ++ pcmpgtb reg2, %xmm10; \ ++ pand %xmm8, %xmm7; \ ++ pand %xmm10, %xmm9; \ ++ pand LCQWORD_reg, %xmm7; \ ++ pand LCQWORD_reg, %xmm9; \ ++ por %xmm7, reg1; \ ++ por %xmm9, reg2 ++ TOLOWER (%xmm1, %xmm2) ++# else ++# define TOLOWER(reg1, reg2) ++# endif + pxor %xmm0, %xmm0 /* clear %xmm0 for null char checks */ + pcmpeqb %xmm1, %xmm0 /* Any null chars? */ + pcmpeqb %xmm2, %xmm1 /* compare first 16 bytes for equality */ +@@ -135,10 +285,10 @@ STRCMP_SSE42: + pmovmskb %xmm1, %edx + sub $0xffff, %edx /* if first 16 bytes are same, edx == 0xffff */ + jnz LABEL(less16bytes_sse4_2)/* If not, find different value or null char */ +-#ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz_sse4_2)/* finish comparision */ +-#endif ++# endif + add $16, %rsi /* prepare to search next 16 bytes */ + add $16, %rdi /* prepare to search next 16 bytes */ + +@@ -180,7 +330,13 @@ LABEL(ashr_0_sse4_2): + movdqa (%rsi), %xmm1 + pxor %xmm0, %xmm0 /* clear %xmm0 for null char check */ + pcmpeqb %xmm1, %xmm0 /* Any null chars? */ ++# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L + pcmpeqb (%rdi), %xmm1 /* compare 16 bytes for equality */ ++# else ++ movdqa (%rdi), %xmm2 ++ TOLOWER (%xmm1, %xmm2) ++ pcmpeqb %xmm2, %xmm1 /* compare 16 bytes for equality */ ++# endif + psubb %xmm0, %xmm1 /* packed sub of comparison results*/ + pmovmskb %xmm1, %r9d + shr %cl, %edx /* adjust 0xffff for offset */ +@@ -204,44 +360,60 @@ LABEL(ashr_0_sse4_2): + .p2align 4 + LABEL(ashr_0_use_sse4_2): + movdqa (%rdi,%rdx), %xmm0 ++# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L + pcmpistri $0x1a,(%rsi,%rdx), %xmm0 ++# else ++ movdqa (%rsi,%rdx), %xmm1 ++ TOLOWER (%xmm0, %xmm1) ++ pcmpistri $0x1a, %xmm1, %xmm0 ++# endif + lea 16(%rdx), %rdx + jbe LABEL(ashr_0_use_sse4_2_exit) +-#ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz_sse4_2) +-#endif ++# endif + + movdqa (%rdi,%rdx), %xmm0 ++# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L + pcmpistri $0x1a,(%rsi,%rdx), %xmm0 ++# else ++ movdqa (%rsi,%rdx), %xmm1 ++ TOLOWER (%xmm0, %xmm1) ++ pcmpistri $0x1a, %xmm1, %xmm0 ++# endif + lea 16(%rdx), %rdx + jbe LABEL(ashr_0_use_sse4_2_exit) +-#ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz_sse4_2) +-#endif ++# endif + jmp LABEL(ashr_0_use_sse4_2) + + + .p2align 4 + LABEL(ashr_0_use_sse4_2_exit): + jnc LABEL(strcmp_exitz_sse4_2) +-#ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub %rcx, %r11 + jbe LABEL(strcmp_exitz_sse4_2) +-#endif ++# endif + lea -16(%rdx, %rcx), %rcx + movzbl (%rdi, %rcx), %eax + movzbl (%rsi, %rcx), %edx ++# if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L ++ leaq _nl_C_LC_CTYPE_tolower+128*4(%rip), %rcx ++ movl (%rcx,%rax,4), %eax ++ movl (%rcx,%rdx,4), %edx ++# endif + sub %edx, %eax + ret + + + +- + /* + * The following cases will be handled by ashr_1 +- * rcx(offset of rsi) rax(offset of rdi) relative offset corresponding case ++ * rcx(offset of rsi) rax(offset of rdi) relative offset corresponding case + * n(15) n -15 0(15 +(n-15) - n) ashr_1 + */ + .p2align 4 +@@ -251,6 +423,7 @@ LABEL(ashr_1_sse4_2): + movdqa (%rsi), %xmm1 + pcmpeqb %xmm1, %xmm0 /* Any null chars? */ + pslldq $15, %xmm2 /* shift first string to align with second */ ++ TOLOWER (%xmm1, %xmm2) + pcmpeqb %xmm1, %xmm2 /* compare 16 bytes for equality */ + psubb %xmm0, %xmm2 /* packed sub of comparison results*/ + pmovmskb %xmm2, %r9d +@@ -281,12 +454,18 @@ LABEL(loop_ashr_1_use_sse4_2): + + movdqa (%rdi, %rdx), %xmm0 + palignr $1, -16(%rdi, %rdx), %xmm0 ++# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L + pcmpistri $0x1a,(%rsi,%rdx), %xmm0 ++# else ++ movdqa (%rsi,%rdx), %xmm1 ++ TOLOWER (%xmm0, %xmm1) ++ pcmpistri $0x1a, %xmm1, %xmm0 ++# endif + jbe LABEL(use_sse4_2_exit) +-#ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz_sse4_2) +-#endif ++# endif + + add $16, %rdx + add $16, %r10 +@@ -294,12 +473,18 @@ LABEL(loop_ashr_1_use_sse4_2): + + movdqa (%rdi, %rdx), %xmm0 + palignr $1, -16(%rdi, %rdx), %xmm0 ++# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L + pcmpistri $0x1a,(%rsi,%rdx), %xmm0 ++# else ++ movdqa (%rsi,%rdx), %xmm1 ++ TOLOWER (%xmm0, %xmm1) ++ pcmpistri $0x1a, %xmm1, %xmm0 ++# endif + jbe LABEL(use_sse4_2_exit) +-#ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz_sse4_2) +-#endif ++# endif + add $16, %rdx + jmp LABEL(loop_ashr_1_use_sse4_2) + +@@ -309,10 +494,10 @@ LABEL(nibble_ashr_1_use_sse4_2): + movdqa -16(%rdi, %rdx), %xmm0 + psrldq $1, %xmm0 + pcmpistri $0x3a,%xmm0, %xmm0 +-#ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + cmp %r11, %rcx + jae LABEL(nibble_ashr_use_sse4_2_exit) +-#endif ++# endif + cmp $14, %ecx + ja LABEL(loop_ashr_1_use_sse4_2) + +@@ -320,7 +505,7 @@ LABEL(nibble_ashr_1_use_sse4_2): + + /* + * The following cases will be handled by ashr_2 +- * rcx(offset of rsi) rax(offset of rdi) relative offset corresponding case ++ * rcx(offset of rsi) rax(offset of rdi) relative offset corresponding case + * n(14~15) n -14 1(15 +(n-14) - n) ashr_2 + */ + .p2align 4 +@@ -330,6 +515,7 @@ LABEL(ashr_2_sse4_2): + movdqa (%rsi), %xmm1 + pcmpeqb %xmm1, %xmm0 + pslldq $14, %xmm2 ++ TOLOWER (%xmm1, %xmm2) + pcmpeqb %xmm1, %xmm2 + psubb %xmm0, %xmm2 + pmovmskb %xmm2, %r9d +@@ -360,12 +546,18 @@ LABEL(loop_ashr_2_use_sse4_2): + + movdqa (%rdi, %rdx), %xmm0 + palignr $2, -16(%rdi, %rdx), %xmm0 ++# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L + pcmpistri $0x1a,(%rsi,%rdx), %xmm0 ++# else ++ movdqa (%rsi,%rdx), %xmm1 ++ TOLOWER (%xmm0, %xmm1) ++ pcmpistri $0x1a, %xmm1, %xmm0 ++# endif + jbe LABEL(use_sse4_2_exit) +-#ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz_sse4_2) +-#endif ++# endif + + add $16, %rdx + add $16, %r10 +@@ -373,12 +565,18 @@ LABEL(loop_ashr_2_use_sse4_2): + + movdqa (%rdi, %rdx), %xmm0 + palignr $2, -16(%rdi, %rdx), %xmm0 ++# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L + pcmpistri $0x1a,(%rsi,%rdx), %xmm0 ++# else ++ movdqa (%rsi,%rdx), %xmm1 ++ TOLOWER (%xmm0, %xmm1) ++ pcmpistri $0x1a, %xmm1, %xmm0 ++# endif + jbe LABEL(use_sse4_2_exit) +-#ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz_sse4_2) +-#endif ++# endif + add $16, %rdx + jmp LABEL(loop_ashr_2_use_sse4_2) + +@@ -388,10 +586,10 @@ LABEL(nibble_ashr_2_use_sse4_2): + movdqa -16(%rdi, %rdx), %xmm0 + psrldq $2, %xmm0 + pcmpistri $0x3a,%xmm0, %xmm0 +-#ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + cmp %r11, %rcx + jae LABEL(nibble_ashr_use_sse4_2_exit) +-#endif ++# endif + cmp $13, %ecx + ja LABEL(loop_ashr_2_use_sse4_2) + +@@ -409,6 +607,7 @@ LABEL(ashr_3_sse4_2): + movdqa (%rsi), %xmm1 + pcmpeqb %xmm1, %xmm0 + pslldq $13, %xmm2 ++ TOLOWER (%xmm1, %xmm2) + pcmpeqb %xmm1, %xmm2 + psubb %xmm0, %xmm2 + pmovmskb %xmm2, %r9d +@@ -439,12 +638,18 @@ LABEL(loop_ashr_3_use_sse4_2): + + movdqa (%rdi, %rdx), %xmm0 + palignr $3, -16(%rdi, %rdx), %xmm0 ++# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L + pcmpistri $0x1a,(%rsi,%rdx), %xmm0 ++# else ++ movdqa (%rsi,%rdx), %xmm1 ++ TOLOWER (%xmm0, %xmm1) ++ pcmpistri $0x1a, %xmm1, %xmm0 ++# endif + jbe LABEL(use_sse4_2_exit) +-#ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz_sse4_2) +-#endif ++# endif + + add $16, %rdx + add $16, %r10 +@@ -452,12 +657,18 @@ LABEL(loop_ashr_3_use_sse4_2): + + movdqa (%rdi, %rdx), %xmm0 + palignr $3, -16(%rdi, %rdx), %xmm0 ++# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L + pcmpistri $0x1a,(%rsi,%rdx), %xmm0 ++# else ++ movdqa (%rsi,%rdx), %xmm1 ++ TOLOWER (%xmm0, %xmm1) ++ pcmpistri $0x1a, %xmm1, %xmm0 ++# endif + jbe LABEL(use_sse4_2_exit) +-#ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz_sse4_2) +-#endif ++# endif + add $16, %rdx + jmp LABEL(loop_ashr_3_use_sse4_2) + +@@ -467,10 +678,10 @@ LABEL(nibble_ashr_3_use_sse4_2): + movdqa -16(%rdi, %rdx), %xmm0 + psrldq $3, %xmm0 + pcmpistri $0x3a,%xmm0, %xmm0 +-#ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + cmp %r11, %rcx + jae LABEL(nibble_ashr_use_sse4_2_exit) +-#endif ++# endif + cmp $12, %ecx + ja LABEL(loop_ashr_3_use_sse4_2) + +@@ -488,6 +699,7 @@ LABEL(ashr_4_sse4_2): + movdqa (%rsi), %xmm1 + pcmpeqb %xmm1, %xmm0 + pslldq $12, %xmm2 ++ TOLOWER (%xmm1, %xmm2) + pcmpeqb %xmm1, %xmm2 + psubb %xmm0, %xmm2 + pmovmskb %xmm2, %r9d +@@ -519,12 +731,18 @@ LABEL(loop_ashr_4_use_sse4_2): + + movdqa (%rdi, %rdx), %xmm0 + palignr $4, -16(%rdi, %rdx), %xmm0 ++# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L + pcmpistri $0x1a,(%rsi,%rdx), %xmm0 ++# else ++ movdqa (%rsi,%rdx), %xmm1 ++ TOLOWER (%xmm0, %xmm1) ++ pcmpistri $0x1a, %xmm1, %xmm0 ++# endif + jbe LABEL(use_sse4_2_exit) +-#ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz_sse4_2) +-#endif ++# endif + + add $16, %rdx + add $16, %r10 +@@ -532,12 +750,18 @@ LABEL(loop_ashr_4_use_sse4_2): + + movdqa (%rdi, %rdx), %xmm0 + palignr $4, -16(%rdi, %rdx), %xmm0 ++# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L + pcmpistri $0x1a,(%rsi,%rdx), %xmm0 ++# else ++ movdqa (%rsi,%rdx), %xmm1 ++ TOLOWER (%xmm0, %xmm1) ++ pcmpistri $0x1a, %xmm1, %xmm0 ++# endif + jbe LABEL(use_sse4_2_exit) +-#ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz_sse4_2) +-#endif ++# endif + add $16, %rdx + jmp LABEL(loop_ashr_4_use_sse4_2) + +@@ -547,10 +771,10 @@ LABEL(nibble_ashr_4_use_sse4_2): + movdqa -16(%rdi, %rdx), %xmm0 + psrldq $4, %xmm0 + pcmpistri $0x3a,%xmm0, %xmm0 +-#ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + cmp %r11, %rcx + jae LABEL(nibble_ashr_use_sse4_2_exit) +-#endif ++# endif + cmp $11, %ecx + ja LABEL(loop_ashr_4_use_sse4_2) + +@@ -559,7 +783,7 @@ LABEL(nibble_ashr_4_use_sse4_2): + /* + * The following cases will be handled by ashr_5 + * rcx(offset of rsi) rax(offset of rdi) relative offset corresponding case +- * n(11~15) n - 11 4(15 +(n-11) - n) ashr_5 ++ * n(11~15) n - 11 4(15 +(n-11) - n) ashr_5 + */ + .p2align 4 + LABEL(ashr_5_sse4_2): +@@ -568,6 +792,7 @@ LABEL(ashr_5_sse4_2): + movdqa (%rsi), %xmm1 + pcmpeqb %xmm1, %xmm0 + pslldq $11, %xmm2 ++ TOLOWER (%xmm1, %xmm2) + pcmpeqb %xmm1, %xmm2 + psubb %xmm0, %xmm2 + pmovmskb %xmm2, %r9d +@@ -599,12 +824,18 @@ LABEL(loop_ashr_5_use_sse4_2): + + movdqa (%rdi, %rdx), %xmm0 + palignr $5, -16(%rdi, %rdx), %xmm0 ++# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L + pcmpistri $0x1a,(%rsi,%rdx), %xmm0 ++# else ++ movdqa (%rsi,%rdx), %xmm1 ++ TOLOWER (%xmm0, %xmm1) ++ pcmpistri $0x1a, %xmm1, %xmm0 ++# endif + jbe LABEL(use_sse4_2_exit) +-#ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz_sse4_2) +-#endif ++# endif + + add $16, %rdx + add $16, %r10 +@@ -613,12 +844,18 @@ LABEL(loop_ashr_5_use_sse4_2): + movdqa (%rdi, %rdx), %xmm0 + + palignr $5, -16(%rdi, %rdx), %xmm0 ++# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L + pcmpistri $0x1a,(%rsi,%rdx), %xmm0 ++# else ++ movdqa (%rsi,%rdx), %xmm1 ++ TOLOWER (%xmm0, %xmm1) ++ pcmpistri $0x1a, %xmm1, %xmm0 ++# endif + jbe LABEL(use_sse4_2_exit) +-#ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz_sse4_2) +-#endif ++# endif + add $16, %rdx + jmp LABEL(loop_ashr_5_use_sse4_2) + +@@ -628,10 +865,10 @@ LABEL(nibble_ashr_5_use_sse4_2): + movdqa -16(%rdi, %rdx), %xmm0 + psrldq $5, %xmm0 + pcmpistri $0x3a,%xmm0, %xmm0 +-#ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + cmp %r11, %rcx + jae LABEL(nibble_ashr_use_sse4_2_exit) +-#endif ++# endif + cmp $10, %ecx + ja LABEL(loop_ashr_5_use_sse4_2) + +@@ -640,7 +877,7 @@ LABEL(nibble_ashr_5_use_sse4_2): + /* + * The following cases will be handled by ashr_6 + * rcx(offset of rsi) rax(offset of rdi) relative offset corresponding case +- * n(10~15) n - 10 5(15 +(n-10) - n) ashr_6 ++ * n(10~15) n - 10 5(15 +(n-10) - n) ashr_6 + */ + .p2align 4 + LABEL(ashr_6_sse4_2): +@@ -649,6 +886,7 @@ LABEL(ashr_6_sse4_2): + movdqa (%rsi), %xmm1 + pcmpeqb %xmm1, %xmm0 + pslldq $10, %xmm2 ++ TOLOWER (%xmm1, %xmm2) + pcmpeqb %xmm1, %xmm2 + psubb %xmm0, %xmm2 + pmovmskb %xmm2, %r9d +@@ -680,12 +918,18 @@ LABEL(loop_ashr_6_use_sse4_2): + + movdqa (%rdi, %rdx), %xmm0 + palignr $6, -16(%rdi, %rdx), %xmm0 +- pcmpistri $0x1a,(%rsi,%rdx), %xmm0 ++# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L ++ pcmpistri $0x1a,(%rsi,%rdx), %xmm0 ++# else ++ movdqa (%rsi,%rdx), %xmm1 ++ TOLOWER (%xmm0, %xmm1) ++ pcmpistri $0x1a, %xmm1, %xmm0 ++# endif + jbe LABEL(use_sse4_2_exit) +-#ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz_sse4_2) +-#endif ++# endif + + add $16, %rdx + add $16, %r10 +@@ -693,12 +937,18 @@ LABEL(loop_ashr_6_use_sse4_2): + + movdqa (%rdi, %rdx), %xmm0 + palignr $6, -16(%rdi, %rdx), %xmm0 +- pcmpistri $0x1a,(%rsi,%rdx), %xmm0 ++# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L ++ pcmpistri $0x1a,(%rsi,%rdx), %xmm0 ++# else ++ movdqa (%rsi,%rdx), %xmm1 ++ TOLOWER (%xmm0, %xmm1) ++ pcmpistri $0x1a, %xmm1, %xmm0 ++# endif + jbe LABEL(use_sse4_2_exit) +-#ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz_sse4_2) +-#endif ++# endif + add $16, %rdx + jmp LABEL(loop_ashr_6_use_sse4_2) + +@@ -708,10 +958,10 @@ LABEL(nibble_ashr_6_use_sse4_2): + movdqa -16(%rdi, %rdx), %xmm0 + psrldq $6, %xmm0 + pcmpistri $0x3a,%xmm0, %xmm0 +-#ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + cmp %r11, %rcx + jae LABEL(nibble_ashr_use_sse4_2_exit) +-#endif ++# endif + cmp $9, %ecx + ja LABEL(loop_ashr_6_use_sse4_2) + +@@ -720,7 +970,7 @@ LABEL(nibble_ashr_6_use_sse4_2): + /* + * The following cases will be handled by ashr_7 + * rcx(offset of rsi) rax(offset of rdi) relative offset corresponding case +- * n(9~15) n - 9 6(15 +(n - 9) - n) ashr_7 ++ * n(9~15) n - 9 6(15 +(n - 9) - n) ashr_7 + */ + .p2align 4 + LABEL(ashr_7_sse4_2): +@@ -729,6 +979,7 @@ LABEL(ashr_7_sse4_2): + movdqa (%rsi), %xmm1 + pcmpeqb %xmm1, %xmm0 + pslldq $9, %xmm2 ++ TOLOWER (%xmm1, %xmm2) + pcmpeqb %xmm1, %xmm2 + psubb %xmm0, %xmm2 + pmovmskb %xmm2, %r9d +@@ -760,12 +1011,18 @@ LABEL(loop_ashr_7_use_sse4_2): + + movdqa (%rdi, %rdx), %xmm0 + palignr $7, -16(%rdi, %rdx), %xmm0 ++# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L + pcmpistri $0x1a,(%rsi,%rdx), %xmm0 ++# else ++ movdqa (%rsi,%rdx), %xmm1 ++ TOLOWER (%xmm0, %xmm1) ++ pcmpistri $0x1a, %xmm1, %xmm0 ++# endif + jbe LABEL(use_sse4_2_exit) +-#ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz_sse4_2) +-#endif ++# endif + + add $16, %rdx + add $16, %r10 +@@ -773,12 +1030,18 @@ LABEL(loop_ashr_7_use_sse4_2): + + movdqa (%rdi, %rdx), %xmm0 + palignr $7, -16(%rdi, %rdx), %xmm0 ++# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L + pcmpistri $0x1a,(%rsi,%rdx), %xmm0 ++# else ++ movdqa (%rsi,%rdx), %xmm1 ++ TOLOWER (%xmm0, %xmm1) ++ pcmpistri $0x1a, %xmm1, %xmm0 ++# endif + jbe LABEL(use_sse4_2_exit) +-#ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz_sse4_2) +-#endif ++# endif + add $16, %rdx + jmp LABEL(loop_ashr_7_use_sse4_2) + +@@ -788,10 +1051,10 @@ LABEL(nibble_ashr_7_use_sse4_2): + movdqa -16(%rdi, %rdx), %xmm0 + psrldq $7, %xmm0 + pcmpistri $0x3a,%xmm0, %xmm0 +-#ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + cmp %r11, %rcx + jae LABEL(nibble_ashr_use_sse4_2_exit) +-#endif ++# endif + cmp $8, %ecx + ja LABEL(loop_ashr_7_use_sse4_2) + +@@ -800,7 +1063,7 @@ LABEL(nibble_ashr_7_use_sse4_2): + /* + * The following cases will be handled by ashr_8 + * rcx(offset of rsi) rax(offset of rdi) relative offset corresponding case +- * n(8~15) n - 8 7(15 +(n - 8) - n) ashr_8 ++ * n(8~15) n - 8 7(15 +(n - 8) - n) ashr_8 + */ + .p2align 4 + LABEL(ashr_8_sse4_2): +@@ -809,6 +1072,7 @@ LABEL(ashr_8_sse4_2): + movdqa (%rsi), %xmm1 + pcmpeqb %xmm1, %xmm0 + pslldq $8, %xmm2 ++ TOLOWER (%xmm1, %xmm2) + pcmpeqb %xmm1, %xmm2 + psubb %xmm0, %xmm2 + pmovmskb %xmm2, %r9d +@@ -840,12 +1104,18 @@ LABEL(loop_ashr_8_use_sse4_2): + + movdqa (%rdi, %rdx), %xmm0 + palignr $8, -16(%rdi, %rdx), %xmm0 +- pcmpistri $0x1a,(%rsi,%rdx), %xmm0 ++# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L ++ pcmpistri $0x1a, (%rsi,%rdx), %xmm0 ++# else ++ movdqa (%rsi,%rdx), %xmm1 ++ TOLOWER (%xmm0, %xmm1) ++ pcmpistri $0x1a, %xmm1, %xmm0 ++# endif + jbe LABEL(use_sse4_2_exit) +-#ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz_sse4_2) +-#endif ++# endif + + add $16, %rdx + add $16, %r10 +@@ -853,12 +1123,18 @@ LABEL(loop_ashr_8_use_sse4_2): + + movdqa (%rdi, %rdx), %xmm0 + palignr $8, -16(%rdi, %rdx), %xmm0 +- pcmpistri $0x1a,(%rsi,%rdx), %xmm0 ++# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L ++ pcmpistri $0x1a, (%rsi,%rdx), %xmm0 ++# else ++ movdqa (%rsi,%rdx), %xmm1 ++ TOLOWER (%xmm0, %xmm1) ++ pcmpistri $0x1a, %xmm1, %xmm0 ++# endif + jbe LABEL(use_sse4_2_exit) +-#ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz_sse4_2) +-#endif ++# endif + add $16, %rdx + jmp LABEL(loop_ashr_8_use_sse4_2) + +@@ -868,10 +1144,10 @@ LABEL(nibble_ashr_8_use_sse4_2): + movdqa -16(%rdi, %rdx), %xmm0 + psrldq $8, %xmm0 + pcmpistri $0x3a,%xmm0, %xmm0 +-#ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + cmp %r11, %rcx + jae LABEL(nibble_ashr_use_sse4_2_exit) +-#endif ++# endif + cmp $7, %ecx + ja LABEL(loop_ashr_8_use_sse4_2) + +@@ -880,7 +1156,7 @@ LABEL(nibble_ashr_8_use_sse4_2): + /* + * The following cases will be handled by ashr_9 + * rcx(offset of rsi) rax(offset of rdi) relative offset corresponding case +- * n(7~15) n - 7 8(15 +(n - 7) - n) ashr_9 ++ * n(7~15) n - 7 8(15 +(n - 7) - n) ashr_9 + */ + .p2align 4 + LABEL(ashr_9_sse4_2): +@@ -889,6 +1165,7 @@ LABEL(ashr_9_sse4_2): + movdqa (%rsi), %xmm1 + pcmpeqb %xmm1, %xmm0 + pslldq $7, %xmm2 ++ TOLOWER (%xmm1, %xmm2) + pcmpeqb %xmm1, %xmm2 + psubb %xmm0, %xmm2 + pmovmskb %xmm2, %r9d +@@ -921,12 +1198,18 @@ LABEL(loop_ashr_9_use_sse4_2): + movdqa (%rdi, %rdx), %xmm0 + + palignr $9, -16(%rdi, %rdx), %xmm0 +- pcmpistri $0x1a,(%rsi,%rdx), %xmm0 ++# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L ++ pcmpistri $0x1a, (%rsi,%rdx), %xmm0 ++# else ++ movdqa (%rsi,%rdx), %xmm1 ++ TOLOWER (%xmm0, %xmm1) ++ pcmpistri $0x1a, %xmm1, %xmm0 ++# endif + jbe LABEL(use_sse4_2_exit) +-#ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz_sse4_2) +-#endif ++# endif + + add $16, %rdx + add $16, %r10 +@@ -934,12 +1217,18 @@ LABEL(loop_ashr_9_use_sse4_2): + + movdqa (%rdi, %rdx), %xmm0 + palignr $9, -16(%rdi, %rdx), %xmm0 +- pcmpistri $0x1a,(%rsi,%rdx), %xmm0 ++# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L ++ pcmpistri $0x1a, (%rsi,%rdx), %xmm0 ++# else ++ movdqa (%rsi,%rdx), %xmm1 ++ TOLOWER (%xmm0, %xmm1) ++ pcmpistri $0x1a, %xmm1, %xmm0 ++# endif + jbe LABEL(use_sse4_2_exit) +-#ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz_sse4_2) +-#endif ++# endif + add $16, %rdx + jmp LABEL(loop_ashr_9_use_sse4_2) + +@@ -949,10 +1238,10 @@ LABEL(nibble_ashr_9_use_sse4_2): + movdqa -16(%rdi, %rdx), %xmm0 + psrldq $9, %xmm0 + pcmpistri $0x3a,%xmm0, %xmm0 +-#ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + cmp %r11, %rcx + jae LABEL(nibble_ashr_use_sse4_2_exit) +-#endif ++# endif + cmp $6, %ecx + ja LABEL(loop_ashr_9_use_sse4_2) + +@@ -961,7 +1250,7 @@ LABEL(nibble_ashr_9_use_sse4_2): + /* + * The following cases will be handled by ashr_10 + * rcx(offset of rsi) rax(offset of rdi) relative offset corresponding case +- * n(6~15) n - 6 9(15 +(n - 6) - n) ashr_10 ++ * n(6~15) n - 6 9(15 +(n - 6) - n) ashr_10 + */ + .p2align 4 + LABEL(ashr_10_sse4_2): +@@ -970,6 +1259,7 @@ LABEL(ashr_10_sse4_2): + movdqa (%rsi), %xmm1 + pcmpeqb %xmm1, %xmm0 + pslldq $6, %xmm2 ++ TOLOWER (%xmm1, %xmm2) + pcmpeqb %xmm1, %xmm2 + psubb %xmm0, %xmm2 + pmovmskb %xmm2, %r9d +@@ -1001,12 +1291,18 @@ LABEL(loop_ashr_10_use_sse4_2): + + movdqa (%rdi, %rdx), %xmm0 + palignr $10, -16(%rdi, %rdx), %xmm0 +- pcmpistri $0x1a,(%rsi,%rdx), %xmm0 ++# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L ++ pcmpistri $0x1a, (%rsi,%rdx), %xmm0 ++# else ++ movdqa (%rsi,%rdx), %xmm1 ++ TOLOWER (%xmm0, %xmm1) ++ pcmpistri $0x1a, %xmm1, %xmm0 ++# endif + jbe LABEL(use_sse4_2_exit) +-#ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz_sse4_2) +-#endif ++# endif + + add $16, %rdx + add $16, %r10 +@@ -1014,12 +1310,18 @@ LABEL(loop_ashr_10_use_sse4_2): + + movdqa (%rdi, %rdx), %xmm0 + palignr $10, -16(%rdi, %rdx), %xmm0 +- pcmpistri $0x1a,(%rsi,%rdx), %xmm0 ++# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L ++ pcmpistri $0x1a, (%rsi,%rdx), %xmm0 ++# else ++ movdqa (%rsi,%rdx), %xmm1 ++ TOLOWER (%xmm0, %xmm1) ++ pcmpistri $0x1a, %xmm1, %xmm0 ++# endif + jbe LABEL(use_sse4_2_exit) +-#ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz_sse4_2) +-#endif ++# endif + add $16, %rdx + jmp LABEL(loop_ashr_10_use_sse4_2) + +@@ -1029,10 +1331,10 @@ LABEL(nibble_ashr_10_use_sse4_2): + movdqa -16(%rdi, %rdx), %xmm0 + psrldq $10, %xmm0 + pcmpistri $0x3a,%xmm0, %xmm0 +-#ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + cmp %r11, %rcx + jae LABEL(nibble_ashr_use_sse4_2_exit) +-#endif ++# endif + cmp $5, %ecx + ja LABEL(loop_ashr_10_use_sse4_2) + +@@ -1041,7 +1343,7 @@ LABEL(nibble_ashr_10_use_sse4_2): + /* + * The following cases will be handled by ashr_11 + * rcx(offset of rsi) rax(offset of rdi) relative offset corresponding case +- * n(5~15) n - 5 10(15 +(n - 5) - n) ashr_11 ++ * n(5~15) n - 5 10(15 +(n - 5) - n) ashr_11 + */ + .p2align 4 + LABEL(ashr_11_sse4_2): +@@ -1050,6 +1352,7 @@ LABEL(ashr_11_sse4_2): + movdqa (%rsi), %xmm1 + pcmpeqb %xmm1, %xmm0 + pslldq $5, %xmm2 ++ TOLOWER (%xmm1, %xmm2) + pcmpeqb %xmm1, %xmm2 + psubb %xmm0, %xmm2 + pmovmskb %xmm2, %r9d +@@ -1081,12 +1384,18 @@ LABEL(loop_ashr_11_use_sse4_2): + + movdqa (%rdi, %rdx), %xmm0 + palignr $11, -16(%rdi, %rdx), %xmm0 +- pcmpistri $0x1a,(%rsi,%rdx), %xmm0 ++# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L ++ pcmpistri $0x1a, (%rsi,%rdx), %xmm0 ++# else ++ movdqa (%rsi,%rdx), %xmm1 ++ TOLOWER (%xmm0, %xmm1) ++ pcmpistri $0x1a, %xmm1, %xmm0 ++# endif + jbe LABEL(use_sse4_2_exit) +-#ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz_sse4_2) +-#endif ++# endif + + add $16, %rdx + add $16, %r10 +@@ -1094,12 +1403,18 @@ LABEL(loop_ashr_11_use_sse4_2): + + movdqa (%rdi, %rdx), %xmm0 + palignr $11, -16(%rdi, %rdx), %xmm0 +- pcmpistri $0x1a,(%rsi,%rdx), %xmm0 ++# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L ++ pcmpistri $0x1a, (%rsi,%rdx), %xmm0 ++# else ++ movdqa (%rsi,%rdx), %xmm1 ++ TOLOWER (%xmm0, %xmm1) ++ pcmpistri $0x1a, %xmm1, %xmm0 ++# endif + jbe LABEL(use_sse4_2_exit) +-#ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz_sse4_2) +-#endif ++# endif + add $16, %rdx + jmp LABEL(loop_ashr_11_use_sse4_2) + +@@ -1109,10 +1424,10 @@ LABEL(nibble_ashr_11_use_sse4_2): + movdqa -16(%rdi, %rdx), %xmm0 + psrldq $11, %xmm0 + pcmpistri $0x3a,%xmm0, %xmm0 +-#ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + cmp %r11, %rcx + jae LABEL(nibble_ashr_use_sse4_2_exit) +-#endif ++# endif + cmp $4, %ecx + ja LABEL(loop_ashr_11_use_sse4_2) + +@@ -1121,7 +1436,7 @@ LABEL(nibble_ashr_11_use_sse4_2): + /* + * The following cases will be handled by ashr_12 + * rcx(offset of rsi) rax(offset of rdi) relative offset corresponding case +- * n(4~15) n - 4 11(15 +(n - 4) - n) ashr_12 ++ * n(4~15) n - 4 11(15 +(n - 4) - n) ashr_12 + */ + .p2align 4 + LABEL(ashr_12_sse4_2): +@@ -1130,6 +1445,7 @@ LABEL(ashr_12_sse4_2): + movdqa (%rsi), %xmm1 + pcmpeqb %xmm1, %xmm0 + pslldq $4, %xmm2 ++ TOLOWER (%xmm1, %xmm2) + pcmpeqb %xmm1, %xmm2 + psubb %xmm0, %xmm2 + pmovmskb %xmm2, %r9d +@@ -1161,12 +1477,18 @@ LABEL(loop_ashr_12_use_sse4_2): + + movdqa (%rdi, %rdx), %xmm0 + palignr $12, -16(%rdi, %rdx), %xmm0 +- pcmpistri $0x1a,(%rsi,%rdx), %xmm0 ++# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L ++ pcmpistri $0x1a, (%rsi,%rdx), %xmm0 ++# else ++ movdqa (%rsi,%rdx), %xmm1 ++ TOLOWER (%xmm0, %xmm1) ++ pcmpistri $0x1a, %xmm1, %xmm0 ++# endif + jbe LABEL(use_sse4_2_exit) +-#ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz_sse4_2) +-#endif ++# endif + + add $16, %rdx + add $16, %r10 +@@ -1174,12 +1496,18 @@ LABEL(loop_ashr_12_use_sse4_2): + + movdqa (%rdi, %rdx), %xmm0 + palignr $12, -16(%rdi, %rdx), %xmm0 +- pcmpistri $0x1a,(%rsi,%rdx), %xmm0 ++# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L ++ pcmpistri $0x1a, (%rsi,%rdx), %xmm0 ++# else ++ movdqa (%rsi,%rdx), %xmm1 ++ TOLOWER (%xmm0, %xmm1) ++ pcmpistri $0x1a, %xmm1, %xmm0 ++# endif + jbe LABEL(use_sse4_2_exit) +-#ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz_sse4_2) +-#endif ++# endif + add $16, %rdx + jmp LABEL(loop_ashr_12_use_sse4_2) + +@@ -1189,10 +1517,10 @@ LABEL(nibble_ashr_12_use_sse4_2): + movdqa -16(%rdi, %rdx), %xmm0 + psrldq $12, %xmm0 + pcmpistri $0x3a,%xmm0, %xmm0 +-#ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + cmp %r11, %rcx + jae LABEL(nibble_ashr_use_sse4_2_exit) +-#endif ++# endif + cmp $3, %ecx + ja LABEL(loop_ashr_12_use_sse4_2) + +@@ -1201,7 +1529,7 @@ LABEL(nibble_ashr_12_use_sse4_2): + /* + * The following cases will be handled by ashr_13 + * rcx(offset of rsi) rax(offset of rdi) relative offset corresponding case +- * n(3~15) n - 3 12(15 +(n - 3) - n) ashr_13 ++ * n(3~15) n - 3 12(15 +(n - 3) - n) ashr_13 + */ + .p2align 4 + LABEL(ashr_13_sse4_2): +@@ -1210,6 +1538,7 @@ LABEL(ashr_13_sse4_2): + movdqa (%rsi), %xmm1 + pcmpeqb %xmm1, %xmm0 + pslldq $3, %xmm2 ++ TOLOWER (%xmm1, %xmm2) + pcmpeqb %xmm1, %xmm2 + psubb %xmm0, %xmm2 + pmovmskb %xmm2, %r9d +@@ -1242,12 +1571,18 @@ LABEL(loop_ashr_13_use_sse4_2): + + movdqa (%rdi, %rdx), %xmm0 + palignr $13, -16(%rdi, %rdx), %xmm0 +- pcmpistri $0x1a,(%rsi,%rdx), %xmm0 ++# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L ++ pcmpistri $0x1a, (%rsi,%rdx), %xmm0 ++# else ++ movdqa (%rsi,%rdx), %xmm1 ++ TOLOWER (%xmm0, %xmm1) ++ pcmpistri $0x1a, %xmm1, %xmm0 ++# endif + jbe LABEL(use_sse4_2_exit) +-#ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz_sse4_2) +-#endif ++# endif + + add $16, %rdx + add $16, %r10 +@@ -1255,12 +1590,18 @@ LABEL(loop_ashr_13_use_sse4_2): + + movdqa (%rdi, %rdx), %xmm0 + palignr $13, -16(%rdi, %rdx), %xmm0 +- pcmpistri $0x1a,(%rsi,%rdx), %xmm0 ++# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L ++ pcmpistri $0x1a, (%rsi,%rdx), %xmm0 ++# else ++ movdqa (%rsi,%rdx), %xmm1 ++ TOLOWER (%xmm0, %xmm1) ++ pcmpistri $0x1a, %xmm1, %xmm0 ++# endif + jbe LABEL(use_sse4_2_exit) +-#ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz_sse4_2) +-#endif ++# endif + add $16, %rdx + jmp LABEL(loop_ashr_13_use_sse4_2) + +@@ -1270,10 +1611,10 @@ LABEL(nibble_ashr_13_use_sse4_2): + movdqa -16(%rdi, %rdx), %xmm0 + psrldq $13, %xmm0 + pcmpistri $0x3a,%xmm0, %xmm0 +-#ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + cmp %r11, %rcx + jae LABEL(nibble_ashr_use_sse4_2_exit) +-#endif ++# endif + cmp $2, %ecx + ja LABEL(loop_ashr_13_use_sse4_2) + +@@ -1282,7 +1623,7 @@ LABEL(nibble_ashr_13_use_sse4_2): + /* + * The following cases will be handled by ashr_14 + * rcx(offset of rsi) rax(offset of rdi) relative offset corresponding case +- * n(2~15) n - 2 13(15 +(n - 2) - n) ashr_14 ++ * n(2~15) n - 2 13(15 +(n - 2) - n) ashr_14 + */ + .p2align 4 + LABEL(ashr_14_sse4_2): +@@ -1291,6 +1632,7 @@ LABEL(ashr_14_sse4_2): + movdqa (%rsi), %xmm1 + pcmpeqb %xmm1, %xmm0 + pslldq $2, %xmm2 ++ TOLOWER (%xmm1, %xmm2) + pcmpeqb %xmm1, %xmm2 + psubb %xmm0, %xmm2 + pmovmskb %xmm2, %r9d +@@ -1323,12 +1665,18 @@ LABEL(loop_ashr_14_use_sse4_2): + + movdqa (%rdi, %rdx), %xmm0 + palignr $14, -16(%rdi, %rdx), %xmm0 +- pcmpistri $0x1a,(%rsi,%rdx), %xmm0 ++# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L ++ pcmpistri $0x1a, (%rsi,%rdx), %xmm0 ++# else ++ movdqa (%rsi,%rdx), %xmm1 ++ TOLOWER (%xmm0, %xmm1) ++ pcmpistri $0x1a, %xmm1, %xmm0 ++# endif + jbe LABEL(use_sse4_2_exit) +-#ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz_sse4_2) +-#endif ++# endif + + add $16, %rdx + add $16, %r10 +@@ -1336,12 +1684,18 @@ LABEL(loop_ashr_14_use_sse4_2): + + movdqa (%rdi, %rdx), %xmm0 + palignr $14, -16(%rdi, %rdx), %xmm0 +- pcmpistri $0x1a,(%rsi,%rdx), %xmm0 ++# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L ++ pcmpistri $0x1a, (%rsi,%rdx), %xmm0 ++# else ++ movdqa (%rsi,%rdx), %xmm1 ++ TOLOWER (%xmm0, %xmm1) ++ pcmpistri $0x1a, %xmm1, %xmm0 ++# endif + jbe LABEL(use_sse4_2_exit) +-#ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz_sse4_2) +-#endif ++# endif + add $16, %rdx + jmp LABEL(loop_ashr_14_use_sse4_2) + +@@ -1351,10 +1705,10 @@ LABEL(nibble_ashr_14_use_sse4_2): + movdqa -16(%rdi, %rdx), %xmm0 + psrldq $14, %xmm0 + pcmpistri $0x3a,%xmm0, %xmm0 +-#ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + cmp %r11, %rcx + jae LABEL(nibble_ashr_use_sse4_2_exit) +-#endif ++# endif + cmp $1, %ecx + ja LABEL(loop_ashr_14_use_sse4_2) + +@@ -1363,7 +1717,7 @@ LABEL(nibble_ashr_14_use_sse4_2): + /* + * The following cases will be handled by ashr_15 + * rcx(offset of rsi) rax(offset of rdi) relative offset corresponding case +- * n(1~15) n - 1 14(15 +(n - 1) - n) ashr_15 ++ * n(1~15) n - 1 14(15 +(n - 1) - n) ashr_15 + */ + .p2align 4 + LABEL(ashr_15_sse4_2): +@@ -1372,6 +1726,7 @@ LABEL(ashr_15_sse4_2): + movdqa (%rsi), %xmm1 + pcmpeqb %xmm1, %xmm0 + pslldq $1, %xmm2 ++ TOLOWER (%xmm1, %xmm2) + pcmpeqb %xmm1, %xmm2 + psubb %xmm0, %xmm2 + pmovmskb %xmm2, %r9d +@@ -1406,12 +1761,18 @@ LABEL(loop_ashr_15_use_sse4_2): + + movdqa (%rdi, %rdx), %xmm0 + palignr $15, -16(%rdi, %rdx), %xmm0 +- pcmpistri $0x1a,(%rsi,%rdx), %xmm0 ++# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L ++ pcmpistri $0x1a, (%rsi,%rdx), %xmm0 ++# else ++ movdqa (%rsi,%rdx), %xmm1 ++ TOLOWER (%xmm0, %xmm1) ++ pcmpistri $0x1a, %xmm1, %xmm0 ++# endif + jbe LABEL(use_sse4_2_exit) +-#ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz_sse4_2) +-#endif ++# endif + + add $16, %rdx + add $16, %r10 +@@ -1419,12 +1780,18 @@ LABEL(loop_ashr_15_use_sse4_2): + + movdqa (%rdi, %rdx), %xmm0 + palignr $15, -16(%rdi, %rdx), %xmm0 +- pcmpistri $0x1a,(%rsi,%rdx), %xmm0 ++# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L ++ pcmpistri $0x1a, (%rsi,%rdx), %xmm0 ++# else ++ movdqa (%rsi,%rdx), %xmm1 ++ TOLOWER (%xmm0, %xmm1) ++ pcmpistri $0x1a, %xmm1, %xmm0 ++# endif + jbe LABEL(use_sse4_2_exit) +-#ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz_sse4_2) +-#endif ++# endif + add $16, %rdx + jmp LABEL(loop_ashr_15_use_sse4_2) + +@@ -1434,22 +1801,28 @@ LABEL(nibble_ashr_15_use_sse4_2): + movdqa -16(%rdi, %rdx), %xmm0 + psrldq $15, %xmm0 + pcmpistri $0x3a,%xmm0, %xmm0 +-#ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + cmp %r11, %rcx + jae LABEL(nibble_ashr_use_sse4_2_exit) +-#endif ++# endif + cmp $0, %ecx + ja LABEL(loop_ashr_15_use_sse4_2) + + LABEL(nibble_ashr_use_sse4_2_exit): ++# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L + pcmpistri $0x1a,(%rsi,%rdx), %xmm0 ++# else ++ movdqa (%rsi,%rdx), %xmm1 ++ TOLOWER (%xmm0, %xmm1) ++ pcmpistri $0x1a, %xmm1, %xmm0 ++# endif + .p2align 4 + LABEL(use_sse4_2_exit): + jnc LABEL(strcmp_exitz_sse4_2) +-#ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub %rcx, %r11 + jbe LABEL(strcmp_exitz_sse4_2) +-#endif ++# endif + add %rcx, %rdx + lea -16(%rdi, %r9), %rdi + movzbl (%rdi, %rdx), %eax +@@ -1458,6 +1831,12 @@ LABEL(use_sse4_2_exit): + jz LABEL(use_sse4_2_ret_sse4_2) + xchg %eax, %edx + LABEL(use_sse4_2_ret_sse4_2): ++# if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L ++ leaq _nl_C_LC_CTYPE_tolower+128*4(%rip), %rcx ++ movl (%rcx,%rdx,4), %edx ++ movl (%rcx,%rax,4), %eax ++# endif ++ + sub %edx, %eax + ret + +@@ -1473,13 +1852,19 @@ LABEL(ret_sse4_2): + LABEL(less16bytes_sse4_2): + bsf %rdx, %rdx /* find and store bit index in %rdx */ + +-#ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub %rdx, %r11 + jbe LABEL(strcmp_exitz_sse4_2) +-#endif ++# endif + movzbl (%rsi, %rdx), %ecx + movzbl (%rdi, %rdx), %eax + ++# if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L ++ leaq _nl_C_LC_CTYPE_tolower+128*4(%rip), %rdx ++ movl (%rdx,%rcx,4), %ecx ++ movl (%rdx,%rax,4), %eax ++# endif ++ + sub %ecx, %eax + ret + +@@ -1488,15 +1873,27 @@ LABEL(strcmp_exitz_sse4_2): + ret + + .p2align 4 ++ // XXX Same as code above + LABEL(Byte0_sse4_2): + movzx (%rsi), %ecx + movzx (%rdi), %eax + ++# if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L ++ leaq _nl_C_LC_CTYPE_tolower+128*4(%rip), %rdx ++ movl (%rdx,%rcx,4), %ecx ++ movl (%rdx,%rax,4), %eax ++# endif ++ + sub %ecx, %eax + ret + cfi_endproc + .size STRCMP_SSE42, .-STRCMP_SSE42 + ++# undef UCLOW_reg ++# undef UCHIGH_reg ++# undef LCQWORD_reg ++# undef TOLOWER ++ + /* Put all SSE 4.2 functions together. */ + .section .rodata.sse4.2,"a",@progbits + .p2align 3 +@@ -1528,6 +1925,27 @@ LABEL(unaligned_table_sse4_2): + # undef END + # define END(name) \ + cfi_endproc; .size STRCMP_SSE2, .-STRCMP_SSE2 ++ ++# ifdef USE_AS_STRCASECMP_L ++# define ENTRY2(name) \ ++ .type __strcasecmp_sse2, @function; \ ++ .align 16; \ ++ __strcasecmp_sse2: cfi_startproc; \ ++ CALL_MCOUNT ++# define END2(name) \ ++ cfi_endproc; .size __strcasecmp_sse2, .-__strcasecmp_sse2 ++# endif ++ ++# ifdef USE_AS_STRNCASECMP_L ++# define ENTRY2(name) \ ++ .type __strncasecmp_sse2, @function; \ ++ .align 16; \ ++ __strncasecmp_sse2: cfi_startproc; \ ++ CALL_MCOUNT ++# define END2(name) \ ++ cfi_endproc; .size __strncasecmp_sse2, .-__strncasecmp_sse2 ++# endif ++ + # undef libc_hidden_builtin_def + /* It doesn't make sense to send libc-internal strcmp calls through a PLT. + The speedup we get from using SSE4.2 instruction is likely eaten away +Index: glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/strncase_l-ssse3.S +=================================================================== +--- /dev/null ++++ glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/strncase_l-ssse3.S +@@ -0,0 +1,6 @@ ++#define USE_SSSE3 1 ++#define USE_AS_STRNCASECMP_L ++#define NO_NOLOCALE_ALIAS ++#define STRCMP __strncasecmp_l_ssse3 ++#define __strncasecmp __strncasecmp_ssse3 ++#include "../strcmp.S" +Index: glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/strncase_l.S +=================================================================== +--- /dev/null ++++ glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/strncase_l.S +@@ -0,0 +1,6 @@ ++#define STRCMP __strncasecmp_l ++#define USE_AS_STRNCASECMP_L ++#include "strcmp.S" ++ ++weak_alias (__strncasecmp_l, strncasecmp_l) ++libc_hidden_def (strncasecmp_l) +Index: glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/strstr.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/sysdeps/x86_64/multiarch/strstr.c ++++ glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/strstr.c +@@ -67,10 +67,10 @@ + + case ECX CFlag ZFlag SFlag + 3 X 1 0 0/1 +- 4a 0 1 0 0 +- 4b 0 1 0 1 +- 4c 0 < X 1 0 0/1 +- 5 16 0 1 0 ++ 4a 0 1 0 0 ++ 4b 0 1 0 1 ++ 4c 0 < X 1 0 0/1 ++ 5 16 0 1 0 + + 3. An initial ordered-comparison fragment match, we fix up to do + subsequent string comparison +@@ -147,8 +147,7 @@ __m128i_shift_right (__m128i value, int + If EOS occurs within less than 16B before 4KB boundary, we don't + cross to next page. */ + +-static __m128i +-__attribute__ ((section (".text.sse4.2"))) ++static inline __m128i + __m128i_strloadu (const unsigned char * p) + { + int offset = ((size_t) p & (16 - 1)); +@@ -164,59 +163,36 @@ __m128i_strloadu (const unsigned char * + return _mm_loadu_si128 ((__m128i *) p); + } + +-#ifdef USE_AS_STRCASESTR ++#if defined USE_AS_STRCASESTR && !defined STRCASESTR_NONASCII + + /* Similar to __m128i_strloadu. Convert to lower case for POSIX/C + locale. */ +- +-static __m128i +-__attribute__ ((section (".text.sse4.2"))) +-__m128i_strloadu_tolower_posix (const unsigned char * p) ++static inline __m128i ++__m128i_strloadu_tolower (const unsigned char *p, __m128i rangeuc, ++ __m128i u2ldelta) + { + __m128i frag = __m128i_strloadu (p); + +- /* Convert frag to lower case for POSIX/C locale. */ +- __m128i rangeuc = _mm_set_epi64x (0x0, 0x5a41); +- __m128i u2ldelta = _mm_set1_epi64x (0xe0e0e0e0e0e0e0e0); +- __m128i mask1 = _mm_cmpistrm (rangeuc, frag, 0x44); +- __m128i mask2 = _mm_blendv_epi8 (u2ldelta, frag, mask1); +- mask2 = _mm_sub_epi8 (mask2, u2ldelta); +- return _mm_blendv_epi8 (frag, mask2, mask1); ++#define UCLOW 0x4040404040404040ULL ++#define UCHIGH 0x5b5b5b5b5b5b5b5bULL ++#define LCQWORD 0x2020202020202020ULL ++ /* Compare if 'Z' > bytes. Inverted way to get a mask for byte <= 'Z'. */ ++ __m128i r2 = _mm_cmpgt_epi8 (_mm_set1_epi64x (UCHIGH), frag); ++ /* Compare if bytes are > 'A' - 1. */ ++ __m128i r1 = _mm_cmpgt_epi8 (frag, _mm_set1_epi64x (UCLOW)); ++ /* Mask byte == ff if byte(r2) <= 'Z' and byte(r1) > 'A' - 1. */ ++ __m128i mask = _mm_and_si128 (r2, r1); ++ /* Apply lowercase bit 6 mask for above mask bytes == ff. */ ++ return _mm_or_si128 (frag, _mm_and_si128 (mask, _mm_set1_epi64x (LCQWORD))); + } + +-/* Similar to __m128i_strloadu. Convert to lower case for none-POSIX/C +- locale. */ +- +-static __m128i +-__attribute__ ((section (".text.sse4.2"))) +-__m128i_strloadu_tolower (const unsigned char * p) +-{ +- union +- { +- char b[16]; +- __m128i x; +- } u; +- +- for (int i = 0; i < 16; i++) +- if (p[i] == 0) +- { +- u.b[i] = 0; +- break; +- } +- else +- u.b[i] = tolower (p[i]); +- +- return u.x; +-} + #endif + + /* Calculate Knuth-Morris-Pratt string searching algorithm (or KMP + algorithm) overlap for a fully populated 16B vector. + Input parameter: 1st 16Byte loaded from the reference string of a + strstr function. +- We don't use KMP algorithm if reference string is less than 16B. +- */ +- ++ We don't use KMP algorithm if reference string is less than 16B. */ + static int + __inline__ __attribute__ ((__always_inline__,)) + KMP16Bovrlap (__m128i s2) +@@ -236,7 +212,7 @@ KMP16Bovrlap (__m128i s2) + return 1; + else if (!k1) + { +- /* There are al least two ditinct char in s2. If byte 0 and 1 are ++ /* There are al least two distinct chars in s2. If byte 0 and 1 are + idential and the distinct value lies farther down, we can deduce + the next byte offset to restart full compare is least no earlier + than byte 3. */ +@@ -256,23 +232,30 @@ STRSTR_SSE42 (const unsigned char *s1, c + #define p1 s1 + const unsigned char *p2 = s2; + +- if (p2[0] == '\0') ++#ifndef STRCASESTR_NONASCII ++ if (__builtin_expect (p2[0] == '\0', 0)) + return (char *) p1; + +- if (p1[0] == '\0') ++ if (__builtin_expect (p1[0] == '\0', 0)) + return NULL; + + /* Check if p1 length is 1 byte long. */ +- if (p1[1] == '\0') ++ if (__builtin_expect (p1[1] == '\0', 0)) + return p2[1] == '\0' && CMPBYTE (p1[0], p2[0]) ? (char *) p1 : NULL; ++#endif + + #ifdef USE_AS_STRCASESTR +- __m128i (*strloadu) (const unsigned char *); +- +- if (_NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_NONASCII_CASE) == 0) +- strloadu = __m128i_strloadu_tolower_posix; +- else +- strloadu = __m128i_strloadu_tolower; ++# ifndef STRCASESTR_NONASCII ++ if (__builtin_expect (_NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_NONASCII_CASE) ++ != 0, 0)) ++ return __strcasestr_sse42_nonascii (s1, s2); ++ ++ const __m128i rangeuc = _mm_set_epi64x (0x0, 0x5a41); ++ const __m128i u2ldelta = _mm_set1_epi64x (0xe0e0e0e0e0e0e0e0); ++# define strloadu(p) __m128i_strloadu_tolower (p, rangeuc, u2ldelta) ++# else ++# define strloadu __m128i_strloadu_tolower ++# endif + #else + # define strloadu __m128i_strloadu + #endif +Index: glibc-2.12-2-gc4ccff1/sysdeps/x86_64/strcasecmp.S +=================================================================== +--- /dev/null ++++ glibc-2.12-2-gc4ccff1/sysdeps/x86_64/strcasecmp.S +@@ -0,0 +1 @@ ++/* In strcasecmp_l.S. */ +Index: glibc-2.12-2-gc4ccff1/sysdeps/x86_64/strcasecmp_l-nonascii.c +=================================================================== +--- /dev/null ++++ glibc-2.12-2-gc4ccff1/sysdeps/x86_64/strcasecmp_l-nonascii.c +@@ -0,0 +1,8 @@ ++#include ++ ++extern int __strcasecmp_l_nonascii (__const char *__s1, __const char *__s2, ++ __locale_t __loc); ++ ++#define __strcasecmp_l __strcasecmp_l_nonascii ++#define USE_IN_EXTENDED_LOCALE_MODEL 1 ++#include +Index: glibc-2.12-2-gc4ccff1/sysdeps/x86_64/strcasecmp_l.S +=================================================================== +--- /dev/null ++++ glibc-2.12-2-gc4ccff1/sysdeps/x86_64/strcasecmp_l.S +@@ -0,0 +1,6 @@ ++#define STRCMP __strcasecmp_l ++#define USE_AS_STRCASECMP_L ++#include "strcmp.S" ++ ++weak_alias (__strcasecmp_l, strcasecmp_l) ++libc_hidden_def (strcasecmp_l) +Index: glibc-2.12-2-gc4ccff1/sysdeps/x86_64/strcmp.S +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/sysdeps/x86_64/strcmp.S ++++ glibc-2.12-2-gc4ccff1/sysdeps/x86_64/strcmp.S +@@ -51,6 +51,31 @@ + je LABEL(strcmp_exitz); \ + mov %r9, %r11 + ++#elif defined USE_AS_STRCASECMP_L ++# include "locale-defines.h" ++ ++/* No support for strcasecmp outside libc so far since it is not needed. */ ++# ifdef NOT_IN_lib ++# error "strcasecmp_l not implemented so far" ++# endif ++ ++# define UPDATE_STRNCMP_COUNTER ++#elif defined USE_AS_STRNCASECMP_L ++# include "locale-defines.h" ++ ++/* No support for strncasecmp outside libc so far since it is not needed. */ ++# ifdef NOT_IN_lib ++# error "strncasecmp_l not implemented so far" ++# endif ++ ++# define UPDATE_STRNCMP_COUNTER \ ++ /* calculate left number to compare */ \ ++ lea -16(%rcx, %r11), %r9; \ ++ cmp %r9, %r11; \ ++ jb LABEL(strcmp_exitz); \ ++ test %r9, %r9; \ ++ je LABEL(strcmp_exitz); \ ++ mov %r9, %r11 + #else + # define UPDATE_STRNCMP_COUNTER + # ifndef STRCMP +@@ -64,6 +89,46 @@ + .section .text.ssse3,"ax",@progbits + #endif + ++#ifdef USE_AS_STRCASECMP_L ++# ifndef ENTRY2 ++# define ENTRY2(name) ENTRY (name) ++# define END2(name) END (name) ++# endif ++ ++ENTRY2 (__strcasecmp) ++ movq __libc_tsd_LOCALE@gottpoff(%rip),%rax ++ movq %fs:(%rax),%rdx ++ ++ // XXX 5 byte should be before the function ++ /* 5-byte NOP. */ ++ .byte 0x0f,0x1f,0x44,0x00,0x00 ++END2 (__strcasecmp) ++# ifndef NO_NOLOCALE_ALIAS ++weak_alias (__strcasecmp, strcasecmp) ++libc_hidden_def (__strcasecmp) ++# endif ++ /* FALLTHROUGH to strcasecmp_l. */ ++#elif defined USE_AS_STRNCASECMP_L ++# ifndef ENTRY2 ++# define ENTRY2(name) ENTRY (name) ++# define END2(name) END (name) ++# endif ++ ++ENTRY2 (__strncasecmp) ++ movq __libc_tsd_LOCALE@gottpoff(%rip),%rax ++ movq %fs:(%rax),%rcx ++ ++ // XXX 5 byte should be before the function ++ /* 5-byte NOP. */ ++ .byte 0x0f,0x1f,0x44,0x00,0x00 ++END2 (__strncasecmp) ++# ifndef NO_NOLOCALE_ALIAS ++weak_alias (__strncasecmp, strncasecmp) ++libc_hidden_def (__strncasecmp) ++# endif ++ /* FALLTHROUGH to strncasecmp_l. */ ++#endif ++ + ENTRY (BP_SYM (STRCMP)) + #ifdef NOT_IN_libc + /* Simple version since we can't use SSE registers in ld.so. */ +@@ -84,10 +149,32 @@ L(neq): movl $1, %eax + ret + END (BP_SYM (STRCMP)) + #else /* NOT_IN_libc */ ++# ifdef USE_AS_STRCASECMP_L ++ /* We have to fall back on the C implementation for locales ++ with encodings not matching ASCII for single bytes. */ ++# if LOCALE_T___LOCALES != 0 || LC_CTYPE != 0 ++ movq LOCALE_T___LOCALES+LC_CTYPE*8(%rdx), %rax ++# else ++ movq (%rdx), %rax ++# endif ++ testl $0, LOCALE_DATA_VALUES+_NL_CTYPE_NONASCII_CASE*SIZEOF_VALUES(%rax) ++ jne __strcasecmp_l_nonascii ++# elif defined USE_AS_STRNCASECMP_L ++ /* We have to fall back on the C implementation for locales ++ with encodings not matching ASCII for single bytes. */ ++# if LOCALE_T___LOCALES != 0 || LC_CTYPE != 0 ++ movq LOCALE_T___LOCALES+LC_CTYPE*8(%rcx), %rax ++# else ++ movq (%rcx), %rax ++# endif ++ testl $0, LOCALE_DATA_VALUES+_NL_CTYPE_NONASCII_CASE*SIZEOF_VALUES(%rax) ++ jne __strncasecmp_l_nonascii ++# endif ++ + /* + * This implementation uses SSE to compare up to 16 bytes at a time. + */ +-# ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + test %rdx, %rdx + je LABEL(strcmp_exitz) + cmp $1, %rdx +@@ -99,6 +186,26 @@ END (BP_SYM (STRCMP)) + /* Use 64bit AND here to avoid long NOP padding. */ + and $0x3f, %rcx /* rsi alignment in cache line */ + and $0x3f, %rax /* rdi alignment in cache line */ ++# if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L ++ .section .rodata.cst16,"aM",@progbits,16 ++ .align 16 ++.Lbelowupper: ++ .quad 0x4040404040404040 ++ .quad 0x4040404040404040 ++.Ltopupper: ++ .quad 0x5b5b5b5b5b5b5b5b ++ .quad 0x5b5b5b5b5b5b5b5b ++.Ltouppermask: ++ .quad 0x2020202020202020 ++ .quad 0x2020202020202020 ++ .previous ++ movdqa .Lbelowupper(%rip), %xmm5 ++# define UCLOW_reg %xmm5 ++ movdqa .Ltopupper(%rip), %xmm6 ++# define UCHIGH_reg %xmm6 ++ movdqa .Ltouppermask(%rip), %xmm7 ++# define LCQWORD_reg %xmm7 ++# endif + cmp $0x30, %ecx + ja LABEL(crosscache) /* rsi: 16-byte load will cross cache line */ + cmp $0x30, %eax +@@ -107,6 +214,26 @@ END (BP_SYM (STRCMP)) + movlpd (%rsi), %xmm2 + movhpd 8(%rdi), %xmm1 + movhpd 8(%rsi), %xmm2 ++# if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L ++# define TOLOWER(reg1, reg2) \ ++ movdqa reg1, %xmm8; \ ++ movdqa UCHIGH_reg, %xmm9; \ ++ movdqa reg2, %xmm10; \ ++ movdqa UCHIGH_reg, %xmm11; \ ++ pcmpgtb UCLOW_reg, %xmm8; \ ++ pcmpgtb reg1, %xmm9; \ ++ pcmpgtb UCLOW_reg, %xmm10; \ ++ pcmpgtb reg2, %xmm11; \ ++ pand %xmm9, %xmm8; \ ++ pand %xmm11, %xmm10; \ ++ pand LCQWORD_reg, %xmm8; \ ++ pand LCQWORD_reg, %xmm10; \ ++ por %xmm8, reg1; \ ++ por %xmm10, reg2 ++ TOLOWER (%xmm1, %xmm2) ++# else ++# define TOLOWER(reg1, reg2) ++# endif + pxor %xmm0, %xmm0 /* clear %xmm0 for null char checks */ + pcmpeqb %xmm1, %xmm0 /* Any null chars? */ + pcmpeqb %xmm2, %xmm1 /* compare first 16 bytes for equality */ +@@ -114,7 +241,7 @@ END (BP_SYM (STRCMP)) + pmovmskb %xmm1, %edx + sub $0xffff, %edx /* if first 16 bytes are same, edx == 0xffff */ + jnz LABEL(less16bytes) /* If not, find different value or null char */ +-# ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz) /* finish comparision */ + # endif +@@ -159,7 +286,13 @@ LABEL(ashr_0): + movdqa (%rsi), %xmm1 + pxor %xmm0, %xmm0 /* clear %xmm0 for null char check */ + pcmpeqb %xmm1, %xmm0 /* Any null chars? */ ++# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L + pcmpeqb (%rdi), %xmm1 /* compare 16 bytes for equality */ ++# else ++ movdqa (%rdi), %xmm2 ++ TOLOWER (%xmm1, %xmm2) ++ pcmpeqb %xmm2, %xmm1 /* compare 16 bytes for equality */ ++# endif + psubb %xmm0, %xmm1 /* packed sub of comparison results*/ + pmovmskb %xmm1, %r9d + shr %cl, %edx /* adjust 0xffff for offset */ +@@ -183,6 +316,7 @@ LABEL(ashr_0): + LABEL(loop_ashr_0): + movdqa (%rsi, %rcx), %xmm1 + movdqa (%rdi, %rcx), %xmm2 ++ TOLOWER (%xmm1, %xmm2) + + pcmpeqb %xmm1, %xmm0 + pcmpeqb %xmm2, %xmm1 +@@ -191,13 +325,14 @@ LABEL(loop_ashr_0): + sub $0xffff, %edx + jnz LABEL(exit) /* mismatch or null char seen */ + +-# ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz) + # endif + add $16, %rcx + movdqa (%rsi, %rcx), %xmm1 + movdqa (%rdi, %rcx), %xmm2 ++ TOLOWER (%xmm1, %xmm2) + + pcmpeqb %xmm1, %xmm0 + pcmpeqb %xmm2, %xmm1 +@@ -205,7 +340,7 @@ LABEL(loop_ashr_0): + pmovmskb %xmm1, %edx + sub $0xffff, %edx + jnz LABEL(exit) +-# ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz) + # endif +@@ -214,7 +349,7 @@ LABEL(loop_ashr_0): + + /* + * The following cases will be handled by ashr_1 +- * rcx(offset of rsi) rax(offset of rdi) relative offset corresponding case ++ * rcx(offset of rsi) rax(offset of rdi) relative offset corresponding case + * n(15) n -15 0(15 +(n-15) - n) ashr_1 + */ + .p2align 4 +@@ -224,6 +359,7 @@ LABEL(ashr_1): + movdqa (%rsi), %xmm1 + pcmpeqb %xmm1, %xmm0 /* Any null chars? */ + pslldq $15, %xmm2 /* shift first string to align with second */ ++ TOLOWER (%xmm1, %xmm2) + pcmpeqb %xmm1, %xmm2 /* compare 16 bytes for equality */ + psubb %xmm0, %xmm2 /* packed sub of comparison results*/ + pmovmskb %xmm2, %r9d +@@ -263,6 +399,7 @@ LABEL(gobble_ashr_1): + # else + palignr $1, %xmm3, %xmm2 /* merge into one 16byte value */ + # endif ++ TOLOWER (%xmm1, %xmm2) + + pcmpeqb %xmm1, %xmm0 + pcmpeqb %xmm2, %xmm1 +@@ -271,7 +408,7 @@ LABEL(gobble_ashr_1): + sub $0xffff, %edx + jnz LABEL(exit) + +-# ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz) + # endif +@@ -292,6 +429,7 @@ LABEL(gobble_ashr_1): + # else + palignr $1, %xmm3, %xmm2 /* merge into one 16byte value */ + # endif ++ TOLOWER (%xmm1, %xmm2) + + pcmpeqb %xmm1, %xmm0 + pcmpeqb %xmm2, %xmm1 +@@ -300,7 +438,7 @@ LABEL(gobble_ashr_1): + sub $0xffff, %edx + jnz LABEL(exit) + +-# ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz) + # endif +@@ -319,8 +457,8 @@ LABEL(nibble_ashr_1): + test $0xfffe, %edx + jnz LABEL(ashr_1_exittail) /* find null char*/ + +-# ifdef USE_AS_STRNCMP +- cmp $14, %r11 ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L ++ cmp $15, %r11 + jbe LABEL(ashr_1_exittail) + # endif + +@@ -351,6 +489,7 @@ LABEL(ashr_2): + movdqa (%rsi), %xmm1 + pcmpeqb %xmm1, %xmm0 + pslldq $14, %xmm2 ++ TOLOWER (%xmm1, %xmm2) + pcmpeqb %xmm1, %xmm2 + psubb %xmm0, %xmm2 + pmovmskb %xmm2, %r9d +@@ -390,6 +529,7 @@ LABEL(gobble_ashr_2): + # else + palignr $2, %xmm3, %xmm2 /* merge into one 16byte value */ + # endif ++ TOLOWER (%xmm1, %xmm2) + + pcmpeqb %xmm1, %xmm0 + pcmpeqb %xmm2, %xmm1 +@@ -398,7 +538,7 @@ LABEL(gobble_ashr_2): + sub $0xffff, %edx + jnz LABEL(exit) + +-# ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz) + # endif +@@ -420,6 +560,7 @@ LABEL(gobble_ashr_2): + # else + palignr $2, %xmm3, %xmm2 /* merge into one 16byte value */ + # endif ++ TOLOWER (%xmm1, %xmm2) + + pcmpeqb %xmm1, %xmm0 + pcmpeqb %xmm2, %xmm1 +@@ -428,7 +569,7 @@ LABEL(gobble_ashr_2): + sub $0xffff, %edx + jnz LABEL(exit) + +-# ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz) + # endif +@@ -444,8 +585,8 @@ LABEL(nibble_ashr_2): + test $0xfffc, %edx + jnz LABEL(ashr_2_exittail) + +-# ifdef USE_AS_STRNCMP +- cmp $13, %r11 ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L ++ cmp $14, %r11 + jbe LABEL(ashr_2_exittail) + # endif + +@@ -472,6 +613,7 @@ LABEL(ashr_3): + movdqa (%rsi), %xmm1 + pcmpeqb %xmm1, %xmm0 + pslldq $13, %xmm2 ++ TOLOWER (%xmm1, %xmm2) + pcmpeqb %xmm1, %xmm2 + psubb %xmm0, %xmm2 + pmovmskb %xmm2, %r9d +@@ -512,6 +654,7 @@ LABEL(gobble_ashr_3): + # else + palignr $3, %xmm3, %xmm2 /* merge into one 16byte value */ + # endif ++ TOLOWER (%xmm1, %xmm2) + + pcmpeqb %xmm1, %xmm0 + pcmpeqb %xmm2, %xmm1 +@@ -520,7 +663,7 @@ LABEL(gobble_ashr_3): + sub $0xffff, %edx + jnz LABEL(exit) + +-# ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz) + # endif +@@ -542,6 +685,7 @@ LABEL(gobble_ashr_3): + # else + palignr $3, %xmm3, %xmm2 /* merge into one 16byte value */ + # endif ++ TOLOWER (%xmm1, %xmm2) + + pcmpeqb %xmm1, %xmm0 + pcmpeqb %xmm2, %xmm1 +@@ -550,7 +694,7 @@ LABEL(gobble_ashr_3): + sub $0xffff, %edx + jnz LABEL(exit) + +-# ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz) + # endif +@@ -566,8 +710,8 @@ LABEL(nibble_ashr_3): + test $0xfff8, %edx + jnz LABEL(ashr_3_exittail) + +-# ifdef USE_AS_STRNCMP +- cmp $12, %r11 ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L ++ cmp $13, %r11 + jbe LABEL(ashr_3_exittail) + # endif + +@@ -594,6 +738,7 @@ LABEL(ashr_4): + movdqa (%rsi), %xmm1 + pcmpeqb %xmm1, %xmm0 + pslldq $12, %xmm2 ++ TOLOWER (%xmm1, %xmm2) + pcmpeqb %xmm1, %xmm2 + psubb %xmm0, %xmm2 + pmovmskb %xmm2, %r9d +@@ -634,6 +779,7 @@ LABEL(gobble_ashr_4): + # else + palignr $4, %xmm3, %xmm2 /* merge into one 16byte value */ + # endif ++ TOLOWER (%xmm1, %xmm2) + + pcmpeqb %xmm1, %xmm0 + pcmpeqb %xmm2, %xmm1 +@@ -642,7 +788,7 @@ LABEL(gobble_ashr_4): + sub $0xffff, %edx + jnz LABEL(exit) + +-# ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz) + # endif +@@ -664,6 +810,7 @@ LABEL(gobble_ashr_4): + # else + palignr $4, %xmm3, %xmm2 /* merge into one 16byte value */ + # endif ++ TOLOWER (%xmm1, %xmm2) + + pcmpeqb %xmm1, %xmm0 + pcmpeqb %xmm2, %xmm1 +@@ -672,7 +819,7 @@ LABEL(gobble_ashr_4): + sub $0xffff, %edx + jnz LABEL(exit) + +-# ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz) + # endif +@@ -688,8 +835,8 @@ LABEL(nibble_ashr_4): + test $0xfff0, %edx + jnz LABEL(ashr_4_exittail) + +-# ifdef USE_AS_STRNCMP +- cmp $11, %r11 ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L ++ cmp $12, %r11 + jbe LABEL(ashr_4_exittail) + # endif + +@@ -716,6 +863,7 @@ LABEL(ashr_5): + movdqa (%rsi), %xmm1 + pcmpeqb %xmm1, %xmm0 + pslldq $11, %xmm2 ++ TOLOWER (%xmm1, %xmm2) + pcmpeqb %xmm1, %xmm2 + psubb %xmm0, %xmm2 + pmovmskb %xmm2, %r9d +@@ -756,6 +904,7 @@ LABEL(gobble_ashr_5): + # else + palignr $5, %xmm3, %xmm2 /* merge into one 16byte value */ + # endif ++ TOLOWER (%xmm1, %xmm2) + + pcmpeqb %xmm1, %xmm0 + pcmpeqb %xmm2, %xmm1 +@@ -764,7 +913,7 @@ LABEL(gobble_ashr_5): + sub $0xffff, %edx + jnz LABEL(exit) + +-# ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz) + # endif +@@ -786,6 +935,7 @@ LABEL(gobble_ashr_5): + # else + palignr $5, %xmm3, %xmm2 /* merge into one 16byte value */ + # endif ++ TOLOWER (%xmm1, %xmm2) + + pcmpeqb %xmm1, %xmm0 + pcmpeqb %xmm2, %xmm1 +@@ -794,7 +944,7 @@ LABEL(gobble_ashr_5): + sub $0xffff, %edx + jnz LABEL(exit) + +-# ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz) + # endif +@@ -810,8 +960,8 @@ LABEL(nibble_ashr_5): + test $0xffe0, %edx + jnz LABEL(ashr_5_exittail) + +-# ifdef USE_AS_STRNCMP +- cmp $10, %r11 ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L ++ cmp $11, %r11 + jbe LABEL(ashr_5_exittail) + # endif + +@@ -838,6 +988,7 @@ LABEL(ashr_6): + movdqa (%rsi), %xmm1 + pcmpeqb %xmm1, %xmm0 + pslldq $10, %xmm2 ++ TOLOWER (%xmm1, %xmm2) + pcmpeqb %xmm1, %xmm2 + psubb %xmm0, %xmm2 + pmovmskb %xmm2, %r9d +@@ -878,6 +1029,7 @@ LABEL(gobble_ashr_6): + # else + palignr $6, %xmm3, %xmm2 /* merge into one 16byte value */ + # endif ++ TOLOWER (%xmm1, %xmm2) + + pcmpeqb %xmm1, %xmm0 + pcmpeqb %xmm2, %xmm1 +@@ -886,7 +1038,7 @@ LABEL(gobble_ashr_6): + sub $0xffff, %edx + jnz LABEL(exit) + +-# ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz) + # endif +@@ -908,6 +1060,7 @@ LABEL(gobble_ashr_6): + # else + palignr $6, %xmm3, %xmm2 /* merge into one 16byte value */ + # endif ++ TOLOWER (%xmm1, %xmm2) + + pcmpeqb %xmm1, %xmm0 + pcmpeqb %xmm2, %xmm1 +@@ -916,7 +1069,7 @@ LABEL(gobble_ashr_6): + sub $0xffff, %edx + jnz LABEL(exit) + +-# ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz) + # endif +@@ -932,8 +1085,8 @@ LABEL(nibble_ashr_6): + test $0xffc0, %edx + jnz LABEL(ashr_6_exittail) + +-# ifdef USE_AS_STRNCMP +- cmp $9, %r11 ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L ++ cmp $10, %r11 + jbe LABEL(ashr_6_exittail) + # endif + +@@ -960,6 +1113,7 @@ LABEL(ashr_7): + movdqa (%rsi), %xmm1 + pcmpeqb %xmm1, %xmm0 + pslldq $9, %xmm2 ++ TOLOWER (%xmm1, %xmm2) + pcmpeqb %xmm1, %xmm2 + psubb %xmm0, %xmm2 + pmovmskb %xmm2, %r9d +@@ -1000,6 +1154,7 @@ LABEL(gobble_ashr_7): + # else + palignr $7, %xmm3, %xmm2 /* merge into one 16byte value */ + # endif ++ TOLOWER (%xmm1, %xmm2) + + pcmpeqb %xmm1, %xmm0 + pcmpeqb %xmm2, %xmm1 +@@ -1008,7 +1163,7 @@ LABEL(gobble_ashr_7): + sub $0xffff, %edx + jnz LABEL(exit) + +-# ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz) + # endif +@@ -1030,6 +1185,7 @@ LABEL(gobble_ashr_7): + # else + palignr $7, %xmm3, %xmm2 /* merge into one 16byte value */ + # endif ++ TOLOWER (%xmm1, %xmm2) + + pcmpeqb %xmm1, %xmm0 + pcmpeqb %xmm2, %xmm1 +@@ -1038,7 +1194,7 @@ LABEL(gobble_ashr_7): + sub $0xffff, %edx + jnz LABEL(exit) + +-# ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz) + # endif +@@ -1054,8 +1210,8 @@ LABEL(nibble_ashr_7): + test $0xff80, %edx + jnz LABEL(ashr_7_exittail) + +-# ifdef USE_AS_STRNCMP +- cmp $8, %r11 ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L ++ cmp $9, %r11 + jbe LABEL(ashr_7_exittail) + # endif + +@@ -1082,6 +1238,7 @@ LABEL(ashr_8): + movdqa (%rsi), %xmm1 + pcmpeqb %xmm1, %xmm0 + pslldq $8, %xmm2 ++ TOLOWER (%xmm1, %xmm2) + pcmpeqb %xmm1, %xmm2 + psubb %xmm0, %xmm2 + pmovmskb %xmm2, %r9d +@@ -1122,6 +1279,7 @@ LABEL(gobble_ashr_8): + # else + palignr $8, %xmm3, %xmm2 /* merge into one 16byte value */ + # endif ++ TOLOWER (%xmm1, %xmm2) + + pcmpeqb %xmm1, %xmm0 + pcmpeqb %xmm2, %xmm1 +@@ -1130,7 +1288,7 @@ LABEL(gobble_ashr_8): + sub $0xffff, %edx + jnz LABEL(exit) + +-# ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz) + # endif +@@ -1152,6 +1310,7 @@ LABEL(gobble_ashr_8): + # else + palignr $8, %xmm3, %xmm2 /* merge into one 16byte value */ + # endif ++ TOLOWER (%xmm1, %xmm2) + + pcmpeqb %xmm1, %xmm0 + pcmpeqb %xmm2, %xmm1 +@@ -1160,7 +1319,7 @@ LABEL(gobble_ashr_8): + sub $0xffff, %edx + jnz LABEL(exit) + +-# ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz) + # endif +@@ -1176,8 +1335,8 @@ LABEL(nibble_ashr_8): + test $0xff00, %edx + jnz LABEL(ashr_8_exittail) + +-# ifdef USE_AS_STRNCMP +- cmp $7, %r11 ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L ++ cmp $8, %r11 + jbe LABEL(ashr_8_exittail) + # endif + +@@ -1204,6 +1363,7 @@ LABEL(ashr_9): + movdqa (%rsi), %xmm1 + pcmpeqb %xmm1, %xmm0 + pslldq $7, %xmm2 ++ TOLOWER (%xmm1, %xmm2) + pcmpeqb %xmm1, %xmm2 + psubb %xmm0, %xmm2 + pmovmskb %xmm2, %r9d +@@ -1244,6 +1404,7 @@ LABEL(gobble_ashr_9): + # else + palignr $9, %xmm3, %xmm2 /* merge into one 16byte value */ + # endif ++ TOLOWER (%xmm1, %xmm2) + + pcmpeqb %xmm1, %xmm0 + pcmpeqb %xmm2, %xmm1 +@@ -1252,7 +1413,7 @@ LABEL(gobble_ashr_9): + sub $0xffff, %edx + jnz LABEL(exit) + +-# ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz) + # endif +@@ -1274,6 +1435,7 @@ LABEL(gobble_ashr_9): + # else + palignr $9, %xmm3, %xmm2 /* merge into one 16byte value */ + # endif ++ TOLOWER (%xmm1, %xmm2) + + pcmpeqb %xmm1, %xmm0 + pcmpeqb %xmm2, %xmm1 +@@ -1282,7 +1444,7 @@ LABEL(gobble_ashr_9): + sub $0xffff, %edx + jnz LABEL(exit) + +-# ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz) + # endif +@@ -1298,8 +1460,8 @@ LABEL(nibble_ashr_9): + test $0xfe00, %edx + jnz LABEL(ashr_9_exittail) + +-# ifdef USE_AS_STRNCMP +- cmp $6, %r11 ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L ++ cmp $7, %r11 + jbe LABEL(ashr_9_exittail) + # endif + +@@ -1326,6 +1488,7 @@ LABEL(ashr_10): + movdqa (%rsi), %xmm1 + pcmpeqb %xmm1, %xmm0 + pslldq $6, %xmm2 ++ TOLOWER (%xmm1, %xmm2) + pcmpeqb %xmm1, %xmm2 + psubb %xmm0, %xmm2 + pmovmskb %xmm2, %r9d +@@ -1366,6 +1529,7 @@ LABEL(gobble_ashr_10): + # else + palignr $10, %xmm3, %xmm2 /* merge into one 16byte value */ + # endif ++ TOLOWER (%xmm1, %xmm2) + + pcmpeqb %xmm1, %xmm0 + pcmpeqb %xmm2, %xmm1 +@@ -1374,7 +1538,7 @@ LABEL(gobble_ashr_10): + sub $0xffff, %edx + jnz LABEL(exit) + +-# ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz) + # endif +@@ -1396,6 +1560,7 @@ LABEL(gobble_ashr_10): + # else + palignr $10, %xmm3, %xmm2 /* merge into one 16byte value */ + # endif ++ TOLOWER (%xmm1, %xmm2) + + pcmpeqb %xmm1, %xmm0 + pcmpeqb %xmm2, %xmm1 +@@ -1404,7 +1569,7 @@ LABEL(gobble_ashr_10): + sub $0xffff, %edx + jnz LABEL(exit) + +-# ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz) + # endif +@@ -1420,8 +1585,8 @@ LABEL(nibble_ashr_10): + test $0xfc00, %edx + jnz LABEL(ashr_10_exittail) + +-# ifdef USE_AS_STRNCMP +- cmp $5, %r11 ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L ++ cmp $6, %r11 + jbe LABEL(ashr_10_exittail) + # endif + +@@ -1448,6 +1613,7 @@ LABEL(ashr_11): + movdqa (%rsi), %xmm1 + pcmpeqb %xmm1, %xmm0 + pslldq $5, %xmm2 ++ TOLOWER (%xmm1, %xmm2) + pcmpeqb %xmm1, %xmm2 + psubb %xmm0, %xmm2 + pmovmskb %xmm2, %r9d +@@ -1488,6 +1654,7 @@ LABEL(gobble_ashr_11): + # else + palignr $11, %xmm3, %xmm2 /* merge into one 16byte value */ + # endif ++ TOLOWER (%xmm1, %xmm2) + + pcmpeqb %xmm1, %xmm0 + pcmpeqb %xmm2, %xmm1 +@@ -1496,7 +1663,7 @@ LABEL(gobble_ashr_11): + sub $0xffff, %edx + jnz LABEL(exit) + +-# ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz) + # endif +@@ -1518,6 +1685,7 @@ LABEL(gobble_ashr_11): + # else + palignr $11, %xmm3, %xmm2 /* merge into one 16byte value */ + # endif ++ TOLOWER (%xmm1, %xmm2) + + pcmpeqb %xmm1, %xmm0 + pcmpeqb %xmm2, %xmm1 +@@ -1526,7 +1694,7 @@ LABEL(gobble_ashr_11): + sub $0xffff, %edx + jnz LABEL(exit) + +-# ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz) + # endif +@@ -1542,8 +1710,8 @@ LABEL(nibble_ashr_11): + test $0xf800, %edx + jnz LABEL(ashr_11_exittail) + +-# ifdef USE_AS_STRNCMP +- cmp $4, %r11 ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L ++ cmp $5, %r11 + jbe LABEL(ashr_11_exittail) + # endif + +@@ -1570,6 +1738,7 @@ LABEL(ashr_12): + movdqa (%rsi), %xmm1 + pcmpeqb %xmm1, %xmm0 + pslldq $4, %xmm2 ++ TOLOWER (%xmm1, %xmm2) + pcmpeqb %xmm1, %xmm2 + psubb %xmm0, %xmm2 + pmovmskb %xmm2, %r9d +@@ -1610,6 +1779,7 @@ LABEL(gobble_ashr_12): + # else + palignr $12, %xmm3, %xmm2 /* merge into one 16byte value */ + # endif ++ TOLOWER (%xmm1, %xmm2) + + pcmpeqb %xmm1, %xmm0 + pcmpeqb %xmm2, %xmm1 +@@ -1618,7 +1788,7 @@ LABEL(gobble_ashr_12): + sub $0xffff, %edx + jnz LABEL(exit) + +-# ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz) + # endif +@@ -1640,6 +1810,7 @@ LABEL(gobble_ashr_12): + # else + palignr $12, %xmm3, %xmm2 /* merge into one 16byte value */ + # endif ++ TOLOWER (%xmm1, %xmm2) + + pcmpeqb %xmm1, %xmm0 + pcmpeqb %xmm2, %xmm1 +@@ -1648,7 +1819,7 @@ LABEL(gobble_ashr_12): + sub $0xffff, %edx + jnz LABEL(exit) + +-# ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz) + # endif +@@ -1664,8 +1835,8 @@ LABEL(nibble_ashr_12): + test $0xf000, %edx + jnz LABEL(ashr_12_exittail) + +-# ifdef USE_AS_STRNCMP +- cmp $3, %r11 ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L ++ cmp $4, %r11 + jbe LABEL(ashr_12_exittail) + # endif + +@@ -1692,6 +1863,7 @@ LABEL(ashr_13): + movdqa (%rsi), %xmm1 + pcmpeqb %xmm1, %xmm0 + pslldq $3, %xmm2 ++ TOLOWER (%xmm1, %xmm2) + pcmpeqb %xmm1, %xmm2 + psubb %xmm0, %xmm2 + pmovmskb %xmm2, %r9d +@@ -1732,6 +1904,7 @@ LABEL(gobble_ashr_13): + # else + palignr $13, %xmm3, %xmm2 /* merge into one 16byte value */ + # endif ++ TOLOWER (%xmm1, %xmm2) + + pcmpeqb %xmm1, %xmm0 + pcmpeqb %xmm2, %xmm1 +@@ -1740,7 +1913,7 @@ LABEL(gobble_ashr_13): + sub $0xffff, %edx + jnz LABEL(exit) + +-# ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz) + # endif +@@ -1762,6 +1935,7 @@ LABEL(gobble_ashr_13): + # else + palignr $13, %xmm3, %xmm2 /* merge into one 16byte value */ + # endif ++ TOLOWER (%xmm1, %xmm2) + + pcmpeqb %xmm1, %xmm0 + pcmpeqb %xmm2, %xmm1 +@@ -1770,7 +1944,7 @@ LABEL(gobble_ashr_13): + sub $0xffff, %edx + jnz LABEL(exit) + +-# ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz) + # endif +@@ -1786,8 +1960,8 @@ LABEL(nibble_ashr_13): + test $0xe000, %edx + jnz LABEL(ashr_13_exittail) + +-# ifdef USE_AS_STRNCMP +- cmp $2, %r11 ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L ++ cmp $3, %r11 + jbe LABEL(ashr_13_exittail) + # endif + +@@ -1814,6 +1988,7 @@ LABEL(ashr_14): + movdqa (%rsi), %xmm1 + pcmpeqb %xmm1, %xmm0 + pslldq $2, %xmm2 ++ TOLOWER (%xmm1, %xmm2) + pcmpeqb %xmm1, %xmm2 + psubb %xmm0, %xmm2 + pmovmskb %xmm2, %r9d +@@ -1854,6 +2029,7 @@ LABEL(gobble_ashr_14): + # else + palignr $14, %xmm3, %xmm2 /* merge into one 16byte value */ + # endif ++ TOLOWER (%xmm1, %xmm2) + + pcmpeqb %xmm1, %xmm0 + pcmpeqb %xmm2, %xmm1 +@@ -1862,7 +2038,7 @@ LABEL(gobble_ashr_14): + sub $0xffff, %edx + jnz LABEL(exit) + +-# ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz) + # endif +@@ -1884,6 +2060,7 @@ LABEL(gobble_ashr_14): + # else + palignr $14, %xmm3, %xmm2 /* merge into one 16byte value */ + # endif ++ TOLOWER (%xmm1, %xmm2) + + pcmpeqb %xmm1, %xmm0 + pcmpeqb %xmm2, %xmm1 +@@ -1892,7 +2069,7 @@ LABEL(gobble_ashr_14): + sub $0xffff, %edx + jnz LABEL(exit) + +-# ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP | defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz) + # endif +@@ -1908,8 +2085,8 @@ LABEL(nibble_ashr_14): + test $0xc000, %edx + jnz LABEL(ashr_14_exittail) + +-# ifdef USE_AS_STRNCMP +- cmp $1, %r11 ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L ++ cmp $2, %r11 + jbe LABEL(ashr_14_exittail) + # endif + +@@ -1936,6 +2113,7 @@ LABEL(ashr_15): + movdqa (%rsi), %xmm1 + pcmpeqb %xmm1, %xmm0 + pslldq $1, %xmm2 ++ TOLOWER (%xmm1, %xmm2) + pcmpeqb %xmm1, %xmm2 + psubb %xmm0, %xmm2 + pmovmskb %xmm2, %r9d +@@ -1978,6 +2156,7 @@ LABEL(gobble_ashr_15): + # else + palignr $15, %xmm3, %xmm2 /* merge into one 16byte value */ + # endif ++ TOLOWER (%xmm1, %xmm2) + + pcmpeqb %xmm1, %xmm0 + pcmpeqb %xmm2, %xmm1 +@@ -1986,7 +2165,7 @@ LABEL(gobble_ashr_15): + sub $0xffff, %edx + jnz LABEL(exit) + +-# ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz) + # endif +@@ -2008,6 +2187,7 @@ LABEL(gobble_ashr_15): + # else + palignr $15, %xmm3, %xmm2 /* merge into one 16byte value */ + # endif ++ TOLOWER (%xmm1, %xmm2) + + pcmpeqb %xmm1, %xmm0 + pcmpeqb %xmm2, %xmm1 +@@ -2016,7 +2196,7 @@ LABEL(gobble_ashr_15): + sub $0xffff, %edx + jnz LABEL(exit) + +-# ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub $16, %r11 + jbe LABEL(strcmp_exitz) + # endif +@@ -2032,9 +2212,9 @@ LABEL(nibble_ashr_15): + test $0x8000, %edx + jnz LABEL(ashr_15_exittail) + +-# ifdef USE_AS_STRNCMP +- test %r11, %r11 +- je LABEL(ashr_15_exittail) ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L ++ cmpq $1, %r11 ++ jbe LABEL(ashr_15_exittail) + # endif + + pxor %xmm0, %xmm0 +@@ -2049,6 +2229,7 @@ LABEL(ashr_15_exittail): + + .p2align 4 + LABEL(aftertail): ++ TOLOWER (%xmm1, %xmm3) + pcmpeqb %xmm3, %xmm1 + psubb %xmm0, %xmm1 + pmovmskb %xmm1, %edx +@@ -2069,13 +2250,19 @@ LABEL(ret): + LABEL(less16bytes): + bsf %rdx, %rdx /* find and store bit index in %rdx */ + +-# ifdef USE_AS_STRNCMP ++# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L + sub %rdx, %r11 + jbe LABEL(strcmp_exitz) + # endif + movzbl (%rsi, %rdx), %ecx + movzbl (%rdi, %rdx), %eax + ++# if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L ++ leaq _nl_C_LC_CTYPE_tolower+128*4(%rip), %rdx ++ movl (%rdx,%rcx,4), %ecx ++ movl (%rdx,%rax,4), %eax ++# endif ++ + sub %ecx, %eax + ret + +@@ -2088,6 +2275,12 @@ LABEL(Byte0): + movzx (%rsi), %ecx + movzx (%rdi), %eax + ++# if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L ++ leaq _nl_C_LC_CTYPE_tolower+128*4(%rip), %rdx ++ movl (%rdx,%rcx,4), %ecx ++ movl (%rdx,%rax,4), %eax ++# endif ++ + sub %ecx, %eax + ret + END (BP_SYM (STRCMP)) +Index: glibc-2.12-2-gc4ccff1/sysdeps/x86_64/strncase.S +=================================================================== +--- /dev/null ++++ glibc-2.12-2-gc4ccff1/sysdeps/x86_64/strncase.S +@@ -0,0 +1 @@ ++/* In strncase_l.S. */ +Index: glibc-2.12-2-gc4ccff1/sysdeps/x86_64/strncase_l-nonascii.c +=================================================================== +--- /dev/null ++++ glibc-2.12-2-gc4ccff1/sysdeps/x86_64/strncase_l-nonascii.c +@@ -0,0 +1,8 @@ ++#include ++ ++extern int __strncasecmp_l_nonascii (__const char *__s1, __const char *__s2, ++ size_t __n, __locale_t __loc); ++ ++#define __strncasecmp_l __strncasecmp_l_nonascii ++#define USE_IN_EXTENDED_LOCALE_MODEL 1 ++#include +Index: glibc-2.12-2-gc4ccff1/sysdeps/x86_64/strncase_l.S +=================================================================== +--- /dev/null ++++ glibc-2.12-2-gc4ccff1/sysdeps/x86_64/strncase_l.S +@@ -0,0 +1,6 @@ ++#define STRCMP __strncasecmp_l ++#define USE_AS_STRNCASECMP_L ++#include "strcmp.S" ++ ++weak_alias (__strncasecmp_l, strncasecmp_l) ++libc_hidden_def (strncasecmp_l) +Index: glibc-2.12-2-gc4ccff1/sysdeps/x86_64/strnlen.S +=================================================================== +--- /dev/null ++++ glibc-2.12-2-gc4ccff1/sysdeps/x86_64/strnlen.S +@@ -0,0 +1,64 @@ ++/* strnlen(str,maxlen) -- determine the length of the string STR up to MAXLEN. ++ Copyright (C) 2010 Free Software Foundation, Inc. ++ Contributed by Ulrich Drepper . ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, write to the Free ++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++ 02111-1307 USA. */ ++ ++#include ++ ++ ++ .text ++ENTRY(__strnlen) ++ movq %rsi, %rax ++ testq %rsi, %rsi ++ jz 3f ++ pxor %xmm2, %xmm2 ++ movq %rdi, %rcx ++ movq %rdi, %r8 ++ movq $16, %r9 ++ andq $~15, %rdi ++ movdqa %xmm2, %xmm1 ++ pcmpeqb (%rdi), %xmm2 ++ orl $0xffffffff, %r10d ++ subq %rdi, %rcx ++ shll %cl, %r10d ++ subq %rcx, %r9 ++ pmovmskb %xmm2, %edx ++ andl %r10d, %edx ++ jnz 1f ++ subq %r9, %rsi ++ jbe 3f ++ ++2: movdqa 16(%rdi), %xmm0 ++ leaq 16(%rdi), %rdi ++ pcmpeqb %xmm1, %xmm0 ++ pmovmskb %xmm0, %edx ++ testl %edx, %edx ++ jnz 1f ++ subq $16, %rsi ++ jnbe 2b ++3: ret ++ ++1: subq %r8, %rdi ++ bsfl %edx, %edx ++ addq %rdi, %rdx ++ cmpq %rdx, %rax ++ cmovnbq %rdx, %rax ++ ret ++END(__strnlen) ++weak_alias (__strnlen, strnlen) ++libc_hidden_def (strnlen) +Index: glibc-2.12-2-gc4ccff1/wcsmbs/wcsatcliff.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/wcsmbs/wcsatcliff.c ++++ glibc-2.12-2-gc4ccff1/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" diff --git a/SOURCES/glibc-rh607010.patch b/SOURCES/glibc-rh607010.patch new file mode 100644 index 0000000..6952dad --- /dev/null +++ b/SOURCES/glibc-rh607010.patch @@ -0,0 +1,26 @@ +2010-09-07 H.J. Lu + + * sysdeps/x86_64/cacheinfo.c (init_cacheinfo): Round cache sizes + up to multiple of 256 bytes. + +Index: glibc-2.12-2-gc4ccff1/sysdeps/x86_64/cacheinfo.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/sysdeps/x86_64/cacheinfo.c ++++ glibc-2.12-2-gc4ccff1/sysdeps/x86_64/cacheinfo.c +@@ -661,12 +661,16 @@ init_cacheinfo (void) + + if (data > 0) + { ++ /* Round data cache size up to multiple of 256 bytes. */ ++ data = (data + 255) & ~255L; + __x86_64_data_cache_size_half = data / 2; + __x86_64_data_cache_size = data; + } + + if (shared > 0) + { ++ /* Round shared cache size up to multiple of 256 bytes. */ ++ shared = (shared + 255) & ~255L; + __x86_64_shared_cache_size_half = shared / 2; + __x86_64_shared_cache_size = shared; + } diff --git a/SOURCES/glibc-rh607461.patch b/SOURCES/glibc-rh607461.patch new file mode 100644 index 0000000..79fc72c --- /dev/null +++ b/SOURCES/glibc-rh607461.patch @@ -0,0 +1,22 @@ +Index: glibc-2.12-2-gc4ccff1/nptl/allocatestack.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/nptl/allocatestack.c ++++ glibc-2.12-2-gc4ccff1/nptl/allocatestack.c +@@ -994,7 +994,16 @@ setxid_mark_thread (struct xid_command * + + /* If the thread is exiting right now, ignore it. */ + if ((ch & EXITING_BITMASK) != 0) +- return; ++ { ++ /* Release the futex if there is no other setxid in ++ progress. */ ++ if ((ch & SETXID_BITMASK) == 0) ++ { ++ t->setxid_futex = 1; ++ lll_futex_wake (&t->setxid_futex, 1, LLL_PRIVATE); ++ } ++ return; ++ } + } + while (atomic_compare_and_exchange_bool_acq (&t->cancelhandling, + ch | SETXID_BITMASK, ch)); diff --git a/SOURCES/glibc-rh615090.patch b/SOURCES/glibc-rh615090.patch new file mode 100644 index 0000000..e6c00f0 --- /dev/null +++ b/SOURCES/glibc-rh615090.patch @@ -0,0 +1,21 @@ +2010-07-27 Andreas Schwab + + * manual/memory.texi (Malloc Tunable Parameters): Document + M_PERTURB. + +Index: glibc-2.12-2-gc4ccff1/manual/memory.texi +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/manual/memory.texi ++++ glibc-2.12-2-gc4ccff1/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/SOURCES/glibc-rh615701.patch b/SOURCES/glibc-rh615701.patch new file mode 100644 index 0000000..283e3fe --- /dev/null +++ b/SOURCES/glibc-rh615701.patch @@ -0,0 +1,23 @@ +2010-07-20 Roland McGrath + + * 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. + +Index: glibc-2.12-2-gc4ccff1/elf/dl-sysdep.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/elf/dl-sysdep.c ++++ glibc-2.12-2-gc4ccff1/elf/dl-sysdep.c +@@ -425,6 +425,11 @@ _dl_important_hwcaps (const char *platfo + { + 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/SOURCES/glibc-rh621959.patch b/SOURCES/glibc-rh621959.patch new file mode 100644 index 0000000..315521f --- /dev/null +++ b/SOURCES/glibc-rh621959.patch @@ -0,0 +1,120 @@ +2010-08-06 Ulrich Drepper + + * sysdeps/unix/sysv/linux/getlogin_r.c (__getlogin_r_loginuid): + Also fail if tpwd after pwuid call is NULL. + +2010-06-21 Andreas Schwab + + * sysdeps/unix/sysv/linux/getlogin_r.c (__getlogin_r_loginuid): + Restore proper fallback handling. + +2010-06-19 Ulrich Drepper + + * sysdeps/unix/sysv/linux/getlogin_r.c (__getlogin_r_loginuid): Handle + OOM in getpwuid_r correctly. Return error number when the caller + should return, otherwise -1. + (getlogin_r): Adjust to return also for result of __getlogin_r_loginuid + call returning > 0 value. + * sysdeps/unix/sysv/linux/getlogin.c (getlogin): Likewise. + +Index: glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/getlogin.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/sysdeps/unix/sysv/linux/getlogin.c ++++ glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/getlogin.c +@@ -32,8 +32,9 @@ + char * + getlogin (void) + { +- if (__getlogin_r_loginuid (name, sizeof (name)) == 0) +- return name; ++ int res = __getlogin_r_loginuid (name, sizeof (name)); ++ if (res >= 0) ++ return res == 0 ? name : NULL; + + return getlogin_fd0 (); + } +Index: glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/getlogin_r.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/sysdeps/unix/sysv/linux/getlogin_r.c ++++ glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/getlogin_r.c +@@ -27,6 +27,10 @@ static int getlogin_r_fd0 (char *name, s + #undef getlogin_r + + ++/* Try to determine login name from /proc/self/loginuid and return 0 ++ if successful. If /proc/self/loginuid cannot be read return -1. ++ Otherwise return the error number. */ ++ + int + attribute_hidden + __getlogin_r_loginuid (name, namesize) +@@ -35,7 +39,7 @@ __getlogin_r_loginuid (name, namesize) + { + int fd = open_not_cancel_2 ("/proc/self/loginuid", O_RDONLY); + if (fd == -1) +- return 1; ++ return -1; + + /* We are reading a 32-bit number. 12 bytes are enough for the text + representation. If not, something is wrong. */ +@@ -51,37 +55,38 @@ __getlogin_r_loginuid (name, namesize) + || (uidbuf[n] = '\0', + uid = strtoul (uidbuf, &endp, 10), + endp == uidbuf || *endp != '\0')) +- return 1; ++ return -1; + + size_t buflen = 1024; + char *buf = alloca (buflen); + bool use_malloc = false; + struct passwd pwd; + struct passwd *tpwd; ++ int result = 0; + int res; + +- while ((res = __getpwuid_r (uid, &pwd, buf, buflen, &tpwd)) != 0) ++ while ((res = __getpwuid_r (uid, &pwd, buf, buflen, &tpwd)) == ERANGE) + if (__libc_use_alloca (2 * buflen)) +- extend_alloca (buf, buflen, 2 * buflen); ++ buf = extend_alloca (buf, buflen, 2 * buflen); + else + { + buflen *= 2; + char *newp = realloc (use_malloc ? buf : NULL, buflen); + if (newp == NULL) + { +- fail: +- if (use_malloc) +- free (buf); +- return 1; ++ result = ENOMEM; ++ goto out; + } + buf = newp; + use_malloc = true; + } + +- if (tpwd == NULL) +- goto fail; ++ if (res != 0 || tpwd == NULL) ++ { ++ result = -1; ++ goto out; ++ } + +- int result = 0; + size_t needed = strlen (pwd.pw_name) + 1; + if (needed > namesize) + { +@@ -109,8 +114,9 @@ getlogin_r (name, namesize) + char *name; + size_t namesize; + { +- if (__getlogin_r_loginuid (name, namesize) == 0) +- return 0; ++ int res = __getlogin_r_loginuid (name, namesize); ++ if (res >= 0) ++ return res; + + return getlogin_r_fd0 (name, namesize); + } diff --git a/SOURCES/glibc-rh623187.patch b/SOURCES/glibc-rh623187.patch new file mode 100644 index 0000000..596fdd6 --- /dev/null +++ b/SOURCES/glibc-rh623187.patch @@ -0,0 +1,18 @@ +2010-08-10 Dinakar Guniguntala + Stefan Hajnoczi + + * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_signal.S: If + FUTEX_WAKE_OP fails make sure to call FUTEX_WAKE instead. + +Index: glibc-2.12-2-gc4ccff1/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_signal.S +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_signal.S ++++ glibc-2.12-2-gc4ccff1/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_signal.S +@@ -163,7 +163,6 @@ __pthread_cond_signal: + #endif + orl $FUTEX_WAKE, %ecx + +- xorl $(FUTEX_WAKE ^ FUTEX_WAKE_OP), %ecx + movl $SYS_futex, %eax + /* %edx should be 1 already from $FUTEX_WAKE_OP syscall. + movl $1, %edx */ diff --git a/SOURCES/glibc-rh625893.patch b/SOURCES/glibc-rh625893.patch new file mode 100644 index 0000000..5337a42 --- /dev/null +++ b/SOURCES/glibc-rh625893.patch @@ -0,0 +1,79 @@ +2010-08-12 Andreas Schwab + + [BZ #11904] + * locale/programs/locale.c (print_assignment): New function. + (show_locale_vars): Use it. + +Index: glibc-2.12-2-gc4ccff1/locale/programs/locale.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/locale/programs/locale.c ++++ glibc-2.12-2-gc4ccff1/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/SOURCES/glibc-rh630801.patch b/SOURCES/glibc-rh630801.patch new file mode 100644 index 0000000..5bd3c66 --- /dev/null +++ b/SOURCES/glibc-rh630801.patch @@ -0,0 +1,29 @@ +2010-05-26 H.J. Lu + + [BZ #11640] + * sysdeps/x86_64/multiarch/init-arch.c (__init_cpu_features): + Properly check family and model. + +Index: glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/init-arch.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/sysdeps/x86_64/multiarch/init-arch.c ++++ glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/init-arch.c +@@ -62,15 +62,15 @@ __init_cpu_features (void) + unsigned int eax = __cpu_features.cpuid[COMMON_CPUID_INDEX_1].eax; + unsigned int extended_family = (eax >> 20) & 0xff; + unsigned int extended_model = (eax >> 12) & 0xf0; +- if (__cpu_features.family == 0x0f) ++ if (family == 0x0f) + { + family += extended_family; + model += extended_model; + } +- else if (__cpu_features.family == 0x06) ++ else if (family == 0x06) + { + model += extended_model; +- switch (__cpu_features.model) ++ switch (model) + { + case 0x1a: + case 0x1e: diff --git a/SOURCES/glibc-rh631011.patch b/SOURCES/glibc-rh631011.patch new file mode 100644 index 0000000..42a1a56 --- /dev/null +++ b/SOURCES/glibc-rh631011.patch @@ -0,0 +1,17 @@ +2010-08-19 Andreas Schwab + + * sysdeps/i386/i686/multiarch/strspn.S [!SHARED]: Fix SSE4.2 check. + +Index: glibc-2.12-2-gc4ccff1/sysdeps/i386/i686/multiarch/strspn.S +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/sysdeps/i386/i686/multiarch/strspn.S ++++ glibc-2.12-2-gc4ccff1/sysdeps/i386/i686/multiarch/strspn.S +@@ -65,7 +65,7 @@ ENTRY(strspn) + jne 1f + call __init_cpu_features + 1: leal __strspn_ia32, %eax +- testl $index_SSE2, CPUID_OFFSET+index_SSE4_2+__cpu_features ++ testl $bit_SSE4_2, CPUID_OFFSET+index_SSE4_2+__cpu_features + jz 2f + leal __strspn_sse42, %eax + 2: ret diff --git a/SOURCES/glibc-rh641128.patch b/SOURCES/glibc-rh641128.patch new file mode 100644 index 0000000..52df4ae --- /dev/null +++ b/SOURCES/glibc-rh641128.patch @@ -0,0 +1,78 @@ +2010-10-06 Ulrich Drepper + + * string/bug-strstr1.c: New file. + * string/Makefile: Add rules to build and run bug-strstr1. + +2010-10-05 Eric Blake + + [BZ #12092] + * string/str-two-way.h (two_way_long_needle): Always clear memory + when skipping input due to the shift table. + +Index: glibc-2.12-2-gc4ccff1/string/Makefile +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/string/Makefile ++++ glibc-2.12-2-gc4ccff1/string/Makefile +@@ -54,7 +54,8 @@ tests := tester inl-tester noinl-tester + 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 +Index: glibc-2.12-2-gc4ccff1/string/bug-strstr1.c +=================================================================== +--- /dev/null ++++ glibc-2.12-2-gc4ccff1/string/bug-strstr1.c +@@ -0,0 +1,26 @@ ++#include ++#include ++ ++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; ++} +Index: glibc-2.12-2-gc4ccff1/string/str-two-way.h +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/string/str-two-way.h ++++ glibc-2.12-2-gc4ccff1/string/str-two-way.h +@@ -350,8 +350,8 @@ two_way_long_needle (const unsigned char + 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/SOURCES/glibc-rh642584.patch b/SOURCES/glibc-rh642584.patch new file mode 100644 index 0000000..7fd390d --- /dev/null +++ b/SOURCES/glibc-rh642584.patch @@ -0,0 +1,41 @@ +2010-10-13 H.J. Lu + + [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". + +Index: glibc-2.12-2-gc4ccff1/nptl/sysdeps/x86_64/pthreaddef.h +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/nptl/sysdeps/x86_64/pthreaddef.h ++++ glibc-2.12-2-gc4ccff1/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. */ +Index: glibc-2.12-2-gc4ccff1/nptl/sysdeps/x86_64/tls.h +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/nptl/sysdeps/x86_64/tls.h ++++ glibc-2.12-2-gc4ccff1/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/SOURCES/glibc-rh643822.patch b/SOURCES/glibc-rh643822.patch new file mode 100644 index 0000000..c32c1fe --- /dev/null +++ b/SOURCES/glibc-rh643822.patch @@ -0,0 +1,64 @@ +2010-12-09 Andreas Schwab + + * elf/dl-object.c (_dl_new_object): Ignore origin of privileged + program. + +2010-10-18 Andreas Schwab + + * elf/dl-open.c (dl_open_worker): Don't expand DST here, let + _dl_map_object do it. + +Index: glibc-2.12-2-gc4ccff1/elf/dl-object.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/elf/dl-object.c ++++ glibc-2.12-2-gc4ccff1/elf/dl-object.c +@@ -214,6 +214,9 @@ _dl_new_object (char *realname, const ch + out: + new->l_origin = origin; + } ++ else if (INTUSE(__libc_enable_secure) && type == lt_executable) ++ /* The origin of a privileged program cannot be trusted. */ ++ new->l_origin = (char *) -1; + + return new; + } +Index: glibc-2.12-2-gc4ccff1/elf/dl-open.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/elf/dl-open.c ++++ glibc-2.12-2-gc4ccff1/elf/dl-open.c +@@ -221,35 +221,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, 0, lt_loaded, 0, diff --git a/SOURCES/glibc-rh645672.patch b/SOURCES/glibc-rh645672.patch new file mode 100644 index 0000000..644614e --- /dev/null +++ b/SOURCES/glibc-rh645672.patch @@ -0,0 +1,215 @@ +2010-10-22 Andreas Schwab + + * 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. + * 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. + * elf/rtld.c (struct map_args): Remove is_preloaded. + (map_doit): Don't use it. + (dl_main): Likewise. + (do_preload): Use __RTLD_SECURE instead of is_preloaded. + (dlmopen_doit): Add __RTLD_SECURE to mode bits. + +Index: glibc-2.12-2-gc4ccff1/elf/dl-deps.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/elf/dl-deps.c ++++ glibc-2.12-2-gc4ccff1/elf/dl-deps.c +@@ -62,7 +62,7 @@ openaux (void *a) + { + struct openaux_args *args = (struct openaux_args *) a; + +- args->aux = _dl_map_object (args->map, args->name, 0, ++ args->aux = _dl_map_object (args->map, args->name, + (args->map->l_type == lt_executable + ? lt_library : args->map->l_type), + args->trace_mode, args->open_mode, +Index: glibc-2.12-2-gc4ccff1/elf/dl-load.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/elf/dl-load.c ++++ glibc-2.12-2-gc4ccff1/elf/dl-load.c +@@ -1811,7 +1811,7 @@ open_verify (const char *name, struct fi + if MAY_FREE_DIRS is true. */ + + static int +-open_path (const char *name, size_t namelen, int preloaded, ++open_path (const char *name, size_t namelen, int secure, + struct r_search_path_struct *sps, char **realname, + struct filebuf *fbp, struct link_map *loader, int whatcode, + bool *found_other_class) +@@ -1893,7 +1893,7 @@ open_path (const char *name, size_t name + /* Remember whether we found any existing directory. */ + here_any |= this_dir->status[cnt] != nonexisting; + +- if (fd != -1 && __builtin_expect (preloaded, 0) ++ if (fd != -1 && __builtin_expect (secure, 0) + && INTUSE(__libc_enable_secure)) + { + /* This is an extra security effort to make sure nobody can +@@ -1962,7 +1962,7 @@ open_path (const char *name, size_t name + + struct link_map * + internal_function +-_dl_map_object (struct link_map *loader, const char *name, int preloaded, ++_dl_map_object (struct link_map *loader, const char *name, + int type, int trace_mode, int mode, Lmid_t nsid) + { + int fd; +@@ -2066,7 +2066,8 @@ _dl_map_object (struct link_map *loader, + for (l = loader; l; l = l->l_loader) + if (cache_rpath (l, &l->l_rpath_dirs, DT_RPATH, "RPATH")) + { +- fd = open_path (name, namelen, preloaded, &l->l_rpath_dirs, ++ fd = open_path (name, namelen, mode & __RTLD_SECURE, ++ &l->l_rpath_dirs, + &realname, &fb, loader, LA_SER_RUNPATH, + &found_other_class); + if (fd != -1) +@@ -2081,14 +2082,15 @@ _dl_map_object (struct link_map *loader, + && main_map != NULL && main_map->l_type != lt_loaded + && cache_rpath (main_map, &main_map->l_rpath_dirs, DT_RPATH, + "RPATH")) +- fd = open_path (name, namelen, preloaded, &main_map->l_rpath_dirs, ++ fd = open_path (name, namelen, mode & __RTLD_SECURE, ++ &main_map->l_rpath_dirs, + &realname, &fb, loader ?: main_map, LA_SER_RUNPATH, + &found_other_class); + } + + /* Try the LD_LIBRARY_PATH environment variable. */ + if (fd == -1 && env_path_list.dirs != (void *) -1) +- fd = open_path (name, namelen, preloaded, &env_path_list, ++ fd = open_path (name, namelen, mode & __RTLD_SECURE, &env_path_list, + &realname, &fb, + loader ?: GL(dl_ns)[LM_ID_BASE]._ns_loaded, + LA_SER_LIBPATH, &found_other_class); +@@ -2097,12 +2099,12 @@ _dl_map_object (struct link_map *loader, + if (fd == -1 && loader != NULL + && cache_rpath (loader, &loader->l_runpath_dirs, + DT_RUNPATH, "RUNPATH")) +- fd = open_path (name, namelen, preloaded, ++ fd = open_path (name, namelen, mode & __RTLD_SECURE, + &loader->l_runpath_dirs, &realname, &fb, loader, + LA_SER_RUNPATH, &found_other_class); + + if (fd == -1 +- && (__builtin_expect (! preloaded, 1) ++ && (__builtin_expect (! (mode & __RTLD_SECURE), 1) + || ! INTUSE(__libc_enable_secure))) + { + /* Check the list of libraries in the file /etc/ld.so.cache, +@@ -2168,7 +2170,7 @@ _dl_map_object (struct link_map *loader, + && ((l = loader ?: GL(dl_ns)[nsid]._ns_loaded) == NULL + || __builtin_expect (!(l->l_flags_1 & DF_1_NODEFLIB), 1)) + && rtld_search_dirs.dirs != (void *) -1) +- fd = open_path (name, namelen, preloaded, &rtld_search_dirs, ++ fd = open_path (name, namelen, mode & __RTLD_SECURE, &rtld_search_dirs, + &realname, &fb, l, LA_SER_DEFAULT, &found_other_class); + + /* Add another newline when we are tracing the library loading. */ +Index: glibc-2.12-2-gc4ccff1/elf/dl-open.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/elf/dl-open.c ++++ glibc-2.12-2-gc4ccff1/elf/dl-open.c +@@ -252,7 +252,7 @@ dl_open_worker (void *a) + + /* Load the named object. */ + struct link_map *new; +- args->map = new = _dl_map_object (call_map, file, 0, lt_loaded, 0, ++ args->map = new = _dl_map_object (call_map, file, lt_loaded, 0, + mode | __RTLD_CALLMAP, args->nsid); + + /* If the pointer returned is NULL this means the RTLD_NOLOAD flag is +Index: glibc-2.12-2-gc4ccff1/elf/rtld.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/elf/rtld.c ++++ glibc-2.12-2-gc4ccff1/elf/rtld.c +@@ -589,7 +589,6 @@ struct map_args + /* Argument to map_doit. */ + char *str; + struct link_map *loader; +- int is_preloaded; + int mode; + /* Return value of map_doit. */ + struct link_map *map; +@@ -627,16 +626,17 @@ static void + map_doit (void *a) + { + struct map_args *args = (struct map_args *) a; +- args->map = _dl_map_object (args->loader, args->str, +- args->is_preloaded, lt_library, 0, args->mode, +- LM_ID_BASE); ++ args->map = _dl_map_object (args->loader, args->str, lt_library, 0, ++ args->mode, LM_ID_BASE); + } + + static void + dlmopen_doit (void *a) + { + struct dlmopen_args *args = (struct dlmopen_args *) a; +- args->map = _dl_open (args->fname, RTLD_LAZY | __RTLD_DLOPEN | __RTLD_AUDIT, ++ args->map = _dl_open (args->fname, ++ (RTLD_LAZY | __RTLD_DLOPEN | __RTLD_AUDIT ++ | __RTLD_SECURE), + dl_main, LM_ID_NEWLM, _dl_argc, INTUSE(_dl_argv), + __environ); + } +@@ -806,8 +806,7 @@ do_preload (char *fname, struct link_map + + args.str = fname; + args.loader = main_map; +- args.is_preloaded = 1; +- args.mode = 0; ++ args.mode = __RTLD_SECURE; + + unsigned int old_nloaded = GL(dl_ns)[LM_ID_BASE]._ns_nloaded; + +@@ -1054,7 +1053,6 @@ of this helper program; chances are you + + args.str = rtld_progname; + args.loader = NULL; +- args.is_preloaded = 0; + args.mode = __RTLD_OPENEXEC; + (void) _dl_catch_error (&objname, &err_str, &malloced, map_doit, + &args); +@@ -1066,7 +1064,7 @@ of this helper program; chances are you + else + { + HP_TIMING_NOW (start); +- _dl_map_object (NULL, rtld_progname, 0, lt_library, 0, ++ _dl_map_object (NULL, rtld_progname, lt_library, 0, + __RTLD_OPENEXEC, LM_ID_BASE); + HP_TIMING_NOW (stop); + +Index: glibc-2.12-2-gc4ccff1/include/dlfcn.h +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/include/dlfcn.h ++++ glibc-2.12-2-gc4ccff1/include/dlfcn.h +@@ -9,6 +9,7 @@ + #define __RTLD_OPENEXEC 0x20000000 + #define __RTLD_CALLMAP 0x10000000 + #define __RTLD_AUDIT 0x08000000 ++#define __RTLD_SECURE 0x04000000 /* Apply additional security checks. */ + + #define __LM_ID_CALLER -2 + +Index: glibc-2.12-2-gc4ccff1/sysdeps/generic/ldsodefs.h +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/sysdeps/generic/ldsodefs.h ++++ glibc-2.12-2-gc4ccff1/sysdeps/generic/ldsodefs.h +@@ -824,11 +824,9 @@ extern void _dl_receive_error (receiver_ + + /* Open the shared object NAME and map in its segments. + LOADER's DT_RPATH is used in searching for NAME. +- If the object is already opened, returns its existing map. +- For preloaded shared objects PRELOADED is set to a non-zero +- value to allow additional security checks. */ ++ If the object is already opened, returns its existing map. */ + extern struct link_map *_dl_map_object (struct link_map *loader, +- const char *name, int preloaded, ++ const char *name, + int type, int trace_mode, int mode, + Lmid_t nsid) + internal_function attribute_hidden; diff --git a/SOURCES/glibc-rh646954.patch b/SOURCES/glibc-rh646954.patch new file mode 100644 index 0000000..bbb959e --- /dev/null +++ b/SOURCES/glibc-rh646954.patch @@ -0,0 +1,216 @@ +2010-10-26 Ulrich Drepper + + * elf/rtld.c (dl_main): Move assertion after the point where rtld map + is added to the list. + +2010-10-20 Andreas Krebbel + Ulrich Drepper + + * 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. + +Index: glibc-2.12-2-gc4ccff1/elf/dl-load.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/elf/dl-load.c ++++ glibc-2.12-2-gc4ccff1/elf/dl-load.c +@@ -797,22 +797,7 @@ lose (int code, int fd, const char *name + /* The file might already be closed. */ + if (fd != -1) + (void) __close (fd); +- if (l != NULL) +- { +- /* We modify the list of loaded objects. */ +- __rtld_lock_lock_recursive (GL(dl_load_write_lock)); +- /* 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); +- __rtld_lock_unlock_recursive (GL(dl_load_write_lock)); +- } ++ free (l); + free (realname); + + if (r != NULL) +@@ -897,6 +882,9 @@ _dl_map_object_from_fd (const char *name + 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 +@@ -1491,6 +1479,9 @@ cannot enable executable stack as shared + 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) +@@ -2215,7 +2206,7 @@ _dl_map_object (struct link_map *loader, + 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) +@@ -2233,6 +2224,9 @@ _dl_map_object (struct link_map *loader, + 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) +Index: glibc-2.12-2-gc4ccff1/elf/dl-object.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/elf/dl-object.c ++++ glibc-2.12-2-gc4ccff1/elf/dl-object.c +@@ -26,16 +26,41 @@ + #include + + ++/* 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) ++{ ++ /* We modify the list of loaded objects. */ ++ __rtld_lock_lock_recursive (GL(dl_load_write_lock)); ++ ++ 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); ++ ++ __rtld_lock_unlock_recursive (GL(dl_load_write_lock)); ++} ++ ++ + /* 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; +@@ -93,31 +118,12 @@ _dl_new_object (char *realname, const ch + new->l_scope = new->l_scope_mem; + new->l_scope_max = sizeof (new->l_scope_mem) / sizeof (new->l_scope_mem[0]); + +- /* We modify the list of loaded objects. */ +- __rtld_lock_lock_recursive (GL(dl_load_write_lock)); +- + /* 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); +- +- __rtld_lock_unlock_recursive (GL(dl_load_write_lock)); ++ /* 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) +Index: glibc-2.12-2-gc4ccff1/elf/rtld.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/elf/rtld.c ++++ glibc-2.12-2-gc4ccff1/elf/rtld.c +@@ -1108,11 +1108,15 @@ of this helper program; chances are you + 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 +@@ -1380,6 +1384,9 @@ of this helper program; chances are you + 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); +Index: glibc-2.12-2-gc4ccff1/sysdeps/generic/ldsodefs.h +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/sysdeps/generic/ldsodefs.h ++++ glibc-2.12-2-gc4ccff1/sysdeps/generic/ldsodefs.h +@@ -891,8 +891,11 @@ extern lookup_t _dl_lookup_symbol_x (con + 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/SOURCES/glibc-rh647448.patch b/SOURCES/glibc-rh647448.patch new file mode 100644 index 0000000..ff55945 --- /dev/null +++ b/SOURCES/glibc-rh647448.patch @@ -0,0 +1,58 @@ +2010-10-25 Ulrich Drepper + + [BZ #12159] + * sysdeps/x86_64/multiarch/strchr.S: Fix propagation of search byte + into all bytes of SSE register. + Patch by Richard Li . + +Index: glibc-2.12-2-gc4ccff1/string/Makefile +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/string/Makefile ++++ glibc-2.12-2-gc4ccff1/string/Makefile +@@ -55,7 +55,7 @@ tests := tester inl-tester noinl-tester + tst-strtok tst-strxfrm bug-strcoll1 tst-strfry \ + bug-strtok1 $(addprefix test-,$(strop-tests)) \ + bug-envz1 tst-strxfrm2 tst-endian tst-svc2 \ +- bug-strstr1 ++ bug-strstr1 bug-strchr1 + distribute := memcopy.h pagecopy.h tst-svc.expect test-string.h \ + str-two-way.h + +Index: glibc-2.12-2-gc4ccff1/string/bug-strchr1.c +=================================================================== +--- /dev/null ++++ glibc-2.12-2-gc4ccff1/string/bug-strchr1.c +@@ -0,0 +1,14 @@ ++#include ++#include ++ ++static int ++do_test (void) ++{ ++ char s[] __attribute__((aligned(16))) = "\xff"; ++ char *p = strchr (s, '\xfe'); ++ printf ("%p\n", p); ++ return p != NULL; ++} ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +Index: glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/strchr.S +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/sysdeps/x86_64/multiarch/strchr.S ++++ glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/strchr.S +@@ -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/SOURCES/glibc-rh652661.patch b/SOURCES/glibc-rh652661.patch new file mode 100644 index 0000000..79a3212 --- /dev/null +++ b/SOURCES/glibc-rh652661.patch @@ -0,0 +1,21 @@ +2010-05-20 Andreas Schwab + + * sysdeps/unix/sysv/linux/sys/timex.h: Use __REDIRECT_NTH. + +Index: glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/sys/timex.h +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/sysdeps/unix/sysv/linux/sys/timex.h ++++ glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/sys/timex.h +@@ -140,9 +140,9 @@ __BEGIN_DECLS + extern int __adjtimex (struct timex *__ntx) __THROW; + extern int adjtimex (struct timex *__ntx) __THROW; + +-#if defined __GNUC__ && __GNUC__ >= 2 +-extern int ntp_gettime (struct ntptimeval *__ntv) +- __asm__ ("ntp_gettimex") __THROW; ++#ifdef __REDIRECT_NTH ++extern int __REDIRECT_NTH (ntp_gettime, (struct ntptimeval *__ntv), ++ ntp_gettimex); + #else + extern int ntp_gettimex (struct ntptimeval *__ntv) __THROW; + # define ntp_gettime ntp_gettimex diff --git a/SOURCES/glibc-rh656014.patch b/SOURCES/glibc-rh656014.patch new file mode 100644 index 0000000..5ef68dc --- /dev/null +++ b/SOURCES/glibc-rh656014.patch @@ -0,0 +1,45 @@ +2010-11-24 Andreas Schwab + + * resolv/nss_dns/dns-host.c (getanswer_r): Don't handle ttl == 0 + specially. + (gaih_getanswer_slice): Likewise. + +Index: glibc-2.12-2-gc4ccff1/resolv/nss_dns/dns-host.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/resolv/nss_dns/dns-host.c ++++ glibc-2.12-2-gc4ccff1/resolv/nss_dns/dns-host.c +@@ -599,7 +599,6 @@ getanswer_r (const querybuf *answer, int + int (*name_ok) (const char *); + u_char packtmp[NS_MAXCDNAME]; + int have_to_map = 0; +- int32_t ttl = 0; + uintptr_t pad = -(uintptr_t) buffer % __alignof__ (struct host_data); + buffer += pad; + if (__builtin_expect (buflen < sizeof (struct host_data) + pad, 0)) +@@ -733,7 +732,7 @@ getanswer_r (const querybuf *answer, int + cp += INT16SZ; /* type */ + class = __ns_get16 (cp); + cp += INT16SZ; /* class */ +- ttl = __ns_get32 (cp); ++ int32_t ttl = __ns_get32 (cp); + cp += INT32SZ; /* TTL */ + n = __ns_get16 (cp); + cp += INT16SZ; /* len */ +@@ -907,7 +906,7 @@ getanswer_r (const querybuf *answer, int + { + register int nn; + +- if (ttlp != NULL && ttl != 0) ++ if (ttlp != NULL) + *ttlp = ttl; + if (canonp != NULL) + *canonp = bp; +@@ -1163,7 +1162,7 @@ gaih_getanswer_slice (const querybuf *an + + if (*firstp) + { +- if (ttl != 0 && ttlp != NULL) ++ if (ttlp != NULL) + *ttlp = ttl; + + (*pat)->name = canon ?: h_name; diff --git a/SOURCES/glibc-rh656530.patch b/SOURCES/glibc-rh656530.patch new file mode 100644 index 0000000..f101430 --- /dev/null +++ b/SOURCES/glibc-rh656530.patch @@ -0,0 +1,21 @@ +2010-11-10 Luis Machado + + * sysdeps/ieee754/ldbl-128ibm/e_sqrtl.c (__ieee754_sqrtl): Force + signed comparison. + +Index: glibc-2.12-2-gc4ccff1/sysdeps/ieee754/ldbl-128ibm/e_sqrtl.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/sysdeps/ieee754/ldbl-128ibm/e_sqrtl.c ++++ glibc-2.12-2-gc4ccff1/sysdeps/ieee754/ldbl-128ibm/e_sqrtl.c +@@ -73,9 +73,9 @@ long double __ieee754_sqrtl(long double + 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/SOURCES/glibc-rh657572.patch b/SOURCES/glibc-rh657572.patch new file mode 100644 index 0000000..a720130 --- /dev/null +++ b/SOURCES/glibc-rh657572.patch @@ -0,0 +1,141 @@ +commit 42c5011242e48f846111237552d3bf3ca18c4885 +Author: Ulrich Drepper +Date: Fri Dec 23 09:51:10 2011 -0500 + + Various fixes to fi_FI + + 2011-12-23 Ulrich Drepper + + [BZ #12962] + * locales/fi_FI: Various fixups. + Patch by Marko Myllynen . + +diff --git a/localedata/locales/fi_FI b/localedata/locales/fi_FI +index acc9ce6..f51700c 100644 +--- a/localedata/locales/fi_FI ++++ b/localedata/locales/fi_FI +@@ -1,4 +1,4 @@ +-escape_char / ++escape_char / + comment_char % + + % Finnish language locale for Finland +@@ -45,10 +45,10 @@ category "fi_FI:2000";LC_NUMERIC + category "fi_FI:2000";LC_MONETARY + category "fi_FI:2000";LC_MESSAGES + category "fi_FI:2000";LC_PAPER ++category "fi_FI:2000";LC_MEASUREMENT + category "fi_FI:2000";LC_NAME + category "fi_FI:2000";LC_ADDRESS + category "fi_FI:2000";LC_TELEPHONE +- + END LC_IDENTIFICATION + + LC_COLLATE +@@ -125,7 +125,6 @@ reorder-after + ;;;IGNORE + + reorder-end +- + END LC_COLLATE + + LC_CTYPE +@@ -146,12 +145,10 @@ positive_sign "" + negative_sign "" + int_frac_digits 2 + frac_digits 2 +-% int_curr_symbol precedes +-% curr_symbol succeeds + p_cs_precedes 0 +-p_sep_by_space 2 ++p_sep_by_space 1 + n_cs_precedes 0 +-n_sep_by_space 2 ++n_sep_by_space 1 + p_sign_posn 1 + n_sign_posn 1 + END LC_MONETARY +@@ -173,18 +170,18 @@ day "";/ + "";/ + "";/ + "" +-abmon "";/ +- "";/ ++abmon "";/ ++ "";/ + "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ + "";/ +- "" ++ "" + mon "";/ + "";/ + "";/ +@@ -207,13 +204,14 @@ t_fmt_ampm "" + date_fmt "/ + / + " ++week 7;19971130;4 + first_weekday 2 % Monday + first_workday 2 % Monday + END LC_TIME + + LC_MESSAGES +-yesexpr "" +-noexpr "" ++yesexpr "" ++noexpr "" + END LC_MESSAGES + + LC_PAPER +@@ -222,6 +220,7 @@ width 210 + END LC_PAPER + + LC_TELEPHONE ++tel_dom_fmt "" + tel_int_fmt "/ + " + int_prefix "" +@@ -235,15 +234,25 @@ END LC_MEASUREMENT + LC_NAME + name_fmt "/ + " ++% Finnish equivalents for Mr/Mrs/Miss/Ms are herra/rouva/rouva/neiti ++% but they are practically never used, thus we don't define them here. + END LC_NAME + + LC_ADDRESS +-postal_fmt "/ +-/ +-/ +-/ ++postal_fmt "/ ++/ ++/ ++/ + " + country_ab2 "" + country_ab3 "" + country_num 246 ++country_name "" ++country_post "" ++country_car "" ++country_isbn 952 ++lang_name "" ++lang_ab "" ++lang_term "" ++lang_lib "" + END LC_ADDRESS diff --git a/SOURCES/glibc-rh661982.patch b/SOURCES/glibc-rh661982.patch new file mode 100644 index 0000000..60b840b --- /dev/null +++ b/SOURCES/glibc-rh661982.patch @@ -0,0 +1,188 @@ +2010-12-10 Andreas Schwab + + * wcsmbs/wchar.h (wcpcpy, wcpncpy): Only declare under + _GNU_SOURCE. + +2010-12-10 Andreas Schwab + + * wcsmbs/wchar.h (wcpcpy, wcpncpy): Add __restrict. + * wcsmbs/bits/wchar2.h (__wmemmove_chk_warn, wmemmove, wmemset): + Remove __restrict. + (wcscpy, __wcpcpy_chk, __wcpcpy_alias, wcpcpy, wcsncpy, wcpncpy) + (wcscat, wcsncat, __wcrtomb_chk, wcrtomb): Add __restrict. + +2010-12-09 Jakub Jelinek + + * string/bits/string3.h (memmove, bcopy): Remove __restrict. + +Index: glibc-2.12-2-gc4ccff1/string/bits/string3.h +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/string/bits/string3.h ++++ glibc-2.12-2-gc4ccff1/string/bits/string3.h +@@ -53,8 +53,7 @@ __NTH (memcpy (void *__restrict __dest, + } + + __extern_always_inline void * +-__NTH (memmove (void *__restrict __dest, __const void *__restrict __src, +- size_t __len)) ++__NTH (memmove (void *__dest, __const void *__src, size_t __len)) + { + return __builtin___memmove_chk (__dest, __src, __len, __bos0 (__dest)); + } +@@ -88,8 +87,7 @@ __NTH (memset (void *__dest, int __ch, s + + #ifdef __USE_BSD + __extern_always_inline void +-__NTH (bcopy (__const void *__restrict __src, void *__restrict __dest, +- size_t __len)) ++__NTH (bcopy (__const void *__src, void *__dest, size_t __len)) + { + (void) __builtin___memmove_chk (__dest, __src, __len, __bos0 (__dest)); + } +Index: glibc-2.12-2-gc4ccff1/wcsmbs/bits/wchar2.h +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/wcsmbs/bits/wchar2.h ++++ glibc-2.12-2-gc4ccff1/wcsmbs/bits/wchar2.h +@@ -60,15 +60,13 @@ extern wchar_t *__REDIRECT_NTH (__wmemmo + __const wchar_t *__s2, + size_t __n), wmemmove); + extern wchar_t *__REDIRECT_NTH (__wmemmove_chk_warn, +- (wchar_t *__restrict __s1, +- __const wchar_t *__restrict __s2, size_t __n, +- size_t __ns1), __wmemmove_chk) ++ (wchar_t *__s1, __const wchar_t *__s2, ++ size_t __n, size_t __ns1), __wmemmove_chk) + __warnattr ("wmemmove called with length bigger than size of destination " + "buffer"); + + __extern_always_inline wchar_t * +-__NTH (wmemmove (wchar_t *__restrict __s1, __const wchar_t *__restrict __s2, +- size_t __n)) ++__NTH (wmemmove (wchar_t *__s1, __const wchar_t *__s2, size_t __n)) + { + if (__bos0 (__s1) != (size_t) -1) + { +@@ -129,7 +127,7 @@ extern wchar_t *__REDIRECT_NTH (__wmemse + "buffer"); + + __extern_always_inline wchar_t * +-__NTH (wmemset (wchar_t *__restrict __s, wchar_t __c, size_t __n)) ++__NTH (wmemset (wchar_t *__s, wchar_t __c, size_t __n)) + { + if (__bos0 (__s) != (size_t) -1) + { +@@ -152,7 +150,7 @@ extern wchar_t *__REDIRECT_NTH (__wcscpy + __const wchar_t *__restrict __src), wcscpy); + + __extern_always_inline wchar_t * +-__NTH (wcscpy (wchar_t *__dest, __const wchar_t *__src)) ++__NTH (wcscpy (wchar_t *__restrict __dest, __const wchar_t *__restrict __src)) + { + if (__bos (__dest) != (size_t) -1) + return __wcscpy_chk (__dest, __src, __bos (__dest) / sizeof (wchar_t)); +@@ -160,14 +158,15 @@ __NTH (wcscpy (wchar_t *__dest, __const + } + + +-extern wchar_t *__wcpcpy_chk (wchar_t *__dest, __const wchar_t *__src, ++extern wchar_t *__wcpcpy_chk (wchar_t *__restrict __dest, ++ __const wchar_t *__restrict __src, + size_t __destlen) __THROW; +-extern wchar_t *__REDIRECT_NTH (__wcpcpy_alias, (wchar_t *__dest, +- __const wchar_t *__src), +- wcpcpy); ++extern wchar_t *__REDIRECT_NTH (__wcpcpy_alias, ++ (wchar_t *__restrict __dest, ++ __const wchar_t *__restrict __src), wcpcpy); + + __extern_always_inline wchar_t * +-__NTH (wcpcpy (wchar_t *__dest, __const wchar_t *__src)) ++__NTH (wcpcpy (wchar_t *__restrict __dest, __const wchar_t *__restrict __src)) + { + if (__bos (__dest) != (size_t) -1) + return __wcpcpy_chk (__dest, __src, __bos (__dest) / sizeof (wchar_t)); +@@ -190,7 +189,8 @@ extern wchar_t *__REDIRECT_NTH (__wcsncp + "buffer"); + + __extern_always_inline wchar_t * +-__NTH (wcsncpy (wchar_t *__dest, __const wchar_t *__src, size_t __n)) ++__NTH (wcsncpy (wchar_t *__restrict __dest, __const wchar_t *__restrict __src, ++ size_t __n)) + { + if (__bos (__dest) != (size_t) -1) + { +@@ -220,7 +220,8 @@ extern wchar_t *__REDIRECT_NTH (__wcpncp + "buffer"); + + __extern_always_inline wchar_t * +-__NTH (wcpncpy (wchar_t *__dest, __const wchar_t *__src, size_t __n)) ++__NTH (wcpncpy (wchar_t *__restrict __dest, __const wchar_t *__restrict __src, ++ size_t __n)) + { + if (__bos (__dest) != (size_t) -1) + { +@@ -243,7 +244,7 @@ extern wchar_t *__REDIRECT_NTH (__wcscat + __const wchar_t *__restrict __src), wcscat); + + __extern_always_inline wchar_t * +-__NTH (wcscat (wchar_t *__dest, __const wchar_t *__src)) ++__NTH (wcscat (wchar_t *__restrict __dest, __const wchar_t *__restrict __src)) + { + if (__bos (__dest) != (size_t) -1) + return __wcscat_chk (__dest, __src, __bos (__dest) / sizeof (wchar_t)); +@@ -260,7 +261,8 @@ extern wchar_t *__REDIRECT_NTH (__wcsnca + size_t __n), wcsncat); + + __extern_always_inline wchar_t * +-__NTH (wcsncat (wchar_t *__dest, __const wchar_t *__src, size_t __n)) ++__NTH (wcsncat (wchar_t *__restrict __dest, __const wchar_t *__restrict __src, ++ size_t __n)) + { + if (__bos (__dest) != (size_t) -1) + return __wcsncat_chk (__dest, __src, __n, +@@ -428,14 +430,16 @@ fgetws_unlocked (wchar_t *__restrict __s + #endif + + +-extern size_t __wcrtomb_chk (char *__s, wchar_t __wchar, mbstate_t *__p, +- size_t __buflen) __THROW __wur; ++extern size_t __wcrtomb_chk (char *__restrict __s, wchar_t __wchar, ++ mbstate_t *__restrict __p, ++ size_t __buflen) __THROW __wur; + extern size_t __REDIRECT_NTH (__wcrtomb_alias, + (char *__restrict __s, wchar_t __wchar, + mbstate_t *__restrict __ps), wcrtomb) __wur; + + __extern_always_inline __wur size_t +-__NTH (wcrtomb (char *__s, wchar_t __wchar, mbstate_t *__ps)) ++__NTH (wcrtomb (char *__restrict __s, wchar_t __wchar, ++ mbstate_t *__restrict __ps)) + { + /* We would have to include to get a definition of MB_LEN_MAX. + But this would only disturb the namespace. So we define our own +Index: glibc-2.12-2-gc4ccff1/wcsmbs/wchar.h +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/wcsmbs/wchar.h ++++ glibc-2.12-2-gc4ccff1/wcsmbs/wchar.h +@@ -555,17 +555,17 @@ extern float wcstof_l (__const wchar_t * + extern long double wcstold_l (__const wchar_t *__restrict __nptr, + wchar_t **__restrict __endptr, + __locale_t __loc) __THROW; +-#endif /* GNU */ + + +-#ifdef __USE_XOPEN2K8 + /* Copy SRC to DEST, returning the address of the terminating L'\0' in + DEST. */ +-extern wchar_t *wcpcpy (wchar_t *__dest, __const wchar_t *__src) __THROW; ++extern wchar_t *wcpcpy (wchar_t *__restrict __dest, ++ __const wchar_t *__restrict __src) __THROW; + + /* Copy no more than N characters of SRC to DEST, returning the address of + the last character written into DEST. */ +-extern wchar_t *wcpncpy (wchar_t *__dest, __const wchar_t *__src, size_t __n) ++extern wchar_t *wcpncpy (wchar_t *__restrict __dest, ++ __const wchar_t *__restrict __src, size_t __n) + __THROW; + #endif /* use GNU */ + diff --git a/SOURCES/glibc-rh667974.patch b/SOURCES/glibc-rh667974.patch new file mode 100644 index 0000000..48aacac --- /dev/null +++ b/SOURCES/glibc-rh667974.patch @@ -0,0 +1,160 @@ +2011-03-14 Andreas Schwab + + * elf/dl-load.c (is_dst): Remove parameter secure, all callers + changed. Don't check for isolated use. + (_dl_dst_substitute): Ignore rpath elements containing + non-isolated use of $ORIGIN when privileged. + + * elf/dl-load.c (_dl_dst_substitute): When skipping the first + rpath element also skip the following colon. + (expand_dynamic_string_token): Add is_path parameter and pass + down to DL_DST_REQUIRED and _dl_dst_substitute. + (decompose_rpath): Call expand_dynamic_string_token with + non-zero is_path. Ignore empty rpaths. + (_dl_map_object_from_fd): Call expand_dynamic_string_token + with zero is_path. + +Index: glibc-2.12-2-gc4ccff1/elf/dl-load.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/elf/dl-load.c ++++ glibc-2.12-2-gc4ccff1/elf/dl-load.c +@@ -169,8 +169,7 @@ local_strdup (const char *s) + + + static size_t +-is_dst (const char *start, const char *name, const char *str, +- int is_path, int secure) ++is_dst (const char *start, const char *name, const char *str, int is_path) + { + size_t len; + bool is_curly = false; +@@ -199,11 +198,6 @@ is_dst (const char *start, const char *n + && (!is_path || name[len] != ':')) + return 0; + +- if (__builtin_expect (secure, 0) +- && ((name[len] != '\0' && (!is_path || name[len] != ':')) +- || (name != start + 1 && (!is_path || name[-2] != ':')))) +- return 0; +- + return len; + } + +@@ -218,13 +212,10 @@ _dl_dst_count (const char *name, int is_ + { + size_t len; + +- /* $ORIGIN is not expanded for SUID/GUID programs (except if it +- is $ORIGIN alone) and it must always appear first in path. */ + ++name; +- if ((len = is_dst (start, name, "ORIGIN", is_path, +- INTUSE(__libc_enable_secure))) != 0 +- || (len = is_dst (start, name, "PLATFORM", is_path, 0)) != 0 +- || (len = is_dst (start, name, "LIB", is_path, 0)) != 0) ++ if ((len = is_dst (start, name, "ORIGIN", is_path)) != 0 ++ || (len = is_dst (start, name, "PLATFORM", is_path)) != 0 ++ || (len = is_dst (start, name, "LIB", is_path)) != 0) + ++cnt; + + name = strchr (name + len, '$'); +@@ -256,9 +247,16 @@ _dl_dst_substitute (struct link_map *l, + size_t len; + + ++name; +- if ((len = is_dst (start, name, "ORIGIN", is_path, +- INTUSE(__libc_enable_secure))) != 0) ++ if ((len = is_dst (start, name, "ORIGIN", is_path)) != 0) + { ++ /* $ORIGIN is not expanded for SUID/GUID programs ++ (except if it is $ORIGIN alone) and it must always ++ appear first in path. */ ++ if (__builtin_expect (INTUSE(__libc_enable_secure), 0) ++ && ((name[len] != '\0' && (!is_path || name[len] != ':')) ++ || (name != start + 1 && (!is_path || name[-2] != ':')))) ++ repl = (const char *) -1; ++ else + #ifndef SHARED + if (l == NULL) + repl = _dl_get_origin (); +@@ -266,9 +264,9 @@ _dl_dst_substitute (struct link_map *l, + #endif + repl = l->l_origin; + } +- else if ((len = is_dst (start, name, "PLATFORM", is_path, 0)) != 0) ++ else if ((len = is_dst (start, name, "PLATFORM", is_path)) != 0) + repl = GLRO(dl_platform); +- else if ((len = is_dst (start, name, "LIB", is_path, 0)) != 0) ++ else if ((len = is_dst (start, name, "LIB", is_path)) != 0) + repl = DL_DST_LIB; + + if (repl != NULL && repl != (const char *) -1) +@@ -284,6 +282,10 @@ _dl_dst_substitute (struct link_map *l, + name += len; + while (*name != '\0' && (!is_path || *name != ':')) + ++name; ++ /* Also skip following colon if this is the first rpath ++ element, but keep an empty element at the end. */ ++ if (wp == result && is_path && *name == ':' && name[1] != '\0') ++ ++name; + } + else + /* No DST we recognize. */ +@@ -310,7 +312,7 @@ _dl_dst_substitute (struct link_map *l, + belonging to the map is loaded. In this case the path element + containing $ORIGIN is left out. */ + static char * +-expand_dynamic_string_token (struct link_map *l, const char *s) ++expand_dynamic_string_token (struct link_map *l, const char *s, int is_path) + { + /* We make two runs over the string. First we determine how large the + resulting string is and then we copy it over. Since this is no +@@ -321,7 +323,7 @@ expand_dynamic_string_token (struct link + char *result; + + /* Determine the number of DST elements. */ +- cnt = DL_DST_COUNT (s, 1); ++ cnt = DL_DST_COUNT (s, is_path); + + /* If we do not have to replace anything simply copy the string. */ + if (__builtin_expect (cnt, 0) == 0) +@@ -335,7 +337,7 @@ expand_dynamic_string_token (struct link + if (result == NULL) + return NULL; + +- return _dl_dst_substitute (l, s, result, 1); ++ return _dl_dst_substitute (l, s, result, is_path); + } + + +@@ -551,13 +553,21 @@ decompose_rpath (struct r_search_path_st + + /* Make a writable copy. At the same time expand possible dynamic + string tokens. */ +- copy = expand_dynamic_string_token (l, rpath); ++ copy = expand_dynamic_string_token (l, rpath, 1); + if (copy == NULL) + { + errstring = N_("cannot create RUNPATH/RPATH copy"); + goto signal_error; + } + ++ /* Ignore empty rpaths. */ ++ if (*copy == 0) ++ { ++ free (copy); ++ sps->dirs = (char *) -1; ++ return false; ++ } ++ + /* Count the number of necessary elements in the result array. */ + nelems = 0; + for (cp = copy; *cp != '\0'; ++cp) +@@ -2176,7 +2186,7 @@ _dl_map_object (struct link_map *loader, + { + /* The path may contain dynamic string tokens. */ + realname = (loader +- ? expand_dynamic_string_token (loader, name) ++ ? expand_dynamic_string_token (loader, name, 0) + : local_strdup (name)); + if (realname == NULL) + fd = -1; diff --git a/SOURCES/glibc-rh676076.patch b/SOURCES/glibc-rh676076.patch new file mode 100644 index 0000000..c5aa2d4 --- /dev/null +++ b/SOURCES/glibc-rh676076.patch @@ -0,0 +1,714 @@ +2011-03-02 Harsha Jagasia + Ulrich Drepper + + * sysdeps/x86_64/memset.S: After aligning destination, code + branches to different locations depending on the value of + misalignment, when multiarch is enabled. Fix this. + +2011-03-02 Harsha Jagasia + + * sysdeps/x86_64/cacheinfo.c (init_cacheinfo): + Set _x86_64_preferred_memory_instruction for AMD processsors. + * sysdeps/x86_64/multiarch/init-arch.c (__init_cpu_features): + Set bit_Prefer_SSE_for_memop for AMD processors. + +2010-11-07 H.J. Lu + + * sysdeps/x86_64/memset.S: Check USE_MULTIARCH and USE_SSE2 for + IFUNC support. + * sysdeps/x86_64/multiarch/Makefile (sysdep_routines): Add + memset-x86-64. + * sysdeps/x86_64/multiarch/bzero.S: New file. + * sysdeps/x86_64/multiarch/cacheinfo.c: New file. + * sysdeps/x86_64/multiarch/memset-x86-64.S: New file. + * sysdeps/x86_64/multiarch/memset.S: New file. + * sysdeps/x86_64/multiarch/memset_chk.S: New file. + * sysdeps/x86_64/multiarch/init-arch.c (__init_cpu_features): + Set bit_Prefer_SSE_for_memop for Intel processors. + * sysdeps/x86_64/multiarch/init-arch.h (bit_Prefer_SSE_for_memop): + Define. + (index_Prefer_SSE_for_memop): Define. + (HAS_PREFER_SSE_FOR_MEMOP): Define. + +Index: glibc-2.12-2-gc4ccff1/sysdeps/x86_64/cacheinfo.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/sysdeps/x86_64/cacheinfo.c ++++ glibc-2.12-2-gc4ccff1/sysdeps/x86_64/cacheinfo.c +@@ -613,6 +613,25 @@ init_cacheinfo (void) + long int core = handle_amd (_SC_LEVEL2_CACHE_SIZE); + shared = handle_amd (_SC_LEVEL3_CACHE_SIZE); + ++#ifndef DISABLE_PREFERRED_MEMORY_INSTRUCTION ++# ifdef USE_MULTIARCH ++ eax = __cpu_features.cpuid[COMMON_CPUID_INDEX_1].eax; ++ ebx = __cpu_features.cpuid[COMMON_CPUID_INDEX_1].ebx; ++ ecx = __cpu_features.cpuid[COMMON_CPUID_INDEX_1].ecx; ++ edx = __cpu_features.cpuid[COMMON_CPUID_INDEX_1].edx; ++# else ++ __cpuid (1, eax, ebx, ecx, edx); ++# endif ++ ++ /* AMD prefers SSSE3 instructions for memory/string routines ++ if they are avaiable, otherwise it prefers integer ++ instructions. */ ++ if ((ecx & 0x200)) ++ __x86_64_preferred_memory_instruction = 3; ++ else ++ __x86_64_preferred_memory_instruction = 0; ++#endif ++ + /* Get maximum extended function. */ + __cpuid (0x80000000, max_cpuid_ex, ebx, ecx, edx); + +Index: glibc-2.12-2-gc4ccff1/sysdeps/x86_64/memset.S +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/sysdeps/x86_64/memset.S ++++ glibc-2.12-2-gc4ccff1/sysdeps/x86_64/memset.S +@@ -24,7 +24,7 @@ + #define __STOS_UPPER_BOUNDARY $65536 + + .text +-#ifndef NOT_IN_libc ++#if !defined NOT_IN_libc && !defined USE_MULTIARCH + ENTRY(__bzero) + mov %rsi,%rdx /* Adjust parameter. */ + xorl %esi,%esi /* Fill with 0s. */ +@@ -34,10 +34,10 @@ weak_alias (__bzero, bzero) + #endif + + #if defined PIC && !defined NOT_IN_libc +-ENTRY (__memset_chk) ++ENTRY_CHK (__memset_chk) + cmpq %rdx, %rcx + jb HIDDEN_JUMPTARGET (__chk_fail) +-END (__memset_chk) ++END_CHK (__memset_chk) + #endif + ENTRY (memset) + L(memset_entry): +@@ -591,157 +591,15 @@ L(A6Q1): mov %dx,-0xe(%rdi) + L(A7Q0): mov %dl,-0x7(%rdi) + L(A6Q0): mov %dx,-0x6(%rdi) + mov %edx,-0x4(%rdi) +- jmp L(aligned_now) +- +- .balign 16 +-L(aligned_now): +- +- cmpl $0x1,__x86_64_preferred_memory_instruction(%rip) +- jg L(SSE_pre) +- +-L(8byte_move_try): +- cmpq __STOS_LOWER_BOUNDARY,%r8 +- jae L(8byte_stos_try) +- +- .balign 16 +-L(8byte_move): +- movq %r8,%rcx +- shrq $7,%rcx +- jz L(8byte_move_skip) +- +- .p2align 4 +- +-L(8byte_move_loop): +- decq %rcx +- +- movq %rdx, (%rdi) +- movq %rdx, 8 (%rdi) +- movq %rdx, 16 (%rdi) +- movq %rdx, 24 (%rdi) +- movq %rdx, 32 (%rdi) +- movq %rdx, 40 (%rdi) +- movq %rdx, 48 (%rdi) +- movq %rdx, 56 (%rdi) +- movq %rdx, 64 (%rdi) +- movq %rdx, 72 (%rdi) +- movq %rdx, 80 (%rdi) +- movq %rdx, 88 (%rdi) +- movq %rdx, 96 (%rdi) +- movq %rdx, 104 (%rdi) +- movq %rdx, 112 (%rdi) +- movq %rdx, 120 (%rdi) +- +- leaq 128 (%rdi),%rdi +- +- jnz L(8byte_move_loop) +- +-L(8byte_move_skip): +- andl $127,%r8d +- lea (%rdi,%r8,1),%rdi +- +-#ifndef PIC +- lea L(setPxQx)(%rip),%r11 +- jmpq *(%r11,%r8,8) # old scheme remained for nonPIC +-#else +- lea L(Got0)(%rip),%r11 +- lea L(setPxQx)(%rip),%rcx +- movswq (%rcx,%r8,2),%rcx +- lea (%rcx,%r11,1),%r11 +- jmpq *%r11 +-#endif +- +- .balign 16 +-L(8byte_stos_try): +- mov __x86_64_shared_cache_size(%rip),%r9d // ck largest cache size +- cmpq %r8,%r9 // calculate the lesser of remaining +- cmovaq %r8,%r9 // bytes and largest cache size +- jbe L(8byte_stos) +- +-L(8byte_move_reuse_try): +- cmp __STOS_UPPER_BOUNDARY,%r8 +- jae L(8byte_move) +- +- .balign 16 +-L(8byte_stos): +- movq %r9,%rcx +- andq $-8,%r9 +- +- shrq $3,%rcx +- jz L(8byte_stos_skip) +- +- xchgq %rax,%rdx +- +- rep +- stosq +- +- xchgq %rax,%rdx +- +-L(8byte_stos_skip): +- subq %r9,%r8 +- ja L(8byte_nt_move) +- +- andl $7,%r8d +- lea (%rdi,%r8,1),%rdi +-#ifndef PIC +- lea L(setPxQx)(%rip),%r11 +- jmpq *(%r11,%r8,8) # old scheme remained for nonPIC +-#else +- lea L(Got0)(%rip),%r11 +- lea L(setPxQx)(%rip),%rcx +- movswq (%rcx,%r8,2),%rcx +- lea (%rcx,%r11,1),%r11 +- jmpq *%r11 +-#endif + +- .balign 16 +-L(8byte_nt_move): +- movq %r8,%rcx +- shrq $7,%rcx +- jz L(8byte_nt_move_skip) +- +- .balign 16 +-L(8byte_nt_move_loop): +- decq %rcx +- +- movntiq %rdx, (%rdi) +- movntiq %rdx, 8 (%rdi) +- movntiq %rdx, 16 (%rdi) +- movntiq %rdx, 24 (%rdi) +- movntiq %rdx, 32 (%rdi) +- movntiq %rdx, 40 (%rdi) +- movntiq %rdx, 48 (%rdi) +- movntiq %rdx, 56 (%rdi) +- movntiq %rdx, 64 (%rdi) +- movntiq %rdx, 72 (%rdi) +- movntiq %rdx, 80 (%rdi) +- movntiq %rdx, 88 (%rdi) +- movntiq %rdx, 96 (%rdi) +- movntiq %rdx, 104 (%rdi) +- movntiq %rdx, 112 (%rdi) +- movntiq %rdx, 120 (%rdi) +- +- leaq 128 (%rdi),%rdi +- +- jnz L(8byte_nt_move_loop) +- +- sfence +- +-L(8byte_nt_move_skip): +- andl $127,%r8d ++#ifndef USE_MULTIARCH ++ jmp L(aligned_now) + +- lea (%rdi,%r8,1),%rdi +-#ifndef PIC +- lea L(setPxQx)(%rip),%r11 +- jmpq *(%r11,%r8,8) # old scheme remained for nonPIC ++L(SSE_pre): + #else +- lea L(Got0)(%rip),%r11 +- lea L(setPxQx)(%rip),%rcx +- movswq (%rcx,%r8,2),%rcx +- lea (%rcx,%r11,1),%r11 +- jmpq *%r11 ++L(aligned_now): + #endif +- +-L(SSE_pre): ++#if !defined USE_MULTIARCH || defined USE_SSE2 + # fill RegXMM0 with the pattern + movd %rdx,%xmm0 + punpcklqdq %xmm0,%xmm0 +@@ -1342,11 +1200,162 @@ L(SSExDx): + .short L(SSE15QB)-L(SSE0Q0) + #endif + .popsection ++#endif /* !defined USE_MULTIARCH || defined USE_SSE2 */ ++ ++ .balign 16 ++#ifndef USE_MULTIARCH ++L(aligned_now): ++ ++ cmpl $0x1,__x86_64_preferred_memory_instruction(%rip) ++ jg L(SSE_pre) ++#endif /* USE_MULTIARCH */ ++ ++L(8byte_move_try): ++ cmpq __STOS_LOWER_BOUNDARY,%r8 ++ jae L(8byte_stos_try) ++ ++ .balign 16 ++L(8byte_move): ++ movq %r8,%rcx ++ shrq $7,%rcx ++ jz L(8byte_move_skip) ++ ++ .p2align 4 ++ ++L(8byte_move_loop): ++ decq %rcx ++ ++ movq %rdx, (%rdi) ++ movq %rdx, 8 (%rdi) ++ movq %rdx, 16 (%rdi) ++ movq %rdx, 24 (%rdi) ++ movq %rdx, 32 (%rdi) ++ movq %rdx, 40 (%rdi) ++ movq %rdx, 48 (%rdi) ++ movq %rdx, 56 (%rdi) ++ movq %rdx, 64 (%rdi) ++ movq %rdx, 72 (%rdi) ++ movq %rdx, 80 (%rdi) ++ movq %rdx, 88 (%rdi) ++ movq %rdx, 96 (%rdi) ++ movq %rdx, 104 (%rdi) ++ movq %rdx, 112 (%rdi) ++ movq %rdx, 120 (%rdi) ++ ++ leaq 128 (%rdi),%rdi ++ ++ jnz L(8byte_move_loop) ++ ++L(8byte_move_skip): ++ andl $127,%r8d ++ lea (%rdi,%r8,1),%rdi ++ ++#ifndef PIC ++ lea L(setPxQx)(%rip),%r11 ++ jmpq *(%r11,%r8,8) # old scheme remained for nonPIC ++#else ++ lea L(Got0)(%rip),%r11 ++ lea L(setPxQx)(%rip),%rcx ++ movswq (%rcx,%r8,2),%rcx ++ lea (%rcx,%r11,1),%r11 ++ jmpq *%r11 ++#endif ++ ++ .balign 16 ++L(8byte_stos_try): ++ mov __x86_64_shared_cache_size(%rip),%r9d // ck largest cache size ++ cmpq %r8,%r9 // calculate the lesser of remaining ++ cmovaq %r8,%r9 // bytes and largest cache size ++ jbe L(8byte_stos) ++ ++L(8byte_move_reuse_try): ++ cmp __STOS_UPPER_BOUNDARY,%r8 ++ jae L(8byte_move) ++ ++ .balign 16 ++L(8byte_stos): ++ movq %r9,%rcx ++ andq $-8,%r9 ++ ++ shrq $3,%rcx ++ jz L(8byte_stos_skip) ++ ++ xchgq %rax,%rdx ++ ++ rep ++ stosq ++ ++ xchgq %rax,%rdx ++ ++L(8byte_stos_skip): ++ subq %r9,%r8 ++ ja L(8byte_nt_move) ++ ++ andl $7,%r8d ++ lea (%rdi,%r8,1),%rdi ++#ifndef PIC ++ lea L(setPxQx)(%rip),%r11 ++ jmpq *(%r11,%r8,8) # old scheme remained for nonPIC ++#else ++ lea L(Got0)(%rip),%r11 ++ lea L(setPxQx)(%rip),%rcx ++ movswq (%rcx,%r8,2),%rcx ++ lea (%rcx,%r11,1),%r11 ++ jmpq *%r11 ++#endif ++ ++ .balign 16 ++L(8byte_nt_move): ++ movq %r8,%rcx ++ shrq $7,%rcx ++ jz L(8byte_nt_move_skip) ++ ++ .balign 16 ++L(8byte_nt_move_loop): ++ decq %rcx ++ ++ movntiq %rdx, (%rdi) ++ movntiq %rdx, 8 (%rdi) ++ movntiq %rdx, 16 (%rdi) ++ movntiq %rdx, 24 (%rdi) ++ movntiq %rdx, 32 (%rdi) ++ movntiq %rdx, 40 (%rdi) ++ movntiq %rdx, 48 (%rdi) ++ movntiq %rdx, 56 (%rdi) ++ movntiq %rdx, 64 (%rdi) ++ movntiq %rdx, 72 (%rdi) ++ movntiq %rdx, 80 (%rdi) ++ movntiq %rdx, 88 (%rdi) ++ movntiq %rdx, 96 (%rdi) ++ movntiq %rdx, 104 (%rdi) ++ movntiq %rdx, 112 (%rdi) ++ movntiq %rdx, 120 (%rdi) ++ ++ leaq 128 (%rdi),%rdi ++ ++ jnz L(8byte_nt_move_loop) ++ ++ sfence ++ ++L(8byte_nt_move_skip): ++ andl $127,%r8d ++ ++ lea (%rdi,%r8,1),%rdi ++#ifndef PIC ++ lea L(setPxQx)(%rip),%r11 ++ jmpq *(%r11,%r8,8) # old scheme remained for nonPIC ++#else ++ lea L(Got0)(%rip),%r11 ++ lea L(setPxQx)(%rip),%rcx ++ movswq (%rcx,%r8,2),%rcx ++ lea (%rcx,%r11,1),%r11 ++ jmpq *%r11 ++#endif + + END (memset) + libc_hidden_builtin_def (memset) + +-#if defined PIC && !defined NOT_IN_libc ++#if defined PIC && !defined NOT_IN_libc && !defined USE_MULTIARCH + strong_alias (__memset_chk, __memset_zero_constant_len_parameter) + .section .gnu.warning.__memset_zero_constant_len_parameter + .string "memset used with constant zero length parameter; this could be due to transposed parameters" +Index: glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/Makefile +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/sysdeps/x86_64/multiarch/Makefile ++++ glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/Makefile +@@ -7,7 +7,8 @@ ifeq ($(subdir),string) + sysdep_routines += stpncpy-c strncpy-c strcmp-ssse3 strncmp-ssse3 \ + strend-sse4 memcmp-sse4 \ + strcasestr-nonascii strcasecmp_l-ssse3 \ +- strncase_l-ssse3 ++ strncase_l-ssse3 \ ++ memset-x86-64 + ifeq (yes,$(config-cflags-sse4)) + sysdep_routines += strcspn-c strpbrk-c strspn-c strstr-c strcasestr-c + CFLAGS-strcspn-c.c += -msse4 +Index: glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/bzero.S +=================================================================== +--- /dev/null ++++ glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/bzero.S +@@ -0,0 +1,56 @@ ++/* Multiple versions of bzero ++ Copyright (C) 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 ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, write to the Free ++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++ 02111-1307 USA. */ ++ ++#include ++#include ++ ++ .text ++ENTRY(__bzero) ++ .type __bzero, @gnu_indirect_function ++ cmpl $0, __cpu_features+KIND_OFFSET(%rip) ++ jne 1f ++ call __init_cpu_features ++1: leaq __bzero_x86_64(%rip), %rax ++ testl $bit_Prefer_SSE_for_memop, __cpu_features+FEATURE_OFFSET+index_Prefer_SSE_for_memop(%rip) ++ jz 2f ++ leaq __bzero_sse2(%rip), %rax ++2: ret ++END(__bzero) ++ ++ .type __bzero_sse2, @function ++__bzero_sse2: ++ cfi_startproc ++ CALL_MCOUNT ++ mov %rsi,%rdx /* Adjust parameter. */ ++ xorl %esi,%esi /* Fill with 0s. */ ++ jmp __memset_sse2 ++ cfi_endproc ++ .size __bzero_sse2, .-__bzero_sse2 ++ ++ .type __bzero_x86_64, @function ++__bzero_x86_64: ++ cfi_startproc ++ CALL_MCOUNT ++ mov %rsi,%rdx /* Adjust parameter. */ ++ xorl %esi,%esi /* Fill with 0s. */ ++ jmp __memset_x86_64 ++ cfi_endproc ++ .size __bzero_x86_64, .-__bzero_x86_64 ++ ++weak_alias (__bzero, bzero) +Index: glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/cacheinfo.c +=================================================================== +--- /dev/null ++++ glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/cacheinfo.c +@@ -0,0 +1,2 @@ ++#define DISABLE_PREFERRED_MEMORY_INSTRUCTION ++#include "../cacheinfo.c" +Index: glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/init-arch.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/sysdeps/x86_64/multiarch/init-arch.c ++++ glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/init-arch.c +@@ -59,6 +59,11 @@ __init_cpu_features (void) + + get_common_indeces (&family, &model); + ++ /* Intel processors prefer SSE instruction for memory/string ++ routines if they are avaiable. */ ++ __cpu_features.feature[index_Prefer_SSE_for_memop] ++ |= bit_Prefer_SSE_for_memop; ++ + unsigned int eax = __cpu_features.cpuid[COMMON_CPUID_INDEX_1].eax; + unsigned int extended_family = (eax >> 20) & 0xff; + unsigned int extended_model = (eax >> 12) & 0xf0; +@@ -92,6 +97,14 @@ __init_cpu_features (void) + kind = arch_kind_amd; + + get_common_indeces (&family, &model); ++ ++ unsigned int ecx = __cpu_features.cpuid[COMMON_CPUID_INDEX_1].ecx; ++ ++ /* AMD processors prefer SSE instructions for memory/string routines ++ if they are available, otherwise they prefer integer instructions. */ ++ if ((ecx & 0x200)) ++ __cpu_features.feature[index_Prefer_SSE_for_memop] ++ |= bit_Prefer_SSE_for_memop; + } + else + kind = arch_kind_other; +Index: glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/init-arch.h +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/sysdeps/x86_64/multiarch/init-arch.h ++++ glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/init-arch.h +@@ -16,7 +16,8 @@ + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +-#define bit_Fast_Rep_String (1 << 0) ++#define bit_Fast_Rep_String (1 << 0) ++#define bit_Prefer_SSE_for_memop (1 << 3) + + #ifdef __ASSEMBLER__ + +@@ -33,6 +34,7 @@ + # define index_SSE4_2 COMMON_CPUID_INDEX_1*CPUID_SIZE+CPUID_ECX_OFFSET + + #define index_Fast_Rep_String FEATURE_INDEX_1*FEATURE_SIZE ++# define index_Prefer_SSE_for_memop FEATURE_INDEX_1*FEATURE_SIZE + + #else /* __ASSEMBLER__ */ + +@@ -103,5 +105,12 @@ extern const struct cpu_features *__get_ + # define HAS_FMA HAS_CPU_FEATURE (COMMON_CPUID_INDEX_1, ecx, 12) + + # define index_Fast_Rep_String FEATURE_INDEX_1 ++# define index_Prefer_SSE_for_memop FEATURE_INDEX_1 ++ ++#define HAS_ARCH_FEATURE(idx, bit) \ ++ ((__get_cpu_features ()->feature[idx] & (bit)) != 0) ++ ++#define HAS_PREFER_SSE_FOR_MEMOP \ ++ HAS_ARCH_FEATURE (index_Prefer_SSE_for_memop, bit_Prefer_SSE_for_memop) + + #endif /* __ASSEMBLER__ */ +Index: glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/memset-x86-64.S +=================================================================== +--- /dev/null ++++ glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/memset-x86-64.S +@@ -0,0 +1,18 @@ ++#include ++ ++#ifndef NOT_IN_libc ++# undef ENTRY_CHK ++# define ENTRY_CHK(name) \ ++ .type __memset_chk_x86_64, @function; \ ++ .globl __memset_chk_x86_64; \ ++ .p2align 4; \ ++ __memset_chk_x86_64: cfi_startproc; \ ++ CALL_MCOUNT ++# undef END_CHK ++# define END_CHK(name) \ ++ cfi_endproc; .size __memset_chk_x86_64, .-__memset_chk_x86_64 ++ ++# define libc_hidden_builtin_def(name) ++# define memset __memset_x86_64 ++# include "../memset.S" ++#endif +Index: glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/memset.S +=================================================================== +--- /dev/null ++++ glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/memset.S +@@ -0,0 +1,74 @@ ++/* Multiple versions of memset ++ Copyright (C) 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 ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, write to the Free ++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++ 02111-1307 USA. */ ++ ++#include ++#include ++ ++/* Define multiple versions only for the definition in lib. */ ++#ifndef NOT_IN_libc ++ENTRY(memset) ++ .type memset, @gnu_indirect_function ++ cmpl $0, __cpu_features+KIND_OFFSET(%rip) ++ jne 1f ++ call __init_cpu_features ++1: leaq __memset_x86_64(%rip), %rax ++ testl $bit_Prefer_SSE_for_memop, __cpu_features+FEATURE_OFFSET+index_Prefer_SSE_for_memop(%rip) ++ jz 2f ++ leaq __memset_sse2(%rip), %rax ++2: ret ++END(memset) ++ ++# define USE_SSE2 1 ++ ++# undef ENTRY ++# define ENTRY(name) \ ++ .type __memset_sse2, @function; \ ++ .globl __memset_sse2; \ ++ .p2align 4; \ ++ __memset_sse2: cfi_startproc; \ ++ CALL_MCOUNT ++# undef END ++# define END(name) \ ++ cfi_endproc; .size __memset_sse2, .-__memset_sse2 ++ ++# undef ENTRY_CHK ++# define ENTRY_CHK(name) \ ++ .type __memset_chk_sse2, @function; \ ++ .globl __memset_chk_sse2; \ ++ .p2align 4; \ ++ __memset_chk_sse2: cfi_startproc; \ ++ CALL_MCOUNT ++# undef END_CHK ++# define END_CHK(name) \ ++ cfi_endproc; .size __memset_chk_sse2, .-__memset_chk_sse2 ++ ++# ifdef SHARED ++# undef libc_hidden_builtin_def ++/* It doesn't make sense to send libc-internal memset calls through a PLT. ++ The speedup we get from using GPR instruction is likely eaten away ++ by the indirect call in the PLT. */ ++# define libc_hidden_builtin_def(name) \ ++ .globl __GI_memset; __GI_memset = __memset_sse2 ++# endif ++ ++# undef strong_alias ++# define strong_alias(original, alias) ++#endif ++ ++#include "../memset.S" +Index: glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/memset_chk.S +=================================================================== +--- /dev/null ++++ glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/memset_chk.S +@@ -0,0 +1,44 @@ ++/* Multiple versions of __memset_chk ++ Copyright (C) 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 ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, write to the Free ++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++ 02111-1307 USA. */ ++ ++#include ++#include ++ ++/* Define multiple versions only for the definition in lib. */ ++#ifndef NOT_IN_libc ++# ifdef SHARED ++ENTRY(__memset_chk) ++ .type __memset_chk, @gnu_indirect_function ++ cmpl $0, __cpu_features+KIND_OFFSET(%rip) ++ jne 1f ++ call __init_cpu_features ++1: leaq __memset_chk_x86_64(%rip), %rax ++ testl $bit_Prefer_SSE_for_memop, __cpu_features+FEATURE_OFFSET+index_Prefer_SSE_for_memop(%rip) ++ jz 2f ++ leaq __memset_chk_sse2(%rip), %rax ++2: ret ++END(__memset_chk) ++ ++strong_alias (__memset_chk, __memset_zero_constant_len_parameter) ++ .section .gnu.warning.__memset_zero_constant_len_parameter ++ .string "memset used with constant zero length parameter; this could be due to transposed parameters" ++# else ++# include "../memset_chk.S" ++# endif ++#endif diff --git a/SOURCES/glibc-rh676591.patch b/SOURCES/glibc-rh676591.patch new file mode 100644 index 0000000..fd6df1e --- /dev/null +++ b/SOURCES/glibc-rh676591.patch @@ -0,0 +1,352 @@ +2011-05-15 Ulrich Drepper + + [BZ #11901] + * include/stdlib.h: Move include protection to the right place. + Define abort_msg_s. Declare __abort_msg with it. + * stdlib/abort.c (__abort_msg): Adjust type. + * assert/assert.c (__assert_fail_base): New function. Majority + of code from __assert_fail. Allocate memory for __abort_msg with + mmap. + (__assert_fail): Now call __assert_fail_base. + * assert/assert-perr.c: Remove bulk of implementation. Use + __assert_fail_base. + * include/assert.hL Declare __assert_fail_base. + * sysdeps/posix/libc_fatal.c: Allocate memory for __abort_msg with + mmap. + * sysdeps/unix/sysv/linux/libc_fatal.c: Likewise. + +Index: glibc-2.12-2-gc4ccff1/assert/assert-perr.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/assert/assert-perr.c ++++ glibc-2.12-2-gc4ccff1/assert/assert-perr.c +@@ -17,66 +17,23 @@ + 02111-1307 USA. */ + + #include +-#include + #include +-#include +-#include + #include +-#include +-#include + + +-extern const char *__progname; +- +-#ifdef USE_IN_LIBIO +-# include +-# include +-# define fflush(s) INTUSE(_IO_fflush) (s) +-#endif +- + /* This function, when passed an error number, a filename, and a line + number, prints a message on the standard error stream of the form: +- a.c:10: foobar: Unexpected error: Computer bought the farm ++ a.c:10: foobar: Unexpected error: Computer bought the farm + It then aborts program execution via a call to `abort'. */ +- +-#ifdef FATAL_PREPARE_INCLUDE +-# include FATAL_PREPARE_INCLUDE +-#endif +- + void + __assert_perror_fail (int errnum, + const char *file, unsigned int line, + const char *function) + { + char errbuf[1024]; +- char *buf; +- +-#ifdef FATAL_PREPARE +- FATAL_PREPARE; +-#endif +- +- if (__asprintf (&buf, _("%s%s%s:%u: %s%sUnexpected error: %s.\n"), +- __progname, __progname[0] ? ": " : "", +- file, line, +- function ? function : "", function ? ": " : "", +- __strerror_r (errnum, errbuf, sizeof errbuf)) >= 0) +- { +- /* Print the message. */ +- (void) __fxprintf (NULL, "%s", buf); +- (void) fflush (stderr); +- +- /* We have to free the old buffer since the application might +- catch the SIGABRT signal. */ +- char *old = atomic_exchange_acq (&__abort_msg, buf); +- free (old); +- } +- else +- { +- /* At least print a minimal message. */ +- static const char errstr[] = "Unexpected error.\n"; +- __libc_write (STDERR_FILENO, errstr, sizeof (errstr) - 1); +- } + +- abort (); ++ char *e = __strerror_r (errnum, errbuf, sizeof errbuf); ++ __assert_fail_base (_("%s%s%s:%u: %s%sUnexpected error: %s.\n"), ++ e, file, line, function); + } + libc_hidden_def (__assert_perror_fail) +Index: glibc-2.12-2-gc4ccff1/assert/assert.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/assert/assert.c ++++ glibc-2.12-2-gc4ccff1/assert/assert.c +@@ -19,11 +19,13 @@ + + #include + #include ++#include + #include + #include + #include + #include + #include ++#include + + + extern const char *__progname; +@@ -45,31 +47,44 @@ extern const char *__progname; + #endif + + +-#undef __assert_fail + void +-__assert_fail (const char *assertion, const char *file, unsigned int line, +- const char *function) ++__assert_fail_base (const char *fmt, const char *assertion, const char *file, ++ unsigned int line, const char *function) + { +- char *buf; ++ char *str; + + #ifdef FATAL_PREPARE + FATAL_PREPARE; + #endif + +- if (__asprintf (&buf, _("%s%s%s:%u: %s%sAssertion `%s' failed.\n"), ++ int total; ++ if (__asprintf (&str, fmt, + __progname, __progname[0] ? ": " : "", + file, line, + function ? function : "", function ? ": " : "", +- assertion) >= 0) ++ assertion, &total) >= 0) + { + /* Print the message. */ +- (void) __fxprintf (NULL, "%s", buf); ++ (void) __fxprintf (NULL, "%s", str); + (void) fflush (stderr); + +- /* We have to free the old buffer since the application might +- catch the SIGABRT signal. */ +- char *old = atomic_exchange_acq (&__abort_msg, buf); +- free (old); ++ total = (total + 1 + GLRO(dl_pagesize) - 1) & ~(GLRO(dl_pagesize) - 1); ++ struct abort_msg_s *buf = __mmap (NULL, total, PROT_READ | PROT_WRITE, ++ MAP_ANON | MAP_PRIVATE, -1, 0); ++ if (__builtin_expect (buf != MAP_FAILED, 1)) ++ { ++ buf->size = total; ++ strcpy (buf->msg, str); ++ ++ /* We have to free the old buffer since the application might ++ catch the SIGABRT signal. */ ++ struct abort_msg_s *old = atomic_exchange_acq (&__abort_msg, buf); ++ ++ if (old != NULL) ++ __munmap (old, old->size); ++ } ++ ++ free (str); + } + else + { +@@ -80,4 +95,14 @@ __assert_fail (const char *assertion, co + + abort (); + } ++ ++ ++#undef __assert_fail ++void ++__assert_fail (const char *assertion, const char *file, unsigned int line, ++ const char *function) ++{ ++ __assert_fail_base (_("%s%s%s:%u: %s%sAssertion `%s' failed.\n%n"), ++ assertion, file, line, function); ++} + hidden_def(__assert_fail) +Index: glibc-2.12-2-gc4ccff1/include/assert.h +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/include/assert.h ++++ glibc-2.12-2-gc4ccff1/include/assert.h +@@ -13,6 +13,12 @@ extern void __assert_perror_fail (int __ + __const char *__function) + __THROW __attribute__ ((__noreturn__)); + ++/* The real implementation of the two functions above. */ ++extern void __assert_fail_base (const char *fmt, const char *assertion, ++ const char *file, unsigned int line, ++ const char *function) ++ __THROW __attribute__ ((__noreturn__)); ++ + #if !defined NOT_IN_libc || defined IS_IN_rtld + hidden_proto (__assert_fail) + hidden_proto (__assert_perror_fail) +Index: glibc-2.12-2-gc4ccff1/include/stdlib.h +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/include/stdlib.h ++++ glibc-2.12-2-gc4ccff1/include/stdlib.h +@@ -223,16 +223,21 @@ extern int __qfcvt_r (long double __valu + # define __cxa_atexit(func, arg, d) INTUSE(__cxa_atexit) (func, arg, d) + # endif + +-#endif +- + extern void *__default_morecore (ptrdiff_t) __THROW; + libc_hidden_proto (__default_morecore) + +-extern char *__abort_msg; ++struct abort_msg_s ++{ ++ unsigned int size; ++ char msg[0]; ++}; ++extern struct abort_msg_s *__abort_msg; + libc_hidden_proto (__abort_msg) + + __END_DECLS + ++#endif ++ + #undef __Need_M_And_C + + #endif /* include/stdlib.h */ +Index: glibc-2.12-2-gc4ccff1/stdlib/abort.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/stdlib/abort.c ++++ glibc-2.12-2-gc4ccff1/stdlib/abort.c +@@ -37,7 +37,7 @@ + #endif + + /* Exported variable to locate abort message in core files etc. */ +-char *__abort_msg __attribute__ ((nocommon)); ++struct abort_msg_s *__abort_msg __attribute__ ((nocommon)); + libc_hidden_def (__abort_msg) + + /* We must avoid to run in circles. Therefore we remember how far we +Index: glibc-2.12-2-gc4ccff1/sysdeps/posix/libc_fatal.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/sysdeps/posix/libc_fatal.c ++++ glibc-2.12-2-gc4ccff1/sysdeps/posix/libc_fatal.c +@@ -20,6 +20,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -125,18 +126,28 @@ __libc_message (int do_abort, const char + if (TEMP_FAILURE_RETRY (__writev (fd, iov, nlist)) == total) + written = true; + +- char *buf = do_abort ? malloc (total + 1) : NULL; +- if (buf != NULL) ++ if (do_abort) + { +- char *wp = buf; +- for (int cnt = 0; cnt < nlist; ++cnt) +- wp = mempcpy (wp, iov[cnt].iov_base, iov[cnt].iov_len); +- *wp = '\0'; +- +- /* We have to free the old buffer since the application might +- catch the SIGABRT signal. */ +- char *old = atomic_exchange_acq (&__abort_msg, buf); +- free (old); ++ total = ((total + 1 + GLRO(dl_pagesize) - 1) ++ & ~(GLRO(dl_pagesize) - 1)); ++ struct abort_msg_s *buf = __mmap (NULL, total, ++ PROT_READ | PROT_WRITE, ++ MAP_ANON | MAP_PRIVATE, -1, 0); ++ if (buf != MAP_FAILED) ++ { ++ buf->size = total; ++ char *wp = buf->msg; ++ for (int cnt = 0; cnt < nlist; ++cnt) ++ wp = mempcpy (wp, iov[cnt].iov_base, iov[cnt].iov_len); ++ *wp = '\0'; ++ ++ /* We have to free the old buffer since the application might ++ catch the SIGABRT signal. */ ++ struct abort_msg_s *old = atomic_exchange_acq (&__abort_msg, ++ buf); ++ if (old != NULL) ++ __munmap (old, old->size); ++ } + } + } + +Index: glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/libc_fatal.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/sysdeps/unix/sysv/linux/libc_fatal.c ++++ glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/libc_fatal.c +@@ -20,6 +20,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -28,6 +29,7 @@ + #include + #include + #include ++#include + #include + #include + +@@ -134,18 +136,28 @@ __libc_message (int do_abort, const char + if (cnt == total) + written = true; + +- char *buf = do_abort ? malloc (total + 1) : NULL; +- if (buf != NULL) ++ if (do_abort) + { +- char *wp = buf; +- for (int cnt = 0; cnt < nlist; ++cnt) +- wp = mempcpy (wp, iov[cnt].iov_base, iov[cnt].iov_len); +- *wp = '\0'; +- +- /* We have to free the old buffer since the application might +- catch the SIGABRT signal. */ +- char *old = atomic_exchange_acq (&__abort_msg, buf); +- free (old); ++ total = ((total + 1 + GLRO(dl_pagesize) - 1) ++ & ~(GLRO(dl_pagesize) - 1)); ++ struct abort_msg_s *buf = __mmap (NULL, total, ++ PROT_READ | PROT_WRITE, ++ MAP_ANON | MAP_PRIVATE, -1, 0); ++ if (__builtin_expect (buf != MAP_FAILED, 1)) ++ { ++ buf->size = total; ++ char *wp = buf->msg; ++ for (int cnt = 0; cnt < nlist; ++cnt) ++ wp = mempcpy (wp, iov[cnt].iov_base, iov[cnt].iov_len); ++ *wp = '\0'; ++ ++ /* We have to free the old buffer since the application might ++ catch the SIGABRT signal. */ ++ struct abort_msg_s *old = atomic_exchange_acq (&__abort_msg, ++ buf); ++ if (old != NULL) ++ __munmap (old, old->size); ++ } + } + } + diff --git a/SOURCES/glibc-rh681054.patch b/SOURCES/glibc-rh681054.patch new file mode 100644 index 0000000..27b7361 --- /dev/null +++ b/SOURCES/glibc-rh681054.patch @@ -0,0 +1,514 @@ +2011-03-18 Ulrich Drepper + + * posix/fnmatch.c (fnmatch): Check size of pattern in wide + character representation. + Partly based on a patch by Tomas Hoger . + +2010-11-11 Andreas Schwab + + * 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 + + [BZ #11883] + * posix/fnmatch.c: Keep track of alloca use and fall back on malloc. + * posix/fnmatch_loop.c: Likewise. + +Index: glibc-2.12-2-gc4ccff1/posix/Makefile +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/posix/Makefile ++++ glibc-2.12-2-gc4ccff1/posix/Makefile +@@ -114,7 +114,8 @@ generated := $(addprefix wordexp-test-re + 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 + +@@ -226,7 +227,7 @@ ifeq (no,$(cross-compiling)) + tests: $(objpfx)bug-regex2-mem $(objpfx)bug-regex14-mem \ + $(objpfx)bug-regex21-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 + +@@ -238,6 +239,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 +Index: glibc-2.12-2-gc4ccff1/posix/fnmatch.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/posix/fnmatch.c ++++ glibc-2.12-2-gc4ccff1/posix/fnmatch.c +@@ -41,6 +41,12 @@ + # include + #endif + ++#ifdef _LIBC ++# include ++#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,16 @@ 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)); ++ if (__builtin_expect (n >= (size_t) -1 / sizeof (wchar_t), 0)) ++ { ++ __set_errno (ENOMEM); ++ return -2; ++ } ++ 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 +397,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 +423,38 @@ 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; ++ if (__builtin_expect (n >= (size_t) -1 / sizeof (wchar_t), 0)) ++ { ++ free (wpattern_malloc); ++ __set_errno (ENOMEM); ++ return -2; ++ } ++ ++ 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 +Index: glibc-2.12-2-gc4ccff1/posix/fnmatch_loop.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/posix/fnmatch_loop.c ++++ glibc-2.12-2-gc4ccff1/posix/fnmatch_loop.c +@@ -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_lea + 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_lea + 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_lea + + 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_lea + ++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_lea + 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_lea + _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_lea + 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 + /* 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 + /* 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 + 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 + 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 + ? 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 + : (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 + 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 + 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 + ? 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; + } + + +Index: glibc-2.12-2-gc4ccff1/posix/tst-fnmatch.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/posix/tst-fnmatch.c ++++ glibc-2.12-2-gc4ccff1/posix/tst-fnmatch.c +@@ -25,6 +25,7 @@ + #include + #include + #include ++#include + + + 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/SOURCES/glibc-rh688720.patch b/SOURCES/glibc-rh688720.patch new file mode 100644 index 0000000..0c86f25 --- /dev/null +++ b/SOURCES/glibc-rh688720.patch @@ -0,0 +1,1638 @@ +2011-11-11 Ulrich Drepper + + [BZ #13147] + * locales/de_AT: Use de_DE for LC_NUMERIC. + * locales/es_BO: Use es_ES for LC_MESSAGES and LC_NUMERIC. + * locales/es_CL: Likewise. + * locales/es_CO: Likewise. + * locales/es_DO: Likewise. + * locales/es_EC: Likewise. + * locales/es_GT: Likewise. + * locales/es_HN: Likewise. + * locales/es_MX: Likewise. + * locales/es_NI: Likewise. + * locales/es_PA: Likewise. + * locales/es_PE: Likewise. + * locales/es_PR: Likewise. + * locales/es_PY: Likewise. + * locales/es_SV: Likewise. + * locales/es_UY: Likewise. + * locales/es_VE: Likewise. + * locales/es_ES: Fix LC_NUMERIC. + * locales/es_CR: Use es_ES for LC_MESSAGES. + * locales/fr_BE: Actually use grouping in LC_NUMERIC. + * locales/fr_CA: Use fr_FR for LC_MESSAGES and LC_NUMERIC. + * locales/fr_CH: Use de_CH for LC_NUMERIC. + * locales/fr_LU: Use same grouping in LC_NUMERIC as in LC_MONETARY. + +2010-05-17 Andreas Schwab + + * locales/es_CR (LC_ADDRESS): Fix character names in lang_ab. + +Index: glibc-2.12-2-gc4ccff1/localedata/locales/de_AT +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/localedata/locales/de_AT ++++ glibc-2.12-2-gc4ccff1/localedata/locales/de_AT +@@ -78,41 +78,39 @@ n_sign_posn 1 + END LC_MONETARY + + LC_NUMERIC +-decimal_point "" +-thousands_sep "" +-grouping 0;0 ++copy "de_DE" + END LC_NUMERIC + + LC_TIME + abday "";"";/ +- "";"";/ +- "";"";/ +- "" ++ "";"";/ ++ "";"";/ ++ "" + day "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "" ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "" + abmon "";"";/ +- "";"";/ +- "";"";/ +- "";"";/ +- "";"";/ +- "";"" ++ "";"";/ ++ "";"";/ ++ "";"";/ ++ "";"";/ ++ "";"" + mon "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "" ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "" + d_t_fmt "" + d_fmt "" + t_fmt "" +Index: glibc-2.12-2-gc4ccff1/localedata/locales/es_BO +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/localedata/locales/es_BO ++++ glibc-2.12-2-gc4ccff1/localedata/locales/es_BO +@@ -56,8 +56,7 @@ copy "es_ES" + END LC_CTYPE + + LC_MESSAGES +-yesexpr "" +-noexpr "" ++copy "es_ES" + END LC_MESSAGES + + LC_MONETARY +@@ -79,41 +78,39 @@ n_sign_posn 1 + END LC_MONETARY + + LC_NUMERIC +-decimal_point "" +-thousands_sep "" +-grouping 0;0 ++copy "es_ES" + END LC_NUMERIC + + LC_TIME + abday "";"";/ +- "";"";/ +- "";"";/ +- "" ++ "";"";/ ++ "";"";/ ++ "" + day "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "" ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "" + abmon "";"";/ +- "";"";/ +- "";"";/ +- "";"";/ +- "";"";/ +- "";"" ++ "";"";/ ++ "";"";/ ++ "";"";/ ++ "";"";/ ++ "";"" + mon "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "" ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "" + d_t_fmt "" + d_fmt "" + t_fmt "" +Index: glibc-2.12-2-gc4ccff1/localedata/locales/es_CL +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/localedata/locales/es_CL ++++ glibc-2.12-2-gc4ccff1/localedata/locales/es_CL +@@ -56,8 +56,7 @@ copy "es_ES" + END LC_CTYPE + + LC_MESSAGES +-yesexpr "" +-noexpr "" ++copy "es_ES" + END LC_MESSAGES + + LC_MONETARY +@@ -79,41 +78,39 @@ n_sign_posn 1 + END LC_MONETARY + + LC_NUMERIC +-decimal_point "" +-thousands_sep "" +-grouping 0;0 ++copy "es_ES" + END LC_NUMERIC + + LC_TIME + abday "";"";/ +- "";"";/ +- "";"";/ +- "" ++ "";"";/ ++ "";"";/ ++ "" + day "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "" ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "" + abmon "";"";/ +- "";"";/ +- "";"";/ +- "";"";/ +- "";"";/ +- "";"" ++ "";"";/ ++ "";"";/ ++ "";"";/ ++ "";"";/ ++ "";"" + mon "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "" ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "" + d_t_fmt "" + d_fmt "" + t_fmt "" +Index: glibc-2.12-2-gc4ccff1/localedata/locales/es_CO +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/localedata/locales/es_CO ++++ glibc-2.12-2-gc4ccff1/localedata/locales/es_CO +@@ -56,8 +56,7 @@ copy "es_ES" + END LC_CTYPE + + LC_MESSAGES +-yesexpr "" +-noexpr "" ++copy "es_ES" + END LC_MESSAGES + + LC_MONETARY +@@ -79,41 +78,39 @@ n_sign_posn 1 + END LC_MONETARY + + LC_NUMERIC +-decimal_point "" +-thousands_sep "" +-grouping 0;0 ++copy "es_ES" + END LC_NUMERIC + + LC_TIME + abday "";"";/ +- "";"";/ +- "";"";/ +- "" ++ "";"";/ ++ "";"";/ ++ "" + day "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "" ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "" + abmon "";"";/ +- "";"";/ +- "";"";/ +- "";"";/ +- "";"";/ +- "";"" ++ "";"";/ ++ "";"";/ ++ "";"";/ ++ "";"";/ ++ "";"" + mon "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "" ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "" + d_t_fmt "" + d_fmt "" + t_fmt "" +Index: glibc-2.12-2-gc4ccff1/localedata/locales/es_CR +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/localedata/locales/es_CR ++++ glibc-2.12-2-gc4ccff1/localedata/locales/es_CR +@@ -47,8 +47,7 @@ copy "es_ES" + END LC_CTYPE + + LC_MESSAGES +-yesexpr "" +-noexpr "" ++copy "es_ES" + END LC_MESSAGES + + LC_MONETARY +@@ -79,34 +78,34 @@ END LC_NUMERIC + + LC_TIME + abday "";"";/ +- "";"";/ +- "";"";/ +- "" ++ "";"";/ ++ "";"";/ ++ "" + day "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "" ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "" + abmon "";"";/ +- "";"";/ +- "";"";/ +- "";"";/ +- "";"";/ +- "";"" ++ "";"";/ ++ "";"";/ ++ "";"";/ ++ "";"";/ ++ "";"" + mon "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "" ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "" + d_t_fmt "" + d_fmt "" + t_fmt "" +@@ -157,7 +156,7 @@ country_post "" + country_car "" + country_isbn "9930,9977,9968" + lang_name "" +-lang_ab "<0065><0073>" ++lang_ab "" + lang_term "" + country_ab2 "" + country_ab3 "" +Index: glibc-2.12-2-gc4ccff1/localedata/locales/es_DO +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/localedata/locales/es_DO ++++ glibc-2.12-2-gc4ccff1/localedata/locales/es_DO +@@ -56,8 +56,7 @@ copy "es_ES" + END LC_CTYPE + + LC_MESSAGES +-yesexpr "" +-noexpr "" ++copy "es_ES" + END LC_MESSAGES + + LC_MONETARY +@@ -79,41 +78,39 @@ n_sign_posn 1 + END LC_MONETARY + + LC_NUMERIC +-decimal_point "" +-thousands_sep "" +-grouping 0;0 ++copy "es_ES" + END LC_NUMERIC + + LC_TIME + abday "";"";/ +- "";"";/ +- "";"";/ +- "" ++ "";"";/ ++ "";"";/ ++ "" + day "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "" ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "" + abmon "";"";/ +- "";"";/ +- "";"";/ +- "";"";/ +- "";"";/ +- "";"" ++ "";"";/ ++ "";"";/ ++ "";"";/ ++ "";"";/ ++ "";"" + mon "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "" ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "" + d_t_fmt "" + d_fmt "" + t_fmt "" +Index: glibc-2.12-2-gc4ccff1/localedata/locales/es_EC +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/localedata/locales/es_EC ++++ glibc-2.12-2-gc4ccff1/localedata/locales/es_EC +@@ -56,8 +56,7 @@ copy "es_ES" + END LC_CTYPE + + LC_MESSAGES +-yesexpr "" +-noexpr "" ++copy "es_ES" + END LC_MESSAGES + + LC_MONETARY +@@ -79,41 +78,39 @@ n_sign_posn 1 + END LC_MONETARY + + LC_NUMERIC +-decimal_point "" +-thousands_sep "" +-grouping 0;0 ++copy "es_ES" + END LC_NUMERIC + + LC_TIME + abday "";"";/ +- "";"";/ +- "";"";/ +- "" ++ "";"";/ ++ "";"";/ ++ "" + day "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "" ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "" + abmon "";"";/ +- "";"";/ +- "";"";/ +- "";"";/ +- "";"";/ +- "";"" ++ "";"";/ ++ "";"";/ ++ "";"";/ ++ "";"";/ ++ "";"" + mon "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "" ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "" + d_t_fmt "" + d_fmt "" + t_fmt "" +Index: glibc-2.12-2-gc4ccff1/localedata/locales/es_ES +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/localedata/locales/es_ES ++++ glibc-2.12-2-gc4ccff1/localedata/locales/es_ES +@@ -85,40 +85,40 @@ END LC_MONETARY + + LC_NUMERIC + decimal_point "" +-thousands_sep "" +-grouping 0;0 ++thousands_sep "" ++grouping 3;3 + END LC_NUMERIC + + LC_TIME + abday "";"";/ +- "";"";/ +- "";"";/ +- "" ++ "";"";/ ++ "";"";/ ++ "" + day "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "" ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "" + abmon "";"";/ +- "";"";/ +- "";"";/ +- "";"";/ +- "";"";/ +- "";"" ++ "";"";/ ++ "";"";/ ++ "";"";/ ++ "";"";/ ++ "";"" + mon "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "" ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "" + d_t_fmt "" + d_fmt "" + t_fmt "" +Index: glibc-2.12-2-gc4ccff1/localedata/locales/es_GT +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/localedata/locales/es_GT ++++ glibc-2.12-2-gc4ccff1/localedata/locales/es_GT +@@ -55,8 +55,7 @@ copy "es_ES" + END LC_CTYPE + + LC_MESSAGES +-yesexpr "" +-noexpr "" ++copy "es_ES" + END LC_MESSAGES + + LC_MONETARY +@@ -78,9 +77,7 @@ n_sign_posn 1 + END LC_MONETARY + + LC_NUMERIC +-decimal_point "" +-thousands_sep "" +-grouping 0;0 ++copy "es_ES" + END LC_NUMERIC + + LC_TIME +Index: glibc-2.12-2-gc4ccff1/localedata/locales/es_HN +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/localedata/locales/es_HN ++++ glibc-2.12-2-gc4ccff1/localedata/locales/es_HN +@@ -56,8 +56,7 @@ copy "es_ES" + END LC_CTYPE + + LC_MESSAGES +-yesexpr "" +-noexpr "" ++copy "es_ES" + END LC_MESSAGES + + LC_MONETARY +@@ -79,41 +78,39 @@ n_sign_posn 1 + END LC_MONETARY + + LC_NUMERIC +-decimal_point "" +-thousands_sep "" +-grouping 0;0 ++copy "es_ES" + END LC_NUMERIC + + LC_TIME + abday "";"";/ +- "";"";/ +- "";"";/ +- "" ++ "";"";/ ++ "";"";/ ++ "" + day "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "" ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "" + abmon "";"";/ +- "";"";/ +- "";"";/ +- "";"";/ +- "";"";/ +- "";"" ++ "";"";/ ++ "";"";/ ++ "";"";/ ++ "";"";/ ++ "";"" + mon "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "" ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "" + d_t_fmt "" + d_fmt "" + t_fmt "" +Index: glibc-2.12-2-gc4ccff1/localedata/locales/es_MX +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/localedata/locales/es_MX ++++ glibc-2.12-2-gc4ccff1/localedata/locales/es_MX +@@ -56,8 +56,7 @@ copy "es_ES" + END LC_CTYPE + + LC_MESSAGES +-yesexpr "" +-noexpr "" ++copy "es_ES" + END LC_MESSAGES + + LC_MONETARY +@@ -79,41 +78,39 @@ n_sign_posn 1 + END LC_MONETARY + + LC_NUMERIC +-decimal_point "" +-thousands_sep "" +-grouping 0;0 ++copy "es_ES" + END LC_NUMERIC + + LC_TIME + abday "";"";/ +- "";"";/ +- "";"";/ +- "" ++ "";"";/ ++ "";"";/ ++ "" + day "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "" ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "" + abmon "";"";/ +- "";"";/ +- "";"";/ +- "";"";/ +- "";"";/ +- "";"" ++ "";"";/ ++ "";"";/ ++ "";"";/ ++ "";"";/ ++ "";"" + mon "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "" ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "" + d_t_fmt "" + d_fmt "" + t_fmt "" +Index: glibc-2.12-2-gc4ccff1/localedata/locales/es_NI +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/localedata/locales/es_NI ++++ glibc-2.12-2-gc4ccff1/localedata/locales/es_NI +@@ -47,8 +47,7 @@ copy "es_ES" + END LC_CTYPE + + LC_MESSAGES +-yesexpr "" +-noexpr "" ++copy "es_ES" + END LC_MESSAGES + + LC_MONETARY +@@ -70,9 +69,7 @@ n_sign_posn 1 + END LC_MONETARY + + LC_NUMERIC +-decimal_point "" +-thousands_sep "" +-grouping 0;0 ++copy "es_ES" + END LC_NUMERIC + + LC_TIME +Index: glibc-2.12-2-gc4ccff1/localedata/locales/es_PA +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/localedata/locales/es_PA ++++ glibc-2.12-2-gc4ccff1/localedata/locales/es_PA +@@ -56,8 +56,7 @@ copy "es_ES" + END LC_CTYPE + + LC_MESSAGES +-yesexpr "" +-noexpr "" ++copy "es_ES" + END LC_MESSAGES + + LC_MONETARY +@@ -79,41 +78,39 @@ n_sign_posn 1 + END LC_MONETARY + + LC_NUMERIC +-decimal_point "" +-thousands_sep "" +-grouping 0;0 ++copy "es_ES" + END LC_NUMERIC + + LC_TIME + abday "";"";/ +- "";"";/ +- "";"";/ +- "" ++ "";"";/ ++ "";"";/ ++ "" + day "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "" ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "" + abmon "";"";/ +- "";"";/ +- "";"";/ +- "";"";/ +- "";"";/ +- "";"" ++ "";"";/ ++ "";"";/ ++ "";"";/ ++ "";"";/ ++ "";"" + mon "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "" ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "" + d_t_fmt "" + d_fmt "" + t_fmt "" +Index: glibc-2.12-2-gc4ccff1/localedata/locales/es_PE +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/localedata/locales/es_PE ++++ glibc-2.12-2-gc4ccff1/localedata/locales/es_PE +@@ -56,8 +56,7 @@ copy "es_ES" + END LC_CTYPE + + LC_MESSAGES +-yesexpr "" +-noexpr "" ++copy "es_ES" + END LC_MESSAGES + + LC_MONETARY +@@ -79,41 +78,39 @@ n_sign_posn 1 + END LC_MONETARY + + LC_NUMERIC +-decimal_point "" +-thousands_sep "" +-grouping 0;0 ++copy "es_ES" + END LC_NUMERIC + + LC_TIME + abday "";"";/ +- "";"";/ +- "";"";/ +- "" ++ "";"";/ ++ "";"";/ ++ "" + day "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "" ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "" + abmon "";"";/ +- "";"";/ +- "";"";/ +- "";"";/ +- "";"";/ +- "";"" ++ "";"";/ ++ "";"";/ ++ "";"";/ ++ "";"";/ ++ "";"" + mon "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "" ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "" + d_t_fmt "" + d_fmt "" + t_fmt "" +Index: glibc-2.12-2-gc4ccff1/localedata/locales/es_PR +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/localedata/locales/es_PR ++++ glibc-2.12-2-gc4ccff1/localedata/locales/es_PR +@@ -47,8 +47,7 @@ copy "es_ES" + END LC_CTYPE + + LC_MESSAGES +-yesexpr "" +-noexpr "" ++copy "es_ES" + END LC_MESSAGES + + LC_MONETARY +@@ -70,41 +69,39 @@ n_sign_posn 1 + END LC_MONETARY + + LC_NUMERIC +-decimal_point "" +-thousands_sep "" +-grouping 0;0 ++copy "es_ES" + END LC_NUMERIC + + LC_TIME + abday "";"";/ +- "";"";/ +- "";"";/ +- "" ++ "";"";/ ++ "";"";/ ++ "" + day "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "" ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "" + abmon "";"";/ +- "";"";/ +- "";"";/ +- "";"";/ +- "";"";/ +- "";"" ++ "";"";/ ++ "";"";/ ++ "";"";/ ++ "";"";/ ++ "";"" + mon "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "" ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "" + d_t_fmt "" + d_fmt "" + t_fmt "" +Index: glibc-2.12-2-gc4ccff1/localedata/locales/es_PY +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/localedata/locales/es_PY ++++ glibc-2.12-2-gc4ccff1/localedata/locales/es_PY +@@ -56,8 +56,7 @@ copy "es_ES" + END LC_CTYPE + + LC_MESSAGES +-yesexpr "" +-noexpr "" ++copy "es_ES" + END LC_MESSAGES + + LC_MONETARY +@@ -79,41 +78,39 @@ n_sign_posn 1 + END LC_MONETARY + + LC_NUMERIC +-decimal_point "" +-thousands_sep "" +-grouping 0;0 ++copy "es_ES" + END LC_NUMERIC + + LC_TIME + abday "";"";/ +- "";"";/ +- "";"";/ +- "" ++ "";"";/ ++ "";"";/ ++ "" + day "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "" ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "" + abmon "";"";/ +- "";"";/ +- "";"";/ +- "";"";/ +- "";"";/ +- "";"" ++ "";"";/ ++ "";"";/ ++ "";"";/ ++ "";"";/ ++ "";"" + mon "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "" ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "" + d_t_fmt "" + d_fmt "" + t_fmt "" +Index: glibc-2.12-2-gc4ccff1/localedata/locales/es_SV +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/localedata/locales/es_SV ++++ glibc-2.12-2-gc4ccff1/localedata/locales/es_SV +@@ -56,8 +56,7 @@ copy "es_ES" + END LC_CTYPE + + LC_MESSAGES +-yesexpr "" +-noexpr "" ++copy "es_ES" + END LC_MESSAGES + + LC_MONETARY +@@ -79,9 +78,7 @@ n_sign_posn 1 + END LC_MONETARY + + LC_NUMERIC +-decimal_point "" +-thousands_sep "" +-grouping 0;0 ++copy "es_ES" + END LC_NUMERIC + + LC_TIME +Index: glibc-2.12-2-gc4ccff1/localedata/locales/es_UY +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/localedata/locales/es_UY ++++ glibc-2.12-2-gc4ccff1/localedata/locales/es_UY +@@ -56,8 +56,7 @@ copy "es_ES" + END LC_CTYPE + + LC_MESSAGES +-yesexpr "" +-noexpr "" ++copy "es_ES" + END LC_MESSAGES + + LC_MONETARY +@@ -79,41 +78,39 @@ n_sign_posn 1 + END LC_MONETARY + + LC_NUMERIC +-decimal_point "" +-thousands_sep "" +-grouping 0;0 ++copy "es_ES" + END LC_NUMERIC + + LC_TIME + abday "";"";/ +- "";"";/ +- "";"";/ +- "" ++ "";"";/ ++ "";"";/ ++ "" + day "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "" ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "" + abmon "";"";/ +- "";"";/ +- "";"";/ +- "";"";/ +- "";"";/ +- "";"" ++ "";"";/ ++ "";"";/ ++ "";"";/ ++ "";"";/ ++ "";"" + mon "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "" ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "" + d_t_fmt "" + d_fmt "" + t_fmt "" +Index: glibc-2.12-2-gc4ccff1/localedata/locales/es_VE +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/localedata/locales/es_VE ++++ glibc-2.12-2-gc4ccff1/localedata/locales/es_VE +@@ -56,8 +56,7 @@ copy "es_ES" + END LC_CTYPE + + LC_MESSAGES +-yesexpr "" +-noexpr "" ++copy "es_ES" + END LC_MESSAGES + + LC_MONETARY +@@ -79,41 +78,39 @@ n_sign_posn 1 + END LC_MONETARY + + LC_NUMERIC +-decimal_point "" +-thousands_sep "" +-grouping 0;0 ++copy "es_ES" + END LC_NUMERIC + + LC_TIME + abday "";"";/ +- "";"";/ +- "";"";/ +- "" ++ "";"";/ ++ "";"";/ ++ "" + day "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "" ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "" + abmon "";"";/ +- "";"";/ +- "";"";/ +- "";"";/ +- "";"";/ +- "";"" ++ "";"";/ ++ "";"";/ ++ "";"";/ ++ "";"";/ ++ "";"" + mon "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "" ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "" + d_t_fmt "" + d_fmt "" + t_fmt "" +Index: glibc-2.12-2-gc4ccff1/localedata/locales/fr_BE +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/localedata/locales/fr_BE ++++ glibc-2.12-2-gc4ccff1/localedata/locales/fr_BE +@@ -79,7 +79,7 @@ END LC_MONETARY + LC_NUMERIC + decimal_point "" + thousands_sep "" +-grouping 0;0 ++grouping 3;3 + END LC_NUMERIC + + LC_TIME +Index: glibc-2.12-2-gc4ccff1/localedata/locales/fr_CA +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/localedata/locales/fr_CA ++++ glibc-2.12-2-gc4ccff1/localedata/locales/fr_CA +@@ -55,8 +55,7 @@ copy "en_CA" + END LC_COLLATE + + LC_MESSAGES +-yesexpr "" +-noexpr "" ++copy "fr_FR" + END LC_MESSAGES + + LC_MONETARY +@@ -78,41 +77,39 @@ n_sign_posn 0 + END LC_MONETARY + + LC_NUMERIC +-decimal_point "" +-thousands_sep "" +-grouping 0;0 ++copy "fr_FR" + END LC_NUMERIC + + LC_TIME + abday "";"";/ +- "";"";/ +- "";"";/ +- "" ++ "";"";/ ++ "";"";/ ++ "" + day "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "" ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "" + abmon "";"";/ +- "";"";/ +- "";"";/ +- "";"";/ +- "";"";/ +- "";"" ++ "";"";/ ++ "";"";/ ++ "";"";/ ++ "";"";/ ++ "";"" + mon "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "" ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "" + d_t_fmt "" + d_fmt "" + t_fmt "" +Index: glibc-2.12-2-gc4ccff1/localedata/locales/fr_CH +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/localedata/locales/fr_CH ++++ glibc-2.12-2-gc4ccff1/localedata/locales/fr_CH +@@ -64,41 +64,39 @@ copy "de_CH" + END LC_MONETARY + + LC_NUMERIC +-decimal_point "" +-thousands_sep "" +-grouping 0;0 ++copy "de_CH" + END LC_NUMERIC + + LC_TIME + abday "";"";/ +- "";"";/ +- "";"";/ +- "" ++ "";"";/ ++ "";"";/ ++ "" + day "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "" ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "" + abmon "";"";/ +- "";"";/ +- "";"";/ +- "";"";/ +- "";"";/ +- "";"" ++ "";"";/ ++ "";"";/ ++ "";"";/ ++ "";"";/ ++ "";"" + mon "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "" ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "" + d_t_fmt "" + d_fmt "" + t_fmt "" +Index: glibc-2.12-2-gc4ccff1/localedata/locales/fr_LU +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/localedata/locales/fr_LU ++++ glibc-2.12-2-gc4ccff1/localedata/locales/fr_LU +@@ -78,40 +78,40 @@ END LC_MONETARY + + LC_NUMERIC + decimal_point "" +-thousands_sep "" +-grouping 0;0 ++thousands_sep "" ++grouping 3;3 + END LC_NUMERIC + + LC_TIME + abday "";"";/ +- "";"";/ +- "";"";/ +- "" ++ "";"";/ ++ "";"";/ ++ "" + day "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "" ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "" + abmon "";"";/ +- "";"";/ +- "";"";/ +- "";"";/ +- "";"";/ +- "";"" ++ "";"";/ ++ "";"";/ ++ "";"";/ ++ "";"";/ ++ "";"" + mon "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "";/ +- "" ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "" + d_t_fmt "" + d_fmt "" + t_fmt "" diff --git a/SOURCES/glibc-rh688980.patch b/SOURCES/glibc-rh688980.patch new file mode 100644 index 0000000..ce98926 --- /dev/null +++ b/SOURCES/glibc-rh688980.patch @@ -0,0 +1,20 @@ +2011-05-11 Ulrich Drepper + + [BZ #12625] + * misc/mntent_r.c (addmntent): Flush the stream after the output + +Index: glibc-2.12-2-gc4ccff1/misc/mntent_r.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/misc/mntent_r.c ++++ glibc-2.12-2-gc4ccff1/misc/mntent_r.c +@@ -263,8 +263,8 @@ __addmntent (FILE *stream, const struct + mntcopy.mnt_type, + mntcopy.mnt_opts, + mntcopy.mnt_freq, +- mntcopy.mnt_passno) +- < 0 ? 1 : 0); ++ mntcopy.mnt_passno) < 0 ++ || fflush (stream) != 0); + } + weak_alias (__addmntent, addmntent) + diff --git a/SOURCES/glibc-rh689471.patch b/SOURCES/glibc-rh689471.patch new file mode 100644 index 0000000..4c7fc8a --- /dev/null +++ b/SOURCES/glibc-rh689471.patch @@ -0,0 +1,333 @@ +2011-03-20 H.J. Lu + + [BZ #12597] + * string/test-strncmp.c (do_page_test): New function. + (check2): Likewise. + (test_main): Call check2. + * sysdeps/x86_64/multiarch/strcmp.S: Properly cross page boundary. + +Index: glibc-2.12-2-gc4ccff1/string/test-strncmp.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/string/test-strncmp.c ++++ glibc-2.12-2-gc4ccff1/string/test-strncmp.c +@@ -200,6 +200,27 @@ do_test (size_t align1, size_t align2, s + } + + static void ++do_page_test (size_t offset1, size_t offset2, char *s2) ++{ ++ char *s1; ++ int exp_result; ++ ++ if (offset1 >= page_size || offset2 >= page_size) ++ return; ++ ++ s1 = (char *) (buf1 + offset1); ++ s2 += offset2; ++ ++ exp_result= *s1; ++ ++ FOR_EACH_IMPL (impl, 0) ++ { ++ check_result (impl, s1, s2, page_size, -exp_result); ++ check_result (impl, s2, s1, page_size, exp_result); ++ } ++} ++ ++static void + do_random_tests (void) + { + size_t i, j, n, align1, align2, pos, len1, len2, size; +@@ -312,6 +333,25 @@ check1 (void) + } + } + ++static void ++check2 (void) ++{ ++ size_t i; ++ char *s1, *s2; ++ ++ s1 = (char *) buf1; ++ for (i = 0; i < page_size - 1; i++) ++ s1[i] = 23; ++ s1[i] = 0; ++ ++ s2 = strdup (s1); ++ ++ for (i = 0; i < 64; ++i) ++ do_page_test (3990 + i, 2635, s2); ++ ++ free (s2); ++} ++ + int + test_main (void) + { +@@ -320,6 +360,7 @@ test_main (void) + test_init (); + + check1 (); ++ check2 (); + + printf ("%23s", ""); + FOR_EACH_IMPL (impl, 0) +Index: glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/strcmp.S +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/sysdeps/x86_64/multiarch/strcmp.S ++++ glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/strcmp.S +@@ -452,6 +452,7 @@ LABEL(loop_ashr_1_use_sse4_2): + add $16, %r10 + jg LABEL(nibble_ashr_1_use_sse4_2) + ++LABEL(nibble_ashr_1_use_sse4_2_restart): + movdqa (%rdi, %rdx), %xmm0 + palignr $1, -16(%rdi, %rdx), %xmm0 + # if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L +@@ -499,7 +500,7 @@ LABEL(nibble_ashr_1_use_sse4_2): + jae LABEL(nibble_ashr_use_sse4_2_exit) + # endif + cmp $14, %ecx +- ja LABEL(loop_ashr_1_use_sse4_2) ++ ja LABEL(nibble_ashr_1_use_sse4_2_restart) + + jmp LABEL(nibble_ashr_use_sse4_2_exit) + +@@ -544,6 +545,7 @@ LABEL(loop_ashr_2_use_sse4_2): + add $16, %r10 + jg LABEL(nibble_ashr_2_use_sse4_2) + ++LABEL(nibble_ashr_2_use_sse4_2_restart): + movdqa (%rdi, %rdx), %xmm0 + palignr $2, -16(%rdi, %rdx), %xmm0 + # if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L +@@ -591,7 +593,7 @@ LABEL(nibble_ashr_2_use_sse4_2): + jae LABEL(nibble_ashr_use_sse4_2_exit) + # endif + cmp $13, %ecx +- ja LABEL(loop_ashr_2_use_sse4_2) ++ ja LABEL(nibble_ashr_2_use_sse4_2_restart) + + jmp LABEL(nibble_ashr_use_sse4_2_exit) + +@@ -636,6 +638,7 @@ LABEL(loop_ashr_3_use_sse4_2): + add $16, %r10 + jg LABEL(nibble_ashr_3_use_sse4_2) + ++LABEL(nibble_ashr_3_use_sse4_2_restart): + movdqa (%rdi, %rdx), %xmm0 + palignr $3, -16(%rdi, %rdx), %xmm0 + # if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L +@@ -683,7 +686,7 @@ LABEL(nibble_ashr_3_use_sse4_2): + jae LABEL(nibble_ashr_use_sse4_2_exit) + # endif + cmp $12, %ecx +- ja LABEL(loop_ashr_3_use_sse4_2) ++ ja LABEL(nibble_ashr_3_use_sse4_2_restart) + + jmp LABEL(nibble_ashr_use_sse4_2_exit) + +@@ -729,6 +732,7 @@ LABEL(loop_ashr_4_use_sse4_2): + add $16, %r10 + jg LABEL(nibble_ashr_4_use_sse4_2) + ++LABEL(nibble_ashr_4_use_sse4_2_restart): + movdqa (%rdi, %rdx), %xmm0 + palignr $4, -16(%rdi, %rdx), %xmm0 + # if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L +@@ -776,7 +780,7 @@ LABEL(nibble_ashr_4_use_sse4_2): + jae LABEL(nibble_ashr_use_sse4_2_exit) + # endif + cmp $11, %ecx +- ja LABEL(loop_ashr_4_use_sse4_2) ++ ja LABEL(nibble_ashr_4_use_sse4_2_restart) + + jmp LABEL(nibble_ashr_use_sse4_2_exit) + +@@ -822,6 +826,7 @@ LABEL(loop_ashr_5_use_sse4_2): + add $16, %r10 + jg LABEL(nibble_ashr_5_use_sse4_2) + ++LABEL(nibble_ashr_5_use_sse4_2_restart): + movdqa (%rdi, %rdx), %xmm0 + palignr $5, -16(%rdi, %rdx), %xmm0 + # if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L +@@ -870,7 +875,7 @@ LABEL(nibble_ashr_5_use_sse4_2): + jae LABEL(nibble_ashr_use_sse4_2_exit) + # endif + cmp $10, %ecx +- ja LABEL(loop_ashr_5_use_sse4_2) ++ ja LABEL(nibble_ashr_5_use_sse4_2_restart) + + jmp LABEL(nibble_ashr_use_sse4_2_exit) + +@@ -916,6 +921,7 @@ LABEL(loop_ashr_6_use_sse4_2): + add $16, %r10 + jg LABEL(nibble_ashr_6_use_sse4_2) + ++LABEL(nibble_ashr_6_use_sse4_2_restart): + movdqa (%rdi, %rdx), %xmm0 + palignr $6, -16(%rdi, %rdx), %xmm0 + # if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L +@@ -963,7 +969,7 @@ LABEL(nibble_ashr_6_use_sse4_2): + jae LABEL(nibble_ashr_use_sse4_2_exit) + # endif + cmp $9, %ecx +- ja LABEL(loop_ashr_6_use_sse4_2) ++ ja LABEL(nibble_ashr_6_use_sse4_2_restart) + + jmp LABEL(nibble_ashr_use_sse4_2_exit) + +@@ -1009,6 +1015,7 @@ LABEL(loop_ashr_7_use_sse4_2): + add $16, %r10 + jg LABEL(nibble_ashr_7_use_sse4_2) + ++LABEL(nibble_ashr_7_use_sse4_2_restart): + movdqa (%rdi, %rdx), %xmm0 + palignr $7, -16(%rdi, %rdx), %xmm0 + # if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L +@@ -1056,7 +1063,7 @@ LABEL(nibble_ashr_7_use_sse4_2): + jae LABEL(nibble_ashr_use_sse4_2_exit) + # endif + cmp $8, %ecx +- ja LABEL(loop_ashr_7_use_sse4_2) ++ ja LABEL(nibble_ashr_7_use_sse4_2_restart) + + jmp LABEL(nibble_ashr_use_sse4_2_exit) + +@@ -1102,6 +1109,7 @@ LABEL(loop_ashr_8_use_sse4_2): + add $16, %r10 + jg LABEL(nibble_ashr_8_use_sse4_2) + ++LABEL(nibble_ashr_8_use_sse4_2_restart): + movdqa (%rdi, %rdx), %xmm0 + palignr $8, -16(%rdi, %rdx), %xmm0 + # if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L +@@ -1149,7 +1157,7 @@ LABEL(nibble_ashr_8_use_sse4_2): + jae LABEL(nibble_ashr_use_sse4_2_exit) + # endif + cmp $7, %ecx +- ja LABEL(loop_ashr_8_use_sse4_2) ++ ja LABEL(nibble_ashr_8_use_sse4_2_restart) + + jmp LABEL(nibble_ashr_use_sse4_2_exit) + +@@ -1195,6 +1203,7 @@ LABEL(loop_ashr_9_use_sse4_2): + add $16, %r10 + jg LABEL(nibble_ashr_9_use_sse4_2) + ++LABEL(nibble_ashr_9_use_sse4_2_restart): + movdqa (%rdi, %rdx), %xmm0 + + palignr $9, -16(%rdi, %rdx), %xmm0 +@@ -1243,7 +1252,7 @@ LABEL(nibble_ashr_9_use_sse4_2): + jae LABEL(nibble_ashr_use_sse4_2_exit) + # endif + cmp $6, %ecx +- ja LABEL(loop_ashr_9_use_sse4_2) ++ ja LABEL(nibble_ashr_9_use_sse4_2_restart) + + jmp LABEL(nibble_ashr_use_sse4_2_exit) + +@@ -1289,6 +1298,7 @@ LABEL(loop_ashr_10_use_sse4_2): + add $16, %r10 + jg LABEL(nibble_ashr_10_use_sse4_2) + ++LABEL(nibble_ashr_10_use_sse4_2_restart): + movdqa (%rdi, %rdx), %xmm0 + palignr $10, -16(%rdi, %rdx), %xmm0 + # if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L +@@ -1336,7 +1346,7 @@ LABEL(nibble_ashr_10_use_sse4_2): + jae LABEL(nibble_ashr_use_sse4_2_exit) + # endif + cmp $5, %ecx +- ja LABEL(loop_ashr_10_use_sse4_2) ++ ja LABEL(nibble_ashr_10_use_sse4_2_restart) + + jmp LABEL(nibble_ashr_use_sse4_2_exit) + +@@ -1382,6 +1392,7 @@ LABEL(loop_ashr_11_use_sse4_2): + add $16, %r10 + jg LABEL(nibble_ashr_11_use_sse4_2) + ++LABEL(nibble_ashr_11_use_sse4_2_restart): + movdqa (%rdi, %rdx), %xmm0 + palignr $11, -16(%rdi, %rdx), %xmm0 + # if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L +@@ -1429,7 +1440,7 @@ LABEL(nibble_ashr_11_use_sse4_2): + jae LABEL(nibble_ashr_use_sse4_2_exit) + # endif + cmp $4, %ecx +- ja LABEL(loop_ashr_11_use_sse4_2) ++ ja LABEL(nibble_ashr_11_use_sse4_2_restart) + + jmp LABEL(nibble_ashr_use_sse4_2_exit) + +@@ -1475,6 +1486,7 @@ LABEL(loop_ashr_12_use_sse4_2): + add $16, %r10 + jg LABEL(nibble_ashr_12_use_sse4_2) + ++LABEL(nibble_ashr_12_use_sse4_2_restart): + movdqa (%rdi, %rdx), %xmm0 + palignr $12, -16(%rdi, %rdx), %xmm0 + # if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L +@@ -1522,7 +1534,7 @@ LABEL(nibble_ashr_12_use_sse4_2): + jae LABEL(nibble_ashr_use_sse4_2_exit) + # endif + cmp $3, %ecx +- ja LABEL(loop_ashr_12_use_sse4_2) ++ ja LABEL(nibble_ashr_12_use_sse4_2_restart) + + jmp LABEL(nibble_ashr_use_sse4_2_exit) + +@@ -1569,6 +1581,7 @@ LABEL(loop_ashr_13_use_sse4_2): + add $16, %r10 + jg LABEL(nibble_ashr_13_use_sse4_2) + ++LABEL(nibble_ashr_13_use_sse4_2_restart): + movdqa (%rdi, %rdx), %xmm0 + palignr $13, -16(%rdi, %rdx), %xmm0 + # if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L +@@ -1616,7 +1629,7 @@ LABEL(nibble_ashr_13_use_sse4_2): + jae LABEL(nibble_ashr_use_sse4_2_exit) + # endif + cmp $2, %ecx +- ja LABEL(loop_ashr_13_use_sse4_2) ++ ja LABEL(nibble_ashr_13_use_sse4_2_restart) + + jmp LABEL(nibble_ashr_use_sse4_2_exit) + +@@ -1663,6 +1676,7 @@ LABEL(loop_ashr_14_use_sse4_2): + add $16, %r10 + jg LABEL(nibble_ashr_14_use_sse4_2) + ++LABEL(nibble_ashr_14_use_sse4_2_restart): + movdqa (%rdi, %rdx), %xmm0 + palignr $14, -16(%rdi, %rdx), %xmm0 + # if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L +@@ -1710,7 +1724,7 @@ LABEL(nibble_ashr_14_use_sse4_2): + jae LABEL(nibble_ashr_use_sse4_2_exit) + # endif + cmp $1, %ecx +- ja LABEL(loop_ashr_14_use_sse4_2) ++ ja LABEL(nibble_ashr_14_use_sse4_2_restart) + + jmp LABEL(nibble_ashr_use_sse4_2_exit) + +@@ -1759,6 +1773,7 @@ LABEL(loop_ashr_15_use_sse4_2): + add $16, %r10 + jg LABEL(nibble_ashr_15_use_sse4_2) + ++LABEL(nibble_ashr_15_use_sse4_2_restart): + movdqa (%rdi, %rdx), %xmm0 + palignr $15, -16(%rdi, %rdx), %xmm0 + # if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L +@@ -1806,7 +1821,7 @@ LABEL(nibble_ashr_15_use_sse4_2): + jae LABEL(nibble_ashr_use_sse4_2_exit) + # endif + cmp $0, %ecx +- ja LABEL(loop_ashr_15_use_sse4_2) ++ ja LABEL(nibble_ashr_15_use_sse4_2_restart) + + LABEL(nibble_ashr_use_sse4_2_exit): + # if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L diff --git a/SOURCES/glibc-rh692177.patch b/SOURCES/glibc-rh692177.patch new file mode 100644 index 0000000..1036769 --- /dev/null +++ b/SOURCES/glibc-rh692177.patch @@ -0,0 +1,137 @@ +2011-03-22 Ulrich Drepper + + * sysdeps/unix/sysv/linux/i386/sysconf.c (intel_check_word): Increment + round counter. + * sysdeps/x86_64/cacheinfo.c (intel_check_word): Likewise. + +2011-03-20 Ulrich Drepper + + [BZ #12587] + * sysdeps/unix/sysv/linux/i386/sysconf.c (intel_check_word): + Handle cache information in CPU leaf 4. + * sysdeps/x86_64/cacheinfo.c (intel_check_word): Likewise. + +Index: glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/i386/sysconf.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/sysdeps/unix/sysv/linux/i386/sysconf.c ++++ glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/i386/sysconf.c +@@ -186,6 +186,57 @@ intel_check_word (int name, unsigned int + /* No need to look further. */ + break; + } ++ else if (byte == 0xff) ++ { ++ /* CPUID leaf 0x4 contains all the information. We need to ++ iterate over it. */ ++ unsigned int eax; ++ unsigned int ebx; ++ unsigned int ecx; ++ unsigned int edx; ++ ++ unsigned int round = 0; ++ while (1) ++ { ++ asm volatile ("xchgl %%ebx, %1; cpuid; xchgl %%ebx, %1" ++ : "=a" (eax), "=r" (ebx), "=c" (ecx), "=d" (edx) ++ : "0" (4), "2" (round)); ++ ++ enum { null = 0, data = 1, inst = 2, uni = 3 } type = eax & 0x1f; ++ if (type == null) ++ /* That was the end. */ ++ break; ++ ++ unsigned int level = (eax >> 5) & 0x7; ++ ++ if ((level == 1 && type == data ++ && folded_rel_name == M(_SC_LEVEL1_DCACHE_SIZE)) ++ || (level == 1 && type == inst ++ && folded_rel_name == M(_SC_LEVEL1_ICACHE_SIZE)) ++ || (level == 2 && folded_rel_name == M(_SC_LEVEL2_CACHE_SIZE)) ++ || (level == 3 && folded_rel_name == M(_SC_LEVEL3_CACHE_SIZE)) ++ || (level == 4 && folded_rel_name == M(_SC_LEVEL4_CACHE_SIZE))) ++ { ++ unsigned int offset = M(name) - folded_rel_name; ++ ++ if (offset == 0) ++ /* Cache size. */ ++ return (((ebx >> 22) + 1) ++ * (((ebx >> 12) & 0x3ff) + 1) ++ * ((ebx & 0xfff) + 1) ++ * (ecx + 1)); ++ if (offset == 1) ++ return (ebx >> 22) + 1; ++ ++ assert (offset == 2); ++ return (ebx & 0xfff) + 1; ++ } ++ ++ ++round; ++ } ++ /* There is no other cache information anywhere else. */ ++ break; ++ } + else + { + if (byte == 0x49 && folded_rel_name == M(_SC_LEVEL3_CACHE_SIZE)) +Index: glibc-2.12-2-gc4ccff1/sysdeps/x86_64/cacheinfo.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/sysdeps/x86_64/cacheinfo.c ++++ glibc-2.12-2-gc4ccff1/sysdeps/x86_64/cacheinfo.c +@@ -181,6 +181,57 @@ intel_check_word (int name, unsigned int + /* No need to look further. */ + break; + } ++ else if (byte == 0xff) ++ { ++ /* CPUID leaf 0x4 contains all the information. We need to ++ iterate over it. */ ++ unsigned int eax; ++ unsigned int ebx; ++ unsigned int ecx; ++ unsigned int edx; ++ ++ unsigned int round = 0; ++ while (1) ++ { ++ asm volatile ("xchgl %%ebx, %1; cpuid; xchgl %%ebx, %1" ++ : "=a" (eax), "=r" (ebx), "=c" (ecx), "=d" (edx) ++ : "0" (4), "2" (round)); ++ ++ enum { null = 0, data = 1, inst = 2, uni = 3 } type = eax & 0x1f; ++ if (type == null) ++ /* That was the end. */ ++ break; ++ ++ unsigned int level = (eax >> 5) & 0x7; ++ ++ if ((level == 1 && type == data ++ && folded_rel_name == M(_SC_LEVEL1_DCACHE_SIZE)) ++ || (level == 1 && type == inst ++ && folded_rel_name == M(_SC_LEVEL1_ICACHE_SIZE)) ++ || (level == 2 && folded_rel_name == M(_SC_LEVEL2_CACHE_SIZE)) ++ || (level == 3 && folded_rel_name == M(_SC_LEVEL3_CACHE_SIZE)) ++ || (level == 4 && folded_rel_name == M(_SC_LEVEL4_CACHE_SIZE))) ++ { ++ unsigned int offset = M(name) - folded_rel_name; ++ ++ if (offset == 0) ++ /* Cache size. */ ++ return (((ebx >> 22) + 1) ++ * (((ebx >> 12) & 0x3ff) + 1) ++ * ((ebx & 0xfff) + 1) ++ * (ecx + 1)); ++ if (offset == 1) ++ return (ebx >> 22) + 1; ++ ++ assert (offset == 2); ++ return (ebx & 0xfff) + 1; ++ } ++ ++ ++round; ++ } ++ /* There is no other cache information anywhere else. */ ++ break; ++ } + else + { + if (byte == 0x49 && folded_rel_name == M(_SC_LEVEL3_CACHE_SIZE)) diff --git a/SOURCES/glibc-rh692838.patch b/SOURCES/glibc-rh692838.patch new file mode 100644 index 0000000..aa2adf1 --- /dev/null +++ b/SOURCES/glibc-rh692838.patch @@ -0,0 +1,6165 @@ +2011-05-09 Ulrich Drepper + + [BZ #12541] + * locales/ar_IN: Update currency_symbol. + * locales/as_IN: Likewise. + * locales/bn_IN: Likewise. + * locales/en_IN: Likewise. + * locales/gu_IN: Likewise. + * locales/hi_IN: Likewise. + * locales/kn_IN: Likewise. + * locales/kok_IN: Likewise. + * locales/ks_IN: Likewise. + * locales/ml_IN: Likewise. + * locales/mr_IN: Likewise. + * locales/or_IN: Likewise. + * locales/pa_IN: Likewise. + * locales/sa_IN: Likewise. + * locales/sd_IN: Likewise. + * locales/ta_IN: Likewise. + * locales/te_IN: Likewise. + Patch by pravin.d.s@gmail.com. + +2011-05-09 Ulrich Drepper + + [BZ #12711] + * locale/C-translit.h.in: Add entry for U20B9. + Patch by pravin.d.s@gmail.com. + +Index: glibc-2.12-2-gc4ccff1/locale/C-translit.h +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/locale/C-translit.h ++++ glibc-2.12-2-gc4ccff1/locale/C-translit.h +@@ -1,4 +1,4 @@ +-#define NTRANSLIT 1353 ++#define NTRANSLIT 1354 + static const uint32_t translit_from_idx[] = + { + 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, +@@ -113,7 +113,7 @@ static const uint32_t translit_from_idx[ + 2616, 2618, 2620, 2622, 2624, 2626, 2628, 2630, 2632, 2634, 2636, 2638, + 2640, 2642, 2644, 2646, 2648, 2650, 2652, 2654, 2656, 2658, 2660, 2662, + 2664, 2666, 2668, 2670, 2672, 2674, 2676, 2678, 2680, 2682, 2684, 2686, +- 2688, 2690, 2692, 2694, 2696, 2698, 2700, 2702, 2704 ++ 2688, 2690, 2692, 2694, 2696, 2698, 2700, 2702, 2704, 2706 + }; + static const wchar_t translit_from_tbl[] = + L"\x00a0" L"\0" L"\x00a9" L"\0" L"\x00ab" L"\0" L"\x00ad" L"\0" L"\x00ae" +@@ -134,334 +134,334 @@ static const wchar_t translit_from_tbl[] + L"\0" L"\x2035" L"\0" L"\x2036" L"\0" L"\x2037" L"\0" L"\x2039" L"\0" + L"\x203a" L"\0" L"\x203c" L"\0" L"\x2044" L"\0" L"\x2047" L"\0" L"\x2048" + L"\0" L"\x2049" L"\0" L"\x205f" L"\0" L"\x2060" L"\0" L"\x2061" L"\0" +- L"\x2062" L"\0" L"\x2063" L"\0" L"\x20a8" L"\0" L"\x20ac" L"\0" L"\x2100" +- L"\0" L"\x2101" L"\0" L"\x2102" L"\0" L"\x2105" L"\0" L"\x2106" L"\0" +- L"\x210a" L"\0" L"\x210b" L"\0" L"\x210c" L"\0" L"\x210d" L"\0" L"\x210e" +- L"\0" L"\x2110" L"\0" L"\x2111" L"\0" L"\x2112" L"\0" L"\x2113" L"\0" +- L"\x2115" L"\0" L"\x2116" L"\0" L"\x2119" L"\0" L"\x211a" L"\0" L"\x211b" +- L"\0" L"\x211c" L"\0" L"\x211d" L"\0" L"\x2121" L"\0" L"\x2122" L"\0" +- L"\x2124" L"\0" L"\x2126" L"\0" L"\x2128" L"\0" L"\x212c" L"\0" L"\x212d" +- L"\0" L"\x212e" L"\0" L"\x212f" L"\0" L"\x2130" L"\0" L"\x2131" L"\0" +- L"\x2133" L"\0" L"\x2134" L"\0" L"\x2139" L"\0" L"\x2145" L"\0" L"\x2146" +- L"\0" L"\x2147" L"\0" L"\x2148" L"\0" L"\x2149" L"\0" L"\x2153" L"\0" +- L"\x2154" L"\0" L"\x2155" L"\0" L"\x2156" L"\0" L"\x2157" L"\0" L"\x2158" +- L"\0" L"\x2159" L"\0" L"\x215a" L"\0" L"\x215b" L"\0" L"\x215c" L"\0" +- L"\x215d" L"\0" L"\x215e" L"\0" L"\x215f" L"\0" L"\x2160" L"\0" L"\x2161" +- L"\0" L"\x2162" L"\0" L"\x2163" L"\0" L"\x2164" L"\0" L"\x2165" L"\0" +- L"\x2166" L"\0" L"\x2167" L"\0" L"\x2168" L"\0" L"\x2169" L"\0" L"\x216a" +- L"\0" L"\x216b" L"\0" L"\x216c" L"\0" L"\x216d" L"\0" L"\x216e" L"\0" +- L"\x216f" L"\0" L"\x2170" L"\0" L"\x2171" L"\0" L"\x2172" L"\0" L"\x2173" +- L"\0" L"\x2174" L"\0" L"\x2175" L"\0" L"\x2176" L"\0" L"\x2177" L"\0" +- L"\x2178" L"\0" L"\x2179" L"\0" L"\x217a" L"\0" L"\x217b" L"\0" L"\x217c" +- L"\0" L"\x217d" L"\0" L"\x217e" L"\0" L"\x217f" L"\0" L"\x2190" L"\0" +- L"\x2192" L"\0" L"\x2194" L"\0" L"\x21d0" L"\0" L"\x21d2" L"\0" L"\x21d4" +- L"\0" L"\x2212" L"\0" L"\x2215" L"\0" L"\x2216" L"\0" L"\x2217" L"\0" +- L"\x2223" L"\0" L"\x2236" L"\0" L"\x223c" L"\0" L"\x2264" L"\0" L"\x2265" +- L"\0" L"\x226a" L"\0" L"\x226b" L"\0" L"\x22d8" L"\0" L"\x22d9" L"\0" +- L"\x2400" L"\0" L"\x2401" L"\0" L"\x2402" L"\0" L"\x2403" L"\0" L"\x2404" +- L"\0" L"\x2405" L"\0" L"\x2406" L"\0" L"\x2407" L"\0" L"\x2408" L"\0" +- L"\x2409" L"\0" L"\x240a" L"\0" L"\x240b" L"\0" L"\x240c" L"\0" L"\x240d" +- L"\0" L"\x240e" L"\0" L"\x240f" L"\0" L"\x2410" L"\0" L"\x2411" L"\0" +- L"\x2412" L"\0" L"\x2413" L"\0" L"\x2414" L"\0" L"\x2415" L"\0" L"\x2416" +- L"\0" L"\x2417" L"\0" L"\x2418" L"\0" L"\x2419" L"\0" L"\x241a" L"\0" +- L"\x241b" L"\0" L"\x241c" L"\0" L"\x241d" L"\0" L"\x241e" L"\0" L"\x241f" +- L"\0" L"\x2420" L"\0" L"\x2421" L"\0" L"\x2423" L"\0" L"\x2424" L"\0" +- L"\x2460" L"\0" L"\x2461" L"\0" L"\x2462" L"\0" L"\x2463" L"\0" L"\x2464" +- L"\0" L"\x2465" L"\0" L"\x2466" L"\0" L"\x2467" L"\0" L"\x2468" L"\0" +- L"\x2469" L"\0" L"\x246a" L"\0" L"\x246b" L"\0" L"\x246c" L"\0" L"\x246d" +- L"\0" L"\x246e" L"\0" L"\x246f" L"\0" L"\x2470" L"\0" L"\x2471" L"\0" +- L"\x2472" L"\0" L"\x2473" L"\0" L"\x2474" L"\0" L"\x2475" L"\0" L"\x2476" +- L"\0" L"\x2477" L"\0" L"\x2478" L"\0" L"\x2479" L"\0" L"\x247a" L"\0" +- L"\x247b" L"\0" L"\x247c" L"\0" L"\x247d" L"\0" L"\x247e" L"\0" L"\x247f" +- L"\0" L"\x2480" L"\0" L"\x2481" L"\0" L"\x2482" L"\0" L"\x2483" L"\0" +- L"\x2484" L"\0" L"\x2485" L"\0" L"\x2486" L"\0" L"\x2487" L"\0" L"\x2488" +- L"\0" L"\x2489" L"\0" L"\x248a" L"\0" L"\x248b" L"\0" L"\x248c" L"\0" +- L"\x248d" L"\0" L"\x248e" L"\0" L"\x248f" L"\0" L"\x2490" L"\0" L"\x2491" +- L"\0" L"\x2492" L"\0" L"\x2493" L"\0" L"\x2494" L"\0" L"\x2495" L"\0" +- L"\x2496" L"\0" L"\x2497" L"\0" L"\x2498" L"\0" L"\x2499" L"\0" L"\x249a" +- L"\0" L"\x249b" L"\0" L"\x249c" L"\0" L"\x249d" L"\0" L"\x249e" L"\0" +- L"\x249f" L"\0" L"\x24a0" L"\0" L"\x24a1" L"\0" L"\x24a2" L"\0" L"\x24a3" +- L"\0" L"\x24a4" L"\0" L"\x24a5" L"\0" L"\x24a6" L"\0" L"\x24a7" L"\0" +- L"\x24a8" L"\0" L"\x24a9" L"\0" L"\x24aa" L"\0" L"\x24ab" L"\0" L"\x24ac" +- L"\0" L"\x24ad" L"\0" L"\x24ae" L"\0" L"\x24af" L"\0" L"\x24b0" L"\0" +- L"\x24b1" L"\0" L"\x24b2" L"\0" L"\x24b3" L"\0" L"\x24b4" L"\0" L"\x24b5" +- L"\0" L"\x24b6" L"\0" L"\x24b7" L"\0" L"\x24b8" L"\0" L"\x24b9" L"\0" +- L"\x24ba" L"\0" L"\x24bb" L"\0" L"\x24bc" L"\0" L"\x24bd" L"\0" L"\x24be" +- L"\0" L"\x24bf" L"\0" L"\x24c0" L"\0" L"\x24c1" L"\0" L"\x24c2" L"\0" +- L"\x24c3" L"\0" L"\x24c4" L"\0" L"\x24c5" L"\0" L"\x24c6" L"\0" L"\x24c7" +- L"\0" L"\x24c8" L"\0" L"\x24c9" L"\0" L"\x24ca" L"\0" L"\x24cb" L"\0" +- L"\x24cc" L"\0" L"\x24cd" L"\0" L"\x24ce" L"\0" L"\x24cf" L"\0" L"\x24d0" +- L"\0" L"\x24d1" L"\0" L"\x24d2" L"\0" L"\x24d3" L"\0" L"\x24d4" L"\0" +- L"\x24d5" L"\0" L"\x24d6" L"\0" L"\x24d7" L"\0" L"\x24d8" L"\0" L"\x24d9" +- L"\0" L"\x24da" L"\0" L"\x24db" L"\0" L"\x24dc" L"\0" L"\x24dd" L"\0" +- L"\x24de" L"\0" L"\x24df" L"\0" L"\x24e0" L"\0" L"\x24e1" L"\0" L"\x24e2" +- L"\0" L"\x24e3" L"\0" L"\x24e4" L"\0" L"\x24e5" L"\0" L"\x24e6" L"\0" +- L"\x24e7" L"\0" L"\x24e8" L"\0" L"\x24e9" L"\0" L"\x24ea" L"\0" L"\x2500" +- L"\0" L"\x2502" L"\0" L"\x250c" L"\0" L"\x2510" L"\0" L"\x2514" L"\0" +- L"\x2518" L"\0" L"\x251c" L"\0" L"\x2524" L"\0" L"\x252c" L"\0" L"\x2534" +- L"\0" L"\x253c" L"\0" L"\x25e6" L"\0" L"\x2a74" L"\0" L"\x2a75" L"\0" +- L"\x2a76" L"\0" L"\x3000" L"\0" L"\x30a0" L"\0" L"\x3251" L"\0" L"\x3252" +- L"\0" L"\x3253" L"\0" L"\x3254" L"\0" L"\x3255" L"\0" L"\x3256" L"\0" +- L"\x3257" L"\0" L"\x3258" L"\0" L"\x3259" L"\0" L"\x325a" L"\0" L"\x325b" +- L"\0" L"\x325c" L"\0" L"\x325d" L"\0" L"\x325e" L"\0" L"\x325f" L"\0" +- L"\x32b1" L"\0" L"\x32b2" L"\0" L"\x32b3" L"\0" L"\x32b4" L"\0" L"\x32b5" +- L"\0" L"\x32b6" L"\0" L"\x32b7" L"\0" L"\x32b8" L"\0" L"\x32b9" L"\0" +- L"\x32ba" L"\0" L"\x32bb" L"\0" L"\x32bc" L"\0" L"\x32bd" L"\0" L"\x32be" +- L"\0" L"\x32bf" L"\0" L"\x3371" L"\0" L"\x3372" L"\0" L"\x3373" L"\0" +- L"\x3374" L"\0" L"\x3375" L"\0" L"\x3376" L"\0" L"\x3380" L"\0" L"\x3381" +- L"\0" L"\x3382" L"\0" L"\x3383" L"\0" L"\x3384" L"\0" L"\x3385" L"\0" +- L"\x3386" L"\0" L"\x3387" L"\0" L"\x3388" L"\0" L"\x3389" L"\0" L"\x338a" +- L"\0" L"\x338b" L"\0" L"\x338c" L"\0" L"\x338d" L"\0" L"\x338e" L"\0" +- L"\x338f" L"\0" L"\x3390" L"\0" L"\x3391" L"\0" L"\x3392" L"\0" L"\x3393" +- L"\0" L"\x3394" L"\0" L"\x3395" L"\0" L"\x3396" L"\0" L"\x3397" L"\0" +- L"\x3398" L"\0" L"\x3399" L"\0" L"\x339a" L"\0" L"\x339b" L"\0" L"\x339c" +- L"\0" L"\x339d" L"\0" L"\x339e" L"\0" L"\x339f" L"\0" L"\x33a0" L"\0" +- L"\x33a1" L"\0" L"\x33a2" L"\0" L"\x33a3" L"\0" L"\x33a4" L"\0" L"\x33a5" +- L"\0" L"\x33a6" L"\0" L"\x33a7" L"\0" L"\x33a8" L"\0" L"\x33a9" L"\0" +- L"\x33aa" L"\0" L"\x33ab" L"\0" L"\x33ac" L"\0" L"\x33ad" L"\0" L"\x33ae" +- L"\0" L"\x33af" L"\0" L"\x33b0" L"\0" L"\x33b1" L"\0" L"\x33b2" L"\0" +- L"\x33b3" L"\0" L"\x33b4" L"\0" L"\x33b5" L"\0" L"\x33b6" L"\0" L"\x33b7" +- L"\0" L"\x33b8" L"\0" L"\x33b9" L"\0" L"\x33ba" L"\0" L"\x33bb" L"\0" +- L"\x33bc" L"\0" L"\x33bd" L"\0" L"\x33be" L"\0" L"\x33bf" L"\0" L"\x33c2" +- L"\0" L"\x33c3" L"\0" L"\x33c4" L"\0" L"\x33c5" L"\0" L"\x33c6" L"\0" +- L"\x33c7" L"\0" L"\x33c8" L"\0" L"\x33c9" L"\0" L"\x33ca" L"\0" L"\x33cb" +- L"\0" L"\x33cc" L"\0" L"\x33cd" L"\0" L"\x33ce" L"\0" L"\x33cf" L"\0" +- L"\x33d0" L"\0" L"\x33d1" L"\0" L"\x33d2" L"\0" L"\x33d3" L"\0" L"\x33d4" +- L"\0" L"\x33d5" L"\0" L"\x33d6" L"\0" L"\x33d7" L"\0" L"\x33d8" L"\0" +- L"\x33d9" L"\0" L"\x33da" L"\0" L"\x33db" L"\0" L"\x33dc" L"\0" L"\x33dd" +- L"\0" L"\xfb00" L"\0" L"\xfb01" L"\0" L"\xfb02" L"\0" L"\xfb03" L"\0" +- L"\xfb04" L"\0" L"\xfb06" L"\0" L"\xfb29" L"\0" L"\xfe00" L"\0" L"\xfe01" +- L"\0" L"\xfe02" L"\0" L"\xfe03" L"\0" L"\xfe04" L"\0" L"\xfe05" L"\0" +- L"\xfe06" L"\0" L"\xfe07" L"\0" L"\xfe08" L"\0" L"\xfe09" L"\0" L"\xfe0a" +- L"\0" L"\xfe0b" L"\0" L"\xfe0c" L"\0" L"\xfe0d" L"\0" L"\xfe0e" L"\0" +- L"\xfe0f" L"\0" L"\xfe4d" L"\0" L"\xfe4e" L"\0" L"\xfe4f" L"\0" L"\xfe50" +- L"\0" L"\xfe52" L"\0" L"\xfe54" L"\0" L"\xfe55" L"\0" L"\xfe56" L"\0" +- L"\xfe57" L"\0" L"\xfe59" L"\0" L"\xfe5a" L"\0" L"\xfe5b" L"\0" L"\xfe5c" +- L"\0" L"\xfe5f" L"\0" L"\xfe60" L"\0" L"\xfe61" L"\0" L"\xfe62" L"\0" +- L"\xfe63" L"\0" L"\xfe64" L"\0" L"\xfe65" L"\0" L"\xfe66" L"\0" L"\xfe68" +- L"\0" L"\xfe69" L"\0" L"\xfe6a" L"\0" L"\xfe6b" L"\0" L"\xfeff" L"\0" +- L"\xff01" L"\0" L"\xff02" L"\0" L"\xff03" L"\0" L"\xff04" L"\0" L"\xff05" +- L"\0" L"\xff06" L"\0" L"\xff07" L"\0" L"\xff08" L"\0" L"\xff09" L"\0" +- L"\xff0a" L"\0" L"\xff0b" L"\0" L"\xff0c" L"\0" L"\xff0d" L"\0" L"\xff0e" +- L"\0" L"\xff0f" L"\0" L"\xff10" L"\0" L"\xff11" L"\0" L"\xff12" L"\0" +- L"\xff13" L"\0" L"\xff14" L"\0" L"\xff15" L"\0" L"\xff16" L"\0" L"\xff17" +- L"\0" L"\xff18" L"\0" L"\xff19" L"\0" L"\xff1a" L"\0" L"\xff1b" L"\0" +- L"\xff1c" L"\0" L"\xff1d" L"\0" L"\xff1e" L"\0" L"\xff1f" L"\0" L"\xff20" +- L"\0" L"\xff21" L"\0" L"\xff22" L"\0" L"\xff23" L"\0" L"\xff24" L"\0" +- L"\xff25" L"\0" L"\xff26" L"\0" L"\xff27" L"\0" L"\xff28" L"\0" L"\xff29" +- L"\0" L"\xff2a" L"\0" L"\xff2b" L"\0" L"\xff2c" L"\0" L"\xff2d" L"\0" +- L"\xff2e" L"\0" L"\xff2f" L"\0" L"\xff30" L"\0" L"\xff31" L"\0" L"\xff32" +- L"\0" L"\xff33" L"\0" L"\xff34" L"\0" L"\xff35" L"\0" L"\xff36" L"\0" +- L"\xff37" L"\0" L"\xff38" L"\0" L"\xff39" L"\0" L"\xff3a" L"\0" L"\xff3b" +- L"\0" L"\xff3c" L"\0" L"\xff3d" L"\0" L"\xff3e" L"\0" L"\xff3f" L"\0" +- L"\xff40" L"\0" L"\xff41" L"\0" L"\xff42" L"\0" L"\xff43" L"\0" L"\xff44" +- L"\0" L"\xff45" L"\0" L"\xff46" L"\0" L"\xff47" L"\0" L"\xff48" L"\0" +- L"\xff49" L"\0" L"\xff4a" L"\0" L"\xff4b" L"\0" L"\xff4c" L"\0" L"\xff4d" +- L"\0" L"\xff4e" L"\0" L"\xff4f" L"\0" L"\xff50" L"\0" L"\xff51" L"\0" +- L"\xff52" L"\0" L"\xff53" L"\0" L"\xff54" L"\0" L"\xff55" L"\0" L"\xff56" +- L"\0" L"\xff57" L"\0" L"\xff58" L"\0" L"\xff59" L"\0" L"\xff5a" L"\0" +- L"\xff5b" L"\0" L"\xff5c" L"\0" L"\xff5d" L"\0" L"\xff5e" L"\0" +- L"\x0001d400" L"\0" L"\x0001d401" L"\0" L"\x0001d402" L"\0" L"\x0001d403" +- L"\0" L"\x0001d404" L"\0" L"\x0001d405" L"\0" L"\x0001d406" L"\0" +- L"\x0001d407" L"\0" L"\x0001d408" L"\0" L"\x0001d409" L"\0" L"\x0001d40a" +- L"\0" L"\x0001d40b" L"\0" L"\x0001d40c" L"\0" L"\x0001d40d" L"\0" +- L"\x0001d40e" L"\0" L"\x0001d40f" L"\0" L"\x0001d410" L"\0" L"\x0001d411" +- L"\0" L"\x0001d412" L"\0" L"\x0001d413" L"\0" L"\x0001d414" L"\0" +- L"\x0001d415" L"\0" L"\x0001d416" L"\0" L"\x0001d417" L"\0" L"\x0001d418" +- L"\0" L"\x0001d419" L"\0" L"\x0001d41a" L"\0" L"\x0001d41b" L"\0" +- L"\x0001d41c" L"\0" L"\x0001d41d" L"\0" L"\x0001d41e" L"\0" L"\x0001d41f" +- L"\0" L"\x0001d420" L"\0" L"\x0001d421" L"\0" L"\x0001d422" L"\0" +- L"\x0001d423" L"\0" L"\x0001d424" L"\0" L"\x0001d425" L"\0" L"\x0001d426" +- L"\0" L"\x0001d427" L"\0" L"\x0001d428" L"\0" L"\x0001d429" L"\0" +- L"\x0001d42a" L"\0" L"\x0001d42b" L"\0" L"\x0001d42c" L"\0" L"\x0001d42d" +- L"\0" L"\x0001d42e" L"\0" L"\x0001d42f" L"\0" L"\x0001d430" L"\0" +- L"\x0001d431" L"\0" L"\x0001d432" L"\0" L"\x0001d433" L"\0" L"\x0001d434" +- L"\0" L"\x0001d435" L"\0" L"\x0001d436" L"\0" L"\x0001d437" L"\0" +- L"\x0001d438" L"\0" L"\x0001d439" L"\0" L"\x0001d43a" L"\0" L"\x0001d43b" +- L"\0" L"\x0001d43c" L"\0" L"\x0001d43d" L"\0" L"\x0001d43e" L"\0" +- L"\x0001d43f" L"\0" L"\x0001d440" L"\0" L"\x0001d441" L"\0" L"\x0001d442" +- L"\0" L"\x0001d443" L"\0" L"\x0001d444" L"\0" L"\x0001d445" L"\0" +- L"\x0001d446" L"\0" L"\x0001d447" L"\0" L"\x0001d448" L"\0" L"\x0001d449" +- L"\0" L"\x0001d44a" L"\0" L"\x0001d44b" L"\0" L"\x0001d44c" L"\0" +- L"\x0001d44d" L"\0" L"\x0001d44e" L"\0" L"\x0001d44f" L"\0" L"\x0001d450" +- L"\0" L"\x0001d451" L"\0" L"\x0001d452" L"\0" L"\x0001d453" L"\0" +- L"\x0001d454" L"\0" L"\x0001d456" L"\0" L"\x0001d457" L"\0" L"\x0001d458" +- L"\0" L"\x0001d459" L"\0" L"\x0001d45a" L"\0" L"\x0001d45b" L"\0" +- L"\x0001d45c" L"\0" L"\x0001d45d" L"\0" L"\x0001d45e" L"\0" L"\x0001d45f" +- L"\0" L"\x0001d460" L"\0" L"\x0001d461" L"\0" L"\x0001d462" L"\0" +- L"\x0001d463" L"\0" L"\x0001d464" L"\0" L"\x0001d465" L"\0" L"\x0001d466" +- L"\0" L"\x0001d467" L"\0" L"\x0001d468" L"\0" L"\x0001d469" L"\0" +- L"\x0001d46a" L"\0" L"\x0001d46b" L"\0" L"\x0001d46c" L"\0" L"\x0001d46d" +- L"\0" L"\x0001d46e" L"\0" L"\x0001d46f" L"\0" L"\x0001d470" L"\0" +- L"\x0001d471" L"\0" L"\x0001d472" L"\0" L"\x0001d473" L"\0" L"\x0001d474" +- L"\0" L"\x0001d475" L"\0" L"\x0001d476" L"\0" L"\x0001d477" L"\0" +- L"\x0001d478" L"\0" L"\x0001d479" L"\0" L"\x0001d47a" L"\0" L"\x0001d47b" +- L"\0" L"\x0001d47c" L"\0" L"\x0001d47d" L"\0" L"\x0001d47e" L"\0" +- L"\x0001d47f" L"\0" L"\x0001d480" L"\0" L"\x0001d481" L"\0" L"\x0001d482" +- L"\0" L"\x0001d483" L"\0" L"\x0001d484" L"\0" L"\x0001d485" L"\0" +- L"\x0001d486" L"\0" L"\x0001d487" L"\0" L"\x0001d488" L"\0" L"\x0001d489" +- L"\0" L"\x0001d48a" L"\0" L"\x0001d48b" L"\0" L"\x0001d48c" L"\0" +- L"\x0001d48d" L"\0" L"\x0001d48e" L"\0" L"\x0001d48f" L"\0" L"\x0001d490" +- L"\0" L"\x0001d491" L"\0" L"\x0001d492" L"\0" L"\x0001d493" L"\0" +- L"\x0001d494" L"\0" L"\x0001d495" L"\0" L"\x0001d496" L"\0" L"\x0001d497" +- L"\0" L"\x0001d498" L"\0" L"\x0001d499" L"\0" L"\x0001d49a" L"\0" +- L"\x0001d49b" L"\0" L"\x0001d49c" L"\0" L"\x0001d49e" L"\0" L"\x0001d49f" +- L"\0" L"\x0001d4a2" L"\0" L"\x0001d4a5" L"\0" L"\x0001d4a6" L"\0" +- L"\x0001d4a9" L"\0" L"\x0001d4aa" L"\0" L"\x0001d4ab" L"\0" L"\x0001d4ac" +- L"\0" L"\x0001d4ae" L"\0" L"\x0001d4af" L"\0" L"\x0001d4b0" L"\0" +- L"\x0001d4b1" L"\0" L"\x0001d4b2" L"\0" L"\x0001d4b3" L"\0" L"\x0001d4b4" +- L"\0" L"\x0001d4b5" L"\0" L"\x0001d4b6" L"\0" L"\x0001d4b7" L"\0" +- L"\x0001d4b8" L"\0" L"\x0001d4b9" L"\0" L"\x0001d4bb" L"\0" L"\x0001d4bd" +- L"\0" L"\x0001d4be" L"\0" L"\x0001d4bf" L"\0" L"\x0001d4c0" L"\0" +- L"\x0001d4c2" L"\0" L"\x0001d4c3" L"\0" L"\x0001d4c5" L"\0" L"\x0001d4c6" +- L"\0" L"\x0001d4c7" L"\0" L"\x0001d4c8" L"\0" L"\x0001d4c9" L"\0" +- L"\x0001d4ca" L"\0" L"\x0001d4cb" L"\0" L"\x0001d4cc" L"\0" L"\x0001d4cd" +- L"\0" L"\x0001d4ce" L"\0" L"\x0001d4cf" L"\0" L"\x0001d4d0" L"\0" +- L"\x0001d4d1" L"\0" L"\x0001d4d2" L"\0" L"\x0001d4d3" L"\0" L"\x0001d4d4" +- L"\0" L"\x0001d4d5" L"\0" L"\x0001d4d6" L"\0" L"\x0001d4d7" L"\0" +- L"\x0001d4d8" L"\0" L"\x0001d4d9" L"\0" L"\x0001d4da" L"\0" L"\x0001d4db" +- L"\0" L"\x0001d4dc" L"\0" L"\x0001d4dd" L"\0" L"\x0001d4de" L"\0" +- L"\x0001d4df" L"\0" L"\x0001d4e0" L"\0" L"\x0001d4e1" L"\0" L"\x0001d4e2" +- L"\0" L"\x0001d4e3" L"\0" L"\x0001d4e4" L"\0" L"\x0001d4e5" L"\0" +- L"\x0001d4e6" L"\0" L"\x0001d4e7" L"\0" L"\x0001d4e8" L"\0" L"\x0001d4e9" +- L"\0" L"\x0001d4ea" L"\0" L"\x0001d4eb" L"\0" L"\x0001d4ec" L"\0" +- L"\x0001d4ed" L"\0" L"\x0001d4ee" L"\0" L"\x0001d4ef" L"\0" L"\x0001d4f0" +- L"\0" L"\x0001d4f1" L"\0" L"\x0001d4f2" L"\0" L"\x0001d4f3" L"\0" +- L"\x0001d4f4" L"\0" L"\x0001d4f5" L"\0" L"\x0001d4f6" L"\0" L"\x0001d4f7" +- L"\0" L"\x0001d4f8" L"\0" L"\x0001d4f9" L"\0" L"\x0001d4fa" L"\0" +- L"\x0001d4fb" L"\0" L"\x0001d4fc" L"\0" L"\x0001d4fd" L"\0" L"\x0001d4fe" +- L"\0" L"\x0001d4ff" L"\0" L"\x0001d500" L"\0" L"\x0001d501" L"\0" +- L"\x0001d502" L"\0" L"\x0001d503" L"\0" L"\x0001d504" L"\0" L"\x0001d505" +- L"\0" L"\x0001d507" L"\0" L"\x0001d508" L"\0" L"\x0001d509" L"\0" +- L"\x0001d50a" L"\0" L"\x0001d50d" L"\0" L"\x0001d50e" L"\0" L"\x0001d50f" +- L"\0" L"\x0001d510" L"\0" L"\x0001d511" L"\0" L"\x0001d512" L"\0" +- L"\x0001d513" L"\0" L"\x0001d514" L"\0" L"\x0001d516" L"\0" L"\x0001d517" +- L"\0" L"\x0001d518" L"\0" L"\x0001d519" L"\0" L"\x0001d51a" L"\0" +- L"\x0001d51b" L"\0" L"\x0001d51c" L"\0" L"\x0001d51e" L"\0" L"\x0001d51f" +- L"\0" L"\x0001d520" L"\0" L"\x0001d521" L"\0" L"\x0001d522" L"\0" +- L"\x0001d523" L"\0" L"\x0001d524" L"\0" L"\x0001d525" L"\0" L"\x0001d526" +- L"\0" L"\x0001d527" L"\0" L"\x0001d528" L"\0" L"\x0001d529" L"\0" +- L"\x0001d52a" L"\0" L"\x0001d52b" L"\0" L"\x0001d52c" L"\0" L"\x0001d52d" +- L"\0" L"\x0001d52e" L"\0" L"\x0001d52f" L"\0" L"\x0001d530" L"\0" +- L"\x0001d531" L"\0" L"\x0001d532" L"\0" L"\x0001d533" L"\0" L"\x0001d534" +- L"\0" L"\x0001d535" L"\0" L"\x0001d536" L"\0" L"\x0001d537" L"\0" +- L"\x0001d538" L"\0" L"\x0001d539" L"\0" L"\x0001d53b" L"\0" L"\x0001d53c" +- L"\0" L"\x0001d53d" L"\0" L"\x0001d53e" L"\0" L"\x0001d540" L"\0" +- L"\x0001d541" L"\0" L"\x0001d542" L"\0" L"\x0001d543" L"\0" L"\x0001d544" +- L"\0" L"\x0001d546" L"\0" L"\x0001d54a" L"\0" L"\x0001d54b" L"\0" +- L"\x0001d54c" L"\0" L"\x0001d54d" L"\0" L"\x0001d54e" L"\0" L"\x0001d54f" +- L"\0" L"\x0001d550" L"\0" L"\x0001d552" L"\0" L"\x0001d553" L"\0" +- L"\x0001d554" L"\0" L"\x0001d555" L"\0" L"\x0001d556" L"\0" L"\x0001d557" +- L"\0" L"\x0001d558" L"\0" L"\x0001d559" L"\0" L"\x0001d55a" L"\0" +- L"\x0001d55b" L"\0" L"\x0001d55c" L"\0" L"\x0001d55d" L"\0" L"\x0001d55e" +- L"\0" L"\x0001d55f" L"\0" L"\x0001d560" L"\0" L"\x0001d561" L"\0" +- L"\x0001d562" L"\0" L"\x0001d563" L"\0" L"\x0001d564" L"\0" L"\x0001d565" +- L"\0" L"\x0001d566" L"\0" L"\x0001d567" L"\0" L"\x0001d568" L"\0" +- L"\x0001d569" L"\0" L"\x0001d56a" L"\0" L"\x0001d56b" L"\0" L"\x0001d56c" +- L"\0" L"\x0001d56d" L"\0" L"\x0001d56e" L"\0" L"\x0001d56f" L"\0" +- L"\x0001d570" L"\0" L"\x0001d571" L"\0" L"\x0001d572" L"\0" L"\x0001d573" +- L"\0" L"\x0001d574" L"\0" L"\x0001d575" L"\0" L"\x0001d576" L"\0" +- L"\x0001d577" L"\0" L"\x0001d578" L"\0" L"\x0001d579" L"\0" L"\x0001d57a" +- L"\0" L"\x0001d57b" L"\0" L"\x0001d57c" L"\0" L"\x0001d57d" L"\0" +- L"\x0001d57e" L"\0" L"\x0001d57f" L"\0" L"\x0001d580" L"\0" L"\x0001d581" +- L"\0" L"\x0001d582" L"\0" L"\x0001d583" L"\0" L"\x0001d584" L"\0" +- L"\x0001d585" L"\0" L"\x0001d586" L"\0" L"\x0001d587" L"\0" L"\x0001d588" +- L"\0" L"\x0001d589" L"\0" L"\x0001d58a" L"\0" L"\x0001d58b" L"\0" +- L"\x0001d58c" L"\0" L"\x0001d58d" L"\0" L"\x0001d58e" L"\0" L"\x0001d58f" +- L"\0" L"\x0001d590" L"\0" L"\x0001d591" L"\0" L"\x0001d592" L"\0" +- L"\x0001d593" L"\0" L"\x0001d594" L"\0" L"\x0001d595" L"\0" L"\x0001d596" +- L"\0" L"\x0001d597" L"\0" L"\x0001d598" L"\0" L"\x0001d599" L"\0" +- L"\x0001d59a" L"\0" L"\x0001d59b" L"\0" L"\x0001d59c" L"\0" L"\x0001d59d" +- L"\0" L"\x0001d59e" L"\0" L"\x0001d59f" L"\0" L"\x0001d5a0" L"\0" +- L"\x0001d5a1" L"\0" L"\x0001d5a2" L"\0" L"\x0001d5a3" L"\0" L"\x0001d5a4" +- L"\0" L"\x0001d5a5" L"\0" L"\x0001d5a6" L"\0" L"\x0001d5a7" L"\0" +- L"\x0001d5a8" L"\0" L"\x0001d5a9" L"\0" L"\x0001d5aa" L"\0" L"\x0001d5ab" +- L"\0" L"\x0001d5ac" L"\0" L"\x0001d5ad" L"\0" L"\x0001d5ae" L"\0" +- L"\x0001d5af" L"\0" L"\x0001d5b0" L"\0" L"\x0001d5b1" L"\0" L"\x0001d5b2" +- L"\0" L"\x0001d5b3" L"\0" L"\x0001d5b4" L"\0" L"\x0001d5b5" L"\0" +- L"\x0001d5b6" L"\0" L"\x0001d5b7" L"\0" L"\x0001d5b8" L"\0" L"\x0001d5b9" +- L"\0" L"\x0001d5ba" L"\0" L"\x0001d5bb" L"\0" L"\x0001d5bc" L"\0" +- L"\x0001d5bd" L"\0" L"\x0001d5be" L"\0" L"\x0001d5bf" L"\0" L"\x0001d5c0" +- L"\0" L"\x0001d5c1" L"\0" L"\x0001d5c2" L"\0" L"\x0001d5c3" L"\0" +- L"\x0001d5c4" L"\0" L"\x0001d5c5" L"\0" L"\x0001d5c6" L"\0" L"\x0001d5c7" +- L"\0" L"\x0001d5c8" L"\0" L"\x0001d5c9" L"\0" L"\x0001d5ca" L"\0" +- L"\x0001d5cb" L"\0" L"\x0001d5cc" L"\0" L"\x0001d5cd" L"\0" L"\x0001d5ce" +- L"\0" L"\x0001d5cf" L"\0" L"\x0001d5d0" L"\0" L"\x0001d5d1" L"\0" +- L"\x0001d5d2" L"\0" L"\x0001d5d3" L"\0" L"\x0001d5d4" L"\0" L"\x0001d5d5" +- L"\0" L"\x0001d5d6" L"\0" L"\x0001d5d7" L"\0" L"\x0001d5d8" L"\0" +- L"\x0001d5d9" L"\0" L"\x0001d5da" L"\0" L"\x0001d5db" L"\0" L"\x0001d5dc" +- L"\0" L"\x0001d5dd" L"\0" L"\x0001d5de" L"\0" L"\x0001d5df" L"\0" +- L"\x0001d5e0" L"\0" L"\x0001d5e1" L"\0" L"\x0001d5e2" L"\0" L"\x0001d5e3" +- L"\0" L"\x0001d5e4" L"\0" L"\x0001d5e5" L"\0" L"\x0001d5e6" L"\0" +- L"\x0001d5e7" L"\0" L"\x0001d5e8" L"\0" L"\x0001d5e9" L"\0" L"\x0001d5ea" +- L"\0" L"\x0001d5eb" L"\0" L"\x0001d5ec" L"\0" L"\x0001d5ed" L"\0" +- L"\x0001d5ee" L"\0" L"\x0001d5ef" L"\0" L"\x0001d5f0" L"\0" L"\x0001d5f1" +- L"\0" L"\x0001d5f2" L"\0" L"\x0001d5f3" L"\0" L"\x0001d5f4" L"\0" +- L"\x0001d5f5" L"\0" L"\x0001d5f6" L"\0" L"\x0001d5f7" L"\0" L"\x0001d5f8" +- L"\0" L"\x0001d5f9" L"\0" L"\x0001d5fa" L"\0" L"\x0001d5fb" L"\0" +- L"\x0001d5fc" L"\0" L"\x0001d5fd" L"\0" L"\x0001d5fe" L"\0" L"\x0001d5ff" +- L"\0" L"\x0001d600" L"\0" L"\x0001d601" L"\0" L"\x0001d602" L"\0" +- L"\x0001d603" L"\0" L"\x0001d604" L"\0" L"\x0001d605" L"\0" L"\x0001d606" +- L"\0" L"\x0001d607" L"\0" L"\x0001d608" L"\0" L"\x0001d609" L"\0" +- L"\x0001d60a" L"\0" L"\x0001d60b" L"\0" L"\x0001d60c" L"\0" L"\x0001d60d" +- L"\0" L"\x0001d60e" L"\0" L"\x0001d60f" L"\0" L"\x0001d610" L"\0" +- L"\x0001d611" L"\0" L"\x0001d612" L"\0" L"\x0001d613" L"\0" L"\x0001d614" +- L"\0" L"\x0001d615" L"\0" L"\x0001d616" L"\0" L"\x0001d617" L"\0" +- L"\x0001d618" L"\0" L"\x0001d619" L"\0" L"\x0001d61a" L"\0" L"\x0001d61b" +- L"\0" L"\x0001d61c" L"\0" L"\x0001d61d" L"\0" L"\x0001d61e" L"\0" +- L"\x0001d61f" L"\0" L"\x0001d620" L"\0" L"\x0001d621" L"\0" L"\x0001d622" +- L"\0" L"\x0001d623" L"\0" L"\x0001d624" L"\0" L"\x0001d625" L"\0" +- L"\x0001d626" L"\0" L"\x0001d627" L"\0" L"\x0001d628" L"\0" L"\x0001d629" +- L"\0" L"\x0001d62a" L"\0" L"\x0001d62b" L"\0" L"\x0001d62c" L"\0" +- L"\x0001d62d" L"\0" L"\x0001d62e" L"\0" L"\x0001d62f" L"\0" L"\x0001d630" +- L"\0" L"\x0001d631" L"\0" L"\x0001d632" L"\0" L"\x0001d633" L"\0" +- L"\x0001d634" L"\0" L"\x0001d635" L"\0" L"\x0001d636" L"\0" L"\x0001d637" +- L"\0" L"\x0001d638" L"\0" L"\x0001d639" L"\0" L"\x0001d63a" L"\0" +- L"\x0001d63b" L"\0" L"\x0001d63c" L"\0" L"\x0001d63d" L"\0" L"\x0001d63e" +- L"\0" L"\x0001d63f" L"\0" L"\x0001d640" L"\0" L"\x0001d641" L"\0" +- L"\x0001d642" L"\0" L"\x0001d643" L"\0" L"\x0001d644" L"\0" L"\x0001d645" +- L"\0" L"\x0001d646" L"\0" L"\x0001d647" L"\0" L"\x0001d648" L"\0" +- L"\x0001d649" L"\0" L"\x0001d64a" L"\0" L"\x0001d64b" L"\0" L"\x0001d64c" +- L"\0" L"\x0001d64d" L"\0" L"\x0001d64e" L"\0" L"\x0001d64f" L"\0" +- L"\x0001d650" L"\0" L"\x0001d651" L"\0" L"\x0001d652" L"\0" L"\x0001d653" +- L"\0" L"\x0001d654" L"\0" L"\x0001d655" L"\0" L"\x0001d656" L"\0" +- L"\x0001d657" L"\0" L"\x0001d658" L"\0" L"\x0001d659" L"\0" L"\x0001d65a" +- L"\0" L"\x0001d65b" L"\0" L"\x0001d65c" L"\0" L"\x0001d65d" L"\0" +- L"\x0001d65e" L"\0" L"\x0001d65f" L"\0" L"\x0001d660" L"\0" L"\x0001d661" +- L"\0" L"\x0001d662" L"\0" L"\x0001d663" L"\0" L"\x0001d664" L"\0" +- L"\x0001d665" L"\0" L"\x0001d666" L"\0" L"\x0001d667" L"\0" L"\x0001d668" +- L"\0" L"\x0001d669" L"\0" L"\x0001d66a" L"\0" L"\x0001d66b" L"\0" +- L"\x0001d66c" L"\0" L"\x0001d66d" L"\0" L"\x0001d66e" L"\0" L"\x0001d66f" +- L"\0" L"\x0001d670" L"\0" L"\x0001d671" L"\0" L"\x0001d672" L"\0" +- L"\x0001d673" L"\0" L"\x0001d674" L"\0" L"\x0001d675" L"\0" L"\x0001d676" +- L"\0" L"\x0001d677" L"\0" L"\x0001d678" L"\0" L"\x0001d679" L"\0" +- L"\x0001d67a" L"\0" L"\x0001d67b" L"\0" L"\x0001d67c" L"\0" L"\x0001d67d" +- L"\0" L"\x0001d67e" L"\0" L"\x0001d67f" L"\0" L"\x0001d680" L"\0" +- L"\x0001d681" L"\0" L"\x0001d682" L"\0" L"\x0001d683" L"\0" L"\x0001d684" +- L"\0" L"\x0001d685" L"\0" L"\x0001d686" L"\0" L"\x0001d687" L"\0" +- L"\x0001d688" L"\0" L"\x0001d689" L"\0" L"\x0001d68a" L"\0" L"\x0001d68b" +- L"\0" L"\x0001d68c" L"\0" L"\x0001d68d" L"\0" L"\x0001d68e" L"\0" +- L"\x0001d68f" L"\0" L"\x0001d690" L"\0" L"\x0001d691" L"\0" L"\x0001d692" +- L"\0" L"\x0001d693" L"\0" L"\x0001d694" L"\0" L"\x0001d695" L"\0" +- L"\x0001d696" L"\0" L"\x0001d697" L"\0" L"\x0001d698" L"\0" L"\x0001d699" +- L"\0" L"\x0001d69a" L"\0" L"\x0001d69b" L"\0" L"\x0001d69c" L"\0" +- L"\x0001d69d" L"\0" L"\x0001d69e" L"\0" L"\x0001d69f" L"\0" L"\x0001d6a0" +- L"\0" L"\x0001d6a1" L"\0" L"\x0001d6a2" L"\0" L"\x0001d6a3" L"\0" +- L"\x0001d7ce" L"\0" L"\x0001d7cf" L"\0" L"\x0001d7d0" L"\0" L"\x0001d7d1" +- L"\0" L"\x0001d7d2" L"\0" L"\x0001d7d3" L"\0" L"\x0001d7d4" L"\0" +- L"\x0001d7d5" L"\0" L"\x0001d7d6" L"\0" L"\x0001d7d7" L"\0" L"\x0001d7d8" +- L"\0" L"\x0001d7d9" L"\0" L"\x0001d7da" L"\0" L"\x0001d7db" L"\0" +- L"\x0001d7dc" L"\0" L"\x0001d7dd" L"\0" L"\x0001d7de" L"\0" L"\x0001d7df" +- L"\0" L"\x0001d7e0" L"\0" L"\x0001d7e1" L"\0" L"\x0001d7e2" L"\0" +- L"\x0001d7e3" L"\0" L"\x0001d7e4" L"\0" L"\x0001d7e5" L"\0" L"\x0001d7e6" +- L"\0" L"\x0001d7e7" L"\0" L"\x0001d7e8" L"\0" L"\x0001d7e9" L"\0" +- L"\x0001d7ea" L"\0" L"\x0001d7eb" L"\0" L"\x0001d7ec" L"\0" L"\x0001d7ed" +- L"\0" L"\x0001d7ee" L"\0" L"\x0001d7ef" L"\0" L"\x0001d7f0" L"\0" +- L"\x0001d7f1" L"\0" L"\x0001d7f2" L"\0" L"\x0001d7f3" L"\0" L"\x0001d7f4" +- L"\0" L"\x0001d7f5" L"\0" L"\x0001d7f6" L"\0" L"\x0001d7f7" L"\0" +- L"\x0001d7f8" L"\0" L"\x0001d7f9" L"\0" L"\x0001d7fa" L"\0" L"\x0001d7fb" +- L"\0" L"\x0001d7fc" L"\0" L"\x0001d7fd" L"\0" L"\x0001d7fe" L"\0" +- L"\x0001d7ff"; ++ L"\x2062" L"\0" L"\x2063" L"\0" L"\x20a8" L"\0" L"\x20ac" L"\0" L"\x20b9" ++ L"\0" L"\x2100" L"\0" L"\x2101" L"\0" L"\x2102" L"\0" L"\x2105" L"\0" ++ L"\x2106" L"\0" L"\x210a" L"\0" L"\x210b" L"\0" L"\x210c" L"\0" L"\x210d" ++ L"\0" L"\x210e" L"\0" L"\x2110" L"\0" L"\x2111" L"\0" L"\x2112" L"\0" ++ L"\x2113" L"\0" L"\x2115" L"\0" L"\x2116" L"\0" L"\x2119" L"\0" L"\x211a" ++ L"\0" L"\x211b" L"\0" L"\x211c" L"\0" L"\x211d" L"\0" L"\x2121" L"\0" ++ L"\x2122" L"\0" L"\x2124" L"\0" L"\x2126" L"\0" L"\x2128" L"\0" L"\x212c" ++ L"\0" L"\x212d" L"\0" L"\x212e" L"\0" L"\x212f" L"\0" L"\x2130" L"\0" ++ L"\x2131" L"\0" L"\x2133" L"\0" L"\x2134" L"\0" L"\x2139" L"\0" L"\x2145" ++ L"\0" L"\x2146" L"\0" L"\x2147" L"\0" L"\x2148" L"\0" L"\x2149" L"\0" ++ L"\x2153" L"\0" L"\x2154" L"\0" L"\x2155" L"\0" L"\x2156" L"\0" L"\x2157" ++ L"\0" L"\x2158" L"\0" L"\x2159" L"\0" L"\x215a" L"\0" L"\x215b" L"\0" ++ L"\x215c" L"\0" L"\x215d" L"\0" L"\x215e" L"\0" L"\x215f" L"\0" L"\x2160" ++ L"\0" L"\x2161" L"\0" L"\x2162" L"\0" L"\x2163" L"\0" L"\x2164" L"\0" ++ L"\x2165" L"\0" L"\x2166" L"\0" L"\x2167" L"\0" L"\x2168" L"\0" L"\x2169" ++ L"\0" L"\x216a" L"\0" L"\x216b" L"\0" L"\x216c" L"\0" L"\x216d" L"\0" ++ L"\x216e" L"\0" L"\x216f" L"\0" L"\x2170" L"\0" L"\x2171" L"\0" L"\x2172" ++ L"\0" L"\x2173" L"\0" L"\x2174" L"\0" L"\x2175" L"\0" L"\x2176" L"\0" ++ L"\x2177" L"\0" L"\x2178" L"\0" L"\x2179" L"\0" L"\x217a" L"\0" L"\x217b" ++ L"\0" L"\x217c" L"\0" L"\x217d" L"\0" L"\x217e" L"\0" L"\x217f" L"\0" ++ L"\x2190" L"\0" L"\x2192" L"\0" L"\x2194" L"\0" L"\x21d0" L"\0" L"\x21d2" ++ L"\0" L"\x21d4" L"\0" L"\x2212" L"\0" L"\x2215" L"\0" L"\x2216" L"\0" ++ L"\x2217" L"\0" L"\x2223" L"\0" L"\x2236" L"\0" L"\x223c" L"\0" L"\x2264" ++ L"\0" L"\x2265" L"\0" L"\x226a" L"\0" L"\x226b" L"\0" L"\x22d8" L"\0" ++ L"\x22d9" L"\0" L"\x2400" L"\0" L"\x2401" L"\0" L"\x2402" L"\0" L"\x2403" ++ L"\0" L"\x2404" L"\0" L"\x2405" L"\0" L"\x2406" L"\0" L"\x2407" L"\0" ++ L"\x2408" L"\0" L"\x2409" L"\0" L"\x240a" L"\0" L"\x240b" L"\0" L"\x240c" ++ L"\0" L"\x240d" L"\0" L"\x240e" L"\0" L"\x240f" L"\0" L"\x2410" L"\0" ++ L"\x2411" L"\0" L"\x2412" L"\0" L"\x2413" L"\0" L"\x2414" L"\0" L"\x2415" ++ L"\0" L"\x2416" L"\0" L"\x2417" L"\0" L"\x2418" L"\0" L"\x2419" L"\0" ++ L"\x241a" L"\0" L"\x241b" L"\0" L"\x241c" L"\0" L"\x241d" L"\0" L"\x241e" ++ L"\0" L"\x241f" L"\0" L"\x2420" L"\0" L"\x2421" L"\0" L"\x2423" L"\0" ++ L"\x2424" L"\0" L"\x2460" L"\0" L"\x2461" L"\0" L"\x2462" L"\0" L"\x2463" ++ L"\0" L"\x2464" L"\0" L"\x2465" L"\0" L"\x2466" L"\0" L"\x2467" L"\0" ++ L"\x2468" L"\0" L"\x2469" L"\0" L"\x246a" L"\0" L"\x246b" L"\0" L"\x246c" ++ L"\0" L"\x246d" L"\0" L"\x246e" L"\0" L"\x246f" L"\0" L"\x2470" L"\0" ++ L"\x2471" L"\0" L"\x2472" L"\0" L"\x2473" L"\0" L"\x2474" L"\0" L"\x2475" ++ L"\0" L"\x2476" L"\0" L"\x2477" L"\0" L"\x2478" L"\0" L"\x2479" L"\0" ++ L"\x247a" L"\0" L"\x247b" L"\0" L"\x247c" L"\0" L"\x247d" L"\0" L"\x247e" ++ L"\0" L"\x247f" L"\0" L"\x2480" L"\0" L"\x2481" L"\0" L"\x2482" L"\0" ++ L"\x2483" L"\0" L"\x2484" L"\0" L"\x2485" L"\0" L"\x2486" L"\0" L"\x2487" ++ L"\0" L"\x2488" L"\0" L"\x2489" L"\0" L"\x248a" L"\0" L"\x248b" L"\0" ++ L"\x248c" L"\0" L"\x248d" L"\0" L"\x248e" L"\0" L"\x248f" L"\0" L"\x2490" ++ L"\0" L"\x2491" L"\0" L"\x2492" L"\0" L"\x2493" L"\0" L"\x2494" L"\0" ++ L"\x2495" L"\0" L"\x2496" L"\0" L"\x2497" L"\0" L"\x2498" L"\0" L"\x2499" ++ L"\0" L"\x249a" L"\0" L"\x249b" L"\0" L"\x249c" L"\0" L"\x249d" L"\0" ++ L"\x249e" L"\0" L"\x249f" L"\0" L"\x24a0" L"\0" L"\x24a1" L"\0" L"\x24a2" ++ L"\0" L"\x24a3" L"\0" L"\x24a4" L"\0" L"\x24a5" L"\0" L"\x24a6" L"\0" ++ L"\x24a7" L"\0" L"\x24a8" L"\0" L"\x24a9" L"\0" L"\x24aa" L"\0" L"\x24ab" ++ L"\0" L"\x24ac" L"\0" L"\x24ad" L"\0" L"\x24ae" L"\0" L"\x24af" L"\0" ++ L"\x24b0" L"\0" L"\x24b1" L"\0" L"\x24b2" L"\0" L"\x24b3" L"\0" L"\x24b4" ++ L"\0" L"\x24b5" L"\0" L"\x24b6" L"\0" L"\x24b7" L"\0" L"\x24b8" L"\0" ++ L"\x24b9" L"\0" L"\x24ba" L"\0" L"\x24bb" L"\0" L"\x24bc" L"\0" L"\x24bd" ++ L"\0" L"\x24be" L"\0" L"\x24bf" L"\0" L"\x24c0" L"\0" L"\x24c1" L"\0" ++ L"\x24c2" L"\0" L"\x24c3" L"\0" L"\x24c4" L"\0" L"\x24c5" L"\0" L"\x24c6" ++ L"\0" L"\x24c7" L"\0" L"\x24c8" L"\0" L"\x24c9" L"\0" L"\x24ca" L"\0" ++ L"\x24cb" L"\0" L"\x24cc" L"\0" L"\x24cd" L"\0" L"\x24ce" L"\0" L"\x24cf" ++ L"\0" L"\x24d0" L"\0" L"\x24d1" L"\0" L"\x24d2" L"\0" L"\x24d3" L"\0" ++ L"\x24d4" L"\0" L"\x24d5" L"\0" L"\x24d6" L"\0" L"\x24d7" L"\0" L"\x24d8" ++ L"\0" L"\x24d9" L"\0" L"\x24da" L"\0" L"\x24db" L"\0" L"\x24dc" L"\0" ++ L"\x24dd" L"\0" L"\x24de" L"\0" L"\x24df" L"\0" L"\x24e0" L"\0" L"\x24e1" ++ L"\0" L"\x24e2" L"\0" L"\x24e3" L"\0" L"\x24e4" L"\0" L"\x24e5" L"\0" ++ L"\x24e6" L"\0" L"\x24e7" L"\0" L"\x24e8" L"\0" L"\x24e9" L"\0" L"\x24ea" ++ L"\0" L"\x2500" L"\0" L"\x2502" L"\0" L"\x250c" L"\0" L"\x2510" L"\0" ++ L"\x2514" L"\0" L"\x2518" L"\0" L"\x251c" L"\0" L"\x2524" L"\0" L"\x252c" ++ L"\0" L"\x2534" L"\0" L"\x253c" L"\0" L"\x25e6" L"\0" L"\x2a74" L"\0" ++ L"\x2a75" L"\0" L"\x2a76" L"\0" L"\x3000" L"\0" L"\x30a0" L"\0" L"\x3251" ++ L"\0" L"\x3252" L"\0" L"\x3253" L"\0" L"\x3254" L"\0" L"\x3255" L"\0" ++ L"\x3256" L"\0" L"\x3257" L"\0" L"\x3258" L"\0" L"\x3259" L"\0" L"\x325a" ++ L"\0" L"\x325b" L"\0" L"\x325c" L"\0" L"\x325d" L"\0" L"\x325e" L"\0" ++ L"\x325f" L"\0" L"\x32b1" L"\0" L"\x32b2" L"\0" L"\x32b3" L"\0" L"\x32b4" ++ L"\0" L"\x32b5" L"\0" L"\x32b6" L"\0" L"\x32b7" L"\0" L"\x32b8" L"\0" ++ L"\x32b9" L"\0" L"\x32ba" L"\0" L"\x32bb" L"\0" L"\x32bc" L"\0" L"\x32bd" ++ L"\0" L"\x32be" L"\0" L"\x32bf" L"\0" L"\x3371" L"\0" L"\x3372" L"\0" ++ L"\x3373" L"\0" L"\x3374" L"\0" L"\x3375" L"\0" L"\x3376" L"\0" L"\x3380" ++ L"\0" L"\x3381" L"\0" L"\x3382" L"\0" L"\x3383" L"\0" L"\x3384" L"\0" ++ L"\x3385" L"\0" L"\x3386" L"\0" L"\x3387" L"\0" L"\x3388" L"\0" L"\x3389" ++ L"\0" L"\x338a" L"\0" L"\x338b" L"\0" L"\x338c" L"\0" L"\x338d" L"\0" ++ L"\x338e" L"\0" L"\x338f" L"\0" L"\x3390" L"\0" L"\x3391" L"\0" L"\x3392" ++ L"\0" L"\x3393" L"\0" L"\x3394" L"\0" L"\x3395" L"\0" L"\x3396" L"\0" ++ L"\x3397" L"\0" L"\x3398" L"\0" L"\x3399" L"\0" L"\x339a" L"\0" L"\x339b" ++ L"\0" L"\x339c" L"\0" L"\x339d" L"\0" L"\x339e" L"\0" L"\x339f" L"\0" ++ L"\x33a0" L"\0" L"\x33a1" L"\0" L"\x33a2" L"\0" L"\x33a3" L"\0" L"\x33a4" ++ L"\0" L"\x33a5" L"\0" L"\x33a6" L"\0" L"\x33a7" L"\0" L"\x33a8" L"\0" ++ L"\x33a9" L"\0" L"\x33aa" L"\0" L"\x33ab" L"\0" L"\x33ac" L"\0" L"\x33ad" ++ L"\0" L"\x33ae" L"\0" L"\x33af" L"\0" L"\x33b0" L"\0" L"\x33b1" L"\0" ++ L"\x33b2" L"\0" L"\x33b3" L"\0" L"\x33b4" L"\0" L"\x33b5" L"\0" L"\x33b6" ++ L"\0" L"\x33b7" L"\0" L"\x33b8" L"\0" L"\x33b9" L"\0" L"\x33ba" L"\0" ++ L"\x33bb" L"\0" L"\x33bc" L"\0" L"\x33bd" L"\0" L"\x33be" L"\0" L"\x33bf" ++ L"\0" L"\x33c2" L"\0" L"\x33c3" L"\0" L"\x33c4" L"\0" L"\x33c5" L"\0" ++ L"\x33c6" L"\0" L"\x33c7" L"\0" L"\x33c8" L"\0" L"\x33c9" L"\0" L"\x33ca" ++ L"\0" L"\x33cb" L"\0" L"\x33cc" L"\0" L"\x33cd" L"\0" L"\x33ce" L"\0" ++ L"\x33cf" L"\0" L"\x33d0" L"\0" L"\x33d1" L"\0" L"\x33d2" L"\0" L"\x33d3" ++ L"\0" L"\x33d4" L"\0" L"\x33d5" L"\0" L"\x33d6" L"\0" L"\x33d7" L"\0" ++ L"\x33d8" L"\0" L"\x33d9" L"\0" L"\x33da" L"\0" L"\x33db" L"\0" L"\x33dc" ++ L"\0" L"\x33dd" L"\0" L"\xfb00" L"\0" L"\xfb01" L"\0" L"\xfb02" L"\0" ++ L"\xfb03" L"\0" L"\xfb04" L"\0" L"\xfb06" L"\0" L"\xfb29" L"\0" L"\xfe00" ++ L"\0" L"\xfe01" L"\0" L"\xfe02" L"\0" L"\xfe03" L"\0" L"\xfe04" L"\0" ++ L"\xfe05" L"\0" L"\xfe06" L"\0" L"\xfe07" L"\0" L"\xfe08" L"\0" L"\xfe09" ++ L"\0" L"\xfe0a" L"\0" L"\xfe0b" L"\0" L"\xfe0c" L"\0" L"\xfe0d" L"\0" ++ L"\xfe0e" L"\0" L"\xfe0f" L"\0" L"\xfe4d" L"\0" L"\xfe4e" L"\0" L"\xfe4f" ++ L"\0" L"\xfe50" L"\0" L"\xfe52" L"\0" L"\xfe54" L"\0" L"\xfe55" L"\0" ++ L"\xfe56" L"\0" L"\xfe57" L"\0" L"\xfe59" L"\0" L"\xfe5a" L"\0" L"\xfe5b" ++ L"\0" L"\xfe5c" L"\0" L"\xfe5f" L"\0" L"\xfe60" L"\0" L"\xfe61" L"\0" ++ L"\xfe62" L"\0" L"\xfe63" L"\0" L"\xfe64" L"\0" L"\xfe65" L"\0" L"\xfe66" ++ L"\0" L"\xfe68" L"\0" L"\xfe69" L"\0" L"\xfe6a" L"\0" L"\xfe6b" L"\0" ++ L"\xfeff" L"\0" L"\xff01" L"\0" L"\xff02" L"\0" L"\xff03" L"\0" L"\xff04" ++ L"\0" L"\xff05" L"\0" L"\xff06" L"\0" L"\xff07" L"\0" L"\xff08" L"\0" ++ L"\xff09" L"\0" L"\xff0a" L"\0" L"\xff0b" L"\0" L"\xff0c" L"\0" L"\xff0d" ++ L"\0" L"\xff0e" L"\0" L"\xff0f" L"\0" L"\xff10" L"\0" L"\xff11" L"\0" ++ L"\xff12" L"\0" L"\xff13" L"\0" L"\xff14" L"\0" L"\xff15" L"\0" L"\xff16" ++ L"\0" L"\xff17" L"\0" L"\xff18" L"\0" L"\xff19" L"\0" L"\xff1a" L"\0" ++ L"\xff1b" L"\0" L"\xff1c" L"\0" L"\xff1d" L"\0" L"\xff1e" L"\0" L"\xff1f" ++ L"\0" L"\xff20" L"\0" L"\xff21" L"\0" L"\xff22" L"\0" L"\xff23" L"\0" ++ L"\xff24" L"\0" L"\xff25" L"\0" L"\xff26" L"\0" L"\xff27" L"\0" L"\xff28" ++ L"\0" L"\xff29" L"\0" L"\xff2a" L"\0" L"\xff2b" L"\0" L"\xff2c" L"\0" ++ L"\xff2d" L"\0" L"\xff2e" L"\0" L"\xff2f" L"\0" L"\xff30" L"\0" L"\xff31" ++ L"\0" L"\xff32" L"\0" L"\xff33" L"\0" L"\xff34" L"\0" L"\xff35" L"\0" ++ L"\xff36" L"\0" L"\xff37" L"\0" L"\xff38" L"\0" L"\xff39" L"\0" L"\xff3a" ++ L"\0" L"\xff3b" L"\0" L"\xff3c" L"\0" L"\xff3d" L"\0" L"\xff3e" L"\0" ++ L"\xff3f" L"\0" L"\xff40" L"\0" L"\xff41" L"\0" L"\xff42" L"\0" L"\xff43" ++ L"\0" L"\xff44" L"\0" L"\xff45" L"\0" L"\xff46" L"\0" L"\xff47" L"\0" ++ L"\xff48" L"\0" L"\xff49" L"\0" L"\xff4a" L"\0" L"\xff4b" L"\0" L"\xff4c" ++ L"\0" L"\xff4d" L"\0" L"\xff4e" L"\0" L"\xff4f" L"\0" L"\xff50" L"\0" ++ L"\xff51" L"\0" L"\xff52" L"\0" L"\xff53" L"\0" L"\xff54" L"\0" L"\xff55" ++ L"\0" L"\xff56" L"\0" L"\xff57" L"\0" L"\xff58" L"\0" L"\xff59" L"\0" ++ L"\xff5a" L"\0" L"\xff5b" L"\0" L"\xff5c" L"\0" L"\xff5d" L"\0" L"\xff5e" ++ L"\0" L"\x0001d400" L"\0" L"\x0001d401" L"\0" L"\x0001d402" L"\0" ++ L"\x0001d403" L"\0" L"\x0001d404" L"\0" L"\x0001d405" L"\0" L"\x0001d406" ++ L"\0" L"\x0001d407" L"\0" L"\x0001d408" L"\0" L"\x0001d409" L"\0" ++ L"\x0001d40a" L"\0" L"\x0001d40b" L"\0" L"\x0001d40c" L"\0" L"\x0001d40d" ++ L"\0" L"\x0001d40e" L"\0" L"\x0001d40f" L"\0" L"\x0001d410" L"\0" ++ L"\x0001d411" L"\0" L"\x0001d412" L"\0" L"\x0001d413" L"\0" L"\x0001d414" ++ L"\0" L"\x0001d415" L"\0" L"\x0001d416" L"\0" L"\x0001d417" L"\0" ++ L"\x0001d418" L"\0" L"\x0001d419" L"\0" L"\x0001d41a" L"\0" L"\x0001d41b" ++ L"\0" L"\x0001d41c" L"\0" L"\x0001d41d" L"\0" L"\x0001d41e" L"\0" ++ L"\x0001d41f" L"\0" L"\x0001d420" L"\0" L"\x0001d421" L"\0" L"\x0001d422" ++ L"\0" L"\x0001d423" L"\0" L"\x0001d424" L"\0" L"\x0001d425" L"\0" ++ L"\x0001d426" L"\0" L"\x0001d427" L"\0" L"\x0001d428" L"\0" L"\x0001d429" ++ L"\0" L"\x0001d42a" L"\0" L"\x0001d42b" L"\0" L"\x0001d42c" L"\0" ++ L"\x0001d42d" L"\0" L"\x0001d42e" L"\0" L"\x0001d42f" L"\0" L"\x0001d430" ++ L"\0" L"\x0001d431" L"\0" L"\x0001d432" L"\0" L"\x0001d433" L"\0" ++ L"\x0001d434" L"\0" L"\x0001d435" L"\0" L"\x0001d436" L"\0" L"\x0001d437" ++ L"\0" L"\x0001d438" L"\0" L"\x0001d439" L"\0" L"\x0001d43a" L"\0" ++ L"\x0001d43b" L"\0" L"\x0001d43c" L"\0" L"\x0001d43d" L"\0" L"\x0001d43e" ++ L"\0" L"\x0001d43f" L"\0" L"\x0001d440" L"\0" L"\x0001d441" L"\0" ++ L"\x0001d442" L"\0" L"\x0001d443" L"\0" L"\x0001d444" L"\0" L"\x0001d445" ++ L"\0" L"\x0001d446" L"\0" L"\x0001d447" L"\0" L"\x0001d448" L"\0" ++ L"\x0001d449" L"\0" L"\x0001d44a" L"\0" L"\x0001d44b" L"\0" L"\x0001d44c" ++ L"\0" L"\x0001d44d" L"\0" L"\x0001d44e" L"\0" L"\x0001d44f" L"\0" ++ L"\x0001d450" L"\0" L"\x0001d451" L"\0" L"\x0001d452" L"\0" L"\x0001d453" ++ L"\0" L"\x0001d454" L"\0" L"\x0001d456" L"\0" L"\x0001d457" L"\0" ++ L"\x0001d458" L"\0" L"\x0001d459" L"\0" L"\x0001d45a" L"\0" L"\x0001d45b" ++ L"\0" L"\x0001d45c" L"\0" L"\x0001d45d" L"\0" L"\x0001d45e" L"\0" ++ L"\x0001d45f" L"\0" L"\x0001d460" L"\0" L"\x0001d461" L"\0" L"\x0001d462" ++ L"\0" L"\x0001d463" L"\0" L"\x0001d464" L"\0" L"\x0001d465" L"\0" ++ L"\x0001d466" L"\0" L"\x0001d467" L"\0" L"\x0001d468" L"\0" L"\x0001d469" ++ L"\0" L"\x0001d46a" L"\0" L"\x0001d46b" L"\0" L"\x0001d46c" L"\0" ++ L"\x0001d46d" L"\0" L"\x0001d46e" L"\0" L"\x0001d46f" L"\0" L"\x0001d470" ++ L"\0" L"\x0001d471" L"\0" L"\x0001d472" L"\0" L"\x0001d473" L"\0" ++ L"\x0001d474" L"\0" L"\x0001d475" L"\0" L"\x0001d476" L"\0" L"\x0001d477" ++ L"\0" L"\x0001d478" L"\0" L"\x0001d479" L"\0" L"\x0001d47a" L"\0" ++ L"\x0001d47b" L"\0" L"\x0001d47c" L"\0" L"\x0001d47d" L"\0" L"\x0001d47e" ++ L"\0" L"\x0001d47f" L"\0" L"\x0001d480" L"\0" L"\x0001d481" L"\0" ++ L"\x0001d482" L"\0" L"\x0001d483" L"\0" L"\x0001d484" L"\0" L"\x0001d485" ++ L"\0" L"\x0001d486" L"\0" L"\x0001d487" L"\0" L"\x0001d488" L"\0" ++ L"\x0001d489" L"\0" L"\x0001d48a" L"\0" L"\x0001d48b" L"\0" L"\x0001d48c" ++ L"\0" L"\x0001d48d" L"\0" L"\x0001d48e" L"\0" L"\x0001d48f" L"\0" ++ L"\x0001d490" L"\0" L"\x0001d491" L"\0" L"\x0001d492" L"\0" L"\x0001d493" ++ L"\0" L"\x0001d494" L"\0" L"\x0001d495" L"\0" L"\x0001d496" L"\0" ++ L"\x0001d497" L"\0" L"\x0001d498" L"\0" L"\x0001d499" L"\0" L"\x0001d49a" ++ L"\0" L"\x0001d49b" L"\0" L"\x0001d49c" L"\0" L"\x0001d49e" L"\0" ++ L"\x0001d49f" L"\0" L"\x0001d4a2" L"\0" L"\x0001d4a5" L"\0" L"\x0001d4a6" ++ L"\0" L"\x0001d4a9" L"\0" L"\x0001d4aa" L"\0" L"\x0001d4ab" L"\0" ++ L"\x0001d4ac" L"\0" L"\x0001d4ae" L"\0" L"\x0001d4af" L"\0" L"\x0001d4b0" ++ L"\0" L"\x0001d4b1" L"\0" L"\x0001d4b2" L"\0" L"\x0001d4b3" L"\0" ++ L"\x0001d4b4" L"\0" L"\x0001d4b5" L"\0" L"\x0001d4b6" L"\0" L"\x0001d4b7" ++ L"\0" L"\x0001d4b8" L"\0" L"\x0001d4b9" L"\0" L"\x0001d4bb" L"\0" ++ L"\x0001d4bd" L"\0" L"\x0001d4be" L"\0" L"\x0001d4bf" L"\0" L"\x0001d4c0" ++ L"\0" L"\x0001d4c2" L"\0" L"\x0001d4c3" L"\0" L"\x0001d4c5" L"\0" ++ L"\x0001d4c6" L"\0" L"\x0001d4c7" L"\0" L"\x0001d4c8" L"\0" L"\x0001d4c9" ++ L"\0" L"\x0001d4ca" L"\0" L"\x0001d4cb" L"\0" L"\x0001d4cc" L"\0" ++ L"\x0001d4cd" L"\0" L"\x0001d4ce" L"\0" L"\x0001d4cf" L"\0" L"\x0001d4d0" ++ L"\0" L"\x0001d4d1" L"\0" L"\x0001d4d2" L"\0" L"\x0001d4d3" L"\0" ++ L"\x0001d4d4" L"\0" L"\x0001d4d5" L"\0" L"\x0001d4d6" L"\0" L"\x0001d4d7" ++ L"\0" L"\x0001d4d8" L"\0" L"\x0001d4d9" L"\0" L"\x0001d4da" L"\0" ++ L"\x0001d4db" L"\0" L"\x0001d4dc" L"\0" L"\x0001d4dd" L"\0" L"\x0001d4de" ++ L"\0" L"\x0001d4df" L"\0" L"\x0001d4e0" L"\0" L"\x0001d4e1" L"\0" ++ L"\x0001d4e2" L"\0" L"\x0001d4e3" L"\0" L"\x0001d4e4" L"\0" L"\x0001d4e5" ++ L"\0" L"\x0001d4e6" L"\0" L"\x0001d4e7" L"\0" L"\x0001d4e8" L"\0" ++ L"\x0001d4e9" L"\0" L"\x0001d4ea" L"\0" L"\x0001d4eb" L"\0" L"\x0001d4ec" ++ L"\0" L"\x0001d4ed" L"\0" L"\x0001d4ee" L"\0" L"\x0001d4ef" L"\0" ++ L"\x0001d4f0" L"\0" L"\x0001d4f1" L"\0" L"\x0001d4f2" L"\0" L"\x0001d4f3" ++ L"\0" L"\x0001d4f4" L"\0" L"\x0001d4f5" L"\0" L"\x0001d4f6" L"\0" ++ L"\x0001d4f7" L"\0" L"\x0001d4f8" L"\0" L"\x0001d4f9" L"\0" L"\x0001d4fa" ++ L"\0" L"\x0001d4fb" L"\0" L"\x0001d4fc" L"\0" L"\x0001d4fd" L"\0" ++ L"\x0001d4fe" L"\0" L"\x0001d4ff" L"\0" L"\x0001d500" L"\0" L"\x0001d501" ++ L"\0" L"\x0001d502" L"\0" L"\x0001d503" L"\0" L"\x0001d504" L"\0" ++ L"\x0001d505" L"\0" L"\x0001d507" L"\0" L"\x0001d508" L"\0" L"\x0001d509" ++ L"\0" L"\x0001d50a" L"\0" L"\x0001d50d" L"\0" L"\x0001d50e" L"\0" ++ L"\x0001d50f" L"\0" L"\x0001d510" L"\0" L"\x0001d511" L"\0" L"\x0001d512" ++ L"\0" L"\x0001d513" L"\0" L"\x0001d514" L"\0" L"\x0001d516" L"\0" ++ L"\x0001d517" L"\0" L"\x0001d518" L"\0" L"\x0001d519" L"\0" L"\x0001d51a" ++ L"\0" L"\x0001d51b" L"\0" L"\x0001d51c" L"\0" L"\x0001d51e" L"\0" ++ L"\x0001d51f" L"\0" L"\x0001d520" L"\0" L"\x0001d521" L"\0" L"\x0001d522" ++ L"\0" L"\x0001d523" L"\0" L"\x0001d524" L"\0" L"\x0001d525" L"\0" ++ L"\x0001d526" L"\0" L"\x0001d527" L"\0" L"\x0001d528" L"\0" L"\x0001d529" ++ L"\0" L"\x0001d52a" L"\0" L"\x0001d52b" L"\0" L"\x0001d52c" L"\0" ++ L"\x0001d52d" L"\0" L"\x0001d52e" L"\0" L"\x0001d52f" L"\0" L"\x0001d530" ++ L"\0" L"\x0001d531" L"\0" L"\x0001d532" L"\0" L"\x0001d533" L"\0" ++ L"\x0001d534" L"\0" L"\x0001d535" L"\0" L"\x0001d536" L"\0" L"\x0001d537" ++ L"\0" L"\x0001d538" L"\0" L"\x0001d539" L"\0" L"\x0001d53b" L"\0" ++ L"\x0001d53c" L"\0" L"\x0001d53d" L"\0" L"\x0001d53e" L"\0" L"\x0001d540" ++ L"\0" L"\x0001d541" L"\0" L"\x0001d542" L"\0" L"\x0001d543" L"\0" ++ L"\x0001d544" L"\0" L"\x0001d546" L"\0" L"\x0001d54a" L"\0" L"\x0001d54b" ++ L"\0" L"\x0001d54c" L"\0" L"\x0001d54d" L"\0" L"\x0001d54e" L"\0" ++ L"\x0001d54f" L"\0" L"\x0001d550" L"\0" L"\x0001d552" L"\0" L"\x0001d553" ++ L"\0" L"\x0001d554" L"\0" L"\x0001d555" L"\0" L"\x0001d556" L"\0" ++ L"\x0001d557" L"\0" L"\x0001d558" L"\0" L"\x0001d559" L"\0" L"\x0001d55a" ++ L"\0" L"\x0001d55b" L"\0" L"\x0001d55c" L"\0" L"\x0001d55d" L"\0" ++ L"\x0001d55e" L"\0" L"\x0001d55f" L"\0" L"\x0001d560" L"\0" L"\x0001d561" ++ L"\0" L"\x0001d562" L"\0" L"\x0001d563" L"\0" L"\x0001d564" L"\0" ++ L"\x0001d565" L"\0" L"\x0001d566" L"\0" L"\x0001d567" L"\0" L"\x0001d568" ++ L"\0" L"\x0001d569" L"\0" L"\x0001d56a" L"\0" L"\x0001d56b" L"\0" ++ L"\x0001d56c" L"\0" L"\x0001d56d" L"\0" L"\x0001d56e" L"\0" L"\x0001d56f" ++ L"\0" L"\x0001d570" L"\0" L"\x0001d571" L"\0" L"\x0001d572" L"\0" ++ L"\x0001d573" L"\0" L"\x0001d574" L"\0" L"\x0001d575" L"\0" L"\x0001d576" ++ L"\0" L"\x0001d577" L"\0" L"\x0001d578" L"\0" L"\x0001d579" L"\0" ++ L"\x0001d57a" L"\0" L"\x0001d57b" L"\0" L"\x0001d57c" L"\0" L"\x0001d57d" ++ L"\0" L"\x0001d57e" L"\0" L"\x0001d57f" L"\0" L"\x0001d580" L"\0" ++ L"\x0001d581" L"\0" L"\x0001d582" L"\0" L"\x0001d583" L"\0" L"\x0001d584" ++ L"\0" L"\x0001d585" L"\0" L"\x0001d586" L"\0" L"\x0001d587" L"\0" ++ L"\x0001d588" L"\0" L"\x0001d589" L"\0" L"\x0001d58a" L"\0" L"\x0001d58b" ++ L"\0" L"\x0001d58c" L"\0" L"\x0001d58d" L"\0" L"\x0001d58e" L"\0" ++ L"\x0001d58f" L"\0" L"\x0001d590" L"\0" L"\x0001d591" L"\0" L"\x0001d592" ++ L"\0" L"\x0001d593" L"\0" L"\x0001d594" L"\0" L"\x0001d595" L"\0" ++ L"\x0001d596" L"\0" L"\x0001d597" L"\0" L"\x0001d598" L"\0" L"\x0001d599" ++ L"\0" L"\x0001d59a" L"\0" L"\x0001d59b" L"\0" L"\x0001d59c" L"\0" ++ L"\x0001d59d" L"\0" L"\x0001d59e" L"\0" L"\x0001d59f" L"\0" L"\x0001d5a0" ++ L"\0" L"\x0001d5a1" L"\0" L"\x0001d5a2" L"\0" L"\x0001d5a3" L"\0" ++ L"\x0001d5a4" L"\0" L"\x0001d5a5" L"\0" L"\x0001d5a6" L"\0" L"\x0001d5a7" ++ L"\0" L"\x0001d5a8" L"\0" L"\x0001d5a9" L"\0" L"\x0001d5aa" L"\0" ++ L"\x0001d5ab" L"\0" L"\x0001d5ac" L"\0" L"\x0001d5ad" L"\0" L"\x0001d5ae" ++ L"\0" L"\x0001d5af" L"\0" L"\x0001d5b0" L"\0" L"\x0001d5b1" L"\0" ++ L"\x0001d5b2" L"\0" L"\x0001d5b3" L"\0" L"\x0001d5b4" L"\0" L"\x0001d5b5" ++ L"\0" L"\x0001d5b6" L"\0" L"\x0001d5b7" L"\0" L"\x0001d5b8" L"\0" ++ L"\x0001d5b9" L"\0" L"\x0001d5ba" L"\0" L"\x0001d5bb" L"\0" L"\x0001d5bc" ++ L"\0" L"\x0001d5bd" L"\0" L"\x0001d5be" L"\0" L"\x0001d5bf" L"\0" ++ L"\x0001d5c0" L"\0" L"\x0001d5c1" L"\0" L"\x0001d5c2" L"\0" L"\x0001d5c3" ++ L"\0" L"\x0001d5c4" L"\0" L"\x0001d5c5" L"\0" L"\x0001d5c6" L"\0" ++ L"\x0001d5c7" L"\0" L"\x0001d5c8" L"\0" L"\x0001d5c9" L"\0" L"\x0001d5ca" ++ L"\0" L"\x0001d5cb" L"\0" L"\x0001d5cc" L"\0" L"\x0001d5cd" L"\0" ++ L"\x0001d5ce" L"\0" L"\x0001d5cf" L"\0" L"\x0001d5d0" L"\0" L"\x0001d5d1" ++ L"\0" L"\x0001d5d2" L"\0" L"\x0001d5d3" L"\0" L"\x0001d5d4" L"\0" ++ L"\x0001d5d5" L"\0" L"\x0001d5d6" L"\0" L"\x0001d5d7" L"\0" L"\x0001d5d8" ++ L"\0" L"\x0001d5d9" L"\0" L"\x0001d5da" L"\0" L"\x0001d5db" L"\0" ++ L"\x0001d5dc" L"\0" L"\x0001d5dd" L"\0" L"\x0001d5de" L"\0" L"\x0001d5df" ++ L"\0" L"\x0001d5e0" L"\0" L"\x0001d5e1" L"\0" L"\x0001d5e2" L"\0" ++ L"\x0001d5e3" L"\0" L"\x0001d5e4" L"\0" L"\x0001d5e5" L"\0" L"\x0001d5e6" ++ L"\0" L"\x0001d5e7" L"\0" L"\x0001d5e8" L"\0" L"\x0001d5e9" L"\0" ++ L"\x0001d5ea" L"\0" L"\x0001d5eb" L"\0" L"\x0001d5ec" L"\0" L"\x0001d5ed" ++ L"\0" L"\x0001d5ee" L"\0" L"\x0001d5ef" L"\0" L"\x0001d5f0" L"\0" ++ L"\x0001d5f1" L"\0" L"\x0001d5f2" L"\0" L"\x0001d5f3" L"\0" L"\x0001d5f4" ++ L"\0" L"\x0001d5f5" L"\0" L"\x0001d5f6" L"\0" L"\x0001d5f7" L"\0" ++ L"\x0001d5f8" L"\0" L"\x0001d5f9" L"\0" L"\x0001d5fa" L"\0" L"\x0001d5fb" ++ L"\0" L"\x0001d5fc" L"\0" L"\x0001d5fd" L"\0" L"\x0001d5fe" L"\0" ++ L"\x0001d5ff" L"\0" L"\x0001d600" L"\0" L"\x0001d601" L"\0" L"\x0001d602" ++ L"\0" L"\x0001d603" L"\0" L"\x0001d604" L"\0" L"\x0001d605" L"\0" ++ L"\x0001d606" L"\0" L"\x0001d607" L"\0" L"\x0001d608" L"\0" L"\x0001d609" ++ L"\0" L"\x0001d60a" L"\0" L"\x0001d60b" L"\0" L"\x0001d60c" L"\0" ++ L"\x0001d60d" L"\0" L"\x0001d60e" L"\0" L"\x0001d60f" L"\0" L"\x0001d610" ++ L"\0" L"\x0001d611" L"\0" L"\x0001d612" L"\0" L"\x0001d613" L"\0" ++ L"\x0001d614" L"\0" L"\x0001d615" L"\0" L"\x0001d616" L"\0" L"\x0001d617" ++ L"\0" L"\x0001d618" L"\0" L"\x0001d619" L"\0" L"\x0001d61a" L"\0" ++ L"\x0001d61b" L"\0" L"\x0001d61c" L"\0" L"\x0001d61d" L"\0" L"\x0001d61e" ++ L"\0" L"\x0001d61f" L"\0" L"\x0001d620" L"\0" L"\x0001d621" L"\0" ++ L"\x0001d622" L"\0" L"\x0001d623" L"\0" L"\x0001d624" L"\0" L"\x0001d625" ++ L"\0" L"\x0001d626" L"\0" L"\x0001d627" L"\0" L"\x0001d628" L"\0" ++ L"\x0001d629" L"\0" L"\x0001d62a" L"\0" L"\x0001d62b" L"\0" L"\x0001d62c" ++ L"\0" L"\x0001d62d" L"\0" L"\x0001d62e" L"\0" L"\x0001d62f" L"\0" ++ L"\x0001d630" L"\0" L"\x0001d631" L"\0" L"\x0001d632" L"\0" L"\x0001d633" ++ L"\0" L"\x0001d634" L"\0" L"\x0001d635" L"\0" L"\x0001d636" L"\0" ++ L"\x0001d637" L"\0" L"\x0001d638" L"\0" L"\x0001d639" L"\0" L"\x0001d63a" ++ L"\0" L"\x0001d63b" L"\0" L"\x0001d63c" L"\0" L"\x0001d63d" L"\0" ++ L"\x0001d63e" L"\0" L"\x0001d63f" L"\0" L"\x0001d640" L"\0" L"\x0001d641" ++ L"\0" L"\x0001d642" L"\0" L"\x0001d643" L"\0" L"\x0001d644" L"\0" ++ L"\x0001d645" L"\0" L"\x0001d646" L"\0" L"\x0001d647" L"\0" L"\x0001d648" ++ L"\0" L"\x0001d649" L"\0" L"\x0001d64a" L"\0" L"\x0001d64b" L"\0" ++ L"\x0001d64c" L"\0" L"\x0001d64d" L"\0" L"\x0001d64e" L"\0" L"\x0001d64f" ++ L"\0" L"\x0001d650" L"\0" L"\x0001d651" L"\0" L"\x0001d652" L"\0" ++ L"\x0001d653" L"\0" L"\x0001d654" L"\0" L"\x0001d655" L"\0" L"\x0001d656" ++ L"\0" L"\x0001d657" L"\0" L"\x0001d658" L"\0" L"\x0001d659" L"\0" ++ L"\x0001d65a" L"\0" L"\x0001d65b" L"\0" L"\x0001d65c" L"\0" L"\x0001d65d" ++ L"\0" L"\x0001d65e" L"\0" L"\x0001d65f" L"\0" L"\x0001d660" L"\0" ++ L"\x0001d661" L"\0" L"\x0001d662" L"\0" L"\x0001d663" L"\0" L"\x0001d664" ++ L"\0" L"\x0001d665" L"\0" L"\x0001d666" L"\0" L"\x0001d667" L"\0" ++ L"\x0001d668" L"\0" L"\x0001d669" L"\0" L"\x0001d66a" L"\0" L"\x0001d66b" ++ L"\0" L"\x0001d66c" L"\0" L"\x0001d66d" L"\0" L"\x0001d66e" L"\0" ++ L"\x0001d66f" L"\0" L"\x0001d670" L"\0" L"\x0001d671" L"\0" L"\x0001d672" ++ L"\0" L"\x0001d673" L"\0" L"\x0001d674" L"\0" L"\x0001d675" L"\0" ++ L"\x0001d676" L"\0" L"\x0001d677" L"\0" L"\x0001d678" L"\0" L"\x0001d679" ++ L"\0" L"\x0001d67a" L"\0" L"\x0001d67b" L"\0" L"\x0001d67c" L"\0" ++ L"\x0001d67d" L"\0" L"\x0001d67e" L"\0" L"\x0001d67f" L"\0" L"\x0001d680" ++ L"\0" L"\x0001d681" L"\0" L"\x0001d682" L"\0" L"\x0001d683" L"\0" ++ L"\x0001d684" L"\0" L"\x0001d685" L"\0" L"\x0001d686" L"\0" L"\x0001d687" ++ L"\0" L"\x0001d688" L"\0" L"\x0001d689" L"\0" L"\x0001d68a" L"\0" ++ L"\x0001d68b" L"\0" L"\x0001d68c" L"\0" L"\x0001d68d" L"\0" L"\x0001d68e" ++ L"\0" L"\x0001d68f" L"\0" L"\x0001d690" L"\0" L"\x0001d691" L"\0" ++ L"\x0001d692" L"\0" L"\x0001d693" L"\0" L"\x0001d694" L"\0" L"\x0001d695" ++ L"\0" L"\x0001d696" L"\0" L"\x0001d697" L"\0" L"\x0001d698" L"\0" ++ L"\x0001d699" L"\0" L"\x0001d69a" L"\0" L"\x0001d69b" L"\0" L"\x0001d69c" ++ L"\0" L"\x0001d69d" L"\0" L"\x0001d69e" L"\0" L"\x0001d69f" L"\0" ++ L"\x0001d6a0" L"\0" L"\x0001d6a1" L"\0" L"\x0001d6a2" L"\0" L"\x0001d6a3" ++ L"\0" L"\x0001d7ce" L"\0" L"\x0001d7cf" L"\0" L"\x0001d7d0" L"\0" ++ L"\x0001d7d1" L"\0" L"\x0001d7d2" L"\0" L"\x0001d7d3" L"\0" L"\x0001d7d4" ++ L"\0" L"\x0001d7d5" L"\0" L"\x0001d7d6" L"\0" L"\x0001d7d7" L"\0" ++ L"\x0001d7d8" L"\0" L"\x0001d7d9" L"\0" L"\x0001d7da" L"\0" L"\x0001d7db" ++ L"\0" L"\x0001d7dc" L"\0" L"\x0001d7dd" L"\0" L"\x0001d7de" L"\0" ++ L"\x0001d7df" L"\0" L"\x0001d7e0" L"\0" L"\x0001d7e1" L"\0" L"\x0001d7e2" ++ L"\0" L"\x0001d7e3" L"\0" L"\x0001d7e4" L"\0" L"\x0001d7e5" L"\0" ++ L"\x0001d7e6" L"\0" L"\x0001d7e7" L"\0" L"\x0001d7e8" L"\0" L"\x0001d7e9" ++ L"\0" L"\x0001d7ea" L"\0" L"\x0001d7eb" L"\0" L"\x0001d7ec" L"\0" ++ L"\x0001d7ed" L"\0" L"\x0001d7ee" L"\0" L"\x0001d7ef" L"\0" L"\x0001d7f0" ++ L"\0" L"\x0001d7f1" L"\0" L"\x0001d7f2" L"\0" L"\x0001d7f3" L"\0" ++ L"\x0001d7f4" L"\0" L"\x0001d7f5" L"\0" L"\x0001d7f6" L"\0" L"\x0001d7f7" ++ L"\0" L"\x0001d7f8" L"\0" L"\x0001d7f9" L"\0" L"\x0001d7fa" L"\0" ++ L"\x0001d7fb" L"\0" L"\x0001d7fc" L"\0" L"\x0001d7fd" L"\0" L"\x0001d7fe" ++ L"\0" L"\x0001d7ff"; + static const uint32_t translit_to_idx[] = + { + 0, 3, 8, 12, 15, 20, 23, 26, 30, 37, 44, 51, +@@ -471,22 +471,22 @@ static const uint32_t translit_to_idx[] + 180, 183, 186, 189, 192, 196, 199, 202, 205, 208, 211, 214, + 217, 221, 224, 227, 230, 233, 237, 242, 245, 248, 252, 257, + 260, 263, 267, 270, 274, 278, 282, 285, 287, 289, 291, 293, +- 297, 302, 307, 312, 315, 320, 325, 328, 331, 334, 337, 340, +- 343, 346, 349, 352, 355, 359, 362, 365, 368, 371, 374, 379, +- 385, 388, 393, 396, 399, 402, 405, 408, 411, 414, 417, 420, +- 423, 426, 429, 432, 435, 438, 445, 452, 459, 466, 473, 480, +- 487, 494, 501, 508, 515, 522, 527, 530, 534, 539, 543, 546, +- 550, 555, 561, 565, 568, 572, 577, 580, 583, 586, 589, 592, +- 596, 601, 605, 608, 612, 617, 623, 627, 630, 634, 639, 642, +- 645, 648, 651, 655, 659, 664, 668, 672, 677, 680, 683, 686, +- 689, 692, 695, 698, 702, 706, 710, 714, 719, 724, 729, 734, +- 739, 744, 749, 754, 759, 764, 768, 772, 776, 780, 784, 788, +- 792, 796, 801, 806, 811, 816, 821, 826, 831, 836, 841, 845, +- 850, 855, 859, 863, 867, 871, 875, 880, 883, 887, 892, 897, +- 902, 907, 912, 917, 922, 927, 932, 938, 944, 950, 956, 962, +- 968, 974, 980, 986, 992, 998, 1003, 1008, 1013, 1018, 1023, 1028, +- 1033, 1038, 1043, 1049, 1055, 1061, 1067, 1073, 1079, 1085, 1091, 1097, +- 1103, 1109, 1113, 1117, 1121, 1125, 1129, 1133, 1137, 1141, 1145, 1150, ++ 297, 302, 307, 312, 317, 320, 325, 330, 333, 336, 339, 342, ++ 345, 348, 351, 354, 357, 360, 364, 367, 370, 373, 376, 379, ++ 384, 390, 393, 398, 401, 404, 407, 410, 413, 416, 419, 422, ++ 425, 428, 431, 434, 437, 440, 443, 450, 457, 464, 471, 478, ++ 485, 492, 499, 506, 513, 520, 527, 532, 535, 539, 544, 548, ++ 551, 555, 560, 566, 570, 573, 577, 582, 585, 588, 591, 594, ++ 597, 601, 606, 610, 613, 617, 622, 628, 632, 635, 639, 644, ++ 647, 650, 653, 656, 660, 664, 669, 673, 677, 682, 685, 688, ++ 691, 694, 697, 700, 703, 707, 711, 715, 719, 724, 729, 734, ++ 739, 744, 749, 754, 759, 764, 769, 773, 777, 781, 785, 789, ++ 793, 797, 801, 806, 811, 816, 821, 826, 831, 836, 841, 846, ++ 850, 855, 860, 864, 868, 872, 876, 880, 885, 888, 892, 897, ++ 902, 907, 912, 917, 922, 927, 932, 937, 943, 949, 955, 961, ++ 967, 973, 979, 985, 991, 997, 1003, 1008, 1013, 1018, 1023, 1028, ++ 1033, 1038, 1043, 1048, 1054, 1060, 1066, 1072, 1078, 1084, 1090, 1096, ++ 1102, 1108, 1114, 1118, 1122, 1126, 1130, 1134, 1138, 1142, 1146, 1150, + 1155, 1160, 1165, 1170, 1175, 1180, 1185, 1190, 1195, 1200, 1205, 1210, + 1215, 1220, 1225, 1230, 1235, 1240, 1245, 1250, 1255, 1260, 1265, 1270, + 1275, 1280, 1285, 1290, 1295, 1300, 1305, 1310, 1315, 1320, 1325, 1330, +@@ -494,89 +494,89 @@ static const uint32_t translit_to_idx[] + 1395, 1400, 1405, 1410, 1415, 1420, 1425, 1430, 1435, 1440, 1445, 1450, + 1455, 1460, 1465, 1470, 1475, 1480, 1485, 1490, 1495, 1500, 1505, 1510, + 1515, 1520, 1525, 1530, 1535, 1540, 1545, 1550, 1555, 1560, 1565, 1570, +- 1575, 1580, 1585, 1590, 1595, 1598, 1601, 1604, 1607, 1610, 1613, 1616, +- 1619, 1622, 1625, 1628, 1631, 1636, 1640, 1645, 1648, 1651, 1657, 1663, +- 1669, 1675, 1681, 1687, 1693, 1699, 1705, 1711, 1717, 1723, 1729, 1735, +- 1741, 1747, 1753, 1759, 1765, 1771, 1777, 1783, 1789, 1795, 1801, 1807, +- 1813, 1819, 1825, 1831, 1836, 1840, 1844, 1849, 1853, 1857, 1861, 1865, +- 1869, 1873, 1877, 1881, 1885, 1889, 1894, 1900, 1904, 1908, 1912, 1916, +- 1920, 1924, 1928, 1933, 1938, 1943, 1948, 1952, 1956, 1960, 1964, 1968, +- 1972, 1976, 1980, 1984, 1988, 1994, 2000, 2005, 2011, 2017, 2023, 2028, +- 2034, 2039, 2046, 2050, 2055, 2060, 2065, 2070, 2077, 2086, 2090, 2094, +- 2098, 2102, 2106, 2110, 2114, 2118, 2122, 2126, 2130, 2134, 2138, 2142, +- 2146, 2150, 2156, 2160, 2164, 2168, 2174, 2179, 2183, 2187, 2191, 2195, +- 2199, 2203, 2207, 2211, 2215, 2219, 2224, 2228, 2232, 2237, 2242, 2246, +- 2252, 2257, 2261, 2265, 2269, 2273, 2277, 2281, 2285, 2290, 2295, 2299, +- 2302, 2304, 2306, 2308, 2310, 2312, 2314, 2316, 2318, 2320, 2322, 2324, +- 2326, 2328, 2330, 2332, 2334, 2337, 2340, 2343, 2346, 2349, 2352, 2355, +- 2358, 2361, 2364, 2367, 2370, 2373, 2376, 2379, 2382, 2385, 2388, 2391, +- 2394, 2397, 2400, 2403, 2406, 2409, 2411, 2414, 2417, 2420, 2423, 2426, +- 2429, 2432, 2435, 2438, 2441, 2444, 2447, 2450, 2453, 2456, 2459, 2462, +- 2465, 2468, 2471, 2474, 2477, 2480, 2483, 2486, 2489, 2492, 2495, 2498, +- 2501, 2504, 2507, 2510, 2513, 2516, 2519, 2522, 2525, 2528, 2531, 2534, +- 2537, 2540, 2543, 2546, 2549, 2552, 2555, 2558, 2561, 2564, 2567, 2570, +- 2573, 2576, 2579, 2582, 2585, 2588, 2591, 2594, 2597, 2600, 2603, 2606, +- 2609, 2612, 2615, 2618, 2621, 2624, 2627, 2630, 2633, 2636, 2639, 2642, +- 2645, 2648, 2651, 2654, 2657, 2660, 2663, 2666, 2669, 2672, 2675, 2678, +- 2681, 2684, 2687, 2690, 2693, 2696, 2699, 2702, 2705, 2708, 2711, 2714, +- 2717, 2720, 2723, 2726, 2729, 2732, 2735, 2738, 2741, 2744, 2747, 2750, +- 2753, 2756, 2759, 2762, 2765, 2768, 2771, 2774, 2777, 2780, 2783, 2786, +- 2789, 2792, 2795, 2798, 2801, 2804, 2807, 2810, 2813, 2816, 2819, 2822, +- 2825, 2828, 2831, 2834, 2837, 2840, 2843, 2846, 2849, 2852, 2855, 2858, +- 2861, 2864, 2867, 2870, 2873, 2876, 2879, 2882, 2885, 2888, 2891, 2894, +- 2897, 2900, 2903, 2906, 2909, 2912, 2915, 2918, 2921, 2924, 2927, 2930, +- 2933, 2936, 2939, 2942, 2945, 2948, 2951, 2954, 2957, 2960, 2963, 2966, +- 2969, 2972, 2975, 2978, 2981, 2984, 2987, 2990, 2993, 2996, 2999, 3002, +- 3005, 3008, 3011, 3014, 3017, 3020, 3023, 3026, 3029, 3032, 3035, 3038, +- 3041, 3044, 3047, 3050, 3053, 3056, 3059, 3062, 3065, 3068, 3071, 3074, +- 3077, 3080, 3083, 3086, 3089, 3092, 3095, 3098, 3101, 3104, 3107, 3110, +- 3113, 3116, 3119, 3122, 3125, 3128, 3131, 3134, 3137, 3140, 3143, 3146, +- 3149, 3152, 3155, 3158, 3161, 3164, 3167, 3170, 3173, 3176, 3179, 3182, +- 3185, 3188, 3191, 3194, 3197, 3200, 3203, 3206, 3209, 3212, 3215, 3218, +- 3221, 3224, 3227, 3230, 3233, 3236, 3239, 3242, 3245, 3248, 3251, 3254, +- 3257, 3260, 3263, 3266, 3269, 3272, 3275, 3278, 3281, 3284, 3287, 3290, +- 3293, 3296, 3299, 3302, 3305, 3308, 3311, 3314, 3317, 3320, 3323, 3326, +- 3329, 3332, 3335, 3338, 3341, 3344, 3347, 3350, 3353, 3356, 3359, 3362, +- 3365, 3368, 3371, 3374, 3377, 3380, 3383, 3386, 3389, 3392, 3395, 3398, +- 3401, 3404, 3407, 3410, 3413, 3416, 3419, 3422, 3425, 3428, 3431, 3434, +- 3437, 3440, 3443, 3446, 3449, 3452, 3455, 3458, 3461, 3464, 3467, 3470, +- 3473, 3476, 3479, 3482, 3485, 3488, 3491, 3494, 3497, 3500, 3503, 3506, +- 3509, 3512, 3515, 3518, 3521, 3524, 3527, 3530, 3533, 3536, 3539, 3542, +- 3545, 3548, 3551, 3554, 3557, 3560, 3563, 3566, 3569, 3572, 3575, 3578, +- 3581, 3584, 3587, 3590, 3593, 3596, 3599, 3602, 3605, 3608, 3611, 3614, +- 3617, 3620, 3623, 3626, 3629, 3632, 3635, 3638, 3641, 3644, 3647, 3650, +- 3653, 3656, 3659, 3662, 3665, 3668, 3671, 3674, 3677, 3680, 3683, 3686, +- 3689, 3692, 3695, 3698, 3701, 3704, 3707, 3710, 3713, 3716, 3719, 3722, +- 3725, 3728, 3731, 3734, 3737, 3740, 3743, 3746, 3749, 3752, 3755, 3758, +- 3761, 3764, 3767, 3770, 3773, 3776, 3779, 3782, 3785, 3788, 3791, 3794, +- 3797, 3800, 3803, 3806, 3809, 3812, 3815, 3818, 3821, 3824, 3827, 3830, +- 3833, 3836, 3839, 3842, 3845, 3848, 3851, 3854, 3857, 3860, 3863, 3866, +- 3869, 3872, 3875, 3878, 3881, 3884, 3887, 3890, 3893, 3896, 3899, 3902, +- 3905, 3908, 3911, 3914, 3917, 3920, 3923, 3926, 3929, 3932, 3935, 3938, +- 3941, 3944, 3947, 3950, 3953, 3956, 3959, 3962, 3965, 3968, 3971, 3974, +- 3977, 3980, 3983, 3986, 3989, 3992, 3995, 3998, 4001, 4004, 4007, 4010, +- 4013, 4016, 4019, 4022, 4025, 4028, 4031, 4034, 4037, 4040, 4043, 4046, +- 4049, 4052, 4055, 4058, 4061, 4064, 4067, 4070, 4073, 4076, 4079, 4082, +- 4085, 4088, 4091, 4094, 4097, 4100, 4103, 4106, 4109, 4112, 4115, 4118, +- 4121, 4124, 4127, 4130, 4133, 4136, 4139, 4142, 4145, 4148, 4151, 4154, +- 4157, 4160, 4163, 4166, 4169, 4172, 4175, 4178, 4181, 4184, 4187, 4190, +- 4193, 4196, 4199, 4202, 4205, 4208, 4211, 4214, 4217, 4220, 4223, 4226, +- 4229, 4232, 4235, 4238, 4241, 4244, 4247, 4250, 4253, 4256, 4259, 4262, +- 4265, 4268, 4271, 4274, 4277, 4280, 4283, 4286, 4289, 4292, 4295, 4298, +- 4301, 4304, 4307, 4310, 4313, 4316, 4319, 4322, 4325, 4328, 4331, 4334, +- 4337, 4340, 4343, 4346, 4349, 4352, 4355, 4358, 4361, 4364, 4367, 4370, +- 4373, 4376, 4379, 4382, 4385, 4388, 4391, 4394, 4397, 4400, 4403, 4406, +- 4409, 4412, 4415, 4418, 4421, 4424, 4427, 4430, 4433, 4436, 4439, 4442, +- 4445, 4448, 4451, 4454, 4457, 4460, 4463, 4466, 4469, 4472, 4475, 4478, +- 4481, 4484, 4487, 4490, 4493, 4496, 4499, 4502, 4505, 4508, 4511, 4514, +- 4517, 4520, 4523, 4526, 4529, 4532, 4535, 4538, 4541, 4544, 4547, 4550, +- 4553, 4556, 4559, 4562, 4565, 4568, 4571, 4574, 4577, 4580, 4583, 4586, +- 4589, 4592, 4595, 4598, 4601, 4604, 4607, 4610, 4613, 4616, 4619, 4622, +- 4625, 4628, 4631, 4634, 4637, 4640, 4643, 4646, 4649, 4652, 4655, 4658, +- 4661, 4664, 4667, 4670, 4673, 4676, 4679, 4682, 4685, 4688, 4691, 4694, +- 4697, 4700, 4703, 4706, 4709, 4712, 4715, 4718, 4721, 4724, 4727, 4730, +- 4733, 4736, 4739, 4742, 4745, 4748, 4751, 4754, 4757, 4760, 4763, 4766, +- 4769, 4772, 4775, 4778, 4781, 4784, 4787, 4790, 4793 ++ 1575, 1580, 1585, 1590, 1595, 1600, 1603, 1606, 1609, 1612, 1615, 1618, ++ 1621, 1624, 1627, 1630, 1633, 1636, 1641, 1645, 1650, 1653, 1656, 1662, ++ 1668, 1674, 1680, 1686, 1692, 1698, 1704, 1710, 1716, 1722, 1728, 1734, ++ 1740, 1746, 1752, 1758, 1764, 1770, 1776, 1782, 1788, 1794, 1800, 1806, ++ 1812, 1818, 1824, 1830, 1836, 1841, 1845, 1849, 1854, 1858, 1862, 1866, ++ 1870, 1874, 1878, 1882, 1886, 1890, 1894, 1899, 1905, 1909, 1913, 1917, ++ 1921, 1925, 1929, 1933, 1938, 1943, 1948, 1953, 1957, 1961, 1965, 1969, ++ 1973, 1977, 1981, 1985, 1989, 1993, 1999, 2005, 2010, 2016, 2022, 2028, ++ 2033, 2039, 2044, 2051, 2055, 2060, 2065, 2070, 2075, 2082, 2091, 2095, ++ 2099, 2103, 2107, 2111, 2115, 2119, 2123, 2127, 2131, 2135, 2139, 2143, ++ 2147, 2151, 2155, 2161, 2165, 2169, 2173, 2179, 2184, 2188, 2192, 2196, ++ 2200, 2204, 2208, 2212, 2216, 2220, 2224, 2229, 2233, 2237, 2242, 2247, ++ 2251, 2257, 2262, 2266, 2270, 2274, 2278, 2282, 2286, 2290, 2295, 2300, ++ 2304, 2307, 2309, 2311, 2313, 2315, 2317, 2319, 2321, 2323, 2325, 2327, ++ 2329, 2331, 2333, 2335, 2337, 2339, 2342, 2345, 2348, 2351, 2354, 2357, ++ 2360, 2363, 2366, 2369, 2372, 2375, 2378, 2381, 2384, 2387, 2390, 2393, ++ 2396, 2399, 2402, 2405, 2408, 2411, 2414, 2416, 2419, 2422, 2425, 2428, ++ 2431, 2434, 2437, 2440, 2443, 2446, 2449, 2452, 2455, 2458, 2461, 2464, ++ 2467, 2470, 2473, 2476, 2479, 2482, 2485, 2488, 2491, 2494, 2497, 2500, ++ 2503, 2506, 2509, 2512, 2515, 2518, 2521, 2524, 2527, 2530, 2533, 2536, ++ 2539, 2542, 2545, 2548, 2551, 2554, 2557, 2560, 2563, 2566, 2569, 2572, ++ 2575, 2578, 2581, 2584, 2587, 2590, 2593, 2596, 2599, 2602, 2605, 2608, ++ 2611, 2614, 2617, 2620, 2623, 2626, 2629, 2632, 2635, 2638, 2641, 2644, ++ 2647, 2650, 2653, 2656, 2659, 2662, 2665, 2668, 2671, 2674, 2677, 2680, ++ 2683, 2686, 2689, 2692, 2695, 2698, 2701, 2704, 2707, 2710, 2713, 2716, ++ 2719, 2722, 2725, 2728, 2731, 2734, 2737, 2740, 2743, 2746, 2749, 2752, ++ 2755, 2758, 2761, 2764, 2767, 2770, 2773, 2776, 2779, 2782, 2785, 2788, ++ 2791, 2794, 2797, 2800, 2803, 2806, 2809, 2812, 2815, 2818, 2821, 2824, ++ 2827, 2830, 2833, 2836, 2839, 2842, 2845, 2848, 2851, 2854, 2857, 2860, ++ 2863, 2866, 2869, 2872, 2875, 2878, 2881, 2884, 2887, 2890, 2893, 2896, ++ 2899, 2902, 2905, 2908, 2911, 2914, 2917, 2920, 2923, 2926, 2929, 2932, ++ 2935, 2938, 2941, 2944, 2947, 2950, 2953, 2956, 2959, 2962, 2965, 2968, ++ 2971, 2974, 2977, 2980, 2983, 2986, 2989, 2992, 2995, 2998, 3001, 3004, ++ 3007, 3010, 3013, 3016, 3019, 3022, 3025, 3028, 3031, 3034, 3037, 3040, ++ 3043, 3046, 3049, 3052, 3055, 3058, 3061, 3064, 3067, 3070, 3073, 3076, ++ 3079, 3082, 3085, 3088, 3091, 3094, 3097, 3100, 3103, 3106, 3109, 3112, ++ 3115, 3118, 3121, 3124, 3127, 3130, 3133, 3136, 3139, 3142, 3145, 3148, ++ 3151, 3154, 3157, 3160, 3163, 3166, 3169, 3172, 3175, 3178, 3181, 3184, ++ 3187, 3190, 3193, 3196, 3199, 3202, 3205, 3208, 3211, 3214, 3217, 3220, ++ 3223, 3226, 3229, 3232, 3235, 3238, 3241, 3244, 3247, 3250, 3253, 3256, ++ 3259, 3262, 3265, 3268, 3271, 3274, 3277, 3280, 3283, 3286, 3289, 3292, ++ 3295, 3298, 3301, 3304, 3307, 3310, 3313, 3316, 3319, 3322, 3325, 3328, ++ 3331, 3334, 3337, 3340, 3343, 3346, 3349, 3352, 3355, 3358, 3361, 3364, ++ 3367, 3370, 3373, 3376, 3379, 3382, 3385, 3388, 3391, 3394, 3397, 3400, ++ 3403, 3406, 3409, 3412, 3415, 3418, 3421, 3424, 3427, 3430, 3433, 3436, ++ 3439, 3442, 3445, 3448, 3451, 3454, 3457, 3460, 3463, 3466, 3469, 3472, ++ 3475, 3478, 3481, 3484, 3487, 3490, 3493, 3496, 3499, 3502, 3505, 3508, ++ 3511, 3514, 3517, 3520, 3523, 3526, 3529, 3532, 3535, 3538, 3541, 3544, ++ 3547, 3550, 3553, 3556, 3559, 3562, 3565, 3568, 3571, 3574, 3577, 3580, ++ 3583, 3586, 3589, 3592, 3595, 3598, 3601, 3604, 3607, 3610, 3613, 3616, ++ 3619, 3622, 3625, 3628, 3631, 3634, 3637, 3640, 3643, 3646, 3649, 3652, ++ 3655, 3658, 3661, 3664, 3667, 3670, 3673, 3676, 3679, 3682, 3685, 3688, ++ 3691, 3694, 3697, 3700, 3703, 3706, 3709, 3712, 3715, 3718, 3721, 3724, ++ 3727, 3730, 3733, 3736, 3739, 3742, 3745, 3748, 3751, 3754, 3757, 3760, ++ 3763, 3766, 3769, 3772, 3775, 3778, 3781, 3784, 3787, 3790, 3793, 3796, ++ 3799, 3802, 3805, 3808, 3811, 3814, 3817, 3820, 3823, 3826, 3829, 3832, ++ 3835, 3838, 3841, 3844, 3847, 3850, 3853, 3856, 3859, 3862, 3865, 3868, ++ 3871, 3874, 3877, 3880, 3883, 3886, 3889, 3892, 3895, 3898, 3901, 3904, ++ 3907, 3910, 3913, 3916, 3919, 3922, 3925, 3928, 3931, 3934, 3937, 3940, ++ 3943, 3946, 3949, 3952, 3955, 3958, 3961, 3964, 3967, 3970, 3973, 3976, ++ 3979, 3982, 3985, 3988, 3991, 3994, 3997, 4000, 4003, 4006, 4009, 4012, ++ 4015, 4018, 4021, 4024, 4027, 4030, 4033, 4036, 4039, 4042, 4045, 4048, ++ 4051, 4054, 4057, 4060, 4063, 4066, 4069, 4072, 4075, 4078, 4081, 4084, ++ 4087, 4090, 4093, 4096, 4099, 4102, 4105, 4108, 4111, 4114, 4117, 4120, ++ 4123, 4126, 4129, 4132, 4135, 4138, 4141, 4144, 4147, 4150, 4153, 4156, ++ 4159, 4162, 4165, 4168, 4171, 4174, 4177, 4180, 4183, 4186, 4189, 4192, ++ 4195, 4198, 4201, 4204, 4207, 4210, 4213, 4216, 4219, 4222, 4225, 4228, ++ 4231, 4234, 4237, 4240, 4243, 4246, 4249, 4252, 4255, 4258, 4261, 4264, ++ 4267, 4270, 4273, 4276, 4279, 4282, 4285, 4288, 4291, 4294, 4297, 4300, ++ 4303, 4306, 4309, 4312, 4315, 4318, 4321, 4324, 4327, 4330, 4333, 4336, ++ 4339, 4342, 4345, 4348, 4351, 4354, 4357, 4360, 4363, 4366, 4369, 4372, ++ 4375, 4378, 4381, 4384, 4387, 4390, 4393, 4396, 4399, 4402, 4405, 4408, ++ 4411, 4414, 4417, 4420, 4423, 4426, 4429, 4432, 4435, 4438, 4441, 4444, ++ 4447, 4450, 4453, 4456, 4459, 4462, 4465, 4468, 4471, 4474, 4477, 4480, ++ 4483, 4486, 4489, 4492, 4495, 4498, 4501, 4504, 4507, 4510, 4513, 4516, ++ 4519, 4522, 4525, 4528, 4531, 4534, 4537, 4540, 4543, 4546, 4549, 4552, ++ 4555, 4558, 4561, 4564, 4567, 4570, 4573, 4576, 4579, 4582, 4585, 4588, ++ 4591, 4594, 4597, 4600, 4603, 4606, 4609, 4612, 4615, 4618, 4621, 4624, ++ 4627, 4630, 4633, 4636, 4639, 4642, 4645, 4648, 4651, 4654, 4657, 4660, ++ 4663, 4666, 4669, 4672, 4675, 4678, 4681, 4684, 4687, 4690, 4693, 4696, ++ 4699, 4702, 4705, 4708, 4711, 4714, 4717, 4720, 4723, 4726, 4729, 4732, ++ 4735, 4738, 4741, 4744, 4747, 4750, 4753, 4756, 4759, 4762, 4765, 4768, ++ 4771, 4774, 4777, 4780, 4783, 4786, 4789, 4792, 4795, 4798 + }; + static const wchar_t translit_to_tbl[] = + L" \0" L"\0" L"(C)\0" L"\0" L"<<\0" L"\0" L"-\0" L"\0" L"(R)\0" L"\0" L"u\0" +@@ -594,73 +594,73 @@ static const wchar_t translit_to_tbl[] = + L"\0" L"..\0" L"\0" L"...\0" L"\0" L" \0" L"\0" L"`\0" L"\0" L"``\0" L"\0" + L"```\0" L"\0" L"<\0" L"\0" L">\0" L"\0" L"!!\0" L"\0" L"/\0" L"\0" L"??\0" + L"\0" L"?!\0" L"\0" L"!?\0" L"\0" L" \0" L"\0" L"\0" L"\0" L"\0" L"\0" L"\0" +- L"\0" L"\0" L"\0" L"Rs\0" L"\0" L"EUR\0" L"\0" L"a/c\0" L"\0" L"a/s\0" L"\0" +- L"C\0" L"\0" L"c/o\0" L"\0" L"c/u\0" L"\0" L"g\0" L"\0" L"H\0" L"\0" L"H\0" +- L"\0" L"H\0" L"\0" L"h\0" L"\0" L"I\0" L"\0" L"I\0" L"\0" L"L\0" L"\0" +- L"l\0" L"\0" L"N\0" L"\0" L"No\0" L"\0" L"P\0" L"\0" L"Q\0" L"\0" L"R\0" +- L"\0" L"R\0" L"\0" L"R\0" L"\0" L"TEL\0" L"\0" L"(TM)\0" L"\0" L"Z\0" L"\0" +- L"Ohm\0" L"\0" L"Z\0" L"\0" L"B\0" L"\0" L"C\0" L"\0" L"e\0" L"\0" L"e\0" +- L"\0" L"E\0" L"\0" L"F\0" L"\0" L"M\0" L"\0" L"o\0" L"\0" L"i\0" L"\0" +- L"D\0" L"\0" L"d\0" L"\0" L"e\0" L"\0" L"i\0" L"\0" L"j\0" L"\0" L" 1/3 \0" +- L"\0" L" 2/3 \0" L"\0" L" 1/5 \0" L"\0" L" 2/5 \0" L"\0" L" 3/5 \0" L"\0" +- L" 4/5 \0" L"\0" L" 1/6 \0" L"\0" L" 5/6 \0" L"\0" L" 1/8 \0" L"\0" +- L" 3/8 \0" L"\0" L" 5/8 \0" L"\0" L" 7/8 \0" L"\0" L" 1/\0" L"\0" L"I\0" +- L"\0" L"II\0" L"\0" L"III\0" L"\0" L"IV\0" L"\0" L"V\0" L"\0" L"VI\0" L"\0" +- L"VII\0" L"\0" L"VIII\0" L"\0" L"IX\0" L"\0" L"X\0" L"\0" L"XI\0" L"\0" +- L"XII\0" L"\0" L"L\0" L"\0" L"C\0" L"\0" L"D\0" L"\0" L"M\0" L"\0" L"i\0" +- L"\0" L"ii\0" L"\0" L"iii\0" L"\0" L"iv\0" L"\0" L"v\0" L"\0" L"vi\0" L"\0" +- L"vii\0" L"\0" L"viii\0" L"\0" L"ix\0" L"\0" L"x\0" L"\0" L"xi\0" L"\0" +- L"xii\0" L"\0" L"l\0" L"\0" L"c\0" L"\0" L"d\0" L"\0" L"m\0" L"\0" L"<-\0" +- L"\0" L"->\0" L"\0" L"<->\0" L"\0" L"<=\0" L"\0" L"=>\0" L"\0" L"<=>\0" +- L"\0" L"-\0" L"\0" L"/\0" L"\0" L"\\\0" L"\0" L"*\0" L"\0" L"|\0" L"\0" +- L":\0" L"\0" L"~\0" L"\0" L"<=\0" L"\0" L">=\0" L"\0" L"<<\0" L"\0" L">>\0" +- L"\0" L"<<<\0" L"\0" L">>>\0" L"\0" L"NUL\0" L"\0" L"SOH\0" L"\0" L"STX\0" +- L"\0" L"ETX\0" L"\0" L"EOT\0" L"\0" L"ENQ\0" L"\0" L"ACK\0" L"\0" L"BEL\0" +- L"\0" L"BS\0" L"\0" L"HT\0" L"\0" L"LF\0" L"\0" L"VT\0" L"\0" L"FF\0" L"\0" +- L"CR\0" L"\0" L"SO\0" L"\0" L"SI\0" L"\0" L"DLE\0" L"\0" L"DC1\0" L"\0" +- L"DC2\0" L"\0" L"DC3\0" L"\0" L"DC4\0" L"\0" L"NAK\0" L"\0" L"SYN\0" L"\0" +- L"ETB\0" L"\0" L"CAN\0" L"\0" L"EM\0" L"\0" L"SUB\0" L"\0" L"ESC\0" L"\0" +- L"FS\0" L"\0" L"GS\0" L"\0" L"RS\0" L"\0" L"US\0" L"\0" L"SP\0" L"\0" +- L"DEL\0" L"\0" L"_\0" L"\0" L"NL\0" L"\0" L"(1)\0" L"\0" L"(2)\0" L"\0" +- L"(3)\0" L"\0" L"(4)\0" L"\0" L"(5)\0" L"\0" L"(6)\0" L"\0" L"(7)\0" L"\0" +- L"(8)\0" L"\0" L"(9)\0" L"\0" L"(10)\0" L"\0" L"(11)\0" L"\0" L"(12)\0" +- L"\0" L"(13)\0" L"\0" L"(14)\0" L"\0" L"(15)\0" L"\0" L"(16)\0" L"\0" +- L"(17)\0" L"\0" L"(18)\0" L"\0" L"(19)\0" L"\0" L"(20)\0" L"\0" L"(1)\0" +- L"\0" L"(2)\0" L"\0" L"(3)\0" L"\0" L"(4)\0" L"\0" L"(5)\0" L"\0" L"(6)\0" +- L"\0" L"(7)\0" L"\0" L"(8)\0" L"\0" L"(9)\0" L"\0" L"(10)\0" L"\0" L"(11)\0" +- L"\0" L"(12)\0" L"\0" L"(13)\0" L"\0" L"(14)\0" L"\0" L"(15)\0" L"\0" +- L"(16)\0" L"\0" L"(17)\0" L"\0" L"(18)\0" L"\0" L"(19)\0" L"\0" L"(20)\0" +- L"\0" L"1.\0" L"\0" L"2.\0" L"\0" L"3.\0" L"\0" L"4.\0" L"\0" L"5.\0" L"\0" +- L"6.\0" L"\0" L"7.\0" L"\0" L"8.\0" L"\0" L"9.\0" L"\0" L"10.\0" L"\0" +- L"11.\0" L"\0" L"12.\0" L"\0" L"13.\0" L"\0" L"14.\0" L"\0" L"15.\0" L"\0" +- L"16.\0" L"\0" L"17.\0" L"\0" L"18.\0" L"\0" L"19.\0" L"\0" L"20.\0" L"\0" +- L"(a)\0" L"\0" L"(b)\0" L"\0" L"(c)\0" L"\0" L"(d)\0" L"\0" L"(e)\0" L"\0" +- L"(f)\0" L"\0" L"(g)\0" L"\0" L"(h)\0" L"\0" L"(i)\0" L"\0" L"(j)\0" L"\0" +- L"(k)\0" L"\0" L"(l)\0" L"\0" L"(m)\0" L"\0" L"(n)\0" L"\0" L"(o)\0" L"\0" +- L"(p)\0" L"\0" L"(q)\0" L"\0" L"(r)\0" L"\0" L"(s)\0" L"\0" L"(t)\0" L"\0" +- L"(u)\0" L"\0" L"(v)\0" L"\0" L"(w)\0" L"\0" L"(x)\0" L"\0" L"(y)\0" L"\0" +- L"(z)\0" L"\0" L"(A)\0" L"\0" L"(B)\0" L"\0" L"(C)\0" L"\0" L"(D)\0" L"\0" +- L"(E)\0" L"\0" L"(F)\0" L"\0" L"(G)\0" L"\0" L"(H)\0" L"\0" L"(I)\0" L"\0" +- L"(J)\0" L"\0" L"(K)\0" L"\0" L"(L)\0" L"\0" L"(M)\0" L"\0" L"(N)\0" L"\0" +- L"(O)\0" L"\0" L"(P)\0" L"\0" L"(Q)\0" L"\0" L"(R)\0" L"\0" L"(S)\0" L"\0" +- L"(T)\0" L"\0" L"(U)\0" L"\0" L"(V)\0" L"\0" L"(W)\0" L"\0" L"(X)\0" L"\0" +- L"(Y)\0" L"\0" L"(Z)\0" L"\0" L"(a)\0" L"\0" L"(b)\0" L"\0" L"(c)\0" L"\0" +- L"(d)\0" L"\0" L"(e)\0" L"\0" L"(f)\0" L"\0" L"(g)\0" L"\0" L"(h)\0" L"\0" +- L"(i)\0" L"\0" L"(j)\0" L"\0" L"(k)\0" L"\0" L"(l)\0" L"\0" L"(m)\0" L"\0" +- L"(n)\0" L"\0" L"(o)\0" L"\0" L"(p)\0" L"\0" L"(q)\0" L"\0" L"(r)\0" L"\0" +- L"(s)\0" L"\0" L"(t)\0" L"\0" L"(u)\0" L"\0" L"(v)\0" L"\0" L"(w)\0" L"\0" +- L"(x)\0" L"\0" L"(y)\0" L"\0" L"(z)\0" L"\0" L"(0)\0" L"\0" L"-\0" L"\0" +- L"|\0" L"\0" L"+\0" L"\0" L"+\0" L"\0" L"+\0" L"\0" L"+\0" L"\0" L"+\0" +- L"\0" L"+\0" L"\0" L"+\0" L"\0" L"+\0" L"\0" L"+\0" L"\0" L"o\0" L"\0" +- L"::=\0" L"\0" L"==\0" L"\0" L"===\0" L"\0" L" \0" L"\0" L"=\0" L"\0" +- L"(21)\0" L"\0" L"(22)\0" L"\0" L"(23)\0" L"\0" L"(24)\0" L"\0" L"(25)\0" +- L"\0" L"(26)\0" L"\0" L"(27)\0" L"\0" L"(28)\0" L"\0" L"(29)\0" L"\0" +- L"(30)\0" L"\0" L"(31)\0" L"\0" L"(32)\0" L"\0" L"(33)\0" L"\0" L"(34)\0" +- L"\0" L"(35)\0" L"\0" L"(36)\0" L"\0" L"(37)\0" L"\0" L"(38)\0" L"\0" +- L"(39)\0" L"\0" L"(40)\0" L"\0" L"(41)\0" L"\0" L"(42)\0" L"\0" L"(43)\0" +- L"\0" L"(44)\0" L"\0" L"(45)\0" L"\0" L"(46)\0" L"\0" L"(47)\0" L"\0" +- L"(48)\0" L"\0" L"(49)\0" L"\0" L"(50)\0" L"\0" L"hPa\0" L"\0" L"da\0" L"\0" +- L"AU\0" L"\0" L"bar\0" L"\0" L"oV\0" L"\0" L"pc\0" L"\0" L"pA\0" L"\0" ++ L"\0" L"\0" L"\0" L"Rs\0" L"\0" L"EUR\0" L"\0" L"INR\0" L"\0" L"a/c\0" L"\0" ++ L"a/s\0" L"\0" L"C\0" L"\0" L"c/o\0" L"\0" L"c/u\0" L"\0" L"g\0" L"\0" ++ L"H\0" L"\0" L"H\0" L"\0" L"H\0" L"\0" L"h\0" L"\0" L"I\0" L"\0" L"I\0" ++ L"\0" L"L\0" L"\0" L"l\0" L"\0" L"N\0" L"\0" L"No\0" L"\0" L"P\0" L"\0" ++ L"Q\0" L"\0" L"R\0" L"\0" L"R\0" L"\0" L"R\0" L"\0" L"TEL\0" L"\0" L"(TM)\0" ++ L"\0" L"Z\0" L"\0" L"Ohm\0" L"\0" L"Z\0" L"\0" L"B\0" L"\0" L"C\0" L"\0" ++ L"e\0" L"\0" L"e\0" L"\0" L"E\0" L"\0" L"F\0" L"\0" L"M\0" L"\0" L"o\0" ++ L"\0" L"i\0" L"\0" L"D\0" L"\0" L"d\0" L"\0" L"e\0" L"\0" L"i\0" L"\0" ++ L"j\0" L"\0" L" 1/3 \0" L"\0" L" 2/3 \0" L"\0" L" 1/5 \0" L"\0" L" 2/5 \0" ++ L"\0" L" 3/5 \0" L"\0" L" 4/5 \0" L"\0" L" 1/6 \0" L"\0" L" 5/6 \0" L"\0" ++ L" 1/8 \0" L"\0" L" 3/8 \0" L"\0" L" 5/8 \0" L"\0" L" 7/8 \0" L"\0" L" 1/\0" ++ L"\0" L"I\0" L"\0" L"II\0" L"\0" L"III\0" L"\0" L"IV\0" L"\0" L"V\0" L"\0" ++ L"VI\0" L"\0" L"VII\0" L"\0" L"VIII\0" L"\0" L"IX\0" L"\0" L"X\0" L"\0" ++ L"XI\0" L"\0" L"XII\0" L"\0" L"L\0" L"\0" L"C\0" L"\0" L"D\0" L"\0" L"M\0" ++ L"\0" L"i\0" L"\0" L"ii\0" L"\0" L"iii\0" L"\0" L"iv\0" L"\0" L"v\0" L"\0" ++ L"vi\0" L"\0" L"vii\0" L"\0" L"viii\0" L"\0" L"ix\0" L"\0" L"x\0" L"\0" ++ L"xi\0" L"\0" L"xii\0" L"\0" L"l\0" L"\0" L"c\0" L"\0" L"d\0" L"\0" L"m\0" ++ L"\0" L"<-\0" L"\0" L"->\0" L"\0" L"<->\0" L"\0" L"<=\0" L"\0" L"=>\0" L"\0" ++ L"<=>\0" L"\0" L"-\0" L"\0" L"/\0" L"\0" L"\\\0" L"\0" L"*\0" L"\0" L"|\0" ++ L"\0" L":\0" L"\0" L"~\0" L"\0" L"<=\0" L"\0" L">=\0" L"\0" L"<<\0" L"\0" ++ L">>\0" L"\0" L"<<<\0" L"\0" L">>>\0" L"\0" L"NUL\0" L"\0" L"SOH\0" L"\0" ++ L"STX\0" L"\0" L"ETX\0" L"\0" L"EOT\0" L"\0" L"ENQ\0" L"\0" L"ACK\0" L"\0" ++ L"BEL\0" L"\0" L"BS\0" L"\0" L"HT\0" L"\0" L"LF\0" L"\0" L"VT\0" L"\0" ++ L"FF\0" L"\0" L"CR\0" L"\0" L"SO\0" L"\0" L"SI\0" L"\0" L"DLE\0" L"\0" ++ L"DC1\0" L"\0" L"DC2\0" L"\0" L"DC3\0" L"\0" L"DC4\0" L"\0" L"NAK\0" L"\0" ++ L"SYN\0" L"\0" L"ETB\0" L"\0" L"CAN\0" L"\0" L"EM\0" L"\0" L"SUB\0" L"\0" ++ L"ESC\0" L"\0" L"FS\0" L"\0" L"GS\0" L"\0" L"RS\0" L"\0" L"US\0" L"\0" ++ L"SP\0" L"\0" L"DEL\0" L"\0" L"_\0" L"\0" L"NL\0" L"\0" L"(1)\0" L"\0" ++ L"(2)\0" L"\0" L"(3)\0" L"\0" L"(4)\0" L"\0" L"(5)\0" L"\0" L"(6)\0" L"\0" ++ L"(7)\0" L"\0" L"(8)\0" L"\0" L"(9)\0" L"\0" L"(10)\0" L"\0" L"(11)\0" L"\0" ++ L"(12)\0" L"\0" L"(13)\0" L"\0" L"(14)\0" L"\0" L"(15)\0" L"\0" L"(16)\0" ++ L"\0" L"(17)\0" L"\0" L"(18)\0" L"\0" L"(19)\0" L"\0" L"(20)\0" L"\0" ++ L"(1)\0" L"\0" L"(2)\0" L"\0" L"(3)\0" L"\0" L"(4)\0" L"\0" L"(5)\0" L"\0" ++ L"(6)\0" L"\0" L"(7)\0" L"\0" L"(8)\0" L"\0" L"(9)\0" L"\0" L"(10)\0" L"\0" ++ L"(11)\0" L"\0" L"(12)\0" L"\0" L"(13)\0" L"\0" L"(14)\0" L"\0" L"(15)\0" ++ L"\0" L"(16)\0" L"\0" L"(17)\0" L"\0" L"(18)\0" L"\0" L"(19)\0" L"\0" ++ L"(20)\0" L"\0" L"1.\0" L"\0" L"2.\0" L"\0" L"3.\0" L"\0" L"4.\0" L"\0" ++ L"5.\0" L"\0" L"6.\0" L"\0" L"7.\0" L"\0" L"8.\0" L"\0" L"9.\0" L"\0" ++ L"10.\0" L"\0" L"11.\0" L"\0" L"12.\0" L"\0" L"13.\0" L"\0" L"14.\0" L"\0" ++ L"15.\0" L"\0" L"16.\0" L"\0" L"17.\0" L"\0" L"18.\0" L"\0" L"19.\0" L"\0" ++ L"20.\0" L"\0" L"(a)\0" L"\0" L"(b)\0" L"\0" L"(c)\0" L"\0" L"(d)\0" L"\0" ++ L"(e)\0" L"\0" L"(f)\0" L"\0" L"(g)\0" L"\0" L"(h)\0" L"\0" L"(i)\0" L"\0" ++ L"(j)\0" L"\0" L"(k)\0" L"\0" L"(l)\0" L"\0" L"(m)\0" L"\0" L"(n)\0" L"\0" ++ L"(o)\0" L"\0" L"(p)\0" L"\0" L"(q)\0" L"\0" L"(r)\0" L"\0" L"(s)\0" L"\0" ++ L"(t)\0" L"\0" L"(u)\0" L"\0" L"(v)\0" L"\0" L"(w)\0" L"\0" L"(x)\0" L"\0" ++ L"(y)\0" L"\0" L"(z)\0" L"\0" L"(A)\0" L"\0" L"(B)\0" L"\0" L"(C)\0" L"\0" ++ L"(D)\0" L"\0" L"(E)\0" L"\0" L"(F)\0" L"\0" L"(G)\0" L"\0" L"(H)\0" L"\0" ++ L"(I)\0" L"\0" L"(J)\0" L"\0" L"(K)\0" L"\0" L"(L)\0" L"\0" L"(M)\0" L"\0" ++ L"(N)\0" L"\0" L"(O)\0" L"\0" L"(P)\0" L"\0" L"(Q)\0" L"\0" L"(R)\0" L"\0" ++ L"(S)\0" L"\0" L"(T)\0" L"\0" L"(U)\0" L"\0" L"(V)\0" L"\0" L"(W)\0" L"\0" ++ L"(X)\0" L"\0" L"(Y)\0" L"\0" L"(Z)\0" L"\0" L"(a)\0" L"\0" L"(b)\0" L"\0" ++ L"(c)\0" L"\0" L"(d)\0" L"\0" L"(e)\0" L"\0" L"(f)\0" L"\0" L"(g)\0" L"\0" ++ L"(h)\0" L"\0" L"(i)\0" L"\0" L"(j)\0" L"\0" L"(k)\0" L"\0" L"(l)\0" L"\0" ++ L"(m)\0" L"\0" L"(n)\0" L"\0" L"(o)\0" L"\0" L"(p)\0" L"\0" L"(q)\0" L"\0" ++ L"(r)\0" L"\0" L"(s)\0" L"\0" L"(t)\0" L"\0" L"(u)\0" L"\0" L"(v)\0" L"\0" ++ L"(w)\0" L"\0" L"(x)\0" L"\0" L"(y)\0" L"\0" L"(z)\0" L"\0" L"(0)\0" L"\0" ++ L"-\0" L"\0" L"|\0" L"\0" L"+\0" L"\0" L"+\0" L"\0" L"+\0" L"\0" L"+\0" ++ L"\0" L"+\0" L"\0" L"+\0" L"\0" L"+\0" L"\0" L"+\0" L"\0" L"+\0" L"\0" ++ L"o\0" L"\0" L"::=\0" L"\0" L"==\0" L"\0" L"===\0" L"\0" L" \0" L"\0" L"=\0" ++ L"\0" L"(21)\0" L"\0" L"(22)\0" L"\0" L"(23)\0" L"\0" L"(24)\0" L"\0" ++ L"(25)\0" L"\0" L"(26)\0" L"\0" L"(27)\0" L"\0" L"(28)\0" L"\0" L"(29)\0" ++ L"\0" L"(30)\0" L"\0" L"(31)\0" L"\0" L"(32)\0" L"\0" L"(33)\0" L"\0" ++ L"(34)\0" L"\0" L"(35)\0" L"\0" L"(36)\0" L"\0" L"(37)\0" L"\0" L"(38)\0" ++ L"\0" L"(39)\0" L"\0" L"(40)\0" L"\0" L"(41)\0" L"\0" L"(42)\0" L"\0" ++ L"(43)\0" L"\0" L"(44)\0" L"\0" L"(45)\0" L"\0" L"(46)\0" L"\0" L"(47)\0" ++ L"\0" L"(48)\0" L"\0" L"(49)\0" L"\0" L"(50)\0" L"\0" L"hPa\0" L"\0" L"da\0" ++ L"\0" L"AU\0" L"\0" L"bar\0" L"\0" L"oV\0" L"\0" L"pc\0" L"\0" L"pA\0" L"\0" + L"nA\0" L"\0" L"uA\0" L"\0" L"mA\0" L"\0" L"kA\0" L"\0" L"KB\0" L"\0" + L"MB\0" L"\0" L"GB\0" L"\0" L"cal\0" L"\0" L"kcal\0" L"\0" L"pF\0" L"\0" + L"nF\0" L"\0" L"uF\0" L"\0" L"ug\0" L"\0" L"mg\0" L"\0" L"kg\0" L"\0" +Index: glibc-2.12-2-gc4ccff1/locale/C-translit.h.in +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/locale/C-translit.h.in ++++ glibc-2.12-2-gc4ccff1/locale/C-translit.h.in +@@ -105,6 +105,7 @@ + "\x2063" "" /* INVISIBLE SEPARATOR */ + "\x20a8" "Rs" /* RUPEE SIGN */ + "\x20ac" "EUR" /* EURO SIGN */ ++"\x20b9" "INR" /* INDIAN RUPEE SIGN */ + "\x2100" "a/c" /* ACCOUNT OF */ + "\x2101" "a/s" /* ADDRESSED TO THE SUBJECT */ + "\x2102" "C" /* DOUBLE-STRUCK CAPITAL C */ +Index: glibc-2.12-2-gc4ccff1/localedata/charmaps/UTF-8 +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/localedata/charmaps/UTF-8 ++++ glibc-2.12-2-gc4ccff1/localedata/charmaps/UTF-8 +@@ -1312,6 +1312,10 @@ CHARMAP + /xd4/xa1 CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK + /xd4/xa2 CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK + /xd4/xa3 CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK ++ /xd4/xa4 CYRILLIC CAPITAL LETTER PE WITH DESCENDER ++ /xd4/xa5 CYRILLIC SMALL LETTER PE WITH DESCENDER ++ /xd4/xa6 CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER ++ /xd4/xa7 CYRILLIC SMALL LETTER SHHA WITH DESCENDER + /xd4/xb1 ARMENIAN CAPITAL LETTER AYB + /xd4/xb2 ARMENIAN CAPITAL LETTER BEN + /xd4/xb3 ARMENIAN CAPITAL LETTER GIM +@@ -1513,6 +1517,7 @@ CHARMAP + /xd8/x9b ARABIC SEMICOLON + /xd8/x9e ARABIC TRIPLE DOT PUNCTUATION MARK + /xd8/x9f ARABIC QUESTION MARK ++ /xd8/xa0 ARABIC LETTER KASHMIRI YEH + /xd8/xa1 ARABIC LETTER HAMZA + /xd8/xa2 ARABIC LETTER ALEF WITH MADDA ABOVE + /xd8/xa3 ARABIC LETTER ALEF WITH HAMZA ABOVE +@@ -1575,6 +1580,7 @@ CHARMAP + /xd9/x9c ARABIC VOWEL SIGN DOT BELOW + /xd9/x9d ARABIC REVERSED DAMMA + /xd9/x9e ARABIC FATHA WITH TWO DOTS ++ /xd9/x9f ARABIC WAVY HAMZA BELOW + /xd9/xa0 ARABIC-INDIC DIGIT ZERO + /xd9/xa1 ARABIC-INDIC DIGIT ONE + /xd9/xa2 ARABIC-INDIC DIGIT TWO +@@ -1969,6 +1975,97 @@ CHARMAP + /xdf/xb8 NKO COMMA + /xdf/xb9 NKO EXCLAMATION MARK + /xdf/xba NKO LAJANYALAN ++ /xe0/xa0/x80 SAMARITAN LETTER ALAF ++ /xe0/xa0/x81 SAMARITAN LETTER BIT ++ /xe0/xa0/x82 SAMARITAN LETTER GAMAN ++ /xe0/xa0/x83 SAMARITAN LETTER DALAT ++ /xe0/xa0/x84 SAMARITAN LETTER IY ++ /xe0/xa0/x85 SAMARITAN LETTER BAA ++ /xe0/xa0/x86 SAMARITAN LETTER ZEN ++ /xe0/xa0/x87 SAMARITAN LETTER IT ++ /xe0/xa0/x88 SAMARITAN LETTER TIT ++ /xe0/xa0/x89 SAMARITAN LETTER YUT ++ /xe0/xa0/x8a SAMARITAN LETTER KAAF ++ /xe0/xa0/x8b SAMARITAN LETTER LABAT ++ /xe0/xa0/x8c SAMARITAN LETTER MIM ++ /xe0/xa0/x8d SAMARITAN LETTER NUN ++ /xe0/xa0/x8e SAMARITAN LETTER SINGAAT ++ /xe0/xa0/x8f SAMARITAN LETTER IN ++ /xe0/xa0/x90 SAMARITAN LETTER FI ++ /xe0/xa0/x91 SAMARITAN LETTER TSAADIY ++ /xe0/xa0/x92 SAMARITAN LETTER QUF ++ /xe0/xa0/x93 SAMARITAN LETTER RISH ++ /xe0/xa0/x94 SAMARITAN LETTER SHAN ++ /xe0/xa0/x95 SAMARITAN LETTER TAAF ++ /xe0/xa0/x96 SAMARITAN MARK IN ++ /xe0/xa0/x97 SAMARITAN MARK IN-ALAF ++ /xe0/xa0/x98 SAMARITAN MARK OCCLUSION ++ /xe0/xa0/x99 SAMARITAN MARK DAGESH ++ /xe0/xa0/x9a SAMARITAN MODIFIER LETTER EPENTHETIC YUT ++ /xe0/xa0/x9b SAMARITAN MARK EPENTHETIC YUT ++ /xe0/xa0/x9c SAMARITAN VOWEL SIGN LONG E ++ /xe0/xa0/x9d SAMARITAN VOWEL SIGN E ++ /xe0/xa0/x9e SAMARITAN VOWEL SIGN OVERLONG AA ++ /xe0/xa0/x9f SAMARITAN VOWEL SIGN LONG AA ++ /xe0/xa0/xa0 SAMARITAN VOWEL SIGN AA ++ /xe0/xa0/xa1 SAMARITAN VOWEL SIGN OVERLONG A ++ /xe0/xa0/xa2 SAMARITAN VOWEL SIGN LONG A ++ /xe0/xa0/xa3 SAMARITAN VOWEL SIGN A ++ /xe0/xa0/xa4 SAMARITAN MODIFIER LETTER SHORT A ++ /xe0/xa0/xa5 SAMARITAN VOWEL SIGN SHORT A ++ /xe0/xa0/xa6 SAMARITAN VOWEL SIGN LONG U ++ /xe0/xa0/xa7 SAMARITAN VOWEL SIGN U ++ /xe0/xa0/xa8 SAMARITAN MODIFIER LETTER I ++ /xe0/xa0/xa9 SAMARITAN VOWEL SIGN LONG I ++ /xe0/xa0/xaa SAMARITAN VOWEL SIGN I ++ /xe0/xa0/xab SAMARITAN VOWEL SIGN O ++ /xe0/xa0/xac SAMARITAN VOWEL SIGN SUKUN ++ /xe0/xa0/xad SAMARITAN MARK NEQUDAA ++ /xe0/xa0/xb0 SAMARITAN PUNCTUATION NEQUDAA ++ /xe0/xa0/xb1 SAMARITAN PUNCTUATION AFSAAQ ++ /xe0/xa0/xb2 SAMARITAN PUNCTUATION ANGED ++ /xe0/xa0/xb3 SAMARITAN PUNCTUATION BAU ++ /xe0/xa0/xb4 SAMARITAN PUNCTUATION ATMAAU ++ /xe0/xa0/xb5 SAMARITAN PUNCTUATION SHIYYAALAA ++ /xe0/xa0/xb6 SAMARITAN ABBREVIATION MARK ++ /xe0/xa0/xb7 SAMARITAN PUNCTUATION MELODIC QITSA ++ /xe0/xa0/xb8 SAMARITAN PUNCTUATION ZIQAA ++ /xe0/xa0/xb9 SAMARITAN PUNCTUATION QITSA ++ /xe0/xa0/xba SAMARITAN PUNCTUATION ZAEF ++ /xe0/xa0/xbb SAMARITAN PUNCTUATION TURU ++ /xe0/xa0/xbc SAMARITAN PUNCTUATION ARKAANU ++ /xe0/xa0/xbd SAMARITAN PUNCTUATION SOF MASHFAAT ++ /xe0/xa0/xbe SAMARITAN PUNCTUATION ANNAAU ++ /xe0/xa1/x80 MANDAIC LETTER HALQA ++ /xe0/xa1/x81 MANDAIC LETTER AB ++ /xe0/xa1/x82 MANDAIC LETTER AG ++ /xe0/xa1/x83 MANDAIC LETTER AD ++ /xe0/xa1/x84 MANDAIC LETTER AH ++ /xe0/xa1/x85 MANDAIC LETTER USHENNA ++ /xe0/xa1/x86 MANDAIC LETTER AZ ++ /xe0/xa1/x87 MANDAIC LETTER IT ++ /xe0/xa1/x88 MANDAIC LETTER ATT ++ /xe0/xa1/x89 MANDAIC LETTER AKSA ++ /xe0/xa1/x8a MANDAIC LETTER AK ++ /xe0/xa1/x8b MANDAIC LETTER AL ++ /xe0/xa1/x8c MANDAIC LETTER AM ++ /xe0/xa1/x8d MANDAIC LETTER AN ++ /xe0/xa1/x8e MANDAIC LETTER AS ++ /xe0/xa1/x8f MANDAIC LETTER IN ++ /xe0/xa1/x90 MANDAIC LETTER AP ++ /xe0/xa1/x91 MANDAIC LETTER ASZ ++ /xe0/xa1/x92 MANDAIC LETTER AQ ++ /xe0/xa1/x93 MANDAIC LETTER AR ++ /xe0/xa1/x94 MANDAIC LETTER ASH ++ /xe0/xa1/x95 MANDAIC LETTER AT ++ /xe0/xa1/x96 MANDAIC LETTER DUSHENNA ++ /xe0/xa1/x97 MANDAIC LETTER KAD ++ /xe0/xa1/x98 MANDAIC LETTER AIN ++ /xe0/xa1/x99 MANDAIC AFFRICATION MARK ++ /xe0/xa1/x9a MANDAIC VOCALIZATION MARK ++ /xe0/xa1/x9b MANDAIC GEMINATION MARK ++ /xe0/xa1/x9e MANDAIC PUNCTUATION ++ /xe0/xa4/x80 DEVANAGARI SIGN INVERTED CANDRABINDU + /xe0/xa4/x81 DEVANAGARI SIGN CANDRABINDU + /xe0/xa4/x82 DEVANAGARI SIGN ANUSVARA + /xe0/xa4/x83 DEVANAGARI SIGN VISARGA +@@ -2026,6 +2123,8 @@ CHARMAP + /xe0/xa4/xb7 DEVANAGARI LETTER SSA + /xe0/xa4/xb8 DEVANAGARI LETTER SA + /xe0/xa4/xb9 DEVANAGARI LETTER HA ++ /xe0/xa4/xba DEVANAGARI VOWEL SIGN OE ++ /xe0/xa4/xbb DEVANAGARI VOWEL SIGN OOE + /xe0/xa4/xbc DEVANAGARI SIGN NUKTA + /xe0/xa4/xbd DEVANAGARI SIGN AVAGRAHA + /xe0/xa4/xbe DEVANAGARI VOWEL SIGN AA +@@ -2044,11 +2143,16 @@ CHARMAP + /xe0/xa5/x8b DEVANAGARI VOWEL SIGN O + /xe0/xa5/x8c DEVANAGARI VOWEL SIGN AU + /xe0/xa5/x8d DEVANAGARI SIGN VIRAMA ++ /xe0/xa5/x8e DEVANAGARI VOWEL SIGN PRISHTHAMATRA E ++ /xe0/xa5/x8f DEVANAGARI VOWEL SIGN AW + /xe0/xa5/x90 DEVANAGARI OM + /xe0/xa5/x91 DEVANAGARI STRESS SIGN UDATTA + /xe0/xa5/x92 DEVANAGARI STRESS SIGN ANUDATTA + /xe0/xa5/x93 DEVANAGARI GRAVE ACCENT + /xe0/xa5/x94 DEVANAGARI ACUTE ACCENT ++ /xe0/xa5/x95 DEVANAGARI VOWEL SIGN CANDRA LONG E ++ /xe0/xa5/x96 DEVANAGARI VOWEL SIGN UE ++ /xe0/xa5/x97 DEVANAGARI VOWEL SIGN UUE + /xe0/xa5/x98 DEVANAGARI LETTER QA + /xe0/xa5/x99 DEVANAGARI LETTER KHHA + /xe0/xa5/x9a DEVANAGARI LETTER GHHA +@@ -2076,6 +2180,13 @@ CHARMAP + /xe0/xa5/xb0 DEVANAGARI ABBREVIATION SIGN + /xe0/xa5/xb1 DEVANAGARI SIGN HIGH SPACING DOT + /xe0/xa5/xb2 DEVANAGARI LETTER CANDRA A ++ /xe0/xa5/xb3 DEVANAGARI LETTER OE ++ /xe0/xa5/xb4 DEVANAGARI LETTER OOE ++ /xe0/xa5/xb5 DEVANAGARI LETTER AW ++ /xe0/xa5/xb6 DEVANAGARI LETTER UE ++ /xe0/xa5/xb7 DEVANAGARI LETTER UUE ++ /xe0/xa5/xb9 DEVANAGARI LETTER ZHA ++ /xe0/xa5/xba DEVANAGARI LETTER HEAVY YA + /xe0/xa5/xbb DEVANAGARI LETTER GGA + /xe0/xa5/xbc DEVANAGARI LETTER JJA + /xe0/xa5/xbd DEVANAGARI LETTER GLOTTAL STOP +@@ -2172,6 +2283,7 @@ CHARMAP + /xe0/xa7/xb8 BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR + /xe0/xa7/xb9 BENGALI CURRENCY DENOMINATOR SIXTEEN + /xe0/xa7/xba BENGALI ISSHAR ++ /xe0/xa7/xbb BENGALI GANDA MARK + /xe0/xa8/x81 GURMUKHI SIGN ADAK BINDI + /xe0/xa8/x82 GURMUKHI SIGN BINDI + /xe0/xa8/x83 GURMUKHI SIGN VISARGA +@@ -2418,6 +2530,12 @@ CHARMAP + /xe0/xad/xaf ORIYA DIGIT NINE + /xe0/xad/xb0 ORIYA ISSHAR + /xe0/xad/xb1 ORIYA LETTER WA ++ /xe0/xad/xb2 ORIYA FRACTION ONE QUARTER ++ /xe0/xad/xb3 ORIYA FRACTION ONE HALF ++ /xe0/xad/xb4 ORIYA FRACTION THREE QUARTERS ++ /xe0/xad/xb5 ORIYA FRACTION ONE SIXTEENTH ++ /xe0/xad/xb6 ORIYA FRACTION ONE EIGHTH ++ /xe0/xad/xb7 ORIYA FRACTION THREE SIXTEENTHS + /xe0/xae/x82 TAMIL SIGN ANUSVARA + /xe0/xae/x83 TAMIL SIGN VISARGA + /xe0/xae/x85 TAMIL LETTER A +@@ -2705,6 +2823,7 @@ CHARMAP + /xe0/xb4/xa6 MALAYALAM LETTER DA + /xe0/xb4/xa7 MALAYALAM LETTER DHA + /xe0/xb4/xa8 MALAYALAM LETTER NA ++ /xe0/xb4/xa9 MALAYALAM LETTER NNNA + /xe0/xb4/xaa MALAYALAM LETTER PA + /xe0/xb4/xab MALAYALAM LETTER PHA + /xe0/xb4/xac MALAYALAM LETTER BA +@@ -2721,6 +2840,7 @@ CHARMAP + /xe0/xb4/xb7 MALAYALAM LETTER SSA + /xe0/xb4/xb8 MALAYALAM LETTER SA + /xe0/xb4/xb9 MALAYALAM LETTER HA ++ /xe0/xb4/xba MALAYALAM LETTER TTTA + /xe0/xb4/xbd MALAYALAM SIGN AVAGRAHA + /xe0/xb4/xbe MALAYALAM VOWEL SIGN AA + /xe0/xb4/xbf MALAYALAM VOWEL SIGN I +@@ -2736,6 +2856,7 @@ CHARMAP + /xe0/xb5/x8b MALAYALAM VOWEL SIGN OO + /xe0/xb5/x8c MALAYALAM VOWEL SIGN AU + /xe0/xb5/x8d MALAYALAM SIGN VIRAMA ++ /xe0/xb5/x8e MALAYALAM LETTER DOT REPH + /xe0/xb5/x97 MALAYALAM AU LENGTH MARK + /xe0/xb5/xa0 MALAYALAM LETTER VOCALIC RR + /xe0/xb5/xa1 MALAYALAM LETTER VOCALIC LL +@@ -3131,6 +3252,10 @@ CHARMAP + /xe0/xbe/x89 TIBETAN SIGN MCHU CAN + /xe0/xbe/x8a TIBETAN SIGN GRU CAN RGYINGS + /xe0/xbe/x8b TIBETAN SIGN GRU MED RGYINGS ++ /xe0/xbe/x8c TIBETAN SIGN INVERTED MCHU CAN ++ /xe0/xbe/x8d TIBETAN SUBJOINED SIGN LCE TSA CAN ++ /xe0/xbe/x8e TIBETAN SUBJOINED SIGN MCHU CAN ++ /xe0/xbe/x8f TIBETAN SUBJOINED SIGN INVERTED MCHU CAN + /xe0/xbe/x90 TIBETAN SUBJOINED LETTER KA + /xe0/xbe/x91 TIBETAN SUBJOINED LETTER KHA + /xe0/xbe/x92 TIBETAN SUBJOINED LETTER GA +@@ -3197,6 +3322,12 @@ CHARMAP + /xe0/xbf/x92 TIBETAN MARK NYIS TSHEG + /xe0/xbf/x93 TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA + /xe0/xbf/x94 TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA ++ /xe0/xbf/x95 RIGHT-FACING SVASTI SIGN ++ /xe0/xbf/x96 LEFT-FACING SVASTI SIGN ++ /xe0/xbf/x97 RIGHT-FACING SVASTI SIGN WITH DOTS ++ /xe0/xbf/x98 LEFT-FACING SVASTI SIGN WITH DOTS ++ /xe0/xbf/x99 TIBETAN MARK LEADING MCHAN RTAGS ++ /xe0/xbf/x9a TIBETAN MARK TRAILING MCHAN RTAGS + /xe1/x80/x80 MYANMAR LETTER KA + /xe1/x80/x81 MYANMAR LETTER KHA + /xe1/x80/x82 MYANMAR LETTER GA +@@ -3351,6 +3482,10 @@ CHARMAP + /xe1/x82/x97 MYANMAR SHAN DIGIT SEVEN + /xe1/x82/x98 MYANMAR SHAN DIGIT EIGHT + /xe1/x82/x99 MYANMAR SHAN DIGIT NINE ++ /xe1/x82/x9a MYANMAR SIGN KHAMTI TONE-1 ++ /xe1/x82/x9b MYANMAR SIGN KHAMTI TONE-3 ++ /xe1/x82/x9c MYANMAR VOWEL SIGN AITON A ++ /xe1/x82/x9d MYANMAR VOWEL SIGN AITON AI + /xe1/x82/x9e MYANMAR SYMBOL SHAN ONE + /xe1/x82/x9f MYANMAR SYMBOL SHAN EXCLAMATION + /xe1/x82/xa0 GEORGIAN CAPITAL LETTER AN +@@ -3526,6 +3661,11 @@ CHARMAP + /xe1/x85/x97 HANGUL CHOSEONG KAPYEOUNPHIEUPH + /xe1/x85/x98 HANGUL CHOSEONG SSANGHIEUH + /xe1/x85/x99 HANGUL CHOSEONG YEORINHIEUH ++ /xe1/x85/x9a HANGUL CHOSEONG KIYEOK-TIKEUT ++ /xe1/x85/x9b HANGUL CHOSEONG NIEUN-SIOS ++ /xe1/x85/x9c HANGUL CHOSEONG NIEUN-CIEUC ++ /xe1/x85/x9d HANGUL CHOSEONG NIEUN-HIEUH ++ /xe1/x85/x9e HANGUL CHOSEONG TIKEUT-RIEUL + /xe1/x85/x9f HANGUL CHOSEONG FILLER + /xe1/x85/xa0 HANGUL JUNGSEONG FILLER + /xe1/x85/xa1 HANGUL JUNGSEONG A +@@ -3594,6 +3734,11 @@ CHARMAP + /xe1/x86/xa0 HANGUL JUNGSEONG ARAEA-U + /xe1/x86/xa1 HANGUL JUNGSEONG ARAEA-I + /xe1/x86/xa2 HANGUL JUNGSEONG SSANGARAEA ++ /xe1/x86/xa3 HANGUL JUNGSEONG A-EU ++ /xe1/x86/xa4 HANGUL JUNGSEONG YA-U ++ /xe1/x86/xa5 HANGUL JUNGSEONG YEO-YA ++ /xe1/x86/xa6 HANGUL JUNGSEONG O-YA ++ /xe1/x86/xa7 HANGUL JUNGSEONG O-YAE + /xe1/x86/xa8 HANGUL JONGSEONG KIYEOK + /xe1/x86/xa9 HANGUL JONGSEONG SSANGKIYEOK + /xe1/x86/xaa HANGUL JONGSEONG KIYEOK-SIOS +@@ -3676,6 +3821,12 @@ CHARMAP + /xe1/x87/xb7 HANGUL JONGSEONG HIEUH-MIEUM + /xe1/x87/xb8 HANGUL JONGSEONG HIEUH-PIEUP + /xe1/x87/xb9 HANGUL JONGSEONG YEORINHIEUH ++ /xe1/x87/xba HANGUL JONGSEONG KIYEOK-NIEUN ++ /xe1/x87/xbb HANGUL JONGSEONG KIYEOK-PIEUP ++ /xe1/x87/xbc HANGUL JONGSEONG KIYEOK-CHIEUCH ++ /xe1/x87/xbd HANGUL JONGSEONG KIYEOK-KHIEUKH ++ /xe1/x87/xbe HANGUL JONGSEONG KIYEOK-HIEUH ++ /xe1/x87/xbf HANGUL JONGSEONG SSANGNIEUN + /xe1/x88/x80 ETHIOPIC SYLLABLE HA + /xe1/x88/x81 ETHIOPIC SYLLABLE HU + /xe1/x88/x82 ETHIOPIC SYLLABLE HI +@@ -4002,6 +4153,8 @@ CHARMAP + /xe1/x8d/x98 ETHIOPIC SYLLABLE RYA + /xe1/x8d/x99 ETHIOPIC SYLLABLE MYA + /xe1/x8d/x9a ETHIOPIC SYLLABLE FYA ++ /xe1/x8d/x9d ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK ++ /xe1/x8d/x9e ETHIOPIC COMBINING VOWEL LENGTH MARK + /xe1/x8d/x9f ETHIOPIC COMBINING GEMINATION MARK + /xe1/x8d/xa0 ETHIOPIC SECTION MARK + /xe1/x8d/xa1 ETHIOPIC WORDSPACE +@@ -4143,6 +4296,7 @@ CHARMAP + /xe1/x8f/xb2 CHEROKEE LETTER YO + /xe1/x8f/xb3 CHEROKEE LETTER YU + /xe1/x8f/xb4 CHEROKEE LETTER YV ++ /xe1/x90/x80 CANADIAN SYLLABICS HYPHEN + /xe1/x90/x81 CANADIAN SYLLABICS E + /xe1/x90/x82 CANADIAN SYLLABICS AAI + /xe1/x90/x83 CANADIAN SYLLABICS I +@@ -4773,6 +4927,15 @@ CHARMAP + /xe1/x99/xb4 CANADIAN SYLLABICS NNGOO + /xe1/x99/xb5 CANADIAN SYLLABICS NNGA + /xe1/x99/xb6 CANADIAN SYLLABICS NNGAA ++ /xe1/x99/xb7 CANADIAN SYLLABICS WOODS-CREE THWEE ++ /xe1/x99/xb8 CANADIAN SYLLABICS WOODS-CREE THWI ++ /xe1/x99/xb9 CANADIAN SYLLABICS WOODS-CREE THWII ++ /xe1/x99/xba CANADIAN SYLLABICS WOODS-CREE THWO ++ /xe1/x99/xbb CANADIAN SYLLABICS WOODS-CREE THWOO ++ /xe1/x99/xbc CANADIAN SYLLABICS WOODS-CREE THWA ++ /xe1/x99/xbd CANADIAN SYLLABICS WOODS-CREE THWAA ++ /xe1/x99/xbe CANADIAN SYLLABICS WOODS-CREE FINAL TH ++ /xe1/x99/xbf CANADIAN SYLLABICS BLACKFOOT W + /xe1/x9a/x80 OGHAM SPACE MARK + /xe1/x9a/x81 OGHAM LETTER BEITH + /xe1/x9a/x82 OGHAM LETTER LUIS +@@ -5234,6 +5397,76 @@ CHARMAP + /xe1/xa2/xa8 MONGOLIAN LETTER MANCHU ALI GALI BHA + /xe1/xa2/xa9 MONGOLIAN LETTER ALI GALI DAGALGA + /xe1/xa2/xaa MONGOLIAN LETTER MANCHU ALI GALI LHA ++ /xe1/xa2/xb0 CANADIAN SYLLABICS OY ++ /xe1/xa2/xb1 CANADIAN SYLLABICS AY ++ /xe1/xa2/xb2 CANADIAN SYLLABICS AAY ++ /xe1/xa2/xb3 CANADIAN SYLLABICS WAY ++ /xe1/xa2/xb4 CANADIAN SYLLABICS POY ++ /xe1/xa2/xb5 CANADIAN SYLLABICS PAY ++ /xe1/xa2/xb6 CANADIAN SYLLABICS PWOY ++ /xe1/xa2/xb7 CANADIAN SYLLABICS TAY ++ /xe1/xa2/xb8 CANADIAN SYLLABICS KAY ++ /xe1/xa2/xb9 CANADIAN SYLLABICS KWAY ++ /xe1/xa2/xba CANADIAN SYLLABICS MAY ++ /xe1/xa2/xbb CANADIAN SYLLABICS NOY ++ /xe1/xa2/xbc CANADIAN SYLLABICS NAY ++ /xe1/xa2/xbd CANADIAN SYLLABICS LAY ++ /xe1/xa2/xbe CANADIAN SYLLABICS SOY ++ /xe1/xa2/xbf CANADIAN SYLLABICS SAY ++ /xe1/xa3/x80 CANADIAN SYLLABICS SHOY ++ /xe1/xa3/x81 CANADIAN SYLLABICS SHAY ++ /xe1/xa3/x82 CANADIAN SYLLABICS SHWOY ++ /xe1/xa3/x83 CANADIAN SYLLABICS YOY ++ /xe1/xa3/x84 CANADIAN SYLLABICS YAY ++ /xe1/xa3/x85 CANADIAN SYLLABICS RAY ++ /xe1/xa3/x86 CANADIAN SYLLABICS NWI ++ /xe1/xa3/x87 CANADIAN SYLLABICS OJIBWAY NWI ++ /xe1/xa3/x88 CANADIAN SYLLABICS NWII ++ /xe1/xa3/x89 CANADIAN SYLLABICS OJIBWAY NWII ++ /xe1/xa3/x8a CANADIAN SYLLABICS NWO ++ /xe1/xa3/x8b CANADIAN SYLLABICS OJIBWAY NWO ++ /xe1/xa3/x8c CANADIAN SYLLABICS NWOO ++ /xe1/xa3/x8d CANADIAN SYLLABICS OJIBWAY NWOO ++ /xe1/xa3/x8e CANADIAN SYLLABICS RWEE ++ /xe1/xa3/x8f CANADIAN SYLLABICS RWI ++ /xe1/xa3/x90 CANADIAN SYLLABICS RWII ++ /xe1/xa3/x91 CANADIAN SYLLABICS RWO ++ /xe1/xa3/x92 CANADIAN SYLLABICS RWOO ++ /xe1/xa3/x93 CANADIAN SYLLABICS RWA ++ /xe1/xa3/x94 CANADIAN SYLLABICS OJIBWAY P ++ /xe1/xa3/x95 CANADIAN SYLLABICS OJIBWAY T ++ /xe1/xa3/x96 CANADIAN SYLLABICS OJIBWAY K ++ /xe1/xa3/x97 CANADIAN SYLLABICS OJIBWAY C ++ /xe1/xa3/x98 CANADIAN SYLLABICS OJIBWAY M ++ /xe1/xa3/x99 CANADIAN SYLLABICS OJIBWAY N ++ /xe1/xa3/x9a CANADIAN SYLLABICS OJIBWAY S ++ /xe1/xa3/x9b CANADIAN SYLLABICS OJIBWAY SH ++ /xe1/xa3/x9c CANADIAN SYLLABICS EASTERN W ++ /xe1/xa3/x9d CANADIAN SYLLABICS WESTERN W ++ /xe1/xa3/x9e CANADIAN SYLLABICS FINAL SMALL RING ++ /xe1/xa3/x9f CANADIAN SYLLABICS FINAL RAISED DOT ++ /xe1/xa3/xa0 CANADIAN SYLLABICS R-CREE RWE ++ /xe1/xa3/xa1 CANADIAN SYLLABICS WEST-CREE LOO ++ /xe1/xa3/xa2 CANADIAN SYLLABICS WEST-CREE LAA ++ /xe1/xa3/xa3 CANADIAN SYLLABICS THWE ++ /xe1/xa3/xa4 CANADIAN SYLLABICS THWA ++ /xe1/xa3/xa5 CANADIAN SYLLABICS TTHWE ++ /xe1/xa3/xa6 CANADIAN SYLLABICS TTHOO ++ /xe1/xa3/xa7 CANADIAN SYLLABICS TTHAA ++ /xe1/xa3/xa8 CANADIAN SYLLABICS TLHWE ++ /xe1/xa3/xa9 CANADIAN SYLLABICS TLHOO ++ /xe1/xa3/xaa CANADIAN SYLLABICS SAYISI SHWE ++ /xe1/xa3/xab CANADIAN SYLLABICS SAYISI SHOO ++ /xe1/xa3/xac CANADIAN SYLLABICS SAYISI HOO ++ /xe1/xa3/xad CANADIAN SYLLABICS CARRIER GWU ++ /xe1/xa3/xae CANADIAN SYLLABICS CARRIER DENE GEE ++ /xe1/xa3/xaf CANADIAN SYLLABICS CARRIER GAA ++ /xe1/xa3/xb0 CANADIAN SYLLABICS CARRIER GWA ++ /xe1/xa3/xb1 CANADIAN SYLLABICS SAYISI JUU ++ /xe1/xa3/xb2 CANADIAN SYLLABICS CARRIER JWA ++ /xe1/xa3/xb3 CANADIAN SYLLABICS BEAVER DENE L ++ /xe1/xa3/xb4 CANADIAN SYLLABICS BEAVER DENE R ++ /xe1/xa3/xb5 CANADIAN SYLLABICS CARRIER DENTAL S + /xe1/xa4/x80 LIMBU VOWEL-CARRIER LETTER + /xe1/xa4/x81 LIMBU LETTER KA + /xe1/xa4/x82 LIMBU LETTER KHA +@@ -5377,6 +5610,8 @@ CHARMAP + /xe1/xa6/xa7 NEW TAI LUE LETTER HIGH XVA + /xe1/xa6/xa8 NEW TAI LUE LETTER LOW KVA + /xe1/xa6/xa9 NEW TAI LUE LETTER LOW XVA ++ /xe1/xa6/xaa NEW TAI LUE LETTER HIGH SUA ++ /xe1/xa6/xab NEW TAI LUE LETTER LOW SUA + /xe1/xa6/xb0 NEW TAI LUE VOWEL SIGN VOWEL SHORTENER + /xe1/xa6/xb1 NEW TAI LUE VOWEL SIGN AA + /xe1/xa6/xb2 NEW TAI LUE VOWEL SIGN II +@@ -5413,6 +5648,7 @@ CHARMAP + /xe1/xa7/x97 NEW TAI LUE DIGIT SEVEN + /xe1/xa7/x98 NEW TAI LUE DIGIT EIGHT + /xe1/xa7/x99 NEW TAI LUE DIGIT NINE ++ /xe1/xa7/x9a NEW TAI LUE THAM DIGIT ONE + /xe1/xa7/x9e NEW TAI LUE SIGN LAE + /xe1/xa7/x9f NEW TAI LUE SIGN LAEV + /xe1/xa7/xa0 KHMER SYMBOL PATHAMASAT +@@ -5477,6 +5713,133 @@ CHARMAP + /xe1/xa8/x9b BUGINESE VOWEL SIGN AE + /xe1/xa8/x9e BUGINESE PALLAWA + /xe1/xa8/x9f BUGINESE END OF SECTION ++ /xe1/xa8/xa0 TAI THAM LETTER HIGH KA ++ /xe1/xa8/xa1 TAI THAM LETTER HIGH KHA ++ /xe1/xa8/xa2 TAI THAM LETTER HIGH KXA ++ /xe1/xa8/xa3 TAI THAM LETTER LOW KA ++ /xe1/xa8/xa4 TAI THAM LETTER LOW KXA ++ /xe1/xa8/xa5 TAI THAM LETTER LOW KHA ++ /xe1/xa8/xa6 TAI THAM LETTER NGA ++ /xe1/xa8/xa7 TAI THAM LETTER HIGH CA ++ /xe1/xa8/xa8 TAI THAM LETTER HIGH CHA ++ /xe1/xa8/xa9 TAI THAM LETTER LOW CA ++ /xe1/xa8/xaa TAI THAM LETTER LOW SA ++ /xe1/xa8/xab TAI THAM LETTER LOW CHA ++ /xe1/xa8/xac TAI THAM LETTER NYA ++ /xe1/xa8/xad TAI THAM LETTER RATA ++ /xe1/xa8/xae TAI THAM LETTER HIGH RATHA ++ /xe1/xa8/xaf TAI THAM LETTER DA ++ /xe1/xa8/xb0 TAI THAM LETTER LOW RATHA ++ /xe1/xa8/xb1 TAI THAM LETTER RANA ++ /xe1/xa8/xb2 TAI THAM LETTER HIGH TA ++ /xe1/xa8/xb3 TAI THAM LETTER HIGH THA ++ /xe1/xa8/xb4 TAI THAM LETTER LOW TA ++ /xe1/xa8/xb5 TAI THAM LETTER LOW THA ++ /xe1/xa8/xb6 TAI THAM LETTER NA ++ /xe1/xa8/xb7 TAI THAM LETTER BA ++ /xe1/xa8/xb8 TAI THAM LETTER HIGH PA ++ /xe1/xa8/xb9 TAI THAM LETTER HIGH PHA ++ /xe1/xa8/xba TAI THAM LETTER HIGH FA ++ /xe1/xa8/xbb TAI THAM LETTER LOW PA ++ /xe1/xa8/xbc TAI THAM LETTER LOW FA ++ /xe1/xa8/xbd TAI THAM LETTER LOW PHA ++ /xe1/xa8/xbe TAI THAM LETTER MA ++ /xe1/xa8/xbf TAI THAM LETTER LOW YA ++ /xe1/xa9/x80 TAI THAM LETTER HIGH YA ++ /xe1/xa9/x81 TAI THAM LETTER RA ++ /xe1/xa9/x82 TAI THAM LETTER RUE ++ /xe1/xa9/x83 TAI THAM LETTER LA ++ /xe1/xa9/x84 TAI THAM LETTER LUE ++ /xe1/xa9/x85 TAI THAM LETTER WA ++ /xe1/xa9/x86 TAI THAM LETTER HIGH SHA ++ /xe1/xa9/x87 TAI THAM LETTER HIGH SSA ++ /xe1/xa9/x88 TAI THAM LETTER HIGH SA ++ /xe1/xa9/x89 TAI THAM LETTER HIGH HA ++ /xe1/xa9/x8a TAI THAM LETTER LLA ++ /xe1/xa9/x8b TAI THAM LETTER A ++ /xe1/xa9/x8c TAI THAM LETTER LOW HA ++ /xe1/xa9/x8d TAI THAM LETTER I ++ /xe1/xa9/x8e TAI THAM LETTER II ++ /xe1/xa9/x8f TAI THAM LETTER U ++ /xe1/xa9/x90 TAI THAM LETTER UU ++ /xe1/xa9/x91 TAI THAM LETTER EE ++ /xe1/xa9/x92 TAI THAM LETTER OO ++ /xe1/xa9/x93 TAI THAM LETTER LAE ++ /xe1/xa9/x94 TAI THAM LETTER GREAT SA ++ /xe1/xa9/x95 TAI THAM CONSONANT SIGN MEDIAL RA ++ /xe1/xa9/x96 TAI THAM CONSONANT SIGN MEDIAL LA ++ /xe1/xa9/x97 TAI THAM CONSONANT SIGN LA TANG LAI ++ /xe1/xa9/x98 TAI THAM SIGN MAI KANG LAI ++ /xe1/xa9/x99 TAI THAM CONSONANT SIGN FINAL NGA ++ /xe1/xa9/x9a TAI THAM CONSONANT SIGN LOW PA ++ /xe1/xa9/x9b TAI THAM CONSONANT SIGN HIGH RATHA OR LOW PA ++ /xe1/xa9/x9c TAI THAM CONSONANT SIGN MA ++ /xe1/xa9/x9d TAI THAM CONSONANT SIGN BA ++ /xe1/xa9/x9e TAI THAM CONSONANT SIGN SA ++ /xe1/xa9/xa0 TAI THAM SIGN SAKOT ++ /xe1/xa9/xa1 TAI THAM VOWEL SIGN A ++ /xe1/xa9/xa2 TAI THAM VOWEL SIGN MAI SAT ++ /xe1/xa9/xa3 TAI THAM VOWEL SIGN AA ++ /xe1/xa9/xa4 TAI THAM VOWEL SIGN TALL AA ++ /xe1/xa9/xa5 TAI THAM VOWEL SIGN I ++ /xe1/xa9/xa6 TAI THAM VOWEL SIGN II ++ /xe1/xa9/xa7 TAI THAM VOWEL SIGN UE ++ /xe1/xa9/xa8 TAI THAM VOWEL SIGN UUE ++ /xe1/xa9/xa9 TAI THAM VOWEL SIGN U ++ /xe1/xa9/xaa TAI THAM VOWEL SIGN UU ++ /xe1/xa9/xab TAI THAM VOWEL SIGN O ++ /xe1/xa9/xac TAI THAM VOWEL SIGN OA BELOW ++ /xe1/xa9/xad TAI THAM VOWEL SIGN OY ++ /xe1/xa9/xae TAI THAM VOWEL SIGN E ++ /xe1/xa9/xaf TAI THAM VOWEL SIGN AE ++ /xe1/xa9/xb0 TAI THAM VOWEL SIGN OO ++ /xe1/xa9/xb1 TAI THAM VOWEL SIGN AI ++ /xe1/xa9/xb2 TAI THAM VOWEL SIGN THAM AI ++ /xe1/xa9/xb3 TAI THAM VOWEL SIGN OA ABOVE ++ /xe1/xa9/xb4 TAI THAM SIGN MAI KANG ++ /xe1/xa9/xb5 TAI THAM SIGN TONE-1 ++ /xe1/xa9/xb6 TAI THAM SIGN TONE-2 ++ /xe1/xa9/xb7 TAI THAM SIGN KHUEN TONE-3 ++ /xe1/xa9/xb8 TAI THAM SIGN KHUEN TONE-4 ++ /xe1/xa9/xb9 TAI THAM SIGN KHUEN TONE-5 ++ /xe1/xa9/xba TAI THAM SIGN RA HAAM ++ /xe1/xa9/xbb TAI THAM SIGN MAI SAM ++ /xe1/xa9/xbc TAI THAM SIGN KHUEN-LUE KARAN ++ /xe1/xa9/xbf TAI THAM COMBINING CRYPTOGRAMMIC DOT ++ /xe1/xaa/x80 TAI THAM HORA DIGIT ZERO ++ /xe1/xaa/x81 TAI THAM HORA DIGIT ONE ++ /xe1/xaa/x82 TAI THAM HORA DIGIT TWO ++ /xe1/xaa/x83 TAI THAM HORA DIGIT THREE ++ /xe1/xaa/x84 TAI THAM HORA DIGIT FOUR ++ /xe1/xaa/x85 TAI THAM HORA DIGIT FIVE ++ /xe1/xaa/x86 TAI THAM HORA DIGIT SIX ++ /xe1/xaa/x87 TAI THAM HORA DIGIT SEVEN ++ /xe1/xaa/x88 TAI THAM HORA DIGIT EIGHT ++ /xe1/xaa/x89 TAI THAM HORA DIGIT NINE ++ /xe1/xaa/x90 TAI THAM THAM DIGIT ZERO ++ /xe1/xaa/x91 TAI THAM THAM DIGIT ONE ++ /xe1/xaa/x92 TAI THAM THAM DIGIT TWO ++ /xe1/xaa/x93 TAI THAM THAM DIGIT THREE ++ /xe1/xaa/x94 TAI THAM THAM DIGIT FOUR ++ /xe1/xaa/x95 TAI THAM THAM DIGIT FIVE ++ /xe1/xaa/x96 TAI THAM THAM DIGIT SIX ++ /xe1/xaa/x97 TAI THAM THAM DIGIT SEVEN ++ /xe1/xaa/x98 TAI THAM THAM DIGIT EIGHT ++ /xe1/xaa/x99 TAI THAM THAM DIGIT NINE ++ /xe1/xaa/xa0 TAI THAM SIGN WIANG ++ /xe1/xaa/xa1 TAI THAM SIGN WIANGWAAK ++ /xe1/xaa/xa2 TAI THAM SIGN SAWAN ++ /xe1/xaa/xa3 TAI THAM SIGN KEOW ++ /xe1/xaa/xa4 TAI THAM SIGN HOY ++ /xe1/xaa/xa5 TAI THAM SIGN DOKMAI ++ /xe1/xaa/xa6 TAI THAM SIGN REVERSED ROTATED RANA ++ /xe1/xaa/xa7 TAI THAM SIGN MAI YAMOK ++ /xe1/xaa/xa8 TAI THAM SIGN KAAN ++ /xe1/xaa/xa9 TAI THAM SIGN KAANKUU ++ /xe1/xaa/xaa TAI THAM SIGN SATKAAN ++ /xe1/xaa/xab TAI THAM SIGN SATKAANKUU ++ /xe1/xaa/xac TAI THAM SIGN HANG ++ /xe1/xaa/xad TAI THAM SIGN CAANG + /xe1/xac/x80 BALINESE SIGN ULU RICEM + /xe1/xac/x81 BALINESE SIGN ULU CANDRA + /xe1/xac/x82 BALINESE SIGN CECEK +@@ -5653,6 +6016,62 @@ CHARMAP + /xe1/xae/xb7 SUNDANESE DIGIT SEVEN + /xe1/xae/xb8 SUNDANESE DIGIT EIGHT + /xe1/xae/xb9 SUNDANESE DIGIT NINE ++ /xe1/xaf/x80 BATAK LETTER A ++ /xe1/xaf/x81 BATAK LETTER SIMALUNGUN A ++ /xe1/xaf/x82 BATAK LETTER HA ++ /xe1/xaf/x83 BATAK LETTER SIMALUNGUN HA ++ /xe1/xaf/x84 BATAK LETTER MANDAILING HA ++ /xe1/xaf/x85 BATAK LETTER BA ++ /xe1/xaf/x86 BATAK LETTER KARO BA ++ /xe1/xaf/x87 BATAK LETTER PA ++ /xe1/xaf/x88 BATAK LETTER SIMALUNGUN PA ++ /xe1/xaf/x89 BATAK LETTER NA ++ /xe1/xaf/x8a BATAK LETTER MANDAILING NA ++ /xe1/xaf/x8b BATAK LETTER WA ++ /xe1/xaf/x8c BATAK LETTER SIMALUNGUN WA ++ /xe1/xaf/x8d BATAK LETTER PAKPAK WA ++ /xe1/xaf/x8e BATAK LETTER GA ++ /xe1/xaf/x8f BATAK LETTER SIMALUNGUN GA ++ /xe1/xaf/x90 BATAK LETTER JA ++ /xe1/xaf/x91 BATAK LETTER DA ++ /xe1/xaf/x92 BATAK LETTER RA ++ /xe1/xaf/x93 BATAK LETTER SIMALUNGUN RA ++ /xe1/xaf/x94 BATAK LETTER MA ++ /xe1/xaf/x95 BATAK LETTER SIMALUNGUN MA ++ /xe1/xaf/x96 BATAK LETTER SOUTHERN TA ++ /xe1/xaf/x97 BATAK LETTER NORTHERN TA ++ /xe1/xaf/x98 BATAK LETTER SA ++ /xe1/xaf/x99 BATAK LETTER SIMALUNGUN SA ++ /xe1/xaf/x9a BATAK LETTER MANDAILING SA ++ /xe1/xaf/x9b BATAK LETTER YA ++ /xe1/xaf/x9c BATAK LETTER SIMALUNGUN YA ++ /xe1/xaf/x9d BATAK LETTER NGA ++ /xe1/xaf/x9e BATAK LETTER LA ++ /xe1/xaf/x9f BATAK LETTER SIMALUNGUN LA ++ /xe1/xaf/xa0 BATAK LETTER NYA ++ /xe1/xaf/xa1 BATAK LETTER CA ++ /xe1/xaf/xa2 BATAK LETTER NDA ++ /xe1/xaf/xa3 BATAK LETTER MBA ++ /xe1/xaf/xa4 BATAK LETTER I ++ /xe1/xaf/xa5 BATAK LETTER U ++ /xe1/xaf/xa6 BATAK SIGN TOMPI ++ /xe1/xaf/xa7 BATAK VOWEL SIGN E ++ /xe1/xaf/xa8 BATAK VOWEL SIGN PAKPAK E ++ /xe1/xaf/xa9 BATAK VOWEL SIGN EE ++ /xe1/xaf/xaa BATAK VOWEL SIGN I ++ /xe1/xaf/xab BATAK VOWEL SIGN KARO I ++ /xe1/xaf/xac BATAK VOWEL SIGN O ++ /xe1/xaf/xad BATAK VOWEL SIGN KARO O ++ /xe1/xaf/xae BATAK VOWEL SIGN U ++ /xe1/xaf/xaf BATAK VOWEL SIGN U FOR SIMALUNGUN SA ++ /xe1/xaf/xb0 BATAK CONSONANT SIGN NG ++ /xe1/xaf/xb1 BATAK CONSONANT SIGN H ++ /xe1/xaf/xb2 BATAK PANGOLAT ++ /xe1/xaf/xb3 BATAK PANONGONAN ++ /xe1/xaf/xbc BATAK SYMBOL BINDU NA METEK ++ /xe1/xaf/xbd BATAK SYMBOL BINDU PINARBORAS ++ /xe1/xaf/xbe BATAK SYMBOL BINDU JUDUL ++ /xe1/xaf/xbf BATAK SYMBOL BINDU PANGOLAT + /xe1/xb0/x80 LEPCHA LETTER KA + /xe1/xb0/x81 LEPCHA LETTER KLA + /xe1/xb0/x82 LEPCHA LETTER KHA +@@ -5775,6 +6194,41 @@ CHARMAP + /xe1/xb1/xbd OL CHIKI AHAD + /xe1/xb1/xbe OL CHIKI PUNCTUATION MUCAAD + /xe1/xb1/xbf OL CHIKI PUNCTUATION DOUBLE MUCAAD ++ /xe1/xb3/x90 VEDIC TONE KARSHANA ++ /xe1/xb3/x91 VEDIC TONE SHARA ++ /xe1/xb3/x92 VEDIC TONE PRENKHA ++ /xe1/xb3/x93 VEDIC SIGN NIHSHVASA ++ /xe1/xb3/x94 VEDIC SIGN YAJURVEDIC MIDLINE SVARITA ++ /xe1/xb3/x95 VEDIC TONE YAJURVEDIC AGGRAVATED INDEPENDENT SVARITA ++ /xe1/xb3/x96 VEDIC TONE YAJURVEDIC INDEPENDENT SVARITA ++ /xe1/xb3/x97 VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA ++ /xe1/xb3/x98 VEDIC TONE CANDRA BELOW ++ /xe1/xb3/x99 VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA SCHROEDER ++ /xe1/xb3/x9a VEDIC TONE DOUBLE SVARITA ++ /xe1/xb3/x9b VEDIC TONE TRIPLE SVARITA ++ /xe1/xb3/x9c VEDIC TONE KATHAKA ANUDATTA ++ /xe1/xb3/x9d VEDIC TONE DOT BELOW ++ /xe1/xb3/x9e VEDIC TONE TWO DOTS BELOW ++ /xe1/xb3/x9f VEDIC TONE THREE DOTS BELOW ++ /xe1/xb3/xa0 VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA ++ /xe1/xb3/xa1 VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA ++ /xe1/xb3/xa2 VEDIC SIGN VISARGA SVARITA ++ /xe1/xb3/xa3 VEDIC SIGN VISARGA UDATTA ++ /xe1/xb3/xa4 VEDIC SIGN REVERSED VISARGA UDATTA ++ /xe1/xb3/xa5 VEDIC SIGN VISARGA ANUDATTA ++ /xe1/xb3/xa6 VEDIC SIGN REVERSED VISARGA ANUDATTA ++ /xe1/xb3/xa7 VEDIC SIGN VISARGA UDATTA WITH TAIL ++ /xe1/xb3/xa8 VEDIC SIGN VISARGA ANUDATTA WITH TAIL ++ /xe1/xb3/xa9 VEDIC SIGN ANUSVARA ANTARGOMUKHA ++ /xe1/xb3/xaa VEDIC SIGN ANUSVARA BAHIRGOMUKHA ++ /xe1/xb3/xab VEDIC SIGN ANUSVARA VAMAGOMUKHA ++ /xe1/xb3/xac VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL ++ /xe1/xb3/xad VEDIC SIGN TIRYAK ++ /xe1/xb3/xae VEDIC SIGN HEXIFORM LONG ANUSVARA ++ /xe1/xb3/xaf VEDIC SIGN LONG ANUSVARA ++ /xe1/xb3/xb0 VEDIC SIGN RTHANG LONG ANUSVARA ++ /xe1/xb3/xb1 VEDIC SIGN ANUSVARA UBHAYATO MUKHA ++ /xe1/xb3/xb2 VEDIC SIGN ARDHAVISARGA + /xe1/xb4/x80 LATIN LETTER SMALL CAPITAL A + /xe1/xb4/x81 LATIN LETTER SMALL CAPITAL AE + /xe1/xb4/x82 LATIN SMALL LETTER TURNED AE +@@ -6006,6 +6460,8 @@ CHARMAP + /xe1/xb7/xa4 COMBINING LATIN SMALL LETTER S + /xe1/xb7/xa5 COMBINING LATIN SMALL LETTER LONG S + /xe1/xb7/xa6 COMBINING LATIN SMALL LETTER Z ++ /xe1/xb7/xbc COMBINING DOUBLE INVERTED BREVE BELOW ++ /xe1/xb7/xbd COMBINING ALMOST EQUAL TO BELOW + /xe1/xb7/xbe COMBINING LEFT ARROWHEAD ABOVE + /xe1/xb7/xbf COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW + /xe1/xb8/x80 LATIN CAPITAL LETTER A WITH RING BELOW +@@ -6638,6 +7094,14 @@ CHARMAP + /xe2/x82/x92 LATIN SUBSCRIPT SMALL LETTER O + /xe2/x82/x93 LATIN SUBSCRIPT SMALL LETTER X + /xe2/x82/x94 LATIN SUBSCRIPT SMALL LETTER SCHWA ++ /xe2/x82/x95 LATIN SUBSCRIPT SMALL LETTER H ++ /xe2/x82/x96 LATIN SUBSCRIPT SMALL LETTER K ++ /xe2/x82/x97 LATIN SUBSCRIPT SMALL LETTER L ++ /xe2/x82/x98 LATIN SUBSCRIPT SMALL LETTER M ++ /xe2/x82/x99 LATIN SUBSCRIPT SMALL LETTER N ++ /xe2/x82/x9a LATIN SUBSCRIPT SMALL LETTER P ++ /xe2/x82/x9b LATIN SUBSCRIPT SMALL LETTER S ++ /xe2/x82/x9c LATIN SUBSCRIPT SMALL LETTER T + /xe2/x82/xa0 EURO-CURRENCY SIGN + /xe2/x82/xa1 COLON SIGN + /xe2/x82/xa2 CRUZEIRO SIGN +@@ -6660,6 +7124,10 @@ CHARMAP + /xe2/x82/xb3 AUSTRAL SIGN + /xe2/x82/xb4 HRYVNIA SIGN + /xe2/x82/xb5 CEDI SIGN ++ /xe2/x82/xb6 LIVRE TOURNOIS SIGN ++ /xe2/x82/xb7 SPESMILO SIGN ++ /xe2/x82/xb8 TENGE SIGN ++ /xe2/x82/xb9 INDIAN RUPEE SIGN + /xe2/x83/x90 COMBINING LEFT HARPOON ABOVE + /xe2/x83/x91 COMBINING RIGHT HARPOON ABOVE + /xe2/x83/x92 COMBINING LONG VERTICAL LINE OVERLAY +@@ -6773,6 +7241,9 @@ CHARMAP + /xe2/x85/x8d AKTIESELSKAB + /xe2/x85/x8e TURNED SMALL F + /xe2/x85/x8f SYMBOL FOR SAMARITAN SOURCE ++ /xe2/x85/x90 VULGAR FRACTION ONE SEVENTH ++ /xe2/x85/x91 VULGAR FRACTION ONE NINTH ++ /xe2/x85/x92 VULGAR FRACTION ONE TENTH + /xe2/x85/x93 VULGAR FRACTION ONE THIRD + /xe2/x85/x94 VULGAR FRACTION TWO THIRDS + /xe2/x85/x95 VULGAR FRACTION ONE FIFTH +@@ -6827,6 +7298,7 @@ CHARMAP + /xe2/x86/x86 ROMAN NUMERAL FIFTY EARLY FORM + /xe2/x86/x87 ROMAN NUMERAL FIFTY THOUSAND + /xe2/x86/x88 ROMAN NUMERAL ONE HUNDRED THOUSAND ++ /xe2/x86/x89 VULGAR FRACTION ZERO THIRDS + /xe2/x86/x90 LEFTWARDS ARROW + /xe2/x86/x91 UPWARDS ARROW + /xe2/x86/x92 RIGHTWARDS ARROW +@@ -7427,6 +7899,18 @@ CHARMAP + /xe2/x8f/xa5 FLATNESS + /xe2/x8f/xa6 AC CURRENT + /xe2/x8f/xa7 ELECTRICAL INTERSECTION ++ /xe2/x8f/xa8 DECIMAL EXPONENT SYMBOL ++ /xe2/x8f/xa9 BLACK RIGHT-POINTING DOUBLE TRIANGLE ++ /xe2/x8f/xaa BLACK LEFT-POINTING DOUBLE TRIANGLE ++ /xe2/x8f/xab BLACK UP-POINTING DOUBLE TRIANGLE ++ /xe2/x8f/xac BLACK DOWN-POINTING DOUBLE TRIANGLE ++ /xe2/x8f/xad BLACK RIGHT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR ++ /xe2/x8f/xae BLACK LEFT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR ++ /xe2/x8f/xaf BLACK RIGHT-POINTING TRIANGLE WITH DOUBLE VERTICAL BAR ++ /xe2/x8f/xb0 ALARM CLOCK ++ /xe2/x8f/xb1 STOPWATCH ++ /xe2/x8f/xb2 TIMER CLOCK ++ /xe2/x8f/xb3 HOURGLASS WITH FLOWING SAND + /xe2/x90/x80 SYMBOL FOR NULL + /xe2/x90/x81 SYMBOL FOR START OF HEADING + /xe2/x90/x82 SYMBOL FOR START OF TEXT +@@ -8051,6 +8535,8 @@ CHARMAP + /xe2/x9a/x9b ATOM SYMBOL + /xe2/x9a/x9c FLEUR-DE-LIS + /xe2/x9a/x9d OUTLINED WHITE STAR ++ /xe2/x9a/x9e THREE LINES CONVERGING RIGHT ++ /xe2/x9a/x9f THREE LINES CONVERGING LEFT + /xe2/x9a/xa0 WARNING SIGN + /xe2/x9a/xa1 HIGH VOLTAGE SIGN + /xe2/x9a/xa2 DOUBLED FEMALE SIGN +@@ -8080,18 +8566,84 @@ CHARMAP + /xe2/x9a/xba SEMISEXTILE + /xe2/x9a/xbb QUINCUNX + /xe2/x9a/xbc SESQUIQUADRATE ++ /xe2/x9a/xbd SOCCER BALL ++ /xe2/x9a/xbe BASEBALL ++ /xe2/x9a/xbf SQUARED KEY + /xe2/x9b/x80 WHITE DRAUGHTS MAN + /xe2/x9b/x81 WHITE DRAUGHTS KING + /xe2/x9b/x82 BLACK DRAUGHTS MAN + /xe2/x9b/x83 BLACK DRAUGHTS KING ++ /xe2/x9b/x84 SNOWMAN WITHOUT SNOW ++ /xe2/x9b/x85 SUN BEHIND CLOUD ++ /xe2/x9b/x86 RAIN ++ /xe2/x9b/x87 BLACK SNOWMAN ++ /xe2/x9b/x88 THUNDER CLOUD AND RAIN ++ /xe2/x9b/x89 TURNED WHITE SHOGI PIECE ++ /xe2/x9b/x8a TURNED BLACK SHOGI PIECE ++ /xe2/x9b/x8b WHITE DIAMOND IN SQUARE ++ /xe2/x9b/x8c CROSSING LANES ++ /xe2/x9b/x8d DISABLED CAR ++ /xe2/x9b/x8e OPHIUCHUS ++ /xe2/x9b/x8f PICK ++ /xe2/x9b/x90 CAR SLIDING ++ /xe2/x9b/x91 HELMET WITH WHITE CROSS ++ /xe2/x9b/x92 CIRCLED CROSSING LANES ++ /xe2/x9b/x93 CHAINS ++ /xe2/x9b/x94 NO ENTRY ++ /xe2/x9b/x95 ALTERNATE ONE-WAY LEFT WAY TRAFFIC ++ /xe2/x9b/x96 BLACK TWO-WAY LEFT WAY TRAFFIC ++ /xe2/x9b/x97 WHITE TWO-WAY LEFT WAY TRAFFIC ++ /xe2/x9b/x98 BLACK LEFT LANE MERGE ++ /xe2/x9b/x99 WHITE LEFT LANE MERGE ++ /xe2/x9b/x9a DRIVE SLOW SIGN ++ /xe2/x9b/x9b HEAVY WHITE DOWN-POINTING TRIANGLE ++ /xe2/x9b/x9c LEFT CLOSED ENTRY ++ /xe2/x9b/x9d SQUARED SALTIRE ++ /xe2/x9b/x9e FALLING DIAGONAL IN WHITE CIRCLE IN BLACK SQUARE ++ /xe2/x9b/x9f BLACK TRUCK ++ /xe2/x9b/xa0 RESTRICTED LEFT ENTRY-1 ++ /xe2/x9b/xa1 RESTRICTED LEFT ENTRY-2 ++ /xe2/x9b/xa2 ASTRONOMICAL SYMBOL FOR URANUS ++ /xe2/x9b/xa3 HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE ++ /xe2/x9b/xa4 PENTAGRAM ++ /xe2/x9b/xa5 RIGHT-HANDED INTERLACED PENTAGRAM ++ /xe2/x9b/xa6 LEFT-HANDED INTERLACED PENTAGRAM ++ /xe2/x9b/xa7 INVERTED PENTAGRAM ++ /xe2/x9b/xa8 BLACK CROSS ON SHIELD ++ /xe2/x9b/xa9 SHINTO SHRINE ++ /xe2/x9b/xaa CHURCH ++ /xe2/x9b/xab CASTLE ++ /xe2/x9b/xac HISTORIC SITE ++ /xe2/x9b/xad GEAR WITHOUT HUB ++ /xe2/x9b/xae GEAR WITH HANDLES ++ /xe2/x9b/xaf MAP SYMBOL FOR LIGHTHOUSE ++ /xe2/x9b/xb0 MOUNTAIN ++ /xe2/x9b/xb1 UMBRELLA ON GROUND ++ /xe2/x9b/xb2 FOUNTAIN ++ /xe2/x9b/xb3 FLAG IN HOLE ++ /xe2/x9b/xb4 FERRY ++ /xe2/x9b/xb5 SAILBOAT ++ /xe2/x9b/xb6 SQUARE FOUR CORNERS ++ /xe2/x9b/xb7 SKIER ++ /xe2/x9b/xb8 ICE SKATE ++ /xe2/x9b/xb9 PERSON WITH BALL ++ /xe2/x9b/xba TENT ++ /xe2/x9b/xbb JAPANESE BANK SYMBOL ++ /xe2/x9b/xbc HEADSTONE GRAVEYARD SYMBOL ++ /xe2/x9b/xbd FUEL PUMP ++ /xe2/x9b/xbe CUP ON BLACK SQUARE ++ /xe2/x9b/xbf WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE + /xe2/x9c/x81 UPPER BLADE SCISSORS + /xe2/x9c/x82 BLACK SCISSORS + /xe2/x9c/x83 LOWER BLADE SCISSORS + /xe2/x9c/x84 WHITE SCISSORS ++ /xe2/x9c/x85 WHITE HEAVY CHECK MARK + /xe2/x9c/x86 TELEPHONE LOCATION SIGN + /xe2/x9c/x87 TAPE DRIVE + /xe2/x9c/x88 AIRPLANE + /xe2/x9c/x89 ENVELOPE ++ /xe2/x9c/x8a RAISED FIST ++ /xe2/x9c/x8b RAISED HAND + /xe2/x9c/x8c VICTORY HAND + /xe2/x9c/x8d WRITING HAND + /xe2/x9c/x8e LOWER RIGHT PENCIL +@@ -8120,6 +8672,7 @@ CHARMAP + /xe2/x9c/xa5 FOUR CLUB-SPOKED ASTERISK + /xe2/x9c/xa6 BLACK FOUR POINTED STAR + /xe2/x9c/xa7 WHITE FOUR POINTED STAR ++ /xe2/x9c/xa8 SPARKLES + /xe2/x9c/xa9 STRESS OUTLINED WHITE STAR + /xe2/x9c/xaa CIRCLED WHITE STAR + /xe2/x9c/xab OPEN CENTRE BLACK STAR +@@ -8155,12 +8708,18 @@ CHARMAP + /xe2/x9d/x89 BALLOON-SPOKED ASTERISK + /xe2/x9d/x8a EIGHT TEARDROP-SPOKED PROPELLER ASTERISK + /xe2/x9d/x8b HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK ++ /xe2/x9d/x8c CROSS MARK + /xe2/x9d/x8d SHADOWED WHITE CIRCLE ++ /xe2/x9d/x8e NEGATIVE SQUARED CROSS MARK + /xe2/x9d/x8f LOWER RIGHT DROP-SHADOWED WHITE SQUARE + /xe2/x9d/x90 UPPER RIGHT DROP-SHADOWED WHITE SQUARE + /xe2/x9d/x91 LOWER RIGHT SHADOWED WHITE SQUARE + /xe2/x9d/x92 UPPER RIGHT SHADOWED WHITE SQUARE ++ /xe2/x9d/x93 BLACK QUESTION MARK ORNAMENT ++ /xe2/x9d/x94 WHITE QUESTION MARK ORNAMENT ++ /xe2/x9d/x95 WHITE EXCLAMATION MARK ORNAMENT + /xe2/x9d/x96 BLACK DIAMOND MINUS WHITE X ++ /xe2/x9d/x97 HEAVY EXCLAMATION MARK SYMBOL + /xe2/x9d/x98 LIGHT VERTICAL BAR + /xe2/x9d/x99 MEDIUM VERTICAL BAR + /xe2/x9d/x9a HEAVY VERTICAL BAR +@@ -8168,6 +8727,8 @@ CHARMAP + /xe2/x9d/x9c HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT + /xe2/x9d/x9d HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT + /xe2/x9d/x9e HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT ++ /xe2/x9d/x9f HEAVY LOW SINGLE COMMA QUOTATION MARK ORNAMENT ++ /xe2/x9d/xa0 HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT + /xe2/x9d/xa1 CURVED STEM PARAGRAPH SIGN ORNAMENT + /xe2/x9d/xa2 HEAVY EXCLAMATION MARK ORNAMENT + /xe2/x9d/xa3 HEAVY HEART EXCLAMATION MARK ORNAMENT +@@ -8220,6 +8781,9 @@ CHARMAP + /xe2/x9e/x92 DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE + /xe2/x9e/x93 DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN + /xe2/x9e/x94 HEAVY WIDE-HEADED RIGHTWARDS ARROW ++ /xe2/x9e/x95 HEAVY PLUS SIGN ++ /xe2/x9e/x96 HEAVY MINUS SIGN ++ /xe2/x9e/x97 HEAVY DIVISION SIGN + /xe2/x9e/x98 HEAVY SOUTH EAST ARROW + /xe2/x9e/x99 HEAVY RIGHTWARDS ARROW + /xe2/x9e/x9a HEAVY NORTH EAST ARROW +@@ -8244,6 +8808,7 @@ CHARMAP + /xe2/x9e/xad HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW + /xe2/x9e/xae HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW + /xe2/x9e/xaf NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW ++ /xe2/x9e/xb0 CURLY LOOP + /xe2/x9e/xb1 NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW + /xe2/x9e/xb2 CIRCLED HEAVY WHITE RIGHTWARDS ARROW + /xe2/x9e/xb3 WHITE-FEATHERED RIGHTWARDS ARROW +@@ -8258,6 +8823,7 @@ CHARMAP + /xe2/x9e/xbc WEDGE-TAILED RIGHTWARDS ARROW + /xe2/x9e/xbd HEAVY WEDGE-TAILED RIGHTWARDS ARROW + /xe2/x9e/xbe OPEN-OUTLINED RIGHTWARDS ARROW ++ /xe2/x9e/xbf DOUBLE CURLY LOOP + /xe2/x9f/x80 THREE DIMENSIONAL ANGLE + /xe2/x9f/x81 WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE + /xe2/x9f/x82 PERPENDICULAR +@@ -8270,6 +8836,8 @@ CHARMAP + /xe2/x9f/x89 SUPERSET PRECEDING SOLIDUS + /xe2/x9f/x8a VERTICAL BAR WITH HORIZONTAL STROKE + /xe2/x9f/x8c LONG DIVISION ++ /xe2/x9f/x8e SQUARED LOGICAL AND ++ /xe2/x9f/x8f SQUARED LOGICAL OR + /xe2/x9f/x90 WHITE DIAMOND WITH CENTRED DOT + /xe2/x9f/x91 AND WITH DOT + /xe2/x9f/x92 ELEMENT OF OPENING UPWARDS +@@ -9168,6 +9736,11 @@ CHARMAP + /xe2/xad/x92 WHITE SMALL STAR + /xe2/xad/x93 BLACK RIGHT-POINTING PENTAGON + /xe2/xad/x94 WHITE RIGHT-POINTING PENTAGON ++ /xe2/xad/x95 HEAVY LARGE CIRCLE ++ /xe2/xad/x96 HEAVY OVAL WITH OVAL INSIDE ++ /xe2/xad/x97 HEAVY CIRCLE WITH CIRCLE INSIDE ++ /xe2/xad/x98 HEAVY CIRCLE ++ /xe2/xad/x99 HEAVY CIRCLED SALTIRE + /xe2/xb0/x80 GLAGOLITIC CAPITAL LETTER AZU + /xe2/xb0/x81 GLAGOLITIC CAPITAL LETTER BUKY + /xe2/xb0/x82 GLAGOLITIC CAPITAL LETTER VEDE +@@ -9278,6 +9851,7 @@ CHARMAP + /xe2/xb1/xad LATIN CAPITAL LETTER ALPHA + /xe2/xb1/xae LATIN CAPITAL LETTER M WITH HOOK + /xe2/xb1/xaf LATIN CAPITAL LETTER TURNED A ++ /xe2/xb1/xb0 LATIN CAPITAL LETTER TURNED ALPHA + /xe2/xb1/xb1 LATIN SMALL LETTER V WITH RIGHT HOOK + /xe2/xb1/xb2 LATIN CAPITAL LETTER W WITH HOOK + /xe2/xb1/xb3 LATIN SMALL LETTER W WITH HOOK +@@ -9291,6 +9865,8 @@ CHARMAP + /xe2/xb1/xbb LATIN LETTER SMALL CAPITAL TURNED E + /xe2/xb1/xbc LATIN SUBSCRIPT SMALL LETTER J + /xe2/xb1/xbd MODIFIER LETTER CAPITAL V ++ /xe2/xb1/xbe LATIN CAPITAL LETTER S WITH SWASH TAIL ++ /xe2/xb1/xbf LATIN CAPITAL LETTER Z WITH SWASH TAIL + /xe2/xb2/x80 COPTIC CAPITAL LETTER ALFA + /xe2/xb2/x81 COPTIC SMALL LETTER ALFA + /xe2/xb2/x82 COPTIC CAPITAL LETTER VIDA +@@ -9398,6 +9974,13 @@ CHARMAP + /xe2/xb3/xa8 COPTIC SYMBOL TAU RO + /xe2/xb3/xa9 COPTIC SYMBOL KHI RO + /xe2/xb3/xaa COPTIC SYMBOL SHIMA SIMA ++ /xe2/xb3/xab COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI ++ /xe2/xb3/xac COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI ++ /xe2/xb3/xad COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA ++ /xe2/xb3/xae COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA ++ /xe2/xb3/xaf COPTIC COMBINING NI ABOVE ++ /xe2/xb3/xb0 COPTIC COMBINING SPIRITUS ASPER ++ /xe2/xb3/xb1 COPTIC COMBINING SPIRITUS LENIS + /xe2/xb3/xb9 COPTIC OLD NUBIAN FULL STOP + /xe2/xb3/xba COPTIC OLD NUBIAN DIRECT QUESTION MARK + /xe2/xb3/xbb COPTIC OLD NUBIAN INDIRECT QUESTION MARK +@@ -9498,6 +10081,8 @@ CHARMAP + /xe2/xb5/xa4 TIFINAGH LETTER TAWELLEMET YAZ + /xe2/xb5/xa5 TIFINAGH LETTER YAZZ + /xe2/xb5/xaf TIFINAGH MODIFIER LETTER LABIALIZATION MARK ++ /xe2/xb5/xb0 TIFINAGH SEPARATOR MARK ++ /xe2/xb5/xbf TIFINAGH CONSONANT JOINER + /xe2/xb6/x80 ETHIOPIC SYLLABLE LOA + /xe2/xb6/x81 ETHIOPIC SYLLABLE MOA + /xe2/xb6/x82 ETHIOPIC SYLLABLE ROA +@@ -9658,6 +10243,7 @@ CHARMAP + /xe2/xb8/xae REVERSED QUESTION MARK + /xe2/xb8/xaf VERTICAL TILDE + /xe2/xb8/xb0 RING POINT ++ /xe2/xb8/xb1 WORD SEPARATOR MIDDLE DOT + /xe2/xba/x80 CJK RADICAL REPEAT + /xe2/xba/x81 CJK RADICAL CLIFF + /xe2/xba/x82 CJK RADICAL SECOND ONE +@@ -10427,6 +11013,9 @@ CHARMAP + /xe3/x86/xb5 BOPOMOFO FINAL LETTER T + /xe3/x86/xb6 BOPOMOFO FINAL LETTER K + /xe3/x86/xb7 BOPOMOFO FINAL LETTER H ++ /xe3/x86/xb8 BOPOMOFO LETTER GH ++ /xe3/x86/xb9 BOPOMOFO LETTER LH ++ /xe3/x86/xba BOPOMOFO LETTER ZY + /xe3/x87/x80 CJK STROKE T + /xe3/x87/x81 CJK STROKE WG + /xe3/x87/x82 CJK STROKE XG +@@ -10546,6 +11135,18 @@ CHARMAP + /xe3/x89/x81 PARENTHESIZED IDEOGRAPH REST + /xe3/x89/x82 PARENTHESIZED IDEOGRAPH SELF + /xe3/x89/x83 PARENTHESIZED IDEOGRAPH REACH ++ /xe3/x89/x84 CIRCLED IDEOGRAPH QUESTION ++ /xe3/x89/x85 CIRCLED IDEOGRAPH KINDERGARTEN ++ /xe3/x89/x86 CIRCLED IDEOGRAPH SCHOOL ++ /xe3/x89/x87 CIRCLED IDEOGRAPH KOTO ++ /xe3/x89/x88 CIRCLED NUMBER TEN ON BLACK SQUARE ++ /xe3/x89/x89 CIRCLED NUMBER TWENTY ON BLACK SQUARE ++ /xe3/x89/x8a CIRCLED NUMBER THIRTY ON BLACK SQUARE ++ /xe3/x89/x8b CIRCLED NUMBER FORTY ON BLACK SQUARE ++ /xe3/x89/x8c CIRCLED NUMBER FIFTY ON BLACK SQUARE ++ /xe3/x89/x8d CIRCLED NUMBER SIXTY ON BLACK SQUARE ++ /xe3/x89/x8e CIRCLED NUMBER SEVENTY ON BLACK SQUARE ++ /xe3/x89/x8f CIRCLED NUMBER EIGHTY ON BLACK SQUARE + /xe3/x89/x90 PARTNERSHIP SIGN + /xe3/x89/x91 CIRCLED NUMBER TWENTY ONE + /xe3/x89/x92 CIRCLED NUMBER TWENTY TWO +@@ -12691,6 +13292,54 @@ CHARMAP + /xea/x93/x84 YI RADICAL ZZIET + /xea/x93/x85 YI RADICAL NBIE + /xea/x93/x86 YI RADICAL KE ++ /xea/x93/x90 LISU LETTER BA ++ /xea/x93/x91 LISU LETTER PA ++ /xea/x93/x92 LISU LETTER PHA ++ /xea/x93/x93 LISU LETTER DA ++ /xea/x93/x94 LISU LETTER TA ++ /xea/x93/x95 LISU LETTER THA ++ /xea/x93/x96 LISU LETTER GA ++ /xea/x93/x97 LISU LETTER KA ++ /xea/x93/x98 LISU LETTER KHA ++ /xea/x93/x99 LISU LETTER JA ++ /xea/x93/x9a LISU LETTER CA ++ /xea/x93/x9b LISU LETTER CHA ++ /xea/x93/x9c LISU LETTER DZA ++ /xea/x93/x9d LISU LETTER TSA ++ /xea/x93/x9e LISU LETTER TSHA ++ /xea/x93/x9f LISU LETTER MA ++ /xea/x93/xa0 LISU LETTER NA ++ /xea/x93/xa1 LISU LETTER LA ++ /xea/x93/xa2 LISU LETTER SA ++ /xea/x93/xa3 LISU LETTER ZHA ++ /xea/x93/xa4 LISU LETTER ZA ++ /xea/x93/xa5 LISU LETTER NGA ++ /xea/x93/xa6 LISU LETTER HA ++ /xea/x93/xa7 LISU LETTER XA ++ /xea/x93/xa8 LISU LETTER HHA ++ /xea/x93/xa9 LISU LETTER FA ++ /xea/x93/xaa LISU LETTER WA ++ /xea/x93/xab LISU LETTER SHA ++ /xea/x93/xac LISU LETTER YA ++ /xea/x93/xad LISU LETTER GHA ++ /xea/x93/xae LISU LETTER A ++ /xea/x93/xaf LISU LETTER AE ++ /xea/x93/xb0 LISU LETTER E ++ /xea/x93/xb1 LISU LETTER EU ++ /xea/x93/xb2 LISU LETTER I ++ /xea/x93/xb3 LISU LETTER O ++ /xea/x93/xb4 LISU LETTER U ++ /xea/x93/xb5 LISU LETTER UE ++ /xea/x93/xb6 LISU LETTER UH ++ /xea/x93/xb7 LISU LETTER OE ++ /xea/x93/xb8 LISU LETTER TONE MYA TI ++ /xea/x93/xb9 LISU LETTER TONE NA PO ++ /xea/x93/xba LISU LETTER TONE MYA CYA ++ /xea/x93/xbb LISU LETTER TONE MYA BO ++ /xea/x93/xbc LISU LETTER TONE MYA NA ++ /xea/x93/xbd LISU LETTER TONE MYA JEU ++ /xea/x93/xbe LISU PUNCTUATION COMMA ++ /xea/x93/xbf LISU PUNCTUATION FULL STOP + /xea/x94/x80 VAI SYLLABLE EE + /xea/x94/x81 VAI SYLLABLE EEN + /xea/x94/x82 VAI SYLLABLE HEE +@@ -13023,6 +13672,8 @@ CHARMAP + /xea/x99/x9d CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS + /xea/x99/x9e CYRILLIC CAPITAL LETTER YN + /xea/x99/x9f CYRILLIC SMALL LETTER YN ++ /xea/x99/xa0 CYRILLIC CAPITAL LETTER REVERSED TSE ++ /xea/x99/xa1 CYRILLIC SMALL LETTER REVERSED TSE + /xea/x99/xa2 CYRILLIC CAPITAL LETTER SOFT DE + /xea/x99/xa3 CYRILLIC SMALL LETTER SOFT DE + /xea/x99/xa4 CYRILLIC CAPITAL LETTER SOFT EL +@@ -13069,6 +13720,94 @@ CHARMAP + /xea/x9a/x95 CYRILLIC SMALL LETTER HWE + /xea/x9a/x96 CYRILLIC CAPITAL LETTER SHWE + /xea/x9a/x97 CYRILLIC SMALL LETTER SHWE ++ /xea/x9a/xa0 BAMUM LETTER A ++ /xea/x9a/xa1 BAMUM LETTER KA ++ /xea/x9a/xa2 BAMUM LETTER U ++ /xea/x9a/xa3 BAMUM LETTER KU ++ /xea/x9a/xa4 BAMUM LETTER EE ++ /xea/x9a/xa5 BAMUM LETTER REE ++ /xea/x9a/xa6 BAMUM LETTER TAE ++ /xea/x9a/xa7 BAMUM LETTER O ++ /xea/x9a/xa8 BAMUM LETTER NYI ++ /xea/x9a/xa9 BAMUM LETTER I ++ /xea/x9a/xaa BAMUM LETTER LA ++ /xea/x9a/xab BAMUM LETTER PA ++ /xea/x9a/xac BAMUM LETTER RII ++ /xea/x9a/xad BAMUM LETTER RIEE ++ /xea/x9a/xae BAMUM LETTER LEEEE ++ /xea/x9a/xaf BAMUM LETTER MEEEE ++ /xea/x9a/xb0 BAMUM LETTER TAA ++ /xea/x9a/xb1 BAMUM LETTER NDAA ++ /xea/x9a/xb2 BAMUM LETTER NJAEM ++ /xea/x9a/xb3 BAMUM LETTER M ++ /xea/x9a/xb4 BAMUM LETTER SUU ++ /xea/x9a/xb5 BAMUM LETTER MU ++ /xea/x9a/xb6 BAMUM LETTER SHII ++ /xea/x9a/xb7 BAMUM LETTER SI ++ /xea/x9a/xb8 BAMUM LETTER SHEUX ++ /xea/x9a/xb9 BAMUM LETTER SEUX ++ /xea/x9a/xba BAMUM LETTER KYEE ++ /xea/x9a/xbb BAMUM LETTER KET ++ /xea/x9a/xbc BAMUM LETTER NUAE ++ /xea/x9a/xbd BAMUM LETTER NU ++ /xea/x9a/xbe BAMUM LETTER NJUAE ++ /xea/x9a/xbf BAMUM LETTER YOQ ++ /xea/x9b/x80 BAMUM LETTER SHU ++ /xea/x9b/x81 BAMUM LETTER YUQ ++ /xea/x9b/x82 BAMUM LETTER YA ++ /xea/x9b/x83 BAMUM LETTER NSHA ++ /xea/x9b/x84 BAMUM LETTER KEUX ++ /xea/x9b/x85 BAMUM LETTER PEUX ++ /xea/x9b/x86 BAMUM LETTER NJEE ++ /xea/x9b/x87 BAMUM LETTER NTEE ++ /xea/x9b/x88 BAMUM LETTER PUE ++ /xea/x9b/x89 BAMUM LETTER WUE ++ /xea/x9b/x8a BAMUM LETTER PEE ++ /xea/x9b/x8b BAMUM LETTER FEE ++ /xea/x9b/x8c BAMUM LETTER RU ++ /xea/x9b/x8d BAMUM LETTER LU ++ /xea/x9b/x8e BAMUM LETTER MI ++ /xea/x9b/x8f BAMUM LETTER NI ++ /xea/x9b/x90 BAMUM LETTER REUX ++ /xea/x9b/x91 BAMUM LETTER RAE ++ /xea/x9b/x92 BAMUM LETTER KEN ++ /xea/x9b/x93 BAMUM LETTER NGKWAEN ++ /xea/x9b/x94 BAMUM LETTER NGGA ++ /xea/x9b/x95 BAMUM LETTER NGA ++ /xea/x9b/x96 BAMUM LETTER SHO ++ /xea/x9b/x97 BAMUM LETTER PUAE ++ /xea/x9b/x98 BAMUM LETTER FU ++ /xea/x9b/x99 BAMUM LETTER FOM ++ /xea/x9b/x9a BAMUM LETTER WA ++ /xea/x9b/x9b BAMUM LETTER NA ++ /xea/x9b/x9c BAMUM LETTER LI ++ /xea/x9b/x9d BAMUM LETTER PI ++ /xea/x9b/x9e BAMUM LETTER LOQ ++ /xea/x9b/x9f BAMUM LETTER KO ++ /xea/x9b/xa0 BAMUM LETTER MBEN ++ /xea/x9b/xa1 BAMUM LETTER REN ++ /xea/x9b/xa2 BAMUM LETTER MEN ++ /xea/x9b/xa3 BAMUM LETTER MA ++ /xea/x9b/xa4 BAMUM LETTER TI ++ /xea/x9b/xa5 BAMUM LETTER KI ++ /xea/x9b/xa6 BAMUM LETTER MO ++ /xea/x9b/xa7 BAMUM LETTER MBAA ++ /xea/x9b/xa8 BAMUM LETTER TET ++ /xea/x9b/xa9 BAMUM LETTER KPA ++ /xea/x9b/xaa BAMUM LETTER TEN ++ /xea/x9b/xab BAMUM LETTER NTUU ++ /xea/x9b/xac BAMUM LETTER SAMBA ++ /xea/x9b/xad BAMUM LETTER FAAMAE ++ /xea/x9b/xae BAMUM LETTER KOVUU ++ /xea/x9b/xaf BAMUM LETTER KOGHOM ++ /xea/x9b/xb0 BAMUM COMBINING MARK KOQNDON ++ /xea/x9b/xb1 BAMUM COMBINING MARK TUKWENTIS ++ /xea/x9b/xb2 BAMUM NJAEMLI ++ /xea/x9b/xb3 BAMUM FULL STOP ++ /xea/x9b/xb4 BAMUM COLON ++ /xea/x9b/xb5 BAMUM COMMA ++ /xea/x9b/xb6 BAMUM SEMICOLON ++ /xea/x9b/xb7 BAMUM QUESTION MARK + /xea/x9c/x80 MODIFIER LETTER CHINESE TONE YIN PING + /xea/x9c/x81 MODIFIER LETTER CHINESE TONE YANG PING + /xea/x9c/x82 MODIFIER LETTER CHINESE TONE YIN SHANG +@@ -13210,6 +13949,21 @@ CHARMAP + /xea/x9e/x8a MODIFIER LETTER SHORT EQUALS SIGN + /xea/x9e/x8b LATIN CAPITAL LETTER SALTILLO + /xea/x9e/x8c LATIN SMALL LETTER SALTILLO ++ /xea/x9e/x8d LATIN CAPITAL LETTER TURNED H ++ /xea/x9e/x8e LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT ++ /xea/x9e/x90 LATIN CAPITAL LETTER N WITH DESCENDER ++ /xea/x9e/x91 LATIN SMALL LETTER N WITH DESCENDER ++ /xea/x9e/xa0 LATIN CAPITAL LETTER G WITH OBLIQUE STROKE ++ /xea/x9e/xa1 LATIN SMALL LETTER G WITH OBLIQUE STROKE ++ /xea/x9e/xa2 LATIN CAPITAL LETTER K WITH OBLIQUE STROKE ++ /xea/x9e/xa3 LATIN SMALL LETTER K WITH OBLIQUE STROKE ++ /xea/x9e/xa4 LATIN CAPITAL LETTER N WITH OBLIQUE STROKE ++ /xea/x9e/xa5 LATIN SMALL LETTER N WITH OBLIQUE STROKE ++ /xea/x9e/xa6 LATIN CAPITAL LETTER R WITH OBLIQUE STROKE ++ /xea/x9e/xa7 LATIN SMALL LETTER R WITH OBLIQUE STROKE ++ /xea/x9e/xa8 LATIN CAPITAL LETTER S WITH OBLIQUE STROKE ++ /xea/x9e/xa9 LATIN SMALL LETTER S WITH OBLIQUE STROKE ++ /xea/x9f/xba LATIN LETTER SMALL CAPITAL TURNED M + /xea/x9f/xbb LATIN EPIGRAPHIC LETTER REVERSED F + /xea/x9f/xbc LATIN EPIGRAPHIC LETTER REVERSED P + /xea/x9f/xbd LATIN EPIGRAPHIC LETTER INVERTED M +@@ -13259,6 +14013,16 @@ CHARMAP + /xea/xa0/xa9 SYLOTI NAGRI POETRY MARK-2 + /xea/xa0/xaa SYLOTI NAGRI POETRY MARK-3 + /xea/xa0/xab SYLOTI NAGRI POETRY MARK-4 ++ /xea/xa0/xb0 NORTH INDIC FRACTION ONE QUARTER ++ /xea/xa0/xb1 NORTH INDIC FRACTION ONE HALF ++ /xea/xa0/xb2 NORTH INDIC FRACTION THREE QUARTERS ++ /xea/xa0/xb3 NORTH INDIC FRACTION ONE SIXTEENTH ++ /xea/xa0/xb4 NORTH INDIC FRACTION ONE EIGHTH ++ /xea/xa0/xb5 NORTH INDIC FRACTION THREE SIXTEENTHS ++ /xea/xa0/xb6 NORTH INDIC QUARTER MARK ++ /xea/xa0/xb7 NORTH INDIC PLACEHOLDER MARK ++ /xea/xa0/xb8 NORTH INDIC RUPEE MARK ++ /xea/xa0/xb9 NORTH INDIC QUANTITY MARK + /xea/xa1/x80 PHAGS-PA LETTER KA + /xea/xa1/x81 PHAGS-PA LETTER KHA + /xea/xa1/x82 PHAGS-PA LETTER GA +@@ -13396,6 +14160,34 @@ CHARMAP + /xea/xa3/x97 SAURASHTRA DIGIT SEVEN + /xea/xa3/x98 SAURASHTRA DIGIT EIGHT + /xea/xa3/x99 SAURASHTRA DIGIT NINE ++ /xea/xa3/xa0 COMBINING DEVANAGARI DIGIT ZERO ++ /xea/xa3/xa1 COMBINING DEVANAGARI DIGIT ONE ++ /xea/xa3/xa2 COMBINING DEVANAGARI DIGIT TWO ++ /xea/xa3/xa3 COMBINING DEVANAGARI DIGIT THREE ++ /xea/xa3/xa4 COMBINING DEVANAGARI DIGIT FOUR ++ /xea/xa3/xa5 COMBINING DEVANAGARI DIGIT FIVE ++ /xea/xa3/xa6 COMBINING DEVANAGARI DIGIT SIX ++ /xea/xa3/xa7 COMBINING DEVANAGARI DIGIT SEVEN ++ /xea/xa3/xa8 COMBINING DEVANAGARI DIGIT EIGHT ++ /xea/xa3/xa9 COMBINING DEVANAGARI DIGIT NINE ++ /xea/xa3/xaa COMBINING DEVANAGARI LETTER A ++ /xea/xa3/xab COMBINING DEVANAGARI LETTER U ++ /xea/xa3/xac COMBINING DEVANAGARI LETTER KA ++ /xea/xa3/xad COMBINING DEVANAGARI LETTER NA ++ /xea/xa3/xae COMBINING DEVANAGARI LETTER PA ++ /xea/xa3/xaf COMBINING DEVANAGARI LETTER RA ++ /xea/xa3/xb0 COMBINING DEVANAGARI LETTER VI ++ /xea/xa3/xb1 COMBINING DEVANAGARI SIGN AVAGRAHA ++ /xea/xa3/xb2 DEVANAGARI SIGN SPACING CANDRABINDU ++ /xea/xa3/xb3 DEVANAGARI SIGN CANDRABINDU VIRAMA ++ /xea/xa3/xb4 DEVANAGARI SIGN DOUBLE CANDRABINDU VIRAMA ++ /xea/xa3/xb5 DEVANAGARI SIGN CANDRABINDU TWO ++ /xea/xa3/xb6 DEVANAGARI SIGN CANDRABINDU THREE ++ /xea/xa3/xb7 DEVANAGARI SIGN CANDRABINDU AVAGRAHA ++ /xea/xa3/xb8 DEVANAGARI SIGN PUSHPIKA ++ /xea/xa3/xb9 DEVANAGARI GAP FILLER ++ /xea/xa3/xba DEVANAGARI CARET ++ /xea/xa3/xbb DEVANAGARI HEADSTROKE + /xea/xa4/x80 KAYAH LI DIGIT ZERO + /xea/xa4/x81 KAYAH LI DIGIT ONE + /xea/xa4/x82 KAYAH LI DIGIT TWO +@@ -13481,6 +14273,126 @@ CHARMAP + /xea/xa5/x92 REJANG CONSONANT SIGN H + /xea/xa5/x93 REJANG VIRAMA + /xea/xa5/x9f REJANG SECTION MARK ++ /xea/xa5/xa0 HANGUL CHOSEONG TIKEUT-MIEUM ++ /xea/xa5/xa1 HANGUL CHOSEONG TIKEUT-PIEUP ++ /xea/xa5/xa2 HANGUL CHOSEONG TIKEUT-SIOS ++ /xea/xa5/xa3 HANGUL CHOSEONG TIKEUT-CIEUC ++ /xea/xa5/xa4 HANGUL CHOSEONG RIEUL-KIYEOK ++ /xea/xa5/xa5 HANGUL CHOSEONG RIEUL-SSANGKIYEOK ++ /xea/xa5/xa6 HANGUL CHOSEONG RIEUL-TIKEUT ++ /xea/xa5/xa7 HANGUL CHOSEONG RIEUL-SSANGTIKEUT ++ /xea/xa5/xa8 HANGUL CHOSEONG RIEUL-MIEUM ++ /xea/xa5/xa9 HANGUL CHOSEONG RIEUL-PIEUP ++ /xea/xa5/xaa HANGUL CHOSEONG RIEUL-SSANGPIEUP ++ /xea/xa5/xab HANGUL CHOSEONG RIEUL-KAPYEOUNPIEUP ++ /xea/xa5/xac HANGUL CHOSEONG RIEUL-SIOS ++ /xea/xa5/xad HANGUL CHOSEONG RIEUL-CIEUC ++ /xea/xa5/xae HANGUL CHOSEONG RIEUL-KHIEUKH ++ /xea/xa5/xaf HANGUL CHOSEONG MIEUM-KIYEOK ++ /xea/xa5/xb0 HANGUL CHOSEONG MIEUM-TIKEUT ++ /xea/xa5/xb1 HANGUL CHOSEONG MIEUM-SIOS ++ /xea/xa5/xb2 HANGUL CHOSEONG PIEUP-SIOS-THIEUTH ++ /xea/xa5/xb3 HANGUL CHOSEONG PIEUP-KHIEUKH ++ /xea/xa5/xb4 HANGUL CHOSEONG PIEUP-HIEUH ++ /xea/xa5/xb5 HANGUL CHOSEONG SSANGSIOS-PIEUP ++ /xea/xa5/xb6 HANGUL CHOSEONG IEUNG-RIEUL ++ /xea/xa5/xb7 HANGUL CHOSEONG IEUNG-HIEUH ++ /xea/xa5/xb8 HANGUL CHOSEONG SSANGCIEUC-HIEUH ++ /xea/xa5/xb9 HANGUL CHOSEONG SSANGTHIEUTH ++ /xea/xa5/xba HANGUL CHOSEONG PHIEUPH-HIEUH ++ /xea/xa5/xbb HANGUL CHOSEONG HIEUH-SIOS ++ /xea/xa5/xbc HANGUL CHOSEONG SSANGYEORINHIEUH ++ /xea/xa6/x80 JAVANESE SIGN PANYANGGA ++ /xea/xa6/x81 JAVANESE SIGN CECAK ++ /xea/xa6/x82 JAVANESE SIGN LAYAR ++ /xea/xa6/x83 JAVANESE SIGN WIGNYAN ++ /xea/xa6/x84 JAVANESE LETTER A ++ /xea/xa6/x85 JAVANESE LETTER I KAWI ++ /xea/xa6/x86 JAVANESE LETTER I ++ /xea/xa6/x87 JAVANESE LETTER II ++ /xea/xa6/x88 JAVANESE LETTER U ++ /xea/xa6/x89 JAVANESE LETTER PA CEREK ++ /xea/xa6/x8a JAVANESE LETTER NGA LELET ++ /xea/xa6/x8b JAVANESE LETTER NGA LELET RASWADI ++ /xea/xa6/x8c JAVANESE LETTER E ++ /xea/xa6/x8d JAVANESE LETTER AI ++ /xea/xa6/x8e JAVANESE LETTER O ++ /xea/xa6/x8f JAVANESE LETTER KA ++ /xea/xa6/x90 JAVANESE LETTER KA SASAK ++ /xea/xa6/x91 JAVANESE LETTER KA MURDA ++ /xea/xa6/x92 JAVANESE LETTER GA ++ /xea/xa6/x93 JAVANESE LETTER GA MURDA ++ /xea/xa6/x94 JAVANESE LETTER NGA ++ /xea/xa6/x95 JAVANESE LETTER CA ++ /xea/xa6/x96 JAVANESE LETTER CA MURDA ++ /xea/xa6/x97 JAVANESE LETTER JA ++ /xea/xa6/x98 JAVANESE LETTER NYA MURDA ++ /xea/xa6/x99 JAVANESE LETTER JA MAHAPRANA ++ /xea/xa6/x9a JAVANESE LETTER NYA ++ /xea/xa6/x9b JAVANESE LETTER TTA ++ /xea/xa6/x9c JAVANESE LETTER TTA MAHAPRANA ++ /xea/xa6/x9d JAVANESE LETTER DDA ++ /xea/xa6/x9e JAVANESE LETTER DDA MAHAPRANA ++ /xea/xa6/x9f JAVANESE LETTER NA MURDA ++ /xea/xa6/xa0 JAVANESE LETTER TA ++ /xea/xa6/xa1 JAVANESE LETTER TA MURDA ++ /xea/xa6/xa2 JAVANESE LETTER DA ++ /xea/xa6/xa3 JAVANESE LETTER DA MAHAPRANA ++ /xea/xa6/xa4 JAVANESE LETTER NA ++ /xea/xa6/xa5 JAVANESE LETTER PA ++ /xea/xa6/xa6 JAVANESE LETTER PA MURDA ++ /xea/xa6/xa7 JAVANESE LETTER BA ++ /xea/xa6/xa8 JAVANESE LETTER BA MURDA ++ /xea/xa6/xa9 JAVANESE LETTER MA ++ /xea/xa6/xaa JAVANESE LETTER YA ++ /xea/xa6/xab JAVANESE LETTER RA ++ /xea/xa6/xac JAVANESE LETTER RA AGUNG ++ /xea/xa6/xad JAVANESE LETTER LA ++ /xea/xa6/xae JAVANESE LETTER WA ++ /xea/xa6/xaf JAVANESE LETTER SA MURDA ++ /xea/xa6/xb0 JAVANESE LETTER SA MAHAPRANA ++ /xea/xa6/xb1 JAVANESE LETTER SA ++ /xea/xa6/xb2 JAVANESE LETTER HA ++ /xea/xa6/xb3 JAVANESE SIGN CECAK TELU ++ /xea/xa6/xb4 JAVANESE VOWEL SIGN TARUNG ++ /xea/xa6/xb5 JAVANESE VOWEL SIGN TOLONG ++ /xea/xa6/xb6 JAVANESE VOWEL SIGN WULU ++ /xea/xa6/xb7 JAVANESE VOWEL SIGN WULU MELIK ++ /xea/xa6/xb8 JAVANESE VOWEL SIGN SUKU ++ /xea/xa6/xb9 JAVANESE VOWEL SIGN SUKU MENDUT ++ /xea/xa6/xba JAVANESE VOWEL SIGN TALING ++ /xea/xa6/xbb JAVANESE VOWEL SIGN DIRGA MURE ++ /xea/xa6/xbc JAVANESE VOWEL SIGN PEPET ++ /xea/xa6/xbd JAVANESE CONSONANT SIGN KERET ++ /xea/xa6/xbe JAVANESE CONSONANT SIGN PENGKAL ++ /xea/xa6/xbf JAVANESE CONSONANT SIGN CAKRA ++ /xea/xa7/x80 JAVANESE PANGKON ++ /xea/xa7/x81 JAVANESE LEFT RERENGGAN ++ /xea/xa7/x82 JAVANESE RIGHT RERENGGAN ++ /xea/xa7/x83 JAVANESE PADA ANDAP ++ /xea/xa7/x84 JAVANESE PADA MADYA ++ /xea/xa7/x85 JAVANESE PADA LUHUR ++ /xea/xa7/x86 JAVANESE PADA WINDU ++ /xea/xa7/x87 JAVANESE PADA PANGKAT ++ /xea/xa7/x88 JAVANESE PADA LINGSA ++ /xea/xa7/x89 JAVANESE PADA LUNGSI ++ /xea/xa7/x8a JAVANESE PADA ADEG ++ /xea/xa7/x8b JAVANESE PADA ADEG ADEG ++ /xea/xa7/x8c JAVANESE PADA PISELEH ++ /xea/xa7/x8d JAVANESE TURNED PADA PISELEH ++ /xea/xa7/x8f JAVANESE PANGRANGKEP ++ /xea/xa7/x90 JAVANESE DIGIT ZERO ++ /xea/xa7/x91 JAVANESE DIGIT ONE ++ /xea/xa7/x92 JAVANESE DIGIT TWO ++ /xea/xa7/x93 JAVANESE DIGIT THREE ++ /xea/xa7/x94 JAVANESE DIGIT FOUR ++ /xea/xa7/x95 JAVANESE DIGIT FIVE ++ /xea/xa7/x96 JAVANESE DIGIT SIX ++ /xea/xa7/x97 JAVANESE DIGIT SEVEN ++ /xea/xa7/x98 JAVANESE DIGIT EIGHT ++ /xea/xa7/x99 JAVANESE DIGIT NINE ++ /xea/xa7/x9e JAVANESE PADA TIRTA TUMETES ++ /xea/xa7/x9f JAVANESE PADA ISEN-ISEN + /xea/xa8/x80 CHAM LETTER A + /xea/xa8/x81 CHAM LETTER I + /xea/xa8/x82 CHAM LETTER U +@@ -13564,6 +14476,194 @@ CHARMAP + /xea/xa9/x9d CHAM PUNCTUATION DANDA + /xea/xa9/x9e CHAM PUNCTUATION DOUBLE DANDA + /xea/xa9/x9f CHAM PUNCTUATION TRIPLE DANDA ++ /xea/xa9/xa0 MYANMAR LETTER KHAMTI GA ++ /xea/xa9/xa1 MYANMAR LETTER KHAMTI CA ++ /xea/xa9/xa2 MYANMAR LETTER KHAMTI CHA ++ /xea/xa9/xa3 MYANMAR LETTER KHAMTI JA ++ /xea/xa9/xa4 MYANMAR LETTER KHAMTI JHA ++ /xea/xa9/xa5 MYANMAR LETTER KHAMTI NYA ++ /xea/xa9/xa6 MYANMAR LETTER KHAMTI TTA ++ /xea/xa9/xa7 MYANMAR LETTER KHAMTI TTHA ++ /xea/xa9/xa8 MYANMAR LETTER KHAMTI DDA ++ /xea/xa9/xa9 MYANMAR LETTER KHAMTI DDHA ++ /xea/xa9/xaa MYANMAR LETTER KHAMTI DHA ++ /xea/xa9/xab MYANMAR LETTER KHAMTI NA ++ /xea/xa9/xac MYANMAR LETTER KHAMTI SA ++ /xea/xa9/xad MYANMAR LETTER KHAMTI HA ++ /xea/xa9/xae MYANMAR LETTER KHAMTI HHA ++ /xea/xa9/xaf MYANMAR LETTER KHAMTI FA ++ /xea/xa9/xb0 MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION ++ /xea/xa9/xb1 MYANMAR LETTER KHAMTI XA ++ /xea/xa9/xb2 MYANMAR LETTER KHAMTI ZA ++ /xea/xa9/xb3 MYANMAR LETTER KHAMTI RA ++ /xea/xa9/xb4 MYANMAR LOGOGRAM KHAMTI OAY ++ /xea/xa9/xb5 MYANMAR LOGOGRAM KHAMTI QN ++ /xea/xa9/xb6 MYANMAR LOGOGRAM KHAMTI HM ++ /xea/xa9/xb7 MYANMAR SYMBOL AITON EXCLAMATION ++ /xea/xa9/xb8 MYANMAR SYMBOL AITON ONE ++ /xea/xa9/xb9 MYANMAR SYMBOL AITON TWO ++ /xea/xa9/xba MYANMAR LETTER AITON RA ++ /xea/xa9/xbb MYANMAR SIGN PAO KAREN TONE ++ /xea/xaa/x80 TAI VIET LETTER LOW KO ++ /xea/xaa/x81 TAI VIET LETTER HIGH KO ++ /xea/xaa/x82 TAI VIET LETTER LOW KHO ++ /xea/xaa/x83 TAI VIET LETTER HIGH KHO ++ /xea/xaa/x84 TAI VIET LETTER LOW KHHO ++ /xea/xaa/x85 TAI VIET LETTER HIGH KHHO ++ /xea/xaa/x86 TAI VIET LETTER LOW GO ++ /xea/xaa/x87 TAI VIET LETTER HIGH GO ++ /xea/xaa/x88 TAI VIET LETTER LOW NGO ++ /xea/xaa/x89 TAI VIET LETTER HIGH NGO ++ /xea/xaa/x8a TAI VIET LETTER LOW CO ++ /xea/xaa/x8b TAI VIET LETTER HIGH CO ++ /xea/xaa/x8c TAI VIET LETTER LOW CHO ++ /xea/xaa/x8d TAI VIET LETTER HIGH CHO ++ /xea/xaa/x8e TAI VIET LETTER LOW SO ++ /xea/xaa/x8f TAI VIET LETTER HIGH SO ++ /xea/xaa/x90 TAI VIET LETTER LOW NYO ++ /xea/xaa/x91 TAI VIET LETTER HIGH NYO ++ /xea/xaa/x92 TAI VIET LETTER LOW DO ++ /xea/xaa/x93 TAI VIET LETTER HIGH DO ++ /xea/xaa/x94 TAI VIET LETTER LOW TO ++ /xea/xaa/x95 TAI VIET LETTER HIGH TO ++ /xea/xaa/x96 TAI VIET LETTER LOW THO ++ /xea/xaa/x97 TAI VIET LETTER HIGH THO ++ /xea/xaa/x98 TAI VIET LETTER LOW NO ++ /xea/xaa/x99 TAI VIET LETTER HIGH NO ++ /xea/xaa/x9a TAI VIET LETTER LOW BO ++ /xea/xaa/x9b TAI VIET LETTER HIGH BO ++ /xea/xaa/x9c TAI VIET LETTER LOW PO ++ /xea/xaa/x9d TAI VIET LETTER HIGH PO ++ /xea/xaa/x9e TAI VIET LETTER LOW PHO ++ /xea/xaa/x9f TAI VIET LETTER HIGH PHO ++ /xea/xaa/xa0 TAI VIET LETTER LOW FO ++ /xea/xaa/xa1 TAI VIET LETTER HIGH FO ++ /xea/xaa/xa2 TAI VIET LETTER LOW MO ++ /xea/xaa/xa3 TAI VIET LETTER HIGH MO ++ /xea/xaa/xa4 TAI VIET LETTER LOW YO ++ /xea/xaa/xa5 TAI VIET LETTER HIGH YO ++ /xea/xaa/xa6 TAI VIET LETTER LOW RO ++ /xea/xaa/xa7 TAI VIET LETTER HIGH RO ++ /xea/xaa/xa8 TAI VIET LETTER LOW LO ++ /xea/xaa/xa9 TAI VIET LETTER HIGH LO ++ /xea/xaa/xaa TAI VIET LETTER LOW VO ++ /xea/xaa/xab TAI VIET LETTER HIGH VO ++ /xea/xaa/xac TAI VIET LETTER LOW HO ++ /xea/xaa/xad TAI VIET LETTER HIGH HO ++ /xea/xaa/xae TAI VIET LETTER LOW O ++ /xea/xaa/xaf TAI VIET LETTER HIGH O ++ /xea/xaa/xb0 TAI VIET MAI KANG ++ /xea/xaa/xb1 TAI VIET VOWEL AA ++ /xea/xaa/xb2 TAI VIET VOWEL I ++ /xea/xaa/xb3 TAI VIET VOWEL UE ++ /xea/xaa/xb4 TAI VIET VOWEL U ++ /xea/xaa/xb5 TAI VIET VOWEL E ++ /xea/xaa/xb6 TAI VIET VOWEL O ++ /xea/xaa/xb7 TAI VIET MAI KHIT ++ /xea/xaa/xb8 TAI VIET VOWEL IA ++ /xea/xaa/xb9 TAI VIET VOWEL UEA ++ /xea/xaa/xba TAI VIET VOWEL UA ++ /xea/xaa/xbb TAI VIET VOWEL AUE ++ /xea/xaa/xbc TAI VIET VOWEL AY ++ /xea/xaa/xbd TAI VIET VOWEL AN ++ /xea/xaa/xbe TAI VIET VOWEL AM ++ /xea/xaa/xbf TAI VIET TONE MAI EK ++ /xea/xab/x80 TAI VIET TONE MAI NUENG ++ /xea/xab/x81 TAI VIET TONE MAI THO ++ /xea/xab/x82 TAI VIET TONE MAI SONG ++ /xea/xab/x9b TAI VIET SYMBOL KON ++ /xea/xab/x9c TAI VIET SYMBOL NUENG ++ /xea/xab/x9d TAI VIET SYMBOL SAM ++ /xea/xab/x9e TAI VIET SYMBOL HO HOI ++ /xea/xab/x9f TAI VIET SYMBOL KOI KOI ++ /xea/xac/x81 ETHIOPIC SYLLABLE TTHU ++ /xea/xac/x82 ETHIOPIC SYLLABLE TTHI ++ /xea/xac/x83 ETHIOPIC SYLLABLE TTHAA ++ /xea/xac/x84 ETHIOPIC SYLLABLE TTHEE ++ /xea/xac/x85 ETHIOPIC SYLLABLE TTHE ++ /xea/xac/x86 ETHIOPIC SYLLABLE TTHO ++ /xea/xac/x89 ETHIOPIC SYLLABLE DDHU ++ /xea/xac/x8a ETHIOPIC SYLLABLE DDHI ++ /xea/xac/x8b ETHIOPIC SYLLABLE DDHAA ++ /xea/xac/x8c ETHIOPIC SYLLABLE DDHEE ++ /xea/xac/x8d ETHIOPIC SYLLABLE DDHE ++ /xea/xac/x8e ETHIOPIC SYLLABLE DDHO ++ /xea/xac/x91 ETHIOPIC SYLLABLE DZU ++ /xea/xac/x92 ETHIOPIC SYLLABLE DZI ++ /xea/xac/x93 ETHIOPIC SYLLABLE DZAA ++ /xea/xac/x94 ETHIOPIC SYLLABLE DZEE ++ /xea/xac/x95 ETHIOPIC SYLLABLE DZE ++ /xea/xac/x96 ETHIOPIC SYLLABLE DZO ++ /xea/xac/xa0 ETHIOPIC SYLLABLE CCHHA ++ /xea/xac/xa1 ETHIOPIC SYLLABLE CCHHU ++ /xea/xac/xa2 ETHIOPIC SYLLABLE CCHHI ++ /xea/xac/xa3 ETHIOPIC SYLLABLE CCHHAA ++ /xea/xac/xa4 ETHIOPIC SYLLABLE CCHHEE ++ /xea/xac/xa5 ETHIOPIC SYLLABLE CCHHE ++ /xea/xac/xa6 ETHIOPIC SYLLABLE CCHHO ++ /xea/xac/xa8 ETHIOPIC SYLLABLE BBA ++ /xea/xac/xa9 ETHIOPIC SYLLABLE BBU ++ /xea/xac/xaa ETHIOPIC SYLLABLE BBI ++ /xea/xac/xab ETHIOPIC SYLLABLE BBAA ++ /xea/xac/xac ETHIOPIC SYLLABLE BBEE ++ /xea/xac/xad ETHIOPIC SYLLABLE BBE ++ /xea/xac/xae ETHIOPIC SYLLABLE BBO ++ /xea/xaf/x80 MEETEI MAYEK LETTER KOK ++ /xea/xaf/x81 MEETEI MAYEK LETTER SAM ++ /xea/xaf/x82 MEETEI MAYEK LETTER LAI ++ /xea/xaf/x83 MEETEI MAYEK LETTER MIT ++ /xea/xaf/x84 MEETEI MAYEK LETTER PA ++ /xea/xaf/x85 MEETEI MAYEK LETTER NA ++ /xea/xaf/x86 MEETEI MAYEK LETTER CHIL ++ /xea/xaf/x87 MEETEI MAYEK LETTER TIL ++ /xea/xaf/x88 MEETEI MAYEK LETTER KHOU ++ /xea/xaf/x89 MEETEI MAYEK LETTER NGOU ++ /xea/xaf/x8a MEETEI MAYEK LETTER THOU ++ /xea/xaf/x8b MEETEI MAYEK LETTER WAI ++ /xea/xaf/x8c MEETEI MAYEK LETTER YANG ++ /xea/xaf/x8d MEETEI MAYEK LETTER HUK ++ /xea/xaf/x8e MEETEI MAYEK LETTER UN ++ /xea/xaf/x8f MEETEI MAYEK LETTER I ++ /xea/xaf/x90 MEETEI MAYEK LETTER PHAM ++ /xea/xaf/x91 MEETEI MAYEK LETTER ATIYA ++ /xea/xaf/x92 MEETEI MAYEK LETTER GOK ++ /xea/xaf/x93 MEETEI MAYEK LETTER JHAM ++ /xea/xaf/x94 MEETEI MAYEK LETTER RAI ++ /xea/xaf/x95 MEETEI MAYEK LETTER BA ++ /xea/xaf/x96 MEETEI MAYEK LETTER JIL ++ /xea/xaf/x97 MEETEI MAYEK LETTER DIL ++ /xea/xaf/x98 MEETEI MAYEK LETTER GHOU ++ /xea/xaf/x99 MEETEI MAYEK LETTER DHOU ++ /xea/xaf/x9a MEETEI MAYEK LETTER BHAM ++ /xea/xaf/x9b MEETEI MAYEK LETTER KOK LONSUM ++ /xea/xaf/x9c MEETEI MAYEK LETTER LAI LONSUM ++ /xea/xaf/x9d MEETEI MAYEK LETTER MIT LONSUM ++ /xea/xaf/x9e MEETEI MAYEK LETTER PA LONSUM ++ /xea/xaf/x9f MEETEI MAYEK LETTER NA LONSUM ++ /xea/xaf/xa0 MEETEI MAYEK LETTER TIL LONSUM ++ /xea/xaf/xa1 MEETEI MAYEK LETTER NGOU LONSUM ++ /xea/xaf/xa2 MEETEI MAYEK LETTER I LONSUM ++ /xea/xaf/xa3 MEETEI MAYEK VOWEL SIGN ONAP ++ /xea/xaf/xa4 MEETEI MAYEK VOWEL SIGN INAP ++ /xea/xaf/xa5 MEETEI MAYEK VOWEL SIGN ANAP ++ /xea/xaf/xa6 MEETEI MAYEK VOWEL SIGN YENAP ++ /xea/xaf/xa7 MEETEI MAYEK VOWEL SIGN SOUNAP ++ /xea/xaf/xa8 MEETEI MAYEK VOWEL SIGN UNAP ++ /xea/xaf/xa9 MEETEI MAYEK VOWEL SIGN CHEINAP ++ /xea/xaf/xaa MEETEI MAYEK VOWEL SIGN NUNG ++ /xea/xaf/xab MEETEI MAYEK CHEIKHEI ++ /xea/xaf/xac MEETEI MAYEK LUM IYEK ++ /xea/xaf/xad MEETEI MAYEK APUN IYEK ++ /xea/xaf/xb0 MEETEI MAYEK DIGIT ZERO ++ /xea/xaf/xb1 MEETEI MAYEK DIGIT ONE ++ /xea/xaf/xb2 MEETEI MAYEK DIGIT TWO ++ /xea/xaf/xb3 MEETEI MAYEK DIGIT THREE ++ /xea/xaf/xb4 MEETEI MAYEK DIGIT FOUR ++ /xea/xaf/xb5 MEETEI MAYEK DIGIT FIVE ++ /xea/xaf/xb6 MEETEI MAYEK DIGIT SIX ++ /xea/xaf/xb7 MEETEI MAYEK DIGIT SEVEN ++ /xea/xaf/xb8 MEETEI MAYEK DIGIT EIGHT ++ /xea/xaf/xb9 MEETEI MAYEK DIGIT NINE + /xea/xb0/x80 HANGUL SYLLABLE GA + /xea/xb0/x81 HANGUL SYLLABLE GAG + /xea/xb0/x82 HANGUL SYLLABLE GAGG +@@ -24736,6 +25836,78 @@ CHARMAP + /xed/x9e/xa1 HANGUL SYLLABLE HIT + /xed/x9e/xa2 HANGUL SYLLABLE HIP + /xed/x9e/xa3 HANGUL SYLLABLE HIH ++ /xed/x9e/xb0 HANGUL JUNGSEONG O-YEO ++ /xed/x9e/xb1 HANGUL JUNGSEONG O-O-I ++ /xed/x9e/xb2 HANGUL JUNGSEONG YO-A ++ /xed/x9e/xb3 HANGUL JUNGSEONG YO-AE ++ /xed/x9e/xb4 HANGUL JUNGSEONG YO-EO ++ /xed/x9e/xb5 HANGUL JUNGSEONG U-YEO ++ /xed/x9e/xb6 HANGUL JUNGSEONG U-I-I ++ /xed/x9e/xb7 HANGUL JUNGSEONG YU-AE ++ /xed/x9e/xb8 HANGUL JUNGSEONG YU-O ++ /xed/x9e/xb9 HANGUL JUNGSEONG EU-A ++ /xed/x9e/xba HANGUL JUNGSEONG EU-EO ++ /xed/x9e/xbb HANGUL JUNGSEONG EU-E ++ /xed/x9e/xbc HANGUL JUNGSEONG EU-O ++ /xed/x9e/xbd HANGUL JUNGSEONG I-YA-O ++ /xed/x9e/xbe HANGUL JUNGSEONG I-YAE ++ /xed/x9e/xbf HANGUL JUNGSEONG I-YEO ++ /xed/x9f/x80 HANGUL JUNGSEONG I-YE ++ /xed/x9f/x81 HANGUL JUNGSEONG I-O-I ++ /xed/x9f/x82 HANGUL JUNGSEONG I-YO ++ /xed/x9f/x83 HANGUL JUNGSEONG I-YU ++ /xed/x9f/x84 HANGUL JUNGSEONG I-I ++ /xed/x9f/x85 HANGUL JUNGSEONG ARAEA-A ++ /xed/x9f/x86 HANGUL JUNGSEONG ARAEA-E ++ /xed/x9f/x8b HANGUL JONGSEONG NIEUN-RIEUL ++ /xed/x9f/x8c HANGUL JONGSEONG NIEUN-CHIEUCH ++ /xed/x9f/x8d HANGUL JONGSEONG SSANGTIKEUT ++ /xed/x9f/x8e HANGUL JONGSEONG SSANGTIKEUT-PIEUP ++ /xed/x9f/x8f HANGUL JONGSEONG TIKEUT-PIEUP ++ /xed/x9f/x90 HANGUL JONGSEONG TIKEUT-SIOS ++ /xed/x9f/x91 HANGUL JONGSEONG TIKEUT-SIOS-KIYEOK ++ /xed/x9f/x92 HANGUL JONGSEONG TIKEUT-CIEUC ++ /xed/x9f/x93 HANGUL JONGSEONG TIKEUT-CHIEUCH ++ /xed/x9f/x94 HANGUL JONGSEONG TIKEUT-THIEUTH ++ /xed/x9f/x95 HANGUL JONGSEONG RIEUL-SSANGKIYEOK ++ /xed/x9f/x96 HANGUL JONGSEONG RIEUL-KIYEOK-HIEUH ++ /xed/x9f/x97 HANGUL JONGSEONG SSANGRIEUL-KHIEUKH ++ /xed/x9f/x98 HANGUL JONGSEONG RIEUL-MIEUM-HIEUH ++ /xed/x9f/x99 HANGUL JONGSEONG RIEUL-PIEUP-TIKEUT ++ /xed/x9f/x9a HANGUL JONGSEONG RIEUL-PIEUP-PHIEUPH ++ /xed/x9f/x9b HANGUL JONGSEONG RIEUL-YESIEUNG ++ /xed/x9f/x9c HANGUL JONGSEONG RIEUL-YEORINHIEUH-HIEUH ++ /xed/x9f/x9d HANGUL JONGSEONG KAPYEOUNRIEUL ++ /xed/x9f/x9e HANGUL JONGSEONG MIEUM-NIEUN ++ /xed/x9f/x9f HANGUL JONGSEONG MIEUM-SSANGNIEUN ++ /xed/x9f/xa0 HANGUL JONGSEONG SSANGMIEUM ++ /xed/x9f/xa1 HANGUL JONGSEONG MIEUM-PIEUP-SIOS ++ /xed/x9f/xa2 HANGUL JONGSEONG MIEUM-CIEUC ++ /xed/x9f/xa3 HANGUL JONGSEONG PIEUP-TIKEUT ++ /xed/x9f/xa4 HANGUL JONGSEONG PIEUP-RIEUL-PHIEUPH ++ /xed/x9f/xa5 HANGUL JONGSEONG PIEUP-MIEUM ++ /xed/x9f/xa6 HANGUL JONGSEONG SSANGPIEUP ++ /xed/x9f/xa7 HANGUL JONGSEONG PIEUP-SIOS-TIKEUT ++ /xed/x9f/xa8 HANGUL JONGSEONG PIEUP-CIEUC ++ /xed/x9f/xa9 HANGUL JONGSEONG PIEUP-CHIEUCH ++ /xed/x9f/xaa HANGUL JONGSEONG SIOS-MIEUM ++ /xed/x9f/xab HANGUL JONGSEONG SIOS-KAPYEOUNPIEUP ++ /xed/x9f/xac HANGUL JONGSEONG SSANGSIOS-KIYEOK ++ /xed/x9f/xad HANGUL JONGSEONG SSANGSIOS-TIKEUT ++ /xed/x9f/xae HANGUL JONGSEONG SIOS-PANSIOS ++ /xed/x9f/xaf HANGUL JONGSEONG SIOS-CIEUC ++ /xed/x9f/xb0 HANGUL JONGSEONG SIOS-CHIEUCH ++ /xed/x9f/xb1 HANGUL JONGSEONG SIOS-THIEUTH ++ /xed/x9f/xb2 HANGUL JONGSEONG SIOS-HIEUH ++ /xed/x9f/xb3 HANGUL JONGSEONG PANSIOS-PIEUP ++ /xed/x9f/xb4 HANGUL JONGSEONG PANSIOS-KAPYEOUNPIEUP ++ /xed/x9f/xb5 HANGUL JONGSEONG YESIEUNG-MIEUM ++ /xed/x9f/xb6 HANGUL JONGSEONG YESIEUNG-HIEUH ++ /xed/x9f/xb7 HANGUL JONGSEONG CIEUC-PIEUP ++ /xed/x9f/xb8 HANGUL JONGSEONG CIEUC-SSANGPIEUP ++ /xed/x9f/xb9 HANGUL JONGSEONG SSANGCIEUC ++ /xed/x9f/xba HANGUL JONGSEONG PHIEUPH-SIOS ++ /xed/x9f/xbb HANGUL JONGSEONG PHIEUPH-THIEUTH + % /xed/xa0/x80 + % /xed/xad/xbf + % /xed/xae/x80 +@@ -25203,6 +26375,9 @@ CHARMAP + /xef/xa9/xa8 CJK COMPATIBILITY IDEOGRAPH-FA68 + /xef/xa9/xa9 CJK COMPATIBILITY IDEOGRAPH-FA69 + /xef/xa9/xaa CJK COMPATIBILITY IDEOGRAPH-FA6A ++ /xef/xa9/xab CJK COMPATIBILITY IDEOGRAPH-FA6B ++ /xef/xa9/xac CJK COMPATIBILITY IDEOGRAPH-FA6C ++ /xef/xa9/xad CJK COMPATIBILITY IDEOGRAPH-FA6D + /xef/xa9/xb0 CJK COMPATIBILITY IDEOGRAPH-FA70 + /xef/xa9/xb1 CJK COMPATIBILITY IDEOGRAPH-FA71 + /xef/xa9/xb2 CJK COMPATIBILITY IDEOGRAPH-FA72 +@@ -25465,6 +26640,22 @@ CHARMAP + /xef/xae/xaf ARABIC LETTER YEH BARREE FINAL FORM + /xef/xae/xb0 ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM + /xef/xae/xb1 ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM ++ /xef/xae/xb2 ARABIC SYMBOL DOT ABOVE ++ /xef/xae/xb3 ARABIC SYMBOL DOT BELOW ++ /xef/xae/xb4 ARABIC SYMBOL TWO DOTS ABOVE ++ /xef/xae/xb5 ARABIC SYMBOL TWO DOTS BELOW ++ /xef/xae/xb6 ARABIC SYMBOL THREE DOTS ABOVE ++ /xef/xae/xb7 ARABIC SYMBOL THREE DOTS BELOW ++ /xef/xae/xb8 ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS ABOVE ++ /xef/xae/xb9 ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS BELOW ++ /xef/xae/xba ARABIC SYMBOL FOUR DOTS ABOVE ++ /xef/xae/xbb ARABIC SYMBOL FOUR DOTS BELOW ++ /xef/xae/xbc ARABIC SYMBOL DOUBLE VERTICAL BAR BELOW ++ /xef/xae/xbd ARABIC SYMBOL TWO DOTS VERTICALLY ABOVE ++ /xef/xae/xbe ARABIC SYMBOL TWO DOTS VERTICALLY BELOW ++ /xef/xae/xbf ARABIC SYMBOL RING ++ /xef/xaf/x80 ARABIC SYMBOL SMALL TAH ABOVE ++ /xef/xaf/x81 ARABIC SYMBOL SMALL TAH BELOW + /xef/xaf/x93 ARABIC LETTER NG ISOLATED FORM + /xef/xaf/x94 ARABIC LETTER NG FINAL FORM + /xef/xaf/x95 ARABIC LETTER NG INITIAL FORM +@@ -27269,6 +28460,37 @@ CHARMAP + /xf0/x90/xa0/xb8 CYPRIOT SYLLABLE XE + /xf0/x90/xa0/xbc CYPRIOT SYLLABLE ZA + /xf0/x90/xa0/xbf CYPRIOT SYLLABLE ZO ++ /xf0/x90/xa1/x80 IMPERIAL ARAMAIC LETTER ALEPH ++ /xf0/x90/xa1/x81 IMPERIAL ARAMAIC LETTER BETH ++ /xf0/x90/xa1/x82 IMPERIAL ARAMAIC LETTER GIMEL ++ /xf0/x90/xa1/x83 IMPERIAL ARAMAIC LETTER DALETH ++ /xf0/x90/xa1/x84 IMPERIAL ARAMAIC LETTER HE ++ /xf0/x90/xa1/x85 IMPERIAL ARAMAIC LETTER WAW ++ /xf0/x90/xa1/x86 IMPERIAL ARAMAIC LETTER ZAYIN ++ /xf0/x90/xa1/x87 IMPERIAL ARAMAIC LETTER HETH ++ /xf0/x90/xa1/x88 IMPERIAL ARAMAIC LETTER TETH ++ /xf0/x90/xa1/x89 IMPERIAL ARAMAIC LETTER YODH ++ /xf0/x90/xa1/x8a IMPERIAL ARAMAIC LETTER KAPH ++ /xf0/x90/xa1/x8b IMPERIAL ARAMAIC LETTER LAMEDH ++ /xf0/x90/xa1/x8c IMPERIAL ARAMAIC LETTER MEM ++ /xf0/x90/xa1/x8d IMPERIAL ARAMAIC LETTER NUN ++ /xf0/x90/xa1/x8e IMPERIAL ARAMAIC LETTER SAMEKH ++ /xf0/x90/xa1/x8f IMPERIAL ARAMAIC LETTER AYIN ++ /xf0/x90/xa1/x90 IMPERIAL ARAMAIC LETTER PE ++ /xf0/x90/xa1/x91 IMPERIAL ARAMAIC LETTER SADHE ++ /xf0/x90/xa1/x92 IMPERIAL ARAMAIC LETTER QOPH ++ /xf0/x90/xa1/x93 IMPERIAL ARAMAIC LETTER RESH ++ /xf0/x90/xa1/x94 IMPERIAL ARAMAIC LETTER SHIN ++ /xf0/x90/xa1/x95 IMPERIAL ARAMAIC LETTER TAW ++ /xf0/x90/xa1/x97 IMPERIAL ARAMAIC SECTION SIGN ++ /xf0/x90/xa1/x98 IMPERIAL ARAMAIC NUMBER ONE ++ /xf0/x90/xa1/x99 IMPERIAL ARAMAIC NUMBER TWO ++ /xf0/x90/xa1/x9a IMPERIAL ARAMAIC NUMBER THREE ++ /xf0/x90/xa1/x9b IMPERIAL ARAMAIC NUMBER TEN ++ /xf0/x90/xa1/x9c IMPERIAL ARAMAIC NUMBER TWENTY ++ /xf0/x90/xa1/x9d IMPERIAL ARAMAIC NUMBER ONE HUNDRED ++ /xf0/x90/xa1/x9e IMPERIAL ARAMAIC NUMBER ONE THOUSAND ++ /xf0/x90/xa1/x9f IMPERIAL ARAMAIC NUMBER TEN THOUSAND + /xf0/x90/xa4/x80 PHOENICIAN LETTER ALF + /xf0/x90/xa4/x81 PHOENICIAN LETTER BET + /xf0/x90/xa4/x82 PHOENICIAN LETTER GAML +@@ -27295,6 +28517,8 @@ CHARMAP + /xf0/x90/xa4/x97 PHOENICIAN NUMBER TEN + /xf0/x90/xa4/x98 PHOENICIAN NUMBER TWENTY + /xf0/x90/xa4/x99 PHOENICIAN NUMBER ONE HUNDRED ++ /xf0/x90/xa4/x9a PHOENICIAN NUMBER TWO ++ /xf0/x90/xa4/x9b PHOENICIAN NUMBER THREE + /xf0/x90/xa4/x9f PHOENICIAN WORD SEPARATOR + /xf0/x90/xa4/xa0 LYDIAN LETTER A + /xf0/x90/xa4/xa1 LYDIAN LETTER B +@@ -27388,6 +28612,434 @@ CHARMAP + /xf0/x90/xa9/x96 KHAROSHTHI PUNCTUATION DANDA + /xf0/x90/xa9/x97 KHAROSHTHI PUNCTUATION DOUBLE DANDA + /xf0/x90/xa9/x98 KHAROSHTHI PUNCTUATION LINES ++ /xf0/x90/xa9/xa0 OLD SOUTH ARABIAN LETTER HE ++ /xf0/x90/xa9/xa1 OLD SOUTH ARABIAN LETTER LAMEDH ++ /xf0/x90/xa9/xa2 OLD SOUTH ARABIAN LETTER HETH ++ /xf0/x90/xa9/xa3 OLD SOUTH ARABIAN LETTER MEM ++ /xf0/x90/xa9/xa4 OLD SOUTH ARABIAN LETTER QOPH ++ /xf0/x90/xa9/xa5 OLD SOUTH ARABIAN LETTER WAW ++ /xf0/x90/xa9/xa6 OLD SOUTH ARABIAN LETTER SHIN ++ /xf0/x90/xa9/xa7 OLD SOUTH ARABIAN LETTER RESH ++ /xf0/x90/xa9/xa8 OLD SOUTH ARABIAN LETTER BETH ++ /xf0/x90/xa9/xa9 OLD SOUTH ARABIAN LETTER TAW ++ /xf0/x90/xa9/xaa OLD SOUTH ARABIAN LETTER SAT ++ /xf0/x90/xa9/xab OLD SOUTH ARABIAN LETTER KAPH ++ /xf0/x90/xa9/xac OLD SOUTH ARABIAN LETTER NUN ++ /xf0/x90/xa9/xad OLD SOUTH ARABIAN LETTER KHETH ++ /xf0/x90/xa9/xae OLD SOUTH ARABIAN LETTER SADHE ++ /xf0/x90/xa9/xaf OLD SOUTH ARABIAN LETTER SAMEKH ++ /xf0/x90/xa9/xb0 OLD SOUTH ARABIAN LETTER FE ++ /xf0/x90/xa9/xb1 OLD SOUTH ARABIAN LETTER ALEF ++ /xf0/x90/xa9/xb2 OLD SOUTH ARABIAN LETTER AYN ++ /xf0/x90/xa9/xb3 OLD SOUTH ARABIAN LETTER DHADHE ++ /xf0/x90/xa9/xb4 OLD SOUTH ARABIAN LETTER GIMEL ++ /xf0/x90/xa9/xb5 OLD SOUTH ARABIAN LETTER DALETH ++ /xf0/x90/xa9/xb6 OLD SOUTH ARABIAN LETTER GHAYN ++ /xf0/x90/xa9/xb7 OLD SOUTH ARABIAN LETTER TETH ++ /xf0/x90/xa9/xb8 OLD SOUTH ARABIAN LETTER ZAYN ++ /xf0/x90/xa9/xb9 OLD SOUTH ARABIAN LETTER DHALETH ++ /xf0/x90/xa9/xba OLD SOUTH ARABIAN LETTER YODH ++ /xf0/x90/xa9/xbb OLD SOUTH ARABIAN LETTER THAW ++ /xf0/x90/xa9/xbc OLD SOUTH ARABIAN LETTER THETH ++ /xf0/x90/xa9/xbd OLD SOUTH ARABIAN NUMBER ONE ++ /xf0/x90/xa9/xbe OLD SOUTH ARABIAN NUMBER FIFTY ++ /xf0/x90/xa9/xbf OLD SOUTH ARABIAN NUMERIC INDICATOR ++ /xf0/x90/xac/x80 AVESTAN LETTER A ++ /xf0/x90/xac/x81 AVESTAN LETTER AA ++ /xf0/x90/xac/x82 AVESTAN LETTER AO ++ /xf0/x90/xac/x83 AVESTAN LETTER AAO ++ /xf0/x90/xac/x84 AVESTAN LETTER AN ++ /xf0/x90/xac/x85 AVESTAN LETTER AAN ++ /xf0/x90/xac/x86 AVESTAN LETTER AE ++ /xf0/x90/xac/x87 AVESTAN LETTER AEE ++ /xf0/x90/xac/x88 AVESTAN LETTER E ++ /xf0/x90/xac/x89 AVESTAN LETTER EE ++ /xf0/x90/xac/x8a AVESTAN LETTER O ++ /xf0/x90/xac/x8b AVESTAN LETTER OO ++ /xf0/x90/xac/x8c AVESTAN LETTER I ++ /xf0/x90/xac/x8d AVESTAN LETTER II ++ /xf0/x90/xac/x8e AVESTAN LETTER U ++ /xf0/x90/xac/x8f AVESTAN LETTER UU ++ /xf0/x90/xac/x90 AVESTAN LETTER KE ++ /xf0/x90/xac/x91 AVESTAN LETTER XE ++ /xf0/x90/xac/x92 AVESTAN LETTER XYE ++ /xf0/x90/xac/x93 AVESTAN LETTER XVE ++ /xf0/x90/xac/x94 AVESTAN LETTER GE ++ /xf0/x90/xac/x95 AVESTAN LETTER GGE ++ /xf0/x90/xac/x96 AVESTAN LETTER GHE ++ /xf0/x90/xac/x97 AVESTAN LETTER CE ++ /xf0/x90/xac/x98 AVESTAN LETTER JE ++ /xf0/x90/xac/x99 AVESTAN LETTER TE ++ /xf0/x90/xac/x9a AVESTAN LETTER THE ++ /xf0/x90/xac/x9b AVESTAN LETTER DE ++ /xf0/x90/xac/x9c AVESTAN LETTER DHE ++ /xf0/x90/xac/x9d AVESTAN LETTER TTE ++ /xf0/x90/xac/x9e AVESTAN LETTER PE ++ /xf0/x90/xac/x9f AVESTAN LETTER FE ++ /xf0/x90/xac/xa0 AVESTAN LETTER BE ++ /xf0/x90/xac/xa1 AVESTAN LETTER BHE ++ /xf0/x90/xac/xa2 AVESTAN LETTER NGE ++ /xf0/x90/xac/xa3 AVESTAN LETTER NGYE ++ /xf0/x90/xac/xa4 AVESTAN LETTER NGVE ++ /xf0/x90/xac/xa5 AVESTAN LETTER NE ++ /xf0/x90/xac/xa6 AVESTAN LETTER NYE ++ /xf0/x90/xac/xa7 AVESTAN LETTER NNE ++ /xf0/x90/xac/xa8 AVESTAN LETTER ME ++ /xf0/x90/xac/xa9 AVESTAN LETTER HME ++ /xf0/x90/xac/xaa AVESTAN LETTER YYE ++ /xf0/x90/xac/xab AVESTAN LETTER YE ++ /xf0/x90/xac/xac AVESTAN LETTER VE ++ /xf0/x90/xac/xad AVESTAN LETTER RE ++ /xf0/x90/xac/xae AVESTAN LETTER LE ++ /xf0/x90/xac/xaf AVESTAN LETTER SE ++ /xf0/x90/xac/xb0 AVESTAN LETTER ZE ++ /xf0/x90/xac/xb1 AVESTAN LETTER SHE ++ /xf0/x90/xac/xb2 AVESTAN LETTER ZHE ++ /xf0/x90/xac/xb3 AVESTAN LETTER SHYE ++ /xf0/x90/xac/xb4 AVESTAN LETTER SSHE ++ /xf0/x90/xac/xb5 AVESTAN LETTER HE ++ /xf0/x90/xac/xb9 AVESTAN ABBREVIATION MARK ++ /xf0/x90/xac/xba TINY TWO DOTS OVER ONE DOT PUNCTUATION ++ /xf0/x90/xac/xbb SMALL TWO DOTS OVER ONE DOT PUNCTUATION ++ /xf0/x90/xac/xbc LARGE TWO DOTS OVER ONE DOT PUNCTUATION ++ /xf0/x90/xac/xbd LARGE ONE DOT OVER TWO DOTS PUNCTUATION ++ /xf0/x90/xac/xbe LARGE TWO RINGS OVER ONE RING PUNCTUATION ++ /xf0/x90/xac/xbf LARGE ONE RING OVER TWO RINGS PUNCTUATION ++ /xf0/x90/xad/x80 INSCRIPTIONAL PARTHIAN LETTER ALEPH ++ /xf0/x90/xad/x81 INSCRIPTIONAL PARTHIAN LETTER BETH ++ /xf0/x90/xad/x82 INSCRIPTIONAL PARTHIAN LETTER GIMEL ++ /xf0/x90/xad/x83 INSCRIPTIONAL PARTHIAN LETTER DALETH ++ /xf0/x90/xad/x84 INSCRIPTIONAL PARTHIAN LETTER HE ++ /xf0/x90/xad/x85 INSCRIPTIONAL PARTHIAN LETTER WAW ++ /xf0/x90/xad/x86 INSCRIPTIONAL PARTHIAN LETTER ZAYIN ++ /xf0/x90/xad/x87 INSCRIPTIONAL PARTHIAN LETTER HETH ++ /xf0/x90/xad/x88 INSCRIPTIONAL PARTHIAN LETTER TETH ++ /xf0/x90/xad/x89 INSCRIPTIONAL PARTHIAN LETTER YODH ++ /xf0/x90/xad/x8a INSCRIPTIONAL PARTHIAN LETTER KAPH ++ /xf0/x90/xad/x8b INSCRIPTIONAL PARTHIAN LETTER LAMEDH ++ /xf0/x90/xad/x8c INSCRIPTIONAL PARTHIAN LETTER MEM ++ /xf0/x90/xad/x8d INSCRIPTIONAL PARTHIAN LETTER NUN ++ /xf0/x90/xad/x8e INSCRIPTIONAL PARTHIAN LETTER SAMEKH ++ /xf0/x90/xad/x8f INSCRIPTIONAL PARTHIAN LETTER AYIN ++ /xf0/x90/xad/x90 INSCRIPTIONAL PARTHIAN LETTER PE ++ /xf0/x90/xad/x91 INSCRIPTIONAL PARTHIAN LETTER SADHE ++ /xf0/x90/xad/x92 INSCRIPTIONAL PARTHIAN LETTER QOPH ++ /xf0/x90/xad/x93 INSCRIPTIONAL PARTHIAN LETTER RESH ++ /xf0/x90/xad/x94 INSCRIPTIONAL PARTHIAN LETTER SHIN ++ /xf0/x90/xad/x95 INSCRIPTIONAL PARTHIAN LETTER TAW ++ /xf0/x90/xad/x98 INSCRIPTIONAL PARTHIAN NUMBER ONE ++ /xf0/x90/xad/x99 INSCRIPTIONAL PARTHIAN NUMBER TWO ++ /xf0/x90/xad/x9a INSCRIPTIONAL PARTHIAN NUMBER THREE ++ /xf0/x90/xad/x9b INSCRIPTIONAL PARTHIAN NUMBER FOUR ++ /xf0/x90/xad/x9c INSCRIPTIONAL PARTHIAN NUMBER TEN ++ /xf0/x90/xad/x9d INSCRIPTIONAL PARTHIAN NUMBER TWENTY ++ /xf0/x90/xad/x9e INSCRIPTIONAL PARTHIAN NUMBER ONE HUNDRED ++ /xf0/x90/xad/x9f INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND ++ /xf0/x90/xad/xa0 INSCRIPTIONAL PAHLAVI LETTER ALEPH ++ /xf0/x90/xad/xa1 INSCRIPTIONAL PAHLAVI LETTER BETH ++ /xf0/x90/xad/xa2 INSCRIPTIONAL PAHLAVI LETTER GIMEL ++ /xf0/x90/xad/xa3 INSCRIPTIONAL PAHLAVI LETTER DALETH ++ /xf0/x90/xad/xa4 INSCRIPTIONAL PAHLAVI LETTER HE ++ /xf0/x90/xad/xa5 INSCRIPTIONAL PAHLAVI LETTER WAW-AYIN-RESH ++ /xf0/x90/xad/xa6 INSCRIPTIONAL PAHLAVI LETTER ZAYIN ++ /xf0/x90/xad/xa7 INSCRIPTIONAL PAHLAVI LETTER HETH ++ /xf0/x90/xad/xa8 INSCRIPTIONAL PAHLAVI LETTER TETH ++ /xf0/x90/xad/xa9 INSCRIPTIONAL PAHLAVI LETTER YODH ++ /xf0/x90/xad/xaa INSCRIPTIONAL PAHLAVI LETTER KAPH ++ /xf0/x90/xad/xab INSCRIPTIONAL PAHLAVI LETTER LAMEDH ++ /xf0/x90/xad/xac INSCRIPTIONAL PAHLAVI LETTER MEM-QOPH ++ /xf0/x90/xad/xad INSCRIPTIONAL PAHLAVI LETTER NUN ++ /xf0/x90/xad/xae INSCRIPTIONAL PAHLAVI LETTER SAMEKH ++ /xf0/x90/xad/xaf INSCRIPTIONAL PAHLAVI LETTER PE ++ /xf0/x90/xad/xb0 INSCRIPTIONAL PAHLAVI LETTER SADHE ++ /xf0/x90/xad/xb1 INSCRIPTIONAL PAHLAVI LETTER SHIN ++ /xf0/x90/xad/xb2 INSCRIPTIONAL PAHLAVI LETTER TAW ++ /xf0/x90/xad/xb8 INSCRIPTIONAL PAHLAVI NUMBER ONE ++ /xf0/x90/xad/xb9 INSCRIPTIONAL PAHLAVI NUMBER TWO ++ /xf0/x90/xad/xba INSCRIPTIONAL PAHLAVI NUMBER THREE ++ /xf0/x90/xad/xbb INSCRIPTIONAL PAHLAVI NUMBER FOUR ++ /xf0/x90/xad/xbc INSCRIPTIONAL PAHLAVI NUMBER TEN ++ /xf0/x90/xad/xbd INSCRIPTIONAL PAHLAVI NUMBER TWENTY ++ /xf0/x90/xad/xbe INSCRIPTIONAL PAHLAVI NUMBER ONE HUNDRED ++ /xf0/x90/xad/xbf INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND ++ /xf0/x90/xb0/x80 OLD TURKIC LETTER ORKHON A ++ /xf0/x90/xb0/x81 OLD TURKIC LETTER YENISEI A ++ /xf0/x90/xb0/x82 OLD TURKIC LETTER YENISEI AE ++ /xf0/x90/xb0/x83 OLD TURKIC LETTER ORKHON I ++ /xf0/x90/xb0/x84 OLD TURKIC LETTER YENISEI I ++ /xf0/x90/xb0/x85 OLD TURKIC LETTER YENISEI E ++ /xf0/x90/xb0/x86 OLD TURKIC LETTER ORKHON O ++ /xf0/x90/xb0/x87 OLD TURKIC LETTER ORKHON OE ++ /xf0/x90/xb0/x88 OLD TURKIC LETTER YENISEI OE ++ /xf0/x90/xb0/x89 OLD TURKIC LETTER ORKHON AB ++ /xf0/x90/xb0/x8a OLD TURKIC LETTER YENISEI AB ++ /xf0/x90/xb0/x8b OLD TURKIC LETTER ORKHON AEB ++ /xf0/x90/xb0/x8c OLD TURKIC LETTER YENISEI AEB ++ /xf0/x90/xb0/x8d OLD TURKIC LETTER ORKHON AG ++ /xf0/x90/xb0/x8e OLD TURKIC LETTER YENISEI AG ++ /xf0/x90/xb0/x8f OLD TURKIC LETTER ORKHON AEG ++ /xf0/x90/xb0/x90 OLD TURKIC LETTER YENISEI AEG ++ /xf0/x90/xb0/x91 OLD TURKIC LETTER ORKHON AD ++ /xf0/x90/xb0/x92 OLD TURKIC LETTER YENISEI AD ++ /xf0/x90/xb0/x93 OLD TURKIC LETTER ORKHON AED ++ /xf0/x90/xb0/x94 OLD TURKIC LETTER ORKHON EZ ++ /xf0/x90/xb0/x95 OLD TURKIC LETTER YENISEI EZ ++ /xf0/x90/xb0/x96 OLD TURKIC LETTER ORKHON AY ++ /xf0/x90/xb0/x97 OLD TURKIC LETTER YENISEI AY ++ /xf0/x90/xb0/x98 OLD TURKIC LETTER ORKHON AEY ++ /xf0/x90/xb0/x99 OLD TURKIC LETTER YENISEI AEY ++ /xf0/x90/xb0/x9a OLD TURKIC LETTER ORKHON AEK ++ /xf0/x90/xb0/x9b OLD TURKIC LETTER YENISEI AEK ++ /xf0/x90/xb0/x9c OLD TURKIC LETTER ORKHON OEK ++ /xf0/x90/xb0/x9d OLD TURKIC LETTER YENISEI OEK ++ /xf0/x90/xb0/x9e OLD TURKIC LETTER ORKHON AL ++ /xf0/x90/xb0/x9f OLD TURKIC LETTER YENISEI AL ++ /xf0/x90/xb0/xa0 OLD TURKIC LETTER ORKHON AEL ++ /xf0/x90/xb0/xa1 OLD TURKIC LETTER ORKHON ELT ++ /xf0/x90/xb0/xa2 OLD TURKIC LETTER ORKHON EM ++ /xf0/x90/xb0/xa3 OLD TURKIC LETTER ORKHON AN ++ /xf0/x90/xb0/xa4 OLD TURKIC LETTER ORKHON AEN ++ /xf0/x90/xb0/xa5 OLD TURKIC LETTER YENISEI AEN ++ /xf0/x90/xb0/xa6 OLD TURKIC LETTER ORKHON ENT ++ /xf0/x90/xb0/xa7 OLD TURKIC LETTER YENISEI ENT ++ /xf0/x90/xb0/xa8 OLD TURKIC LETTER ORKHON ENC ++ /xf0/x90/xb0/xa9 OLD TURKIC LETTER YENISEI ENC ++ /xf0/x90/xb0/xaa OLD TURKIC LETTER ORKHON ENY ++ /xf0/x90/xb0/xab OLD TURKIC LETTER YENISEI ENY ++ /xf0/x90/xb0/xac OLD TURKIC LETTER YENISEI ANG ++ /xf0/x90/xb0/xad OLD TURKIC LETTER ORKHON ENG ++ /xf0/x90/xb0/xae OLD TURKIC LETTER YENISEI AENG ++ /xf0/x90/xb0/xaf OLD TURKIC LETTER ORKHON EP ++ /xf0/x90/xb0/xb0 OLD TURKIC LETTER ORKHON OP ++ /xf0/x90/xb0/xb1 OLD TURKIC LETTER ORKHON IC ++ /xf0/x90/xb0/xb2 OLD TURKIC LETTER ORKHON EC ++ /xf0/x90/xb0/xb3 OLD TURKIC LETTER YENISEI EC ++ /xf0/x90/xb0/xb4 OLD TURKIC LETTER ORKHON AQ ++ /xf0/x90/xb0/xb5 OLD TURKIC LETTER YENISEI AQ ++ /xf0/x90/xb0/xb6 OLD TURKIC LETTER ORKHON IQ ++ /xf0/x90/xb0/xb7 OLD TURKIC LETTER YENISEI IQ ++ /xf0/x90/xb0/xb8 OLD TURKIC LETTER ORKHON OQ ++ /xf0/x90/xb0/xb9 OLD TURKIC LETTER YENISEI OQ ++ /xf0/x90/xb0/xba OLD TURKIC LETTER ORKHON AR ++ /xf0/x90/xb0/xbb OLD TURKIC LETTER YENISEI AR ++ /xf0/x90/xb0/xbc OLD TURKIC LETTER ORKHON AER ++ /xf0/x90/xb0/xbd OLD TURKIC LETTER ORKHON AS ++ /xf0/x90/xb0/xbe OLD TURKIC LETTER ORKHON AES ++ /xf0/x90/xb0/xbf OLD TURKIC LETTER ORKHON ASH ++ /xf0/x90/xb1/x80 OLD TURKIC LETTER YENISEI ASH ++ /xf0/x90/xb1/x81 OLD TURKIC LETTER ORKHON ESH ++ /xf0/x90/xb1/x82 OLD TURKIC LETTER YENISEI ESH ++ /xf0/x90/xb1/x83 OLD TURKIC LETTER ORKHON AT ++ /xf0/x90/xb1/x84 OLD TURKIC LETTER YENISEI AT ++ /xf0/x90/xb1/x85 OLD TURKIC LETTER ORKHON AET ++ /xf0/x90/xb1/x86 OLD TURKIC LETTER YENISEI AET ++ /xf0/x90/xb1/x87 OLD TURKIC LETTER ORKHON OT ++ /xf0/x90/xb1/x88 OLD TURKIC LETTER ORKHON BASH ++ /xf0/x90/xb9/xa0 RUMI DIGIT ONE ++ /xf0/x90/xb9/xa1 RUMI DIGIT TWO ++ /xf0/x90/xb9/xa2 RUMI DIGIT THREE ++ /xf0/x90/xb9/xa3 RUMI DIGIT FOUR ++ /xf0/x90/xb9/xa4 RUMI DIGIT FIVE ++ /xf0/x90/xb9/xa5 RUMI DIGIT SIX ++ /xf0/x90/xb9/xa6 RUMI DIGIT SEVEN ++ /xf0/x90/xb9/xa7 RUMI DIGIT EIGHT ++ /xf0/x90/xb9/xa8 RUMI DIGIT NINE ++ /xf0/x90/xb9/xa9 RUMI NUMBER TEN ++ /xf0/x90/xb9/xaa RUMI NUMBER TWENTY ++ /xf0/x90/xb9/xab RUMI NUMBER THIRTY ++ /xf0/x90/xb9/xac RUMI NUMBER FORTY ++ /xf0/x90/xb9/xad RUMI NUMBER FIFTY ++ /xf0/x90/xb9/xae RUMI NUMBER SIXTY ++ /xf0/x90/xb9/xaf RUMI NUMBER SEVENTY ++ /xf0/x90/xb9/xb0 RUMI NUMBER EIGHTY ++ /xf0/x90/xb9/xb1 RUMI NUMBER NINETY ++ /xf0/x90/xb9/xb2 RUMI NUMBER ONE HUNDRED ++ /xf0/x90/xb9/xb3 RUMI NUMBER TWO HUNDRED ++ /xf0/x90/xb9/xb4 RUMI NUMBER THREE HUNDRED ++ /xf0/x90/xb9/xb5 RUMI NUMBER FOUR HUNDRED ++ /xf0/x90/xb9/xb6 RUMI NUMBER FIVE HUNDRED ++ /xf0/x90/xb9/xb7 RUMI NUMBER SIX HUNDRED ++ /xf0/x90/xb9/xb8 RUMI NUMBER SEVEN HUNDRED ++ /xf0/x90/xb9/xb9 RUMI NUMBER EIGHT HUNDRED ++ /xf0/x90/xb9/xba RUMI NUMBER NINE HUNDRED ++ /xf0/x90/xb9/xbb RUMI FRACTION ONE HALF ++ /xf0/x90/xb9/xbc RUMI FRACTION ONE QUARTER ++ /xf0/x90/xb9/xbd RUMI FRACTION ONE THIRD ++ /xf0/x90/xb9/xbe RUMI FRACTION TWO THIRDS ++ /xf0/x91/x80/x80 BRAHMI SIGN CANDRABINDU ++ /xf0/x91/x80/x81 BRAHMI SIGN ANUSVARA ++ /xf0/x91/x80/x82 BRAHMI SIGN VISARGA ++ /xf0/x91/x80/x83 BRAHMI SIGN JIHVAMULIYA ++ /xf0/x91/x80/x84 BRAHMI SIGN UPADHMANIYA ++ /xf0/x91/x80/x85 BRAHMI LETTER A ++ /xf0/x91/x80/x86 BRAHMI LETTER AA ++ /xf0/x91/x80/x87 BRAHMI LETTER I ++ /xf0/x91/x80/x88 BRAHMI LETTER II ++ /xf0/x91/x80/x89 BRAHMI LETTER U ++ /xf0/x91/x80/x8a BRAHMI LETTER UU ++ /xf0/x91/x80/x8b BRAHMI LETTER VOCALIC R ++ /xf0/x91/x80/x8c BRAHMI LETTER VOCALIC RR ++ /xf0/x91/x80/x8d BRAHMI LETTER VOCALIC L ++ /xf0/x91/x80/x8e BRAHMI LETTER VOCALIC LL ++ /xf0/x91/x80/x8f BRAHMI LETTER E ++ /xf0/x91/x80/x90 BRAHMI LETTER AI ++ /xf0/x91/x80/x91 BRAHMI LETTER O ++ /xf0/x91/x80/x92 BRAHMI LETTER AU ++ /xf0/x91/x80/x93 BRAHMI LETTER KA ++ /xf0/x91/x80/x94 BRAHMI LETTER KHA ++ /xf0/x91/x80/x95 BRAHMI LETTER GA ++ /xf0/x91/x80/x96 BRAHMI LETTER GHA ++ /xf0/x91/x80/x97 BRAHMI LETTER NGA ++ /xf0/x91/x80/x98 BRAHMI LETTER CA ++ /xf0/x91/x80/x99 BRAHMI LETTER CHA ++ /xf0/x91/x80/x9a BRAHMI LETTER JA ++ /xf0/x91/x80/x9b BRAHMI LETTER JHA ++ /xf0/x91/x80/x9c BRAHMI LETTER NYA ++ /xf0/x91/x80/x9d BRAHMI LETTER TTA ++ /xf0/x91/x80/x9e BRAHMI LETTER TTHA ++ /xf0/x91/x80/x9f BRAHMI LETTER DDA ++ /xf0/x91/x80/xa0 BRAHMI LETTER DDHA ++ /xf0/x91/x80/xa1 BRAHMI LETTER NNA ++ /xf0/x91/x80/xa2 BRAHMI LETTER TA ++ /xf0/x91/x80/xa3 BRAHMI LETTER THA ++ /xf0/x91/x80/xa4 BRAHMI LETTER DA ++ /xf0/x91/x80/xa5 BRAHMI LETTER DHA ++ /xf0/x91/x80/xa6 BRAHMI LETTER NA ++ /xf0/x91/x80/xa7 BRAHMI LETTER PA ++ /xf0/x91/x80/xa8 BRAHMI LETTER PHA ++ /xf0/x91/x80/xa9 BRAHMI LETTER BA ++ /xf0/x91/x80/xaa BRAHMI LETTER BHA ++ /xf0/x91/x80/xab BRAHMI LETTER MA ++ /xf0/x91/x80/xac BRAHMI LETTER YA ++ /xf0/x91/x80/xad BRAHMI LETTER RA ++ /xf0/x91/x80/xae BRAHMI LETTER LA ++ /xf0/x91/x80/xaf BRAHMI LETTER VA ++ /xf0/x91/x80/xb0 BRAHMI LETTER SHA ++ /xf0/x91/x80/xb1 BRAHMI LETTER SSA ++ /xf0/x91/x80/xb2 BRAHMI LETTER SA ++ /xf0/x91/x80/xb3 BRAHMI LETTER HA ++ /xf0/x91/x80/xb4 BRAHMI LETTER LLA ++ /xf0/x91/x80/xb5 BRAHMI LETTER OLD TAMIL LLLA ++ /xf0/x91/x80/xb6 BRAHMI LETTER OLD TAMIL RRA ++ /xf0/x91/x80/xb7 BRAHMI LETTER OLD TAMIL NNNA ++ /xf0/x91/x80/xb8 BRAHMI VOWEL SIGN AA ++ /xf0/x91/x80/xb9 BRAHMI VOWEL SIGN BHATTIPROLU AA ++ /xf0/x91/x80/xba BRAHMI VOWEL SIGN I ++ /xf0/x91/x80/xbb BRAHMI VOWEL SIGN II ++ /xf0/x91/x80/xbc BRAHMI VOWEL SIGN U ++ /xf0/x91/x80/xbd BRAHMI VOWEL SIGN UU ++ /xf0/x91/x80/xbe BRAHMI VOWEL SIGN VOCALIC R ++ /xf0/x91/x80/xbf BRAHMI VOWEL SIGN VOCALIC RR ++ /xf0/x91/x81/x80 BRAHMI VOWEL SIGN VOCALIC L ++ /xf0/x91/x81/x81 BRAHMI VOWEL SIGN VOCALIC LL ++ /xf0/x91/x81/x82 BRAHMI VOWEL SIGN E ++ /xf0/x91/x81/x83 BRAHMI VOWEL SIGN AI ++ /xf0/x91/x81/x84 BRAHMI VOWEL SIGN O ++ /xf0/x91/x81/x85 BRAHMI VOWEL SIGN AU ++ /xf0/x91/x81/x86 BRAHMI VIRAMA ++ /xf0/x91/x81/x87 BRAHMI DANDA ++ /xf0/x91/x81/x88 BRAHMI DOUBLE DANDA ++ /xf0/x91/x81/x89 BRAHMI PUNCTUATION DOT ++ /xf0/x91/x81/x8a BRAHMI PUNCTUATION DOUBLE DOT ++ /xf0/x91/x81/x8b BRAHMI PUNCTUATION LINE ++ /xf0/x91/x81/x8c BRAHMI PUNCTUATION CRESCENT BAR ++ /xf0/x91/x81/x8d BRAHMI PUNCTUATION LOTUS ++ /xf0/x91/x81/x92 BRAHMI NUMBER ONE ++ /xf0/x91/x81/x93 BRAHMI NUMBER TWO ++ /xf0/x91/x81/x94 BRAHMI NUMBER THREE ++ /xf0/x91/x81/x95 BRAHMI NUMBER FOUR ++ /xf0/x91/x81/x96 BRAHMI NUMBER FIVE ++ /xf0/x91/x81/x97 BRAHMI NUMBER SIX ++ /xf0/x91/x81/x98 BRAHMI NUMBER SEVEN ++ /xf0/x91/x81/x99 BRAHMI NUMBER EIGHT ++ /xf0/x91/x81/x9a BRAHMI NUMBER NINE ++ /xf0/x91/x81/x9b BRAHMI NUMBER TEN ++ /xf0/x91/x81/x9c BRAHMI NUMBER TWENTY ++ /xf0/x91/x81/x9d BRAHMI NUMBER THIRTY ++ /xf0/x91/x81/x9e BRAHMI NUMBER FORTY ++ /xf0/x91/x81/x9f BRAHMI NUMBER FIFTY ++ /xf0/x91/x81/xa0 BRAHMI NUMBER SIXTY ++ /xf0/x91/x81/xa1 BRAHMI NUMBER SEVENTY ++ /xf0/x91/x81/xa2 BRAHMI NUMBER EIGHTY ++ /xf0/x91/x81/xa3 BRAHMI NUMBER NINETY ++ /xf0/x91/x81/xa4 BRAHMI NUMBER ONE HUNDRED ++ /xf0/x91/x81/xa5 BRAHMI NUMBER ONE THOUSAND ++ /xf0/x91/x81/xa6 BRAHMI DIGIT ZERO ++ /xf0/x91/x81/xa7 BRAHMI DIGIT ONE ++ /xf0/x91/x81/xa8 BRAHMI DIGIT TWO ++ /xf0/x91/x81/xa9 BRAHMI DIGIT THREE ++ /xf0/x91/x81/xaa BRAHMI DIGIT FOUR ++ /xf0/x91/x81/xab BRAHMI DIGIT FIVE ++ /xf0/x91/x81/xac BRAHMI DIGIT SIX ++ /xf0/x91/x81/xad BRAHMI DIGIT SEVEN ++ /xf0/x91/x81/xae BRAHMI DIGIT EIGHT ++ /xf0/x91/x81/xaf BRAHMI DIGIT NINE ++ /xf0/x91/x82/x80 KAITHI SIGN CANDRABINDU ++ /xf0/x91/x82/x81 KAITHI SIGN ANUSVARA ++ /xf0/x91/x82/x82 KAITHI SIGN VISARGA ++ /xf0/x91/x82/x83 KAITHI LETTER A ++ /xf0/x91/x82/x84 KAITHI LETTER AA ++ /xf0/x91/x82/x85 KAITHI LETTER I ++ /xf0/x91/x82/x86 KAITHI LETTER II ++ /xf0/x91/x82/x87 KAITHI LETTER U ++ /xf0/x91/x82/x88 KAITHI LETTER UU ++ /xf0/x91/x82/x89 KAITHI LETTER E ++ /xf0/x91/x82/x8a KAITHI LETTER AI ++ /xf0/x91/x82/x8b KAITHI LETTER O ++ /xf0/x91/x82/x8c KAITHI LETTER AU ++ /xf0/x91/x82/x8d KAITHI LETTER KA ++ /xf0/x91/x82/x8e KAITHI LETTER KHA ++ /xf0/x91/x82/x8f KAITHI LETTER GA ++ /xf0/x91/x82/x90 KAITHI LETTER GHA ++ /xf0/x91/x82/x91 KAITHI LETTER NGA ++ /xf0/x91/x82/x92 KAITHI LETTER CA ++ /xf0/x91/x82/x93 KAITHI LETTER CHA ++ /xf0/x91/x82/x94 KAITHI LETTER JA ++ /xf0/x91/x82/x95 KAITHI LETTER JHA ++ /xf0/x91/x82/x96 KAITHI LETTER NYA ++ /xf0/x91/x82/x97 KAITHI LETTER TTA ++ /xf0/x91/x82/x98 KAITHI LETTER TTHA ++ /xf0/x91/x82/x99 KAITHI LETTER DDA ++ /xf0/x91/x82/x9a KAITHI LETTER DDDHA ++ /xf0/x91/x82/x9b KAITHI LETTER DDHA ++ /xf0/x91/x82/x9c KAITHI LETTER RHA ++ /xf0/x91/x82/x9d KAITHI LETTER NNA ++ /xf0/x91/x82/x9e KAITHI LETTER TA ++ /xf0/x91/x82/x9f KAITHI LETTER THA ++ /xf0/x91/x82/xa0 KAITHI LETTER DA ++ /xf0/x91/x82/xa1 KAITHI LETTER DHA ++ /xf0/x91/x82/xa2 KAITHI LETTER NA ++ /xf0/x91/x82/xa3 KAITHI LETTER PA ++ /xf0/x91/x82/xa4 KAITHI LETTER PHA ++ /xf0/x91/x82/xa5 KAITHI LETTER BA ++ /xf0/x91/x82/xa6 KAITHI LETTER BHA ++ /xf0/x91/x82/xa7 KAITHI LETTER MA ++ /xf0/x91/x82/xa8 KAITHI LETTER YA ++ /xf0/x91/x82/xa9 KAITHI LETTER RA ++ /xf0/x91/x82/xaa KAITHI LETTER LA ++ /xf0/x91/x82/xab KAITHI LETTER VA ++ /xf0/x91/x82/xac KAITHI LETTER SHA ++ /xf0/x91/x82/xad KAITHI LETTER SSA ++ /xf0/x91/x82/xae KAITHI LETTER SA ++ /xf0/x91/x82/xaf KAITHI LETTER HA ++ /xf0/x91/x82/xb0 KAITHI VOWEL SIGN AA ++ /xf0/x91/x82/xb1 KAITHI VOWEL SIGN I ++ /xf0/x91/x82/xb2 KAITHI VOWEL SIGN II ++ /xf0/x91/x82/xb3 KAITHI VOWEL SIGN U ++ /xf0/x91/x82/xb4 KAITHI VOWEL SIGN UU ++ /xf0/x91/x82/xb5 KAITHI VOWEL SIGN E ++ /xf0/x91/x82/xb6 KAITHI VOWEL SIGN AI ++ /xf0/x91/x82/xb7 KAITHI VOWEL SIGN O ++ /xf0/x91/x82/xb8 KAITHI VOWEL SIGN AU ++ /xf0/x91/x82/xb9 KAITHI SIGN VIRAMA ++ /xf0/x91/x82/xba KAITHI SIGN NUKTA ++ /xf0/x91/x82/xbb KAITHI ABBREVIATION SIGN ++ /xf0/x91/x82/xbc KAITHI ENUMERATION SIGN ++ /xf0/x91/x82/xbd KAITHI NUMBER SIGN ++ /xf0/x91/x82/xbe KAITHI SECTION MARK ++ /xf0/x91/x82/xbf KAITHI DOUBLE SECTION MARK ++ /xf0/x91/x83/x80 KAITHI DANDA ++ /xf0/x91/x83/x81 KAITHI DOUBLE DANDA + /xf0/x92/x80/x80 CUNEIFORM SIGN A + /xf0/x92/x80/x81 CUNEIFORM SIGN A TIMES A + /xf0/x92/x80/x82 CUNEIFORM SIGN A TIMES BAD +@@ -28370,6 +30022,1648 @@ CHARMAP + /xf0/x92/x91/xb1 CUNEIFORM PUNCTUATION SIGN VERTICAL COLON + /xf0/x92/x91/xb2 CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON + /xf0/x92/x91/xb3 CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON ++ /xf0/x93/x80/x80 EGYPTIAN HIEROGLYPH A001 ++ /xf0/x93/x80/x81 EGYPTIAN HIEROGLYPH A002 ++ /xf0/x93/x80/x82 EGYPTIAN HIEROGLYPH A003 ++ /xf0/x93/x80/x83 EGYPTIAN HIEROGLYPH A004 ++ /xf0/x93/x80/x84 EGYPTIAN HIEROGLYPH A005 ++ /xf0/x93/x80/x85 EGYPTIAN HIEROGLYPH A005A ++ /xf0/x93/x80/x86 EGYPTIAN HIEROGLYPH A006 ++ /xf0/x93/x80/x87 EGYPTIAN HIEROGLYPH A006A ++ /xf0/x93/x80/x88 EGYPTIAN HIEROGLYPH A006B ++ /xf0/x93/x80/x89 EGYPTIAN HIEROGLYPH A007 ++ /xf0/x93/x80/x8a EGYPTIAN HIEROGLYPH A008 ++ /xf0/x93/x80/x8b EGYPTIAN HIEROGLYPH A009 ++ /xf0/x93/x80/x8c EGYPTIAN HIEROGLYPH A010 ++ /xf0/x93/x80/x8d EGYPTIAN HIEROGLYPH A011 ++ /xf0/x93/x80/x8e EGYPTIAN HIEROGLYPH A012 ++ /xf0/x93/x80/x8f EGYPTIAN HIEROGLYPH A013 ++ /xf0/x93/x80/x90 EGYPTIAN HIEROGLYPH A014 ++ /xf0/x93/x80/x91 EGYPTIAN HIEROGLYPH A014A ++ /xf0/x93/x80/x92 EGYPTIAN HIEROGLYPH A015 ++ /xf0/x93/x80/x93 EGYPTIAN HIEROGLYPH A016 ++ /xf0/x93/x80/x94 EGYPTIAN HIEROGLYPH A017 ++ /xf0/x93/x80/x95 EGYPTIAN HIEROGLYPH A017A ++ /xf0/x93/x80/x96 EGYPTIAN HIEROGLYPH A018 ++ /xf0/x93/x80/x97 EGYPTIAN HIEROGLYPH A019 ++ /xf0/x93/x80/x98 EGYPTIAN HIEROGLYPH A020 ++ /xf0/x93/x80/x99 EGYPTIAN HIEROGLYPH A021 ++ /xf0/x93/x80/x9a EGYPTIAN HIEROGLYPH A022 ++ /xf0/x93/x80/x9b EGYPTIAN HIEROGLYPH A023 ++ /xf0/x93/x80/x9c EGYPTIAN HIEROGLYPH A024 ++ /xf0/x93/x80/x9d EGYPTIAN HIEROGLYPH A025 ++ /xf0/x93/x80/x9e EGYPTIAN HIEROGLYPH A026 ++ /xf0/x93/x80/x9f EGYPTIAN HIEROGLYPH A027 ++ /xf0/x93/x80/xa0 EGYPTIAN HIEROGLYPH A028 ++ /xf0/x93/x80/xa1 EGYPTIAN HIEROGLYPH A029 ++ /xf0/x93/x80/xa2 EGYPTIAN HIEROGLYPH A030 ++ /xf0/x93/x80/xa3 EGYPTIAN HIEROGLYPH A031 ++ /xf0/x93/x80/xa4 EGYPTIAN HIEROGLYPH A032 ++ /xf0/x93/x80/xa5 EGYPTIAN HIEROGLYPH A032A ++ /xf0/x93/x80/xa6 EGYPTIAN HIEROGLYPH A033 ++ /xf0/x93/x80/xa7 EGYPTIAN HIEROGLYPH A034 ++ /xf0/x93/x80/xa8 EGYPTIAN HIEROGLYPH A035 ++ /xf0/x93/x80/xa9 EGYPTIAN HIEROGLYPH A036 ++ /xf0/x93/x80/xaa EGYPTIAN HIEROGLYPH A037 ++ /xf0/x93/x80/xab EGYPTIAN HIEROGLYPH A038 ++ /xf0/x93/x80/xac EGYPTIAN HIEROGLYPH A039 ++ /xf0/x93/x80/xad EGYPTIAN HIEROGLYPH A040 ++ /xf0/x93/x80/xae EGYPTIAN HIEROGLYPH A040A ++ /xf0/x93/x80/xaf EGYPTIAN HIEROGLYPH A041 ++ /xf0/x93/x80/xb0 EGYPTIAN HIEROGLYPH A042 ++ /xf0/x93/x80/xb1 EGYPTIAN HIEROGLYPH A042A ++ /xf0/x93/x80/xb2 EGYPTIAN HIEROGLYPH A043 ++ /xf0/x93/x80/xb3 EGYPTIAN HIEROGLYPH A043A ++ /xf0/x93/x80/xb4 EGYPTIAN HIEROGLYPH A044 ++ /xf0/x93/x80/xb5 EGYPTIAN HIEROGLYPH A045 ++ /xf0/x93/x80/xb6 EGYPTIAN HIEROGLYPH A045A ++ /xf0/x93/x80/xb7 EGYPTIAN HIEROGLYPH A046 ++ /xf0/x93/x80/xb8 EGYPTIAN HIEROGLYPH A047 ++ /xf0/x93/x80/xb9 EGYPTIAN HIEROGLYPH A048 ++ /xf0/x93/x80/xba EGYPTIAN HIEROGLYPH A049 ++ /xf0/x93/x80/xbb EGYPTIAN HIEROGLYPH A050 ++ /xf0/x93/x80/xbc EGYPTIAN HIEROGLYPH A051 ++ /xf0/x93/x80/xbd EGYPTIAN HIEROGLYPH A052 ++ /xf0/x93/x80/xbe EGYPTIAN HIEROGLYPH A053 ++ /xf0/x93/x80/xbf EGYPTIAN HIEROGLYPH A054 ++ /xf0/x93/x81/x80 EGYPTIAN HIEROGLYPH A055 ++ /xf0/x93/x81/x81 EGYPTIAN HIEROGLYPH A056 ++ /xf0/x93/x81/x82 EGYPTIAN HIEROGLYPH A057 ++ /xf0/x93/x81/x83 EGYPTIAN HIEROGLYPH A058 ++ /xf0/x93/x81/x84 EGYPTIAN HIEROGLYPH A059 ++ /xf0/x93/x81/x85 EGYPTIAN HIEROGLYPH A060 ++ /xf0/x93/x81/x86 EGYPTIAN HIEROGLYPH A061 ++ /xf0/x93/x81/x87 EGYPTIAN HIEROGLYPH A062 ++ /xf0/x93/x81/x88 EGYPTIAN HIEROGLYPH A063 ++ /xf0/x93/x81/x89 EGYPTIAN HIEROGLYPH A064 ++ /xf0/x93/x81/x8a EGYPTIAN HIEROGLYPH A065 ++ /xf0/x93/x81/x8b EGYPTIAN HIEROGLYPH A066 ++ /xf0/x93/x81/x8c EGYPTIAN HIEROGLYPH A067 ++ /xf0/x93/x81/x8d EGYPTIAN HIEROGLYPH A068 ++ /xf0/x93/x81/x8e EGYPTIAN HIEROGLYPH A069 ++ /xf0/x93/x81/x8f EGYPTIAN HIEROGLYPH A070 ++ /xf0/x93/x81/x90 EGYPTIAN HIEROGLYPH B001 ++ /xf0/x93/x81/x91 EGYPTIAN HIEROGLYPH B002 ++ /xf0/x93/x81/x92 EGYPTIAN HIEROGLYPH B003 ++ /xf0/x93/x81/x93 EGYPTIAN HIEROGLYPH B004 ++ /xf0/x93/x81/x94 EGYPTIAN HIEROGLYPH B005 ++ /xf0/x93/x81/x95 EGYPTIAN HIEROGLYPH B005A ++ /xf0/x93/x81/x96 EGYPTIAN HIEROGLYPH B006 ++ /xf0/x93/x81/x97 EGYPTIAN HIEROGLYPH B007 ++ /xf0/x93/x81/x98 EGYPTIAN HIEROGLYPH B008 ++ /xf0/x93/x81/x99 EGYPTIAN HIEROGLYPH B009 ++ /xf0/x93/x81/x9a EGYPTIAN HIEROGLYPH C001 ++ /xf0/x93/x81/x9b EGYPTIAN HIEROGLYPH C002 ++ /xf0/x93/x81/x9c EGYPTIAN HIEROGLYPH C002A ++ /xf0/x93/x81/x9d EGYPTIAN HIEROGLYPH C002B ++ /xf0/x93/x81/x9e EGYPTIAN HIEROGLYPH C002C ++ /xf0/x93/x81/x9f EGYPTIAN HIEROGLYPH C003 ++ /xf0/x93/x81/xa0 EGYPTIAN HIEROGLYPH C004 ++ /xf0/x93/x81/xa1 EGYPTIAN HIEROGLYPH C005 ++ /xf0/x93/x81/xa2 EGYPTIAN HIEROGLYPH C006 ++ /xf0/x93/x81/xa3 EGYPTIAN HIEROGLYPH C007 ++ /xf0/x93/x81/xa4 EGYPTIAN HIEROGLYPH C008 ++ /xf0/x93/x81/xa5 EGYPTIAN HIEROGLYPH C009 ++ /xf0/x93/x81/xa6 EGYPTIAN HIEROGLYPH C010 ++ /xf0/x93/x81/xa7 EGYPTIAN HIEROGLYPH C010A ++ /xf0/x93/x81/xa8 EGYPTIAN HIEROGLYPH C011 ++ /xf0/x93/x81/xa9 EGYPTIAN HIEROGLYPH C012 ++ /xf0/x93/x81/xaa EGYPTIAN HIEROGLYPH C013 ++ /xf0/x93/x81/xab EGYPTIAN HIEROGLYPH C014 ++ /xf0/x93/x81/xac EGYPTIAN HIEROGLYPH C015 ++ /xf0/x93/x81/xad EGYPTIAN HIEROGLYPH C016 ++ /xf0/x93/x81/xae EGYPTIAN HIEROGLYPH C017 ++ /xf0/x93/x81/xaf EGYPTIAN HIEROGLYPH C018 ++ /xf0/x93/x81/xb0 EGYPTIAN HIEROGLYPH C019 ++ /xf0/x93/x81/xb1 EGYPTIAN HIEROGLYPH C020 ++ /xf0/x93/x81/xb2 EGYPTIAN HIEROGLYPH C021 ++ /xf0/x93/x81/xb3 EGYPTIAN HIEROGLYPH C022 ++ /xf0/x93/x81/xb4 EGYPTIAN HIEROGLYPH C023 ++ /xf0/x93/x81/xb5 EGYPTIAN HIEROGLYPH C024 ++ /xf0/x93/x81/xb6 EGYPTIAN HIEROGLYPH D001 ++ /xf0/x93/x81/xb7 EGYPTIAN HIEROGLYPH D002 ++ /xf0/x93/x81/xb8 EGYPTIAN HIEROGLYPH D003 ++ /xf0/x93/x81/xb9 EGYPTIAN HIEROGLYPH D004 ++ /xf0/x93/x81/xba EGYPTIAN HIEROGLYPH D005 ++ /xf0/x93/x81/xbb EGYPTIAN HIEROGLYPH D006 ++ /xf0/x93/x81/xbc EGYPTIAN HIEROGLYPH D007 ++ /xf0/x93/x81/xbd EGYPTIAN HIEROGLYPH D008 ++ /xf0/x93/x81/xbe EGYPTIAN HIEROGLYPH D008A ++ /xf0/x93/x81/xbf EGYPTIAN HIEROGLYPH D009 ++ /xf0/x93/x82/x80 EGYPTIAN HIEROGLYPH D010 ++ /xf0/x93/x82/x81 EGYPTIAN HIEROGLYPH D011 ++ /xf0/x93/x82/x82 EGYPTIAN HIEROGLYPH D012 ++ /xf0/x93/x82/x83 EGYPTIAN HIEROGLYPH D013 ++ /xf0/x93/x82/x84 EGYPTIAN HIEROGLYPH D014 ++ /xf0/x93/x82/x85 EGYPTIAN HIEROGLYPH D015 ++ /xf0/x93/x82/x86 EGYPTIAN HIEROGLYPH D016 ++ /xf0/x93/x82/x87 EGYPTIAN HIEROGLYPH D017 ++ /xf0/x93/x82/x88 EGYPTIAN HIEROGLYPH D018 ++ /xf0/x93/x82/x89 EGYPTIAN HIEROGLYPH D019 ++ /xf0/x93/x82/x8a EGYPTIAN HIEROGLYPH D020 ++ /xf0/x93/x82/x8b EGYPTIAN HIEROGLYPH D021 ++ /xf0/x93/x82/x8c EGYPTIAN HIEROGLYPH D022 ++ /xf0/x93/x82/x8d EGYPTIAN HIEROGLYPH D023 ++ /xf0/x93/x82/x8e EGYPTIAN HIEROGLYPH D024 ++ /xf0/x93/x82/x8f EGYPTIAN HIEROGLYPH D025 ++ /xf0/x93/x82/x90 EGYPTIAN HIEROGLYPH D026 ++ /xf0/x93/x82/x91 EGYPTIAN HIEROGLYPH D027 ++ /xf0/x93/x82/x92 EGYPTIAN HIEROGLYPH D027A ++ /xf0/x93/x82/x93 EGYPTIAN HIEROGLYPH D028 ++ /xf0/x93/x82/x94 EGYPTIAN HIEROGLYPH D029 ++ /xf0/x93/x82/x95 EGYPTIAN HIEROGLYPH D030 ++ /xf0/x93/x82/x96 EGYPTIAN HIEROGLYPH D031 ++ /xf0/x93/x82/x97 EGYPTIAN HIEROGLYPH D031A ++ /xf0/x93/x82/x98 EGYPTIAN HIEROGLYPH D032 ++ /xf0/x93/x82/x99 EGYPTIAN HIEROGLYPH D033 ++ /xf0/x93/x82/x9a EGYPTIAN HIEROGLYPH D034 ++ /xf0/x93/x82/x9b EGYPTIAN HIEROGLYPH D034A ++ /xf0/x93/x82/x9c EGYPTIAN HIEROGLYPH D035 ++ /xf0/x93/x82/x9d EGYPTIAN HIEROGLYPH D036 ++ /xf0/x93/x82/x9e EGYPTIAN HIEROGLYPH D037 ++ /xf0/x93/x82/x9f EGYPTIAN HIEROGLYPH D038 ++ /xf0/x93/x82/xa0 EGYPTIAN HIEROGLYPH D039 ++ /xf0/x93/x82/xa1 EGYPTIAN HIEROGLYPH D040 ++ /xf0/x93/x82/xa2 EGYPTIAN HIEROGLYPH D041 ++ /xf0/x93/x82/xa3 EGYPTIAN HIEROGLYPH D042 ++ /xf0/x93/x82/xa4 EGYPTIAN HIEROGLYPH D043 ++ /xf0/x93/x82/xa5 EGYPTIAN HIEROGLYPH D044 ++ /xf0/x93/x82/xa6 EGYPTIAN HIEROGLYPH D045 ++ /xf0/x93/x82/xa7 EGYPTIAN HIEROGLYPH D046 ++ /xf0/x93/x82/xa8 EGYPTIAN HIEROGLYPH D046A ++ /xf0/x93/x82/xa9 EGYPTIAN HIEROGLYPH D047 ++ /xf0/x93/x82/xaa EGYPTIAN HIEROGLYPH D048 ++ /xf0/x93/x82/xab EGYPTIAN HIEROGLYPH D048A ++ /xf0/x93/x82/xac EGYPTIAN HIEROGLYPH D049 ++ /xf0/x93/x82/xad EGYPTIAN HIEROGLYPH D050 ++ /xf0/x93/x82/xae EGYPTIAN HIEROGLYPH D050A ++ /xf0/x93/x82/xaf EGYPTIAN HIEROGLYPH D050B ++ /xf0/x93/x82/xb0 EGYPTIAN HIEROGLYPH D050C ++ /xf0/x93/x82/xb1 EGYPTIAN HIEROGLYPH D050D ++ /xf0/x93/x82/xb2 EGYPTIAN HIEROGLYPH D050E ++ /xf0/x93/x82/xb3 EGYPTIAN HIEROGLYPH D050F ++ /xf0/x93/x82/xb4 EGYPTIAN HIEROGLYPH D050G ++ /xf0/x93/x82/xb5 EGYPTIAN HIEROGLYPH D050H ++ /xf0/x93/x82/xb6 EGYPTIAN HIEROGLYPH D050I ++ /xf0/x93/x82/xb7 EGYPTIAN HIEROGLYPH D051 ++ /xf0/x93/x82/xb8 EGYPTIAN HIEROGLYPH D052 ++ /xf0/x93/x82/xb9 EGYPTIAN HIEROGLYPH D052A ++ /xf0/x93/x82/xba EGYPTIAN HIEROGLYPH D053 ++ /xf0/x93/x82/xbb EGYPTIAN HIEROGLYPH D054 ++ /xf0/x93/x82/xbc EGYPTIAN HIEROGLYPH D054A ++ /xf0/x93/x82/xbd EGYPTIAN HIEROGLYPH D055 ++ /xf0/x93/x82/xbe EGYPTIAN HIEROGLYPH D056 ++ /xf0/x93/x82/xbf EGYPTIAN HIEROGLYPH D057 ++ /xf0/x93/x83/x80 EGYPTIAN HIEROGLYPH D058 ++ /xf0/x93/x83/x81 EGYPTIAN HIEROGLYPH D059 ++ /xf0/x93/x83/x82 EGYPTIAN HIEROGLYPH D060 ++ /xf0/x93/x83/x83 EGYPTIAN HIEROGLYPH D061 ++ /xf0/x93/x83/x84 EGYPTIAN HIEROGLYPH D062 ++ /xf0/x93/x83/x85 EGYPTIAN HIEROGLYPH D063 ++ /xf0/x93/x83/x86 EGYPTIAN HIEROGLYPH D064 ++ /xf0/x93/x83/x87 EGYPTIAN HIEROGLYPH D065 ++ /xf0/x93/x83/x88 EGYPTIAN HIEROGLYPH D066 ++ /xf0/x93/x83/x89 EGYPTIAN HIEROGLYPH D067 ++ /xf0/x93/x83/x8a EGYPTIAN HIEROGLYPH D067A ++ /xf0/x93/x83/x8b EGYPTIAN HIEROGLYPH D067B ++ /xf0/x93/x83/x8c EGYPTIAN HIEROGLYPH D067C ++ /xf0/x93/x83/x8d EGYPTIAN HIEROGLYPH D067D ++ /xf0/x93/x83/x8e EGYPTIAN HIEROGLYPH D067E ++ /xf0/x93/x83/x8f EGYPTIAN HIEROGLYPH D067F ++ /xf0/x93/x83/x90 EGYPTIAN HIEROGLYPH D067G ++ /xf0/x93/x83/x91 EGYPTIAN HIEROGLYPH D067H ++ /xf0/x93/x83/x92 EGYPTIAN HIEROGLYPH E001 ++ /xf0/x93/x83/x93 EGYPTIAN HIEROGLYPH E002 ++ /xf0/x93/x83/x94 EGYPTIAN HIEROGLYPH E003 ++ /xf0/x93/x83/x95 EGYPTIAN HIEROGLYPH E004 ++ /xf0/x93/x83/x96 EGYPTIAN HIEROGLYPH E005 ++ /xf0/x93/x83/x97 EGYPTIAN HIEROGLYPH E006 ++ /xf0/x93/x83/x98 EGYPTIAN HIEROGLYPH E007 ++ /xf0/x93/x83/x99 EGYPTIAN HIEROGLYPH E008 ++ /xf0/x93/x83/x9a EGYPTIAN HIEROGLYPH E008A ++ /xf0/x93/x83/x9b EGYPTIAN HIEROGLYPH E009 ++ /xf0/x93/x83/x9c EGYPTIAN HIEROGLYPH E009A ++ /xf0/x93/x83/x9d EGYPTIAN HIEROGLYPH E010 ++ /xf0/x93/x83/x9e EGYPTIAN HIEROGLYPH E011 ++ /xf0/x93/x83/x9f EGYPTIAN HIEROGLYPH E012 ++ /xf0/x93/x83/xa0 EGYPTIAN HIEROGLYPH E013 ++ /xf0/x93/x83/xa1 EGYPTIAN HIEROGLYPH E014 ++ /xf0/x93/x83/xa2 EGYPTIAN HIEROGLYPH E015 ++ /xf0/x93/x83/xa3 EGYPTIAN HIEROGLYPH E016 ++ /xf0/x93/x83/xa4 EGYPTIAN HIEROGLYPH E016A ++ /xf0/x93/x83/xa5 EGYPTIAN HIEROGLYPH E017 ++ /xf0/x93/x83/xa6 EGYPTIAN HIEROGLYPH E017A ++ /xf0/x93/x83/xa7 EGYPTIAN HIEROGLYPH E018 ++ /xf0/x93/x83/xa8 EGYPTIAN HIEROGLYPH E019 ++ /xf0/x93/x83/xa9 EGYPTIAN HIEROGLYPH E020 ++ /xf0/x93/x83/xaa EGYPTIAN HIEROGLYPH E020A ++ /xf0/x93/x83/xab EGYPTIAN HIEROGLYPH E021 ++ /xf0/x93/x83/xac EGYPTIAN HIEROGLYPH E022 ++ /xf0/x93/x83/xad EGYPTIAN HIEROGLYPH E023 ++ /xf0/x93/x83/xae EGYPTIAN HIEROGLYPH E024 ++ /xf0/x93/x83/xaf EGYPTIAN HIEROGLYPH E025 ++ /xf0/x93/x83/xb0 EGYPTIAN HIEROGLYPH E026 ++ /xf0/x93/x83/xb1 EGYPTIAN HIEROGLYPH E027 ++ /xf0/x93/x83/xb2 EGYPTIAN HIEROGLYPH E028 ++ /xf0/x93/x83/xb3 EGYPTIAN HIEROGLYPH E028A ++ /xf0/x93/x83/xb4 EGYPTIAN HIEROGLYPH E029 ++ /xf0/x93/x83/xb5 EGYPTIAN HIEROGLYPH E030 ++ /xf0/x93/x83/xb6 EGYPTIAN HIEROGLYPH E031 ++ /xf0/x93/x83/xb7 EGYPTIAN HIEROGLYPH E032 ++ /xf0/x93/x83/xb8 EGYPTIAN HIEROGLYPH E033 ++ /xf0/x93/x83/xb9 EGYPTIAN HIEROGLYPH E034 ++ /xf0/x93/x83/xba EGYPTIAN HIEROGLYPH E034A ++ /xf0/x93/x83/xbb EGYPTIAN HIEROGLYPH E036 ++ /xf0/x93/x83/xbc EGYPTIAN HIEROGLYPH E037 ++ /xf0/x93/x83/xbd EGYPTIAN HIEROGLYPH E038 ++ /xf0/x93/x83/xbe EGYPTIAN HIEROGLYPH F001 ++ /xf0/x93/x83/xbf EGYPTIAN HIEROGLYPH F001A ++ /xf0/x93/x84/x80 EGYPTIAN HIEROGLYPH F002 ++ /xf0/x93/x84/x81 EGYPTIAN HIEROGLYPH F003 ++ /xf0/x93/x84/x82 EGYPTIAN HIEROGLYPH F004 ++ /xf0/x93/x84/x83 EGYPTIAN HIEROGLYPH F005 ++ /xf0/x93/x84/x84 EGYPTIAN HIEROGLYPH F006 ++ /xf0/x93/x84/x85 EGYPTIAN HIEROGLYPH F007 ++ /xf0/x93/x84/x86 EGYPTIAN HIEROGLYPH F008 ++ /xf0/x93/x84/x87 EGYPTIAN HIEROGLYPH F009 ++ /xf0/x93/x84/x88 EGYPTIAN HIEROGLYPH F010 ++ /xf0/x93/x84/x89 EGYPTIAN HIEROGLYPH F011 ++ /xf0/x93/x84/x8a EGYPTIAN HIEROGLYPH F012 ++ /xf0/x93/x84/x8b EGYPTIAN HIEROGLYPH F013 ++ /xf0/x93/x84/x8c EGYPTIAN HIEROGLYPH F013A ++ /xf0/x93/x84/x8d EGYPTIAN HIEROGLYPH F014 ++ /xf0/x93/x84/x8e EGYPTIAN HIEROGLYPH F015 ++ /xf0/x93/x84/x8f EGYPTIAN HIEROGLYPH F016 ++ /xf0/x93/x84/x90 EGYPTIAN HIEROGLYPH F017 ++ /xf0/x93/x84/x91 EGYPTIAN HIEROGLYPH F018 ++ /xf0/x93/x84/x92 EGYPTIAN HIEROGLYPH F019 ++ /xf0/x93/x84/x93 EGYPTIAN HIEROGLYPH F020 ++ /xf0/x93/x84/x94 EGYPTIAN HIEROGLYPH F021 ++ /xf0/x93/x84/x95 EGYPTIAN HIEROGLYPH F021A ++ /xf0/x93/x84/x96 EGYPTIAN HIEROGLYPH F022 ++ /xf0/x93/x84/x97 EGYPTIAN HIEROGLYPH F023 ++ /xf0/x93/x84/x98 EGYPTIAN HIEROGLYPH F024 ++ /xf0/x93/x84/x99 EGYPTIAN HIEROGLYPH F025 ++ /xf0/x93/x84/x9a EGYPTIAN HIEROGLYPH F026 ++ /xf0/x93/x84/x9b EGYPTIAN HIEROGLYPH F027 ++ /xf0/x93/x84/x9c EGYPTIAN HIEROGLYPH F028 ++ /xf0/x93/x84/x9d EGYPTIAN HIEROGLYPH F029 ++ /xf0/x93/x84/x9e EGYPTIAN HIEROGLYPH F030 ++ /xf0/x93/x84/x9f EGYPTIAN HIEROGLYPH F031 ++ /xf0/x93/x84/xa0 EGYPTIAN HIEROGLYPH F031A ++ /xf0/x93/x84/xa1 EGYPTIAN HIEROGLYPH F032 ++ /xf0/x93/x84/xa2 EGYPTIAN HIEROGLYPH F033 ++ /xf0/x93/x84/xa3 EGYPTIAN HIEROGLYPH F034 ++ /xf0/x93/x84/xa4 EGYPTIAN HIEROGLYPH F035 ++ /xf0/x93/x84/xa5 EGYPTIAN HIEROGLYPH F036 ++ /xf0/x93/x84/xa6 EGYPTIAN HIEROGLYPH F037 ++ /xf0/x93/x84/xa7 EGYPTIAN HIEROGLYPH F037A ++ /xf0/x93/x84/xa8 EGYPTIAN HIEROGLYPH F038 ++ /xf0/x93/x84/xa9 EGYPTIAN HIEROGLYPH F038A ++ /xf0/x93/x84/xaa EGYPTIAN HIEROGLYPH F039 ++ /xf0/x93/x84/xab EGYPTIAN HIEROGLYPH F040 ++ /xf0/x93/x84/xac EGYPTIAN HIEROGLYPH F041 ++ /xf0/x93/x84/xad EGYPTIAN HIEROGLYPH F042 ++ /xf0/x93/x84/xae EGYPTIAN HIEROGLYPH F043 ++ /xf0/x93/x84/xaf EGYPTIAN HIEROGLYPH F044 ++ /xf0/x93/x84/xb0 EGYPTIAN HIEROGLYPH F045 ++ /xf0/x93/x84/xb1 EGYPTIAN HIEROGLYPH F045A ++ /xf0/x93/x84/xb2 EGYPTIAN HIEROGLYPH F046 ++ /xf0/x93/x84/xb3 EGYPTIAN HIEROGLYPH F046A ++ /xf0/x93/x84/xb4 EGYPTIAN HIEROGLYPH F047 ++ /xf0/x93/x84/xb5 EGYPTIAN HIEROGLYPH F047A ++ /xf0/x93/x84/xb6 EGYPTIAN HIEROGLYPH F048 ++ /xf0/x93/x84/xb7 EGYPTIAN HIEROGLYPH F049 ++ /xf0/x93/x84/xb8 EGYPTIAN HIEROGLYPH F050 ++ /xf0/x93/x84/xb9 EGYPTIAN HIEROGLYPH F051 ++ /xf0/x93/x84/xba EGYPTIAN HIEROGLYPH F051A ++ /xf0/x93/x84/xbb EGYPTIAN HIEROGLYPH F051B ++ /xf0/x93/x84/xbc EGYPTIAN HIEROGLYPH F051C ++ /xf0/x93/x84/xbd EGYPTIAN HIEROGLYPH F052 ++ /xf0/x93/x84/xbe EGYPTIAN HIEROGLYPH F053 ++ /xf0/x93/x84/xbf EGYPTIAN HIEROGLYPH G001 ++ /xf0/x93/x85/x80 EGYPTIAN HIEROGLYPH G002 ++ /xf0/x93/x85/x81 EGYPTIAN HIEROGLYPH G003 ++ /xf0/x93/x85/x82 EGYPTIAN HIEROGLYPH G004 ++ /xf0/x93/x85/x83 EGYPTIAN HIEROGLYPH G005 ++ /xf0/x93/x85/x84 EGYPTIAN HIEROGLYPH G006 ++ /xf0/x93/x85/x85 EGYPTIAN HIEROGLYPH G006A ++ /xf0/x93/x85/x86 EGYPTIAN HIEROGLYPH G007 ++ /xf0/x93/x85/x87 EGYPTIAN HIEROGLYPH G007A ++ /xf0/x93/x85/x88 EGYPTIAN HIEROGLYPH G007B ++ /xf0/x93/x85/x89 EGYPTIAN HIEROGLYPH G008 ++ /xf0/x93/x85/x8a EGYPTIAN HIEROGLYPH G009 ++ /xf0/x93/x85/x8b EGYPTIAN HIEROGLYPH G010 ++ /xf0/x93/x85/x8c EGYPTIAN HIEROGLYPH G011 ++ /xf0/x93/x85/x8d EGYPTIAN HIEROGLYPH G011A ++ /xf0/x93/x85/x8e EGYPTIAN HIEROGLYPH G012 ++ /xf0/x93/x85/x8f EGYPTIAN HIEROGLYPH G013 ++ /xf0/x93/x85/x90 EGYPTIAN HIEROGLYPH G014 ++ /xf0/x93/x85/x91 EGYPTIAN HIEROGLYPH G015 ++ /xf0/x93/x85/x92 EGYPTIAN HIEROGLYPH G016 ++ /xf0/x93/x85/x93 EGYPTIAN HIEROGLYPH G017 ++ /xf0/x93/x85/x94 EGYPTIAN HIEROGLYPH G018 ++ /xf0/x93/x85/x95 EGYPTIAN HIEROGLYPH G019 ++ /xf0/x93/x85/x96 EGYPTIAN HIEROGLYPH G020 ++ /xf0/x93/x85/x97 EGYPTIAN HIEROGLYPH G020A ++ /xf0/x93/x85/x98 EGYPTIAN HIEROGLYPH G021 ++ /xf0/x93/x85/x99 EGYPTIAN HIEROGLYPH G022 ++ /xf0/x93/x85/x9a EGYPTIAN HIEROGLYPH G023 ++ /xf0/x93/x85/x9b EGYPTIAN HIEROGLYPH G024 ++ /xf0/x93/x85/x9c EGYPTIAN HIEROGLYPH G025 ++ /xf0/x93/x85/x9d EGYPTIAN HIEROGLYPH G026 ++ /xf0/x93/x85/x9e EGYPTIAN HIEROGLYPH G026A ++ /xf0/x93/x85/x9f EGYPTIAN HIEROGLYPH G027 ++ /xf0/x93/x85/xa0 EGYPTIAN HIEROGLYPH G028 ++ /xf0/x93/x85/xa1 EGYPTIAN HIEROGLYPH G029 ++ /xf0/x93/x85/xa2 EGYPTIAN HIEROGLYPH G030 ++ /xf0/x93/x85/xa3 EGYPTIAN HIEROGLYPH G031 ++ /xf0/x93/x85/xa4 EGYPTIAN HIEROGLYPH G032 ++ /xf0/x93/x85/xa5 EGYPTIAN HIEROGLYPH G033 ++ /xf0/x93/x85/xa6 EGYPTIAN HIEROGLYPH G034 ++ /xf0/x93/x85/xa7 EGYPTIAN HIEROGLYPH G035 ++ /xf0/x93/x85/xa8 EGYPTIAN HIEROGLYPH G036 ++ /xf0/x93/x85/xa9 EGYPTIAN HIEROGLYPH G036A ++ /xf0/x93/x85/xaa EGYPTIAN HIEROGLYPH G037 ++ /xf0/x93/x85/xab EGYPTIAN HIEROGLYPH G037A ++ /xf0/x93/x85/xac EGYPTIAN HIEROGLYPH G038 ++ /xf0/x93/x85/xad EGYPTIAN HIEROGLYPH G039 ++ /xf0/x93/x85/xae EGYPTIAN HIEROGLYPH G040 ++ /xf0/x93/x85/xaf EGYPTIAN HIEROGLYPH G041 ++ /xf0/x93/x85/xb0 EGYPTIAN HIEROGLYPH G042 ++ /xf0/x93/x85/xb1 EGYPTIAN HIEROGLYPH G043 ++ /xf0/x93/x85/xb2 EGYPTIAN HIEROGLYPH G043A ++ /xf0/x93/x85/xb3 EGYPTIAN HIEROGLYPH G044 ++ /xf0/x93/x85/xb4 EGYPTIAN HIEROGLYPH G045 ++ /xf0/x93/x85/xb5 EGYPTIAN HIEROGLYPH G045A ++ /xf0/x93/x85/xb6 EGYPTIAN HIEROGLYPH G046 ++ /xf0/x93/x85/xb7 EGYPTIAN HIEROGLYPH G047 ++ /xf0/x93/x85/xb8 EGYPTIAN HIEROGLYPH G048 ++ /xf0/x93/x85/xb9 EGYPTIAN HIEROGLYPH G049 ++ /xf0/x93/x85/xba EGYPTIAN HIEROGLYPH G050 ++ /xf0/x93/x85/xbb EGYPTIAN HIEROGLYPH G051 ++ /xf0/x93/x85/xbc EGYPTIAN HIEROGLYPH G052 ++ /xf0/x93/x85/xbd EGYPTIAN HIEROGLYPH G053 ++ /xf0/x93/x85/xbe EGYPTIAN HIEROGLYPH G054 ++ /xf0/x93/x85/xbf EGYPTIAN HIEROGLYPH H001 ++ /xf0/x93/x86/x80 EGYPTIAN HIEROGLYPH H002 ++ /xf0/x93/x86/x81 EGYPTIAN HIEROGLYPH H003 ++ /xf0/x93/x86/x82 EGYPTIAN HIEROGLYPH H004 ++ /xf0/x93/x86/x83 EGYPTIAN HIEROGLYPH H005 ++ /xf0/x93/x86/x84 EGYPTIAN HIEROGLYPH H006 ++ /xf0/x93/x86/x85 EGYPTIAN HIEROGLYPH H006A ++ /xf0/x93/x86/x86 EGYPTIAN HIEROGLYPH H007 ++ /xf0/x93/x86/x87 EGYPTIAN HIEROGLYPH H008 ++ /xf0/x93/x86/x88 EGYPTIAN HIEROGLYPH I001 ++ /xf0/x93/x86/x89 EGYPTIAN HIEROGLYPH I002 ++ /xf0/x93/x86/x8a EGYPTIAN HIEROGLYPH I003 ++ /xf0/x93/x86/x8b EGYPTIAN HIEROGLYPH I004 ++ /xf0/x93/x86/x8c EGYPTIAN HIEROGLYPH I005 ++ /xf0/x93/x86/x8d EGYPTIAN HIEROGLYPH I005A ++ /xf0/x93/x86/x8e EGYPTIAN HIEROGLYPH I006 ++ /xf0/x93/x86/x8f EGYPTIAN HIEROGLYPH I007 ++ /xf0/x93/x86/x90 EGYPTIAN HIEROGLYPH I008 ++ /xf0/x93/x86/x91 EGYPTIAN HIEROGLYPH I009 ++ /xf0/x93/x86/x92 EGYPTIAN HIEROGLYPH I009A ++ /xf0/x93/x86/x93 EGYPTIAN HIEROGLYPH I010 ++ /xf0/x93/x86/x94 EGYPTIAN HIEROGLYPH I010A ++ /xf0/x93/x86/x95 EGYPTIAN HIEROGLYPH I011 ++ /xf0/x93/x86/x96 EGYPTIAN HIEROGLYPH I011A ++ /xf0/x93/x86/x97 EGYPTIAN HIEROGLYPH I012 ++ /xf0/x93/x86/x98 EGYPTIAN HIEROGLYPH I013 ++ /xf0/x93/x86/x99 EGYPTIAN HIEROGLYPH I014 ++ /xf0/x93/x86/x9a EGYPTIAN HIEROGLYPH I015 ++ /xf0/x93/x86/x9b EGYPTIAN HIEROGLYPH K001 ++ /xf0/x93/x86/x9c EGYPTIAN HIEROGLYPH K002 ++ /xf0/x93/x86/x9d EGYPTIAN HIEROGLYPH K003 ++ /xf0/x93/x86/x9e EGYPTIAN HIEROGLYPH K004 ++ /xf0/x93/x86/x9f EGYPTIAN HIEROGLYPH K005 ++ /xf0/x93/x86/xa0 EGYPTIAN HIEROGLYPH K006 ++ /xf0/x93/x86/xa1 EGYPTIAN HIEROGLYPH K007 ++ /xf0/x93/x86/xa2 EGYPTIAN HIEROGLYPH K008 ++ /xf0/x93/x86/xa3 EGYPTIAN HIEROGLYPH L001 ++ /xf0/x93/x86/xa4 EGYPTIAN HIEROGLYPH L002 ++ /xf0/x93/x86/xa5 EGYPTIAN HIEROGLYPH L002A ++ /xf0/x93/x86/xa6 EGYPTIAN HIEROGLYPH L003 ++ /xf0/x93/x86/xa7 EGYPTIAN HIEROGLYPH L004 ++ /xf0/x93/x86/xa8 EGYPTIAN HIEROGLYPH L005 ++ /xf0/x93/x86/xa9 EGYPTIAN HIEROGLYPH L006 ++ /xf0/x93/x86/xaa EGYPTIAN HIEROGLYPH L006A ++ /xf0/x93/x86/xab EGYPTIAN HIEROGLYPH L007 ++ /xf0/x93/x86/xac EGYPTIAN HIEROGLYPH L008 ++ /xf0/x93/x86/xad EGYPTIAN HIEROGLYPH M001 ++ /xf0/x93/x86/xae EGYPTIAN HIEROGLYPH M001A ++ /xf0/x93/x86/xaf EGYPTIAN HIEROGLYPH M001B ++ /xf0/x93/x86/xb0 EGYPTIAN HIEROGLYPH M002 ++ /xf0/x93/x86/xb1 EGYPTIAN HIEROGLYPH M003 ++ /xf0/x93/x86/xb2 EGYPTIAN HIEROGLYPH M003A ++ /xf0/x93/x86/xb3 EGYPTIAN HIEROGLYPH M004 ++ /xf0/x93/x86/xb4 EGYPTIAN HIEROGLYPH M005 ++ /xf0/x93/x86/xb5 EGYPTIAN HIEROGLYPH M006 ++ /xf0/x93/x86/xb6 EGYPTIAN HIEROGLYPH M007 ++ /xf0/x93/x86/xb7 EGYPTIAN HIEROGLYPH M008 ++ /xf0/x93/x86/xb8 EGYPTIAN HIEROGLYPH M009 ++ /xf0/x93/x86/xb9 EGYPTIAN HIEROGLYPH M010 ++ /xf0/x93/x86/xba EGYPTIAN HIEROGLYPH M010A ++ /xf0/x93/x86/xbb EGYPTIAN HIEROGLYPH M011 ++ /xf0/x93/x86/xbc EGYPTIAN HIEROGLYPH M012 ++ /xf0/x93/x86/xbd EGYPTIAN HIEROGLYPH M012A ++ /xf0/x93/x86/xbe EGYPTIAN HIEROGLYPH M012B ++ /xf0/x93/x86/xbf EGYPTIAN HIEROGLYPH M012C ++ /xf0/x93/x87/x80 EGYPTIAN HIEROGLYPH M012D ++ /xf0/x93/x87/x81 EGYPTIAN HIEROGLYPH M012E ++ /xf0/x93/x87/x82 EGYPTIAN HIEROGLYPH M012F ++ /xf0/x93/x87/x83 EGYPTIAN HIEROGLYPH M012G ++ /xf0/x93/x87/x84 EGYPTIAN HIEROGLYPH M012H ++ /xf0/x93/x87/x85 EGYPTIAN HIEROGLYPH M013 ++ /xf0/x93/x87/x86 EGYPTIAN HIEROGLYPH M014 ++ /xf0/x93/x87/x87 EGYPTIAN HIEROGLYPH M015 ++ /xf0/x93/x87/x88 EGYPTIAN HIEROGLYPH M015A ++ /xf0/x93/x87/x89 EGYPTIAN HIEROGLYPH M016 ++ /xf0/x93/x87/x8a EGYPTIAN HIEROGLYPH M016A ++ /xf0/x93/x87/x8b EGYPTIAN HIEROGLYPH M017 ++ /xf0/x93/x87/x8c EGYPTIAN HIEROGLYPH M017A ++ /xf0/x93/x87/x8d EGYPTIAN HIEROGLYPH M018 ++ /xf0/x93/x87/x8e EGYPTIAN HIEROGLYPH M019 ++ /xf0/x93/x87/x8f EGYPTIAN HIEROGLYPH M020 ++ /xf0/x93/x87/x90 EGYPTIAN HIEROGLYPH M021 ++ /xf0/x93/x87/x91 EGYPTIAN HIEROGLYPH M022 ++ /xf0/x93/x87/x92 EGYPTIAN HIEROGLYPH M022A ++ /xf0/x93/x87/x93 EGYPTIAN HIEROGLYPH M023 ++ /xf0/x93/x87/x94 EGYPTIAN HIEROGLYPH M024 ++ /xf0/x93/x87/x95 EGYPTIAN HIEROGLYPH M024A ++ /xf0/x93/x87/x96 EGYPTIAN HIEROGLYPH M025 ++ /xf0/x93/x87/x97 EGYPTIAN HIEROGLYPH M026 ++ /xf0/x93/x87/x98 EGYPTIAN HIEROGLYPH M027 ++ /xf0/x93/x87/x99 EGYPTIAN HIEROGLYPH M028 ++ /xf0/x93/x87/x9a EGYPTIAN HIEROGLYPH M028A ++ /xf0/x93/x87/x9b EGYPTIAN HIEROGLYPH M029 ++ /xf0/x93/x87/x9c EGYPTIAN HIEROGLYPH M030 ++ /xf0/x93/x87/x9d EGYPTIAN HIEROGLYPH M031 ++ /xf0/x93/x87/x9e EGYPTIAN HIEROGLYPH M031A ++ /xf0/x93/x87/x9f EGYPTIAN HIEROGLYPH M032 ++ /xf0/x93/x87/xa0 EGYPTIAN HIEROGLYPH M033 ++ /xf0/x93/x87/xa1 EGYPTIAN HIEROGLYPH M033A ++ /xf0/x93/x87/xa2 EGYPTIAN HIEROGLYPH M033B ++ /xf0/x93/x87/xa3 EGYPTIAN HIEROGLYPH M034 ++ /xf0/x93/x87/xa4 EGYPTIAN HIEROGLYPH M035 ++ /xf0/x93/x87/xa5 EGYPTIAN HIEROGLYPH M036 ++ /xf0/x93/x87/xa6 EGYPTIAN HIEROGLYPH M037 ++ /xf0/x93/x87/xa7 EGYPTIAN HIEROGLYPH M038 ++ /xf0/x93/x87/xa8 EGYPTIAN HIEROGLYPH M039 ++ /xf0/x93/x87/xa9 EGYPTIAN HIEROGLYPH M040 ++ /xf0/x93/x87/xaa EGYPTIAN HIEROGLYPH M040A ++ /xf0/x93/x87/xab EGYPTIAN HIEROGLYPH M041 ++ /xf0/x93/x87/xac EGYPTIAN HIEROGLYPH M042 ++ /xf0/x93/x87/xad EGYPTIAN HIEROGLYPH M043 ++ /xf0/x93/x87/xae EGYPTIAN HIEROGLYPH M044 ++ /xf0/x93/x87/xaf EGYPTIAN HIEROGLYPH N001 ++ /xf0/x93/x87/xb0 EGYPTIAN HIEROGLYPH N002 ++ /xf0/x93/x87/xb1 EGYPTIAN HIEROGLYPH N003 ++ /xf0/x93/x87/xb2 EGYPTIAN HIEROGLYPH N004 ++ /xf0/x93/x87/xb3 EGYPTIAN HIEROGLYPH N005 ++ /xf0/x93/x87/xb4 EGYPTIAN HIEROGLYPH N006 ++ /xf0/x93/x87/xb5 EGYPTIAN HIEROGLYPH N007 ++ /xf0/x93/x87/xb6 EGYPTIAN HIEROGLYPH N008 ++ /xf0/x93/x87/xb7 EGYPTIAN HIEROGLYPH N009 ++ /xf0/x93/x87/xb8 EGYPTIAN HIEROGLYPH N010 ++ /xf0/x93/x87/xb9 EGYPTIAN HIEROGLYPH N011 ++ /xf0/x93/x87/xba EGYPTIAN HIEROGLYPH N012 ++ /xf0/x93/x87/xbb EGYPTIAN HIEROGLYPH N013 ++ /xf0/x93/x87/xbc EGYPTIAN HIEROGLYPH N014 ++ /xf0/x93/x87/xbd EGYPTIAN HIEROGLYPH N015 ++ /xf0/x93/x87/xbe EGYPTIAN HIEROGLYPH N016 ++ /xf0/x93/x87/xbf EGYPTIAN HIEROGLYPH N017 ++ /xf0/x93/x88/x80 EGYPTIAN HIEROGLYPH N018 ++ /xf0/x93/x88/x81 EGYPTIAN HIEROGLYPH N018A ++ /xf0/x93/x88/x82 EGYPTIAN HIEROGLYPH N018B ++ /xf0/x93/x88/x83 EGYPTIAN HIEROGLYPH N019 ++ /xf0/x93/x88/x84 EGYPTIAN HIEROGLYPH N020 ++ /xf0/x93/x88/x85 EGYPTIAN HIEROGLYPH N021 ++ /xf0/x93/x88/x86 EGYPTIAN HIEROGLYPH N022 ++ /xf0/x93/x88/x87 EGYPTIAN HIEROGLYPH N023 ++ /xf0/x93/x88/x88 EGYPTIAN HIEROGLYPH N024 ++ /xf0/x93/x88/x89 EGYPTIAN HIEROGLYPH N025 ++ /xf0/x93/x88/x8a EGYPTIAN HIEROGLYPH N025A ++ /xf0/x93/x88/x8b EGYPTIAN HIEROGLYPH N026 ++ /xf0/x93/x88/x8c EGYPTIAN HIEROGLYPH N027 ++ /xf0/x93/x88/x8d EGYPTIAN HIEROGLYPH N028 ++ /xf0/x93/x88/x8e EGYPTIAN HIEROGLYPH N029 ++ /xf0/x93/x88/x8f EGYPTIAN HIEROGLYPH N030 ++ /xf0/x93/x88/x90 EGYPTIAN HIEROGLYPH N031 ++ /xf0/x93/x88/x91 EGYPTIAN HIEROGLYPH N032 ++ /xf0/x93/x88/x92 EGYPTIAN HIEROGLYPH N033 ++ /xf0/x93/x88/x93 EGYPTIAN HIEROGLYPH N033A ++ /xf0/x93/x88/x94 EGYPTIAN HIEROGLYPH N034 ++ /xf0/x93/x88/x95 EGYPTIAN HIEROGLYPH N034A ++ /xf0/x93/x88/x96 EGYPTIAN HIEROGLYPH N035 ++ /xf0/x93/x88/x97 EGYPTIAN HIEROGLYPH N035A ++ /xf0/x93/x88/x98 EGYPTIAN HIEROGLYPH N036 ++ /xf0/x93/x88/x99 EGYPTIAN HIEROGLYPH N037 ++ /xf0/x93/x88/x9a EGYPTIAN HIEROGLYPH N037A ++ /xf0/x93/x88/x9b EGYPTIAN HIEROGLYPH N038 ++ /xf0/x93/x88/x9c EGYPTIAN HIEROGLYPH N039 ++ /xf0/x93/x88/x9d EGYPTIAN HIEROGLYPH N040 ++ /xf0/x93/x88/x9e EGYPTIAN HIEROGLYPH N041 ++ /xf0/x93/x88/x9f EGYPTIAN HIEROGLYPH N042 ++ /xf0/x93/x88/xa0 EGYPTIAN HIEROGLYPH NL001 ++ /xf0/x93/x88/xa1 EGYPTIAN HIEROGLYPH NL002 ++ /xf0/x93/x88/xa2 EGYPTIAN HIEROGLYPH NL003 ++ /xf0/x93/x88/xa3 EGYPTIAN HIEROGLYPH NL004 ++ /xf0/x93/x88/xa4 EGYPTIAN HIEROGLYPH NL005 ++ /xf0/x93/x88/xa5 EGYPTIAN HIEROGLYPH NL005A ++ /xf0/x93/x88/xa6 EGYPTIAN HIEROGLYPH NL006 ++ /xf0/x93/x88/xa7 EGYPTIAN HIEROGLYPH NL007 ++ /xf0/x93/x88/xa8 EGYPTIAN HIEROGLYPH NL008 ++ /xf0/x93/x88/xa9 EGYPTIAN HIEROGLYPH NL009 ++ /xf0/x93/x88/xaa EGYPTIAN HIEROGLYPH NL010 ++ /xf0/x93/x88/xab EGYPTIAN HIEROGLYPH NL011 ++ /xf0/x93/x88/xac EGYPTIAN HIEROGLYPH NL012 ++ /xf0/x93/x88/xad EGYPTIAN HIEROGLYPH NL013 ++ /xf0/x93/x88/xae EGYPTIAN HIEROGLYPH NL014 ++ /xf0/x93/x88/xaf EGYPTIAN HIEROGLYPH NL015 ++ /xf0/x93/x88/xb0 EGYPTIAN HIEROGLYPH NL016 ++ /xf0/x93/x88/xb1 EGYPTIAN HIEROGLYPH NL017 ++ /xf0/x93/x88/xb2 EGYPTIAN HIEROGLYPH NL017A ++ /xf0/x93/x88/xb3 EGYPTIAN HIEROGLYPH NL018 ++ /xf0/x93/x88/xb4 EGYPTIAN HIEROGLYPH NL019 ++ /xf0/x93/x88/xb5 EGYPTIAN HIEROGLYPH NL020 ++ /xf0/x93/x88/xb6 EGYPTIAN HIEROGLYPH NU001 ++ /xf0/x93/x88/xb7 EGYPTIAN HIEROGLYPH NU002 ++ /xf0/x93/x88/xb8 EGYPTIAN HIEROGLYPH NU003 ++ /xf0/x93/x88/xb9 EGYPTIAN HIEROGLYPH NU004 ++ /xf0/x93/x88/xba EGYPTIAN HIEROGLYPH NU005 ++ /xf0/x93/x88/xbb EGYPTIAN HIEROGLYPH NU006 ++ /xf0/x93/x88/xbc EGYPTIAN HIEROGLYPH NU007 ++ /xf0/x93/x88/xbd EGYPTIAN HIEROGLYPH NU008 ++ /xf0/x93/x88/xbe EGYPTIAN HIEROGLYPH NU009 ++ /xf0/x93/x88/xbf EGYPTIAN HIEROGLYPH NU010 ++ /xf0/x93/x89/x80 EGYPTIAN HIEROGLYPH NU010A ++ /xf0/x93/x89/x81 EGYPTIAN HIEROGLYPH NU011 ++ /xf0/x93/x89/x82 EGYPTIAN HIEROGLYPH NU011A ++ /xf0/x93/x89/x83 EGYPTIAN HIEROGLYPH NU012 ++ /xf0/x93/x89/x84 EGYPTIAN HIEROGLYPH NU013 ++ /xf0/x93/x89/x85 EGYPTIAN HIEROGLYPH NU014 ++ /xf0/x93/x89/x86 EGYPTIAN HIEROGLYPH NU015 ++ /xf0/x93/x89/x87 EGYPTIAN HIEROGLYPH NU016 ++ /xf0/x93/x89/x88 EGYPTIAN HIEROGLYPH NU017 ++ /xf0/x93/x89/x89 EGYPTIAN HIEROGLYPH NU018 ++ /xf0/x93/x89/x8a EGYPTIAN HIEROGLYPH NU018A ++ /xf0/x93/x89/x8b EGYPTIAN HIEROGLYPH NU019 ++ /xf0/x93/x89/x8c EGYPTIAN HIEROGLYPH NU020 ++ /xf0/x93/x89/x8d EGYPTIAN HIEROGLYPH NU021 ++ /xf0/x93/x89/x8e EGYPTIAN HIEROGLYPH NU022 ++ /xf0/x93/x89/x8f EGYPTIAN HIEROGLYPH NU022A ++ /xf0/x93/x89/x90 EGYPTIAN HIEROGLYPH O001 ++ /xf0/x93/x89/x91 EGYPTIAN HIEROGLYPH O001A ++ /xf0/x93/x89/x92 EGYPTIAN HIEROGLYPH O002 ++ /xf0/x93/x89/x93 EGYPTIAN HIEROGLYPH O003 ++ /xf0/x93/x89/x94 EGYPTIAN HIEROGLYPH O004 ++ /xf0/x93/x89/x95 EGYPTIAN HIEROGLYPH O005 ++ /xf0/x93/x89/x96 EGYPTIAN HIEROGLYPH O005A ++ /xf0/x93/x89/x97 EGYPTIAN HIEROGLYPH O006 ++ /xf0/x93/x89/x98 EGYPTIAN HIEROGLYPH O006A ++ /xf0/x93/x89/x99 EGYPTIAN HIEROGLYPH O006B ++ /xf0/x93/x89/x9a EGYPTIAN HIEROGLYPH O006C ++ /xf0/x93/x89/x9b EGYPTIAN HIEROGLYPH O006D ++ /xf0/x93/x89/x9c EGYPTIAN HIEROGLYPH O006E ++ /xf0/x93/x89/x9d EGYPTIAN HIEROGLYPH O006F ++ /xf0/x93/x89/x9e EGYPTIAN HIEROGLYPH O007 ++ /xf0/x93/x89/x9f EGYPTIAN HIEROGLYPH O008 ++ /xf0/x93/x89/xa0 EGYPTIAN HIEROGLYPH O009 ++ /xf0/x93/x89/xa1 EGYPTIAN HIEROGLYPH O010 ++ /xf0/x93/x89/xa2 EGYPTIAN HIEROGLYPH O010A ++ /xf0/x93/x89/xa3 EGYPTIAN HIEROGLYPH O010B ++ /xf0/x93/x89/xa4 EGYPTIAN HIEROGLYPH O010C ++ /xf0/x93/x89/xa5 EGYPTIAN HIEROGLYPH O011 ++ /xf0/x93/x89/xa6 EGYPTIAN HIEROGLYPH O012 ++ /xf0/x93/x89/xa7 EGYPTIAN HIEROGLYPH O013 ++ /xf0/x93/x89/xa8 EGYPTIAN HIEROGLYPH O014 ++ /xf0/x93/x89/xa9 EGYPTIAN HIEROGLYPH O015 ++ /xf0/x93/x89/xaa EGYPTIAN HIEROGLYPH O016 ++ /xf0/x93/x89/xab EGYPTIAN HIEROGLYPH O017 ++ /xf0/x93/x89/xac EGYPTIAN HIEROGLYPH O018 ++ /xf0/x93/x89/xad EGYPTIAN HIEROGLYPH O019 ++ /xf0/x93/x89/xae EGYPTIAN HIEROGLYPH O019A ++ /xf0/x93/x89/xaf EGYPTIAN HIEROGLYPH O020 ++ /xf0/x93/x89/xb0 EGYPTIAN HIEROGLYPH O020A ++ /xf0/x93/x89/xb1 EGYPTIAN HIEROGLYPH O021 ++ /xf0/x93/x89/xb2 EGYPTIAN HIEROGLYPH O022 ++ /xf0/x93/x89/xb3 EGYPTIAN HIEROGLYPH O023 ++ /xf0/x93/x89/xb4 EGYPTIAN HIEROGLYPH O024 ++ /xf0/x93/x89/xb5 EGYPTIAN HIEROGLYPH O024A ++ /xf0/x93/x89/xb6 EGYPTIAN HIEROGLYPH O025 ++ /xf0/x93/x89/xb7 EGYPTIAN HIEROGLYPH O025A ++ /xf0/x93/x89/xb8 EGYPTIAN HIEROGLYPH O026 ++ /xf0/x93/x89/xb9 EGYPTIAN HIEROGLYPH O027 ++ /xf0/x93/x89/xba EGYPTIAN HIEROGLYPH O028 ++ /xf0/x93/x89/xbb EGYPTIAN HIEROGLYPH O029 ++ /xf0/x93/x89/xbc EGYPTIAN HIEROGLYPH O029A ++ /xf0/x93/x89/xbd EGYPTIAN HIEROGLYPH O030 ++ /xf0/x93/x89/xbe EGYPTIAN HIEROGLYPH O030A ++ /xf0/x93/x89/xbf EGYPTIAN HIEROGLYPH O031 ++ /xf0/x93/x8a/x80 EGYPTIAN HIEROGLYPH O032 ++ /xf0/x93/x8a/x81 EGYPTIAN HIEROGLYPH O033 ++ /xf0/x93/x8a/x82 EGYPTIAN HIEROGLYPH O033A ++ /xf0/x93/x8a/x83 EGYPTIAN HIEROGLYPH O034 ++ /xf0/x93/x8a/x84 EGYPTIAN HIEROGLYPH O035 ++ /xf0/x93/x8a/x85 EGYPTIAN HIEROGLYPH O036 ++ /xf0/x93/x8a/x86 EGYPTIAN HIEROGLYPH O036A ++ /xf0/x93/x8a/x87 EGYPTIAN HIEROGLYPH O036B ++ /xf0/x93/x8a/x88 EGYPTIAN HIEROGLYPH O036C ++ /xf0/x93/x8a/x89 EGYPTIAN HIEROGLYPH O036D ++ /xf0/x93/x8a/x8a EGYPTIAN HIEROGLYPH O037 ++ /xf0/x93/x8a/x8b EGYPTIAN HIEROGLYPH O038 ++ /xf0/x93/x8a/x8c EGYPTIAN HIEROGLYPH O039 ++ /xf0/x93/x8a/x8d EGYPTIAN HIEROGLYPH O040 ++ /xf0/x93/x8a/x8e EGYPTIAN HIEROGLYPH O041 ++ /xf0/x93/x8a/x8f EGYPTIAN HIEROGLYPH O042 ++ /xf0/x93/x8a/x90 EGYPTIAN HIEROGLYPH O043 ++ /xf0/x93/x8a/x91 EGYPTIAN HIEROGLYPH O044 ++ /xf0/x93/x8a/x92 EGYPTIAN HIEROGLYPH O045 ++ /xf0/x93/x8a/x93 EGYPTIAN HIEROGLYPH O046 ++ /xf0/x93/x8a/x94 EGYPTIAN HIEROGLYPH O047 ++ /xf0/x93/x8a/x95 EGYPTIAN HIEROGLYPH O048 ++ /xf0/x93/x8a/x96 EGYPTIAN HIEROGLYPH O049 ++ /xf0/x93/x8a/x97 EGYPTIAN HIEROGLYPH O050 ++ /xf0/x93/x8a/x98 EGYPTIAN HIEROGLYPH O050A ++ /xf0/x93/x8a/x99 EGYPTIAN HIEROGLYPH O050B ++ /xf0/x93/x8a/x9a EGYPTIAN HIEROGLYPH O051 ++ /xf0/x93/x8a/x9b EGYPTIAN HIEROGLYPH P001 ++ /xf0/x93/x8a/x9c EGYPTIAN HIEROGLYPH P001A ++ /xf0/x93/x8a/x9d EGYPTIAN HIEROGLYPH P002 ++ /xf0/x93/x8a/x9e EGYPTIAN HIEROGLYPH P003 ++ /xf0/x93/x8a/x9f EGYPTIAN HIEROGLYPH P003A ++ /xf0/x93/x8a/xa0 EGYPTIAN HIEROGLYPH P004 ++ /xf0/x93/x8a/xa1 EGYPTIAN HIEROGLYPH P005 ++ /xf0/x93/x8a/xa2 EGYPTIAN HIEROGLYPH P006 ++ /xf0/x93/x8a/xa3 EGYPTIAN HIEROGLYPH P007 ++ /xf0/x93/x8a/xa4 EGYPTIAN HIEROGLYPH P008 ++ /xf0/x93/x8a/xa5 EGYPTIAN HIEROGLYPH P009 ++ /xf0/x93/x8a/xa6 EGYPTIAN HIEROGLYPH P010 ++ /xf0/x93/x8a/xa7 EGYPTIAN HIEROGLYPH P011 ++ /xf0/x93/x8a/xa8 EGYPTIAN HIEROGLYPH Q001 ++ /xf0/x93/x8a/xa9 EGYPTIAN HIEROGLYPH Q002 ++ /xf0/x93/x8a/xaa EGYPTIAN HIEROGLYPH Q003 ++ /xf0/x93/x8a/xab EGYPTIAN HIEROGLYPH Q004 ++ /xf0/x93/x8a/xac EGYPTIAN HIEROGLYPH Q005 ++ /xf0/x93/x8a/xad EGYPTIAN HIEROGLYPH Q006 ++ /xf0/x93/x8a/xae EGYPTIAN HIEROGLYPH Q007 ++ /xf0/x93/x8a/xaf EGYPTIAN HIEROGLYPH R001 ++ /xf0/x93/x8a/xb0 EGYPTIAN HIEROGLYPH R002 ++ /xf0/x93/x8a/xb1 EGYPTIAN HIEROGLYPH R002A ++ /xf0/x93/x8a/xb2 EGYPTIAN HIEROGLYPH R003 ++ /xf0/x93/x8a/xb3 EGYPTIAN HIEROGLYPH R003A ++ /xf0/x93/x8a/xb4 EGYPTIAN HIEROGLYPH R003B ++ /xf0/x93/x8a/xb5 EGYPTIAN HIEROGLYPH R004 ++ /xf0/x93/x8a/xb6 EGYPTIAN HIEROGLYPH R005 ++ /xf0/x93/x8a/xb7 EGYPTIAN HIEROGLYPH R006 ++ /xf0/x93/x8a/xb8 EGYPTIAN HIEROGLYPH R007 ++ /xf0/x93/x8a/xb9 EGYPTIAN HIEROGLYPH R008 ++ /xf0/x93/x8a/xba EGYPTIAN HIEROGLYPH R009 ++ /xf0/x93/x8a/xbb EGYPTIAN HIEROGLYPH R010 ++ /xf0/x93/x8a/xbc EGYPTIAN HIEROGLYPH R010A ++ /xf0/x93/x8a/xbd EGYPTIAN HIEROGLYPH R011 ++ /xf0/x93/x8a/xbe EGYPTIAN HIEROGLYPH R012 ++ /xf0/x93/x8a/xbf EGYPTIAN HIEROGLYPH R013 ++ /xf0/x93/x8b/x80 EGYPTIAN HIEROGLYPH R014 ++ /xf0/x93/x8b/x81 EGYPTIAN HIEROGLYPH R015 ++ /xf0/x93/x8b/x82 EGYPTIAN HIEROGLYPH R016 ++ /xf0/x93/x8b/x83 EGYPTIAN HIEROGLYPH R016A ++ /xf0/x93/x8b/x84 EGYPTIAN HIEROGLYPH R017 ++ /xf0/x93/x8b/x85 EGYPTIAN HIEROGLYPH R018 ++ /xf0/x93/x8b/x86 EGYPTIAN HIEROGLYPH R019 ++ /xf0/x93/x8b/x87 EGYPTIAN HIEROGLYPH R020 ++ /xf0/x93/x8b/x88 EGYPTIAN HIEROGLYPH R021 ++ /xf0/x93/x8b/x89 EGYPTIAN HIEROGLYPH R022 ++ /xf0/x93/x8b/x8a EGYPTIAN HIEROGLYPH R023 ++ /xf0/x93/x8b/x8b EGYPTIAN HIEROGLYPH R024 ++ /xf0/x93/x8b/x8c EGYPTIAN HIEROGLYPH R025 ++ /xf0/x93/x8b/x8d EGYPTIAN HIEROGLYPH R026 ++ /xf0/x93/x8b/x8e EGYPTIAN HIEROGLYPH R027 ++ /xf0/x93/x8b/x8f EGYPTIAN HIEROGLYPH R028 ++ /xf0/x93/x8b/x90 EGYPTIAN HIEROGLYPH R029 ++ /xf0/x93/x8b/x91 EGYPTIAN HIEROGLYPH S001 ++ /xf0/x93/x8b/x92 EGYPTIAN HIEROGLYPH S002 ++ /xf0/x93/x8b/x93 EGYPTIAN HIEROGLYPH S002A ++ /xf0/x93/x8b/x94 EGYPTIAN HIEROGLYPH S003 ++ /xf0/x93/x8b/x95 EGYPTIAN HIEROGLYPH S004 ++ /xf0/x93/x8b/x96 EGYPTIAN HIEROGLYPH S005 ++ /xf0/x93/x8b/x97 EGYPTIAN HIEROGLYPH S006 ++ /xf0/x93/x8b/x98 EGYPTIAN HIEROGLYPH S006A ++ /xf0/x93/x8b/x99 EGYPTIAN HIEROGLYPH S007 ++ /xf0/x93/x8b/x9a EGYPTIAN HIEROGLYPH S008 ++ /xf0/x93/x8b/x9b EGYPTIAN HIEROGLYPH S009 ++ /xf0/x93/x8b/x9c EGYPTIAN HIEROGLYPH S010 ++ /xf0/x93/x8b/x9d EGYPTIAN HIEROGLYPH S011 ++ /xf0/x93/x8b/x9e EGYPTIAN HIEROGLYPH S012 ++ /xf0/x93/x8b/x9f EGYPTIAN HIEROGLYPH S013 ++ /xf0/x93/x8b/xa0 EGYPTIAN HIEROGLYPH S014 ++ /xf0/x93/x8b/xa1 EGYPTIAN HIEROGLYPH S014A ++ /xf0/x93/x8b/xa2 EGYPTIAN HIEROGLYPH S014B ++ /xf0/x93/x8b/xa3 EGYPTIAN HIEROGLYPH S015 ++ /xf0/x93/x8b/xa4 EGYPTIAN HIEROGLYPH S016 ++ /xf0/x93/x8b/xa5 EGYPTIAN HIEROGLYPH S017 ++ /xf0/x93/x8b/xa6 EGYPTIAN HIEROGLYPH S017A ++ /xf0/x93/x8b/xa7 EGYPTIAN HIEROGLYPH S018 ++ /xf0/x93/x8b/xa8 EGYPTIAN HIEROGLYPH S019 ++ /xf0/x93/x8b/xa9 EGYPTIAN HIEROGLYPH S020 ++ /xf0/x93/x8b/xaa EGYPTIAN HIEROGLYPH S021 ++ /xf0/x93/x8b/xab EGYPTIAN HIEROGLYPH S022 ++ /xf0/x93/x8b/xac EGYPTIAN HIEROGLYPH S023 ++ /xf0/x93/x8b/xad EGYPTIAN HIEROGLYPH S024 ++ /xf0/x93/x8b/xae EGYPTIAN HIEROGLYPH S025 ++ /xf0/x93/x8b/xaf EGYPTIAN HIEROGLYPH S026 ++ /xf0/x93/x8b/xb0 EGYPTIAN HIEROGLYPH S026A ++ /xf0/x93/x8b/xb1 EGYPTIAN HIEROGLYPH S026B ++ /xf0/x93/x8b/xb2 EGYPTIAN HIEROGLYPH S027 ++ /xf0/x93/x8b/xb3 EGYPTIAN HIEROGLYPH S028 ++ /xf0/x93/x8b/xb4 EGYPTIAN HIEROGLYPH S029 ++ /xf0/x93/x8b/xb5 EGYPTIAN HIEROGLYPH S030 ++ /xf0/x93/x8b/xb6 EGYPTIAN HIEROGLYPH S031 ++ /xf0/x93/x8b/xb7 EGYPTIAN HIEROGLYPH S032 ++ /xf0/x93/x8b/xb8 EGYPTIAN HIEROGLYPH S033 ++ /xf0/x93/x8b/xb9 EGYPTIAN HIEROGLYPH S034 ++ /xf0/x93/x8b/xba EGYPTIAN HIEROGLYPH S035 ++ /xf0/x93/x8b/xbb EGYPTIAN HIEROGLYPH S035A ++ /xf0/x93/x8b/xbc EGYPTIAN HIEROGLYPH S036 ++ /xf0/x93/x8b/xbd EGYPTIAN HIEROGLYPH S037 ++ /xf0/x93/x8b/xbe EGYPTIAN HIEROGLYPH S038 ++ /xf0/x93/x8b/xbf EGYPTIAN HIEROGLYPH S039 ++ /xf0/x93/x8c/x80 EGYPTIAN HIEROGLYPH S040 ++ /xf0/x93/x8c/x81 EGYPTIAN HIEROGLYPH S041 ++ /xf0/x93/x8c/x82 EGYPTIAN HIEROGLYPH S042 ++ /xf0/x93/x8c/x83 EGYPTIAN HIEROGLYPH S043 ++ /xf0/x93/x8c/x84 EGYPTIAN HIEROGLYPH S044 ++ /xf0/x93/x8c/x85 EGYPTIAN HIEROGLYPH S045 ++ /xf0/x93/x8c/x86 EGYPTIAN HIEROGLYPH S046 ++ /xf0/x93/x8c/x87 EGYPTIAN HIEROGLYPH T001 ++ /xf0/x93/x8c/x88 EGYPTIAN HIEROGLYPH T002 ++ /xf0/x93/x8c/x89 EGYPTIAN HIEROGLYPH T003 ++ /xf0/x93/x8c/x8a EGYPTIAN HIEROGLYPH T003A ++ /xf0/x93/x8c/x8b EGYPTIAN HIEROGLYPH T004 ++ /xf0/x93/x8c/x8c EGYPTIAN HIEROGLYPH T005 ++ /xf0/x93/x8c/x8d EGYPTIAN HIEROGLYPH T006 ++ /xf0/x93/x8c/x8e EGYPTIAN HIEROGLYPH T007 ++ /xf0/x93/x8c/x8f EGYPTIAN HIEROGLYPH T007A ++ /xf0/x93/x8c/x90 EGYPTIAN HIEROGLYPH T008 ++ /xf0/x93/x8c/x91 EGYPTIAN HIEROGLYPH T008A ++ /xf0/x93/x8c/x92 EGYPTIAN HIEROGLYPH T009 ++ /xf0/x93/x8c/x93 EGYPTIAN HIEROGLYPH T009A ++ /xf0/x93/x8c/x94 EGYPTIAN HIEROGLYPH T010 ++ /xf0/x93/x8c/x95 EGYPTIAN HIEROGLYPH T011 ++ /xf0/x93/x8c/x96 EGYPTIAN HIEROGLYPH T011A ++ /xf0/x93/x8c/x97 EGYPTIAN HIEROGLYPH T012 ++ /xf0/x93/x8c/x98 EGYPTIAN HIEROGLYPH T013 ++ /xf0/x93/x8c/x99 EGYPTIAN HIEROGLYPH T014 ++ /xf0/x93/x8c/x9a EGYPTIAN HIEROGLYPH T015 ++ /xf0/x93/x8c/x9b EGYPTIAN HIEROGLYPH T016 ++ /xf0/x93/x8c/x9c EGYPTIAN HIEROGLYPH T016A ++ /xf0/x93/x8c/x9d EGYPTIAN HIEROGLYPH T017 ++ /xf0/x93/x8c/x9e EGYPTIAN HIEROGLYPH T018 ++ /xf0/x93/x8c/x9f EGYPTIAN HIEROGLYPH T019 ++ /xf0/x93/x8c/xa0 EGYPTIAN HIEROGLYPH T020 ++ /xf0/x93/x8c/xa1 EGYPTIAN HIEROGLYPH T021 ++ /xf0/x93/x8c/xa2 EGYPTIAN HIEROGLYPH T022 ++ /xf0/x93/x8c/xa3 EGYPTIAN HIEROGLYPH T023 ++ /xf0/x93/x8c/xa4 EGYPTIAN HIEROGLYPH T024 ++ /xf0/x93/x8c/xa5 EGYPTIAN HIEROGLYPH T025 ++ /xf0/x93/x8c/xa6 EGYPTIAN HIEROGLYPH T026 ++ /xf0/x93/x8c/xa7 EGYPTIAN HIEROGLYPH T027 ++ /xf0/x93/x8c/xa8 EGYPTIAN HIEROGLYPH T028 ++ /xf0/x93/x8c/xa9 EGYPTIAN HIEROGLYPH T029 ++ /xf0/x93/x8c/xaa EGYPTIAN HIEROGLYPH T030 ++ /xf0/x93/x8c/xab EGYPTIAN HIEROGLYPH T031 ++ /xf0/x93/x8c/xac EGYPTIAN HIEROGLYPH T032 ++ /xf0/x93/x8c/xad EGYPTIAN HIEROGLYPH T032A ++ /xf0/x93/x8c/xae EGYPTIAN HIEROGLYPH T033 ++ /xf0/x93/x8c/xaf EGYPTIAN HIEROGLYPH T033A ++ /xf0/x93/x8c/xb0 EGYPTIAN HIEROGLYPH T034 ++ /xf0/x93/x8c/xb1 EGYPTIAN HIEROGLYPH T035 ++ /xf0/x93/x8c/xb2 EGYPTIAN HIEROGLYPH T036 ++ /xf0/x93/x8c/xb3 EGYPTIAN HIEROGLYPH U001 ++ /xf0/x93/x8c/xb4 EGYPTIAN HIEROGLYPH U002 ++ /xf0/x93/x8c/xb5 EGYPTIAN HIEROGLYPH U003 ++ /xf0/x93/x8c/xb6 EGYPTIAN HIEROGLYPH U004 ++ /xf0/x93/x8c/xb7 EGYPTIAN HIEROGLYPH U005 ++ /xf0/x93/x8c/xb8 EGYPTIAN HIEROGLYPH U006 ++ /xf0/x93/x8c/xb9 EGYPTIAN HIEROGLYPH U006A ++ /xf0/x93/x8c/xba EGYPTIAN HIEROGLYPH U006B ++ /xf0/x93/x8c/xbb EGYPTIAN HIEROGLYPH U007 ++ /xf0/x93/x8c/xbc EGYPTIAN HIEROGLYPH U008 ++ /xf0/x93/x8c/xbd EGYPTIAN HIEROGLYPH U009 ++ /xf0/x93/x8c/xbe EGYPTIAN HIEROGLYPH U010 ++ /xf0/x93/x8c/xbf EGYPTIAN HIEROGLYPH U011 ++ /xf0/x93/x8d/x80 EGYPTIAN HIEROGLYPH U012 ++ /xf0/x93/x8d/x81 EGYPTIAN HIEROGLYPH U013 ++ /xf0/x93/x8d/x82 EGYPTIAN HIEROGLYPH U014 ++ /xf0/x93/x8d/x83 EGYPTIAN HIEROGLYPH U015 ++ /xf0/x93/x8d/x84 EGYPTIAN HIEROGLYPH U016 ++ /xf0/x93/x8d/x85 EGYPTIAN HIEROGLYPH U017 ++ /xf0/x93/x8d/x86 EGYPTIAN HIEROGLYPH U018 ++ /xf0/x93/x8d/x87 EGYPTIAN HIEROGLYPH U019 ++ /xf0/x93/x8d/x88 EGYPTIAN HIEROGLYPH U020 ++ /xf0/x93/x8d/x89 EGYPTIAN HIEROGLYPH U021 ++ /xf0/x93/x8d/x8a EGYPTIAN HIEROGLYPH U022 ++ /xf0/x93/x8d/x8b EGYPTIAN HIEROGLYPH U023 ++ /xf0/x93/x8d/x8c EGYPTIAN HIEROGLYPH U023A ++ /xf0/x93/x8d/x8d EGYPTIAN HIEROGLYPH U024 ++ /xf0/x93/x8d/x8e EGYPTIAN HIEROGLYPH U025 ++ /xf0/x93/x8d/x8f EGYPTIAN HIEROGLYPH U026 ++ /xf0/x93/x8d/x90 EGYPTIAN HIEROGLYPH U027 ++ /xf0/x93/x8d/x91 EGYPTIAN HIEROGLYPH U028 ++ /xf0/x93/x8d/x92 EGYPTIAN HIEROGLYPH U029 ++ /xf0/x93/x8d/x93 EGYPTIAN HIEROGLYPH U029A ++ /xf0/x93/x8d/x94 EGYPTIAN HIEROGLYPH U030 ++ /xf0/x93/x8d/x95 EGYPTIAN HIEROGLYPH U031 ++ /xf0/x93/x8d/x96 EGYPTIAN HIEROGLYPH U032 ++ /xf0/x93/x8d/x97 EGYPTIAN HIEROGLYPH U032A ++ /xf0/x93/x8d/x98 EGYPTIAN HIEROGLYPH U033 ++ /xf0/x93/x8d/x99 EGYPTIAN HIEROGLYPH U034 ++ /xf0/x93/x8d/x9a EGYPTIAN HIEROGLYPH U035 ++ /xf0/x93/x8d/x9b EGYPTIAN HIEROGLYPH U036 ++ /xf0/x93/x8d/x9c EGYPTIAN HIEROGLYPH U037 ++ /xf0/x93/x8d/x9d EGYPTIAN HIEROGLYPH U038 ++ /xf0/x93/x8d/x9e EGYPTIAN HIEROGLYPH U039 ++ /xf0/x93/x8d/x9f EGYPTIAN HIEROGLYPH U040 ++ /xf0/x93/x8d/xa0 EGYPTIAN HIEROGLYPH U041 ++ /xf0/x93/x8d/xa1 EGYPTIAN HIEROGLYPH U042 ++ /xf0/x93/x8d/xa2 EGYPTIAN HIEROGLYPH V001 ++ /xf0/x93/x8d/xa3 EGYPTIAN HIEROGLYPH V001A ++ /xf0/x93/x8d/xa4 EGYPTIAN HIEROGLYPH V001B ++ /xf0/x93/x8d/xa5 EGYPTIAN HIEROGLYPH V001C ++ /xf0/x93/x8d/xa6 EGYPTIAN HIEROGLYPH V001D ++ /xf0/x93/x8d/xa7 EGYPTIAN HIEROGLYPH V001E ++ /xf0/x93/x8d/xa8 EGYPTIAN HIEROGLYPH V001F ++ /xf0/x93/x8d/xa9 EGYPTIAN HIEROGLYPH V001G ++ /xf0/x93/x8d/xaa EGYPTIAN HIEROGLYPH V001H ++ /xf0/x93/x8d/xab EGYPTIAN HIEROGLYPH V001I ++ /xf0/x93/x8d/xac EGYPTIAN HIEROGLYPH V002 ++ /xf0/x93/x8d/xad EGYPTIAN HIEROGLYPH V002A ++ /xf0/x93/x8d/xae EGYPTIAN HIEROGLYPH V003 ++ /xf0/x93/x8d/xaf EGYPTIAN HIEROGLYPH V004 ++ /xf0/x93/x8d/xb0 EGYPTIAN HIEROGLYPH V005 ++ /xf0/x93/x8d/xb1 EGYPTIAN HIEROGLYPH V006 ++ /xf0/x93/x8d/xb2 EGYPTIAN HIEROGLYPH V007 ++ /xf0/x93/x8d/xb3 EGYPTIAN HIEROGLYPH V007A ++ /xf0/x93/x8d/xb4 EGYPTIAN HIEROGLYPH V007B ++ /xf0/x93/x8d/xb5 EGYPTIAN HIEROGLYPH V008 ++ /xf0/x93/x8d/xb6 EGYPTIAN HIEROGLYPH V009 ++ /xf0/x93/x8d/xb7 EGYPTIAN HIEROGLYPH V010 ++ /xf0/x93/x8d/xb8 EGYPTIAN HIEROGLYPH V011 ++ /xf0/x93/x8d/xb9 EGYPTIAN HIEROGLYPH V011A ++ /xf0/x93/x8d/xba EGYPTIAN HIEROGLYPH V011B ++ /xf0/x93/x8d/xbb EGYPTIAN HIEROGLYPH V011C ++ /xf0/x93/x8d/xbc EGYPTIAN HIEROGLYPH V012 ++ /xf0/x93/x8d/xbd EGYPTIAN HIEROGLYPH V012A ++ /xf0/x93/x8d/xbe EGYPTIAN HIEROGLYPH V012B ++ /xf0/x93/x8d/xbf EGYPTIAN HIEROGLYPH V013 ++ /xf0/x93/x8e/x80 EGYPTIAN HIEROGLYPH V014 ++ /xf0/x93/x8e/x81 EGYPTIAN HIEROGLYPH V015 ++ /xf0/x93/x8e/x82 EGYPTIAN HIEROGLYPH V016 ++ /xf0/x93/x8e/x83 EGYPTIAN HIEROGLYPH V017 ++ /xf0/x93/x8e/x84 EGYPTIAN HIEROGLYPH V018 ++ /xf0/x93/x8e/x85 EGYPTIAN HIEROGLYPH V019 ++ /xf0/x93/x8e/x86 EGYPTIAN HIEROGLYPH V020 ++ /xf0/x93/x8e/x87 EGYPTIAN HIEROGLYPH V020A ++ /xf0/x93/x8e/x88 EGYPTIAN HIEROGLYPH V020B ++ /xf0/x93/x8e/x89 EGYPTIAN HIEROGLYPH V020C ++ /xf0/x93/x8e/x8a EGYPTIAN HIEROGLYPH V020D ++ /xf0/x93/x8e/x8b EGYPTIAN HIEROGLYPH V020E ++ /xf0/x93/x8e/x8c EGYPTIAN HIEROGLYPH V020F ++ /xf0/x93/x8e/x8d EGYPTIAN HIEROGLYPH V020G ++ /xf0/x93/x8e/x8e EGYPTIAN HIEROGLYPH V020H ++ /xf0/x93/x8e/x8f EGYPTIAN HIEROGLYPH V020I ++ /xf0/x93/x8e/x90 EGYPTIAN HIEROGLYPH V020J ++ /xf0/x93/x8e/x91 EGYPTIAN HIEROGLYPH V020K ++ /xf0/x93/x8e/x92 EGYPTIAN HIEROGLYPH V020L ++ /xf0/x93/x8e/x93 EGYPTIAN HIEROGLYPH V021 ++ /xf0/x93/x8e/x94 EGYPTIAN HIEROGLYPH V022 ++ /xf0/x93/x8e/x95 EGYPTIAN HIEROGLYPH V023 ++ /xf0/x93/x8e/x96 EGYPTIAN HIEROGLYPH V023A ++ /xf0/x93/x8e/x97 EGYPTIAN HIEROGLYPH V024 ++ /xf0/x93/x8e/x98 EGYPTIAN HIEROGLYPH V025 ++ /xf0/x93/x8e/x99 EGYPTIAN HIEROGLYPH V026 ++ /xf0/x93/x8e/x9a EGYPTIAN HIEROGLYPH V027 ++ /xf0/x93/x8e/x9b EGYPTIAN HIEROGLYPH V028 ++ /xf0/x93/x8e/x9c EGYPTIAN HIEROGLYPH V028A ++ /xf0/x93/x8e/x9d EGYPTIAN HIEROGLYPH V029 ++ /xf0/x93/x8e/x9e EGYPTIAN HIEROGLYPH V029A ++ /xf0/x93/x8e/x9f EGYPTIAN HIEROGLYPH V030 ++ /xf0/x93/x8e/xa0 EGYPTIAN HIEROGLYPH V030A ++ /xf0/x93/x8e/xa1 EGYPTIAN HIEROGLYPH V031 ++ /xf0/x93/x8e/xa2 EGYPTIAN HIEROGLYPH V031A ++ /xf0/x93/x8e/xa3 EGYPTIAN HIEROGLYPH V032 ++ /xf0/x93/x8e/xa4 EGYPTIAN HIEROGLYPH V033 ++ /xf0/x93/x8e/xa5 EGYPTIAN HIEROGLYPH V033A ++ /xf0/x93/x8e/xa6 EGYPTIAN HIEROGLYPH V034 ++ /xf0/x93/x8e/xa7 EGYPTIAN HIEROGLYPH V035 ++ /xf0/x93/x8e/xa8 EGYPTIAN HIEROGLYPH V036 ++ /xf0/x93/x8e/xa9 EGYPTIAN HIEROGLYPH V037 ++ /xf0/x93/x8e/xaa EGYPTIAN HIEROGLYPH V037A ++ /xf0/x93/x8e/xab EGYPTIAN HIEROGLYPH V038 ++ /xf0/x93/x8e/xac EGYPTIAN HIEROGLYPH V039 ++ /xf0/x93/x8e/xad EGYPTIAN HIEROGLYPH V040 ++ /xf0/x93/x8e/xae EGYPTIAN HIEROGLYPH V040A ++ /xf0/x93/x8e/xaf EGYPTIAN HIEROGLYPH W001 ++ /xf0/x93/x8e/xb0 EGYPTIAN HIEROGLYPH W002 ++ /xf0/x93/x8e/xb1 EGYPTIAN HIEROGLYPH W003 ++ /xf0/x93/x8e/xb2 EGYPTIAN HIEROGLYPH W003A ++ /xf0/x93/x8e/xb3 EGYPTIAN HIEROGLYPH W004 ++ /xf0/x93/x8e/xb4 EGYPTIAN HIEROGLYPH W005 ++ /xf0/x93/x8e/xb5 EGYPTIAN HIEROGLYPH W006 ++ /xf0/x93/x8e/xb6 EGYPTIAN HIEROGLYPH W007 ++ /xf0/x93/x8e/xb7 EGYPTIAN HIEROGLYPH W008 ++ /xf0/x93/x8e/xb8 EGYPTIAN HIEROGLYPH W009 ++ /xf0/x93/x8e/xb9 EGYPTIAN HIEROGLYPH W009A ++ /xf0/x93/x8e/xba EGYPTIAN HIEROGLYPH W010 ++ /xf0/x93/x8e/xbb EGYPTIAN HIEROGLYPH W010A ++ /xf0/x93/x8e/xbc EGYPTIAN HIEROGLYPH W011 ++ /xf0/x93/x8e/xbd EGYPTIAN HIEROGLYPH W012 ++ /xf0/x93/x8e/xbe EGYPTIAN HIEROGLYPH W013 ++ /xf0/x93/x8e/xbf EGYPTIAN HIEROGLYPH W014 ++ /xf0/x93/x8f/x80 EGYPTIAN HIEROGLYPH W014A ++ /xf0/x93/x8f/x81 EGYPTIAN HIEROGLYPH W015 ++ /xf0/x93/x8f/x82 EGYPTIAN HIEROGLYPH W016 ++ /xf0/x93/x8f/x83 EGYPTIAN HIEROGLYPH W017 ++ /xf0/x93/x8f/x84 EGYPTIAN HIEROGLYPH W017A ++ /xf0/x93/x8f/x85 EGYPTIAN HIEROGLYPH W018 ++ /xf0/x93/x8f/x86 EGYPTIAN HIEROGLYPH W018A ++ /xf0/x93/x8f/x87 EGYPTIAN HIEROGLYPH W019 ++ /xf0/x93/x8f/x88 EGYPTIAN HIEROGLYPH W020 ++ /xf0/x93/x8f/x89 EGYPTIAN HIEROGLYPH W021 ++ /xf0/x93/x8f/x8a EGYPTIAN HIEROGLYPH W022 ++ /xf0/x93/x8f/x8b EGYPTIAN HIEROGLYPH W023 ++ /xf0/x93/x8f/x8c EGYPTIAN HIEROGLYPH W024 ++ /xf0/x93/x8f/x8d EGYPTIAN HIEROGLYPH W024A ++ /xf0/x93/x8f/x8e EGYPTIAN HIEROGLYPH W025 ++ /xf0/x93/x8f/x8f EGYPTIAN HIEROGLYPH X001 ++ /xf0/x93/x8f/x90 EGYPTIAN HIEROGLYPH X002 ++ /xf0/x93/x8f/x91 EGYPTIAN HIEROGLYPH X003 ++ /xf0/x93/x8f/x92 EGYPTIAN HIEROGLYPH X004 ++ /xf0/x93/x8f/x93 EGYPTIAN HIEROGLYPH X004A ++ /xf0/x93/x8f/x94 EGYPTIAN HIEROGLYPH X004B ++ /xf0/x93/x8f/x95 EGYPTIAN HIEROGLYPH X005 ++ /xf0/x93/x8f/x96 EGYPTIAN HIEROGLYPH X006 ++ /xf0/x93/x8f/x97 EGYPTIAN HIEROGLYPH X006A ++ /xf0/x93/x8f/x98 EGYPTIAN HIEROGLYPH X007 ++ /xf0/x93/x8f/x99 EGYPTIAN HIEROGLYPH X008 ++ /xf0/x93/x8f/x9a EGYPTIAN HIEROGLYPH X008A ++ /xf0/x93/x8f/x9b EGYPTIAN HIEROGLYPH Y001 ++ /xf0/x93/x8f/x9c EGYPTIAN HIEROGLYPH Y001A ++ /xf0/x93/x8f/x9d EGYPTIAN HIEROGLYPH Y002 ++ /xf0/x93/x8f/x9e EGYPTIAN HIEROGLYPH Y003 ++ /xf0/x93/x8f/x9f EGYPTIAN HIEROGLYPH Y004 ++ /xf0/x93/x8f/xa0 EGYPTIAN HIEROGLYPH Y005 ++ /xf0/x93/x8f/xa1 EGYPTIAN HIEROGLYPH Y006 ++ /xf0/x93/x8f/xa2 EGYPTIAN HIEROGLYPH Y007 ++ /xf0/x93/x8f/xa3 EGYPTIAN HIEROGLYPH Y008 ++ /xf0/x93/x8f/xa4 EGYPTIAN HIEROGLYPH Z001 ++ /xf0/x93/x8f/xa5 EGYPTIAN HIEROGLYPH Z002 ++ /xf0/x93/x8f/xa6 EGYPTIAN HIEROGLYPH Z002A ++ /xf0/x93/x8f/xa7 EGYPTIAN HIEROGLYPH Z002B ++ /xf0/x93/x8f/xa8 EGYPTIAN HIEROGLYPH Z002C ++ /xf0/x93/x8f/xa9 EGYPTIAN HIEROGLYPH Z002D ++ /xf0/x93/x8f/xaa EGYPTIAN HIEROGLYPH Z003 ++ /xf0/x93/x8f/xab EGYPTIAN HIEROGLYPH Z003A ++ /xf0/x93/x8f/xac EGYPTIAN HIEROGLYPH Z003B ++ /xf0/x93/x8f/xad EGYPTIAN HIEROGLYPH Z004 ++ /xf0/x93/x8f/xae EGYPTIAN HIEROGLYPH Z004A ++ /xf0/x93/x8f/xaf EGYPTIAN HIEROGLYPH Z005 ++ /xf0/x93/x8f/xb0 EGYPTIAN HIEROGLYPH Z005A ++ /xf0/x93/x8f/xb1 EGYPTIAN HIEROGLYPH Z006 ++ /xf0/x93/x8f/xb2 EGYPTIAN HIEROGLYPH Z007 ++ /xf0/x93/x8f/xb3 EGYPTIAN HIEROGLYPH Z008 ++ /xf0/x93/x8f/xb4 EGYPTIAN HIEROGLYPH Z009 ++ /xf0/x93/x8f/xb5 EGYPTIAN HIEROGLYPH Z010 ++ /xf0/x93/x8f/xb6 EGYPTIAN HIEROGLYPH Z011 ++ /xf0/x93/x8f/xb7 EGYPTIAN HIEROGLYPH Z012 ++ /xf0/x93/x8f/xb8 EGYPTIAN HIEROGLYPH Z013 ++ /xf0/x93/x8f/xb9 EGYPTIAN HIEROGLYPH Z014 ++ /xf0/x93/x8f/xba EGYPTIAN HIEROGLYPH Z015 ++ /xf0/x93/x8f/xbb EGYPTIAN HIEROGLYPH Z015A ++ /xf0/x93/x8f/xbc EGYPTIAN HIEROGLYPH Z015B ++ /xf0/x93/x8f/xbd EGYPTIAN HIEROGLYPH Z015C ++ /xf0/x93/x8f/xbe EGYPTIAN HIEROGLYPH Z015D ++ /xf0/x93/x8f/xbf EGYPTIAN HIEROGLYPH Z015E ++ /xf0/x93/x90/x80 EGYPTIAN HIEROGLYPH Z015F ++ /xf0/x93/x90/x81 EGYPTIAN HIEROGLYPH Z015G ++ /xf0/x93/x90/x82 EGYPTIAN HIEROGLYPH Z015H ++ /xf0/x93/x90/x83 EGYPTIAN HIEROGLYPH Z015I ++ /xf0/x93/x90/x84 EGYPTIAN HIEROGLYPH Z016 ++ /xf0/x93/x90/x85 EGYPTIAN HIEROGLYPH Z016A ++ /xf0/x93/x90/x86 EGYPTIAN HIEROGLYPH Z016B ++ /xf0/x93/x90/x87 EGYPTIAN HIEROGLYPH Z016C ++ /xf0/x93/x90/x88 EGYPTIAN HIEROGLYPH Z016D ++ /xf0/x93/x90/x89 EGYPTIAN HIEROGLYPH Z016E ++ /xf0/x93/x90/x8a EGYPTIAN HIEROGLYPH Z016F ++ /xf0/x93/x90/x8b EGYPTIAN HIEROGLYPH Z016G ++ /xf0/x93/x90/x8c EGYPTIAN HIEROGLYPH Z016H ++ /xf0/x93/x90/x8d EGYPTIAN HIEROGLYPH AA001 ++ /xf0/x93/x90/x8e EGYPTIAN HIEROGLYPH AA002 ++ /xf0/x93/x90/x8f EGYPTIAN HIEROGLYPH AA003 ++ /xf0/x93/x90/x90 EGYPTIAN HIEROGLYPH AA004 ++ /xf0/x93/x90/x91 EGYPTIAN HIEROGLYPH AA005 ++ /xf0/x93/x90/x92 EGYPTIAN HIEROGLYPH AA006 ++ /xf0/x93/x90/x93 EGYPTIAN HIEROGLYPH AA007 ++ /xf0/x93/x90/x94 EGYPTIAN HIEROGLYPH AA007A ++ /xf0/x93/x90/x95 EGYPTIAN HIEROGLYPH AA007B ++ /xf0/x93/x90/x96 EGYPTIAN HIEROGLYPH AA008 ++ /xf0/x93/x90/x97 EGYPTIAN HIEROGLYPH AA009 ++ /xf0/x93/x90/x98 EGYPTIAN HIEROGLYPH AA010 ++ /xf0/x93/x90/x99 EGYPTIAN HIEROGLYPH AA011 ++ /xf0/x93/x90/x9a EGYPTIAN HIEROGLYPH AA012 ++ /xf0/x93/x90/x9b EGYPTIAN HIEROGLYPH AA013 ++ /xf0/x93/x90/x9c EGYPTIAN HIEROGLYPH AA014 ++ /xf0/x93/x90/x9d EGYPTIAN HIEROGLYPH AA015 ++ /xf0/x93/x90/x9e EGYPTIAN HIEROGLYPH AA016 ++ /xf0/x93/x90/x9f EGYPTIAN HIEROGLYPH AA017 ++ /xf0/x93/x90/xa0 EGYPTIAN HIEROGLYPH AA018 ++ /xf0/x93/x90/xa1 EGYPTIAN HIEROGLYPH AA019 ++ /xf0/x93/x90/xa2 EGYPTIAN HIEROGLYPH AA020 ++ /xf0/x93/x90/xa3 EGYPTIAN HIEROGLYPH AA021 ++ /xf0/x93/x90/xa4 EGYPTIAN HIEROGLYPH AA022 ++ /xf0/x93/x90/xa5 EGYPTIAN HIEROGLYPH AA023 ++ /xf0/x93/x90/xa6 EGYPTIAN HIEROGLYPH AA024 ++ /xf0/x93/x90/xa7 EGYPTIAN HIEROGLYPH AA025 ++ /xf0/x93/x90/xa8 EGYPTIAN HIEROGLYPH AA026 ++ /xf0/x93/x90/xa9 EGYPTIAN HIEROGLYPH AA027 ++ /xf0/x93/x90/xaa EGYPTIAN HIEROGLYPH AA028 ++ /xf0/x93/x90/xab EGYPTIAN HIEROGLYPH AA029 ++ /xf0/x93/x90/xac EGYPTIAN HIEROGLYPH AA030 ++ /xf0/x93/x90/xad EGYPTIAN HIEROGLYPH AA031 ++ /xf0/x93/x90/xae EGYPTIAN HIEROGLYPH AA032 ++ /xf0/x96/xa0/x80 BAMUM LETTER PHASE-A NGKUE MFON ++ /xf0/x96/xa0/x81 BAMUM LETTER PHASE-A GBIEE FON ++ /xf0/x96/xa0/x82 BAMUM LETTER PHASE-A PON MFON PIPAEMGBIEE ++ /xf0/x96/xa0/x83 BAMUM LETTER PHASE-A PON MFON PIPAEMBA ++ /xf0/x96/xa0/x84 BAMUM LETTER PHASE-A NAA MFON ++ /xf0/x96/xa0/x85 BAMUM LETTER PHASE-A SHUENSHUET ++ /xf0/x96/xa0/x86 BAMUM LETTER PHASE-A TITA MFON ++ /xf0/x96/xa0/x87 BAMUM LETTER PHASE-A NZA MFON ++ /xf0/x96/xa0/x88 BAMUM LETTER PHASE-A SHINDA PA NJI ++ /xf0/x96/xa0/x89 BAMUM LETTER PHASE-A PON PA NJI PIPAEMGBIEE ++ /xf0/x96/xa0/x8a BAMUM LETTER PHASE-A PON PA NJI PIPAEMBA ++ /xf0/x96/xa0/x8b BAMUM LETTER PHASE-A MAEMBGBIEE ++ /xf0/x96/xa0/x8c BAMUM LETTER PHASE-A TU MAEMBA ++ /xf0/x96/xa0/x8d BAMUM LETTER PHASE-A NGANGU ++ /xf0/x96/xa0/x8e BAMUM LETTER PHASE-A MAEMVEUX ++ /xf0/x96/xa0/x8f BAMUM LETTER PHASE-A MANSUAE ++ /xf0/x96/xa0/x90 BAMUM LETTER PHASE-A MVEUAENGAM ++ /xf0/x96/xa0/x91 BAMUM LETTER PHASE-A SEUNYAM ++ /xf0/x96/xa0/x92 BAMUM LETTER PHASE-A NTOQPEN ++ /xf0/x96/xa0/x93 BAMUM LETTER PHASE-A KEUKEUTNDA ++ /xf0/x96/xa0/x94 BAMUM LETTER PHASE-A NKINDI ++ /xf0/x96/xa0/x95 BAMUM LETTER PHASE-A SUU ++ /xf0/x96/xa0/x96 BAMUM LETTER PHASE-A NGKUENZEUM ++ /xf0/x96/xa0/x97 BAMUM LETTER PHASE-A LAPAQ ++ /xf0/x96/xa0/x98 BAMUM LETTER PHASE-A LET KUT ++ /xf0/x96/xa0/x99 BAMUM LETTER PHASE-A NTAP MFAA ++ /xf0/x96/xa0/x9a BAMUM LETTER PHASE-A MAEKEUP ++ /xf0/x96/xa0/x9b BAMUM LETTER PHASE-A PASHAE ++ /xf0/x96/xa0/x9c BAMUM LETTER PHASE-A GHEUAERAE ++ /xf0/x96/xa0/x9d BAMUM LETTER PHASE-A PAMSHAE ++ /xf0/x96/xa0/x9e BAMUM LETTER PHASE-A MON NGGEUAET ++ /xf0/x96/xa0/x9f BAMUM LETTER PHASE-A NZUN MEUT ++ /xf0/x96/xa0/xa0 BAMUM LETTER PHASE-A U YUQ NAE ++ /xf0/x96/xa0/xa1 BAMUM LETTER PHASE-A GHEUAEGHEUAE ++ /xf0/x96/xa0/xa2 BAMUM LETTER PHASE-A NTAP NTAA ++ /xf0/x96/xa0/xa3 BAMUM LETTER PHASE-A SISA ++ /xf0/x96/xa0/xa4 BAMUM LETTER PHASE-A MGBASA ++ /xf0/x96/xa0/xa5 BAMUM LETTER PHASE-A MEUNJOMNDEUQ ++ /xf0/x96/xa0/xa6 BAMUM LETTER PHASE-A MOOMPUQ ++ /xf0/x96/xa0/xa7 BAMUM LETTER PHASE-A KAFA ++ /xf0/x96/xa0/xa8 BAMUM LETTER PHASE-A PA LEERAEWA ++ /xf0/x96/xa0/xa9 BAMUM LETTER PHASE-A NDA LEERAEWA ++ /xf0/x96/xa0/xaa BAMUM LETTER PHASE-A PET ++ /xf0/x96/xa0/xab BAMUM LETTER PHASE-A MAEMKPEN ++ /xf0/x96/xa0/xac BAMUM LETTER PHASE-A NIKA ++ /xf0/x96/xa0/xad BAMUM LETTER PHASE-A PUP ++ /xf0/x96/xa0/xae BAMUM LETTER PHASE-A TUAEP ++ /xf0/x96/xa0/xaf BAMUM LETTER PHASE-A LUAEP ++ /xf0/x96/xa0/xb0 BAMUM LETTER PHASE-A SONJAM ++ /xf0/x96/xa0/xb1 BAMUM LETTER PHASE-A TEUTEUWEN ++ /xf0/x96/xa0/xb2 BAMUM LETTER PHASE-A MAENYI ++ /xf0/x96/xa0/xb3 BAMUM LETTER PHASE-A KET ++ /xf0/x96/xa0/xb4 BAMUM LETTER PHASE-A NDAANGGEUAET ++ /xf0/x96/xa0/xb5 BAMUM LETTER PHASE-A KUOQ ++ /xf0/x96/xa0/xb6 BAMUM LETTER PHASE-A MOOMEUT ++ /xf0/x96/xa0/xb7 BAMUM LETTER PHASE-A SHUM ++ /xf0/x96/xa0/xb8 BAMUM LETTER PHASE-A LOMMAE ++ /xf0/x96/xa0/xb9 BAMUM LETTER PHASE-A FIRI ++ /xf0/x96/xa0/xba BAMUM LETTER PHASE-A ROM ++ /xf0/x96/xa0/xbb BAMUM LETTER PHASE-A KPOQ ++ /xf0/x96/xa0/xbc BAMUM LETTER PHASE-A SOQ ++ /xf0/x96/xa0/xbd BAMUM LETTER PHASE-A MAP PIEET ++ /xf0/x96/xa0/xbe BAMUM LETTER PHASE-A SHIRAE ++ /xf0/x96/xa0/xbf BAMUM LETTER PHASE-A NTAP ++ /xf0/x96/xa1/x80 BAMUM LETTER PHASE-A SHOQ NSHUT YUM ++ /xf0/x96/xa1/x81 BAMUM LETTER PHASE-A NYIT MONGKEUAEQ ++ /xf0/x96/xa1/x82 BAMUM LETTER PHASE-A PAARAE ++ /xf0/x96/xa1/x83 BAMUM LETTER PHASE-A NKAARAE ++ /xf0/x96/xa1/x84 BAMUM LETTER PHASE-A UNKNOWN ++ /xf0/x96/xa1/x85 BAMUM LETTER PHASE-A NGGEN ++ /xf0/x96/xa1/x86 BAMUM LETTER PHASE-A MAESI ++ /xf0/x96/xa1/x87 BAMUM LETTER PHASE-A NJAM ++ /xf0/x96/xa1/x88 BAMUM LETTER PHASE-A MBANYI ++ /xf0/x96/xa1/x89 BAMUM LETTER PHASE-A NYET ++ /xf0/x96/xa1/x8a BAMUM LETTER PHASE-A TEUAEN ++ /xf0/x96/xa1/x8b BAMUM LETTER PHASE-A SOT ++ /xf0/x96/xa1/x8c BAMUM LETTER PHASE-A PAAM ++ /xf0/x96/xa1/x8d BAMUM LETTER PHASE-A NSHIEE ++ /xf0/x96/xa1/x8e BAMUM LETTER PHASE-A MAEM ++ /xf0/x96/xa1/x8f BAMUM LETTER PHASE-A NYI ++ /xf0/x96/xa1/x90 BAMUM LETTER PHASE-A KAQ ++ /xf0/x96/xa1/x91 BAMUM LETTER PHASE-A NSHA ++ /xf0/x96/xa1/x92 BAMUM LETTER PHASE-A VEE ++ /xf0/x96/xa1/x93 BAMUM LETTER PHASE-A LU ++ /xf0/x96/xa1/x94 BAMUM LETTER PHASE-A NEN ++ /xf0/x96/xa1/x95 BAMUM LETTER PHASE-A NAQ ++ /xf0/x96/xa1/x96 BAMUM LETTER PHASE-A MBAQ ++ /xf0/x96/xa1/x97 BAMUM LETTER PHASE-B NSHUET ++ /xf0/x96/xa1/x98 BAMUM LETTER PHASE-B TU MAEMGBIEE ++ /xf0/x96/xa1/x99 BAMUM LETTER PHASE-B SIEE ++ /xf0/x96/xa1/x9a BAMUM LETTER PHASE-B SET TU ++ /xf0/x96/xa1/x9b BAMUM LETTER PHASE-B LOM NTEUM ++ /xf0/x96/xa1/x9c BAMUM LETTER PHASE-B MBA MAELEE ++ /xf0/x96/xa1/x9d BAMUM LETTER PHASE-B KIEEM ++ /xf0/x96/xa1/x9e BAMUM LETTER PHASE-B YEURAE ++ /xf0/x96/xa1/x9f BAMUM LETTER PHASE-B MBAARAE ++ /xf0/x96/xa1/xa0 BAMUM LETTER PHASE-B KAM ++ /xf0/x96/xa1/xa1 BAMUM LETTER PHASE-B PEESHI ++ /xf0/x96/xa1/xa2 BAMUM LETTER PHASE-B YAFU LEERAEWA ++ /xf0/x96/xa1/xa3 BAMUM LETTER PHASE-B LAM NSHUT NYAM ++ /xf0/x96/xa1/xa4 BAMUM LETTER PHASE-B NTIEE SHEUOQ ++ /xf0/x96/xa1/xa5 BAMUM LETTER PHASE-B NDU NJAA ++ /xf0/x96/xa1/xa6 BAMUM LETTER PHASE-B GHEUGHEUAEM ++ /xf0/x96/xa1/xa7 BAMUM LETTER PHASE-B PIT ++ /xf0/x96/xa1/xa8 BAMUM LETTER PHASE-B TU NSIEE ++ /xf0/x96/xa1/xa9 BAMUM LETTER PHASE-B SHET NJAQ ++ /xf0/x96/xa1/xaa BAMUM LETTER PHASE-B SHEUAEQTU ++ /xf0/x96/xa1/xab BAMUM LETTER PHASE-B MFON TEUAEQ ++ /xf0/x96/xa1/xac BAMUM LETTER PHASE-B MBIT MBAAKET ++ /xf0/x96/xa1/xad BAMUM LETTER PHASE-B NYI NTEUM ++ /xf0/x96/xa1/xae BAMUM LETTER PHASE-B KEUPUQ ++ /xf0/x96/xa1/xaf BAMUM LETTER PHASE-B GHEUGHEN ++ /xf0/x96/xa1/xb0 BAMUM LETTER PHASE-B KEUYEUX ++ /xf0/x96/xa1/xb1 BAMUM LETTER PHASE-B LAANAE ++ /xf0/x96/xa1/xb2 BAMUM LETTER PHASE-B PARUM ++ /xf0/x96/xa1/xb3 BAMUM LETTER PHASE-B VEUM ++ /xf0/x96/xa1/xb4 BAMUM LETTER PHASE-B NGKINDI MVOP ++ /xf0/x96/xa1/xb5 BAMUM LETTER PHASE-B NGGEU MBU ++ /xf0/x96/xa1/xb6 BAMUM LETTER PHASE-B WUAET ++ /xf0/x96/xa1/xb7 BAMUM LETTER PHASE-B SAKEUAE ++ /xf0/x96/xa1/xb8 BAMUM LETTER PHASE-B TAAM ++ /xf0/x96/xa1/xb9 BAMUM LETTER PHASE-B MEUQ ++ /xf0/x96/xa1/xba BAMUM LETTER PHASE-B NGGUOQ ++ /xf0/x96/xa1/xbb BAMUM LETTER PHASE-B NGGUOQ LARGE ++ /xf0/x96/xa1/xbc BAMUM LETTER PHASE-B MFIYAQ ++ /xf0/x96/xa1/xbd BAMUM LETTER PHASE-B SUE ++ /xf0/x96/xa1/xbe BAMUM LETTER PHASE-B MBEURI ++ /xf0/x96/xa1/xbf BAMUM LETTER PHASE-B MONTIEEN ++ /xf0/x96/xa2/x80 BAMUM LETTER PHASE-B NYAEMAE ++ /xf0/x96/xa2/x81 BAMUM LETTER PHASE-B PUNGAAM ++ /xf0/x96/xa2/x82 BAMUM LETTER PHASE-B MEUT NGGEET ++ /xf0/x96/xa2/x83 BAMUM LETTER PHASE-B FEUX ++ /xf0/x96/xa2/x84 BAMUM LETTER PHASE-B MBUOQ ++ /xf0/x96/xa2/x85 BAMUM LETTER PHASE-B FEE ++ /xf0/x96/xa2/x86 BAMUM LETTER PHASE-B KEUAEM ++ /xf0/x96/xa2/x87 BAMUM LETTER PHASE-B MA NJEUAENA ++ /xf0/x96/xa2/x88 BAMUM LETTER PHASE-B MA NJUQA ++ /xf0/x96/xa2/x89 BAMUM LETTER PHASE-B LET ++ /xf0/x96/xa2/x8a BAMUM LETTER PHASE-B NGGAAM ++ /xf0/x96/xa2/x8b BAMUM LETTER PHASE-B NSEN ++ /xf0/x96/xa2/x8c BAMUM LETTER PHASE-B MA ++ /xf0/x96/xa2/x8d BAMUM LETTER PHASE-B KIQ ++ /xf0/x96/xa2/x8e BAMUM LETTER PHASE-B NGOM ++ /xf0/x96/xa2/x8f BAMUM LETTER PHASE-C NGKUE MAEMBA ++ /xf0/x96/xa2/x90 BAMUM LETTER PHASE-C NZA ++ /xf0/x96/xa2/x91 BAMUM LETTER PHASE-C YUM ++ /xf0/x96/xa2/x92 BAMUM LETTER PHASE-C WANGKUOQ ++ /xf0/x96/xa2/x93 BAMUM LETTER PHASE-C NGGEN ++ /xf0/x96/xa2/x94 BAMUM LETTER PHASE-C NDEUAEREE ++ /xf0/x96/xa2/x95 BAMUM LETTER PHASE-C NGKAQ ++ /xf0/x96/xa2/x96 BAMUM LETTER PHASE-C GHARAE ++ /xf0/x96/xa2/x97 BAMUM LETTER PHASE-C MBEEKEET ++ /xf0/x96/xa2/x98 BAMUM LETTER PHASE-C GBAYI ++ /xf0/x96/xa2/x99 BAMUM LETTER PHASE-C NYIR MKPARAQ MEUN ++ /xf0/x96/xa2/x9a BAMUM LETTER PHASE-C NTU MBIT ++ /xf0/x96/xa2/x9b BAMUM LETTER PHASE-C MBEUM ++ /xf0/x96/xa2/x9c BAMUM LETTER PHASE-C PIRIEEN ++ /xf0/x96/xa2/x9d BAMUM LETTER PHASE-C NDOMBU ++ /xf0/x96/xa2/x9e BAMUM LETTER PHASE-C MBAA CABBAGE-TREE ++ /xf0/x96/xa2/x9f BAMUM LETTER PHASE-C KEUSHEUAEP ++ /xf0/x96/xa2/xa0 BAMUM LETTER PHASE-C GHAP ++ /xf0/x96/xa2/xa1 BAMUM LETTER PHASE-C KEUKAQ ++ /xf0/x96/xa2/xa2 BAMUM LETTER PHASE-C YU MUOMAE ++ /xf0/x96/xa2/xa3 BAMUM LETTER PHASE-C NZEUM ++ /xf0/x96/xa2/xa4 BAMUM LETTER PHASE-C MBUE ++ /xf0/x96/xa2/xa5 BAMUM LETTER PHASE-C NSEUAEN ++ /xf0/x96/xa2/xa6 BAMUM LETTER PHASE-C MBIT ++ /xf0/x96/xa2/xa7 BAMUM LETTER PHASE-C YEUQ ++ /xf0/x96/xa2/xa8 BAMUM LETTER PHASE-C KPARAQ ++ /xf0/x96/xa2/xa9 BAMUM LETTER PHASE-C KAA ++ /xf0/x96/xa2/xaa BAMUM LETTER PHASE-C SEUX ++ /xf0/x96/xa2/xab BAMUM LETTER PHASE-C NDIDA ++ /xf0/x96/xa2/xac BAMUM LETTER PHASE-C TAASHAE ++ /xf0/x96/xa2/xad BAMUM LETTER PHASE-C NJUEQ ++ /xf0/x96/xa2/xae BAMUM LETTER PHASE-C TITA YUE ++ /xf0/x96/xa2/xaf BAMUM LETTER PHASE-C SUAET ++ /xf0/x96/xa2/xb0 BAMUM LETTER PHASE-C NGGUAEN NYAM ++ /xf0/x96/xa2/xb1 BAMUM LETTER PHASE-C VEUX ++ /xf0/x96/xa2/xb2 BAMUM LETTER PHASE-C NANSANAQ ++ /xf0/x96/xa2/xb3 BAMUM LETTER PHASE-C MA KEUAERI ++ /xf0/x96/xa2/xb4 BAMUM LETTER PHASE-C NTAA ++ /xf0/x96/xa2/xb5 BAMUM LETTER PHASE-C NGGUON ++ /xf0/x96/xa2/xb6 BAMUM LETTER PHASE-C LAP ++ /xf0/x96/xa2/xb7 BAMUM LETTER PHASE-C MBIRIEEN ++ /xf0/x96/xa2/xb8 BAMUM LETTER PHASE-C MGBASAQ ++ /xf0/x96/xa2/xb9 BAMUM LETTER PHASE-C NTEUNGBA ++ /xf0/x96/xa2/xba BAMUM LETTER PHASE-C TEUTEUX ++ /xf0/x96/xa2/xbb BAMUM LETTER PHASE-C NGGUM ++ /xf0/x96/xa2/xbc BAMUM LETTER PHASE-C FUE ++ /xf0/x96/xa2/xbd BAMUM LETTER PHASE-C NDEUT ++ /xf0/x96/xa2/xbe BAMUM LETTER PHASE-C NSA ++ /xf0/x96/xa2/xbf BAMUM LETTER PHASE-C NSHAQ ++ /xf0/x96/xa3/x80 BAMUM LETTER PHASE-C BUNG ++ /xf0/x96/xa3/x81 BAMUM LETTER PHASE-C VEUAEPEN ++ /xf0/x96/xa3/x82 BAMUM LETTER PHASE-C MBERAE ++ /xf0/x96/xa3/x83 BAMUM LETTER PHASE-C RU ++ /xf0/x96/xa3/x84 BAMUM LETTER PHASE-C NJAEM ++ /xf0/x96/xa3/x85 BAMUM LETTER PHASE-C LAM ++ /xf0/x96/xa3/x86 BAMUM LETTER PHASE-C TITUAEP ++ /xf0/x96/xa3/x87 BAMUM LETTER PHASE-C NSUOT NGOM ++ /xf0/x96/xa3/x88 BAMUM LETTER PHASE-C NJEEEE ++ /xf0/x96/xa3/x89 BAMUM LETTER PHASE-C KET ++ /xf0/x96/xa3/x8a BAMUM LETTER PHASE-C NGGU ++ /xf0/x96/xa3/x8b BAMUM LETTER PHASE-C MAESI ++ /xf0/x96/xa3/x8c BAMUM LETTER PHASE-C MBUAEM ++ /xf0/x96/xa3/x8d BAMUM LETTER PHASE-C LU ++ /xf0/x96/xa3/x8e BAMUM LETTER PHASE-C KUT ++ /xf0/x96/xa3/x8f BAMUM LETTER PHASE-C NJAM ++ /xf0/x96/xa3/x90 BAMUM LETTER PHASE-C NGOM ++ /xf0/x96/xa3/x91 BAMUM LETTER PHASE-C WUP ++ /xf0/x96/xa3/x92 BAMUM LETTER PHASE-C NGGUEET ++ /xf0/x96/xa3/x93 BAMUM LETTER PHASE-C NSOM ++ /xf0/x96/xa3/x94 BAMUM LETTER PHASE-C NTEN ++ /xf0/x96/xa3/x95 BAMUM LETTER PHASE-C KUOP NKAARAE ++ /xf0/x96/xa3/x96 BAMUM LETTER PHASE-C NSUN ++ /xf0/x96/xa3/x97 BAMUM LETTER PHASE-C NDAM ++ /xf0/x96/xa3/x98 BAMUM LETTER PHASE-C MA NSIEE ++ /xf0/x96/xa3/x99 BAMUM LETTER PHASE-C YAA ++ /xf0/x96/xa3/x9a BAMUM LETTER PHASE-C NDAP ++ /xf0/x96/xa3/x9b BAMUM LETTER PHASE-C SHUEQ ++ /xf0/x96/xa3/x9c BAMUM LETTER PHASE-C SETFON ++ /xf0/x96/xa3/x9d BAMUM LETTER PHASE-C MBI ++ /xf0/x96/xa3/x9e BAMUM LETTER PHASE-C MAEMBA ++ /xf0/x96/xa3/x9f BAMUM LETTER PHASE-C MBANYI ++ /xf0/x96/xa3/xa0 BAMUM LETTER PHASE-C KEUSEUX ++ /xf0/x96/xa3/xa1 BAMUM LETTER PHASE-C MBEUX ++ /xf0/x96/xa3/xa2 BAMUM LETTER PHASE-C KEUM ++ /xf0/x96/xa3/xa3 BAMUM LETTER PHASE-C MBAA PICKET ++ /xf0/x96/xa3/xa4 BAMUM LETTER PHASE-C YUWOQ ++ /xf0/x96/xa3/xa5 BAMUM LETTER PHASE-C NJEUX ++ /xf0/x96/xa3/xa6 BAMUM LETTER PHASE-C MIEE ++ /xf0/x96/xa3/xa7 BAMUM LETTER PHASE-C MUAE ++ /xf0/x96/xa3/xa8 BAMUM LETTER PHASE-C SHIQ ++ /xf0/x96/xa3/xa9 BAMUM LETTER PHASE-C KEN LAW ++ /xf0/x96/xa3/xaa BAMUM LETTER PHASE-C KEN FATIGUE ++ /xf0/x96/xa3/xab BAMUM LETTER PHASE-C NGAQ ++ /xf0/x96/xa3/xac BAMUM LETTER PHASE-C NAQ ++ /xf0/x96/xa3/xad BAMUM LETTER PHASE-C LIQ ++ /xf0/x96/xa3/xae BAMUM LETTER PHASE-C PIN ++ /xf0/x96/xa3/xaf BAMUM LETTER PHASE-C PEN ++ /xf0/x96/xa3/xb0 BAMUM LETTER PHASE-C TET ++ /xf0/x96/xa3/xb1 BAMUM LETTER PHASE-D MBUO ++ /xf0/x96/xa3/xb2 BAMUM LETTER PHASE-D WAP ++ /xf0/x96/xa3/xb3 BAMUM LETTER PHASE-D NJI ++ /xf0/x96/xa3/xb4 BAMUM LETTER PHASE-D MFON ++ /xf0/x96/xa3/xb5 BAMUM LETTER PHASE-D NJIEE ++ /xf0/x96/xa3/xb6 BAMUM LETTER PHASE-D LIEE ++ /xf0/x96/xa3/xb7 BAMUM LETTER PHASE-D NJEUT ++ /xf0/x96/xa3/xb8 BAMUM LETTER PHASE-D NSHEE ++ /xf0/x96/xa3/xb9 BAMUM LETTER PHASE-D NGGAAMAE ++ /xf0/x96/xa3/xba BAMUM LETTER PHASE-D NYAM ++ /xf0/x96/xa3/xbb BAMUM LETTER PHASE-D WUAEN ++ /xf0/x96/xa3/xbc BAMUM LETTER PHASE-D NGKUN ++ /xf0/x96/xa3/xbd BAMUM LETTER PHASE-D SHEE ++ /xf0/x96/xa3/xbe BAMUM LETTER PHASE-D NGKAP ++ /xf0/x96/xa3/xbf BAMUM LETTER PHASE-D KEUAETMEUN ++ /xf0/x96/xa4/x80 BAMUM LETTER PHASE-D TEUT ++ /xf0/x96/xa4/x81 BAMUM LETTER PHASE-D SHEUAE ++ /xf0/x96/xa4/x82 BAMUM LETTER PHASE-D NJAP ++ /xf0/x96/xa4/x83 BAMUM LETTER PHASE-D SUE ++ /xf0/x96/xa4/x84 BAMUM LETTER PHASE-D KET ++ /xf0/x96/xa4/x85 BAMUM LETTER PHASE-D YAEMMAE ++ /xf0/x96/xa4/x86 BAMUM LETTER PHASE-D KUOM ++ /xf0/x96/xa4/x87 BAMUM LETTER PHASE-D SAP ++ /xf0/x96/xa4/x88 BAMUM LETTER PHASE-D MFEUT ++ /xf0/x96/xa4/x89 BAMUM LETTER PHASE-D NDEUX ++ /xf0/x96/xa4/x8a BAMUM LETTER PHASE-D MALEERI ++ /xf0/x96/xa4/x8b BAMUM LETTER PHASE-D MEUT ++ /xf0/x96/xa4/x8c BAMUM LETTER PHASE-D SEUAEQ ++ /xf0/x96/xa4/x8d BAMUM LETTER PHASE-D YEN ++ /xf0/x96/xa4/x8e BAMUM LETTER PHASE-D NJEUAEM ++ /xf0/x96/xa4/x8f BAMUM LETTER PHASE-D KEUOT MBUAE ++ /xf0/x96/xa4/x90 BAMUM LETTER PHASE-D NGKEURI ++ /xf0/x96/xa4/x91 BAMUM LETTER PHASE-D TU ++ /xf0/x96/xa4/x92 BAMUM LETTER PHASE-D GHAA ++ /xf0/x96/xa4/x93 BAMUM LETTER PHASE-D NGKYEE ++ /xf0/x96/xa4/x94 BAMUM LETTER PHASE-D FEUFEUAET ++ /xf0/x96/xa4/x95 BAMUM LETTER PHASE-D NDEE ++ /xf0/x96/xa4/x96 BAMUM LETTER PHASE-D MGBOFUM ++ /xf0/x96/xa4/x97 BAMUM LETTER PHASE-D LEUAEP ++ /xf0/x96/xa4/x98 BAMUM LETTER PHASE-D NDON ++ /xf0/x96/xa4/x99 BAMUM LETTER PHASE-D MONI ++ /xf0/x96/xa4/x9a BAMUM LETTER PHASE-D MGBEUN ++ /xf0/x96/xa4/x9b BAMUM LETTER PHASE-D PUUT ++ /xf0/x96/xa4/x9c BAMUM LETTER PHASE-D MGBIEE ++ /xf0/x96/xa4/x9d BAMUM LETTER PHASE-D MFO ++ /xf0/x96/xa4/x9e BAMUM LETTER PHASE-D LUM ++ /xf0/x96/xa4/x9f BAMUM LETTER PHASE-D NSIEEP ++ /xf0/x96/xa4/xa0 BAMUM LETTER PHASE-D MBAA ++ /xf0/x96/xa4/xa1 BAMUM LETTER PHASE-D KWAET ++ /xf0/x96/xa4/xa2 BAMUM LETTER PHASE-D NYET ++ /xf0/x96/xa4/xa3 BAMUM LETTER PHASE-D TEUAEN ++ /xf0/x96/xa4/xa4 BAMUM LETTER PHASE-D SOT ++ /xf0/x96/xa4/xa5 BAMUM LETTER PHASE-D YUWOQ ++ /xf0/x96/xa4/xa6 BAMUM LETTER PHASE-D KEUM ++ /xf0/x96/xa4/xa7 BAMUM LETTER PHASE-D RAEM ++ /xf0/x96/xa4/xa8 BAMUM LETTER PHASE-D TEEEE ++ /xf0/x96/xa4/xa9 BAMUM LETTER PHASE-D NGKEUAEQ ++ /xf0/x96/xa4/xaa BAMUM LETTER PHASE-D MFEUAE ++ /xf0/x96/xa4/xab BAMUM LETTER PHASE-D NSIEET ++ /xf0/x96/xa4/xac BAMUM LETTER PHASE-D KEUP ++ /xf0/x96/xa4/xad BAMUM LETTER PHASE-D PIP ++ /xf0/x96/xa4/xae BAMUM LETTER PHASE-D PEUTAE ++ /xf0/x96/xa4/xaf BAMUM LETTER PHASE-D NYUE ++ /xf0/x96/xa4/xb0 BAMUM LETTER PHASE-D LET ++ /xf0/x96/xa4/xb1 BAMUM LETTER PHASE-D NGGAAM ++ /xf0/x96/xa4/xb2 BAMUM LETTER PHASE-D MFIEE ++ /xf0/x96/xa4/xb3 BAMUM LETTER PHASE-D NGGWAEN ++ /xf0/x96/xa4/xb4 BAMUM LETTER PHASE-D YUOM ++ /xf0/x96/xa4/xb5 BAMUM LETTER PHASE-D PAP ++ /xf0/x96/xa4/xb6 BAMUM LETTER PHASE-D YUOP ++ /xf0/x96/xa4/xb7 BAMUM LETTER PHASE-D NDAM ++ /xf0/x96/xa4/xb8 BAMUM LETTER PHASE-D NTEUM ++ /xf0/x96/xa4/xb9 BAMUM LETTER PHASE-D SUAE ++ /xf0/x96/xa4/xba BAMUM LETTER PHASE-D KUN ++ /xf0/x96/xa4/xbb BAMUM LETTER PHASE-D NGGEUX ++ /xf0/x96/xa4/xbc BAMUM LETTER PHASE-D NGKIEE ++ /xf0/x96/xa4/xbd BAMUM LETTER PHASE-D TUOT ++ /xf0/x96/xa4/xbe BAMUM LETTER PHASE-D MEUN ++ /xf0/x96/xa4/xbf BAMUM LETTER PHASE-D KUQ ++ /xf0/x96/xa5/x80 BAMUM LETTER PHASE-D NSUM ++ /xf0/x96/xa5/x81 BAMUM LETTER PHASE-D TEUN ++ /xf0/x96/xa5/x82 BAMUM LETTER PHASE-D MAENJET ++ /xf0/x96/xa5/x83 BAMUM LETTER PHASE-D NGGAP ++ /xf0/x96/xa5/x84 BAMUM LETTER PHASE-D LEUM ++ /xf0/x96/xa5/x85 BAMUM LETTER PHASE-D NGGUOM ++ /xf0/x96/xa5/x86 BAMUM LETTER PHASE-D NSHUT ++ /xf0/x96/xa5/x87 BAMUM LETTER PHASE-D NJUEQ ++ /xf0/x96/xa5/x88 BAMUM LETTER PHASE-D GHEUAE ++ /xf0/x96/xa5/x89 BAMUM LETTER PHASE-D KU ++ /xf0/x96/xa5/x8a BAMUM LETTER PHASE-D REN OLD ++ /xf0/x96/xa5/x8b BAMUM LETTER PHASE-D TAE ++ /xf0/x96/xa5/x8c BAMUM LETTER PHASE-D TOQ ++ /xf0/x96/xa5/x8d BAMUM LETTER PHASE-D NYI ++ /xf0/x96/xa5/x8e BAMUM LETTER PHASE-D RII ++ /xf0/x96/xa5/x8f BAMUM LETTER PHASE-D LEEEE ++ /xf0/x96/xa5/x90 BAMUM LETTER PHASE-D MEEEE ++ /xf0/x96/xa5/x91 BAMUM LETTER PHASE-D M ++ /xf0/x96/xa5/x92 BAMUM LETTER PHASE-D SUU ++ /xf0/x96/xa5/x93 BAMUM LETTER PHASE-D MU ++ /xf0/x96/xa5/x94 BAMUM LETTER PHASE-D SHII ++ /xf0/x96/xa5/x95 BAMUM LETTER PHASE-D SHEUX ++ /xf0/x96/xa5/x96 BAMUM LETTER PHASE-D KYEE ++ /xf0/x96/xa5/x97 BAMUM LETTER PHASE-D NU ++ /xf0/x96/xa5/x98 BAMUM LETTER PHASE-D SHU ++ /xf0/x96/xa5/x99 BAMUM LETTER PHASE-D NTEE ++ /xf0/x96/xa5/x9a BAMUM LETTER PHASE-D PEE ++ /xf0/x96/xa5/x9b BAMUM LETTER PHASE-D NI ++ /xf0/x96/xa5/x9c BAMUM LETTER PHASE-D SHOQ ++ /xf0/x96/xa5/x9d BAMUM LETTER PHASE-D PUQ ++ /xf0/x96/xa5/x9e BAMUM LETTER PHASE-D MVOP ++ /xf0/x96/xa5/x9f BAMUM LETTER PHASE-D LOQ ++ /xf0/x96/xa5/xa0 BAMUM LETTER PHASE-D REN MUCH ++ /xf0/x96/xa5/xa1 BAMUM LETTER PHASE-D TI ++ /xf0/x96/xa5/xa2 BAMUM LETTER PHASE-D NTUU ++ /xf0/x96/xa5/xa3 BAMUM LETTER PHASE-D MBAA SEVEN ++ /xf0/x96/xa5/xa4 BAMUM LETTER PHASE-D SAQ ++ /xf0/x96/xa5/xa5 BAMUM LETTER PHASE-D FAA ++ /xf0/x96/xa5/xa6 BAMUM LETTER PHASE-E NDAP ++ /xf0/x96/xa5/xa7 BAMUM LETTER PHASE-E TOON ++ /xf0/x96/xa5/xa8 BAMUM LETTER PHASE-E MBEUM ++ /xf0/x96/xa5/xa9 BAMUM LETTER PHASE-E LAP ++ /xf0/x96/xa5/xaa BAMUM LETTER PHASE-E VOM ++ /xf0/x96/xa5/xab BAMUM LETTER PHASE-E LOON ++ /xf0/x96/xa5/xac BAMUM LETTER PHASE-E PAA ++ /xf0/x96/xa5/xad BAMUM LETTER PHASE-E SOM ++ /xf0/x96/xa5/xae BAMUM LETTER PHASE-E RAQ ++ /xf0/x96/xa5/xaf BAMUM LETTER PHASE-E NSHUOP ++ /xf0/x96/xa5/xb0 BAMUM LETTER PHASE-E NDUN ++ /xf0/x96/xa5/xb1 BAMUM LETTER PHASE-E PUAE ++ /xf0/x96/xa5/xb2 BAMUM LETTER PHASE-E TAM ++ /xf0/x96/xa5/xb3 BAMUM LETTER PHASE-E NGKA ++ /xf0/x96/xa5/xb4 BAMUM LETTER PHASE-E KPEUX ++ /xf0/x96/xa5/xb5 BAMUM LETTER PHASE-E WUO ++ /xf0/x96/xa5/xb6 BAMUM LETTER PHASE-E SEE ++ /xf0/x96/xa5/xb7 BAMUM LETTER PHASE-E NGGEUAET ++ /xf0/x96/xa5/xb8 BAMUM LETTER PHASE-E PAAM ++ /xf0/x96/xa5/xb9 BAMUM LETTER PHASE-E TOO ++ /xf0/x96/xa5/xba BAMUM LETTER PHASE-E KUOP ++ /xf0/x96/xa5/xbb BAMUM LETTER PHASE-E LOM ++ /xf0/x96/xa5/xbc BAMUM LETTER PHASE-E NSHIEE ++ /xf0/x96/xa5/xbd BAMUM LETTER PHASE-E NGOP ++ /xf0/x96/xa5/xbe BAMUM LETTER PHASE-E MAEM ++ /xf0/x96/xa5/xbf BAMUM LETTER PHASE-E NGKEUX ++ /xf0/x96/xa6/x80 BAMUM LETTER PHASE-E NGOQ ++ /xf0/x96/xa6/x81 BAMUM LETTER PHASE-E NSHUE ++ /xf0/x96/xa6/x82 BAMUM LETTER PHASE-E RIMGBA ++ /xf0/x96/xa6/x83 BAMUM LETTER PHASE-E NJEUX ++ /xf0/x96/xa6/x84 BAMUM LETTER PHASE-E PEEM ++ /xf0/x96/xa6/x85 BAMUM LETTER PHASE-E SAA ++ /xf0/x96/xa6/x86 BAMUM LETTER PHASE-E NGGURAE ++ /xf0/x96/xa6/x87 BAMUM LETTER PHASE-E MGBA ++ /xf0/x96/xa6/x88 BAMUM LETTER PHASE-E GHEUX ++ /xf0/x96/xa6/x89 BAMUM LETTER PHASE-E NGKEUAEM ++ /xf0/x96/xa6/x8a BAMUM LETTER PHASE-E NJAEMLI ++ /xf0/x96/xa6/x8b BAMUM LETTER PHASE-E MAP ++ /xf0/x96/xa6/x8c BAMUM LETTER PHASE-E LOOT ++ /xf0/x96/xa6/x8d BAMUM LETTER PHASE-E NGGEEEE ++ /xf0/x96/xa6/x8e BAMUM LETTER PHASE-E NDIQ ++ /xf0/x96/xa6/x8f BAMUM LETTER PHASE-E TAEN NTEUM ++ /xf0/x96/xa6/x90 BAMUM LETTER PHASE-E SET ++ /xf0/x96/xa6/x91 BAMUM LETTER PHASE-E PUM ++ /xf0/x96/xa6/x92 BAMUM LETTER PHASE-E NDAA SOFTNESS ++ /xf0/x96/xa6/x93 BAMUM LETTER PHASE-E NGGUAESHAE NYAM ++ /xf0/x96/xa6/x94 BAMUM LETTER PHASE-E YIEE ++ /xf0/x96/xa6/x95 BAMUM LETTER PHASE-E GHEUN ++ /xf0/x96/xa6/x96 BAMUM LETTER PHASE-E TUAE ++ /xf0/x96/xa6/x97 BAMUM LETTER PHASE-E YEUAE ++ /xf0/x96/xa6/x98 BAMUM LETTER PHASE-E PO ++ /xf0/x96/xa6/x99 BAMUM LETTER PHASE-E TUMAE ++ /xf0/x96/xa6/x9a BAMUM LETTER PHASE-E KEUAE ++ /xf0/x96/xa6/x9b BAMUM LETTER PHASE-E SUAEN ++ /xf0/x96/xa6/x9c BAMUM LETTER PHASE-E TEUAEQ ++ /xf0/x96/xa6/x9d BAMUM LETTER PHASE-E VEUAE ++ /xf0/x96/xa6/x9e BAMUM LETTER PHASE-E WEUX ++ /xf0/x96/xa6/x9f BAMUM LETTER PHASE-E LAAM ++ /xf0/x96/xa6/xa0 BAMUM LETTER PHASE-E PU ++ /xf0/x96/xa6/xa1 BAMUM LETTER PHASE-E TAAQ ++ /xf0/x96/xa6/xa2 BAMUM LETTER PHASE-E GHAAMAE ++ /xf0/x96/xa6/xa3 BAMUM LETTER PHASE-E NGEUREUT ++ /xf0/x96/xa6/xa4 BAMUM LETTER PHASE-E SHEUAEQ ++ /xf0/x96/xa6/xa5 BAMUM LETTER PHASE-E MGBEN ++ /xf0/x96/xa6/xa6 BAMUM LETTER PHASE-E MBEE ++ /xf0/x96/xa6/xa7 BAMUM LETTER PHASE-E NZAQ ++ /xf0/x96/xa6/xa8 BAMUM LETTER PHASE-E NKOM ++ /xf0/x96/xa6/xa9 BAMUM LETTER PHASE-E GBET ++ /xf0/x96/xa6/xaa BAMUM LETTER PHASE-E TUM ++ /xf0/x96/xa6/xab BAMUM LETTER PHASE-E KUET ++ /xf0/x96/xa6/xac BAMUM LETTER PHASE-E YAP ++ /xf0/x96/xa6/xad BAMUM LETTER PHASE-E NYI CLEAVER ++ /xf0/x96/xa6/xae BAMUM LETTER PHASE-E YIT ++ /xf0/x96/xa6/xaf BAMUM LETTER PHASE-E MFEUQ ++ /xf0/x96/xa6/xb0 BAMUM LETTER PHASE-E NDIAQ ++ /xf0/x96/xa6/xb1 BAMUM LETTER PHASE-E PIEEQ ++ /xf0/x96/xa6/xb2 BAMUM LETTER PHASE-E YUEQ ++ /xf0/x96/xa6/xb3 BAMUM LETTER PHASE-E LEUAEM ++ /xf0/x96/xa6/xb4 BAMUM LETTER PHASE-E FUE ++ /xf0/x96/xa6/xb5 BAMUM LETTER PHASE-E GBEUX ++ /xf0/x96/xa6/xb6 BAMUM LETTER PHASE-E NGKUP ++ /xf0/x96/xa6/xb7 BAMUM LETTER PHASE-E KET ++ /xf0/x96/xa6/xb8 BAMUM LETTER PHASE-E MAE ++ /xf0/x96/xa6/xb9 BAMUM LETTER PHASE-E NGKAAMI ++ /xf0/x96/xa6/xba BAMUM LETTER PHASE-E GHET ++ /xf0/x96/xa6/xbb BAMUM LETTER PHASE-E FA ++ /xf0/x96/xa6/xbc BAMUM LETTER PHASE-E NTUM ++ /xf0/x96/xa6/xbd BAMUM LETTER PHASE-E PEUT ++ /xf0/x96/xa6/xbe BAMUM LETTER PHASE-E YEUM ++ /xf0/x96/xa6/xbf BAMUM LETTER PHASE-E NGGEUAE ++ /xf0/x96/xa7/x80 BAMUM LETTER PHASE-E NYI BETWEEN ++ /xf0/x96/xa7/x81 BAMUM LETTER PHASE-E NZUQ ++ /xf0/x96/xa7/x82 BAMUM LETTER PHASE-E POON ++ /xf0/x96/xa7/x83 BAMUM LETTER PHASE-E MIEE ++ /xf0/x96/xa7/x84 BAMUM LETTER PHASE-E FUET ++ /xf0/x96/xa7/x85 BAMUM LETTER PHASE-E NAE ++ /xf0/x96/xa7/x86 BAMUM LETTER PHASE-E MUAE ++ /xf0/x96/xa7/x87 BAMUM LETTER PHASE-E GHEUAE ++ /xf0/x96/xa7/x88 BAMUM LETTER PHASE-E FU I ++ /xf0/x96/xa7/x89 BAMUM LETTER PHASE-E MVI ++ /xf0/x96/xa7/x8a BAMUM LETTER PHASE-E PUAQ ++ /xf0/x96/xa7/x8b BAMUM LETTER PHASE-E NGKUM ++ /xf0/x96/xa7/x8c BAMUM LETTER PHASE-E KUT ++ /xf0/x96/xa7/x8d BAMUM LETTER PHASE-E PIET ++ /xf0/x96/xa7/x8e BAMUM LETTER PHASE-E NTAP ++ /xf0/x96/xa7/x8f BAMUM LETTER PHASE-E YEUAET ++ /xf0/x96/xa7/x90 BAMUM LETTER PHASE-E NGGUP ++ /xf0/x96/xa7/x91 BAMUM LETTER PHASE-E PA PEOPLE ++ /xf0/x96/xa7/x92 BAMUM LETTER PHASE-E FU CALL ++ /xf0/x96/xa7/x93 BAMUM LETTER PHASE-E FOM ++ /xf0/x96/xa7/x94 BAMUM LETTER PHASE-E NJEE ++ /xf0/x96/xa7/x95 BAMUM LETTER PHASE-E A ++ /xf0/x96/xa7/x96 BAMUM LETTER PHASE-E TOQ ++ /xf0/x96/xa7/x97 BAMUM LETTER PHASE-E O ++ /xf0/x96/xa7/x98 BAMUM LETTER PHASE-E I ++ /xf0/x96/xa7/x99 BAMUM LETTER PHASE-E LAQ ++ /xf0/x96/xa7/x9a BAMUM LETTER PHASE-E PA PLURAL ++ /xf0/x96/xa7/x9b BAMUM LETTER PHASE-E TAA ++ /xf0/x96/xa7/x9c BAMUM LETTER PHASE-E TAQ ++ /xf0/x96/xa7/x9d BAMUM LETTER PHASE-E NDAA MY HOUSE ++ /xf0/x96/xa7/x9e BAMUM LETTER PHASE-E SHIQ ++ /xf0/x96/xa7/x9f BAMUM LETTER PHASE-E YEUX ++ /xf0/x96/xa7/xa0 BAMUM LETTER PHASE-E NGUAE ++ /xf0/x96/xa7/xa1 BAMUM LETTER PHASE-E YUAEN ++ /xf0/x96/xa7/xa2 BAMUM LETTER PHASE-E YOQ SWIMMING ++ /xf0/x96/xa7/xa3 BAMUM LETTER PHASE-E YOQ COVER ++ /xf0/x96/xa7/xa4 BAMUM LETTER PHASE-E YUQ ++ /xf0/x96/xa7/xa5 BAMUM LETTER PHASE-E YUN ++ /xf0/x96/xa7/xa6 BAMUM LETTER PHASE-E KEUX ++ /xf0/x96/xa7/xa7 BAMUM LETTER PHASE-E PEUX ++ /xf0/x96/xa7/xa8 BAMUM LETTER PHASE-E NJEE EPOCH ++ /xf0/x96/xa7/xa9 BAMUM LETTER PHASE-E PUE ++ /xf0/x96/xa7/xaa BAMUM LETTER PHASE-E WUE ++ /xf0/x96/xa7/xab BAMUM LETTER PHASE-E FEE ++ /xf0/x96/xa7/xac BAMUM LETTER PHASE-E VEE ++ /xf0/x96/xa7/xad BAMUM LETTER PHASE-E LU ++ /xf0/x96/xa7/xae BAMUM LETTER PHASE-E MI ++ /xf0/x96/xa7/xaf BAMUM LETTER PHASE-E REUX ++ /xf0/x96/xa7/xb0 BAMUM LETTER PHASE-E RAE ++ /xf0/x96/xa7/xb1 BAMUM LETTER PHASE-E NGUAET ++ /xf0/x96/xa7/xb2 BAMUM LETTER PHASE-E NGA ++ /xf0/x96/xa7/xb3 BAMUM LETTER PHASE-E SHO ++ /xf0/x96/xa7/xb4 BAMUM LETTER PHASE-E SHOQ ++ /xf0/x96/xa7/xb5 BAMUM LETTER PHASE-E FU REMEDY ++ /xf0/x96/xa7/xb6 BAMUM LETTER PHASE-E NA ++ /xf0/x96/xa7/xb7 BAMUM LETTER PHASE-E PI ++ /xf0/x96/xa7/xb8 BAMUM LETTER PHASE-E LOQ ++ /xf0/x96/xa7/xb9 BAMUM LETTER PHASE-E KO ++ /xf0/x96/xa7/xba BAMUM LETTER PHASE-E MEN ++ /xf0/x96/xa7/xbb BAMUM LETTER PHASE-E MA ++ /xf0/x96/xa7/xbc BAMUM LETTER PHASE-E MAQ ++ /xf0/x96/xa7/xbd BAMUM LETTER PHASE-E TEU ++ /xf0/x96/xa7/xbe BAMUM LETTER PHASE-E KI ++ /xf0/x96/xa7/xbf BAMUM LETTER PHASE-E MON ++ /xf0/x96/xa8/x80 BAMUM LETTER PHASE-E TEN ++ /xf0/x96/xa8/x81 BAMUM LETTER PHASE-E FAQ ++ /xf0/x96/xa8/x82 BAMUM LETTER PHASE-E GHOM ++ /xf0/x96/xa8/x83 BAMUM LETTER PHASE-F KA ++ /xf0/x96/xa8/x84 BAMUM LETTER PHASE-F U ++ /xf0/x96/xa8/x85 BAMUM LETTER PHASE-F KU ++ /xf0/x96/xa8/x86 BAMUM LETTER PHASE-F EE ++ /xf0/x96/xa8/x87 BAMUM LETTER PHASE-F REE ++ /xf0/x96/xa8/x88 BAMUM LETTER PHASE-F TAE ++ /xf0/x96/xa8/x89 BAMUM LETTER PHASE-F NYI ++ /xf0/x96/xa8/x8a BAMUM LETTER PHASE-F LA ++ /xf0/x96/xa8/x8b BAMUM LETTER PHASE-F RII ++ /xf0/x96/xa8/x8c BAMUM LETTER PHASE-F RIEE ++ /xf0/x96/xa8/x8d BAMUM LETTER PHASE-F MEEEE ++ /xf0/x96/xa8/x8e BAMUM LETTER PHASE-F TAA ++ /xf0/x96/xa8/x8f BAMUM LETTER PHASE-F NDAA ++ /xf0/x96/xa8/x90 BAMUM LETTER PHASE-F NJAEM ++ /xf0/x96/xa8/x91 BAMUM LETTER PHASE-F M ++ /xf0/x96/xa8/x92 BAMUM LETTER PHASE-F SUU ++ /xf0/x96/xa8/x93 BAMUM LETTER PHASE-F SHII ++ /xf0/x96/xa8/x94 BAMUM LETTER PHASE-F SI ++ /xf0/x96/xa8/x95 BAMUM LETTER PHASE-F SEUX ++ /xf0/x96/xa8/x96 BAMUM LETTER PHASE-F KYEE ++ /xf0/x96/xa8/x97 BAMUM LETTER PHASE-F KET ++ /xf0/x96/xa8/x98 BAMUM LETTER PHASE-F NUAE ++ /xf0/x96/xa8/x99 BAMUM LETTER PHASE-F NU ++ /xf0/x96/xa8/x9a BAMUM LETTER PHASE-F NJUAE ++ /xf0/x96/xa8/x9b BAMUM LETTER PHASE-F YOQ ++ /xf0/x96/xa8/x9c BAMUM LETTER PHASE-F SHU ++ /xf0/x96/xa8/x9d BAMUM LETTER PHASE-F YA ++ /xf0/x96/xa8/x9e BAMUM LETTER PHASE-F NSHA ++ /xf0/x96/xa8/x9f BAMUM LETTER PHASE-F PEUX ++ /xf0/x96/xa8/xa0 BAMUM LETTER PHASE-F NTEE ++ /xf0/x96/xa8/xa1 BAMUM LETTER PHASE-F WUE ++ /xf0/x96/xa8/xa2 BAMUM LETTER PHASE-F PEE ++ /xf0/x96/xa8/xa3 BAMUM LETTER PHASE-F RU ++ /xf0/x96/xa8/xa4 BAMUM LETTER PHASE-F NI ++ /xf0/x96/xa8/xa5 BAMUM LETTER PHASE-F REUX ++ /xf0/x96/xa8/xa6 BAMUM LETTER PHASE-F KEN ++ /xf0/x96/xa8/xa7 BAMUM LETTER PHASE-F NGKWAEN ++ /xf0/x96/xa8/xa8 BAMUM LETTER PHASE-F NGGA ++ /xf0/x96/xa8/xa9 BAMUM LETTER PHASE-F SHO ++ /xf0/x96/xa8/xaa BAMUM LETTER PHASE-F PUAE ++ /xf0/x96/xa8/xab BAMUM LETTER PHASE-F FOM ++ /xf0/x96/xa8/xac BAMUM LETTER PHASE-F WA ++ /xf0/x96/xa8/xad BAMUM LETTER PHASE-F LI ++ /xf0/x96/xa8/xae BAMUM LETTER PHASE-F LOQ ++ /xf0/x96/xa8/xaf BAMUM LETTER PHASE-F KO ++ /xf0/x96/xa8/xb0 BAMUM LETTER PHASE-F MBEN ++ /xf0/x96/xa8/xb1 BAMUM LETTER PHASE-F REN ++ /xf0/x96/xa8/xb2 BAMUM LETTER PHASE-F MA ++ /xf0/x96/xa8/xb3 BAMUM LETTER PHASE-F MO ++ /xf0/x96/xa8/xb4 BAMUM LETTER PHASE-F MBAA ++ /xf0/x96/xa8/xb5 BAMUM LETTER PHASE-F TET ++ /xf0/x96/xa8/xb6 BAMUM LETTER PHASE-F KPA ++ /xf0/x96/xa8/xb7 BAMUM LETTER PHASE-F SAMBA ++ /xf0/x96/xa8/xb8 BAMUM LETTER PHASE-F VUEQ ++ /xf0/x9b/x80/x80 KATAKANA LETTER ARCHAIC E ++ /xf0/x9b/x80/x81 HIRAGANA LETTER ARCHAIC YE + /xf0/x9d/x80/x80 BYZANTINE MUSICAL SYMBOL PSILI + /xf0/x9d/x80/x81 BYZANTINE MUSICAL SYMBOL DASEIA + /xf0/x9d/x80/x82 BYZANTINE MUSICAL SYMBOL PERISPOMENI +@@ -30151,6 +33445,1091 @@ CHARMAP + /xf0/x9f/x82/x91 DOMINO TILE VERTICAL-06-04 + /xf0/x9f/x82/x92 DOMINO TILE VERTICAL-06-05 + /xf0/x9f/x82/x93 DOMINO TILE VERTICAL-06-06 ++ /xf0/x9f/x82/xa0 PLAYING CARD BACK ++ /xf0/x9f/x82/xa1 PLAYING CARD ACE OF SPADES ++ /xf0/x9f/x82/xa2 PLAYING CARD TWO OF SPADES ++ /xf0/x9f/x82/xa3 PLAYING CARD THREE OF SPADES ++ /xf0/x9f/x82/xa4 PLAYING CARD FOUR OF SPADES ++ /xf0/x9f/x82/xa5 PLAYING CARD FIVE OF SPADES ++ /xf0/x9f/x82/xa6 PLAYING CARD SIX OF SPADES ++ /xf0/x9f/x82/xa7 PLAYING CARD SEVEN OF SPADES ++ /xf0/x9f/x82/xa8 PLAYING CARD EIGHT OF SPADES ++ /xf0/x9f/x82/xa9 PLAYING CARD NINE OF SPADES ++ /xf0/x9f/x82/xaa PLAYING CARD TEN OF SPADES ++ /xf0/x9f/x82/xab PLAYING CARD JACK OF SPADES ++ /xf0/x9f/x82/xac PLAYING CARD KNIGHT OF SPADES ++ /xf0/x9f/x82/xad PLAYING CARD QUEEN OF SPADES ++ /xf0/x9f/x82/xae PLAYING CARD KING OF SPADES ++ /xf0/x9f/x82/xb1 PLAYING CARD ACE OF HEARTS ++ /xf0/x9f/x82/xb2 PLAYING CARD TWO OF HEARTS ++ /xf0/x9f/x82/xb3 PLAYING CARD THREE OF HEARTS ++ /xf0/x9f/x82/xb4 PLAYING CARD FOUR OF HEARTS ++ /xf0/x9f/x82/xb5 PLAYING CARD FIVE OF HEARTS ++ /xf0/x9f/x82/xb6 PLAYING CARD SIX OF HEARTS ++ /xf0/x9f/x82/xb7 PLAYING CARD SEVEN OF HEARTS ++ /xf0/x9f/x82/xb8 PLAYING CARD EIGHT OF HEARTS ++ /xf0/x9f/x82/xb9 PLAYING CARD NINE OF HEARTS ++ /xf0/x9f/x82/xba PLAYING CARD TEN OF HEARTS ++ /xf0/x9f/x82/xbb PLAYING CARD JACK OF HEARTS ++ /xf0/x9f/x82/xbc PLAYING CARD KNIGHT OF HEARTS ++ /xf0/x9f/x82/xbd PLAYING CARD QUEEN OF HEARTS ++ /xf0/x9f/x82/xbe PLAYING CARD KING OF HEARTS ++ /xf0/x9f/x83/x81 PLAYING CARD ACE OF DIAMONDS ++ /xf0/x9f/x83/x82 PLAYING CARD TWO OF DIAMONDS ++ /xf0/x9f/x83/x83 PLAYING CARD THREE OF DIAMONDS ++ /xf0/x9f/x83/x84 PLAYING CARD FOUR OF DIAMONDS ++ /xf0/x9f/x83/x85 PLAYING CARD FIVE OF DIAMONDS ++ /xf0/x9f/x83/x86 PLAYING CARD SIX OF DIAMONDS ++ /xf0/x9f/x83/x87 PLAYING CARD SEVEN OF DIAMONDS ++ /xf0/x9f/x83/x88 PLAYING CARD EIGHT OF DIAMONDS ++ /xf0/x9f/x83/x89 PLAYING CARD NINE OF DIAMONDS ++ /xf0/x9f/x83/x8a PLAYING CARD TEN OF DIAMONDS ++ /xf0/x9f/x83/x8b PLAYING CARD JACK OF DIAMONDS ++ /xf0/x9f/x83/x8c PLAYING CARD KNIGHT OF DIAMONDS ++ /xf0/x9f/x83/x8d PLAYING CARD QUEEN OF DIAMONDS ++ /xf0/x9f/x83/x8e PLAYING CARD KING OF DIAMONDS ++ /xf0/x9f/x83/x8f PLAYING CARD BLACK JOKER ++ /xf0/x9f/x83/x91 PLAYING CARD ACE OF CLUBS ++ /xf0/x9f/x83/x92 PLAYING CARD TWO OF CLUBS ++ /xf0/x9f/x83/x93 PLAYING CARD THREE OF CLUBS ++ /xf0/x9f/x83/x94 PLAYING CARD FOUR OF CLUBS ++ /xf0/x9f/x83/x95 PLAYING CARD FIVE OF CLUBS ++ /xf0/x9f/x83/x96 PLAYING CARD SIX OF CLUBS ++ /xf0/x9f/x83/x97 PLAYING CARD SEVEN OF CLUBS ++ /xf0/x9f/x83/x98 PLAYING CARD EIGHT OF CLUBS ++ /xf0/x9f/x83/x99 PLAYING CARD NINE OF CLUBS ++ /xf0/x9f/x83/x9a PLAYING CARD TEN OF CLUBS ++ /xf0/x9f/x83/x9b PLAYING CARD JACK OF CLUBS ++ /xf0/x9f/x83/x9c PLAYING CARD KNIGHT OF CLUBS ++ /xf0/x9f/x83/x9d PLAYING CARD QUEEN OF CLUBS ++ /xf0/x9f/x83/x9e PLAYING CARD KING OF CLUBS ++ /xf0/x9f/x83/x9f PLAYING CARD WHITE JOKER ++ /xf0/x9f/x84/x80 DIGIT ZERO FULL STOP ++ /xf0/x9f/x84/x81 DIGIT ZERO COMMA ++ /xf0/x9f/x84/x82 DIGIT ONE COMMA ++ /xf0/x9f/x84/x83 DIGIT TWO COMMA ++ /xf0/x9f/x84/x84 DIGIT THREE COMMA ++ /xf0/x9f/x84/x85 DIGIT FOUR COMMA ++ /xf0/x9f/x84/x86 DIGIT FIVE COMMA ++ /xf0/x9f/x84/x87 DIGIT SIX COMMA ++ /xf0/x9f/x84/x88 DIGIT SEVEN COMMA ++ /xf0/x9f/x84/x89 DIGIT EIGHT COMMA ++ /xf0/x9f/x84/x8a DIGIT NINE COMMA ++ /xf0/x9f/x84/x90 PARENTHESIZED LATIN CAPITAL LETTER A ++ /xf0/x9f/x84/x91 PARENTHESIZED LATIN CAPITAL LETTER B ++ /xf0/x9f/x84/x92 PARENTHESIZED LATIN CAPITAL LETTER C ++ /xf0/x9f/x84/x93 PARENTHESIZED LATIN CAPITAL LETTER D ++ /xf0/x9f/x84/x94 PARENTHESIZED LATIN CAPITAL LETTER E ++ /xf0/x9f/x84/x95 PARENTHESIZED LATIN CAPITAL LETTER F ++ /xf0/x9f/x84/x96 PARENTHESIZED LATIN CAPITAL LETTER G ++ /xf0/x9f/x84/x97 PARENTHESIZED LATIN CAPITAL LETTER H ++ /xf0/x9f/x84/x98 PARENTHESIZED LATIN CAPITAL LETTER I ++ /xf0/x9f/x84/x99 PARENTHESIZED LATIN CAPITAL LETTER J ++ /xf0/x9f/x84/x9a PARENTHESIZED LATIN CAPITAL LETTER K ++ /xf0/x9f/x84/x9b PARENTHESIZED LATIN CAPITAL LETTER L ++ /xf0/x9f/x84/x9c PARENTHESIZED LATIN CAPITAL LETTER M ++ /xf0/x9f/x84/x9d PARENTHESIZED LATIN CAPITAL LETTER N ++ /xf0/x9f/x84/x9e PARENTHESIZED LATIN CAPITAL LETTER O ++ /xf0/x9f/x84/x9f PARENTHESIZED LATIN CAPITAL LETTER P ++ /xf0/x9f/x84/xa0 PARENTHESIZED LATIN CAPITAL LETTER Q ++ /xf0/x9f/x84/xa1 PARENTHESIZED LATIN CAPITAL LETTER R ++ /xf0/x9f/x84/xa2 PARENTHESIZED LATIN CAPITAL LETTER S ++ /xf0/x9f/x84/xa3 PARENTHESIZED LATIN CAPITAL LETTER T ++ /xf0/x9f/x84/xa4 PARENTHESIZED LATIN CAPITAL LETTER U ++ /xf0/x9f/x84/xa5 PARENTHESIZED LATIN CAPITAL LETTER V ++ /xf0/x9f/x84/xa6 PARENTHESIZED LATIN CAPITAL LETTER W ++ /xf0/x9f/x84/xa7 PARENTHESIZED LATIN CAPITAL LETTER X ++ /xf0/x9f/x84/xa8 PARENTHESIZED LATIN CAPITAL LETTER Y ++ /xf0/x9f/x84/xa9 PARENTHESIZED LATIN CAPITAL LETTER Z ++ /xf0/x9f/x84/xaa TORTOISE SHELL BRACKETED LATIN CAPITAL LETTER S ++ /xf0/x9f/x84/xab CIRCLED ITALIC LATIN CAPITAL LETTER C ++ /xf0/x9f/x84/xac CIRCLED ITALIC LATIN CAPITAL LETTER R ++ /xf0/x9f/x84/xad CIRCLED CD ++ /xf0/x9f/x84/xae CIRCLED WZ ++ /xf0/x9f/x84/xb0 SQUARED LATIN CAPITAL LETTER A ++ /xf0/x9f/x84/xb1 SQUARED LATIN CAPITAL LETTER B ++ /xf0/x9f/x84/xb2 SQUARED LATIN CAPITAL LETTER C ++ /xf0/x9f/x84/xb3 SQUARED LATIN CAPITAL LETTER D ++ /xf0/x9f/x84/xb4 SQUARED LATIN CAPITAL LETTER E ++ /xf0/x9f/x84/xb5 SQUARED LATIN CAPITAL LETTER F ++ /xf0/x9f/x84/xb6 SQUARED LATIN CAPITAL LETTER G ++ /xf0/x9f/x84/xb7 SQUARED LATIN CAPITAL LETTER H ++ /xf0/x9f/x84/xb8 SQUARED LATIN CAPITAL LETTER I ++ /xf0/x9f/x84/xb9 SQUARED LATIN CAPITAL LETTER J ++ /xf0/x9f/x84/xba SQUARED LATIN CAPITAL LETTER K ++ /xf0/x9f/x84/xbb SQUARED LATIN CAPITAL LETTER L ++ /xf0/x9f/x84/xbc SQUARED LATIN CAPITAL LETTER M ++ /xf0/x9f/x84/xbd SQUARED LATIN CAPITAL LETTER N ++ /xf0/x9f/x84/xbe SQUARED LATIN CAPITAL LETTER O ++ /xf0/x9f/x84/xbf SQUARED LATIN CAPITAL LETTER P ++ /xf0/x9f/x85/x80 SQUARED LATIN CAPITAL LETTER Q ++ /xf0/x9f/x85/x81 SQUARED LATIN CAPITAL LETTER R ++ /xf0/x9f/x85/x82 SQUARED LATIN CAPITAL LETTER S ++ /xf0/x9f/x85/x83 SQUARED LATIN CAPITAL LETTER T ++ /xf0/x9f/x85/x84 SQUARED LATIN CAPITAL LETTER U ++ /xf0/x9f/x85/x85 SQUARED LATIN CAPITAL LETTER V ++ /xf0/x9f/x85/x86 SQUARED LATIN CAPITAL LETTER W ++ /xf0/x9f/x85/x87 SQUARED LATIN CAPITAL LETTER X ++ /xf0/x9f/x85/x88 SQUARED LATIN CAPITAL LETTER Y ++ /xf0/x9f/x85/x89 SQUARED LATIN CAPITAL LETTER Z ++ /xf0/x9f/x85/x8a SQUARED HV ++ /xf0/x9f/x85/x8b SQUARED MV ++ /xf0/x9f/x85/x8c SQUARED SD ++ /xf0/x9f/x85/x8d SQUARED SS ++ /xf0/x9f/x85/x8e SQUARED PPV ++ /xf0/x9f/x85/x8f SQUARED WC ++ /xf0/x9f/x85/x90 NEGATIVE CIRCLED LATIN CAPITAL LETTER A ++ /xf0/x9f/x85/x91 NEGATIVE CIRCLED LATIN CAPITAL LETTER B ++ /xf0/x9f/x85/x92 NEGATIVE CIRCLED LATIN CAPITAL LETTER C ++ /xf0/x9f/x85/x93 NEGATIVE CIRCLED LATIN CAPITAL LETTER D ++ /xf0/x9f/x85/x94 NEGATIVE CIRCLED LATIN CAPITAL LETTER E ++ /xf0/x9f/x85/x95 NEGATIVE CIRCLED LATIN CAPITAL LETTER F ++ /xf0/x9f/x85/x96 NEGATIVE CIRCLED LATIN CAPITAL LETTER G ++ /xf0/x9f/x85/x97 NEGATIVE CIRCLED LATIN CAPITAL LETTER H ++ /xf0/x9f/x85/x98 NEGATIVE CIRCLED LATIN CAPITAL LETTER I ++ /xf0/x9f/x85/x99 NEGATIVE CIRCLED LATIN CAPITAL LETTER J ++ /xf0/x9f/x85/x9a NEGATIVE CIRCLED LATIN CAPITAL LETTER K ++ /xf0/x9f/x85/x9b NEGATIVE CIRCLED LATIN CAPITAL LETTER L ++ /xf0/x9f/x85/x9c NEGATIVE CIRCLED LATIN CAPITAL LETTER M ++ /xf0/x9f/x85/x9d NEGATIVE CIRCLED LATIN CAPITAL LETTER N ++ /xf0/x9f/x85/x9e NEGATIVE CIRCLED LATIN CAPITAL LETTER O ++ /xf0/x9f/x85/x9f NEGATIVE CIRCLED LATIN CAPITAL LETTER P ++ /xf0/x9f/x85/xa0 NEGATIVE CIRCLED LATIN CAPITAL LETTER Q ++ /xf0/x9f/x85/xa1 NEGATIVE CIRCLED LATIN CAPITAL LETTER R ++ /xf0/x9f/x85/xa2 NEGATIVE CIRCLED LATIN CAPITAL LETTER S ++ /xf0/x9f/x85/xa3 NEGATIVE CIRCLED LATIN CAPITAL LETTER T ++ /xf0/x9f/x85/xa4 NEGATIVE CIRCLED LATIN CAPITAL LETTER U ++ /xf0/x9f/x85/xa5 NEGATIVE CIRCLED LATIN CAPITAL LETTER V ++ /xf0/x9f/x85/xa6 NEGATIVE CIRCLED LATIN CAPITAL LETTER W ++ /xf0/x9f/x85/xa7 NEGATIVE CIRCLED LATIN CAPITAL LETTER X ++ /xf0/x9f/x85/xa8 NEGATIVE CIRCLED LATIN CAPITAL LETTER Y ++ /xf0/x9f/x85/xa9 NEGATIVE CIRCLED LATIN CAPITAL LETTER Z ++ /xf0/x9f/x85/xb0 NEGATIVE SQUARED LATIN CAPITAL LETTER A ++ /xf0/x9f/x85/xb1 NEGATIVE SQUARED LATIN CAPITAL LETTER B ++ /xf0/x9f/x85/xb2 NEGATIVE SQUARED LATIN CAPITAL LETTER C ++ /xf0/x9f/x85/xb3 NEGATIVE SQUARED LATIN CAPITAL LETTER D ++ /xf0/x9f/x85/xb4 NEGATIVE SQUARED LATIN CAPITAL LETTER E ++ /xf0/x9f/x85/xb5 NEGATIVE SQUARED LATIN CAPITAL LETTER F ++ /xf0/x9f/x85/xb6 NEGATIVE SQUARED LATIN CAPITAL LETTER G ++ /xf0/x9f/x85/xb7 NEGATIVE SQUARED LATIN CAPITAL LETTER H ++ /xf0/x9f/x85/xb8 NEGATIVE SQUARED LATIN CAPITAL LETTER I ++ /xf0/x9f/x85/xb9 NEGATIVE SQUARED LATIN CAPITAL LETTER J ++ /xf0/x9f/x85/xba NEGATIVE SQUARED LATIN CAPITAL LETTER K ++ /xf0/x9f/x85/xbb NEGATIVE SQUARED LATIN CAPITAL LETTER L ++ /xf0/x9f/x85/xbc NEGATIVE SQUARED LATIN CAPITAL LETTER M ++ /xf0/x9f/x85/xbd NEGATIVE SQUARED LATIN CAPITAL LETTER N ++ /xf0/x9f/x85/xbe NEGATIVE SQUARED LATIN CAPITAL LETTER O ++ /xf0/x9f/x85/xbf NEGATIVE SQUARED LATIN CAPITAL LETTER P ++ /xf0/x9f/x86/x80 NEGATIVE SQUARED LATIN CAPITAL LETTER Q ++ /xf0/x9f/x86/x81 NEGATIVE SQUARED LATIN CAPITAL LETTER R ++ /xf0/x9f/x86/x82 NEGATIVE SQUARED LATIN CAPITAL LETTER S ++ /xf0/x9f/x86/x83 NEGATIVE SQUARED LATIN CAPITAL LETTER T ++ /xf0/x9f/x86/x84 NEGATIVE SQUARED LATIN CAPITAL LETTER U ++ /xf0/x9f/x86/x85 NEGATIVE SQUARED LATIN CAPITAL LETTER V ++ /xf0/x9f/x86/x86 NEGATIVE SQUARED LATIN CAPITAL LETTER W ++ /xf0/x9f/x86/x87 NEGATIVE SQUARED LATIN CAPITAL LETTER X ++ /xf0/x9f/x86/x88 NEGATIVE SQUARED LATIN CAPITAL LETTER Y ++ /xf0/x9f/x86/x89 NEGATIVE SQUARED LATIN CAPITAL LETTER Z ++ /xf0/x9f/x86/x8a CROSSED NEGATIVE SQUARED LATIN CAPITAL LETTER P ++ /xf0/x9f/x86/x8b NEGATIVE SQUARED IC ++ /xf0/x9f/x86/x8c NEGATIVE SQUARED PA ++ /xf0/x9f/x86/x8d NEGATIVE SQUARED SA ++ /xf0/x9f/x86/x8e NEGATIVE SQUARED AB ++ /xf0/x9f/x86/x8f NEGATIVE SQUARED WC ++ /xf0/x9f/x86/x90 SQUARE DJ ++ /xf0/x9f/x86/x91 SQUARED CL ++ /xf0/x9f/x86/x92 SQUARED COOL ++ /xf0/x9f/x86/x93 SQUARED FREE ++ /xf0/x9f/x86/x94 SQUARED ID ++ /xf0/x9f/x86/x95 SQUARED NEW ++ /xf0/x9f/x86/x96 SQUARED NG ++ /xf0/x9f/x86/x97 SQUARED OK ++ /xf0/x9f/x86/x98 SQUARED SOS ++ /xf0/x9f/x86/x99 SQUARED UP WITH EXCLAMATION MARK ++ /xf0/x9f/x86/x9a SQUARED VS ++ /xf0/x9f/x87/xa6 REGIONAL INDICATOR SYMBOL LETTER A ++ /xf0/x9f/x87/xa7 REGIONAL INDICATOR SYMBOL LETTER B ++ /xf0/x9f/x87/xa8 REGIONAL INDICATOR SYMBOL LETTER C ++ /xf0/x9f/x87/xa9 REGIONAL INDICATOR SYMBOL LETTER D ++ /xf0/x9f/x87/xaa REGIONAL INDICATOR SYMBOL LETTER E ++ /xf0/x9f/x87/xab REGIONAL INDICATOR SYMBOL LETTER F ++ /xf0/x9f/x87/xac REGIONAL INDICATOR SYMBOL LETTER G ++ /xf0/x9f/x87/xad REGIONAL INDICATOR SYMBOL LETTER H ++ /xf0/x9f/x87/xae REGIONAL INDICATOR SYMBOL LETTER I ++ /xf0/x9f/x87/xaf REGIONAL INDICATOR SYMBOL LETTER J ++ /xf0/x9f/x87/xb0 REGIONAL INDICATOR SYMBOL LETTER K ++ /xf0/x9f/x87/xb1 REGIONAL INDICATOR SYMBOL LETTER L ++ /xf0/x9f/x87/xb2 REGIONAL INDICATOR SYMBOL LETTER M ++ /xf0/x9f/x87/xb3 REGIONAL INDICATOR SYMBOL LETTER N ++ /xf0/x9f/x87/xb4 REGIONAL INDICATOR SYMBOL LETTER O ++ /xf0/x9f/x87/xb5 REGIONAL INDICATOR SYMBOL LETTER P ++ /xf0/x9f/x87/xb6 REGIONAL INDICATOR SYMBOL LETTER Q ++ /xf0/x9f/x87/xb7 REGIONAL INDICATOR SYMBOL LETTER R ++ /xf0/x9f/x87/xb8 REGIONAL INDICATOR SYMBOL LETTER S ++ /xf0/x9f/x87/xb9 REGIONAL INDICATOR SYMBOL LETTER T ++ /xf0/x9f/x87/xba REGIONAL INDICATOR SYMBOL LETTER U ++ /xf0/x9f/x87/xbb REGIONAL INDICATOR SYMBOL LETTER V ++ /xf0/x9f/x87/xbc REGIONAL INDICATOR SYMBOL LETTER W ++ /xf0/x9f/x87/xbd REGIONAL INDICATOR SYMBOL LETTER X ++ /xf0/x9f/x87/xbe REGIONAL INDICATOR SYMBOL LETTER Y ++ /xf0/x9f/x87/xbf REGIONAL INDICATOR SYMBOL LETTER Z ++ /xf0/x9f/x88/x80 SQUARE HIRAGANA HOKA ++ /xf0/x9f/x88/x81 SQUARED KATAKANA KOKO ++ /xf0/x9f/x88/x82 SQUARED KATAKANA SA ++ /xf0/x9f/x88/x90 SQUARED CJK UNIFIED IDEOGRAPH-624B ++ /xf0/x9f/x88/x91 SQUARED CJK UNIFIED IDEOGRAPH-5B57 ++ /xf0/x9f/x88/x92 SQUARED CJK UNIFIED IDEOGRAPH-53CC ++ /xf0/x9f/x88/x93 SQUARED KATAKANA DE ++ /xf0/x9f/x88/x94 SQUARED CJK UNIFIED IDEOGRAPH-4E8C ++ /xf0/x9f/x88/x95 SQUARED CJK UNIFIED IDEOGRAPH-591A ++ /xf0/x9f/x88/x96 SQUARED CJK UNIFIED IDEOGRAPH-89E3 ++ /xf0/x9f/x88/x97 SQUARED CJK UNIFIED IDEOGRAPH-5929 ++ /xf0/x9f/x88/x98 SQUARED CJK UNIFIED IDEOGRAPH-4EA4 ++ /xf0/x9f/x88/x99 SQUARED CJK UNIFIED IDEOGRAPH-6620 ++ /xf0/x9f/x88/x9a SQUARED CJK UNIFIED IDEOGRAPH-7121 ++ /xf0/x9f/x88/x9b SQUARED CJK UNIFIED IDEOGRAPH-6599 ++ /xf0/x9f/x88/x9c SQUARED CJK UNIFIED IDEOGRAPH-524D ++ /xf0/x9f/x88/x9d SQUARED CJK UNIFIED IDEOGRAPH-5F8C ++ /xf0/x9f/x88/x9e SQUARED CJK UNIFIED IDEOGRAPH-518D ++ /xf0/x9f/x88/x9f SQUARED CJK UNIFIED IDEOGRAPH-65B0 ++ /xf0/x9f/x88/xa0 SQUARED CJK UNIFIED IDEOGRAPH-521D ++ /xf0/x9f/x88/xa1 SQUARED CJK UNIFIED IDEOGRAPH-7D42 ++ /xf0/x9f/x88/xa2 SQUARED CJK UNIFIED IDEOGRAPH-751F ++ /xf0/x9f/x88/xa3 SQUARED CJK UNIFIED IDEOGRAPH-8CA9 ++ /xf0/x9f/x88/xa4 SQUARED CJK UNIFIED IDEOGRAPH-58F0 ++ /xf0/x9f/x88/xa5 SQUARED CJK UNIFIED IDEOGRAPH-5439 ++ /xf0/x9f/x88/xa6 SQUARED CJK UNIFIED IDEOGRAPH-6F14 ++ /xf0/x9f/x88/xa7 SQUARED CJK UNIFIED IDEOGRAPH-6295 ++ /xf0/x9f/x88/xa8 SQUARED CJK UNIFIED IDEOGRAPH-6355 ++ /xf0/x9f/x88/xa9 SQUARED CJK UNIFIED IDEOGRAPH-4E00 ++ /xf0/x9f/x88/xaa SQUARED CJK UNIFIED IDEOGRAPH-4E09 ++ /xf0/x9f/x88/xab SQUARED CJK UNIFIED IDEOGRAPH-904A ++ /xf0/x9f/x88/xac SQUARED CJK UNIFIED IDEOGRAPH-5DE6 ++ /xf0/x9f/x88/xad SQUARED CJK UNIFIED IDEOGRAPH-4E2D ++ /xf0/x9f/x88/xae SQUARED CJK UNIFIED IDEOGRAPH-53F3 ++ /xf0/x9f/x88/xaf SQUARED CJK UNIFIED IDEOGRAPH-6307 ++ /xf0/x9f/x88/xb0 SQUARED CJK UNIFIED IDEOGRAPH-8D70 ++ /xf0/x9f/x88/xb1 SQUARED CJK UNIFIED IDEOGRAPH-6253 ++ /xf0/x9f/x88/xb2 SQUARED CJK UNIFIED IDEOGRAPH-7981 ++ /xf0/x9f/x88/xb3 SQUARED CJK UNIFIED IDEOGRAPH-7A7A ++ /xf0/x9f/x88/xb4 SQUARED CJK UNIFIED IDEOGRAPH-5408 ++ /xf0/x9f/x88/xb5 SQUARED CJK UNIFIED IDEOGRAPH-6E80 ++ /xf0/x9f/x88/xb6 SQUARED CJK UNIFIED IDEOGRAPH-6709 ++ /xf0/x9f/x88/xb7 SQUARED CJK UNIFIED IDEOGRAPH-6708 ++ /xf0/x9f/x88/xb8 SQUARED CJK UNIFIED IDEOGRAPH-7533 ++ /xf0/x9f/x88/xb9 SQUARED CJK UNIFIED IDEOGRAPH-5272 ++ /xf0/x9f/x88/xba SQUARED CJK UNIFIED IDEOGRAPH-55B6 ++ /xf0/x9f/x89/x80 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C ++ /xf0/x9f/x89/x81 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E09 ++ /xf0/x9f/x89/x82 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E8C ++ /xf0/x9f/x89/x83 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-5B89 ++ /xf0/x9f/x89/x84 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-70B9 ++ /xf0/x9f/x89/x85 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6253 ++ /xf0/x9f/x89/x86 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-76D7 ++ /xf0/x9f/x89/x87 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-52DD ++ /xf0/x9f/x89/x88 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557 ++ /xf0/x9f/x89/x90 CIRCLED IDEOGRAPH ADVANTAGE ++ /xf0/x9f/x89/x91 CIRCLED IDEOGRAPH ACCEPT ++ /xf0/x9f/x8c/x80 CYCLONE ++ /xf0/x9f/x8c/x81 FOGGY ++ /xf0/x9f/x8c/x82 CLOSED UMBRELLA ++ /xf0/x9f/x8c/x83 NIGHT WITH STARS ++ /xf0/x9f/x8c/x84 SUNRISE OVER MOUNTAINS ++ /xf0/x9f/x8c/x85 SUNRISE ++ /xf0/x9f/x8c/x86 CITYSCAPE AT DUSK ++ /xf0/x9f/x8c/x87 SUNSET OVER BUILDINGS ++ /xf0/x9f/x8c/x88 RAINBOW ++ /xf0/x9f/x8c/x89 BRIDGE AT NIGHT ++ /xf0/x9f/x8c/x8a WATER WAVE ++ /xf0/x9f/x8c/x8b VOLCANO ++ /xf0/x9f/x8c/x8c MILKY WAY ++ /xf0/x9f/x8c/x8d EARTH GLOBE EUROPE-AFRICA ++ /xf0/x9f/x8c/x8e EARTH GLOBE AMERICAS ++ /xf0/x9f/x8c/x8f EARTH GLOBE ASIA-AUSTRALIA ++ /xf0/x9f/x8c/x90 GLOBE WITH MERIDIANS ++ /xf0/x9f/x8c/x91 NEW MOON SYMBOL ++ /xf0/x9f/x8c/x92 WAXING CRESCENT MOON SYMBOL ++ /xf0/x9f/x8c/x93 FIRST QUARTER MOON SYMBOL ++ /xf0/x9f/x8c/x94 WAXING GIBBOUS MOON SYMBOL ++ /xf0/x9f/x8c/x95 FULL MOON SYMBOL ++ /xf0/x9f/x8c/x96 WANING GIBBOUS MOON SYMBOL ++ /xf0/x9f/x8c/x97 LAST QUARTER MOON SYMBOL ++ /xf0/x9f/x8c/x98 WANING CRESCENT MOON SYMBOL ++ /xf0/x9f/x8c/x99 CRESCENT MOON ++ /xf0/x9f/x8c/x9a NEW MOON WITH FACE ++ /xf0/x9f/x8c/x9b FIRST QUARTER MOON WITH FACE ++ /xf0/x9f/x8c/x9c LAST QUARTER MOON WITH FACE ++ /xf0/x9f/x8c/x9d FULL MOON WITH FACE ++ /xf0/x9f/x8c/x9e SUN WITH FACE ++ /xf0/x9f/x8c/x9f GLOWING STAR ++ /xf0/x9f/x8c/xa0 SHOOTING STAR ++ /xf0/x9f/x8c/xb0 CHESTNUT ++ /xf0/x9f/x8c/xb1 SEEDLING ++ /xf0/x9f/x8c/xb2 EVERGREEN TREE ++ /xf0/x9f/x8c/xb3 DECIDUOUS TREE ++ /xf0/x9f/x8c/xb4 PALM TREE ++ /xf0/x9f/x8c/xb5 CACTUS ++ /xf0/x9f/x8c/xb7 TULIP ++ /xf0/x9f/x8c/xb8 CHERRY BLOSSOM ++ /xf0/x9f/x8c/xb9 ROSE ++ /xf0/x9f/x8c/xba HIBISCUS ++ /xf0/x9f/x8c/xbb SUNFLOWER ++ /xf0/x9f/x8c/xbc BLOSSOM ++ /xf0/x9f/x8c/xbd EAR OF MAIZE ++ /xf0/x9f/x8c/xbe EAR OF RICE ++ /xf0/x9f/x8c/xbf HERB ++ /xf0/x9f/x8d/x80 FOUR LEAF CLOVER ++ /xf0/x9f/x8d/x81 MAPLE LEAF ++ /xf0/x9f/x8d/x82 FALLEN LEAF ++ /xf0/x9f/x8d/x83 LEAF FLUTTERING IN WIND ++ /xf0/x9f/x8d/x84 MUSHROOM ++ /xf0/x9f/x8d/x85 TOMATO ++ /xf0/x9f/x8d/x86 AUBERGINE ++ /xf0/x9f/x8d/x87 GRAPES ++ /xf0/x9f/x8d/x88 MELON ++ /xf0/x9f/x8d/x89 WATERMELON ++ /xf0/x9f/x8d/x8a TANGERINE ++ /xf0/x9f/x8d/x8b LEMON ++ /xf0/x9f/x8d/x8c BANANA ++ /xf0/x9f/x8d/x8d PINEAPPLE ++ /xf0/x9f/x8d/x8e RED APPLE ++ /xf0/x9f/x8d/x8f GREEN APPLE ++ /xf0/x9f/x8d/x90 PEAR ++ /xf0/x9f/x8d/x91 PEACH ++ /xf0/x9f/x8d/x92 CHERRIES ++ /xf0/x9f/x8d/x93 STRAWBERRY ++ /xf0/x9f/x8d/x94 HAMBURGER ++ /xf0/x9f/x8d/x95 SLICE OF PIZZA ++ /xf0/x9f/x8d/x96 MEAT ON BONE ++ /xf0/x9f/x8d/x97 POULTRY LEG ++ /xf0/x9f/x8d/x98 RICE CRACKER ++ /xf0/x9f/x8d/x99 RICE BALL ++ /xf0/x9f/x8d/x9a COOKED RICE ++ /xf0/x9f/x8d/x9b CURRY AND RICE ++ /xf0/x9f/x8d/x9c STEAMING BOWL ++ /xf0/x9f/x8d/x9d SPAGHETTI ++ /xf0/x9f/x8d/x9e BREAD ++ /xf0/x9f/x8d/x9f FRENCH FRIES ++ /xf0/x9f/x8d/xa0 ROASTED SWEET POTATO ++ /xf0/x9f/x8d/xa1 DANGO ++ /xf0/x9f/x8d/xa2 ODEN ++ /xf0/x9f/x8d/xa3 SUSHI ++ /xf0/x9f/x8d/xa4 FRIED SHRIMP ++ /xf0/x9f/x8d/xa5 FISH CAKE WITH SWIRL DESIGN ++ /xf0/x9f/x8d/xa6 SOFT ICE CREAM ++ /xf0/x9f/x8d/xa7 SHAVED ICE ++ /xf0/x9f/x8d/xa8 ICE CREAM ++ /xf0/x9f/x8d/xa9 DOUGHNUT ++ /xf0/x9f/x8d/xaa COOKIE ++ /xf0/x9f/x8d/xab CHOCOLATE BAR ++ /xf0/x9f/x8d/xac CANDY ++ /xf0/x9f/x8d/xad LOLLIPOP ++ /xf0/x9f/x8d/xae CUSTARD ++ /xf0/x9f/x8d/xaf HONEY POT ++ /xf0/x9f/x8d/xb0 SHORTCAKE ++ /xf0/x9f/x8d/xb1 BENTO BOX ++ /xf0/x9f/x8d/xb2 POT OF FOOD ++ /xf0/x9f/x8d/xb3 COOKING ++ /xf0/x9f/x8d/xb4 FORK AND KNIFE ++ /xf0/x9f/x8d/xb5 TEACUP WITHOUT HANDLE ++ /xf0/x9f/x8d/xb6 SAKE BOTTLE AND CUP ++ /xf0/x9f/x8d/xb7 WINE GLASS ++ /xf0/x9f/x8d/xb8 COCKTAIL GLASS ++ /xf0/x9f/x8d/xb9 TROPICAL DRINK ++ /xf0/x9f/x8d/xba BEER MUG ++ /xf0/x9f/x8d/xbb CLINKING BEER MUGS ++ /xf0/x9f/x8d/xbc BABY BOTTLE ++ /xf0/x9f/x8e/x80 RIBBON ++ /xf0/x9f/x8e/x81 WRAPPED PRESENT ++ /xf0/x9f/x8e/x82 BIRTHDAY CAKE ++ /xf0/x9f/x8e/x83 JACK-O-LANTERN ++ /xf0/x9f/x8e/x84 CHRISTMAS TREE ++ /xf0/x9f/x8e/x85 FATHER CHRISTMAS ++ /xf0/x9f/x8e/x86 FIREWORKS ++ /xf0/x9f/x8e/x87 FIREWORK SPARKLER ++ /xf0/x9f/x8e/x88 BALLOON ++ /xf0/x9f/x8e/x89 PARTY POPPER ++ /xf0/x9f/x8e/x8a CONFETTI BALL ++ /xf0/x9f/x8e/x8b TANABATA TREE ++ /xf0/x9f/x8e/x8c CROSSED FLAGS ++ /xf0/x9f/x8e/x8d PINE DECORATION ++ /xf0/x9f/x8e/x8e JAPANESE DOLLS ++ /xf0/x9f/x8e/x8f CARP STREAMER ++ /xf0/x9f/x8e/x90 WIND CHIME ++ /xf0/x9f/x8e/x91 MOON VIEWING CEREMONY ++ /xf0/x9f/x8e/x92 SCHOOL SATCHEL ++ /xf0/x9f/x8e/x93 GRADUATION CAP ++ /xf0/x9f/x8e/xa0 CAROUSEL HORSE ++ /xf0/x9f/x8e/xa1 FERRIS WHEEL ++ /xf0/x9f/x8e/xa2 ROLLER COASTER ++ /xf0/x9f/x8e/xa3 FISHING POLE AND FISH ++ /xf0/x9f/x8e/xa4 MICROPHONE ++ /xf0/x9f/x8e/xa5 MOVIE CAMERA ++ /xf0/x9f/x8e/xa6 CINEMA ++ /xf0/x9f/x8e/xa7 HEADPHONE ++ /xf0/x9f/x8e/xa8 ARTIST PALETTE ++ /xf0/x9f/x8e/xa9 TOP HAT ++ /xf0/x9f/x8e/xaa CIRCUS TENT ++ /xf0/x9f/x8e/xab TICKET ++ /xf0/x9f/x8e/xac CLAPPER BOARD ++ /xf0/x9f/x8e/xad PERFORMING ARTS ++ /xf0/x9f/x8e/xae VIDEO GAME ++ /xf0/x9f/x8e/xaf DIRECT HIT ++ /xf0/x9f/x8e/xb0 SLOT MACHINE ++ /xf0/x9f/x8e/xb1 BILLIARDS ++ /xf0/x9f/x8e/xb2 GAME DIE ++ /xf0/x9f/x8e/xb3 BOWLING ++ /xf0/x9f/x8e/xb4 FLOWER PLAYING CARDS ++ /xf0/x9f/x8e/xb5 MUSICAL NOTE ++ /xf0/x9f/x8e/xb6 MULTIPLE MUSICAL NOTES ++ /xf0/x9f/x8e/xb7 SAXOPHONE ++ /xf0/x9f/x8e/xb8 GUITAR ++ /xf0/x9f/x8e/xb9 MUSICAL KEYBOARD ++ /xf0/x9f/x8e/xba TRUMPET ++ /xf0/x9f/x8e/xbb VIOLIN ++ /xf0/x9f/x8e/xbc MUSICAL SCORE ++ /xf0/x9f/x8e/xbd RUNNING SHIRT WITH SASH ++ /xf0/x9f/x8e/xbe TENNIS RACQUET AND BALL ++ /xf0/x9f/x8e/xbf SKI AND SKI BOOT ++ /xf0/x9f/x8f/x80 BASKETBALL AND HOOP ++ /xf0/x9f/x8f/x81 CHEQUERED FLAG ++ /xf0/x9f/x8f/x82 SNOWBOARDER ++ /xf0/x9f/x8f/x83 RUNNER ++ /xf0/x9f/x8f/x84 SURFER ++ /xf0/x9f/x8f/x86 TROPHY ++ /xf0/x9f/x8f/x87 HORSE RACING ++ /xf0/x9f/x8f/x88 AMERICAN FOOTBALL ++ /xf0/x9f/x8f/x89 RUGBY FOOTBALL ++ /xf0/x9f/x8f/x8a SWIMMER ++ /xf0/x9f/x8f/xa0 HOUSE BUILDING ++ /xf0/x9f/x8f/xa1 HOUSE WITH GARDEN ++ /xf0/x9f/x8f/xa2 OFFICE BUILDING ++ /xf0/x9f/x8f/xa3 JAPANESE POST OFFICE ++ /xf0/x9f/x8f/xa4 EUROPEAN POST OFFICE ++ /xf0/x9f/x8f/xa5 HOSPITAL ++ /xf0/x9f/x8f/xa6 BANK ++ /xf0/x9f/x8f/xa7 AUTOMATED TELLER MACHINE ++ /xf0/x9f/x8f/xa8 HOTEL ++ /xf0/x9f/x8f/xa9 LOVE HOTEL ++ /xf0/x9f/x8f/xaa CONVENIENCE STORE ++ /xf0/x9f/x8f/xab SCHOOL ++ /xf0/x9f/x8f/xac DEPARTMENT STORE ++ /xf0/x9f/x8f/xad FACTORY ++ /xf0/x9f/x8f/xae IZAKAYA LANTERN ++ /xf0/x9f/x8f/xaf JAPANESE CASTLE ++ /xf0/x9f/x8f/xb0 EUROPEAN CASTLE ++ /xf0/x9f/x90/x80 RAT ++ /xf0/x9f/x90/x81 MOUSE ++ /xf0/x9f/x90/x82 OX ++ /xf0/x9f/x90/x83 WATER BUFFALO ++ /xf0/x9f/x90/x84 COW ++ /xf0/x9f/x90/x85 TIGER ++ /xf0/x9f/x90/x86 LEOPARD ++ /xf0/x9f/x90/x87 RABBIT ++ /xf0/x9f/x90/x88 CAT ++ /xf0/x9f/x90/x89 DRAGON ++ /xf0/x9f/x90/x8a CROCODILE ++ /xf0/x9f/x90/x8b WHALE ++ /xf0/x9f/x90/x8c SNAIL ++ /xf0/x9f/x90/x8d SNAKE ++ /xf0/x9f/x90/x8e HORSE ++ /xf0/x9f/x90/x8f RAM ++ /xf0/x9f/x90/x90 GOAT ++ /xf0/x9f/x90/x91 SHEEP ++ /xf0/x9f/x90/x92 MONKEY ++ /xf0/x9f/x90/x93 ROOSTER ++ /xf0/x9f/x90/x94 CHICKEN ++ /xf0/x9f/x90/x95 DOG ++ /xf0/x9f/x90/x96 PIG ++ /xf0/x9f/x90/x97 BOAR ++ /xf0/x9f/x90/x98 ELEPHANT ++ /xf0/x9f/x90/x99 OCTOPUS ++ /xf0/x9f/x90/x9a SPIRAL SHELL ++ /xf0/x9f/x90/x9b BUG ++ /xf0/x9f/x90/x9c ANT ++ /xf0/x9f/x90/x9d HONEYBEE ++ /xf0/x9f/x90/x9e LADY BEETLE ++ /xf0/x9f/x90/x9f FISH ++ /xf0/x9f/x90/xa0 TROPICAL FISH ++ /xf0/x9f/x90/xa1 BLOWFISH ++ /xf0/x9f/x90/xa2 TURTLE ++ /xf0/x9f/x90/xa3 HATCHING CHICK ++ /xf0/x9f/x90/xa4 BABY CHICK ++ /xf0/x9f/x90/xa5 FRONT-FACING BABY CHICK ++ /xf0/x9f/x90/xa6 BIRD ++ /xf0/x9f/x90/xa7 PENGUIN ++ /xf0/x9f/x90/xa8 KOALA ++ /xf0/x9f/x90/xa9 POODLE ++ /xf0/x9f/x90/xaa DROMEDARY CAMEL ++ /xf0/x9f/x90/xab BACTRIAN CAMEL ++ /xf0/x9f/x90/xac DOLPHIN ++ /xf0/x9f/x90/xad MOUSE FACE ++ /xf0/x9f/x90/xae COW FACE ++ /xf0/x9f/x90/xaf TIGER FACE ++ /xf0/x9f/x90/xb0 RABBIT FACE ++ /xf0/x9f/x90/xb1 CAT FACE ++ /xf0/x9f/x90/xb2 DRAGON FACE ++ /xf0/x9f/x90/xb3 SPOUTING WHALE ++ /xf0/x9f/x90/xb4 HORSE FACE ++ /xf0/x9f/x90/xb5 MONKEY FACE ++ /xf0/x9f/x90/xb6 DOG FACE ++ /xf0/x9f/x90/xb7 PIG FACE ++ /xf0/x9f/x90/xb8 FROG FACE ++ /xf0/x9f/x90/xb9 HAMSTER FACE ++ /xf0/x9f/x90/xba WOLF FACE ++ /xf0/x9f/x90/xbb BEAR FACE ++ /xf0/x9f/x90/xbc PANDA FACE ++ /xf0/x9f/x90/xbd PIG NOSE ++ /xf0/x9f/x90/xbe PAW PRINTS ++ /xf0/x9f/x91/x80 EYES ++ /xf0/x9f/x91/x82 EAR ++ /xf0/x9f/x91/x83 NOSE ++ /xf0/x9f/x91/x84 MOUTH ++ /xf0/x9f/x91/x85 TONGUE ++ /xf0/x9f/x91/x86 WHITE UP POINTING BACKHAND INDEX ++ /xf0/x9f/x91/x87 WHITE DOWN POINTING BACKHAND INDEX ++ /xf0/x9f/x91/x88 WHITE LEFT POINTING BACKHAND INDEX ++ /xf0/x9f/x91/x89 WHITE RIGHT POINTING BACKHAND INDEX ++ /xf0/x9f/x91/x8a FISTED HAND SIGN ++ /xf0/x9f/x91/x8b WAVING HAND SIGN ++ /xf0/x9f/x91/x8c OK HAND SIGN ++ /xf0/x9f/x91/x8d THUMBS UP SIGN ++ /xf0/x9f/x91/x8e THUMBS DOWN SIGN ++ /xf0/x9f/x91/x8f CLAPPING HANDS SIGN ++ /xf0/x9f/x91/x90 OPEN HANDS SIGN ++ /xf0/x9f/x91/x91 CROWN ++ /xf0/x9f/x91/x92 WOMANS HAT ++ /xf0/x9f/x91/x93 EYEGLASSES ++ /xf0/x9f/x91/x94 NECKTIE ++ /xf0/x9f/x91/x95 T-SHIRT ++ /xf0/x9f/x91/x96 JEANS ++ /xf0/x9f/x91/x97 DRESS ++ /xf0/x9f/x91/x98 KIMONO ++ /xf0/x9f/x91/x99 BIKINI ++ /xf0/x9f/x91/x9a WOMANS CLOTHES ++ /xf0/x9f/x91/x9b PURSE ++ /xf0/x9f/x91/x9c HANDBAG ++ /xf0/x9f/x91/x9d POUCH ++ /xf0/x9f/x91/x9e MANS SHOE ++ /xf0/x9f/x91/x9f ATHLETIC SHOE ++ /xf0/x9f/x91/xa0 HIGH-HEELED SHOE ++ /xf0/x9f/x91/xa1 WOMANS SANDAL ++ /xf0/x9f/x91/xa2 WOMANS BOOTS ++ /xf0/x9f/x91/xa3 FOOTPRINTS ++ /xf0/x9f/x91/xa4 BUST IN SILHOUETTE ++ /xf0/x9f/x91/xa5 BUSTS IN SILHOUETTE ++ /xf0/x9f/x91/xa6 BOY ++ /xf0/x9f/x91/xa7 GIRL ++ /xf0/x9f/x91/xa8 MAN ++ /xf0/x9f/x91/xa9 WOMAN ++ /xf0/x9f/x91/xaa FAMILY ++ /xf0/x9f/x91/xab MAN AND WOMAN HOLDING HANDS ++ /xf0/x9f/x91/xac TWO MEN HOLDING HANDS ++ /xf0/x9f/x91/xad TWO WOMEN HOLDING HANDS ++ /xf0/x9f/x91/xae POLICE OFFICER ++ /xf0/x9f/x91/xaf WOMAN WITH BUNNY EARS ++ /xf0/x9f/x91/xb0 BRIDE WITH VEIL ++ /xf0/x9f/x91/xb1 PERSON WITH BLOND HAIR ++ /xf0/x9f/x91/xb2 MAN WITH GUA PI MAO ++ /xf0/x9f/x91/xb3 MAN WITH TURBAN ++ /xf0/x9f/x91/xb4 OLDER MAN ++ /xf0/x9f/x91/xb5 OLDER WOMAN ++ /xf0/x9f/x91/xb6 BABY ++ /xf0/x9f/x91/xb7 CONSTRUCTION WORKER ++ /xf0/x9f/x91/xb8 PRINCESS ++ /xf0/x9f/x91/xb9 JAPANESE OGRE ++ /xf0/x9f/x91/xba JAPANESE GOBLIN ++ /xf0/x9f/x91/xbb GHOST ++ /xf0/x9f/x91/xbc BABY ANGEL ++ /xf0/x9f/x91/xbd EXTRATERRESTRIAL ALIEN ++ /xf0/x9f/x91/xbe ALIEN MONSTER ++ /xf0/x9f/x91/xbf IMP ++ /xf0/x9f/x92/x80 SKULL ++ /xf0/x9f/x92/x81 INFORMATION DESK PERSON ++ /xf0/x9f/x92/x82 GUARDSMAN ++ /xf0/x9f/x92/x83 DANCER ++ /xf0/x9f/x92/x84 LIPSTICK ++ /xf0/x9f/x92/x85 NAIL POLISH ++ /xf0/x9f/x92/x86 FACE MASSAGE ++ /xf0/x9f/x92/x87 HAIRCUT ++ /xf0/x9f/x92/x88 BARBER POLE ++ /xf0/x9f/x92/x89 SYRINGE ++ /xf0/x9f/x92/x8a PILL ++ /xf0/x9f/x92/x8b KISS MARK ++ /xf0/x9f/x92/x8c LOVE LETTER ++ /xf0/x9f/x92/x8d RING ++ /xf0/x9f/x92/x8e GEM STONE ++ /xf0/x9f/x92/x8f KISS ++ /xf0/x9f/x92/x90 BOUQUET ++ /xf0/x9f/x92/x91 COUPLE WITH HEART ++ /xf0/x9f/x92/x92 WEDDING ++ /xf0/x9f/x92/x93 BEATING HEART ++ /xf0/x9f/x92/x94 BROKEN HEART ++ /xf0/x9f/x92/x95 TWO HEARTS ++ /xf0/x9f/x92/x96 SPARKLING HEART ++ /xf0/x9f/x92/x97 GROWING HEART ++ /xf0/x9f/x92/x98 HEART WITH ARROW ++ /xf0/x9f/x92/x99 BLUE HEART ++ /xf0/x9f/x92/x9a GREEN HEART ++ /xf0/x9f/x92/x9b YELLOW HEART ++ /xf0/x9f/x92/x9c PURPLE HEART ++ /xf0/x9f/x92/x9d HEART WITH RIBBON ++ /xf0/x9f/x92/x9e REVOLVING HEARTS ++ /xf0/x9f/x92/x9f HEART DECORATION ++ /xf0/x9f/x92/xa0 DIAMOND SHAPE WITH A DOT INSIDE ++ /xf0/x9f/x92/xa1 ELECTRIC LIGHT BULB ++ /xf0/x9f/x92/xa2 ANGER SYMBOL ++ /xf0/x9f/x92/xa3 BOMB ++ /xf0/x9f/x92/xa4 SLEEPING SYMBOL ++ /xf0/x9f/x92/xa5 COLLISION SYMBOL ++ /xf0/x9f/x92/xa6 SPLASHING SWEAT SYMBOL ++ /xf0/x9f/x92/xa7 DROPLET ++ /xf0/x9f/x92/xa8 DASH SYMBOL ++ /xf0/x9f/x92/xa9 PILE OF POO ++ /xf0/x9f/x92/xaa FLEXED BICEPS ++ /xf0/x9f/x92/xab DIZZY SYMBOL ++ /xf0/x9f/x92/xac SPEECH BALLOON ++ /xf0/x9f/x92/xad THOUGHT BALLOON ++ /xf0/x9f/x92/xae WHITE FLOWER ++ /xf0/x9f/x92/xaf HUNDRED POINTS SYMBOL ++ /xf0/x9f/x92/xb0 MONEY BAG ++ /xf0/x9f/x92/xb1 CURRENCY EXCHANGE ++ /xf0/x9f/x92/xb2 HEAVY DOLLAR SIGN ++ /xf0/x9f/x92/xb3 CREDIT CARD ++ /xf0/x9f/x92/xb4 BANKNOTE WITH YEN SIGN ++ /xf0/x9f/x92/xb5 BANKNOTE WITH DOLLAR SIGN ++ /xf0/x9f/x92/xb6 BANKNOTE WITH EURO SIGN ++ /xf0/x9f/x92/xb7 BANKNOTE WITH POUND SIGN ++ /xf0/x9f/x92/xb8 MONEY WITH WINGS ++ /xf0/x9f/x92/xb9 CHART WITH UPWARDS TREND AND YEN SIGN ++ /xf0/x9f/x92/xba SEAT ++ /xf0/x9f/x92/xbb PERSONAL COMPUTER ++ /xf0/x9f/x92/xbc BRIEFCASE ++ /xf0/x9f/x92/xbd MINIDISC ++ /xf0/x9f/x92/xbe FLOPPY DISK ++ /xf0/x9f/x92/xbf OPTICAL DISC ++ /xf0/x9f/x93/x80 DVD ++ /xf0/x9f/x93/x81 FILE FOLDER ++ /xf0/x9f/x93/x82 OPEN FILE FOLDER ++ /xf0/x9f/x93/x83 PAGE WITH CURL ++ /xf0/x9f/x93/x84 PAGE FACING UP ++ /xf0/x9f/x93/x85 CALENDAR ++ /xf0/x9f/x93/x86 TEAR-OFF CALENDAR ++ /xf0/x9f/x93/x87 CARD INDEX ++ /xf0/x9f/x93/x88 CHART WITH UPWARDS TREND ++ /xf0/x9f/x93/x89 CHART WITH DOWNWARDS TREND ++ /xf0/x9f/x93/x8a BAR CHART ++ /xf0/x9f/x93/x8b CLIPBOARD ++ /xf0/x9f/x93/x8c PUSHPIN ++ /xf0/x9f/x93/x8d ROUND PUSHPIN ++ /xf0/x9f/x93/x8e PAPERCLIP ++ /xf0/x9f/x93/x8f STRAIGHT RULER ++ /xf0/x9f/x93/x90 TRIANGULAR RULER ++ /xf0/x9f/x93/x91 BOOKMARK TABS ++ /xf0/x9f/x93/x92 LEDGER ++ /xf0/x9f/x93/x93 NOTEBOOK ++ /xf0/x9f/x93/x94 NOTEBOOK WITH DECORATIVE COVER ++ /xf0/x9f/x93/x95 CLOSED BOOK ++ /xf0/x9f/x93/x96 OPEN BOOK ++ /xf0/x9f/x93/x97 GREEN BOOK ++ /xf0/x9f/x93/x98 BLUE BOOK ++ /xf0/x9f/x93/x99 ORANGE BOOK ++ /xf0/x9f/x93/x9a BOOKS ++ /xf0/x9f/x93/x9b NAME BADGE ++ /xf0/x9f/x93/x9c SCROLL ++ /xf0/x9f/x93/x9d MEMO ++ /xf0/x9f/x93/x9e TELEPHONE RECEIVER ++ /xf0/x9f/x93/x9f PAGER ++ /xf0/x9f/x93/xa0 FAX MACHINE ++ /xf0/x9f/x93/xa1 SATELLITE ANTENNA ++ /xf0/x9f/x93/xa2 PUBLIC ADDRESS LOUDSPEAKER ++ /xf0/x9f/x93/xa3 CHEERING MEGAPHONE ++ /xf0/x9f/x93/xa4 OUTBOX TRAY ++ /xf0/x9f/x93/xa5 INBOX TRAY ++ /xf0/x9f/x93/xa6 PACKAGE ++ /xf0/x9f/x93/xa7 E-MAIL SYMBOL ++ /xf0/x9f/x93/xa8 INCOMING ENVELOPE ++ /xf0/x9f/x93/xa9 ENVELOPE WITH DOWNWARDS ARROW ABOVE ++ /xf0/x9f/x93/xaa CLOSED MAILBOX WITH LOWERED FLAG ++ /xf0/x9f/x93/xab CLOSED MAILBOX WITH RAISED FLAG ++ /xf0/x9f/x93/xac OPEN MAILBOX WITH RAISED FLAG ++ /xf0/x9f/x93/xad OPEN MAILBOX WITH LOWERED FLAG ++ /xf0/x9f/x93/xae POSTBOX ++ /xf0/x9f/x93/xaf POSTAL HORN ++ /xf0/x9f/x93/xb0 NEWSPAPER ++ /xf0/x9f/x93/xb1 MOBILE PHONE ++ /xf0/x9f/x93/xb2 MOBILE PHONE WITH RIGHTWARDS ARROW AT LEFT ++ /xf0/x9f/x93/xb3 VIBRATION MODE ++ /xf0/x9f/x93/xb4 MOBILE PHONE OFF ++ /xf0/x9f/x93/xb5 NO MOBILE PHONES ++ /xf0/x9f/x93/xb6 ANTENNA WITH BARS ++ /xf0/x9f/x93/xb7 CAMERA ++ /xf0/x9f/x93/xb9 VIDEO CAMERA ++ /xf0/x9f/x93/xba TELEVISION ++ /xf0/x9f/x93/xbb RADIO ++ /xf0/x9f/x93/xbc VIDEOCASSETTE ++ /xf0/x9f/x94/x80 TWISTED RIGHTWARDS ARROWS ++ /xf0/x9f/x94/x81 CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS ++ /xf0/x9f/x94/x82 CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS WITH CIRCLED ONE OVERLAY ++ /xf0/x9f/x94/x83 CLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS ++ /xf0/x9f/x94/x84 ANTICLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS ++ /xf0/x9f/x94/x85 LOW BRIGHTNESS SYMBOL ++ /xf0/x9f/x94/x86 HIGH BRIGHTNESS SYMBOL ++ /xf0/x9f/x94/x87 SPEAKER WITH CANCELLATION STROKE ++ /xf0/x9f/x94/x88 SPEAKER ++ /xf0/x9f/x94/x89 SPEAKER WITH ONE SOUND WAVE ++ /xf0/x9f/x94/x8a SPEAKER WITH THREE SOUND WAVES ++ /xf0/x9f/x94/x8b BATTERY ++ /xf0/x9f/x94/x8c ELECTRIC PLUG ++ /xf0/x9f/x94/x8d LEFT-POINTING MAGNIFYING GLASS ++ /xf0/x9f/x94/x8e RIGHT-POINTING MAGNIFYING GLASS ++ /xf0/x9f/x94/x8f LOCK WITH INK PEN ++ /xf0/x9f/x94/x90 CLOSED LOCK WITH KEY ++ /xf0/x9f/x94/x91 KEY ++ /xf0/x9f/x94/x92 LOCK ++ /xf0/x9f/x94/x93 OPEN LOCK ++ /xf0/x9f/x94/x94 BELL ++ /xf0/x9f/x94/x95 BELL WITH CANCELLATION STROKE ++ /xf0/x9f/x94/x96 BOOKMARK ++ /xf0/x9f/x94/x97 LINK SYMBOL ++ /xf0/x9f/x94/x98 RADIO BUTTON ++ /xf0/x9f/x94/x99 BACK WITH LEFTWARDS ARROW ABOVE ++ /xf0/x9f/x94/x9a END WITH LEFTWARDS ARROW ABOVE ++ /xf0/x9f/x94/x9b ON WITH EXCLAMATION MARK WITH LEFT RIGHT ARROW ABOVE ++ /xf0/x9f/x94/x9c SOON WITH RIGHTWARDS ARROW ABOVE ++ /xf0/x9f/x94/x9d TOP WITH UPWARDS ARROW ABOVE ++ /xf0/x9f/x94/x9e NO ONE UNDER EIGHTEEN SYMBOL ++ /xf0/x9f/x94/x9f KEYCAP TEN ++ /xf0/x9f/x94/xa0 INPUT SYMBOL FOR LATIN CAPITAL LETTERS ++ /xf0/x9f/x94/xa1 INPUT SYMBOL FOR LATIN SMALL LETTERS ++ /xf0/x9f/x94/xa2 INPUT SYMBOL FOR NUMBERS ++ /xf0/x9f/x94/xa3 INPUT SYMBOL FOR SYMBOLS ++ /xf0/x9f/x94/xa4 INPUT SYMBOL FOR LATIN LETTERS ++ /xf0/x9f/x94/xa5 FIRE ++ /xf0/x9f/x94/xa6 ELECTRIC TORCH ++ /xf0/x9f/x94/xa7 WRENCH ++ /xf0/x9f/x94/xa8 HAMMER ++ /xf0/x9f/x94/xa9 NUT AND BOLT ++ /xf0/x9f/x94/xaa HOCHO ++ /xf0/x9f/x94/xab PISTOL ++ /xf0/x9f/x94/xac MICROSCOPE ++ /xf0/x9f/x94/xad TELESCOPE ++ /xf0/x9f/x94/xae CRYSTAL BALL ++ /xf0/x9f/x94/xaf SIX POINTED STAR WITH MIDDLE DOT ++ /xf0/x9f/x94/xb0 JAPANESE SYMBOL FOR BEGINNER ++ /xf0/x9f/x94/xb1 TRIDENT EMBLEM ++ /xf0/x9f/x94/xb2 BLACK SQUARE BUTTON ++ /xf0/x9f/x94/xb3 WHITE SQUARE BUTTON ++ /xf0/x9f/x94/xb4 LARGE RED CIRCLE ++ /xf0/x9f/x94/xb5 LARGE BLUE CIRCLE ++ /xf0/x9f/x94/xb6 LARGE ORANGE DIAMOND ++ /xf0/x9f/x94/xb7 LARGE BLUE DIAMOND ++ /xf0/x9f/x94/xb8 SMALL ORANGE DIAMOND ++ /xf0/x9f/x94/xb9 SMALL BLUE DIAMOND ++ /xf0/x9f/x94/xba UP-POINTING RED TRIANGLE ++ /xf0/x9f/x94/xbb DOWN-POINTING RED TRIANGLE ++ /xf0/x9f/x94/xbc UP-POINTING SMALL RED TRIANGLE ++ /xf0/x9f/x94/xbd DOWN-POINTING SMALL RED TRIANGLE ++ /xf0/x9f/x95/x90 CLOCK FACE ONE OCLOCK ++ /xf0/x9f/x95/x91 CLOCK FACE TWO OCLOCK ++ /xf0/x9f/x95/x92 CLOCK FACE THREE OCLOCK ++ /xf0/x9f/x95/x93 CLOCK FACE FOUR OCLOCK ++ /xf0/x9f/x95/x94 CLOCK FACE FIVE OCLOCK ++ /xf0/x9f/x95/x95 CLOCK FACE SIX OCLOCK ++ /xf0/x9f/x95/x96 CLOCK FACE SEVEN OCLOCK ++ /xf0/x9f/x95/x97 CLOCK FACE EIGHT OCLOCK ++ /xf0/x9f/x95/x98 CLOCK FACE NINE OCLOCK ++ /xf0/x9f/x95/x99 CLOCK FACE TEN OCLOCK ++ /xf0/x9f/x95/x9a CLOCK FACE ELEVEN OCLOCK ++ /xf0/x9f/x95/x9b CLOCK FACE TWELVE OCLOCK ++ /xf0/x9f/x95/x9c CLOCK FACE ONE-THIRTY ++ /xf0/x9f/x95/x9d CLOCK FACE TWO-THIRTY ++ /xf0/x9f/x95/x9e CLOCK FACE THREE-THIRTY ++ /xf0/x9f/x95/x9f CLOCK FACE FOUR-THIRTY ++ /xf0/x9f/x95/xa0 CLOCK FACE FIVE-THIRTY ++ /xf0/x9f/x95/xa1 CLOCK FACE SIX-THIRTY ++ /xf0/x9f/x95/xa2 CLOCK FACE SEVEN-THIRTY ++ /xf0/x9f/x95/xa3 CLOCK FACE EIGHT-THIRTY ++ /xf0/x9f/x95/xa4 CLOCK FACE NINE-THIRTY ++ /xf0/x9f/x95/xa5 CLOCK FACE TEN-THIRTY ++ /xf0/x9f/x95/xa6 CLOCK FACE ELEVEN-THIRTY ++ /xf0/x9f/x95/xa7 CLOCK FACE TWELVE-THIRTY ++ /xf0/x9f/x97/xbb MOUNT FUJI ++ /xf0/x9f/x97/xbc TOKYO TOWER ++ /xf0/x9f/x97/xbd STATUE OF LIBERTY ++ /xf0/x9f/x97/xbe SILHOUETTE OF JAPAN ++ /xf0/x9f/x97/xbf MOYAI ++ /xf0/x9f/x98/x81 GRINNING FACE WITH SMILING EYES ++ /xf0/x9f/x98/x82 FACE WITH TEARS OF JOY ++ /xf0/x9f/x98/x83 SMILING FACE WITH OPEN MOUTH ++ /xf0/x9f/x98/x84 SMILING FACE WITH OPEN MOUTH AND SMILING EYES ++ /xf0/x9f/x98/x85 SMILING FACE WITH OPEN MOUTH AND COLD SWEAT ++ /xf0/x9f/x98/x86 SMILING FACE WITH OPEN MOUTH AND TIGHTLY-CLOSED EYES ++ /xf0/x9f/x98/x87 SMILING FACE WITH HALO ++ /xf0/x9f/x98/x88 SMILING FACE WITH HORNS ++ /xf0/x9f/x98/x89 WINKING FACE ++ /xf0/x9f/x98/x8a SMILING FACE WITH SMILING EYES ++ /xf0/x9f/x98/x8b FACE SAVOURING DELICIOUS FOOD ++ /xf0/x9f/x98/x8c RELIEVED FACE ++ /xf0/x9f/x98/x8d SMILING FACE WITH HEART-SHAPED EYES ++ /xf0/x9f/x98/x8e SMILING FACE WITH SUNGLASSES ++ /xf0/x9f/x98/x8f SMIRKING FACE ++ /xf0/x9f/x98/x90 NEUTRAL FACE ++ /xf0/x9f/x98/x92 UNAMUSED FACE ++ /xf0/x9f/x98/x93 FACE WITH COLD SWEAT ++ /xf0/x9f/x98/x94 PENSIVE FACE ++ /xf0/x9f/x98/x96 CONFOUNDED FACE ++ /xf0/x9f/x98/x98 FACE THROWING A KISS ++ /xf0/x9f/x98/x9a KISSING FACE WITH CLOSED EYES ++ /xf0/x9f/x98/x9c FACE WITH STUCK-OUT TONGUE AND WINKING EYE ++ /xf0/x9f/x98/x9d FACE WITH STUCK-OUT TONGUE AND TIGHTLY-CLOSED EYES ++ /xf0/x9f/x98/x9e DISAPPOINTED FACE ++ /xf0/x9f/x98/xa0 ANGRY FACE ++ /xf0/x9f/x98/xa1 POUTING FACE ++ /xf0/x9f/x98/xa2 CRYING FACE ++ /xf0/x9f/x98/xa3 PERSEVERING FACE ++ /xf0/x9f/x98/xa4 FACE WITH LOOK OF TRIUMPH ++ /xf0/x9f/x98/xa5 DISAPPOINTED BUT RELIEVED FACE ++ /xf0/x9f/x98/xa8 FEARFUL FACE ++ /xf0/x9f/x98/xa9 WEARY FACE ++ /xf0/x9f/x98/xaa SLEEPY FACE ++ /xf0/x9f/x98/xab TIRED FACE ++ /xf0/x9f/x98/xad LOUDLY CRYING FACE ++ /xf0/x9f/x98/xb0 FACE WITH OPEN MOUTH AND COLD SWEAT ++ /xf0/x9f/x98/xb1 FACE SCREAMING IN FEAR ++ /xf0/x9f/x98/xb2 ASTONISHED FACE ++ /xf0/x9f/x98/xb3 FLUSHED FACE ++ /xf0/x9f/x98/xb5 DIZZY FACE ++ /xf0/x9f/x98/xb6 FACE WITHOUT MOUTH ++ /xf0/x9f/x98/xb7 FACE WITH MEDICAL MASK ++ /xf0/x9f/x98/xb8 GRINNING CAT FACE WITH SMILING EYES ++ /xf0/x9f/x98/xb9 CAT FACE WITH TEARS OF JOY ++ /xf0/x9f/x98/xba SMILING CAT FACE WITH OPEN MOUTH ++ /xf0/x9f/x98/xbb SMILING CAT FACE WITH HEART-SHAPED EYES ++ /xf0/x9f/x98/xbc CAT FACE WITH WRY SMILE ++ /xf0/x9f/x98/xbd KISSING CAT FACE WITH CLOSED EYES ++ /xf0/x9f/x98/xbe POUTING CAT FACE ++ /xf0/x9f/x98/xbf CRYING CAT FACE ++ /xf0/x9f/x99/x80 WEARY CAT FACE ++ /xf0/x9f/x99/x85 FACE WITH NO GOOD GESTURE ++ /xf0/x9f/x99/x86 FACE WITH OK GESTURE ++ /xf0/x9f/x99/x87 PERSON BOWING DEEPLY ++ /xf0/x9f/x99/x88 SEE-NO-EVIL MONKEY ++ /xf0/x9f/x99/x89 HEAR-NO-EVIL MONKEY ++ /xf0/x9f/x99/x8a SPEAK-NO-EVIL MONKEY ++ /xf0/x9f/x99/x8b HAPPY PERSON RAISING ONE HAND ++ /xf0/x9f/x99/x8c PERSON RAISING BOTH HANDS IN CELEBRATION ++ /xf0/x9f/x99/x8d PERSON FROWNING ++ /xf0/x9f/x99/x8e PERSON WITH POUTING FACE ++ /xf0/x9f/x99/x8f PERSON WITH FOLDED HANDS ++ /xf0/x9f/x9a/x80 ROCKET ++ /xf0/x9f/x9a/x81 HELICOPTER ++ /xf0/x9f/x9a/x82 STEAM LOCOMOTIVE ++ /xf0/x9f/x9a/x83 RAILWAY CAR ++ /xf0/x9f/x9a/x84 HIGH-SPEED TRAIN ++ /xf0/x9f/x9a/x85 HIGH-SPEED TRAIN WITH BULLET NOSE ++ /xf0/x9f/x9a/x86 TRAIN ++ /xf0/x9f/x9a/x87 METRO ++ /xf0/x9f/x9a/x88 LIGHT RAIL ++ /xf0/x9f/x9a/x89 STATION ++ /xf0/x9f/x9a/x8a TRAM ++ /xf0/x9f/x9a/x8b TRAM CAR ++ /xf0/x9f/x9a/x8c BUS ++ /xf0/x9f/x9a/x8d ONCOMING BUS ++ /xf0/x9f/x9a/x8e TROLLEYBUS ++ /xf0/x9f/x9a/x8f BUS STOP ++ /xf0/x9f/x9a/x90 MINIBUS ++ /xf0/x9f/x9a/x91 AMBULANCE ++ /xf0/x9f/x9a/x92 FIRE ENGINE ++ /xf0/x9f/x9a/x93 POLICE CAR ++ /xf0/x9f/x9a/x94 ONCOMING POLICE CAR ++ /xf0/x9f/x9a/x95 TAXI ++ /xf0/x9f/x9a/x96 ONCOMING TAXI ++ /xf0/x9f/x9a/x97 AUTOMOBILE ++ /xf0/x9f/x9a/x98 ONCOMING AUTOMOBILE ++ /xf0/x9f/x9a/x99 RECREATIONAL VEHICLE ++ /xf0/x9f/x9a/x9a DELIVERY TRUCK ++ /xf0/x9f/x9a/x9b ARTICULATED LORRY ++ /xf0/x9f/x9a/x9c TRACTOR ++ /xf0/x9f/x9a/x9d MONORAIL ++ /xf0/x9f/x9a/x9e MOUNTAIN RAILWAY ++ /xf0/x9f/x9a/x9f SUSPENSION RAILWAY ++ /xf0/x9f/x9a/xa0 MOUNTAIN CABLEWAY ++ /xf0/x9f/x9a/xa1 AERIAL TRAMWAY ++ /xf0/x9f/x9a/xa2 SHIP ++ /xf0/x9f/x9a/xa3 ROWBOAT ++ /xf0/x9f/x9a/xa4 SPEEDBOAT ++ /xf0/x9f/x9a/xa5 HORIZONTAL TRAFFIC LIGHT ++ /xf0/x9f/x9a/xa6 VERTICAL TRAFFIC LIGHT ++ /xf0/x9f/x9a/xa7 CONSTRUCTION SIGN ++ /xf0/x9f/x9a/xa8 POLICE CARS REVOLVING LIGHT ++ /xf0/x9f/x9a/xa9 TRIANGULAR FLAG ON POST ++ /xf0/x9f/x9a/xaa DOOR ++ /xf0/x9f/x9a/xab NO ENTRY SIGN ++ /xf0/x9f/x9a/xac SMOKING SYMBOL ++ /xf0/x9f/x9a/xad NO SMOKING SYMBOL ++ /xf0/x9f/x9a/xae PUT LITTER IN ITS PLACE SYMBOL ++ /xf0/x9f/x9a/xaf DO NOT LITTER SYMBOL ++ /xf0/x9f/x9a/xb0 POTABLE WATER SYMBOL ++ /xf0/x9f/x9a/xb1 NON-POTABLE WATER SYMBOL ++ /xf0/x9f/x9a/xb2 BICYCLE ++ /xf0/x9f/x9a/xb3 NO BICYCLES ++ /xf0/x9f/x9a/xb4 BICYCLIST ++ /xf0/x9f/x9a/xb5 MOUNTAIN BICYCLIST ++ /xf0/x9f/x9a/xb6 PEDESTRIAN ++ /xf0/x9f/x9a/xb7 NO PEDESTRIANS ++ /xf0/x9f/x9a/xb8 CHILDREN CROSSING ++ /xf0/x9f/x9a/xb9 MENS SYMBOL ++ /xf0/x9f/x9a/xba WOMENS SYMBOL ++ /xf0/x9f/x9a/xbb RESTROOM ++ /xf0/x9f/x9a/xbc BABY SYMBOL ++ /xf0/x9f/x9a/xbd TOILET ++ /xf0/x9f/x9a/xbe WATER CLOSET ++ /xf0/x9f/x9a/xbf SHOWER ++ /xf0/x9f/x9b/x80 BATH ++ /xf0/x9f/x9b/x81 BATHTUB ++ /xf0/x9f/x9b/x82 PASSPORT CONTROL ++ /xf0/x9f/x9b/x83 CUSTOMS ++ /xf0/x9f/x9b/x84 BAGGAGE CLAIM ++ /xf0/x9f/x9b/x85 LEFT LUGGAGE ++ /xf0/x9f/x9c/x80 ALCHEMICAL SYMBOL FOR QUINTESSENCE ++ /xf0/x9f/x9c/x81 ALCHEMICAL SYMBOL FOR AIR ++ /xf0/x9f/x9c/x82 ALCHEMICAL SYMBOL FOR FIRE ++ /xf0/x9f/x9c/x83 ALCHEMICAL SYMBOL FOR EARTH ++ /xf0/x9f/x9c/x84 ALCHEMICAL SYMBOL FOR WATER ++ /xf0/x9f/x9c/x85 ALCHEMICAL SYMBOL FOR AQUAFORTIS ++ /xf0/x9f/x9c/x86 ALCHEMICAL SYMBOL FOR AQUA REGIA ++ /xf0/x9f/x9c/x87 ALCHEMICAL SYMBOL FOR AQUA REGIA-2 ++ /xf0/x9f/x9c/x88 ALCHEMICAL SYMBOL FOR AQUA VITAE ++ /xf0/x9f/x9c/x89 ALCHEMICAL SYMBOL FOR AQUA VITAE-2 ++ /xf0/x9f/x9c/x8a ALCHEMICAL SYMBOL FOR VINEGAR ++ /xf0/x9f/x9c/x8b ALCHEMICAL SYMBOL FOR VINEGAR-2 ++ /xf0/x9f/x9c/x8c ALCHEMICAL SYMBOL FOR VINEGAR-3 ++ /xf0/x9f/x9c/x8d ALCHEMICAL SYMBOL FOR SULFUR ++ /xf0/x9f/x9c/x8e ALCHEMICAL SYMBOL FOR PHILOSOPHERS SULFUR ++ /xf0/x9f/x9c/x8f ALCHEMICAL SYMBOL FOR BLACK SULFUR ++ /xf0/x9f/x9c/x90 ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE ++ /xf0/x9f/x9c/x91 ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE-2 ++ /xf0/x9f/x9c/x92 ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE-3 ++ /xf0/x9f/x9c/x93 ALCHEMICAL SYMBOL FOR CINNABAR ++ /xf0/x9f/x9c/x94 ALCHEMICAL SYMBOL FOR SALT ++ /xf0/x9f/x9c/x95 ALCHEMICAL SYMBOL FOR NITRE ++ /xf0/x9f/x9c/x96 ALCHEMICAL SYMBOL FOR VITRIOL ++ /xf0/x9f/x9c/x97 ALCHEMICAL SYMBOL FOR VITRIOL-2 ++ /xf0/x9f/x9c/x98 ALCHEMICAL SYMBOL FOR ROCK SALT ++ /xf0/x9f/x9c/x99 ALCHEMICAL SYMBOL FOR ROCK SALT-2 ++ /xf0/x9f/x9c/x9a ALCHEMICAL SYMBOL FOR GOLD ++ /xf0/x9f/x9c/x9b ALCHEMICAL SYMBOL FOR SILVER ++ /xf0/x9f/x9c/x9c ALCHEMICAL SYMBOL FOR IRON ORE ++ /xf0/x9f/x9c/x9d ALCHEMICAL SYMBOL FOR IRON ORE-2 ++ /xf0/x9f/x9c/x9e ALCHEMICAL SYMBOL FOR CROCUS OF IRON ++ /xf0/x9f/x9c/x9f ALCHEMICAL SYMBOL FOR REGULUS OF IRON ++ /xf0/x9f/x9c/xa0 ALCHEMICAL SYMBOL FOR COPPER ORE ++ /xf0/x9f/x9c/xa1 ALCHEMICAL SYMBOL FOR IRON-COPPER ORE ++ /xf0/x9f/x9c/xa2 ALCHEMICAL SYMBOL FOR SUBLIMATE OF COPPER ++ /xf0/x9f/x9c/xa3 ALCHEMICAL SYMBOL FOR CROCUS OF COPPER ++ /xf0/x9f/x9c/xa4 ALCHEMICAL SYMBOL FOR CROCUS OF COPPER-2 ++ /xf0/x9f/x9c/xa5 ALCHEMICAL SYMBOL FOR COPPER ANTIMONIATE ++ /xf0/x9f/x9c/xa6 ALCHEMICAL SYMBOL FOR SALT OF COPPER ANTIMONIATE ++ /xf0/x9f/x9c/xa7 ALCHEMICAL SYMBOL FOR SUBLIMATE OF SALT OF COPPER ++ /xf0/x9f/x9c/xa8 ALCHEMICAL SYMBOL FOR VERDIGRIS ++ /xf0/x9f/x9c/xa9 ALCHEMICAL SYMBOL FOR TIN ORE ++ /xf0/x9f/x9c/xaa ALCHEMICAL SYMBOL FOR LEAD ORE ++ /xf0/x9f/x9c/xab ALCHEMICAL SYMBOL FOR ANTIMONY ORE ++ /xf0/x9f/x9c/xac ALCHEMICAL SYMBOL FOR SUBLIMATE OF ANTIMONY ++ /xf0/x9f/x9c/xad ALCHEMICAL SYMBOL FOR SALT OF ANTIMONY ++ /xf0/x9f/x9c/xae ALCHEMICAL SYMBOL FOR SUBLIMATE OF SALT OF ANTIMONY ++ /xf0/x9f/x9c/xaf ALCHEMICAL SYMBOL FOR VINEGAR OF ANTIMONY ++ /xf0/x9f/x9c/xb0 ALCHEMICAL SYMBOL FOR REGULUS OF ANTIMONY ++ /xf0/x9f/x9c/xb1 ALCHEMICAL SYMBOL FOR REGULUS OF ANTIMONY-2 ++ /xf0/x9f/x9c/xb2 ALCHEMICAL SYMBOL FOR REGULUS ++ /xf0/x9f/x9c/xb3 ALCHEMICAL SYMBOL FOR REGULUS-2 ++ /xf0/x9f/x9c/xb4 ALCHEMICAL SYMBOL FOR REGULUS-3 ++ /xf0/x9f/x9c/xb5 ALCHEMICAL SYMBOL FOR REGULUS-4 ++ /xf0/x9f/x9c/xb6 ALCHEMICAL SYMBOL FOR ALKALI ++ /xf0/x9f/x9c/xb7 ALCHEMICAL SYMBOL FOR ALKALI-2 ++ /xf0/x9f/x9c/xb8 ALCHEMICAL SYMBOL FOR MARCASITE ++ /xf0/x9f/x9c/xb9 ALCHEMICAL SYMBOL FOR SAL-AMMONIAC ++ /xf0/x9f/x9c/xba ALCHEMICAL SYMBOL FOR ARSENIC ++ /xf0/x9f/x9c/xbb ALCHEMICAL SYMBOL FOR REALGAR ++ /xf0/x9f/x9c/xbc ALCHEMICAL SYMBOL FOR REALGAR-2 ++ /xf0/x9f/x9c/xbd ALCHEMICAL SYMBOL FOR AURIPIGMENT ++ /xf0/x9f/x9c/xbe ALCHEMICAL SYMBOL FOR BISMUTH ORE ++ /xf0/x9f/x9c/xbf ALCHEMICAL SYMBOL FOR TARTAR ++ /xf0/x9f/x9d/x80 ALCHEMICAL SYMBOL FOR TARTAR-2 ++ /xf0/x9f/x9d/x81 ALCHEMICAL SYMBOL FOR QUICK LIME ++ /xf0/x9f/x9d/x82 ALCHEMICAL SYMBOL FOR BORAX ++ /xf0/x9f/x9d/x83 ALCHEMICAL SYMBOL FOR BORAX-2 ++ /xf0/x9f/x9d/x84 ALCHEMICAL SYMBOL FOR BORAX-3 ++ /xf0/x9f/x9d/x85 ALCHEMICAL SYMBOL FOR ALUM ++ /xf0/x9f/x9d/x86 ALCHEMICAL SYMBOL FOR OIL ++ /xf0/x9f/x9d/x87 ALCHEMICAL SYMBOL FOR SPIRIT ++ /xf0/x9f/x9d/x88 ALCHEMICAL SYMBOL FOR TINCTURE ++ /xf0/x9f/x9d/x89 ALCHEMICAL SYMBOL FOR GUM ++ /xf0/x9f/x9d/x8a ALCHEMICAL SYMBOL FOR WAX ++ /xf0/x9f/x9d/x8b ALCHEMICAL SYMBOL FOR POWDER ++ /xf0/x9f/x9d/x8c ALCHEMICAL SYMBOL FOR CALX ++ /xf0/x9f/x9c/xb7 ALCHEMICAL SYMBOL FOR ALKALI-2 ++ /xf0/x9f/x9c/xb8 ALCHEMICAL SYMBOL FOR MARCASITE ++ /xf0/x9f/x9c/xb9 ALCHEMICAL SYMBOL FOR SAL-AMMONIAC ++ /xf0/x9f/x9c/xba ALCHEMICAL SYMBOL FOR ARSENIC ++ /xf0/x9f/x9c/xbb ALCHEMICAL SYMBOL FOR REALGAR ++ /xf0/x9f/x9c/xbc ALCHEMICAL SYMBOL FOR REALGAR-2 ++ /xf0/x9f/x9c/xbd ALCHEMICAL SYMBOL FOR AURIPIGMENT ++ /xf0/x9f/x9c/xbe ALCHEMICAL SYMBOL FOR BISMUTH ORE ++ /xf0/x9f/x9c/xbf ALCHEMICAL SYMBOL FOR TARTAR ++ /xf0/x9f/x9d/x80 ALCHEMICAL SYMBOL FOR TARTAR-2 ++ /xf0/x9f/x9d/x81 ALCHEMICAL SYMBOL FOR QUICK LIME ++ /xf0/x9f/x9d/x82 ALCHEMICAL SYMBOL FOR BORAX ++ /xf0/x9f/x9d/x83 ALCHEMICAL SYMBOL FOR BORAX-2 ++ /xf0/x9f/x9d/x84 ALCHEMICAL SYMBOL FOR BORAX-3 ++ /xf0/x9f/x9d/x85 ALCHEMICAL SYMBOL FOR ALUM ++ /xf0/x9f/x9d/x86 ALCHEMICAL SYMBOL FOR OIL ++ /xf0/x9f/x9d/x87 ALCHEMICAL SYMBOL FOR SPIRIT ++ /xf0/x9f/x9d/x88 ALCHEMICAL SYMBOL FOR TINCTURE ++ /xf0/x9f/x9d/x89 ALCHEMICAL SYMBOL FOR GUM ++ /xf0/x9f/x9d/x8a ALCHEMICAL SYMBOL FOR WAX ++ /xf0/x9f/x9d/x8b ALCHEMICAL SYMBOL FOR POWDER ++ /xf0/x9f/x9d/x8c ALCHEMICAL SYMBOL FOR CALX ++ /xf0/x9f/x9d/x8d ALCHEMICAL SYMBOL FOR TUTTY ++ /xf0/x9f/x9d/x8e ALCHEMICAL SYMBOL FOR CAPUT MORTUUM ++ /xf0/x9f/x9d/x8f ALCHEMICAL SYMBOL FOR SCEPTER OF JOVE ++ /xf0/x9f/x9d/x90 ALCHEMICAL SYMBOL FOR CADUCEUS ++ /xf0/x9f/x9d/x91 ALCHEMICAL SYMBOL FOR TRIDENT ++ /xf0/x9f/x9d/x92 ALCHEMICAL SYMBOL FOR STARRED TRIDENT ++ /xf0/x9f/x9d/x93 ALCHEMICAL SYMBOL FOR LODESTONE ++ /xf0/x9f/x9d/x94 ALCHEMICAL SYMBOL FOR SOAP ++ /xf0/x9f/x9d/x95 ALCHEMICAL SYMBOL FOR URINE ++ /xf0/x9f/x9d/x96 ALCHEMICAL SYMBOL FOR HORSE DUNG ++ /xf0/x9f/x9d/x97 ALCHEMICAL SYMBOL FOR ASHES ++ /xf0/x9f/x9d/x98 ALCHEMICAL SYMBOL FOR POT ASHES ++ /xf0/x9f/x9d/x99 ALCHEMICAL SYMBOL FOR BRICK ++ /xf0/x9f/x9d/x9a ALCHEMICAL SYMBOL FOR POWDERED BRICK ++ /xf0/x9f/x9d/x9b ALCHEMICAL SYMBOL FOR AMALGAM ++ /xf0/x9f/x9d/x9c ALCHEMICAL SYMBOL FOR STRATUM SUPER STRATUM ++ /xf0/x9f/x9d/x9d ALCHEMICAL SYMBOL FOR STRATUM SUPER STRATUM-2 ++ /xf0/x9f/x9d/x9e ALCHEMICAL SYMBOL FOR SUBLIMATION ++ /xf0/x9f/x9d/x9f ALCHEMICAL SYMBOL FOR PRECIPITATE ++ /xf0/x9f/x9d/xa0 ALCHEMICAL SYMBOL FOR DISTILL ++ /xf0/x9f/x9d/xa1 ALCHEMICAL SYMBOL FOR DISSOLVE ++ /xf0/x9f/x9d/xa2 ALCHEMICAL SYMBOL FOR DISSOLVE-2 ++ /xf0/x9f/x9d/xa3 ALCHEMICAL SYMBOL FOR PURIFY ++ /xf0/x9f/x9d/xa4 ALCHEMICAL SYMBOL FOR PUTREFACTION ++ /xf0/x9f/x9d/xa5 ALCHEMICAL SYMBOL FOR CRUCIBLE ++ /xf0/x9f/x9d/xa6 ALCHEMICAL SYMBOL FOR CRUCIBLE-2 ++ /xf0/x9f/x9d/xa7 ALCHEMICAL SYMBOL FOR CRUCIBLE-3 ++ /xf0/x9f/x9d/xa8 ALCHEMICAL SYMBOL FOR CRUCIBLE-4 ++ /xf0/x9f/x9d/xa9 ALCHEMICAL SYMBOL FOR CRUCIBLE-5 ++ /xf0/x9f/x9d/xaa ALCHEMICAL SYMBOL FOR ALEMBIC ++ /xf0/x9f/x9d/xab ALCHEMICAL SYMBOL FOR BATH OF MARY ++ /xf0/x9f/x9d/xac ALCHEMICAL SYMBOL FOR BATH OF VAPOURS ++ /xf0/x9f/x9d/xad ALCHEMICAL SYMBOL FOR RETORT ++ /xf0/x9f/x9d/xae ALCHEMICAL SYMBOL FOR HOUR ++ /xf0/x9f/x9d/xaf ALCHEMICAL SYMBOL FOR NIGHT ++ /xf0/x9f/x9d/xb0 ALCHEMICAL SYMBOL FOR DAY-NIGHT ++ /xf0/x9f/x9d/xb1 ALCHEMICAL SYMBOL FOR MONTH ++ /xf0/x9f/x9d/xb2 ALCHEMICAL SYMBOL FOR HALF DRAM ++ /xf0/x9f/x9d/xb3 ALCHEMICAL SYMBOL FOR HALF OUNCE + .. /xf0/xa0/x80/x80 + .. /xf0/xa0/x81/x80 + .. /xf0/xa0/x82/x80 +Index: glibc-2.12-2-gc4ccff1/localedata/locales/ar_IN +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/localedata/locales/ar_IN ++++ glibc-2.12-2-gc4ccff1/localedata/locales/ar_IN +@@ -52,7 +52,7 @@ LC_MONETARY + % for IBM Class for Unicode. + % + int_curr_symbol "" +-currency_symbol "" ++currency_symbol "" + mon_decimal_point "" + mon_thousands_sep "" + mon_grouping 3;2 +Index: glibc-2.12-2-gc4ccff1/localedata/locales/as_IN +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/localedata/locales/as_IN ++++ glibc-2.12-2-gc4ccff1/localedata/locales/as_IN +@@ -51,7 +51,7 @@ END LC_NUMERIC + %%%%%%%%%%%%% + LC_MONETARY + int_curr_symbol "" +-currency_symbol "" ++currency_symbol "" + mon_decimal_point "" + mon_thousands_sep "" + mon_grouping 3;2 +Index: glibc-2.12-2-gc4ccff1/localedata/locales/bn_IN +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/localedata/locales/bn_IN ++++ glibc-2.12-2-gc4ccff1/localedata/locales/bn_IN +@@ -53,7 +53,7 @@ LC_MONETARY + % for IBM Class for Unicode. + % + int_curr_symbol "" +-currency_symbol "" ++currency_symbol "" + mon_decimal_point "" + mon_thousands_sep "" + mon_grouping 2;3 +Index: glibc-2.12-2-gc4ccff1/localedata/locales/en_IN +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/localedata/locales/en_IN ++++ glibc-2.12-2-gc4ccff1/localedata/locales/en_IN +@@ -52,7 +52,7 @@ LC_MONETARY + % for IBM Class for Unicode. + % + int_curr_symbol "" +-currency_symbol "" ++currency_symbol "" + mon_decimal_point "" + mon_thousands_sep "" + mon_grouping 3;2 +Index: glibc-2.12-2-gc4ccff1/localedata/locales/gu_IN +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/localedata/locales/gu_IN ++++ glibc-2.12-2-gc4ccff1/localedata/locales/gu_IN +@@ -71,7 +71,7 @@ LC_MONETARY + % for IBM Class for Unicode/Java + % + int_curr_symbol "" +-currency_symbol "" ++currency_symbol "" + mon_decimal_point "" + mon_thousands_sep "" + mon_grouping 3 +Index: glibc-2.12-2-gc4ccff1/localedata/locales/hi_IN +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/localedata/locales/hi_IN ++++ glibc-2.12-2-gc4ccff1/localedata/locales/hi_IN +@@ -69,7 +69,7 @@ LC_MONETARY + % for IBM Class for Unicode/Java + % + int_curr_symbol "" +-currency_symbol "" ++currency_symbol "" + mon_decimal_point "" + mon_thousands_sep "" + mon_grouping 3 +Index: glibc-2.12-2-gc4ccff1/localedata/locales/kn_IN +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/localedata/locales/kn_IN ++++ glibc-2.12-2-gc4ccff1/localedata/locales/kn_IN +@@ -71,8 +71,7 @@ LC_MONETARY + % for IBM Class for Unicode/Java + % + int_curr_symbol "" +-% *** Change this to reflect Kannada , in Dev it is RA with VS U attached +-currency_symbol "" ++currency_symbol "" + mon_decimal_point "" + mon_thousands_sep "" + mon_grouping 3 +Index: glibc-2.12-2-gc4ccff1/localedata/locales/kok_IN +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/localedata/locales/kok_IN ++++ glibc-2.12-2-gc4ccff1/localedata/locales/kok_IN +@@ -49,7 +49,7 @@ LC_MONETARY + % for IBM Class for Unicode. + % + int_curr_symbol "" +-currency_symbol "" ++currency_symbol "" + mon_decimal_point "" + mon_thousands_sep "" + mon_grouping 3 +Index: glibc-2.12-2-gc4ccff1/localedata/locales/ks_IN +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/localedata/locales/ks_IN ++++ glibc-2.12-2-gc4ccff1/localedata/locales/ks_IN +@@ -57,7 +57,7 @@ LC_MONETARY + % for IBM Class for Unicode. + % + int_curr_symbol "" +-currency_symbol "" ++currency_symbol "" + mon_decimal_point "" + mon_thousands_sep "" + mon_grouping 3 +Index: glibc-2.12-2-gc4ccff1/localedata/locales/ml_IN +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/localedata/locales/ml_IN ++++ glibc-2.12-2-gc4ccff1/localedata/locales/ml_IN +@@ -69,7 +69,7 @@ LC_MONETARY + % for IBM Class for Unicode. + % + int_curr_symbol "" +-currency_symbol "" ++currency_symbol "" + mon_decimal_point "" + mon_thousands_sep "" + mon_grouping 3;2 +Index: glibc-2.12-2-gc4ccff1/localedata/locales/mr_IN +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/localedata/locales/mr_IN ++++ glibc-2.12-2-gc4ccff1/localedata/locales/mr_IN +@@ -70,7 +70,7 @@ LC_MONETARY + % for IBM Class for Unicode. + % + int_curr_symbol "" +-currency_symbol "" ++currency_symbol "" + mon_decimal_point "" + mon_thousands_sep "" + mon_grouping 3 +Index: glibc-2.12-2-gc4ccff1/localedata/locales/or_IN +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/localedata/locales/or_IN ++++ glibc-2.12-2-gc4ccff1/localedata/locales/or_IN +@@ -607,7 +607,7 @@ END LC_NUMERIC + %%%%%%%%%%%%% + LC_MONETARY + int_curr_symbol "" +-currency_symbol "" ++currency_symbol "" + mon_decimal_point "" + mon_thousands_sep "" + mon_grouping 3;2 +Index: glibc-2.12-2-gc4ccff1/localedata/locales/pa_IN +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/localedata/locales/pa_IN ++++ glibc-2.12-2-gc4ccff1/localedata/locales/pa_IN +@@ -66,7 +66,7 @@ END LC_COLLATE + LC_MONETARY + % This is the POSIX Locale definition the LC_MONETARY category. + int_curr_symbol "" +-currency_symbol "" ++currency_symbol "" + mon_decimal_point "" + mon_thousands_sep "" + mon_grouping 3 +Index: glibc-2.12-2-gc4ccff1/localedata/locales/sa_IN +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/localedata/locales/sa_IN ++++ glibc-2.12-2-gc4ccff1/localedata/locales/sa_IN +@@ -52,7 +52,7 @@ LC_MONETARY + % for IBM Class for Unicode/Java + % + int_curr_symbol "" +-currency_symbol "" ++currency_symbol "" + mon_decimal_point "" + mon_thousands_sep "" + mon_grouping 3 +Index: glibc-2.12-2-gc4ccff1/localedata/locales/sd_IN +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/localedata/locales/sd_IN ++++ glibc-2.12-2-gc4ccff1/localedata/locales/sd_IN +@@ -57,7 +57,7 @@ LC_MONETARY + % for IBM Class for Unicode. + % + int_curr_symbol "" +-currency_symbol "" ++currency_symbol "" + mon_decimal_point "" + mon_thousands_sep "" + mon_grouping 3 +Index: glibc-2.12-2-gc4ccff1/localedata/locales/ta_IN +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/localedata/locales/ta_IN ++++ glibc-2.12-2-gc4ccff1/localedata/locales/ta_IN +@@ -74,7 +74,7 @@ LC_MONETARY + % for IBM Class for Unicode. + % + int_curr_symbol "" +-currency_symbol "" ++currency_symbol "" + mon_decimal_point "" + mon_thousands_sep "" + mon_grouping 3;2 +Index: glibc-2.12-2-gc4ccff1/localedata/locales/te_IN +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/localedata/locales/te_IN ++++ glibc-2.12-2-gc4ccff1/localedata/locales/te_IN +@@ -73,7 +73,7 @@ LC_MONETARY + % for IBM Class for Unicode. + % + int_curr_symbol "" +-currency_symbol "" ++currency_symbol "" + mon_decimal_point "" + mon_thousands_sep "" + mon_grouping 3;2 diff --git a/SOURCES/glibc-rh694386.patch b/SOURCES/glibc-rh694386.patch new file mode 100644 index 0000000..3932eb8 --- /dev/null +++ b/SOURCES/glibc-rh694386.patch @@ -0,0 +1,86 @@ +2011-03-28 Andreas Schwab + + * sysdeps/powerpc/powerpc32/power4/strncmp.S: Don't read past + differing bytes. + * sysdeps/powerpc/powerpc64/power4/strncmp.S: Likewise. + +diff --git a/sysdeps/powerpc/powerpc32/power4/strncmp.S b/sysdeps/powerpc/powerpc32/power4/strncmp.S +index fc0835e..f5d47af 100644 +--- a/sysdeps/powerpc/powerpc32/power4/strncmp.S ++++ b/sysdeps/powerpc/powerpc32/power4/strncmp.S +@@ -139,30 +139,31 @@ L(u1): + bdz L(u4) + cmpw rWORD1, rWORD2 + beq- cr1, L(u4) ++ bne- L(u4) + lbzu rWORD3, 1(rSTR1) + lbzu rWORD4, 1(rSTR2) +- bne- L(u4) + cmpwi cr1, rWORD3, 0 + bdz L(u3) + cmpw rWORD3, rWORD4 + beq- cr1, L(u3) ++ bne- L(u3) + lbzu rWORD1, 1(rSTR1) + lbzu rWORD2, 1(rSTR2) +- bne- L(u3) + cmpwi cr1, rWORD1, 0 + bdz L(u4) + cmpw rWORD1, rWORD2 + beq- cr1, L(u4) ++ bne- L(u4) + lbzu rWORD3, 1(rSTR1) + lbzu rWORD4, 1(rSTR2) +- bne- L(u4) + cmpwi cr1, rWORD3, 0 + bdz L(u3) + cmpw rWORD3, rWORD4 + beq- cr1, L(u3) ++ bne- L(u3) + lbzu rWORD1, 1(rSTR1) + lbzu rWORD2, 1(rSTR2) +- beq+ L(u1) ++ b L(u1) + + L(u3): sub rRTN, rWORD3, rWORD4 + blr +diff --git a/sysdeps/powerpc/powerpc64/power4/strncmp.S b/sysdeps/powerpc/powerpc64/power4/strncmp.S +index 7a1665d..94ae85b 100644 +--- a/sysdeps/powerpc/powerpc64/power4/strncmp.S ++++ b/sysdeps/powerpc/powerpc64/power4/strncmp.S +@@ -143,30 +143,31 @@ L(u1): + bdz L(u4) + cmpd rWORD1, rWORD2 + beq- cr1, L(u4) ++ bne- L(u4) + lbzu rWORD3, 1(rSTR1) + lbzu rWORD4, 1(rSTR2) +- bne- L(u4) + cmpdi cr1, rWORD3, 0 + bdz L(u3) + cmpd rWORD3, rWORD4 + beq- cr1, L(u3) ++ bne- L(u3) + lbzu rWORD1, 1(rSTR1) + lbzu rWORD2, 1(rSTR2) +- bne- L(u3) + cmpdi cr1, rWORD1, 0 + bdz L(u4) + cmpd rWORD1, rWORD2 + beq- cr1, L(u4) ++ bne- L(u4) + lbzu rWORD3, 1(rSTR1) + lbzu rWORD4, 1(rSTR2) +- bne- L(u4) + cmpdi cr1, rWORD3, 0 + bdz L(u3) + cmpd rWORD3, rWORD4 + beq- cr1, L(u3) ++ bne- L(u3) + lbzu rWORD1, 1(rSTR1) + lbzu rWORD2, 1(rSTR2) +- beq+ L(u1) ++ b L(u1) + + L(u3): sub rRTN, rWORD3, rWORD4 + blr diff --git a/SOURCES/glibc-rh695595.patch b/SOURCES/glibc-rh695595.patch new file mode 100644 index 0000000..0e6c72b --- /dev/null +++ b/SOURCES/glibc-rh695595.patch @@ -0,0 +1,17 @@ +2010-11-11 H.J. Lu + + * sysdeps/x86_64/multiarch/init-arch.c (__init_cpu_features): + Support Intel processor model 6 and model 0x2c. + +Index: glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/init-arch.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/sysdeps/x86_64/multiarch/init-arch.c ++++ glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/init-arch.c +@@ -81,6 +81,7 @@ __init_cpu_features (void) + case 0x1e: + case 0x1f: + case 0x25: ++ case 0x2c: + case 0x2e: + case 0x2f: + /* Rep string instructions are fast on Intel Core i3, i5 diff --git a/SOURCES/glibc-rh695963.patch b/SOURCES/glibc-rh695963.patch new file mode 100644 index 0000000..e8053dc --- /dev/null +++ b/SOURCES/glibc-rh695963.patch @@ -0,0 +1,1284 @@ +2010-08-27 Ulrich Drepper + + * sysdeps/x86_64/multiarch/strlen-no-bsf.S: Move to .text.slow section. + + * sysdeps/x86_64/strlen.S: Minimal code improvement. + +2010-08-26 H.J. Lu + + * sysdeps/x86_64/strlen.S: Unroll the loop. + * sysdeps/x86_64/multiarch/Makefile (sysdep_routines): Add + strlen-sse2 strlen-sse2-bsf. + * sysdeps/x86_64/multiarch/strlen.S ((strlen): Return + __strlen_no_bsf if bit_Slow_BSF is set. + (__strlen_sse42): Removed. + * sysdeps/x86_64/multiarch/strlen-no-bsf.S: New file. + * sysdeps/x86_64/multiarch/strlen-sse4.S: New file. + +2010-08-25 H.J. Lu + + * sysdeps/i386/i686/multiarch/Makefile (sysdep_routines): Add + strlen-sse2 strlen-sse2-bsf. + * sysdeps/i386/i686/multiarch/strlen.S (strlen): Return + __strlen_sse2_bsf if bit_Slow_BSF is unset. + (__strlen_sse2): Removed. + * sysdeps/i386/i686/multiarch/strlen-sse2-bsf.S: New file. + * sysdeps/i386/i686/multiarch/strlen-sse2.S: New file. + * sysdeps/x86_64/multiarch/init-arch.c (__init_cpu_features): Set + bit_Slow_BSF for Atom. + * sysdeps/x86_64/multiarch/init-arch.h (bit_Slow_BSF): Define. + (index_Slow_BSF): Define. + (HAS_SLOW_BSF): Define. + +Index: glibc-2.12-2-gc4ccff1/sysdeps/i386/i686/multiarch/Makefile +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/sysdeps/i386/i686/multiarch/Makefile ++++ glibc-2.12-2-gc4ccff1/sysdeps/i386/i686/multiarch/Makefile +@@ -9,7 +9,8 @@ sysdep_routines += bzero-sse2 memset-sse + memmove-ssse3-rep bcopy-ssse3 bcopy-ssse3-rep \ + memset-sse2-rep bzero-sse2-rep strcmp-ssse3 \ + strcmp-sse4 strncmp-c strncmp-ssse3 strncmp-sse4 \ +- memcmp-ssse3 memcmp-sse4 strcasestr-nonascii ++ memcmp-ssse3 memcmp-sse4 strcasestr-nonascii \ ++ strlen-sse2 strlen-sse2-bsf + ifeq (yes,$(config-cflags-sse4)) + sysdep_routines += strcspn-c strpbrk-c strspn-c strstr-c strcasestr-c + CFLAGS-strcspn-c.c += -msse4 +Index: glibc-2.12-2-gc4ccff1/sysdeps/i386/i686/multiarch/strlen-sse2-bsf.S +=================================================================== +--- /dev/null ++++ glibc-2.12-2-gc4ccff1/sysdeps/i386/i686/multiarch/strlen-sse2-bsf.S +@@ -0,0 +1,127 @@ ++/* strlen with SSE2 and BSF ++ Copyright (C) 2010 Free Software Foundation, Inc. ++ Contributed by Intel Corporation. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, write to the Free ++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++ 02111-1307 USA. */ ++ ++#if defined SHARED && !defined NOT_IN_libc ++ ++#include ++#include "asm-syntax.h" ++ ++#define CFI_PUSH(REG) \ ++ cfi_adjust_cfa_offset (4); \ ++ cfi_rel_offset (REG, 0) ++ ++#define CFI_POP(REG) \ ++ cfi_adjust_cfa_offset (-4); \ ++ cfi_restore (REG) ++ ++#define PUSH(REG) pushl REG; CFI_PUSH (REG) ++#define POP(REG) popl REG; CFI_POP (REG) ++#define PARMS 4 + 8 /* Preserve ESI and EDI. */ ++#define STR PARMS ++#define ENTRANCE PUSH (%esi); PUSH (%edi); cfi_remember_state ++#define RETURN POP (%edi); POP (%esi); ret; \ ++ cfi_restore_state; cfi_remember_state ++ ++ .text ++ENTRY ( __strlen_sse2_bsf) ++ ENTRANCE ++ mov STR(%esp), %edi ++ xor %eax, %eax ++ mov %edi, %ecx ++ and $0x3f, %ecx ++ pxor %xmm0, %xmm0 ++ cmp $0x30, %ecx ++ ja L(next) ++ movdqu (%edi), %xmm1 ++ pcmpeqb %xmm1, %xmm0 ++ pmovmskb %xmm0, %edx ++ test %edx, %edx ++ jnz L(exit_less16) ++ mov %edi, %eax ++ and $-16, %eax ++ jmp L(align16_start) ++L(next): ++ ++ mov %edi, %eax ++ and $-16, %eax ++ pcmpeqb (%eax), %xmm0 ++ mov $-1, %esi ++ sub %eax, %ecx ++ shl %cl, %esi ++ pmovmskb %xmm0, %edx ++ and %esi, %edx ++ jnz L(exit) ++L(align16_start): ++ pxor %xmm0, %xmm0 ++ pxor %xmm1, %xmm1 ++ pxor %xmm2, %xmm2 ++ pxor %xmm3, %xmm3 ++ .p2align 4 ++L(align16_loop): ++ pcmpeqb 16(%eax), %xmm0 ++ pmovmskb %xmm0, %edx ++ test %edx, %edx ++ jnz L(exit16) ++ ++ pcmpeqb 32(%eax), %xmm1 ++ pmovmskb %xmm1, %edx ++ test %edx, %edx ++ jnz L(exit32) ++ ++ pcmpeqb 48(%eax), %xmm2 ++ pmovmskb %xmm2, %edx ++ test %edx, %edx ++ jnz L(exit48) ++ ++ pcmpeqb 64(%eax), %xmm3 ++ pmovmskb %xmm3, %edx ++ lea 64(%eax), %eax ++ test %edx, %edx ++ jz L(align16_loop) ++L(exit): ++ sub %edi, %eax ++L(exit_less16): ++ bsf %edx, %edx ++ add %edx, %eax ++ RETURN ++L(exit16): ++ sub %edi, %eax ++ bsf %edx, %edx ++ add %edx, %eax ++ add $16, %eax ++ RETURN ++L(exit32): ++ sub %edi, %eax ++ bsf %edx, %edx ++ add %edx, %eax ++ add $32, %eax ++ RETURN ++L(exit48): ++ sub %edi, %eax ++ bsf %edx, %edx ++ add %edx, %eax ++ add $48, %eax ++ POP (%edi) ++ POP (%esi) ++ ret ++ ++END ( __strlen_sse2_bsf) ++ ++#endif +Index: glibc-2.12-2-gc4ccff1/sysdeps/i386/i686/multiarch/strlen-sse2.S +=================================================================== +--- /dev/null ++++ glibc-2.12-2-gc4ccff1/sysdeps/i386/i686/multiarch/strlen-sse2.S +@@ -0,0 +1,347 @@ ++/* strlen with SSE2 ++ Copyright (C) 2010 Free Software Foundation, Inc. ++ Contributed by Intel Corporation. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, write to the Free ++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++ 02111-1307 USA. */ ++ ++#if defined SHARED && !defined NOT_IN_libc ++ ++#include ++#include "asm-syntax.h" ++ ++#define CFI_PUSH(REG) \ ++ cfi_adjust_cfa_offset (4); \ ++ cfi_rel_offset (REG, 0) ++ ++#define CFI_POP(REG) \ ++ cfi_adjust_cfa_offset (-4); \ ++ cfi_restore (REG) ++ ++#define PUSH(REG) pushl REG; CFI_PUSH (REG) ++#define POP(REG) popl REG; CFI_POP (REG) ++#define PARMS 4 ++#define STR PARMS ++#define ENTRANCE ++#define RETURN ret ++ ++ .text ++ENTRY (__strlen_sse2) ++ ENTRANCE ++ mov STR(%esp), %edx ++ xor %eax, %eax ++ cmpb $0, (%edx) ++ jz L(exit_tail0) ++ cmpb $0, 1(%edx) ++ jz L(exit_tail1) ++ cmpb $0, 2(%edx) ++ jz L(exit_tail2) ++ cmpb $0, 3(%edx) ++ jz L(exit_tail3) ++ cmpb $0, 4(%edx) ++ jz L(exit_tail4) ++ cmpb $0, 5(%edx) ++ jz L(exit_tail5) ++ cmpb $0, 6(%edx) ++ jz L(exit_tail6) ++ cmpb $0, 7(%edx) ++ jz L(exit_tail7) ++ cmpb $0, 8(%edx) ++ jz L(exit_tail8) ++ cmpb $0, 9(%edx) ++ jz L(exit_tail9) ++ cmpb $0, 10(%edx) ++ jz L(exit_tail10) ++ cmpb $0, 11(%edx) ++ jz L(exit_tail11) ++ cmpb $0, 12(%edx) ++ jz L(exit_tail12) ++ cmpb $0, 13(%edx) ++ jz L(exit_tail13) ++ cmpb $0, 14(%edx) ++ jz L(exit_tail14) ++ cmpb $0, 15(%edx) ++ jz L(exit_tail15) ++ pxor %xmm0, %xmm0 ++ mov %edx, %eax ++ mov %edx, %ecx ++ and $-16, %eax ++ add $16, %ecx ++ add $16, %eax ++ ++ pcmpeqb (%eax), %xmm0 ++ pmovmskb %xmm0, %edx ++ pxor %xmm1, %xmm1 ++ test %edx, %edx ++ lea 16(%eax), %eax ++ jnz L(exit) ++ ++ pcmpeqb (%eax), %xmm1 ++ pmovmskb %xmm1, %edx ++ pxor %xmm2, %xmm2 ++ test %edx, %edx ++ lea 16(%eax), %eax ++ jnz L(exit) ++ ++ ++ pcmpeqb (%eax), %xmm2 ++ pmovmskb %xmm2, %edx ++ pxor %xmm3, %xmm3 ++ test %edx, %edx ++ lea 16(%eax), %eax ++ jnz L(exit) ++ ++ pcmpeqb (%eax), %xmm3 ++ pmovmskb %xmm3, %edx ++ test %edx, %edx ++ lea 16(%eax), %eax ++ jnz L(exit) ++ ++ pcmpeqb (%eax), %xmm0 ++ pmovmskb %xmm0, %edx ++ test %edx, %edx ++ lea 16(%eax), %eax ++ jnz L(exit) ++ ++ pcmpeqb (%eax), %xmm1 ++ pmovmskb %xmm1, %edx ++ test %edx, %edx ++ lea 16(%eax), %eax ++ jnz L(exit) ++ ++ pcmpeqb (%eax), %xmm2 ++ pmovmskb %xmm2, %edx ++ test %edx, %edx ++ lea 16(%eax), %eax ++ jnz L(exit) ++ ++ pcmpeqb (%eax), %xmm3 ++ pmovmskb %xmm3, %edx ++ test %edx, %edx ++ lea 16(%eax), %eax ++ jnz L(exit) ++ ++ pcmpeqb (%eax), %xmm0 ++ pmovmskb %xmm0, %edx ++ test %edx, %edx ++ lea 16(%eax), %eax ++ jnz L(exit) ++ ++ pcmpeqb (%eax), %xmm1 ++ pmovmskb %xmm1, %edx ++ test %edx, %edx ++ lea 16(%eax), %eax ++ jnz L(exit) ++ ++ pcmpeqb (%eax), %xmm2 ++ pmovmskb %xmm2, %edx ++ test %edx, %edx ++ lea 16(%eax), %eax ++ jnz L(exit) ++ ++ pcmpeqb (%eax), %xmm3 ++ pmovmskb %xmm3, %edx ++ test %edx, %edx ++ lea 16(%eax), %eax ++ jnz L(exit) ++ ++ pcmpeqb (%eax), %xmm0 ++ pmovmskb %xmm0, %edx ++ test %edx, %edx ++ lea 16(%eax), %eax ++ jnz L(exit) ++ ++ pcmpeqb (%eax), %xmm1 ++ pmovmskb %xmm1, %edx ++ test %edx, %edx ++ lea 16(%eax), %eax ++ jnz L(exit) ++ ++ pcmpeqb (%eax), %xmm2 ++ pmovmskb %xmm2, %edx ++ test %edx, %edx ++ lea 16(%eax), %eax ++ jnz L(exit) ++ ++ pcmpeqb (%eax), %xmm3 ++ pmovmskb %xmm3, %edx ++ test %edx, %edx ++ lea 16(%eax), %eax ++ jnz L(exit) ++ ++ and $-0x40, %eax ++ PUSH (%esi) ++ PUSH (%edi) ++ PUSH (%ebx) ++ PUSH (%ebp) ++ xor %ebp, %ebp ++L(aligned_64): ++ pcmpeqb (%eax), %xmm0 ++ pcmpeqb 16(%eax), %xmm1 ++ pcmpeqb 32(%eax), %xmm2 ++ pcmpeqb 48(%eax), %xmm3 ++ pmovmskb %xmm0, %edx ++ pmovmskb %xmm1, %esi ++ pmovmskb %xmm2, %edi ++ pmovmskb %xmm3, %ebx ++ or %edx, %ebp ++ or %esi, %ebp ++ or %edi, %ebp ++ or %ebx, %ebp ++ lea 64(%eax), %eax ++ jz L(aligned_64) ++L(48leave): ++ test %edx, %edx ++ jnz L(aligned_64_exit_16) ++ test %esi, %esi ++ jnz L(aligned_64_exit_32) ++ test %edi, %edi ++ jnz L(aligned_64_exit_48) ++ mov %ebx, %edx ++ lea (%eax), %eax ++ jmp L(aligned_64_exit) ++L(aligned_64_exit_48): ++ lea -16(%eax), %eax ++ mov %edi, %edx ++ jmp L(aligned_64_exit) ++L(aligned_64_exit_32): ++ lea -32(%eax), %eax ++ mov %esi, %edx ++ jmp L(aligned_64_exit) ++L(aligned_64_exit_16): ++ lea -48(%eax), %eax ++L(aligned_64_exit): ++ POP (%ebp) ++ POP (%ebx) ++ POP (%edi) ++ POP (%esi) ++L(exit): ++ sub %ecx, %eax ++ test %dl, %dl ++ jz L(exit_high) ++ test $0x01, %dl ++ jnz L(exit_tail0) ++ ++ test $0x02, %dl ++ jnz L(exit_tail1) ++ ++ test $0x04, %dl ++ jnz L(exit_tail2) ++ ++ test $0x08, %dl ++ jnz L(exit_tail3) ++ ++ test $0x10, %dl ++ jnz L(exit_tail4) ++ ++ test $0x20, %dl ++ jnz L(exit_tail5) ++ ++ test $0x40, %dl ++ jnz L(exit_tail6) ++ add $7, %eax ++L(exit_tail0): ++ RETURN ++ ++L(exit_high): ++ add $8, %eax ++ test $0x01, %dh ++ jnz L(exit_tail0) ++ ++ test $0x02, %dh ++ jnz L(exit_tail1) ++ ++ test $0x04, %dh ++ jnz L(exit_tail2) ++ ++ test $0x08, %dh ++ jnz L(exit_tail3) ++ ++ test $0x10, %dh ++ jnz L(exit_tail4) ++ ++ test $0x20, %dh ++ jnz L(exit_tail5) ++ ++ test $0x40, %dh ++ jnz L(exit_tail6) ++ add $7, %eax ++ RETURN ++ ++ .p2align 4 ++L(exit_tail1): ++ add $1, %eax ++ RETURN ++ ++L(exit_tail2): ++ add $2, %eax ++ RETURN ++ ++L(exit_tail3): ++ add $3, %eax ++ RETURN ++ ++L(exit_tail4): ++ add $4, %eax ++ RETURN ++ ++L(exit_tail5): ++ add $5, %eax ++ RETURN ++ ++L(exit_tail6): ++ add $6, %eax ++ RETURN ++ ++L(exit_tail7): ++ add $7, %eax ++ RETURN ++ ++L(exit_tail8): ++ add $8, %eax ++ RETURN ++ ++L(exit_tail9): ++ add $9, %eax ++ RETURN ++ ++L(exit_tail10): ++ add $10, %eax ++ RETURN ++ ++L(exit_tail11): ++ add $11, %eax ++ RETURN ++ ++L(exit_tail12): ++ add $12, %eax ++ RETURN ++ ++L(exit_tail13): ++ add $13, %eax ++ RETURN ++ ++L(exit_tail14): ++ add $14, %eax ++ RETURN ++ ++L(exit_tail15): ++ add $15, %eax ++ ret ++ ++END (__strlen_sse2) ++ ++#endif +Index: glibc-2.12-2-gc4ccff1/sysdeps/i386/i686/multiarch/strlen.S +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/sysdeps/i386/i686/multiarch/strlen.S ++++ glibc-2.12-2-gc4ccff1/sysdeps/i386/i686/multiarch/strlen.S +@@ -48,6 +48,9 @@ ENTRY(strlen) + 1: leal __strlen_ia32@GOTOFF(%ebx), %eax + testl $bit_SSE2, CPUID_OFFSET+index_SSE2+__cpu_features@GOTOFF(%ebx) + jz 2f ++ leal __strlen_sse2_bsf@GOTOFF(%ebx), %eax ++ testl $bit_Slow_BSF, FEATURE_OFFSET+index_Slow_BSF+__cpu_features@GOTOFF(%ebx) ++ jz 2f + leal __strlen_sse2@GOTOFF(%ebx), %eax + 2: popl %ebx + cfi_adjust_cfa_offset (-4); +@@ -55,84 +58,6 @@ ENTRY(strlen) + ret + END(strlen) + +-#define CFI_POP(REG) \ +- cfi_adjust_cfa_offset (-4); \ +- cfi_restore (REG) +- +-#define RETURN popl %esi; CFI_POP (esi); ret +- +- .text +-ENTRY (__strlen_sse2) +-/* +- * This implementation uses SSE instructions to compare up to 16 bytes +- * at a time looking for the end of string (null char). +- */ +- pushl %esi +- cfi_adjust_cfa_offset (4) +- cfi_rel_offset (%esi, 0) +- mov 8(%esp), %eax +- mov %eax, %ecx +- pxor %xmm0, %xmm0 /* 16 null chars */ +- mov %eax, %esi +- and $15, %ecx +- jz 1f /* string is 16 byte aligned */ +- +- /* +- * Unaligned case. Round down to 16-byte boundary before comparing +- * 16 bytes for a null char. The code then compensates for any extra chars +- * preceding the start of the string. +- */ +- and $-16, %esi +- +- pcmpeqb (%esi), %xmm0 +- lea 16(%eax), %esi +- pmovmskb %xmm0, %edx +- +- shr %cl, %edx /* Compensate for bytes preceding the string */ +- test %edx, %edx +- jnz 2f +- sub %ecx, %esi /* no null, adjust to next 16-byte boundary */ +- pxor %xmm0, %xmm0 /* clear xmm0, may have been changed... */ +- +- .p2align 4 +-1: /* 16 byte aligned */ +- pcmpeqb (%esi), %xmm0 /* look for null bytes */ +- pmovmskb %xmm0, %edx /* move each byte mask of %xmm0 to edx */ +- +- add $16, %esi /* prepare to search next 16 bytes */ +- test %edx, %edx /* if no null byte, %edx must be 0 */ +- jnz 2f /* found a null */ +- +- pcmpeqb (%esi), %xmm0 +- pmovmskb %xmm0, %edx +- add $16, %esi +- test %edx, %edx +- jnz 2f +- +- pcmpeqb (%esi), %xmm0 +- pmovmskb %xmm0, %edx +- add $16, %esi +- test %edx, %edx +- jnz 2f +- +- pcmpeqb (%esi), %xmm0 +- pmovmskb %xmm0, %edx +- add $16, %esi +- test %edx, %edx +- jz 1b +- +-2: +- neg %eax +- lea -16(%eax, %esi), %eax /* calculate exact offset */ +- bsf %edx, %ecx /* Least significant 1 bit is index of null */ +- add %ecx, %eax +- popl %esi +- cfi_adjust_cfa_offset (-4) +- cfi_restore (%esi) +- ret +- +-END (__strlen_sse2) +- + # undef ENTRY + # define ENTRY(name) \ + .type __strlen_ia32, @function; \ +--- a/sysdeps/x86_64/multiarch/Makefile 2012-03-01 10:43:30.060487726 -0700 ++++ b/sysdeps/x86_64/multiarch/Makefile 2012-03-01 10:45:57.894692115 -0700 +@@ -7,7 +7,7 @@ ifeq ($(subdir),string) + sysdep_routines += stpncpy-c strncpy-c strcmp-ssse3 strncmp-ssse3 \ + strend-sse4 memcmp-sse4 \ + strcasestr-nonascii strcasecmp_l-ssse3 \ +- strncase_l-ssse3 \ ++ strncase_l-ssse3 strlen-sse4 strlen-no-bsf \ + memset-x86-64 + ifeq (yes,$(config-cflags-sse4)) + sysdep_routines += strcspn-c strpbrk-c strspn-c strstr-c strcasestr-c +Index: glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/init-arch.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/sysdeps/x86_64/multiarch/init-arch.c ++++ glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/init-arch.c +@@ -77,6 +77,12 @@ __init_cpu_features (void) + model += extended_model; + switch (model) + { ++ case 0x1c: ++ case 0x26: ++ /* BSF is slow on Atom. */ ++ __cpu_features.feature[index_Slow_BSF] |= bit_Slow_BSF; ++ break; ++ + case 0x1a: + case 0x1e: + case 0x1f: +--- a/sysdeps/x86_64/multiarch/init-arch.h 2012-03-01 10:43:30.061487720 -0700 ++++ b/sysdeps/x86_64/multiarch/init-arch.h 2012-03-01 10:48:13.371963005 -0700 +@@ -17,6 +17,7 @@ + 02111-1307 USA. */ + + #define bit_Fast_Rep_String (1 << 0) ++#define bit_Slow_BSF (1 << 2) + #define bit_Prefer_SSE_for_memop (1 << 3) + + #ifdef __ASSEMBLER__ +@@ -34,6 +35,7 @@ + # define index_SSE4_2 COMMON_CPUID_INDEX_1*CPUID_SIZE+CPUID_ECX_OFFSET + + #define index_Fast_Rep_String FEATURE_INDEX_1*FEATURE_SIZE ++# define index_Slow_BSF FEATURE_INDEX_1*FEATURE_SIZE + # define index_Prefer_SSE_for_memop FEATURE_INDEX_1*FEATURE_SIZE + + #else /* __ASSEMBLER__ */ +@@ -105,11 +107,15 @@ extern const struct cpu_features *__get_ + # define HAS_FMA HAS_CPU_FEATURE (COMMON_CPUID_INDEX_1, ecx, 12) + + # define index_Fast_Rep_String FEATURE_INDEX_1 ++# define index_Slow_BSF FEATURE_INDEX_1 + # define index_Prefer_SSE_for_memop FEATURE_INDEX_1 + + #define HAS_ARCH_FEATURE(idx, bit) \ + ((__get_cpu_features ()->feature[idx] & (bit)) != 0) + ++#define HAS_SLOW_BSF \ ++ HAS_ARCH_FEATURE (index_Slow_BSF, bit_Slow_BSF) ++ + #define HAS_PREFER_SSE_FOR_MEMOP \ + HAS_ARCH_FEATURE (index_Prefer_SSE_for_memop, bit_Prefer_SSE_for_memop) + +Index: glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/strlen-no-bsf.S +=================================================================== +--- /dev/null ++++ glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/strlen-no-bsf.S +@@ -0,0 +1,309 @@ ++/* strlen without BSF ++ Copyright (C) 2010 Free Software Foundation, Inc. ++ Contributed by Intel Corporation. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, write to the Free ++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++ 02111-1307 USA. */ ++ ++#if defined SHARED && !defined NOT_IN_libc ++ ++#include ++ ++ .section .text.slow,"ax",@progbits ++ENTRY (__strlen_no_bsf) ++ xor %eax, %eax ++ cmpb $0, (%rdi) ++ jz L(exit_tail0) ++ cmpb $0, 1(%rdi) ++ jz L(exit_tail1) ++ cmpb $0, 2(%rdi) ++ jz L(exit_tail2) ++ cmpb $0, 3(%rdi) ++ jz L(exit_tail3) ++ cmpb $0, 4(%rdi) ++ jz L(exit_tail4) ++ cmpb $0, 5(%rdi) ++ jz L(exit_tail5) ++ cmpb $0, 6(%rdi) ++ jz L(exit_tail6) ++ cmpb $0, 7(%rdi) ++ jz L(exit_tail7) ++ cmpb $0, 8(%rdi) ++ jz L(exit_tail8) ++ cmpb $0, 9(%rdi) ++ jz L(exit_tail9) ++ cmpb $0, 10(%rdi) ++ jz L(exit_tail10) ++ cmpb $0, 11(%rdi) ++ jz L(exit_tail11) ++ cmpb $0, 12(%rdi) ++ jz L(exit_tail12) ++ cmpb $0, 13(%rdi) ++ jz L(exit_tail13) ++ cmpb $0, 14(%rdi) ++ jz L(exit_tail14) ++ cmpb $0, 15(%rdi) ++ jz L(exit_tail15) ++ pxor %xmm0, %xmm0 ++ mov %rdi, %rcx ++ mov %rdi, %rax ++ and $-16, %rax ++ add $16, %rax ++ add $16, %rcx ++ ++ pcmpeqb (%rax), %xmm0 ++ pmovmskb %xmm0, %edx ++ pxor %xmm1, %xmm1 ++ test %edx, %edx ++ lea 16(%rax), %rax ++ jnz L(exit) ++ ++ pcmpeqb (%rax), %xmm1 ++ pmovmskb %xmm1, %edx ++ pxor %xmm2, %xmm2 ++ test %edx, %edx ++ lea 16(%rax), %rax ++ jnz L(exit) ++ ++ ++ pcmpeqb (%rax), %xmm2 ++ pmovmskb %xmm2, %edx ++ pxor %xmm3, %xmm3 ++ test %edx, %edx ++ lea 16(%rax), %rax ++ jnz L(exit) ++ ++ pcmpeqb (%rax), %xmm3 ++ pmovmskb %xmm3, %edx ++ test %edx, %edx ++ lea 16(%rax), %rax ++ jnz L(exit) ++ ++ pcmpeqb (%rax), %xmm0 ++ pmovmskb %xmm0, %edx ++ test %edx, %edx ++ lea 16(%rax), %rax ++ jnz L(exit) ++ ++ pcmpeqb (%rax), %xmm1 ++ pmovmskb %xmm1, %edx ++ test %edx, %edx ++ lea 16(%rax), %rax ++ jnz L(exit) ++ ++ pcmpeqb (%rax), %xmm2 ++ pmovmskb %xmm2, %edx ++ test %edx, %edx ++ lea 16(%rax), %rax ++ jnz L(exit) ++ ++ pcmpeqb (%rax), %xmm3 ++ pmovmskb %xmm3, %edx ++ test %edx, %edx ++ lea 16(%rax), %rax ++ jnz L(exit) ++ ++ pcmpeqb (%rax), %xmm0 ++ pmovmskb %xmm0, %edx ++ test %edx, %edx ++ lea 16(%rax), %rax ++ jnz L(exit) ++ ++ pcmpeqb (%rax), %xmm1 ++ pmovmskb %xmm1, %edx ++ test %edx, %edx ++ lea 16(%rax), %rax ++ jnz L(exit) ++ ++ pcmpeqb (%rax), %xmm2 ++ pmovmskb %xmm2, %edx ++ test %edx, %edx ++ lea 16(%rax), %rax ++ jnz L(exit) ++ ++ pcmpeqb (%rax), %xmm3 ++ pmovmskb %xmm3, %edx ++ test %edx, %edx ++ lea 16(%rax), %rax ++ jnz L(exit) ++ ++ pcmpeqb (%rax), %xmm0 ++ pmovmskb %xmm0, %edx ++ test %edx, %edx ++ lea 16(%rax), %rax ++ jnz L(exit) ++ ++ pcmpeqb (%rax), %xmm1 ++ pmovmskb %xmm1, %edx ++ test %edx, %edx ++ lea 16(%rax), %rax ++ jnz L(exit) ++ ++ pcmpeqb (%rax), %xmm2 ++ pmovmskb %xmm2, %edx ++ test %edx, %edx ++ lea 16(%rax), %rax ++ jnz L(exit) ++ ++ pcmpeqb (%rax), %xmm3 ++ pmovmskb %xmm3, %edx ++ test %edx, %edx ++ lea 16(%rax), %rax ++ jnz L(exit) ++ ++ and $-0x40, %rax ++ xor %r8d, %r8d ++L(aligned_64): ++ pcmpeqb (%rax), %xmm0 ++ pcmpeqb 16(%rax), %xmm1 ++ pcmpeqb 32(%rax), %xmm2 ++ pcmpeqb 48(%rax), %xmm3 ++ pmovmskb %xmm0, %edx ++ pmovmskb %xmm1, %esi ++ pmovmskb %xmm2, %edi ++ pmovmskb %xmm3, %r9d ++ or %edx, %r8d ++ or %esi, %r8d ++ or %edi, %r8d ++ or %r9d, %r8d ++ lea 64(%rax), %rax ++ jz L(aligned_64) ++ ++ test %edx, %edx ++ jnz L(aligned_64_exit_16) ++ test %esi, %esi ++ jnz L(aligned_64_exit_32) ++ test %edi, %edi ++ jnz L(aligned_64_exit_48) ++L(aligned_64_exit_64): ++ mov %r9d, %edx ++ jmp L(aligned_64_exit) ++L(aligned_64_exit_48): ++ lea -16(%rax), %rax ++ mov %edi, %edx ++ jmp L(aligned_64_exit) ++L(aligned_64_exit_32): ++ lea -32(%rax), %rax ++ mov %esi, %edx ++ jmp L(aligned_64_exit) ++L(aligned_64_exit_16): ++ lea -48(%rax), %rax ++L(aligned_64_exit): ++L(exit): ++ sub %rcx, %rax ++ test %dl, %dl ++ jz L(exit_high) ++ test $0x01, %dl ++ jnz L(exit_tail0) ++ ++ test $0x02, %dl ++ jnz L(exit_tail1) ++ ++ test $0x04, %dl ++ jnz L(exit_tail2) ++ ++ test $0x08, %dl ++ jnz L(exit_tail3) ++ ++ test $0x10, %dl ++ jnz L(exit_tail4) ++ ++ test $0x20, %dl ++ jnz L(exit_tail5) ++ ++ test $0x40, %dl ++ jnz L(exit_tail6) ++ add $7, %eax ++L(exit_tail0): ++ ret ++ ++L(exit_high): ++ add $8, %eax ++ test $0x01, %dh ++ jnz L(exit_tail0) ++ ++ test $0x02, %dh ++ jnz L(exit_tail1) ++ ++ test $0x04, %dh ++ jnz L(exit_tail2) ++ ++ test $0x08, %dh ++ jnz L(exit_tail3) ++ ++ test $0x10, %dh ++ jnz L(exit_tail4) ++ ++ test $0x20, %dh ++ jnz L(exit_tail5) ++ ++ test $0x40, %dh ++ jnz L(exit_tail6) ++ add $7, %eax ++ ret ++ .p2align 4 ++L(exit_tail1): ++ add $1, %eax ++ ret ++ ++L(exit_tail2): ++ add $2, %eax ++ ret ++ ++L(exit_tail3): ++ add $3, %eax ++ ret ++ ++L(exit_tail4): ++ add $4, %eax ++ ret ++ ++L(exit_tail5): ++ add $5, %eax ++ ret ++L(exit_tail6): ++ add $6, %eax ++ ret ++L(exit_tail7): ++ add $7, %eax ++ ret ++L(exit_tail8): ++ add $8, %eax ++ ret ++L(exit_tail9): ++ add $9, %eax ++ ret ++L(exit_tail10): ++ add $10, %eax ++ ret ++L(exit_tail11): ++ add $11, %eax ++ ret ++L(exit_tail12): ++ add $12, %eax ++ ret ++L(exit_tail13): ++ add $13, %eax ++ ret ++L(exit_tail14): ++ add $14, %eax ++ ret ++L(exit_tail15): ++ add $15, %eax ++ ret ++END (__strlen_no_bsf) ++ ++#endif +Index: glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/strlen-sse4.S +=================================================================== +--- /dev/null ++++ glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/strlen-sse4.S +@@ -0,0 +1,85 @@ ++/* strlen with SSE4 ++ Copyright (C) 2009, 2010 Free Software Foundation, Inc. ++ Contributed by Ulrich Drepper . ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, write to the Free ++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++ 02111-1307 USA. */ ++ ++#if defined SHARED && !defined NOT_IN_libc ++ ++#include ++ ++ .section .text.sse4.2,"ax",@progbits ++ENTRY (__strlen_sse42) ++ pxor %xmm1, %xmm1 ++ movl %edi, %ecx ++ movq %rdi, %r8 ++ andq $~15, %rdi ++ xor %edi, %ecx ++ pcmpeqb (%rdi), %xmm1 ++ pmovmskb %xmm1, %edx ++ shrl %cl, %edx ++ shll %cl, %edx ++ andl %edx, %edx ++ jnz L(less16bytes) ++ pxor %xmm1, %xmm1 ++ ++ .p2align 4 ++L(more64bytes_loop): ++ pcmpistri $0x08, 16(%rdi), %xmm1 ++ jz L(more32bytes) ++ ++ pcmpistri $0x08, 32(%rdi), %xmm1 ++ jz L(more48bytes) ++ ++ pcmpistri $0x08, 48(%rdi), %xmm1 ++ jz L(more64bytes) ++ ++ add $64, %rdi ++ pcmpistri $0x08, (%rdi), %xmm1 ++ jnz L(more64bytes_loop) ++ leaq (%rdi,%rcx), %rax ++ subq %r8, %rax ++ ret ++ ++ .p2align 4 ++L(more32bytes): ++ leaq 16(%rdi,%rcx, 1), %rax ++ subq %r8, %rax ++ ret ++ ++ .p2align 4 ++L(more48bytes): ++ leaq 32(%rdi,%rcx, 1), %rax ++ subq %r8, %rax ++ ret ++ ++ .p2align 4 ++L(more64bytes): ++ leaq 48(%rdi,%rcx, 1), %rax ++ subq %r8, %rax ++ ret ++ ++ .p2align 4 ++L(less16bytes): ++ subq %r8, %rdi ++ bsfl %edx, %eax ++ addq %rdi, %rax ++ ret ++ ++END (__strlen_sse42) ++ ++#endif +Index: glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/strlen.S +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/sysdeps/x86_64/multiarch/strlen.S ++++ glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/strlen.S +@@ -36,74 +36,12 @@ ENTRY(strlen) + testl $bit_SSE4_2, __cpu_features+CPUID_OFFSET+index_SSE4_2(%rip) + jz 2f + leaq __strlen_sse42(%rip), %rax +-2: ret +-END(strlen) +- +- +- .section .text.sse4.2,"ax",@progbits +- .align 16 +- .type __strlen_sse42, @function +-__strlen_sse42: +- cfi_startproc +- CALL_MCOUNT +- pxor %xmm1, %xmm1 +- movl %edi, %ecx +- movq %rdi, %r8 +- andq $~15, %rdi +- xor %edi, %ecx +- pcmpeqb (%rdi), %xmm1 +- pmovmskb %xmm1, %edx +- shrl %cl, %edx +- shll %cl, %edx +- andl %edx, %edx +- jnz L(less16bytes) +- pxor %xmm1, %xmm1 +- +- .p2align 4 +-L(more64bytes_loop): +- pcmpistri $0x08, 16(%rdi), %xmm1 +- jz L(more32bytes) +- +- pcmpistri $0x08, 32(%rdi), %xmm1 +- jz L(more48bytes) +- +- pcmpistri $0x08, 48(%rdi), %xmm1 +- jz L(more64bytes) +- +- add $64, %rdi +- pcmpistri $0x08, (%rdi), %xmm1 +- jnz L(more64bytes_loop) +- leaq (%rdi,%rcx), %rax +- subq %r8, %rax +- ret +- +- .p2align 4 +-L(more32bytes): +- leaq 16(%rdi,%rcx, 1), %rax +- subq %r8, %rax +- ret +- +- .p2align 4 +-L(more48bytes): +- leaq 32(%rdi,%rcx, 1), %rax +- subq %r8, %rax +- ret +- +- .p2align 4 +-L(more64bytes): +- leaq 48(%rdi,%rcx, 1), %rax +- subq %r8, %rax + ret +- +- .p2align 4 +-L(less16bytes): +- subq %r8, %rdi +- bsfl %edx, %eax +- addq %rdi, %rax +- ret +- cfi_endproc +- .size __strlen_sse42, .-__strlen_sse42 +- ++2: testl $bit_Slow_BSF, __cpu_features+FEATURE_OFFSET+index_Slow_BSF(%rip) ++ jz 3f ++ leaq __strlen_no_bsf(%rip), %rax ++3: ret ++END(strlen) + + # undef ENTRY + # define ENTRY(name) \ +Index: glibc-2.12-2-gc4ccff1/sysdeps/x86_64/strlen.S +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/sysdeps/x86_64/strlen.S ++++ glibc-2.12-2-gc4ccff1/sysdeps/x86_64/strlen.S +@@ -23,29 +23,80 @@ + + .text + ENTRY(strlen) +- pxor %xmm2, %xmm2 +- movq %rdi, %rcx +- movq %rdi, %r8 +- andq $~15, %rdi +- movdqa %xmm2, %xmm1 +- pcmpeqb (%rdi), %xmm2 +- orl $0xffffffff, %esi +- subq %rdi, %rcx +- shll %cl, %esi +- pmovmskb %xmm2, %edx +- andl %esi, %edx +- jnz 1f +- +-2: movdqa 16(%rdi), %xmm0 +- leaq 16(%rdi), %rdi ++ xor %rax, %rax ++ mov %edi, %ecx ++ and $0x3f, %ecx ++ pxor %xmm0, %xmm0 ++ cmp $0x30, %ecx ++ ja L(next) ++ movdqu (%rdi), %xmm1 + pcmpeqb %xmm1, %xmm0 + pmovmskb %xmm0, %edx +- testl %edx, %edx +- jz 2b ++ test %edx, %edx ++ jnz L(exit_less16) ++ mov %rdi, %rax ++ and $-16, %rax ++ jmp L(align16_start) ++L(next): ++ mov %rdi, %rax ++ and $-16, %rax ++ pcmpeqb (%rax), %xmm0 ++ mov $-1, %esi ++ sub %rax, %rcx ++ shl %cl, %esi ++ pmovmskb %xmm0, %edx ++ and %esi, %edx ++ jnz L(exit) ++L(align16_start): ++ pxor %xmm0, %xmm0 ++ pxor %xmm1, %xmm1 ++ pxor %xmm2, %xmm2 ++ pxor %xmm3, %xmm3 ++ .p2align 4 ++L(align16_loop): ++ pcmpeqb 16(%rax), %xmm0 ++ pmovmskb %xmm0, %edx ++ test %edx, %edx ++ jnz L(exit16) + +-1: subq %r8, %rdi +- bsfl %edx, %eax +- addq %rdi, %rax ++ pcmpeqb 32(%rax), %xmm1 ++ pmovmskb %xmm1, %edx ++ test %edx, %edx ++ jnz L(exit32) ++ ++ pcmpeqb 48(%rax), %xmm2 ++ pmovmskb %xmm2, %edx ++ test %edx, %edx ++ jnz L(exit48) ++ ++ pcmpeqb 64(%rax), %xmm3 ++ pmovmskb %xmm3, %edx ++ lea 64(%rax), %rax ++ test %edx, %edx ++ jz L(align16_loop) ++L(exit): ++ sub %rdi, %rax ++L(exit_less16): ++ bsf %rdx, %rdx ++ add %rdx, %rax ++ ret ++ .p2align 4 ++L(exit16): ++ sub %rdi, %rax ++ bsf %rdx, %rdx ++ lea 16(%rdx,%rax), %rax ++ ret ++ .p2align 4 ++L(exit32): ++ sub %rdi, %rax ++ bsf %rdx, %rdx ++ lea 32(%rdx,%rax), %rax ++ ret ++ .p2align 4 ++L(exit48): ++ sub %rdi, %rax ++ bsf %rdx, %rdx ++ lea 48(%rdx,%rax), %rax + ret + END(strlen) + libc_hidden_builtin_def (strlen) diff --git a/SOURCES/glibc-rh696472.patch b/SOURCES/glibc-rh696472.patch new file mode 100644 index 0000000..9d30d38 --- /dev/null +++ b/SOURCES/glibc-rh696472.patch @@ -0,0 +1,36 @@ +commit 3d29045b5e8329d97693eda8d98f1d1e60b99c8f +Author: H.J. Lu +Date: Fri Jun 3 07:01:25 2011 -0400 + + Assume Intel Core i3/i5/i7 processor if AVX is available + +2011-06-02 H.J. Lu + + * sysdeps/x86_64/multiarch/init-arch.c (__init_cpu_features): + Assume Intel Core i3/i5/i7 processor if AVX is available. + +diff --git a/sysdeps/x86_64/multiarch/init-arch.c b/sysdeps/x86_64/multiarch/init-arch.c +index 34ec2df..809d105 100644 +--- a/sysdeps/x86_64/multiarch/init-arch.c ++++ b/sysdeps/x86_64/multiarch/init-arch.c +@@ -74,6 +74,7 @@ __init_cpu_features (void) + } + else if (family == 0x06) + { ++ ecx = __cpu_features.cpuid[COMMON_CPUID_INDEX_1].ecx; + model += extended_model; + switch (model) + { +@@ -83,6 +84,12 @@ __init_cpu_features (void) + __cpu_features.feature[index_Slow_BSF] |= bit_Slow_BSF; + break; + ++ default: ++ /* Unknown family 0x06 processors. Assuming this is one ++ of Core i3/i5/i7 processors if AVX is available. */ ++ if ((ecx & bit_AVX) == 0) ++ break; ++ + case 0x1a: + case 0x1e: + case 0x1f: diff --git a/SOURCES/glibc-rh697421.patch b/SOURCES/glibc-rh697421.patch new file mode 100644 index 0000000..961c805 --- /dev/null +++ b/SOURCES/glibc-rh697421.patch @@ -0,0 +1,10 @@ +diff -rup a/iconvdata/gconv-modules b/iconvdata/gconv-modules +--- a/iconvdata/gconv-modules 2010-05-04 05:27:23.000000000 -0600 ++++ b/iconvdata/gconv-modules 2012-01-26 10:58:24.181895489 -0700 +@@ -1954,3 +1954,6 @@ alias HPGREEK8// HP-GREEK8// + alias OSF10010004// HP-GREEK8// + module HP-GREEK8// INTERNAL HP-GREEK8 1 + module INTERNAL HP-GREEK8// HP-GREEK8 1 ++ ++alias ISO-10646-UCS-2// UNICODE// ++alias ISO-10646-UCS-2// ISO-10646/UTF8/ diff --git a/SOURCES/glibc-rh699724.patch b/SOURCES/glibc-rh699724.patch new file mode 100644 index 0000000..d25ce84 --- /dev/null +++ b/SOURCES/glibc-rh699724.patch @@ -0,0 +1,188 @@ +2011-02-23 Andreas Schwab + + [BZ #12509] + * elf/dl-load.c (_dl_map_object_from_fd): Free realname before + returning unsuccessfully. + * elf/Makefile ($(objpfx)noload-mem): New rule. + (noload-ENV): Define. + (tests): Add $(objpfx)noload-mem. + * elf/noload.c: Include . + (main): Call mtrace. Close all opened handles. + +2010-09-27 Andreas Schwab + + * include/link.h (struct link_map): Add l_free_initfini. + * elf/dl-deps.c (_dl_map_object_deps): Set it when assigning + l_initfini. + * elf/rtld.c (dl_main): Clear it on all objects loaded on startup. + * elf/dl-libc.c (free_mem): Free l_initfini if l_free_initfini is + set. + +Index: glibc-2.12-2-gc4ccff1/elf/Makefile +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/elf/Makefile ++++ glibc-2.12-2-gc4ccff1/elf/Makefile +@@ -211,7 +211,7 @@ endif + ifeq (yesyes,$(have-fpie)$(build-shared)) + tests: $(objpfx)tst-pie1.out + endif +-tests: $(objpfx)tst-leaks1-mem ++tests: $(objpfx)tst-leaks1-mem $(objpfx)noload-mem + tlsmod17a-suffixes = 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + tlsmod18a-suffixes = 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \ +@@ -664,6 +664,10 @@ $(objpfx)noload: $(objpfx)testobj1.so $( + LDFLAGS-noload = -rdynamic + $(objpfx)noload.out: $(objpfx)testobj5.so + ++$(objpfx)noload-mem: $(objpfx)noload.out ++ $(common-objpfx)malloc/mtrace $(objpfx)noload.mtrace > $@ ++noload-ENV = MALLOC_TRACE=$(objpfx)noload.mtrace ++ + LDFLAGS-nodelete = -rdynamic + LDFLAGS-nodelmod1.so = -Wl,--enable-new-dtags,-z,nodelete + LDFLAGS-nodelmod4.so = -Wl,--enable-new-dtags,-z,nodelete +Index: glibc-2.12-2-gc4ccff1/elf/dl-deps.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/elf/dl-deps.c ++++ glibc-2.12-2-gc4ccff1/elf/dl-deps.c +@@ -478,6 +478,7 @@ _dl_map_object_deps (struct link_map *ma + nneeded * sizeof needed[0]); + atomic_write_barrier (); + l->l_initfini = l_initfini; ++ l->l_free_initfini = 1; + } + + /* If we have no auxiliary objects just go on to the next map. */ +@@ -662,6 +663,7 @@ Filters not supported with LD_TRACE_PREL + l_initfini[nlist] = NULL; + atomic_write_barrier (); + map->l_initfini = l_initfini; ++ map->l_free_initfini = 1; + if (l_reldeps != NULL) + { + atomic_write_barrier (); +Index: glibc-2.12-2-gc4ccff1/elf/dl-libc.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/elf/dl-libc.c ++++ glibc-2.12-2-gc4ccff1/elf/dl-libc.c +@@ -250,5 +250,9 @@ libc_freeres_fn (free_mem) + if (! old->dont_free) + free (old); + } ++ ++ /* Free the initfini dependency list. */ ++ if (l->l_free_initfini) ++ free (l->l_initfini); + } + } +Index: glibc-2.12-2-gc4ccff1/elf/dl-load.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/elf/dl-load.c ++++ glibc-2.12-2-gc4ccff1/elf/dl-load.c +@@ -907,6 +907,7 @@ _dl_map_object_from_fd (const char *name + { + /* We are not supposed to load the object unless it is already + loaded. So return now. */ ++ free (realname); + __close (fd); + return NULL; + } +@@ -925,6 +926,7 @@ _dl_map_object_from_fd (const char *name + _dl_zerofd = _dl_sysdep_open_zero_fill (); + if (_dl_zerofd == -1) + { ++ free (realname); + __close (fd); + _dl_signal_error (errno, NULL, NULL, + N_("cannot open zero fill device")); +Index: glibc-2.12-2-gc4ccff1/elf/noload.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/elf/noload.c ++++ glibc-2.12-2-gc4ccff1/elf/noload.c +@@ -1,20 +1,28 @@ + #include + #include ++#include + + int + main (void) + { + int result = 0; ++ void *p; ++ ++ mtrace (); + + /* First try to load an object which is a dependency. This should + succeed. */ +- if (dlopen ("testobj1.so", RTLD_LAZY | RTLD_NOLOAD) == NULL) ++ p = dlopen ("testobj1.so", RTLD_LAZY | RTLD_NOLOAD); ++ if (p == NULL) + { + printf ("cannot open \"testobj1.so\": %s\n", dlerror ()); + result = 1; + } + else +- puts ("loading \"testobj1.so\" succeeded, OK"); ++ { ++ puts ("loading \"testobj1.so\" succeeded, OK"); ++ dlclose (p); ++ } + + /* Now try loading an object which is not already loaded. */ + if (dlopen ("testobj5.so", RTLD_LAZY | RTLD_NOLOAD) != NULL) +@@ -25,8 +33,6 @@ main (void) + else + { + /* Load the object and run the same test again. */ +- void *p; +- + puts ("\"testobj5.so\" wasn't loaded and RTLD_NOLOAD prevented it, OK"); + + p = dlopen ("testobj5.so", RTLD_LAZY); +@@ -41,13 +47,17 @@ main (void) + { + puts ("loading \"testobj5.so\" succeeded, OK"); + +- if (dlopen ("testobj5.so", RTLD_LAZY | RTLD_NOLOAD) == NULL) ++ void *q = dlopen ("testobj5.so", RTLD_LAZY | RTLD_NOLOAD); ++ if (q == NULL) + { + printf ("cannot open \"testobj5.so\": %s\n", dlerror ()); + result = 1; + } + else +- puts ("loading \"testobj5.so\" with RTLD_NOLOAD succeeded, OK"); ++ { ++ puts ("loading \"testobj5.so\" with RTLD_NOLOAD succeeded, OK"); ++ dlclose (q); ++ } + + if (dlclose (p) != 0) + { +Index: glibc-2.12-2-gc4ccff1/elf/rtld.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/elf/rtld.c ++++ glibc-2.12-2-gc4ccff1/elf/rtld.c +@@ -2249,6 +2249,7 @@ ERROR: ld.so: object '%s' cannot be load + lnp->dont_free = 1; + lnp = lnp->next; + } ++ l->l_free_initfini = 0; + + if (l != &GL(dl_rtld_map)) + _dl_relocate_object (l, l->l_scope, GLRO(dl_lazy) ? RTLD_LAZY : 0, +Index: glibc-2.12-2-gc4ccff1/include/link.h +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/include/link.h ++++ glibc-2.12-2-gc4ccff1/include/link.h +@@ -192,6 +192,9 @@ struct link_map + during LD_TRACE_PRELINKING=1 + contains any DT_SYMBOLIC + libraries. */ ++ unsigned int l_free_initfini:1; /* Nonzero if l_initfini can be ++ freed, ie. not allocated with ++ the dummy malloc in ld.so. */ + + /* Collected information about own RPATH directories. */ + struct r_search_path_struct l_rpath_dirs; diff --git a/SOURCES/glibc-rh700507.patch b/SOURCES/glibc-rh700507.patch new file mode 100644 index 0000000..0660431 --- /dev/null +++ b/SOURCES/glibc-rh700507.patch @@ -0,0 +1,26 @@ +Index: glibc-2.12-2-gc4ccff1/nscd/nscd.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/nscd/nscd.c ++++ glibc-2.12-2-gc4ccff1/nscd/nscd.c +@@ -260,10 +260,6 @@ main (int argc, char **argv) + /* In foreground mode we are not paranoid. */ + paranoia = 0; + +- /* Start the SELinux AVC. */ +- if (selinux_enabled) +- nscd_avc_init (); +- + signal (SIGINT, termination_handler); + signal (SIGQUIT, termination_handler); + signal (SIGTERM, termination_handler); +@@ -278,6 +274,10 @@ main (int argc, char **argv) + /* Init databases. */ + nscd_init (); + ++ /* Start the SELinux AVC. */ ++ if (selinux_enabled) ++ nscd_avc_init (); ++ + /* Handle incoming requests */ + start_threads (); + diff --git a/SOURCES/glibc-rh703480.patch b/SOURCES/glibc-rh703480.patch new file mode 100644 index 0000000..742a79a --- /dev/null +++ b/SOURCES/glibc-rh703480.patch @@ -0,0 +1,68 @@ +2011-01-15 Ulrich Drepper + + [BZ #6812] + * nscd/hstcache.c (tryagain): Define. + (cache_addhst): Return tryagain not notfound for temporary errors. + (addhstbyX): Also set h_errno to TRY_AGAIN when memory allocation + failed. + +Index: glibc-2.12-2-gc4ccff1/nscd/hstcache.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/nscd/hstcache.c ++++ glibc-2.12-2-gc4ccff1/nscd/hstcache.c +@@ -77,6 +77,20 @@ static const hst_response_header notfoun + }; + + ++/* This is the standard reply in case there are temporary problems. */ ++static const hst_response_header tryagain = ++{ ++ .version = NSCD_VERSION, ++ .found = 0, ++ .h_name_len = 0, ++ .h_aliases_cnt = 0, ++ .h_addrtype = -1, ++ .h_length = -1, ++ .h_addr_list_cnt = 0, ++ .error = TRY_AGAIN ++}; ++ ++ + static void + cache_addhst (struct database_dyn *db, int fd, request_header *req, + const void *key, struct hostent *hst, uid_t owner, +@@ -111,11 +125,15 @@ cache_addhst (struct database_dyn *db, i + else + { + /* We have no data. This means we send the standard reply for this +- case. */ ++ case. Possibly this is only temporary. */ + ssize_t total = sizeof (notfound); ++ assert (sizeof (notfound) == sizeof (tryagain)); ++ ++ const hst_response_header *resp = (errval == EAGAIN ++ ? &tryagain : ¬found); + + if (fd != -1 && +- TEMP_FAILURE_RETRY (send (fd, ¬found, total, ++ TEMP_FAILURE_RETRY (send (fd, resp, total, + MSG_NOSIGNAL)) != total) + all_written = false; + +@@ -135,7 +153,7 @@ cache_addhst (struct database_dyn *db, i + ? db->negtimeout : ttl); + + /* This is the reply. */ +- memcpy (&dataset->resp, ¬found, total); ++ memcpy (&dataset->resp, resp, total); + + /* Copy the key data. */ + memcpy (dataset->strdata, key, req->key_len); +@@ -490,6 +508,7 @@ addhstbyX (struct database_dyn *db, int + /* We set the error to indicate this is (possibly) a + temporary error and that it does not mean the entry + is not available at all. */ ++ h_errno = TRY_AGAIN; + errval = EAGAIN; + break; + } diff --git a/SOURCES/glibc-rh703481.patch b/SOURCES/glibc-rh703481.patch new file mode 100644 index 0000000..fdde4b5 --- /dev/null +++ b/SOURCES/glibc-rh703481.patch @@ -0,0 +1,875 @@ +2011-02-05 Ulrich Drepper + + * nscd/nscd-client.h: Define MAX_TIMEOUT_VALUE. + (struct datahead): Reuse 32 bits of the alignment for a TTL field. + * nscd/aicache.c (addhstaiX): Return timeout of added value. + (readdhstai): Return value of addhstaiX call. + * nscd/grpcache.c (cache_addgr): Return timeout of added value. + (addgrbyX): Return value returned by cache_addgr. + (readdgrbyname): Return value returned by addgrbyX. + (readdgrbygid): Likewise. + * nscd/pwdcache.c (cache_addpw): Return timeout of added value. + (addpwbyX): Return value returned by cache_addpw. + (readdpwbyname): Return value returned by addhstbyX. + (readdpwbyuid): Likewise. + * nscd/servicescache.c (cache_addserv): Return timeout of added value. + (addservbyX): Return value returned by cache_addserv. + (readdservbyname): Return value returned by addservbyX: + (readdservbyport): Likewise. + * nscd/hstcache.c (cache_addhst): Return timeout of added value. + (addhstbyX): Return value returned by cache_addhst. + (readdhstbyname): Return value returned by addhstbyX. + (readdhstbyaddr): Likewise. + (readdhstbynamev6): Likewise. + (readdhstbyaddrv6): Likewise. + * nscd/initgrcache.c (addinitgroupsX): Return timeout of added value. + (readdinitgroups): Return value returned by addinitgroupsX. + * nscd/cache.c (readdfcts): Change return value of functions to time_t. + (prune_cache): Keep track of timeout value of re-added entries. + * nscd/connections.c (nscd_run_prune): Use MAX_TIMEOUT_VALUE. + * nscd/nscd.h: Adjust prototypes of readd* functions. + +Index: glibc-2.12-2-gc4ccff1/nscd/aicache.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/nscd/aicache.c ++++ glibc-2.12-2-gc4ccff1/nscd/aicache.c +@@ -58,7 +58,7 @@ static const ai_response_header notfound + }; + + +-static void ++static time_t + addhstaiX (struct database_dyn *db, int fd, request_header *req, + void *key, uid_t uid, struct hashentry *const he, + struct datahead *dh) +@@ -119,6 +119,7 @@ addhstaiX (struct database_dyn *db, int + ssize_t total = 0; + char *key_copy = NULL; + bool alloca_used = false; ++ time_t timeout = MAX_TIMEOUT_VALUE; + + while (!no_more) + { +@@ -388,8 +389,8 @@ addhstaiX (struct database_dyn *db, int + dataset->head.usable = true; + + /* Compute the timeout time. */ +- dataset->head.timeout = time (NULL) + (ttl == INT32_MAX +- ? db->postimeout : ttl); ++ dataset->head.ttl = ttl == INT32_MAX ? db->postimeout : ttl; ++ timeout = dataset->head.timeout = time (NULL) + dataset->head.ttl; + + dataset->resp.version = NSCD_VERSION; + dataset->resp.found = 1; +@@ -421,6 +422,7 @@ addhstaiX (struct database_dyn *db, int + timeout value. Note that the new record has been + allocated on the stack and need not be freed. */ + dh->timeout = dataset->head.timeout; ++ dh->ttl = dataset->head.ttl; + ++dh->nreloads; + } + else +@@ -496,6 +498,9 @@ next_nip: + if (reload_count != UINT_MAX && dh->nreloads == reload_count) + /* Do not reset the value if we never not reload the record. */ + dh->nreloads = reload_count - 1; ++ ++ /* Reload with the same time-to-live value. */ ++ timeout = dh->timeout = time (NULL) + dh->ttl; + } + else + { +@@ -517,7 +522,8 @@ next_nip: + dataset->head.usable = true; + + /* Compute the timeout time. */ +- dataset->head.timeout = time (NULL) + db->negtimeout; ++ timeout = dataset->head.timeout = time (NULL) + db->negtimeout; ++ dataset->head.ttl = db->negtimeout; + + /* This is the reply. */ + memcpy (&dataset->resp, ¬found, total); +@@ -551,6 +557,8 @@ next_nip: + if (dh != NULL) + dh->usable = false; + } ++ ++ return timeout; + } + + +@@ -562,7 +570,7 @@ addhstai (struct database_dyn *db, int f + } + + +-void ++time_t + readdhstai (struct database_dyn *db, struct hashentry *he, struct datahead *dh) + { + request_header req = +@@ -571,5 +579,5 @@ readdhstai (struct database_dyn *db, str + .key_len = he->len + }; + +- addhstaiX (db, -1, &req, db->data + he->key, he->owner, he, dh); ++ return addhstaiX (db, -1, &req, db->data + he->key, he->owner, he, dh); + } +Index: glibc-2.12-2-gc4ccff1/nscd/cache.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/nscd/cache.c ++++ glibc-2.12-2-gc4ccff1/nscd/cache.c +@@ -45,9 +45,9 @@ extern void *xcalloc (size_t n, size_t s + unsigned int reload_count = DEFAULT_RELOAD_LIMIT; + + +-static void (*const readdfcts[LASTREQ]) (struct database_dyn *, +- struct hashentry *, +- struct datahead *) = ++static time_t (*const readdfcts[LASTREQ]) (struct database_dyn *, ++ struct hashentry *, ++ struct datahead *) = + { + [GETPWBYNAME] = readdpwbyname, + [GETPWBYUID] = readdpwbyuid, +@@ -389,7 +389,8 @@ prune_cache (struct database_dyn *table, + assert (runp->type < LASTREQ + && readdfcts[runp->type] != NULL); + +- readdfcts[runp->type] (table, runp, dh); ++ time_t timeout = readdfcts[runp->type] (table, runp, dh); ++ next_timeout = MIN (next_timeout, timeout); + + /* If the entry has been replaced, we might need + cleanup. */ +Index: glibc-2.12-2-gc4ccff1/nscd/connections.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/nscd/connections.c ++++ glibc-2.12-2-gc4ccff1/nscd/connections.c +@@ -1533,10 +1533,7 @@ nscd_run_prune (void *p) + pruning we want to know about it. Therefore set the + timeout to the maximum. It will be descreased when adding + new entries to the cache, if necessary. */ +- if (sizeof (time_t) == sizeof (long int)) +- dbs[my_number].wakeup_time = LONG_MAX; +- else +- dbs[my_number].wakeup_time = INT_MAX; ++ dbs[my_number].wakeup_time = MAX_TIMEOUT_VALUE; + + /* Unconditionally reset the flag. */ + time_t prune_now = dbs[my_number].clear_cache ? LONG_MAX : now; +Index: glibc-2.12-2-gc4ccff1/nscd/grpcache.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/nscd/grpcache.c ++++ glibc-2.12-2-gc4ccff1/nscd/grpcache.c +@@ -71,7 +71,7 @@ static const gr_response_header notfound + }; + + +-static void ++static time_t + cache_addgr (struct database_dyn *db, int fd, request_header *req, + const void *key, struct group *grp, uid_t owner, + struct hashentry *const he, struct datahead *dh, int errval) +@@ -91,6 +91,7 @@ cache_addgr (struct database_dyn *db, in + + assert (offsetof (struct dataset, resp) == offsetof (struct datahead, data)); + ++ time_t timeout = MAX_TIMEOUT_VALUE; + if (grp == NULL) + { + if (he != NULL && errval == EAGAIN) +@@ -102,6 +103,9 @@ cache_addgr (struct database_dyn *db, in + /* Do not reset the value if we never not reload the record. */ + dh->nreloads = reload_count - 1; + ++ /* Reload with the same time-to-live value. */ ++ timeout = dh->timeout = t + db->postimeout; ++ + written = total = 0; + } + else +@@ -125,7 +129,7 @@ cache_addgr (struct database_dyn *db, in + dataset->head.usable = true; + + /* Compute the timeout time. */ +- dataset->head.timeout = t + db->negtimeout; ++ timeout = dataset->head.timeout = t + db->negtimeout; + + /* This is the reply. */ + memcpy (&dataset->resp, ¬found, total); +@@ -217,7 +221,7 @@ cache_addgr (struct database_dyn *db, in + dataset->head.usable = true; + + /* Compute the timeout time. */ +- dataset->head.timeout = t + db->postimeout; ++ timeout = dataset->head.timeout = t + db->postimeout; + + dataset->resp.version = NSCD_VERSION; + dataset->resp.found = 1; +@@ -379,6 +383,8 @@ cache_addgr (struct database_dyn *db, in + dbg_log (_("short write in %s: %s"), __FUNCTION__, + strerror_r (errno, buf, sizeof (buf))); + } ++ ++ return timeout; + } + + +@@ -400,7 +406,7 @@ lookup (int type, union keytype key, str + } + + +-static void ++static time_t + addgrbyX (struct database_dyn *db, int fd, request_header *req, + union keytype key, const char *keystr, uid_t uid, + struct hashentry *he, struct datahead *dh) +@@ -456,10 +462,12 @@ addgrbyX (struct database_dyn *db, int f + buffer = (char *) extend_alloca (buffer, buflen, 2 * buflen); + } + +- cache_addgr (db, fd, req, keystr, grp, uid, he, dh, errval); ++ time_t timeout = cache_addgr (db, fd, req, keystr, grp, uid, he, dh, errval); + + if (use_malloc) + free (buffer); ++ ++ return timeout; + } + + +@@ -473,7 +481,7 @@ addgrbyname (struct database_dyn *db, in + } + + +-void ++time_t + readdgrbyname (struct database_dyn *db, struct hashentry *he, + struct datahead *dh) + { +@@ -484,7 +492,7 @@ readdgrbyname (struct database_dyn *db, + }; + union keytype u = { .v = db->data + he->key }; + +- addgrbyX (db, -1, &req, u, db->data + he->key, he->owner, he, dh); ++ return addgrbyX (db, -1, &req, u, db->data + he->key, he->owner, he, dh); + } + + +@@ -510,7 +518,7 @@ addgrbygid (struct database_dyn *db, int + } + + +-void ++time_t + readdgrbygid (struct database_dyn *db, struct hashentry *he, + struct datahead *dh) + { +@@ -527,5 +535,5 @@ readdgrbygid (struct database_dyn *db, s + }; + union keytype u = { .g = gid }; + +- addgrbyX (db, -1, &req, u, db->data + he->key, he->owner, he, dh); ++ return addgrbyX (db, -1, &req, u, db->data + he->key, he->owner, he, dh); + } +Index: glibc-2.12-2-gc4ccff1/nscd/hstcache.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/nscd/hstcache.c ++++ glibc-2.12-2-gc4ccff1/nscd/hstcache.c +@@ -91,7 +91,7 @@ static const hst_response_header tryagai + }; + + +-static void ++static time_t + cache_addhst (struct database_dyn *db, int fd, request_header *req, + const void *key, struct hostent *hst, uid_t owner, + struct hashentry *const he, struct datahead *dh, int errval, +@@ -111,6 +111,7 @@ cache_addhst (struct database_dyn *db, i + + assert (offsetof (struct dataset, resp) == offsetof (struct datahead, data)); + ++ time_t timeout = MAX_TIMEOUT_VALUE; + if (hst == NULL) + { + if (he != NULL && errval == EAGAIN) +@@ -121,6 +122,9 @@ cache_addhst (struct database_dyn *db, i + if (reload_count != UINT_MAX) + /* Do not reset the value if we never not reload the record. */ + dh->nreloads = reload_count - 1; ++ ++ /* Reload with the same time-to-live value. */ ++ timeout = dh->timeout = t + dh->ttl; + } + else + { +@@ -149,8 +153,8 @@ cache_addhst (struct database_dyn *db, i + dataset->head.usable = true; + + /* Compute the timeout time. */ +- dataset->head.timeout = t + (ttl == INT32_MAX +- ? db->negtimeout : ttl); ++ dataset->head.ttl = ttl == INT32_MAX ? db->negtimeout : ttl; ++ timeout = dataset->head.timeout = t + dataset->head.ttl; + + /* This is the reply. */ + memcpy (&dataset->resp, resp, total); +@@ -214,7 +218,7 @@ cache_addhst (struct database_dyn *db, i + + if (h_addr_list_cnt == 0) + /* Invalid entry. */ +- return; ++ return MAX_TIMEOUT_VALUE; + + total += (sizeof (struct dataset) + + h_name_len +@@ -255,7 +259,8 @@ cache_addhst (struct database_dyn *db, i + dataset->head.usable = true; + + /* Compute the timeout time. */ +- dataset->head.timeout = t + (ttl == INT32_MAX ? db->postimeout : ttl); ++ dataset->head.ttl = ttl == INT32_MAX ? db->postimeout : ttl; ++ timeout = dataset->head.timeout = t + dataset->head.ttl; + + dataset->resp.version = NSCD_VERSION; + dataset->resp.found = 1; +@@ -312,6 +317,7 @@ cache_addhst (struct database_dyn *db, i + timeout value. Note that the new record has been + allocated on the stack and need not be freed. */ + assert (h_addr_list_cnt == 1); ++ dh->ttl = dataset->head.ttl; + dh->timeout = dataset->head.timeout; + ++dh->nreloads; + } +@@ -433,6 +439,8 @@ cache_addhst (struct database_dyn *db, i + dbg_log (_("short write in %s: %s"), __FUNCTION__, + strerror_r (errno, buf, sizeof (buf))); + } ++ ++ return timeout; + } + + +@@ -454,7 +462,7 @@ lookup (int type, void *key, struct host + } + + +-static void ++static time_t + addhstbyX (struct database_dyn *db, int fd, request_header *req, + void *key, uid_t uid, struct hashentry *he, struct datahead *dh) + { +@@ -520,11 +528,13 @@ addhstbyX (struct database_dyn *db, int + buffer = (char *) extend_alloca (buffer, buflen, 2 * buflen); + } + +- cache_addhst (db, fd, req, key, hst, uid, he, dh, +- h_errno == TRY_AGAIN ? errval : 0, ttl); ++ time_t timeout = cache_addhst (db, fd, req, key, hst, uid, he, dh, ++ h_errno == TRY_AGAIN ? errval : 0, ttl); + + if (use_malloc) + free (buffer); ++ ++ return timeout; + } + + +@@ -536,7 +546,7 @@ addhstbyname (struct database_dyn *db, i + } + + +-void ++time_t + readdhstbyname (struct database_dyn *db, struct hashentry *he, + struct datahead *dh) + { +@@ -546,7 +556,7 @@ readdhstbyname (struct database_dyn *db, + .key_len = he->len + }; + +- addhstbyX (db, -1, &req, db->data + he->key, he->owner, he, dh); ++ return addhstbyX (db, -1, &req, db->data + he->key, he->owner, he, dh); + } + + +@@ -558,7 +568,7 @@ addhstbyaddr (struct database_dyn *db, i + } + + +-void ++time_t + readdhstbyaddr (struct database_dyn *db, struct hashentry *he, + struct datahead *dh) + { +@@ -568,7 +578,7 @@ readdhstbyaddr (struct database_dyn *db, + .key_len = he->len + }; + +- addhstbyX (db, -1, &req, db->data + he->key, he->owner, he, dh); ++ return addhstbyX (db, -1, &req, db->data + he->key, he->owner, he, dh); + } + + +@@ -580,7 +590,7 @@ addhstbynamev6 (struct database_dyn *db, + } + + +-void ++time_t + readdhstbynamev6 (struct database_dyn *db, struct hashentry *he, + struct datahead *dh) + { +@@ -590,7 +600,7 @@ readdhstbynamev6 (struct database_dyn *d + .key_len = he->len + }; + +- addhstbyX (db, -1, &req, db->data + he->key, he->owner, he, dh); ++ return addhstbyX (db, -1, &req, db->data + he->key, he->owner, he, dh); + } + + +@@ -602,7 +612,7 @@ addhstbyaddrv6 (struct database_dyn *db, + } + + +-void ++time_t + readdhstbyaddrv6 (struct database_dyn *db, struct hashentry *he, + struct datahead *dh) + { +@@ -612,5 +622,5 @@ readdhstbyaddrv6 (struct database_dyn *d + .key_len = he->len + }; + +- addhstbyX (db, -1, &req, db->data + he->key, he->owner, he, dh); ++ return addhstbyX (db, -1, &req, db->data + he->key, he->owner, he, dh); + } +Index: glibc-2.12-2-gc4ccff1/nscd/initgrcache.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/nscd/initgrcache.c ++++ glibc-2.12-2-gc4ccff1/nscd/initgrcache.c +@@ -52,7 +52,7 @@ static const initgr_response_header notf + #include "../grp/compat-initgroups.c" + + +-static void ++static time_t + addinitgroupsX (struct database_dyn *db, int fd, request_header *req, + void *key, uid_t uid, struct hashentry *const he, + struct datahead *dh) +@@ -174,7 +174,9 @@ addinitgroupsX (struct database_dyn *db, + + ssize_t total; + ssize_t written; ++ time_t timeout; + out: ++ timeout = MAX_TIMEOUT_VALUE; + if (!any_success) + { + /* Nothing found. Create a negative result record. */ +@@ -188,6 +190,9 @@ addinitgroupsX (struct database_dyn *db, + if (reload_count != UINT_MAX && dh->nreloads == reload_count) + /* Do not reset the value if we never not reload the record. */ + dh->nreloads = reload_count - 1; ++ ++ /* Reload with the same time-to-live value. */ ++ timeout = dh->timeout = time (NULL) + db->postimeout; + } + else + { +@@ -209,7 +214,7 @@ addinitgroupsX (struct database_dyn *db, + dataset->head.usable = true; + + /* Compute the timeout time. */ +- dataset->head.timeout = time (NULL) + db->negtimeout; ++ timeout = dataset->head.timeout = time (NULL) + db->negtimeout; + + /* This is the reply. */ + memcpy (&dataset->resp, ¬found, total); +@@ -273,7 +278,7 @@ addinitgroupsX (struct database_dyn *db, + dataset->head.usable = true; + + /* Compute the timeout time. */ +- dataset->head.timeout = time (NULL) + db->postimeout; ++ timeout = dataset->head.timeout = time (NULL) + db->postimeout; + + dataset->resp.version = NSCD_VERSION; + dataset->resp.found = 1; +@@ -401,6 +406,8 @@ addinitgroupsX (struct database_dyn *db, + dbg_log (_("short write in %s: %s"), __FUNCTION__, + strerror_r (errno, buf, sizeof (buf))); + } ++ ++ return timeout; + } + + +@@ -412,7 +419,7 @@ addinitgroups (struct database_dyn *db, + } + + +-void ++time_t + readdinitgroups (struct database_dyn *db, struct hashentry *he, + struct datahead *dh) + { +@@ -422,5 +429,5 @@ readdinitgroups (struct database_dyn *db + .key_len = he->len + }; + +- addinitgroupsX (db, -1, &req, db->data + he->key, he->owner, he, dh); ++ return addinitgroupsX (db, -1, &req, db->data + he->key, he->owner, he, dh); + } +Index: glibc-2.12-2-gc4ccff1/nscd/nscd-client.h +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/nscd/nscd-client.h ++++ glibc-2.12-2-gc4ccff1/nscd/nscd-client.h +@@ -179,6 +179,10 @@ typedef uint32_t ref_t; + /* Timestamp type. */ + typedef uint64_t nscd_time_t; + ++/* Maximum timestamp. */ ++#define MAX_TIMEOUT_VALUE \ ++ (sizeof (time_t) == sizeof (long int) ? LONG_MAX : INT_MAX) ++ + /* Alignment requirement of the beginning of the data region. */ + #define ALIGN 16 + +@@ -192,7 +196,8 @@ struct datahead + uint8_t notfound; /* Nonzero if data has not been found. */ + uint8_t nreloads; /* Reloads without use. */ + uint8_t usable; /* False if the entry must be ignored. */ +- uint64_t :40; /* Alignment. */ ++ uint8_t unused; /* Unused. */ ++ uint32_t ttl; /* TTL value used. */ + + /* We need to have the following element aligned for the response + header data types and their use in the 'struct dataset' types +Index: glibc-2.12-2-gc4ccff1/nscd/nscd.h +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/nscd/nscd.h ++++ glibc-2.12-2-gc4ccff1/nscd/nscd.h +@@ -217,20 +217,20 @@ extern void addpwbyname (struct database + void *key, uid_t uid); + extern void addpwbyuid (struct database_dyn *db, int fd, request_header *req, + void *key, uid_t uid); +-extern void readdpwbyname (struct database_dyn *db, struct hashentry *he, +- struct datahead *dh); +-extern void readdpwbyuid (struct database_dyn *db, struct hashentry *he, +- struct datahead *dh); ++extern time_t readdpwbyname (struct database_dyn *db, struct hashentry *he, ++ struct datahead *dh); ++extern time_t readdpwbyuid (struct database_dyn *db, struct hashentry *he, ++ struct datahead *dh); + + /* grpcache.c */ + extern void addgrbyname (struct database_dyn *db, int fd, request_header *req, + void *key, uid_t uid); + extern void addgrbygid (struct database_dyn *db, int fd, request_header *req, + void *key, uid_t uid); +-extern void readdgrbyname (struct database_dyn *db, struct hashentry *he, +- struct datahead *dh); +-extern void readdgrbygid (struct database_dyn *db, struct hashentry *he, +- struct datahead *dh); ++extern time_t readdgrbyname (struct database_dyn *db, struct hashentry *he, ++ struct datahead *dh); ++extern time_t readdgrbygid (struct database_dyn *db, struct hashentry *he, ++ struct datahead *dh); + + /* hstcache.c */ + extern void addhstbyname (struct database_dyn *db, int fd, request_header *req, +@@ -241,37 +241,37 @@ extern void addhstbynamev6 (struct datab + request_header *req, void *key, uid_t uid); + extern void addhstbyaddrv6 (struct database_dyn *db, int fd, + request_header *req, void *key, uid_t uid); +-extern void readdhstbyname (struct database_dyn *db, struct hashentry *he, +- struct datahead *dh); +-extern void readdhstbyaddr (struct database_dyn *db, struct hashentry *he, +- struct datahead *dh); +-extern void readdhstbynamev6 (struct database_dyn *db, struct hashentry *he, ++extern time_t readdhstbyname (struct database_dyn *db, struct hashentry *he, + struct datahead *dh); +-extern void readdhstbyaddrv6 (struct database_dyn *db, struct hashentry *he, ++extern time_t readdhstbyaddr (struct database_dyn *db, struct hashentry *he, + struct datahead *dh); ++extern time_t readdhstbynamev6 (struct database_dyn *db, struct hashentry *he, ++ struct datahead *dh); ++extern time_t readdhstbyaddrv6 (struct database_dyn *db, struct hashentry *he, ++ struct datahead *dh); + + /* aicache.c */ + extern void addhstai (struct database_dyn *db, int fd, request_header *req, + void *key, uid_t uid); +-extern void readdhstai (struct database_dyn *db, struct hashentry *he, +- struct datahead *dh); ++extern time_t readdhstai (struct database_dyn *db, struct hashentry *he, ++ struct datahead *dh); + + + /* initgrcache.c */ + extern void addinitgroups (struct database_dyn *db, int fd, + request_header *req, void *key, uid_t uid); +-extern void readdinitgroups (struct database_dyn *db, struct hashentry *he, +- struct datahead *dh); ++extern time_t readdinitgroups (struct database_dyn *db, struct hashentry *he, ++ struct datahead *dh); + + /* servicecache.c */ + extern void addservbyname (struct database_dyn *db, int fd, + request_header *req, void *key, uid_t uid); +-extern void readdservbyname (struct database_dyn *db, struct hashentry *he, +- struct datahead *dh); ++extern time_t readdservbyname (struct database_dyn *db, struct hashentry *he, ++ struct datahead *dh); + extern void addservbyport (struct database_dyn *db, int fd, + request_header *req, void *key, uid_t uid); +-extern void readdservbyport (struct database_dyn *db, struct hashentry *he, +- struct datahead *dh); ++extern time_t readdservbyport (struct database_dyn *db, struct hashentry *he, ++ struct datahead *dh); + + /* mem.c */ + extern void *mempool_alloc (struct database_dyn *db, size_t len, +Index: glibc-2.12-2-gc4ccff1/nscd/pwdcache.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/nscd/pwdcache.c ++++ glibc-2.12-2-gc4ccff1/nscd/pwdcache.c +@@ -77,7 +77,7 @@ static const pw_response_header notfound + }; + + +-static void ++static time_t + cache_addpw (struct database_dyn *db, int fd, request_header *req, + const void *key, struct passwd *pwd, uid_t owner, + struct hashentry *const he, struct datahead *dh, int errval) +@@ -97,6 +97,7 @@ cache_addpw (struct database_dyn *db, in + + assert (offsetof (struct dataset, resp) == offsetof (struct datahead, data)); + ++ time_t timeout = MAX_TIMEOUT_VALUE; + if (pwd == NULL) + { + if (he != NULL && errval == EAGAIN) +@@ -108,6 +109,9 @@ cache_addpw (struct database_dyn *db, in + /* Do not reset the value if we never not reload the record. */ + dh->nreloads = reload_count - 1; + ++ /* Reload with the same time-to-live value. */ ++ timeout = dh->timeout = t + db->postimeout; ++ + written = total = 0; + } + else +@@ -132,7 +136,7 @@ cache_addpw (struct database_dyn *db, in + dataset->head.usable = true; + + /* Compute the timeout time. */ +- dataset->head.timeout = t + db->negtimeout; ++ timeout = dataset->head.timeout = t + db->negtimeout; + + /* This is the reply. */ + memcpy (&dataset->resp, ¬found, total); +@@ -212,7 +216,7 @@ cache_addpw (struct database_dyn *db, in + dataset->head.usable = true; + + /* Compute the timeout time. */ +- dataset->head.timeout = t + db->postimeout; ++ timeout = dataset->head.timeout = t + db->postimeout; + + dataset->resp.version = NSCD_VERSION; + dataset->resp.found = 1; +@@ -293,8 +297,8 @@ cache_addpw (struct database_dyn *db, in + assert ((char *) dataset - (char *) db->head + + total + <= (sizeof (struct database_pers_head) +- + db->head->module * sizeof (ref_t) +- + db->head->data_size)); ++ + db->head->module * sizeof (ref_t) ++ + db->head->data_size)); + written = sendfileall (fd, db->wr_fd, + (char *) &dataset->resp + - (char *) db->head, dataset->head.recsize ); +@@ -374,6 +378,8 @@ cache_addpw (struct database_dyn *db, in + dbg_log (_("short write in %s: %s"), __FUNCTION__, + strerror_r (errno, buf, sizeof (buf))); + } ++ ++ return timeout; + } + + +@@ -395,7 +401,7 @@ lookup (int type, union keytype key, str + } + + +-static void ++static time_t + addpwbyX (struct database_dyn *db, int fd, request_header *req, + union keytype key, const char *keystr, uid_t c_uid, + struct hashentry *he, struct datahead *dh) +@@ -452,10 +458,13 @@ addpwbyX (struct database_dyn *db, int f + } + + /* Add the entry to the cache. */ +- cache_addpw (db, fd, req, keystr, pwd, c_uid, he, dh, errval); ++ time_t timeout = cache_addpw (db, fd, req, keystr, pwd, c_uid, he, dh, ++ errval); + + if (use_malloc) + free (buffer); ++ ++ return timeout; + } + + +@@ -469,7 +478,7 @@ addpwbyname (struct database_dyn *db, in + } + + +-void ++time_t + readdpwbyname (struct database_dyn *db, struct hashentry *he, + struct datahead *dh) + { +@@ -480,7 +489,7 @@ readdpwbyname (struct database_dyn *db, + }; + union keytype u = { .v = db->data + he->key }; + +- addpwbyX (db, -1, &req, u, db->data + he->key, he->owner, he, dh); ++ return addpwbyX (db, -1, &req, u, db->data + he->key, he->owner, he, dh); + } + + +@@ -506,7 +515,7 @@ addpwbyuid (struct database_dyn *db, int + } + + +-void ++time_t + readdpwbyuid (struct database_dyn *db, struct hashentry *he, + struct datahead *dh) + { +@@ -523,5 +532,5 @@ readdpwbyuid (struct database_dyn *db, s + }; + union keytype u = { .u = uid }; + +- addpwbyX (db, -1, &req, u, db->data + he->key, he->owner, he, dh); ++ return addpwbyX (db, -1, &req, u, db->data + he->key, he->owner, he, dh); + } +Index: glibc-2.12-2-gc4ccff1/nscd/servicescache.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/nscd/servicescache.c ++++ glibc-2.12-2-gc4ccff1/nscd/servicescache.c +@@ -61,7 +61,7 @@ static const serv_response_header notfou + }; + + +-static void ++static time_t + cache_addserv (struct database_dyn *db, int fd, request_header *req, + const void *key, struct servent *serv, uid_t owner, + struct hashentry *const he, struct datahead *dh, int errval) +@@ -81,6 +81,7 @@ cache_addserv (struct database_dyn *db, + + assert (offsetof (struct dataset, resp) == offsetof (struct datahead, data)); + ++ time_t timeout = MAX_TIMEOUT_VALUE; + if (serv == NULL) + { + if (he != NULL && errval == EAGAIN) +@@ -92,6 +93,9 @@ cache_addserv (struct database_dyn *db, + /* Do not reset the value if we never not reload the record. */ + dh->nreloads = reload_count - 1; + ++ /* Reload with the same time-to-live value. */ ++ timeout = dh->timeout = t + db->postimeout; ++ + written = total = 0; + } + else +@@ -115,7 +119,7 @@ cache_addserv (struct database_dyn *db, + dataset->head.usable = true; + + /* Compute the timeout time. */ +- dataset->head.timeout = t + db->negtimeout; ++ timeout = dataset->head.timeout = t + db->negtimeout; + + /* This is the reply. */ + memcpy (&dataset->resp, ¬found, total); +@@ -203,7 +207,7 @@ cache_addserv (struct database_dyn *db, + dataset->head.usable = true; + + /* Compute the timeout time. */ +- dataset->head.timeout = t + db->postimeout; ++ timeout = dataset->head.timeout = t + db->postimeout; + + dataset->resp.version = NSCD_VERSION; + dataset->resp.found = 1; +@@ -328,6 +332,8 @@ cache_addserv (struct database_dyn *db, + dbg_log (_("short write in %s: %s"), __FUNCTION__, + strerror_r (errno, buf, sizeof (buf))); + } ++ ++ return timeout; + } + + +@@ -354,7 +360,7 @@ lookup (int type, char *key, struct serv + } + + +-static void ++static time_t + addservbyX (struct database_dyn *db, int fd, request_header *req, + char *key, uid_t uid, struct hashentry *he, struct datahead *dh) + { +@@ -409,10 +415,12 @@ addservbyX (struct database_dyn *db, int + buffer = (char *) extend_alloca (buffer, buflen, 2 * buflen); + } + +- cache_addserv (db, fd, req, key, serv, uid, he, dh, errval); ++ time_t timeout = cache_addserv (db, fd, req, key, serv, uid, he, dh, errval); + + if (use_malloc) + free (buffer); ++ ++ return timeout; + } + + +@@ -424,7 +432,7 @@ addservbyname (struct database_dyn *db, + } + + +-void ++time_t + readdservbyname (struct database_dyn *db, struct hashentry *he, + struct datahead *dh) + { +@@ -434,7 +442,7 @@ readdservbyname (struct database_dyn *db + .key_len = he->len + }; + +- addservbyX (db, -1, &req, db->data + he->key, he->owner, he, dh); ++ return addservbyX (db, -1, &req, db->data + he->key, he->owner, he, dh); + } + + +@@ -446,7 +454,7 @@ addservbyport (struct database_dyn *db, + } + + +-void ++time_t + readdservbyport (struct database_dyn *db, struct hashentry *he, + struct datahead *dh) + { +@@ -456,5 +464,5 @@ readdservbyport (struct database_dyn *db + .key_len = he->len + }; + +- addservbyX (db, -1, &req, db->data + he->key, he->owner, he, dh); ++ return addservbyX (db, -1, &req, db->data + he->key, he->owner, he, dh); + } diff --git a/SOURCES/glibc-rh705465.patch b/SOURCES/glibc-rh705465.patch new file mode 100644 index 0000000..63b971e --- /dev/null +++ b/SOURCES/glibc-rh705465.patch @@ -0,0 +1,449 @@ +2011-11-07 Andreas Schwab + + * nss/nss_files/files-initgroups.c (_nss_files_initgroups_dyn): + Fix size of allocated buffer. + +2011-05-10 Ulrich Drepper + + [BZ #11257] + * grp/initgroups.c (internal_getgrouplist): When we found the service + list through the initgroups entry in nsswitch.conf do not always + continue on a successful lookup. Don't always use the + __nss_group_data-ase value if it is set. + * nss/nsswitch.conf (initgroups): Change action for successful db + lookup to continue for compatibility. + +2011-05-06 Ulrich Drepper + + * nss/nss_files/files-initgroups.c (_nss_files_initgroups_dyn): Return + NSS_STATUS_NOTFOUND if no record was found. + +2011-04-29 Ulrich Drepper + + * grp/initgroups.c (internal_getgrouplist): Prefer initgroups setting + to groups setting in database lookup. + * nss/nsswitch.conf: Add initgroups entry. + +2011-04-21 Ulrich Drepper + + * nss/nss_files/files-initgroups.c (_nss_files_initgroups_dyn): Fix + problem in reallocation in last patch. + +2011-04-19 Ulrich Drepper + + * nss/nss_files/files-initgroups.c: New file. + * nss/Makefile (libnss_files-routines): Add files-initgroups. + * nss/Versions (libnss_files) [GLIBC_PRIVATE]: Export + _nss_files_initgroups_dyn. + +2011-01-13 Ulrich Drepper + + [BZ #10484] + * nss/nss_files/files-hosts.c (HOST_DB_LOOKUP): Handle overflows of + temporary buffer used to handle multi lookups locally. + * include/alloca.h: Add libc_hidden_proto for __libc_alloca_cutoff. + +2011-01-13 Ulrich Drepper + + [BZ #10484] + * Versions [libc] (GLIBC_PRIVATE): Export __libc_alloca_cutoff. + * alloca_cutoff.c: Add libc_hidden_def. + +Index: glibc-2.12-2-gc4ccff1/grp/initgroups.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/grp/initgroups.c ++++ glibc-2.12-2-gc4ccff1/grp/initgroups.c +@@ -43,6 +43,8 @@ extern int __nss_group_lookup (service_u + extern void *__nss_lookup_function (service_user *ni, const char *fct_name); + + extern service_user *__nss_group_database attribute_hidden; ++static service_user *initgroups_database; ++static bool use_initgroups_entry; + + + #include "compat-initgroups.c" +@@ -67,32 +69,41 @@ internal_getgrouplist (const char *user, + } + #endif + +- service_user *nip = NULL; +- initgroups_dyn_function fct; + enum nss_status status = NSS_STATUS_UNAVAIL; +- int no_more; +- /* Start is one, because we have the first group as parameter. */ +- long int start = 1; ++ int no_more = 0; + + /* Never store more than the starting *SIZE number of elements. */ + assert (*size > 0); + (*groupsp)[0] = group; ++ /* Start is one, because we have the first group as parameter. */ ++ long int start = 1; + +- if (__nss_group_database != NULL) ++ if (initgroups_database == NULL) + { +- no_more = 0; +- nip = __nss_group_database; ++ no_more = __nss_database_lookup ("initgroups", NULL, "", ++ &initgroups_database); ++ if (no_more == 0 && initgroups_database == NULL) ++ { ++ if (__nss_group_database == NULL) ++ no_more = __nss_database_lookup ("group", NULL, "compat files", ++ &__nss_group_database); ++ ++ initgroups_database = __nss_group_database; ++ } ++ else if (initgroups_database != NULL) ++ { ++ assert (no_more == 0); ++ use_initgroups_entry = true; ++ } + } +- else +- no_more = __nss_database_lookup ("group", NULL, +- "compat [NOTFOUND=return] files", &nip); + ++ service_user *nip = initgroups_database; + while (! no_more) + { + long int prev_start = start; + +- fct = __nss_lookup_function (nip, "initgroups_dyn"); +- ++ initgroups_dyn_function fct = __nss_lookup_function (nip, ++ "initgroups_dyn"); + if (fct == NULL) + status = compat_call (nip, user, group, &start, size, groupsp, + limit, &errno); +@@ -119,7 +130,13 @@ internal_getgrouplist (const char *user, + if (NSS_STATUS_TRYAGAIN > status || status > NSS_STATUS_RETURN) + __libc_fatal ("illegal status in internal_getgrouplist"); + +- if (status != NSS_STATUS_SUCCESS ++ /* For compatibility reason we will continue to look for more ++ entries using the next service even though data has already ++ been found if the nsswitch.conf file contained only a 'groups' ++ line and no 'initgroups' line. If the latter is available ++ we always respect the status. This means that the default ++ for successful lookups is to return. */ ++ if ((use_initgroups_entry || status != NSS_STATUS_SUCCESS) + && nss_next_action (nip, status) == NSS_ACTION_RETURN) + break; + +Index: glibc-2.12-2-gc4ccff1/include/alloca.h +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/include/alloca.h ++++ glibc-2.12-2-gc4ccff1/include/alloca.h +@@ -14,6 +14,7 @@ extern void *__alloca (size_t __size); + + extern int __libc_use_alloca (size_t size) __attribute__ ((const)); + extern int __libc_alloca_cutoff (size_t size) __attribute__ ((const)); ++libc_hidden_proto (__libc_alloca_cutoff) + + #define __MAX_ALLOCA_CUTOFF 65536 + +Index: glibc-2.12-2-gc4ccff1/nptl/Versions +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/nptl/Versions ++++ glibc-2.12-2-gc4ccff1/nptl/Versions +@@ -27,6 +27,7 @@ libc { + pthread_cond_broadcast; pthread_cond_timedwait; + } + GLIBC_PRIVATE { ++ __libc_alloca_cutoff; + # Internal libc interface to libpthread + __libc_dl_error_tsd; + } +Index: glibc-2.12-2-gc4ccff1/nptl/alloca_cutoff.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/nptl/alloca_cutoff.c ++++ glibc-2.12-2-gc4ccff1/nptl/alloca_cutoff.c +@@ -34,3 +34,4 @@ __libc_alloca_cutoff (size_t size) + assume the maximum available stack space. */ + ?: __MAX_ALLOCA_CUTOFF * 4)); + } ++libc_hidden_def (__libc_alloca_cutoff) +Index: glibc-2.12-2-gc4ccff1/nss/Makefile +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/nss/Makefile ++++ glibc-2.12-2-gc4ccff1/nss/Makefile +@@ -63,7 +63,7 @@ vpath %.c $(subdir-dirs) + + + libnss_files-routines := $(addprefix files-,$(databases)) \ +- files-have_o_cloexec ++ files-initgroups files-have_o_cloexec + distribute += files-XXX.c files-parse.c + + +Index: glibc-2.12-2-gc4ccff1/nss/Versions +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/nss/Versions ++++ glibc-2.12-2-gc4ccff1/nss/Versions +@@ -95,5 +95,7 @@ libnss_files { + _nss_netgroup_parseline; + _nss_files_getpublickey; + _nss_files_getsecretkey; ++ ++ _nss_files_initgroups_dyn; + } + } +Index: glibc-2.12-2-gc4ccff1/nss/nss_files/files-hosts.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/nss/nss_files/files-hosts.c ++++ glibc-2.12-2-gc4ccff1/nss/nss_files/files-hosts.c +@@ -129,19 +129,22 @@ _nss_files_get##name##_r (proto, + && _res_hconf.flags & HCONF_FLAG_MULTI) \ + { \ + /* We have to get all host entries from the file. */ \ +- const size_t tmp_buflen = MIN (buflen, 4096); \ +- char tmp_buffer[tmp_buflen] \ ++ size_t tmp_buflen = MIN (buflen, 4096); \ ++ char tmp_buffer_stack[tmp_buflen] \ + __attribute__ ((__aligned__ (__alignof__ (struct hostent_data))));\ ++ char *tmp_buffer = tmp_buffer_stack; \ + struct hostent tmp_result_buf; \ + int naddrs = 1; \ + int naliases = 0; \ + char *bufferend; \ ++ bool tmp_buffer_malloced = false; \ + \ + while (result->h_aliases[naliases] != NULL) \ + ++naliases; \ + \ + bufferend = (char *) &result->h_aliases[naliases + 1]; \ + \ ++ again: \ + while ((status = internal_getent (&tmp_result_buf, tmp_buffer, \ + tmp_buflen, errnop H_ERRNO_ARG \ + EXTRA_ARGS_VALUE)) \ +@@ -182,7 +185,7 @@ _nss_files_get##name##_r (proto, + } \ + /* If the real name is different add it also to the \ + aliases. This means that there is a duplication \ +- in the alias list but this is really the users \ ++ in the alias list but this is really the user's \ + problem. */ \ + if (strcmp (old_result->h_name, \ + tmp_result_buf.h_name) != 0) \ +@@ -204,7 +207,7 @@ _nss_files_get##name##_r (proto, + *errnop = ERANGE; \ + *herrnop = NETDB_INTERNAL; \ + status = NSS_STATUS_TRYAGAIN; \ +- break; \ ++ goto out; \ + } \ + \ + new_h_addr_list = \ +@@ -268,8 +271,54 @@ _nss_files_get##name##_r (proto, + } \ + } \ + \ +- if (status != NSS_STATUS_TRYAGAIN) \ ++ if (status == NSS_STATUS_TRYAGAIN) \ ++ { \ ++ size_t newsize = 2 * tmp_buflen; \ ++ if (tmp_buffer_malloced) \ ++ { \ ++ char *newp = realloc (tmp_buffer, newsize); \ ++ if (newp != NULL) \ ++ { \ ++ assert ((((uintptr_t) newp) \ ++ & (__alignof__ (struct hostent_data) - 1)) \ ++ == 0); \ ++ tmp_buffer = newp; \ ++ tmp_buflen = newsize; \ ++ goto again; \ ++ } \ ++ } \ ++ else if (!__libc_use_alloca (buflen + newsize)) \ ++ { \ ++ tmp_buffer = malloc (newsize); \ ++ if (tmp_buffer != NULL) \ ++ { \ ++ assert ((((uintptr_t) tmp_buffer) \ ++ & (__alignof__ (struct hostent_data) - 1)) \ ++ == 0); \ ++ tmp_buffer_malloced = true; \ ++ tmp_buflen = newsize; \ ++ goto again; \ ++ } \ ++ } \ ++ else \ ++ { \ ++ tmp_buffer \ ++ = extend_alloca (tmp_buffer, tmp_buflen, \ ++ newsize \ ++ + __alignof__ (struct hostent_data)); \ ++ tmp_buffer = (char *) (((uintptr_t) tmp_buffer \ ++ + __alignof__ (struct hostent_data) \ ++ - 1) \ ++ & ~(__alignof__ (struct hostent_data)\ ++ - 1)); \ ++ goto again; \ ++ } \ ++ } \ ++ else \ + status = NSS_STATUS_SUCCESS; \ ++ out: \ ++ if (tmp_buffer_malloced) \ ++ free (tmp_buffer); \ + } \ + \ + \ +Index: glibc-2.12-2-gc4ccff1/nss/nss_files/files-initgroups.c +=================================================================== +--- /dev/null ++++ glibc-2.12-2-gc4ccff1/nss/nss_files/files-initgroups.c +@@ -0,0 +1,137 @@ ++/* Initgroups handling in nss_files module. ++ Copyright (C) 2011 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, write to the Free ++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++ 02111-1307 USA. */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++enum nss_status ++_nss_files_initgroups_dyn (const char *user, gid_t group, long int *start, ++ long int *size, gid_t **groupsp, long int limit, ++ int *errnop) ++{ ++ FILE *stream = fopen ("/etc/group", "re"); ++ if (stream == NULL) ++ { ++ *errnop = errno; ++ return *errnop == ENOMEM ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL; ++ } ++ ++ /* No other thread using this stream. */ ++ __fsetlocking (stream, FSETLOCKING_BYCALLER); ++ ++ char *line = NULL; ++ size_t linelen = 0; ++ enum nss_status status = NSS_STATUS_SUCCESS; ++ bool any = false; ++ ++ size_t buflen = 1024; ++ void *buffer = alloca (buflen); ++ bool buffer_use_malloc = false; ++ ++ gid_t *groups = *groupsp; ++ ++ /* We have to iterate over the entire file. */ ++ while (!feof_unlocked (stream)) ++ { ++ ssize_t n = getline (&line, &linelen, stream); ++ if (n < 0) ++ { ++ if (! feof_unlocked (stream)) ++ status = ((*errnop = errno) == ENOMEM ++ ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL); ++ break; ++ } ++ ++ struct group grp; ++ int res; ++ while ((res = _nss_files_parse_grent (line, &grp, buffer, buflen, ++ errnop)) == -1) ++ { ++ size_t newbuflen = 2 * buflen; ++ if (buffer_use_malloc || ! __libc_use_alloca (buflen + newbuflen)) ++ { ++ void *newbuf = realloc (buffer_use_malloc ? buffer : NULL, ++ newbuflen); ++ if (newbuf == NULL) ++ { ++ *errnop = ENOMEM; ++ status = NSS_STATUS_TRYAGAIN; ++ goto out; ++ } ++ buffer = newbuf; ++ buflen = newbuflen; ++ buffer_use_malloc = true; ++ } ++ else ++ buffer = extend_alloca (buffer, buflen, newbuflen); ++ } ++ ++ if (res > 0 && grp.gr_gid != group) ++ for (char **m = grp.gr_mem; *m != NULL; ++m) ++ if (strcmp (*m, user) == 0) ++ { ++ /* Matches user. Insert this group. */ ++ if (*start == *size) ++ { ++ /* Need a bigger buffer. */ ++ if (limit > 0 && *size == limit) ++ /* We reached the maximum. */ ++ goto out; ++ ++ long int newsize; ++ if (limit <= 0) ++ newsize = 2 * *size; ++ else ++ newsize = MIN (limit, 2 * *size); ++ ++ gid_t *newgroups = realloc (groups, ++ newsize * sizeof (*groups)); ++ if (newgroups == NULL) ++ { ++ *errnop = ENOMEM; ++ status = NSS_STATUS_TRYAGAIN; ++ goto out; ++ } ++ *groupsp = groups = newgroups; ++ *size = newsize; ++ } ++ ++ groups[*start] = grp.gr_gid; ++ *start += 1; ++ any = true; ++ ++ break; ++ } ++ } ++ ++ out: ++ /* Free memory. */ ++ if (buffer_use_malloc) ++ free (buffer); ++ free (line); ++ ++ fclose (stream); ++ ++ return status == NSS_STATUS_SUCCESS && !any ? NSS_STATUS_NOTFOUND : status; ++} +Index: glibc-2.12-2-gc4ccff1/nss/nsswitch.conf +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/nss/nsswitch.conf ++++ glibc-2.12-2-gc4ccff1/nss/nsswitch.conf +@@ -5,6 +5,7 @@ + + passwd: db files + group: db files ++initgroups: db [SUCCESS=continue] files + shadow: db files + gshadow: files + diff --git a/SOURCES/glibc-rh711927.patch b/SOURCES/glibc-rh711927.patch new file mode 100644 index 0000000..26949fe --- /dev/null +++ b/SOURCES/glibc-rh711927.patch @@ -0,0 +1,503 @@ +Index: glibc-2.12-2-gc4ccff1/config.h.in +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/config.h.in ++++ glibc-2.12-2-gc4ccff1/config.h.in +@@ -201,6 +201,9 @@ + /* Define if multi-arch DSOs should be generated. */ + #undef USE_MULTIARCH + ++/* Define if Systemtap probes should be defined. */ ++#undef USE_STAP_PROBE ++ + /* + */ + +Index: glibc-2.12-2-gc4ccff1/configure +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/configure ++++ glibc-2.12-2-gc4ccff1/configure +@@ -830,6 +830,7 @@ enable_all_warnings + enable_multi_arch + enable_experimental_malloc + enable_nss_crypt ++enable_systemtap + with_cpu + ' + ac_precious_vars='build_alias +@@ -1501,6 +1502,7 @@ Optional Features: + --enable-experimental-malloc + enable experimental malloc features + --enable-nss-crypt enable libcrypt to use nss ++ --enable-systemtap enable systemtap static probe points [default=no] + + Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] +@@ -3932,6 +3934,79 @@ else + fi + + ++# Check whether --enable-systemtap was given. ++if test "${enable_systemtap+set}" = set; then ++ enableval=$enable_systemtap; systemtap=$enableval ++else ++ systemtap=no ++fi ++ ++if test x$systemtap != xno; then ++ ++ { $as_echo "$as_me:$LINENO: checking for systemtap static probe support" >&5 ++$as_echo_n "checking for systemtap static probe support... " >&6; } ++if test "${libc_cv_sdt+set}" = set; then ++ $as_echo_n "(cached) " >&6 ++else ++ old_CFLAGS="$CFLAGS" ++ CFLAGS="-std=gnu99 $CFLAGS" ++ cat >conftest.$ac_ext <<_ACEOF ++#include ++void foo (int i, void *p) ++{ ++ asm ("" STAP_PROBE_ASM (foo, bar, STAP_PROBE_ASM_TEMPLATE (2)) "" ++ :: STAP_PROBE_ASM_OPERANDS (2, i, p)); ++} ++_ACEOF ++rm -f conftest.$ac_objext ++if { (ac_try="$ac_compile" ++case "(($ac_try" in ++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; ++ *) ac_try_echo=$ac_try;; ++esac ++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" ++$as_echo "$ac_try_echo") >&5 ++ (eval "$ac_compile") 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && { ++ test -z "$ac_c_werror_flag" || ++ test ! -s conftest.err ++ } && test -s conftest.$ac_objext; then ++ libc_cv_sdt=yes ++else ++ $as_echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ libc_cv_sdt=no ++fi ++ ++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++ CFLAGS="$old_CFLAGS" ++fi ++{ $as_echo "$as_me:$LINENO: result: $libc_cv_sdt" >&5 ++$as_echo "$libc_cv_sdt" >&6; } ++ if test $libc_cv_sdt = yes; then ++ cat >>confdefs.h <<\_ACEOF ++#define USE_STAP_PROBE 1 ++_ACEOF ++ ++ else ++ { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 ++$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++{ { $as_echo "$as_me:$LINENO: error: systemtap support needs sys/sdt.h with asm support ++See \`config.log' for more details." >&5 ++$as_echo "$as_me: error: systemtap support needs sys/sdt.h with asm support ++See \`config.log' for more details." >&2;} ++ { (exit 1); exit 1; }; }; } ++ fi ++ ++fi ++ ++ + # The way shlib-versions is used to generate soversions.mk uses a + # fairly simplistic model for name recognition that can't distinguish + # i486-pc-linux-gnu fully from i486-pc-gnu. So we mutate a $host_os +Index: glibc-2.12-2-gc4ccff1/configure.in +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/configure.in ++++ glibc-2.12-2-gc4ccff1/configure.in +@@ -319,6 +319,29 @@ else + fi + AC_SUBST(libc_cv_nss_crypt) + ++AC_ARG_ENABLE([systemtap], ++ [AS_HELP_STRING([--enable-systemtap], ++ [enable systemtap static probe points @<:@default=no@:>@])], ++ [systemtap=$enableval], ++ [systemtap=no]) ++AS_IF([test x$systemtap != xno], [ ++ AC_CACHE_CHECK([for systemtap static probe support], libc_cv_sdt, [dnl ++ old_CFLAGS="$CFLAGS" ++ CFLAGS="-std=gnu99 $CFLAGS" ++ AC_COMPILE_IFELSE([#include ++void foo (int i, void *p) ++{ ++ asm ("" STAP_PROBE_ASM (foo, bar, STAP_PROBE_ASM_TEMPLATE (2)) "" ++ :: STAP_PROBE_ASM_OPERANDS (2, i, p)); ++}], [libc_cv_sdt=yes], [libc_cv_sdt=no]) ++ CFLAGS="$old_CFLAGS"]) ++ if test $libc_cv_sdt = yes; then ++ AC_DEFINE([USE_STAP_PROBE]) ++ else ++ AC_MSG_FAILURE([systemtap support needs sys/sdt.h with asm support]) ++ fi ++]) ++ + # The way shlib-versions is used to generate soversions.mk uses a + # fairly simplistic model for name recognition that can't distinguish + # i486-pc-linux-gnu fully from i486-pc-gnu. So we mutate a $host_os +Index: glibc-2.12-2-gc4ccff1/elf/Makefile +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/elf/Makefile ++++ glibc-2.12-2-gc4ccff1/elf/Makefile +@@ -458,7 +458,8 @@ CFLAGS-ldconfig.c = $(SYSCONF-FLAGS) -D' + CFLAGS-dl-cache.c = $(SYSCONF-FLAGS) + CFLAGS-cache.c = $(SYSCONF-FLAGS) + +-CPPFLAGS-.os += $(if $(filter $(@F),$(patsubst %,%.os,$(all-rtld-routines))),-DNOT_IN_libc=1 -DIS_IN_rtld=1) ++CPPFLAGS-.os += $(if $(filter $(@F),$(patsubst %,%.os,$(all-rtld-routines))),\ ++ -DNOT_IN_libc=1 -DIS_IN_rtld=1 -DIN_LIB=rtld) + + test-modules = $(addprefix $(objpfx),$(addsuffix .so,$(strip $(modules-names)))) + generated += $(addsuffix .so,$(strip $(modules-names))) +Index: glibc-2.12-2-gc4ccff1/elf/dl-close.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/elf/dl-close.c ++++ glibc-2.12-2-gc4ccff1/elf/dl-close.c +@@ -32,6 +32,7 @@ + #include + #include + #include ++#include + + + /* Type of the constructor functions. */ +@@ -469,6 +470,7 @@ _dl_close_worker (struct link_map *map) + struct r_debug *r = _dl_debug_initialize (0, nsid); + r->r_state = RT_DELETE; + _dl_debug_state (); ++ LIBC_PROBE (rtld_unmap_start, 2, nsid, r); + + if (unload_global) + { +@@ -722,6 +724,7 @@ _dl_close_worker (struct link_map *map) + /* Notify the debugger those objects are finalized and gone. */ + r->r_state = RT_CONSISTENT; + _dl_debug_state (); ++ LIBC_PROBE (rtld_unmap_complete, 2, nsid, r); + + /* Recheck if we need to retry, release the lock. */ + out: +Index: glibc-2.12-2-gc4ccff1/elf/dl-load.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/elf/dl-load.c ++++ glibc-2.12-2-gc4ccff1/elf/dl-load.c +@@ -36,6 +36,7 @@ + #include + #include + #include ++#include + + #include + +@@ -806,7 +807,7 @@ _dl_init_paths (const char *llp) + static void + __attribute__ ((noreturn, noinline)) + lose (int code, int fd, const char *name, char *realname, struct link_map *l, +- const char *msg, struct r_debug *r) ++ const char *msg, struct r_debug *r, Lmid_t nsid) + { + /* The file might already be closed. */ + if (fd != -1) +@@ -818,6 +819,7 @@ lose (int code, int fd, const char *name + { + r->r_state = RT_CONSISTENT; + _dl_debug_state (); ++ LIBC_PROBE (rtld_map_complete, 2, nsid, r); + } + + _dl_signal_error (code, name, NULL, msg); +@@ -856,7 +858,7 @@ _dl_map_object_from_fd (const char *name + errval = errno; + call_lose: + lose (errval, fd, name, realname, l, errstring, +- make_consistent ? r : NULL); ++ make_consistent ? r : NULL, nsid); + } + + /* Look again to see if the real name matched another already loaded. */ +@@ -963,6 +965,7 @@ _dl_map_object_from_fd (const char *name + linking has not been used before. */ + r->r_state = RT_ADD; + _dl_debug_state (); ++ LIBC_PROBE (rtld_map_start, 2, nsid, r); + make_consistent = true; + } + else +@@ -1656,7 +1659,7 @@ open_verify (const char *name, struct fi + name = strdupa (realname); + free (realname); + } +- lose (errval, fd, name, NULL, NULL, errstring, NULL); ++ lose (errval, fd, name, NULL, NULL, errstring, NULL, 0); + } + + /* See whether the ELF header is what we expect. */ +Index: glibc-2.12-2-gc4ccff1/elf/dl-open.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/elf/dl-open.c ++++ glibc-2.12-2-gc4ccff1/elf/dl-open.c +@@ -33,6 +33,7 @@ + #include + #include + #include ++#include + + #include + +@@ -297,6 +298,7 @@ dl_open_worker (void *a) + struct r_debug *r = _dl_debug_initialize (0, args->nsid); + r->r_state = RT_CONSISTENT; + _dl_debug_state (); ++ LIBC_PROBE (rtld_map_complete, 2, args->nsid, r); + + /* Only do lazy relocation if `LD_BIND_NOW' is not set. */ + int reloc_mode = mode & __RTLD_AUDIT; +@@ -309,10 +311,18 @@ dl_open_worker (void *a) + struct link_map *l = new; + while (l->l_next) + l = l->l_next; ++ int relocation_in_progress = 0; + while (1) + { + if (! l->l_real->l_relocated) + { ++ if (! relocation_in_progress) ++ { ++ /* Notify the debugger that relocations are about to happen. */ ++ LIBC_PROBE (rtld_reloc_start, 2, args->nsid, r); ++ relocation_in_progress = 1; ++ } ++ + #ifdef SHARED + if (__builtin_expect (GLRO(dl_profile) != NULL, 0)) + { +@@ -460,6 +470,10 @@ cannot load any more object with static + _dl_fatal_printf (N_("\ + TLS generation counter wrapped! Please report this.")); + ++ /* Notify the debugger all new objects have been relocated. */ ++ if (relocation_in_progress) ++ LIBC_PROBE (rtld_reloc_complete, 2, args->nsid, r); ++ + /* Run the initializer functions of new objects. */ + _dl_init (new, args->argc, args->argv, args->env); + +Index: glibc-2.12-2-gc4ccff1/elf/rtld-Rules +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/elf/rtld-Rules ++++ glibc-2.12-2-gc4ccff1/elf/rtld-Rules +@@ -122,6 +122,6 @@ ifdef rtld-depfiles + endif + + # This here is the whole point of all the shenanigans. +-rtld-CPPFLAGS := -DNOT_IN_libc=1 -DIS_IN_rtld=1 ++rtld-CPPFLAGS := -DNOT_IN_libc=1 -DIS_IN_rtld=1 -DIN_LIB=rtld + + endif +Index: glibc-2.12-2-gc4ccff1/elf/rtld.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/elf/rtld.c ++++ glibc-2.12-2-gc4ccff1/elf/rtld.c +@@ -40,6 +40,7 @@ + #include + #include + #include ++#include + + #include + +@@ -1656,6 +1657,7 @@ ERROR: ld.so: object '%s' cannot be load + /* We start adding objects. */ + r->r_state = RT_ADD; + _dl_debug_state (); ++ LIBC_PROBE (rtld_init_start, 2, LM_ID_BASE, r); + + /* Auditing checkpoint: we are ready to signal that the initial map + is being constructed. */ +@@ -2353,6 +2355,7 @@ ERROR: ld.so: object '%s' cannot be load + r = _dl_debug_initialize (0, LM_ID_BASE); + r->r_state = RT_CONSISTENT; + _dl_debug_state (); ++ LIBC_PROBE (rtld_init_complete, 2, LM_ID_BASE, r); + + #ifndef MAP_COPY + /* We must munmap() the cache file. */ +Index: glibc-2.12-2-gc4ccff1/extra-lib.mk +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/extra-lib.mk ++++ glibc-2.12-2-gc4ccff1/extra-lib.mk +@@ -101,4 +101,4 @@ ifneq (,$(cpp-srcs-left)) + include $(patsubst %,$(..)cppflags-iterator.mk,$(cpp-srcs-left)) + endif + +-CPPFLAGS-$(lib) := -DNOT_IN_libc=1 -DIS_IN_$(lib)=1 ++CPPFLAGS-$(lib) := -DNOT_IN_libc=1 -DIS_IN_$(lib)=1 -DIN_LIB=$(lib) +Index: glibc-2.12-2-gc4ccff1/include/stap-probe.h +=================================================================== +--- /dev/null ++++ glibc-2.12-2-gc4ccff1/include/stap-probe.h +@@ -0,0 +1,140 @@ ++/* Macros for defining Systemtap static probe points. ++ Copyright (C) 2011 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, write to the Free ++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++ 02111-1307 USA. */ ++ ++#ifndef _STAP_PROBE_H ++#define _STAP_PROBE_H 1 ++ ++#ifdef USE_STAP_PROBE ++ ++# include ++ ++/* Our code uses one macro LIBC_PROBE (name, n, arg1, ..., argn). ++ ++ Without USE_STAP_PROBE, that does nothing but evaluates all ++ its arguments (to prevent bit rot, unlike e.g. assert). ++ ++ Systemtap's header defines the macros STAP_PROBE (provider, name) and ++ STAP_PROBEn (provider, name, arg1, ..., argn). For "provider" we paste ++ in the IN_LIB name (libc, libpthread, etc.) automagically. */ ++ ++# ifndef NOT_IN_libc ++# define IN_LIB libc ++# elif !defined IN_LIB ++/* This is intentionally defined with extra unquoted commas in it so ++ that macro substitution will bomb out when it is used. We don't ++ just use #error here, so that this header can be included by ++ other headers that use LIBC_PROBE inside their own macros. We ++ only want such headers to fail to compile if those macros are ++ actually used in a context where IN_LIB has not been defined. */ ++# define IN_LIB ,,,missing -DIN_LIB=... -- not extra-lib.mk?,,, ++# endif ++ ++# define LIBC_PROBE(name, n, ...) \ ++ LIBC_PROBE_1 (IN_LIB, name, n, ## __VA_ARGS__) ++ ++# define LIBC_PROBE_1(lib, name, n, ...) \ ++ STAP_PROBE##n (lib, name, ## __VA_ARGS__) ++ ++# define STAP_PROBE0 STAP_PROBE ++ ++# define LIBC_PROBE_ASM(name, template) \ ++ STAP_PROBE_ASM (IN_LIB, name, template) ++ ++# define LIBC_PROBE_ASM_OPERANDS STAP_PROBE_ASM_OPERANDS ++ ++#else /* Not USE_STAP_PROBE. */ ++ ++# ifndef __ASSEMBLER__ ++# define LIBC_PROBE(name, n, ...) DUMMY_PROBE##n (__VA_ARGS__) ++# else ++# define LIBC_PROBE(name, n, ...) /* Nothing. */ ++# endif ++ ++# define LIBC_PROBE_ASM(name, template) /* Nothing. */ ++# define LIBC_PROBE_ASM_OPERANDS(n, ...) /* Nothing. */ ++ ++/* This silliness lets us evaluate all the arguments for each arity ++ of probe. My kingdom for a real macro system. */ ++ ++# define DUMMY_PROBE0() do {} while (0) ++# define DUMMY_PROBE1(a1) do {} while ((void) (a1), 0) ++# define DUMMY_PROBE2(a1, a2) do {} while ((void) (a1), \ ++ (void) (a2), 0) ++# define DUMMY_PROBE3(a1, a2, a3) do {} while ((void) (a1), \ ++ (void) (a2), \ ++ (void) (a3), 0) ++# define DUMMY_PROBE4(a1, a2, a3, a4) do {} while ((void) (a1), \ ++ (void) (a2), \ ++ (void) (a3), \ ++ (void) (a4), 0) ++# define DUMMY_PROBE5(a1, a2, a3, a4, a5) \ ++ do {} while ((void) (a1), \ ++ (void) (a2), \ ++ (void) (a3), \ ++ (void) (a4), \ ++ (void) (a5), 0) ++# define DUMMY_PROBE6(a1, a2, a3, a4, a5, a6) \ ++ do {} while ((void) (a1), \ ++ (void) (a2), \ ++ (void) (a3), \ ++ (void) (a4), \ ++ (void) (a5), \ ++ (void) (a6), 0) ++# define DUMMY_PROBE7(a1, a2, a3, a4, a5, a6, a7) \ ++ do {} while ((void) (a1), \ ++ (void) (a2), \ ++ (void) (a3), \ ++ (void) (a4), \ ++ (void) (a5), \ ++ (void) (a6), \ ++ (void) (a7), 0) ++# define DUMMY_PROBE8(a1, a2, a3, a4, a5, a6, a7, a8) \ ++ do {} while ((void) (a1), \ ++ (void) (a2), \ ++ (void) (a3), \ ++ (void) (a4), \ ++ (void) (a5), \ ++ (void) (a6), \ ++ (void) (a7), \ ++ (void) (a8), 0) ++# define DUMMY_PROBE9(a1, a2, a3, a4, a5, a6, a7, a8, a9) \ ++ do {} while ((void) (a1), \ ++ (void) (a2), \ ++ (void) (a3), \ ++ (void) (a4), \ ++ (void) (a5), \ ++ (void) (a6), \ ++ (void) (a7), \ ++ (void) (a8), \ ++ (void) (a9), 0) ++# define DUMMY_PROBE10(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) \ ++ do {} while ((void) (a1), \ ++ (void) (a2), \ ++ (void) (a3), \ ++ (void) (a4), \ ++ (void) (a5), \ ++ (void) (a6), \ ++ (void) (a7), \ ++ (void) (a8), \ ++ (void) (a9), \ ++ (void) (a10), 0) ++ ++#endif /* USE_STAP_PROBE. */ ++ ++#endif /* stap-probe.h */ +Index: glibc-2.12-2-gc4ccff1/scripts/check-local-headers.sh +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/scripts/check-local-headers.sh ++++ glibc-2.12-2-gc4ccff1/scripts/check-local-headers.sh +@@ -31,6 +31,8 @@ fgrep -v "$includedir/asm" | + fgrep -v "$includedir/linux" | + fgrep -v "$includedir/selinux" | + fgrep -v "$includedir/sys/capability.h" | ++fgrep -v "$includedir/sys/sdt.h" | ++fgrep -v "$includedir/sys/sdt-config.h" | + fgrep -v "$includedir/gd" | + fgrep -v "$includedir/nss3"; then + # If we found a match something is wrong. diff --git a/SOURCES/glibc-rh711987.patch b/SOURCES/glibc-rh711987.patch new file mode 100644 index 0000000..bd286e1 --- /dev/null +++ b/SOURCES/glibc-rh711987.patch @@ -0,0 +1,136 @@ +2010-08-11 Ulrich Drepper + + * sysdeps/unix/sysv/linux/bits/statfs.h (struct statfs): Add f_flags + field. + (struct statfs64): Likewise. + (_STATFS_F_FLAGS): Define. + * sysdeps/unix/sysv/linux/s390/bits/statfs.h: Likewise. + * sysdeps/unix/sysv/linux/internal_statvfs.c (__statvfs_getflags): + Don't define if __ASSUME_STATFS_F_FLAGS is defined. + (ST_VALID): Define locally. + (INTERNAL_STATVFS): If f_flags has ST_VALID set don't call + __statvfs_getflags, use the provided value. + * sysdeps/unix/sysv/linux/kernel-features.h: Define + __ASSUME_STATFS_F_FLAGS. + +Index: glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/bits/statfs.h +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/sysdeps/unix/sysv/linux/bits/statfs.h ++++ glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/bits/statfs.h +@@ -42,7 +42,8 @@ struct statfs + __fsid_t f_fsid; + __SWORD_TYPE f_namelen; + __SWORD_TYPE f_frsize; +- __SWORD_TYPE f_spare[5]; ++ __SWORD_TYPE f_flags; ++ __SWORD_TYPE f_spare[4]; + }; + + #ifdef __USE_LARGEFILE64 +@@ -58,10 +59,12 @@ struct statfs64 + __fsid_t f_fsid; + __SWORD_TYPE f_namelen; + __SWORD_TYPE f_frsize; +- __SWORD_TYPE f_spare[5]; ++ __SWORD_TYPE f_flags; ++ __SWORD_TYPE f_spare[4]; + }; + #endif + + /* Tell code we have these members. */ + #define _STATFS_F_NAMELEN + #define _STATFS_F_FRSIZE ++#define _STATFS_F_FLAGS +Index: glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/internal_statvfs.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/sysdeps/unix/sysv/linux/internal_statvfs.c ++++ glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/internal_statvfs.c +@@ -29,6 +29,11 @@ + #include + #include + #include "linux_fsinfo.h" ++#include "kernel-features.h" ++ ++ ++/* Special internal-only bit value. */ ++#define ST_VALID 0x0020 + + + #ifndef STATFS +@@ -37,6 +42,7 @@ + # define INTERNAL_STATVFS __internal_statvfs + + ++# ifndef __ASSUME_STATFS_F_FLAGS + int + __statvfs_getflags (const char *name, int fstype, struct stat64 *st) + { +@@ -200,6 +206,7 @@ __statvfs_getflags (const char *name, in + + return result; + } ++# endif + #else + extern int __statvfs_getflags (const char *name, int fstype, + struct stat64 *st); +@@ -240,9 +247,14 @@ INTERNAL_STATVFS (const char *name, stru + /* XXX I have no idea how to compute f_favail. Any idea??? */ + buf->f_favail = buf->f_ffree; + +- /* Determining the flags is tricky. We have to read /proc/mounts or +- the /etc/mtab file and search for the entry which matches the given +- file. The way we can test for matching filesystem is using the +- device number. */ +- buf->f_flag = __statvfs_getflags (name, fsbuf->f_type, st); ++#ifndef __ASSUME_STATFS_F_FLAGS ++ if ((fsbuf->f_flags & ST_VALID) == 0) ++ /* Determining the flags is tricky. We have to read /proc/mounts or ++ the /etc/mtab file and search for the entry which matches the given ++ file. The way we can test for matching filesystem is using the ++ device number. */ ++ buf->f_flag = __statvfs_getflags (name, fsbuf->f_type, st); ++ else ++#endif ++ buf->f_flag = fsbuf->f_flags ^ ST_VALID; + } +Index: glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/kernel-features.h +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/sysdeps/unix/sysv/linux/kernel-features.h ++++ glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/kernel-features.h +@@ -552,3 +552,8 @@ + #if __LINUX_KERNEL_VERSION >= 0x020621 + # define __ASSUME_RECVMMSG 1 + #endif ++ ++/* statfs fills in f_flags since 2.6.36. */ ++#if __LINUX_KERNEL_VERSION >= 0x020624 ++# define __ASSUME_STATFS_F_FLAGS 1 ++#endif +Index: glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/s390/bits/statfs.h +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/sysdeps/unix/sysv/linux/s390/bits/statfs.h ++++ glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/s390/bits/statfs.h +@@ -42,7 +42,8 @@ struct statfs + __fsid_t f_fsid; + int f_namelen; + int f_frsize; +- int f_spare[5]; ++ int f_flags; ++ int f_spare[4]; + }; + + #ifdef __USE_LARGEFILE64 +@@ -58,10 +59,12 @@ struct statfs64 + __fsid_t f_fsid; + int f_namelen; + int f_frsize; +- int f_spare[5]; ++ int f_flags; ++ int f_spare[4]; + }; + #endif + + /* Tell code we have this member. */ + #define _STATFS_F_NAMELEN + #define _STATFS_F_FRSIZE ++#define _STATFS_F_FLAGS diff --git a/SOURCES/glibc-rh712248.patch b/SOURCES/glibc-rh712248.patch new file mode 100644 index 0000000..afadc66 --- /dev/null +++ b/SOURCES/glibc-rh712248.patch @@ -0,0 +1,69 @@ +2011-07-07 Ulrich Drepper + + [BZ #12868] + * sysdeps/unix/sysv/linux/linux_fsinfo.h: Define Lustre constants. + * sysdeps/unix/sysv/linux/internal_statvfs.c (__statvfs_getflags): + Handle Lustre. + * sysdeps/unix/sysv/linux/pathconf.c (__statfs_link_max): Likewise. + (__statfs_filesize_max): Likewise. + Patch mostly by Andreas Dilger . + +Index: glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/internal_statvfs.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/sysdeps/unix/sysv/linux/internal_statvfs.c ++++ glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/internal_statvfs.c +@@ -109,6 +109,9 @@ __statvfs_getflags (const char *name, in + case LOGFS_MAGIC_U32: + fsname = "logfs"; + break; ++ case LUSTRE_SUPER_MAGIC: ++ fsname = "lustre"; ++ break; + } + + FILE *mtab = __setmntent ("/proc/mounts", "r"); +Index: glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/linux_fsinfo.h +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/sysdeps/unix/sysv/linux/linux_fsinfo.h ++++ glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/linux_fsinfo.h +@@ -77,6 +77,9 @@ + /* Constant that identifies the `logfs� filesystem. */ + #define LOGFS_MAGIC_U32 0xc97e8168u + ++/* Constant that identifies the `lustre' filesystem. */ ++#define LUSTRE_SUPER_MAGIC 0x0BD00BD0 ++ + /* Constants that identify the `minix2' filesystem. */ + #define MINIX2_SUPER_MAGIC 0x2468 + #define MINIX2_SUPER_MAGIC2 0x2478 +@@ -144,6 +147,8 @@ + /* Maximum link counts. */ + #define COH_LINK_MAX 10000 + #define EXT2_LINK_MAX 32000 ++#define EXT4_LINK_MAX 65000 ++#define LUSTRE_LINK_MAX EXT4_LINK_MAX + #define MINIX2_LINK_MAX 65530 + #define MINIX_LINK_MAX 250 + #define REISERFS_LINK_MAX 64535 +Index: glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/pathconf.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/sysdeps/unix/sysv/linux/pathconf.c ++++ glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/pathconf.c +@@ -104,6 +104,9 @@ __statfs_link_max (int result, const str + case XFS_SUPER_MAGIC: + return XFS_LINK_MAX; + ++ case LUSTRE_SUPER_MAGIC: ++ return LUSTRE_LINK_MAX; ++ + default: + return LINUX_LINK_MAX; + } +@@ -136,6 +139,7 @@ __statfs_filesize_max (int result, const + case UDF_SUPER_MAGIC: + case JFS_SUPER_MAGIC: + case VXFS_SUPER_MAGIC: ++ case LUSTRE_SUPER_MAGIC: + return 64; + + case MSDOS_SUPER_MAGIC: diff --git a/SOURCES/glibc-rh713134.patch b/SOURCES/glibc-rh713134.patch new file mode 100644 index 0000000..dc979be --- /dev/null +++ b/SOURCES/glibc-rh713134.patch @@ -0,0 +1,36 @@ +2011-03-18 Andreas Schwab + + * elf/ldd.bash.in: Never run file directly. + +Index: glibc-2.12-2-gc4ccff1/elf/ldd.bash.in +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/elf/ldd.bash.in ++++ glibc-2.12-2-gc4ccff1/elf/ldd.bash.in +@@ -167,18 +167,6 @@ warning: you do not have execution permi + fi + done + case $ret in +- 0) +- # If the program exits with exit code 5, it means the process has been +- # invoked with __libc_enable_secure. Fall back to running it through +- # the dynamic linker. +- try_trace "$file" +- rc=$? +- if [ $rc = 5 ]; then +- try_trace "$RTLD" "$file" +- rc=$? +- fi +- [ $rc = 0 ] || result=1 +- ;; + 1) + # This can be a non-ELF binary or no binary at all. + nonelf "$file" || { +@@ -186,7 +174,7 @@ warning: you do not have execution permi + result=1 + } + ;; +- 2) ++ 0|2) + try_trace "$RTLD" "$file" || result=1 + ;; + *) diff --git a/SOURCES/glibc-rh714823.patch b/SOURCES/glibc-rh714823.patch new file mode 100644 index 0000000..8bd121b --- /dev/null +++ b/SOURCES/glibc-rh714823.patch @@ -0,0 +1,126 @@ +2011-06-28 Andreas Schwab + + * sysdeps/posix/getaddrinfo.c (gaih_inet): Don't use gethostbyaddr + to determine canonical name. + +2011-06-22 Andreas Schwab + + * sysdeps/posix/getaddrinfo.c (gaih_inet): Fix last change. + +2011-06-21 Ulrich Drepper + + [BZ #12885] + * sysdeps/posix/getaddrinfo.c (gaih_inet): When looking up only IPv6 + addresses using gethostbyname4_r ignore IPv4 addresses. + +Index: glibc-2.12-2-gc4ccff1/sysdeps/posix/getaddrinfo.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/sysdeps/posix/getaddrinfo.c ++++ glibc-2.12-2-gc4ccff1/sysdeps/posix/getaddrinfo.c +@@ -512,10 +512,11 @@ gaih_inet (const char *name, const struc + + /* If we do not have to look for IPv4 and IPv6 together, use + the simple, old functions. */ +- if (req->ai_family == AF_INET +- || (req->ai_family == AF_INET6 +- && ((req->ai_flags & AI_V4MAPPED) == 0 +- || (req->ai_flags & AI_ALL) == 0))) ++ if ((req->ai_family == AF_INET ++ || (req->ai_family == AF_INET6 ++ && ((req->ai_flags & AI_V4MAPPED) == 0 ++ || (req->ai_flags & AI_ALL) == 0))) ++ && (req->ai_flags & AI_CANONNAME) == 0) + { + int family = req->ai_family; + size_t tmpbuflen = 512; +@@ -731,16 +732,44 @@ gaih_inet (const char *name, const struc + tmpbuflen, 2 * tmpbuflen); + } + +- no_inet6_data = no_data; +- + if (status == NSS_STATUS_SUCCESS) + { ++ assert (!no_data); ++ no_data = 1; ++ + if ((req->ai_flags & AI_CANONNAME) != 0 && canon == NULL) + canon = (*pat)->name; + + while (*pat != NULL) +- pat = &((*pat)->next); ++ { ++ if ((*pat)->family == AF_INET ++ && req->ai_family == AF_INET6 ++ && (req->ai_flags & AI_V4MAPPED) != 0) ++ { ++ uint32_t *pataddr = (*pat)->addr; ++ (*pat)->family = AF_INET6; ++ pataddr[3] = pataddr[0]; ++ pataddr[2] = htonl (0xffff); ++ pataddr[1] = 0; ++ pataddr[0] = 0; ++ pat = &((*pat)->next); ++ no_data = 0; ++ } ++ else if (req->ai_family == AF_UNSPEC ++ || (*pat)->family == req->ai_family) ++ { ++ pat = &((*pat)->next); ++ ++ no_data = 0; ++ if (req->ai_family == AF_INET6) ++ got_ipv6 = true; ++ } ++ else ++ *pat = ((*pat)->next); ++ } + } ++ ++ no_inet6_data = no_data; + } + else + { +@@ -905,39 +934,9 @@ gaih_inet (const char *name, const struc + { + if (canon == NULL) + { +- struct hostent *h = NULL; +- int herrno; +- struct hostent th; +- size_t tmpbuflen = 512; +- char *tmpbuf = NULL; +- +- do +- { +- tmpbuf = extend_alloca (tmpbuf, tmpbuflen, tmpbuflen * 2); +- rc = __gethostbyaddr_r (at2->addr, +- ((at2->family == AF_INET6) +- ? sizeof (struct in6_addr) +- : sizeof (struct in_addr)), +- at2->family, &th, tmpbuf, +- tmpbuflen, &h, &herrno); +- } +- while (rc == ERANGE && herrno == NETDB_INTERNAL); +- +- if (rc != 0 && herrno == NETDB_INTERNAL) +- { +- __set_h_errno (herrno); +- return -EAI_SYSTEM; +- } +- +- if (h != NULL) +- canon = h->h_name; +- else +- { +- assert (orig_name != NULL); +- /* If the canonical name cannot be determined, use +- the passed in string. */ +- canon = orig_name; +- } ++ /* If the canonical name cannot be determined, use ++ the passed in string. */ ++ canon = orig_name; + } + + #ifdef HAVE_LIBIDN diff --git a/SOURCES/glibc-rh718057.patch b/SOURCES/glibc-rh718057.patch new file mode 100644 index 0000000..d331996 --- /dev/null +++ b/SOURCES/glibc-rh718057.patch @@ -0,0 +1,109 @@ +2011-07-01 Andreas Schwab + + * nis/nss_compat/compat-pwd.c (getpwent_next_nss_netgr): Query NIS + domain only when needed. + +Index: glibc-2.12-2-gc4ccff1/nis/nss_compat/compat-pwd.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/nis/nss_compat/compat-pwd.c ++++ glibc-2.12-2-gc4ccff1/nis/nss_compat/compat-pwd.c +@@ -360,7 +360,7 @@ getpwent_next_nss_netgr (const char *nam + char *group, char *buffer, size_t buflen, + int *errnop) + { +- char *curdomain, *host, *user, *domain, *p2; ++ char *curdomain = NULL, *host, *user, *domain, *p2; + int status; + size_t p2len; + +@@ -369,15 +369,7 @@ getpwent_next_nss_netgr (const char *nam + if (!nss_getpwnam_r) + return NSS_STATUS_UNAVAIL; + +- if (yp_get_default_domain (&curdomain) != YPERR_SUCCESS) +- { +- ent->netgroup = false; +- ent->first = false; +- give_pwd_free (&ent->pwd); +- return NSS_STATUS_UNAVAIL; +- } +- +- if (ent->first == true) ++ if (ent->first) + { + memset (&ent->netgrdata, 0, sizeof (struct __netgrent)); + __internal_setnetgrent (group, &ent->netgrdata); +@@ -403,8 +395,19 @@ getpwent_next_nss_netgr (const char *nam + if (user == NULL || user[0] == '-') + continue; + +- if (domain != NULL && strcmp (curdomain, domain) != 0) +- continue; ++ if (domain != NULL) ++ { ++ if (curdomain == NULL ++ && yp_get_default_domain (&curdomain) != YPERR_SUCCESS) ++ { ++ __internal_endnetgrent (&ent->netgrdata); ++ ent->netgroup = false; ++ give_pwd_free (&ent->pwd); ++ return NSS_STATUS_UNAVAIL; ++ } ++ if (strcmp (curdomain, domain) != 0) ++ continue; ++ } + + /* If name != NULL, we are called from getpwnam. */ + if (name != NULL) +Index: glibc-2.12-2-gc4ccff1/nis/nss_compat/compat-spwd.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/nis/nss_compat/compat-spwd.c ++++ glibc-2.12-2-gc4ccff1/nis/nss_compat/compat-spwd.c +@@ -317,7 +317,7 @@ getspent_next_nss_netgr (const char *nam + char *group, char *buffer, size_t buflen, + int *errnop) + { +- char *curdomain, *host, *user, *domain, *p2; ++ char *curdomain = NULL, *host, *user, *domain, *p2; + size_t p2len; + + if (!nss_getspnam_r) +@@ -327,15 +327,7 @@ getspent_next_nss_netgr (const char *nam + if (ent->setent_status != NSS_STATUS_SUCCESS) + return ent->setent_status; + +- if (yp_get_default_domain (&curdomain) != YPERR_SUCCESS) +- { +- ent->netgroup = false; +- ent->first = false; +- give_spwd_free (&ent->pwd); +- return NSS_STATUS_UNAVAIL; +- } +- +- if (ent->first == true) ++ if (ent->first) + { + memset (&ent->netgrdata, 0, sizeof (struct __netgrent)); + __internal_setnetgrent (group, &ent->netgrdata); +@@ -362,8 +354,19 @@ getspent_next_nss_netgr (const char *nam + if (user == NULL || user[0] == '-') + continue; + +- if (domain != NULL && strcmp (curdomain, domain) != 0) +- continue; ++ if (domain != NULL) ++ { ++ if (curdomain == NULL ++ && yp_get_default_domain (&curdomain) != YPERR_SUCCESS) ++ { ++ __internal_endnetgrent (&ent->netgrdata); ++ ent->netgroup = false; ++ give_spwd_free (&ent->pwd); ++ return NSS_STATUS_UNAVAIL; ++ } ++ if (strcmp (curdomain, domain) != 0) ++ continue; ++ } + + /* If name != NULL, we are called from getpwnam */ + if (name != NULL) diff --git a/SOURCES/glibc-rh726517.patch b/SOURCES/glibc-rh726517.patch new file mode 100644 index 0000000..26addbf --- /dev/null +++ b/SOURCES/glibc-rh726517.patch @@ -0,0 +1,173 @@ +Index: glibc-2.12-2-gc4ccff1/malloc/arena.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/malloc/arena.c ++++ glibc-2.12-2-gc4ccff1/malloc/arena.c +@@ -870,7 +870,7 @@ heap_trim(heap, pad) heap_info *heap; si + heap = prev_heap; + if(!prev_inuse(p)) { /* consolidate backward */ + p = prev_chunk(p); +- unlink(p, bck, fwd); ++ unlink(ar_ptr, p, bck, fwd); + } + assert(((unsigned long)((char*)p + new_size) & (pagesz-1)) == 0); + assert( ((char*)p + new_size) == ((char*)heap + heap->size) ); +Index: glibc-2.12-2-gc4ccff1/malloc/hooks.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/malloc/hooks.c ++++ glibc-2.12-2-gc4ccff1/malloc/hooks.c +@@ -219,7 +219,9 @@ top_check() + (char*)t + chunksize(t) == mp_.sbrk_base + main_arena.system_mem))) + return 0; + ++ mutex_unlock(&main_arena); + malloc_printerr (check_action, "malloc: top chunk is corrupt", t); ++ mutex_lock(&main_arena); + + /* Try to set up a new top chunk. */ + brk = MORECORE(0); +Index: glibc-2.12-2-gc4ccff1/malloc/malloc.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/malloc/malloc.c ++++ glibc-2.12-2-gc4ccff1/malloc/malloc.c +@@ -2109,12 +2109,14 @@ typedef struct malloc_chunk* mbinptr; + #define last(b) ((b)->bk) + + /* Take a chunk off a bin list */ +-#define unlink(P, BK, FD) { \ ++#define unlink(AV, P, BK, FD) { \ + FD = P->fd; \ + BK = P->bk; \ +- if (__builtin_expect (FD->bk != P || BK->fd != P, 0)) \ ++ if (__builtin_expect (FD->bk != P || BK->fd != P, 0)) { \ ++ mutex_unlock(&(AV)->mutex); \ + malloc_printerr (check_action, "corrupted double-linked list", P); \ +- else { \ ++ mutex_lock(&(AV)->mutex); \ ++ } else { \ + FD->bk = BK; \ + BK->fd = FD; \ + if (!in_smallbin_range (P->size) \ +@@ -3257,7 +3259,9 @@ static Void_t* sYSMALLOc(nb, av) INTERNA + + else if (contiguous(av) && old_size && brk < old_end) { + /* Oops! Someone else killed our space.. Can't touch anything. */ ++ mutex_unlock(&av->mutex); + malloc_printerr (3, "break adjusted to free malloc space", brk); ++ mutex_lock(&av->mutex); + } + + /* +@@ -4305,7 +4309,9 @@ _int_malloc(mstate av, size_t bytes) + { + errstr = "malloc(): memory corruption (fast)"; + errout: ++ mutex_unlock(&av->mutex); + malloc_printerr (check_action, errstr, chunk2mem (victim)); ++ mutex_lock(&av->mutex); + return NULL; + } + #ifndef ATOMIC_FASTBINS +@@ -4393,8 +4399,12 @@ _int_malloc(mstate av, size_t bytes) + bck = victim->bk; + if (__builtin_expect (victim->size <= 2 * SIZE_SZ, 0) + || __builtin_expect (victim->size > av->system_mem, 0)) +- malloc_printerr (check_action, "malloc(): memory corruption", +- chunk2mem (victim)); ++ { ++ void *p = chunk2mem(victim); ++ mutex_unlock(&av->mutex); ++ malloc_printerr (check_action, "malloc(): memory corruption", p); ++ mutex_lock(&av->mutex); ++ } + size = chunksize(victim); + + /* +@@ -4535,7 +4545,7 @@ _int_malloc(mstate av, size_t bytes) + victim = victim->fd; + + remainder_size = size - nb; +- unlink(victim, bck, fwd); ++ unlink(av, victim, bck, fwd); + + /* Exhaust */ + if (remainder_size < MINSIZE) { +@@ -4633,7 +4643,7 @@ _int_malloc(mstate av, size_t bytes) + remainder_size = size - nb; + + /* unlink */ +- unlink(victim, bck, fwd); ++ unlink(av, victim, bck, fwd); + + /* Exhaust */ + if (remainder_size < MINSIZE) { +@@ -4789,10 +4799,14 @@ _int_free(mstate av, mchunkptr p) + errstr = "free(): invalid pointer"; + errout: + #ifdef ATOMIC_FASTBINS +- if (! have_lock && locked) ++ if (have_lock || locked) + (void)mutex_unlock(&av->mutex); + #endif + malloc_printerr (check_action, errstr, chunk2mem(p)); ++#ifdef ATOMIC_FASTBINS ++ if (have_lock) ++ mutex_lock(&av->mutex); ++#endif + return; + } + /* We know that each chunk is at least MINSIZE bytes in size. */ +@@ -4961,7 +4975,7 @@ _int_free(mstate av, mchunkptr p) + prevsize = p->prev_size; + size += prevsize; + p = chunk_at_offset(p, -((long) prevsize)); +- unlink(p, bck, fwd); ++ unlink(av, p, bck, fwd); + } + + if (nextchunk != av->top) { +@@ -4970,7 +4984,7 @@ _int_free(mstate av, mchunkptr p) + + /* consolidate forward */ + if (!nextinuse) { +- unlink(nextchunk, bck, fwd); ++ unlink(av, nextchunk, bck, fwd); + size += nextsize; + } else + clear_inuse_bit_at_offset(nextchunk, 0); +@@ -5158,7 +5172,7 @@ static void malloc_consolidate(av) mstat + prevsize = p->prev_size; + size += prevsize; + p = chunk_at_offset(p, -((long) prevsize)); +- unlink(p, bck, fwd); ++ unlink(av, p, bck, fwd); + } + + if (nextchunk != av->top) { +@@ -5166,7 +5180,7 @@ static void malloc_consolidate(av) mstat + + if (!nextinuse) { + size += nextsize; +- unlink(nextchunk, bck, fwd); ++ unlink(av, nextchunk, bck, fwd); + } else + clear_inuse_bit_at_offset(nextchunk, 0); + +@@ -5235,7 +5249,9 @@ _int_realloc(mstate av, mchunkptr oldp, + { + errstr = "realloc(): invalid old size"; + errout: ++ mutex_unlock(&av->mutex); + malloc_printerr (check_action, errstr, chunk2mem(oldp)); ++ mutex_lock(&av->mutex); + return NULL; + } + +@@ -5282,7 +5298,7 @@ _int_realloc(mstate av, mchunkptr oldp, + (unsigned long)(newsize = oldsize + nextsize) >= + (unsigned long)(nb)) { + newp = oldp; +- unlink(next, bck, fwd); ++ unlink(av, next, bck, fwd); + } + + /* allocate, copy, free */ diff --git a/SOURCES/glibc-rh730379.patch b/SOURCES/glibc-rh730379.patch new file mode 100644 index 0000000..45808af --- /dev/null +++ b/SOURCES/glibc-rh730379.patch @@ -0,0 +1,34 @@ +2011-08-17 Ulrich Drepper + + * Makeconfig (override CFLAGS): Add library-specific CFLAGS. + * resolv/Makefile: Define CFLAGS-libresolv. + +Index: glibc-2.12-2-gc4ccff1/Makeconfig +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/Makeconfig ++++ glibc-2.12-2-gc4ccff1/Makeconfig +@@ -700,7 +700,9 @@ CPPFLAGS = $($(subdir)-CPPFLAGS) $(+incl + override CFLAGS = -std=gnu99 $(gnu89-inline-CFLAGS) \ + $(filter-out %frame-pointer,$(+cflags)) $(+gccwarn-c) \ + $(sysdep-CFLAGS) $(CFLAGS-$(suffix $@)) $(CFLAGS-$( + + * sysdeps/unix/sysv/linux/x86_64/cancellation.S: Maintain aligned + stack. + * sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S: Likewise. + * sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S: Likewise. + +Index: glibc-2.12-2-gc4ccff1/nptl/sysdeps/unix/sysv/linux/x86_64/cancellation.S +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/nptl/sysdeps/unix/sysv/linux/x86_64/cancellation.S ++++ glibc-2.12-2-gc4ccff1/nptl/sysdeps/unix/sysv/linux/x86_64/cancellation.S +@@ -71,7 +71,9 @@ ENTRY(__pthread_enable_asynccancel) + + 1: ret + +-3: movq $TCB_PTHREAD_CANCELED, %fs:RESULT ++3: subq $8, %rsp ++ cfi_adjust_cfa_offset(8) ++ movq $TCB_PTHREAD_CANCELED, %fs:RESULT + lock + orl $TCB_EXITING_BITMASK, %fs:CANCELHANDLING + movq %fs:CLEANUP_JMP_BUF, %rdi +Index: glibc-2.12-2-gc4ccff1/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S ++++ glibc-2.12-2-gc4ccff1/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S +@@ -63,9 +63,9 @@ __pthread_cond_timedwait: + cfi_adjust_cfa_offset(8) + cfi_rel_offset(%r15, 0) + #ifdef __ASSUME_FUTEX_CLOCK_REALTIME +-# define FRAME_SIZE 32 ++# define FRAME_SIZE (32+8) + #else +-# define FRAME_SIZE 48 ++# define FRAME_SIZE (48+8) + #endif + subq $FRAME_SIZE, %rsp + cfi_adjust_cfa_offset(FRAME_SIZE) +Index: glibc-2.12-2-gc4ccff1/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S ++++ glibc-2.12-2-gc4ccff1/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S +@@ -45,7 +45,7 @@ __pthread_cond_wait: + cfi_lsda(DW_EH_PE_udata4, .LexceptSTART) + #endif + +-#define FRAME_SIZE 32 ++#define FRAME_SIZE (32+8) + leaq -FRAME_SIZE(%rsp), %rsp + cfi_adjust_cfa_offset(FRAME_SIZE) + diff --git a/SOURCES/glibc-rh736346.patch b/SOURCES/glibc-rh736346.patch new file mode 100644 index 0000000..2dd3f8a --- /dev/null +++ b/SOURCES/glibc-rh736346.patch @@ -0,0 +1,116 @@ +2011-01-14 Ulrich Drepper + + [BZ #10563] + * sysdeps/unix/sysv/linux/i386/setgroups.c: Use INLINE_SETXID_SYSCALL + to make the syscall. + * sysdeps/unix/sysv/linux/setgroups.c: New file. + +2011-01-14 Ulrich Drepper + + [BZ #10563] + * sysdeps/pthread/setxid.h (__SETXID_1): Add cast to assignment. + (__SETXID_2): Likewise. + (__SETXID_3): Likewise. + +Index: glibc-2.12-2-gc4ccff1/nptl/sysdeps/pthread/setxid.h +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/nptl/sysdeps/pthread/setxid.h ++++ glibc-2.12-2-gc4ccff1/nptl/sysdeps/pthread/setxid.h +@@ -20,11 +20,11 @@ + #include + + #define __SETXID_1(cmd, arg1) \ +- cmd.id[0] = arg1 ++ cmd.id[0] = (long int) arg1 + #define __SETXID_2(cmd, arg1, arg2) \ +- __SETXID_1 (cmd, arg1); cmd.id[1] = arg2 ++ __SETXID_1 (cmd, arg1); cmd.id[1] = (long int) arg2 + #define __SETXID_3(cmd, arg1, arg2, arg3) \ +- __SETXID_2 (cmd, arg1, arg2); cmd.id[2] = arg3 ++ __SETXID_2 (cmd, arg1, arg2); cmd.id[2] = (long int) arg3 + + #ifdef SINGLE_THREAD + # define INLINE_SETXID_SYSCALL(name, nr, args...) \ +Index: glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/i386/setgroups.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/sysdeps/unix/sysv/linux/i386/setgroups.c ++++ glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/i386/setgroups.c +@@ -25,6 +25,7 @@ + #include + #include + ++#include + #include + #include + +@@ -44,7 +45,7 @@ int + setgroups (size_t n, const gid_t *groups) + { + #if __ASSUME_32BITUIDS > 0 +- return INLINE_SYSCALL (setgroups32, 2, n, CHECK_N (groups, n)); ++ return INLINE_SETXID_SYSCALL (setgroups32, 2, n, CHECK_N (groups, n)); + #else + if (n > (size_t) __sysconf (_SC_NGROUPS_MAX)) + { +@@ -62,7 +63,8 @@ setgroups (size_t n, const gid_t *groups + int result; + int saved_errno = errno; + +- result = INLINE_SYSCALL (setgroups32, 2, n, CHECK_N (groups, n)); ++ result = INLINE_SETXID_SYSCALL (setgroups32, 2, n, ++ CHECK_N (groups, n)); + if (result == 0 || errno != ENOSYS) + return result; + +@@ -80,7 +82,8 @@ setgroups (size_t n, const gid_t *groups + } + } + +- return INLINE_SYSCALL (setgroups, 2, n, CHECK_N (kernel_groups, n)); ++ return INLINE_SETXID_SYSCALL (setgroups, 2, n, ++ CHECK_N (kernel_groups, n)); + } + #endif + } +Index: glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/setgroups.c +=================================================================== +--- /dev/null ++++ glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/setgroups.c +@@ -0,0 +1,37 @@ ++/* Copyright (C) 1997,1998,2000,2002,2004,2006,2011 ++ Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, write to the Free ++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++ 02111-1307 USA. */ ++ ++#include ++#include ++#include ++#include ++ ++ ++/* Set the group set for the current user to GROUPS (N of them). For ++ Linux we must convert the array of groups into the format that the ++ kernel expects. */ ++int ++setgroups (size_t n, const gid_t *groups) ++{ ++#ifdef __NR_setgroups32 ++# error "wrong setgroups.c file used" ++#endif ++ return INLINE_SETXID_SYSCALL (setgroups, 2, n, groups); ++} ++libc_hidden_def (setgroups) diff --git a/SOURCES/glibc-rh737778.patch b/SOURCES/glibc-rh737778.patch new file mode 100644 index 0000000..5d3c131 --- /dev/null +++ b/SOURCES/glibc-rh737778.patch @@ -0,0 +1,122 @@ +2011-08-14 Roland McGrath + + * locale/Makefile (locale-CPPFLAGS): Renamed CPPFLAGS-locale-programs. + (locale-CPPFLAGS): New variable; put LOCALEDIR, LOCALE_ALIAS_PATH and + -Iprograms here. + (cppflags-iterator.mk sequence): Use locale-programs in place of nonlib. + (localedef-modules): Add localedef. + (locale-modules): Add locale. + +2011-08-13 Ulrich Drepper + + * intl/l10nflist.c (_nl_normalize_codeset): Make it compile outside + of libc. Make tolower call locale-independent. Optimize a bit by + using isdigit instead of isalnum. + * locale/Makefile (locale-CPPFLAGS): Add -DNOT_IN_libc. + +2011-08-11 Ulrich Drepper + + * intl/l10nflist.c (_nl_make_l10nflist): Use locale-independent + classification. + +Index: glibc-2.12-2-gc4ccff1/intl/l10nflist.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/intl/l10nflist.c ++++ glibc-2.12-2-gc4ccff1/intl/l10nflist.c +@@ -332,13 +332,18 @@ _nl_normalize_codeset (codeset, name_len + char *retval; + char *wp; + size_t cnt; ++#ifdef NOT_IN_libc ++ locale_t locale = newlocale (0, "C", NULL); ++#else ++# define locale _nl_C_locobj_ptr ++#endif + + for (cnt = 0; cnt < name_len; ++cnt) +- if (isalnum ((unsigned char) codeset[cnt])) ++ if (__isalnum_l ((unsigned char) codeset[cnt], locale)) + { + ++len; + +- if (isalpha ((unsigned char) codeset[cnt])) ++ if (! __isdigit_l ((unsigned char) codeset[cnt], locale)) + only_digit = 0; + } + +@@ -346,15 +351,14 @@ _nl_normalize_codeset (codeset, name_len + + if (retval != NULL) + { ++ wp = retval; + if (only_digit) +- wp = stpcpy (retval, "iso"); +- else +- wp = retval; ++ wp = stpcpy (wp, "iso"); + + for (cnt = 0; cnt < name_len; ++cnt) +- if (isalpha ((unsigned char) codeset[cnt])) +- *wp++ = tolower ((unsigned char) codeset[cnt]); +- else if (isdigit ((unsigned char) codeset[cnt])) ++ if (__isalpha_l ((unsigned char) codeset[cnt], locale)) ++ *wp++ = __tolower_l ((unsigned char) codeset[cnt], locale); ++ else if (__isdigit_l ((unsigned char) codeset[cnt], locale)) + *wp++ = codeset[cnt]; + + *wp = '\0'; +Index: glibc-2.12-2-gc4ccff1/locale/Makefile +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/locale/Makefile ++++ glibc-2.12-2-gc4ccff1/locale/Makefile +@@ -59,10 +59,11 @@ vpath %.c programs ../crypt + vpath %.h programs + vpath %.gperf programs + +-localedef-modules := $(categories:%=ld-%) charmap linereader locfile \ ++localedef-modules := localedef $(categories:%=ld-%) \ ++ charmap linereader locfile \ + repertoire locarchive + localedef-aux := md5 +-locale-modules := locale-spec ++locale-modules := locale locale-spec + lib-modules := charmap-dir simple-hash xmalloc xstrdup + + +@@ -90,22 +91,27 @@ endif + + localepath = "$(localedir):$(i18ndir)" + +-locale-CPPFLAGS := -DLOCALE_PATH='$(localepath)' \ +- -DLOCALEDIR='"$(localedir)"' \ +- -DLOCALE_ALIAS_PATH='"$(msgcatdir)"' \ +- -DCHARMAP_PATH='"$(i18ndir)/charmaps"' \ +- -DREPERTOIREMAP_PATH='"$(i18ndir)/repertoiremaps"' \ +- -DLOCSRCDIR='"$(i18ndir)/locales"' -DHAVE_CONFIG_H \ +- -Iprograms ++# -Iprograms doesn't really belong here, but this gets it at the head ++# of the list instead of the tail, where CPPFLAGS-$(lib) gets added. ++# We need it before the standard -I's to see programs/config.h first. ++locale-CPPFLAGS = -DLOCALEDIR='"$(localedir)"' \ ++ -DLOCALE_ALIAS_PATH='"$(msgcatdir)"' \ ++ -Iprograms ++ ++CPPFLAGS-locale-programs = -DLOCALE_PATH='$(localepath)' \ ++ -DCHARMAP_PATH='"$(i18ndir)/charmaps"' \ ++ -DREPERTOIREMAP_PATH='"$(i18ndir)/repertoiremaps"' \ ++ -DLOCSRCDIR='"$(i18ndir)/locales"' \ ++ -DHAVE_CONFIG_H -DNOT_IN_libc + + CFLAGS-charmap.c = -Wno-write-strings -Wno-char-subscripts + CFLAGS-locfile.c = -Wno-write-strings -Wno-char-subscripts + CFLAGS-charmap-dir.c = -Wno-write-strings + +-# This makes sure -DNOT_IN_libc is passed for all these modules. ++# This makes sure -DNOT_IN_libc et al are passed for all these modules. + cpp-srcs-left := $(addsuffix .c,$(localedef-modules) $(localedef-aux) \ + $(locale-modules) $(lib-modules)) +-lib := nonlib ++lib := locale-programs + include $(patsubst %,$(..)cppflags-iterator.mk,$(cpp-srcs-left)) + + # Depend on libc.so so a DT_NEEDED is generated in the shared objects. diff --git a/SOURCES/glibc-rh738665.patch b/SOURCES/glibc-rh738665.patch new file mode 100644 index 0000000..1eea554 --- /dev/null +++ b/SOURCES/glibc-rh738665.patch @@ -0,0 +1,149 @@ +2011-09-15 Andreas Schwab + + * sysdeps/pthread/list.h: Define only list_t if __need_list_t is + defined. + (list_add): Add atomic_write_barrier. + * descr.h: Define __need_list_t before including . + * nptl-init.c: Include + * allocatestack.c: Likewise. + +2011-09-15 Andreas Schwab + + * thread_dbP.h: Include + +Index: glibc-2.12-2-gc4ccff1/nptl/allocatestack.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/nptl/allocatestack.c ++++ glibc-2.12-2-gc4ccff1/nptl/allocatestack.c +@@ -27,6 +27,7 @@ + #include + #include + #include ++#include + #include + #include + +Index: glibc-2.12-2-gc4ccff1/nptl/descr.h +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/nptl/descr.h ++++ glibc-2.12-2-gc4ccff1/nptl/descr.h +@@ -26,6 +26,7 @@ + #include + #include + #include ++#define __need_list_t + #include + #include + #include +Index: glibc-2.12-2-gc4ccff1/nptl/nptl-init.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/nptl/nptl-init.c ++++ glibc-2.12-2-gc4ccff1/nptl/nptl-init.c +@@ -29,6 +29,7 @@ + #include + #include + #include ++#include + #include + #include + #include +Index: glibc-2.12-2-gc4ccff1/nptl/sysdeps/pthread/list.h +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/nptl/sysdeps/pthread/list.h ++++ glibc-2.12-2-gc4ccff1/nptl/sysdeps/pthread/list.h +@@ -18,27 +18,39 @@ + 02111-1307 USA. */ + + #ifndef _LIST_H +-#define _LIST_H 1 ++ ++#ifndef __need_list_t ++# define _LIST_H 1 ++#endif + + /* The definitions of this file are adopted from those which can be + found in the Linux kernel headers to enable people familiar with + the latter find their way in these sources as well. */ + + ++#if defined __need_list_t || defined _LIST_H ++# ifndef __list_t_defined ++# define __list_t_defined + /* Basic type for the double-link list. */ + typedef struct list_head + { + struct list_head *next; + struct list_head *prev; + } list_t; ++# endif ++# undef __need_list_t ++#endif ++ ++#ifdef _LIST_H + ++# include + + /* Define a variable with the head and tail of the list. */ +-#define LIST_HEAD(name) \ ++# define LIST_HEAD(name) \ + list_t name = { &(name), &(name) } + + /* Initialize a new list head. */ +-#define INIT_LIST_HEAD(ptr) \ ++# define INIT_LIST_HEAD(ptr) \ + (ptr)->next = (ptr)->prev = (ptr) + + +@@ -49,6 +61,7 @@ list_add (list_t *newp, list_t *head) + newp->next = head->next; + newp->prev = head; + head->next->prev = newp; ++ atomic_write_barrier (); + head->next = newp; + } + +@@ -78,26 +91,28 @@ list_splice (list_t *add, list_t *head) + + + /* Get typed element from list at a given position. */ +-#define list_entry(ptr, type, member) \ ++# define list_entry(ptr, type, member) \ + ((type *) ((char *) (ptr) - (unsigned long) (&((type *) 0)->member))) + + + + /* Iterate forward over the elements of the list. */ +-#define list_for_each(pos, head) \ ++# define list_for_each(pos, head) \ + for (pos = (head)->next; pos != (head); pos = pos->next) + + + /* Iterate forward over the elements of the list. */ +-#define list_for_each_prev(pos, head) \ ++# define list_for_each_prev(pos, head) \ + for (pos = (head)->prev; pos != (head); pos = pos->prev) + + + /* Iterate backwards over the elements list. The list elements can be + removed from the list while doing this. */ +-#define list_for_each_prev_safe(pos, p, head) \ ++# define list_for_each_prev_safe(pos, p, head) \ + for (pos = (head)->prev, p = pos->prev; \ + pos != (head); \ + pos = p, p = pos->prev) + ++#endif /* _LIST_H */ ++ + #endif /* list.h */ +Index: glibc-2.12-2-gc4ccff1/nptl_db/thread_dbP.h +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/nptl_db/thread_dbP.h ++++ glibc-2.12-2-gc4ccff1/nptl_db/thread_dbP.h +@@ -29,6 +29,7 @@ + #include "proc_service.h" + #include "thread_db.h" + #include "../nptl/pthreadP.h" /* This is for *_BITMASK only. */ ++#include + + /* Indeces for the symbol names. */ + enum diff --git a/SOURCES/glibc-rh738763.patch b/SOURCES/glibc-rh738763.patch new file mode 100644 index 0000000..728464d --- /dev/null +++ b/SOURCES/glibc-rh738763.patch @@ -0,0 +1,17 @@ +2011-09-15 Ulrich Drepper + + * sysdeps/unix/sysv/linux/bits/in.h (IP_MULTICAST_ALL): Define. + Patch mostly by Neil Horman . + +Index: glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/bits/in.h +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/sysdeps/unix/sysv/linux/bits/in.h ++++ glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/bits/in.h +@@ -70,6 +70,7 @@ + #define IP_XFRM_POLICY 17 + #define IP_PASSSEC 18 + #define IP_TRANSPARENT 19 ++#define IP_MULTICAST_ALL 49 /* bool */ + + /* TProxy original addresses */ + #define IP_ORIGDSTADDR 20 diff --git a/SOURCES/glibc-rh739184.patch b/SOURCES/glibc-rh739184.patch new file mode 100644 index 0000000..cf12246 --- /dev/null +++ b/SOURCES/glibc-rh739184.patch @@ -0,0 +1,18 @@ +2010-06-10 Andreas Schwab + + * sysdeps/unix/sysv/linux/getpagesize.c: Don't assume AT_PAGESIZE + is always available. + +Index: glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/getpagesize.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/sysdeps/unix/sysv/linux/getpagesize.c ++++ glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/getpagesize.c +@@ -28,7 +28,7 @@ + int + __getpagesize () + { +-#ifdef __ASSUME_AT_PAGESIZE ++#if 0 && defined __ASSUME_AT_PAGESIZE + assert (GLRO(dl_pagesize) != 0); + return GLRO(dl_pagesize); + #else diff --git a/SOURCES/glibc-rh739971.patch b/SOURCES/glibc-rh739971.patch new file mode 100644 index 0000000..960c192 --- /dev/null +++ b/SOURCES/glibc-rh739971.patch @@ -0,0 +1,44 @@ +commit 32c76b63be605d12314e0c6ac2bd702c883d1423 +Author: Andreas Schwab +Date: Mon Sep 26 17:49:14 2011 +0200 + + Correctly reparse group line after enlarging the buffer + +diff --git a/nss/nss_files/files-initgroups.c b/nss/nss_files/files-initgroups.c +index 113abf2..c343b35 100644 +--- a/nss/nss_files/files-initgroups.c ++++ b/nss/nss_files/files-initgroups.c +@@ -52,8 +52,10 @@ _nss_files_initgroups_dyn (const char *user, gid_t group, long int *start, + gid_t *groups = *groupsp; + + /* We have to iterate over the entire file. */ +- while (!feof_unlocked (stream)) ++ while (1) + { ++ fpos_t pos; ++ fgetpos (stream, &pos); + ssize_t n = getline (&line, &linelen, stream); + if (n < 0) + { +@@ -64,9 +66,8 @@ _nss_files_initgroups_dyn (const char *user, gid_t group, long int *start, + } + + struct group grp; +- int res; +- while ((res = _nss_files_parse_grent (line, &grp, buffer, buflen, +- errnop)) == -1) ++ int res = _nss_files_parse_grent (line, &grp, buffer, buflen, errnop); ++ if (res == -1) + { + size_t newbuflen = 2 * buflen; + if (buffer_use_malloc || ! __libc_use_alloca (buflen + newbuflen)) +@@ -85,6 +86,9 @@ _nss_files_initgroups_dyn (const char *user, gid_t group, long int *start, + } + else + buffer = extend_alloca (buffer, buflen, newbuflen); ++ /* Reread current line, the parser has clobbered it. */ ++ fsetpos (stream, &pos); ++ continue; + } + + if (res > 0 && grp.gr_gid != group) diff --git a/SOURCES/glibc-rh740506-2.patch b/SOURCES/glibc-rh740506-2.patch new file mode 100644 index 0000000..adefea0 --- /dev/null +++ b/SOURCES/glibc-rh740506-2.patch @@ -0,0 +1,35 @@ + * malloc/arena.c (arena_get2): Avoid unnecessarily + retrieving #cpus from /proc. + * malloc/malloc.c (mALLOPt): Clamp arena_test based on + the value of arena_max. + +diff --git a/malloc/arena.c b/malloc/arena.c +index cb8548b..00f1da5 100644 +--- a/malloc/arena.c ++++ b/malloc/arena.c +@@ -828,7 +828,7 @@ arena_get2(mstate a_tsd, size_t size) + { + if (mp_.arena_max != 0) + narenas_limit = mp_.arena_max; +- else ++ else if (narenas > mp_.arena_test) + { + int n = __get_nprocs (); + +diff --git a/malloc/malloc.c b/malloc/malloc.c +index 8608083..f8d32da 100644 +--- a/malloc/malloc.c ++++ b/malloc/malloc.c +@@ -6134,6 +6134,12 @@ int mALLOPt(param_number, value) int par + break; + #endif + } ++#ifdef PER_THREAD ++ /* Clamp ARENA_TEST from ARENA_MAX to avoid creating too many ++ arenas. */ ++ if (mp_.arena_max > 0 && mp_.arena_max <= mp_.arena_test) ++ mp_.arena_test = mp_.arena_max - 1; ++#endif + (void)mutex_unlock(&av->mutex); + return res; + } diff --git a/SOURCES/glibc-rh740506.patch b/SOURCES/glibc-rh740506.patch new file mode 100644 index 0000000..6c74ccf --- /dev/null +++ b/SOURCES/glibc-rh740506.patch @@ -0,0 +1,132 @@ +2011-11-14 Andreas Schwab + + * malloc/arena.c (arena_get2): Don't call reused_arena when + _int_new_arena failed. + +2011-11-10 Andreas Schwab + + * malloc/arena.c (_int_new_arena): Don't increment narenas. + (reused_arena): Don't check arena limit. + (arena_get2): Atomically check arena limit. + +diff --git a/malloc/arena.c b/malloc/arena.c +index 9114fd2..042cac8 100644 +--- a/malloc/arena.c ++++ b/malloc/arena.c +@@ -747,8 +747,6 @@ _int_new_arena(size_t size) + main_arena.next = a; + + #ifdef PER_THREAD +- ++narenas; +- + (void)mutex_unlock(&list_lock); + #endif + +@@ -786,30 +784,6 @@ get_free_list (void) + static mstate + reused_arena (void) + { +- if (narenas <= mp_.arena_test) +- return NULL; +- +- static int narenas_limit; +- if (narenas_limit == 0) +- { +- if (mp_.arena_max != 0) +- narenas_limit = mp_.arena_max; +- else +- { +- int n = __get_nprocs (); +- +- if (n >= 1) +- narenas_limit = NARENAS_FROM_NCORES (n); +- else +- /* We have no information about the system. Assume two +- cores. */ +- narenas_limit = NARENAS_FROM_NCORES (2); +- } +- } +- +- if (narenas < narenas_limit) +- return NULL; +- + mstate result; + static mstate next_to_use; + if (next_to_use == NULL) +@@ -844,10 +818,41 @@ arena_get2(mstate a_tsd, size_t size) + mstate a; + + #ifdef PER_THREAD +- if ((a = get_free_list ()) == NULL +- && (a = reused_arena ()) == NULL) +- /* Nothing immediately available, so generate a new arena. */ +- a = _int_new_arena(size); ++ static size_t narenas_limit; ++ ++ a = get_free_list (); ++ if (a == NULL) ++ { ++ /* Nothing immediately available, so generate a new arena. */ ++ if (narenas_limit == 0) ++ { ++ if (mp_.arena_max != 0) ++ narenas_limit = mp_.arena_max; ++ else ++ { ++ int n = __get_nprocs (); ++ ++ if (n >= 1) ++ narenas_limit = NARENAS_FROM_NCORES (n); ++ else ++ /* We have no information about the system. Assume two ++ cores. */ ++ narenas_limit = NARENAS_FROM_NCORES (2); ++ } ++ } ++ repeat:; ++ size_t n = narenas; ++ if (__builtin_expect (n <= mp_.arena_test || n < narenas_limit, 0)) ++ { ++ if (catomic_compare_and_exchange_bool_acq(&narenas, n + 1, n)) ++ goto repeat; ++ a = _int_new_arena (size); ++ if (__builtin_expect (a != NULL, 1)) ++ return a; ++ catomic_decrement(&narenas); ++ } ++ a = reused_arena (); ++ } + #else + if(!a_tsd) + a = a_tsd = &main_arena; + +commit a5fb313cb7b7e692fd4684916aaa98e03ec7e8b6 +Author: Andreas Schwab +Date: Mon Nov 14 11:41:52 2011 +0100 + + Don't call reused_arena when _int_new_arena failed + +diff --git a/malloc/arena.c b/malloc/arena.c +index 042cac8..cb8548b 100644 +--- a/malloc/arena.c ++++ b/malloc/arena.c +@@ -844,14 +844,14 @@ arena_get2(mstate a_tsd, size_t size) + size_t n = narenas; + if (__builtin_expect (n <= mp_.arena_test || n < narenas_limit, 0)) + { +- if (catomic_compare_and_exchange_bool_acq(&narenas, n + 1, n)) ++ if (catomic_compare_and_exchange_bool_acq (&narenas, n + 1, n)) + goto repeat; + a = _int_new_arena (size); +- if (__builtin_expect (a != NULL, 1)) +- return a; +- catomic_decrement(&narenas); ++ if (__builtin_expect (a == NULL, 0)) ++ catomic_decrement (&narenas); + } +- a = reused_arena (); ++ else ++ a = reused_arena (); + } + #else + if(!a_tsd) diff --git a/SOURCES/glibc-rh749188.patch b/SOURCES/glibc-rh749188.patch new file mode 100644 index 0000000..43157cd --- /dev/null +++ b/SOURCES/glibc-rh749188.patch @@ -0,0 +1,32 @@ +commit 0e8131bb32cf026c87baeacb7abf2a9bdbbc4953 +Author: Andreas Schwab +Date: Sun May 8 21:48:03 2011 -0400 + + Remove .UTF-8 suffix from locale names when it is the only supported codeset + +diff --git a/localedata/SUPPORTED b/localedata/SUPPORTED +index d665961..e952c17 100644 +--- a/localedata/SUPPORTED ++++ b/localedata/SUPPORTED +@@ -46,8 +46,8 @@ ar_TN.UTF-8/UTF-8 \ + ar_TN/ISO-8859-6 \ + ar_YE.UTF-8/UTF-8 \ + ar_YE/ISO-8859-6 \ +-az_AZ.UTF-8/UTF-8 \ +-as_IN.UTF-8/UTF-8 \ ++az_AZ/UTF-8 \ ++as_IN/UTF-8 \ + ast_ES.UTF-8/UTF-8 \ + ast_ES/ISO-8859-15 \ + be_BY.UTF-8/UTF-8 \ +@@ -385,8 +385,8 @@ tr_CY/ISO-8859-9 \ + tr_TR.UTF-8/UTF-8 \ + tr_TR/ISO-8859-9 \ + ts_ZA/UTF-8 \ +-tt_RU.UTF-8/UTF-8 \ +-tt_RU.UTF-8@iqtelif/UTF-8 \ ++tt_RU/UTF-8 \ ++tt_RU@iqtelif/UTF-8 \ + ug_CN/UTF-8 \ + uk_UA.UTF-8/UTF-8 \ + uk_UA/KOI8-U \ diff --git a/SOURCES/glibc-rh750531.patch b/SOURCES/glibc-rh750531.patch new file mode 100644 index 0000000..a53e770 --- /dev/null +++ b/SOURCES/glibc-rh750531.patch @@ -0,0 +1,122 @@ +commit 69da074d7adfab7b57004a0dea9403a928e310a5 +Author: Ulrich Drepper +Date: Wed Nov 10 02:38:35 2010 -0500 + + Fix warnings in __bswap_16. + +diff --git a/sysdeps/i386/bits/byteswap.h b/sysdeps/i386/bits/byteswap.h +index 1f3fc5e..c246ae8 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/x86_64/bits/byteswap.h b/sysdeps/x86_64/bits/byteswap.h +index 08b38e8..e350fb8 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/SOURCES/glibc-rh751750.patch b/SOURCES/glibc-rh751750.patch new file mode 100644 index 0000000..6f9dd12 --- /dev/null +++ b/SOURCES/glibc-rh751750.patch @@ -0,0 +1,28 @@ +commit 7583a88d1c7170caad26966bcea8bfc2c92093ba +Author: Andreas Schwab +Date: Mon Nov 7 15:07:31 2011 +0100 + + Fix locking in _IO_flush_all_lockp + +diff --git a/libio/genops.c b/libio/genops.c +index 5d21c42..bb40c34 100644 +--- a/libio/genops.c ++++ b/libio/genops.c +@@ -826,7 +826,7 @@ _IO_flush_all_lockp (int do_lock) + int last_stamp; + + #ifdef _IO_MTSAFE_IO +- _IO_cleanup_region_start_noarg (flush_cleanup); ++ __libc_cleanup_region_start (do_lock, flush_cleanup, 0); + if (do_lock) + _IO_lock_lock (list_all_lock); + #endif +@@ -866,7 +866,7 @@ _IO_flush_all_lockp (int do_lock) + #ifdef _IO_MTSAFE_IO + if (do_lock) + _IO_lock_unlock (list_all_lock); +- _IO_cleanup_region_end (0); ++ __libc_cleanup_region_end (0); + #endif + + return result; diff --git a/SOURCES/glibc-rh752122.patch b/SOURCES/glibc-rh752122.patch new file mode 100644 index 0000000..0176dc9 --- /dev/null +++ b/SOURCES/glibc-rh752122.patch @@ -0,0 +1,260 @@ +2011-07-24 H.J. Lu + + * sysdeps/x86_64/dl-trampoline.S (_dl_runtime_profile): Simplify + AVX check. + +2011-08-20 Ulrich Drepper + + * sysdeps/x86_64/dl-trampoline.h: If MORE_CODE is defined, restore + the CFI state in the end. + * sysdeps/x86_64/dl-trampoline.S: Define MORE_CODE before first + inclusion of dl-trampoline.h. + Based on a patch by Jiri Olsa . + +2011-07-23 Ulrich Drepper + + * sysdeps/x86_64/dl-trampoline.S (_dl_runtime_profile): Fix one more + typo. + (_dl_x86_64_save_sse): Likewise. + +2011-07-22 Ulrich Drepper + + * sysdeps/x86_64/dl-trampoline.S (_dl_runtime_profile): Fix test for + OSXSAVE. + (_dl_x86_64_save_sse): Likewise. + +2011-07-21 Andreas Schwab + + * sysdeps/x86_64/dl-trampoline.S (_dl_runtime_profile): Fix last + change. + (_dl_x86_64_save_sse): Use correct AVX check. + +2011-07-20 Ulrich Drepper + + [BZ #13007] + * sysdeps/x86_64/dl-trampoline.S (_dl_runtime_profile): More complete + check for AVX enablement so that we don't crash with old kernels and + new hardware. + * elf/tst-audit4.c: Add same checks here. + * elf/tst-audit6.c: Likewise. + +Index: glibc-2.12-2-gc4ccff1/elf/tst-audit4.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/elf/tst-audit4.c ++++ glibc-2.12-2-gc4ccff1/elf/tst-audit4.c +@@ -6,16 +6,30 @@ + #include + #include + ++ ++static int ++avx_enabled (void) ++{ ++ unsigned int eax, ebx, ecx, edx; ++ ++ if (__get_cpuid (1, &eax, &ebx, &ecx, &edx) == 0 ++ || (ecx & (bit_AVX | bit_OSXSAVE)) != (bit_AVX | bit_OSXSAVE)) ++ return 0; ++ ++ /* Check the OS has AVX and SSE saving enabled. */ ++ asm ("xgetbv" : "=a" (eax), "=d" (edx) : "c" (0)); ++ ++ return (eax & 6) == 6; ++} ++ ++ + extern __m256i audit_test (__m256i, __m256i, __m256i, __m256i, + __m256i, __m256i, __m256i, __m256i); + int + main (void) + { +- unsigned int eax, ebx, ecx, edx; +- + /* Run AVX test only if AVX is supported. */ +- if (__get_cpuid (1, &eax, &ebx, &ecx, &edx) +- && (ecx & bit_AVX)) ++ if (avx_enabled ()) + { + __m256i ymm = _mm256_setzero_si256 (); + __m256i ret = audit_test (ymm, ymm, ymm, ymm, ymm, ymm, ymm, ymm); +Index: glibc-2.12-2-gc4ccff1/elf/tst-audit6.c +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/elf/tst-audit6.c ++++ glibc-2.12-2-gc4ccff1/elf/tst-audit6.c +@@ -8,14 +8,28 @@ + extern __m128i audit_test (__m128i, __m128i, __m128i, __m128i, + __m128i, __m128i, __m128i, __m128i); + +-int +-main (void) ++ ++static int ++avx_enabled (void) + { + unsigned int eax, ebx, ecx, edx; + ++ if (__get_cpuid (1, &eax, &ebx, &ecx, &edx) == 0 ++ || (ecx & (bit_AVX | bit_OSXSAVE)) != (bit_AVX | bit_OSXSAVE)) ++ return 0; ++ ++ /* Check the OS has AVX and SSE saving enabled. */ ++ asm ("xgetbv" : "=a" (eax), "=d" (edx) : "c" (0)); ++ ++ return (eax & 6) == 6; ++} ++ ++ ++int ++main (void) ++{ + /* Run AVX test only if AVX is supported. */ +- if (__get_cpuid (1, &eax, &ebx, &ecx, &edx) +- && (ecx & bit_AVX)) ++ if (avx_enabled ()) + { + __m128i xmm = _mm_setzero_si128 (); + __m128i ret = audit_test (xmm, xmm, xmm, xmm, xmm, xmm, xmm, xmm); +Index: glibc-2.12-2-gc4ccff1/sysdeps/x86_64/dl-trampoline.S +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/sysdeps/x86_64/dl-trampoline.S ++++ glibc-2.12-2-gc4ccff1/sysdeps/x86_64/dl-trampoline.S +@@ -139,24 +139,31 @@ L(have_avx): + movl $1, %eax + cpuid + movq %r11,%rbx # Restore rbx +- movl $1, %eax +- testl $(1 << 28), %ecx ++ xorl %eax, %eax ++ // AVX and XSAVE supported? ++ andl $((1 << 28) | (1 << 27)), %ecx ++ cmpl $((1 << 28) | (1 << 27)), %ecx + jne 2f +- negl %eax +-2: movl %eax, L(have_avx)(%rip) ++ xorl %ecx, %ecx ++ // Get XFEATURE_ENABLED_MASK ++ xgetbv ++ andl $0x6, %eax ++2: subl $0x5, %eax ++ movl %eax, L(have_avx)(%rip) + cmpl $0, %eax + + 1: js L(no_avx) + + # define RESTORE_AVX ++# define MORE_CODE + # include "dl-trampoline.h" + + .align 16 + L(no_avx): + # endif + +-# undef RESTORE_AVX +-# include "dl-trampoline.h" ++# undef RESTORE_AVX ++# include "dl-trampoline.h" + + cfi_endproc + .size _dl_runtime_profile, .-_dl_runtime_profile +@@ -176,11 +183,20 @@ _dl_x86_64_save_sse: + movl $1, %eax + cpuid + movq %r11,%rbx # Restore rbx +- movl $1, %eax +- testl $(1 << 28), %ecx ++ xorl %eax, %eax ++ // AVX and XSAVE supported? ++ andl $((1 << 28) | (1 << 27)), %ecx ++ cmpl $((1 << 28) | (1 << 27)), %ecx + jne 2f +- negl %eax +-2: movl %eax, L(have_avx)(%rip) ++ xorl %ecx, %ecx ++ // Get XFEATURE_ENABLED_MASK ++ xgetbv ++ andl $0x6, %eax ++ cmpl $0x6, %eax ++ // Nonzero if SSE and AVX state saving is enabled. ++ sete %al ++2: leal -1(%eax,%eax), %eax ++ movl %eax, L(have_avx)(%rip) + cmpl $0, %eax + + 1: js L(no_avx5) +Index: glibc-2.12-2-gc4ccff1/sysdeps/x86_64/dl-trampoline.h +=================================================================== +--- glibc-2.12-2-gc4ccff1.orig/sysdeps/x86_64/dl-trampoline.h ++++ glibc-2.12-2-gc4ccff1/sysdeps/x86_64/dl-trampoline.h +@@ -195,14 +195,14 @@ + _dl_call_pltexit. The La_x86_64_regs is being pointed by rsp now, + so we just need to allocate the sizeof(La_x86_64_retval) space on + the stack, since the alignment has already been taken care of. */ +-# ifdef RESTORE_AVX ++#ifdef RESTORE_AVX + /* sizeof(La_x86_64_retval). Need extra space for 2 SSE + registers to detect if xmm0/xmm1 registers are changed + by audit module. */ + subq $(LRV_SIZE + XMM_SIZE*2), %rsp +-# else ++#else + subq $LRV_SIZE, %rsp # sizeof(La_x86_64_retval) +-# endif ++#endif + movq %rsp, %rcx # La_x86_64_retval argument to %rcx. + + /* Fill in the La_x86_64_retval structure. */ +@@ -212,7 +212,7 @@ + movaps %xmm0, LRV_XMM0_OFFSET(%rcx) + movaps %xmm1, LRV_XMM1_OFFSET(%rcx) + +-# ifdef RESTORE_AVX ++#ifdef RESTORE_AVX + /* This is to support AVX audit modules. */ + vmovdqu %ymm0, LRV_VECTOR0_OFFSET(%rcx) + vmovdqu %ymm1, LRV_VECTOR1_OFFSET(%rcx) +@@ -221,14 +221,14 @@ + by audit module. */ + vmovdqa %xmm0, (LRV_SIZE)(%rcx) + vmovdqa %xmm1, (LRV_SIZE + XMM_SIZE)(%rcx) +-# endif ++#endif + + fstpt LRV_ST0_OFFSET(%rcx) + fstpt LRV_ST1_OFFSET(%rcx) + + movq 24(%rbx), %rdx # La_x86_64_regs argument to %rdx. + movq 40(%rbx), %rsi # Copy args pushed by PLT in register. +- movq 32(%rbx), %rdi # %rdi: link_map, %rsi: reloc_index ++ movq 32(%rbx), %rdi # %rdi: link_map, %rsi: reloc_index + call _dl_call_pltexit + + /* Restore return registers. */ +@@ -238,7 +238,7 @@ + movaps LRV_XMM0_OFFSET(%rsp), %xmm0 + movaps LRV_XMM1_OFFSET(%rsp), %xmm1 + +-# ifdef RESTORE_AVX ++#ifdef RESTORE_AVX + /* Check if xmm0/xmm1 registers are changed by audit module. */ + vpcmpeqq (LRV_SIZE)(%rsp), %xmm0, %xmm2 + vpmovmskb %xmm2, %esi +@@ -253,7 +253,7 @@ + vmovdqu LRV_VECTOR1_OFFSET(%rsp), %ymm1 + + 1: +-# endif ++#endif + + fldt LRV_ST1_OFFSET(%rsp) + fldt LRV_ST0_OFFSET(%rsp) +@@ -267,3 +267,10 @@ + # (eats the reloc index and link_map) + cfi_adjust_cfa_offset(-48) + retq ++ ++#ifdef MORE_CODE ++ cfi_adjust_cfa_offset(48) ++ cfi_rel_offset(%rbx, 0) ++ cfi_def_cfa_register(%rbx) ++# undef MORE_CODE ++#endif diff --git a/SOURCES/glibc-rh757888.patch b/SOURCES/glibc-rh757888.patch new file mode 100644 index 0000000..721d4a4 --- /dev/null +++ b/SOURCES/glibc-rh757888.patch @@ -0,0 +1,225 @@ +commit f3a6cc0a560a17f32a3e90d2f20501a53cab6058 +Author: Andreas Schwab +Date: Tue Nov 29 10:52:22 2011 +0100 + + Fix access after end of search string in regex matcher + +diff --git a/locale/weight.h b/locale/weight.h +index dc70a00..967e176 100644 +--- a/locale/weight.h ++++ b/locale/weight.h +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1996,1997,1998,1999,2000,2003,2004 Free Software Foundation, Inc. ++/* Copyright (C) 1996,1997,1998,1999,2000,2003,2004,2011 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Written by Ulrich Drepper, . + +@@ -20,7 +20,7 @@ + /* Find index of weight. */ + auto inline int32_t + __attribute ((always_inline)) +-findidx (const unsigned char **cpp) ++findidx (const unsigned char **cpp, size_t len) + { + int_fast32_t i = table[*(*cpp)++]; + const unsigned char *cp; +@@ -34,6 +34,7 @@ findidx (const unsigned char **cpp) + Search for the correct one. */ + cp = &extra[-i]; + usrc = *cpp; ++ --len; + while (1) + { + size_t nhere; +@@ -56,7 +57,7 @@ findidx (const unsigned char **cpp) + already. */ + size_t cnt; + +- for (cnt = 0; cnt < nhere; ++cnt) ++ for (cnt = 0; cnt < nhere && cnt < len; ++cnt) + if (cp[cnt] != usrc[cnt]) + break; + +@@ -79,13 +80,13 @@ findidx (const unsigned char **cpp) + size_t cnt; + size_t offset = 0; + +- for (cnt = 0; cnt < nhere; ++cnt) ++ for (cnt = 0; cnt < nhere && cnt < len; ++cnt) + if (cp[cnt] != usrc[cnt]) + break; + + if (cnt != nhere) + { +- if (cp[cnt] > usrc[cnt]) ++ if (cnt == len || cp[cnt] > usrc[cnt]) + { + /* Cannot be in this range. */ + cp += 2 * nhere; +diff --git a/locale/weightwc.h b/locale/weightwc.h +index 9ea1126..7862091 100644 +--- a/locale/weightwc.h ++++ b/locale/weightwc.h +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1996-2001,2003,2004,2005,2007 Free Software Foundation, Inc. ++/* Copyright (C) 1996-2001,2003,2004,2005,2007,2011 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Written by Ulrich Drepper, . + +@@ -20,7 +20,7 @@ + /* Find index of weight. */ + auto inline int32_t + __attribute ((always_inline)) +-findidx (const wint_t **cpp) ++findidx (const wint_t **cpp, size_t len) + { + wint_t ch = *(*cpp)++; + int32_t i = __collidx_table_lookup ((const char *) table, ch); +@@ -32,6 +32,7 @@ findidx (const wint_t **cpp) + /* Oh well, more than one sequence starting with this byte. + Search for the correct one. */ + const int32_t *cp = (const int32_t *) &extra[-i]; ++ --len; + while (1) + { + size_t nhere; +@@ -54,7 +55,7 @@ findidx (const wint_t **cpp) + already. */ + size_t cnt; + +- for (cnt = 0; cnt < nhere; ++cnt) ++ for (cnt = 0; cnt < nhere && cnt < len; ++cnt) + if (cp[cnt] != usrc[cnt]) + break; + +@@ -75,7 +76,7 @@ findidx (const wint_t **cpp) + size_t cnt; + size_t offset; + +- for (cnt = 0; cnt < nhere - 1; ++cnt) ++ for (cnt = 0; cnt < nhere - 1 && cnt < len; ++cnt) + if (cp[cnt] != usrc[cnt]) + break; + +diff --git a/posix/fnmatch_loop.c b/posix/fnmatch_loop.c +index 18a6667..72bd3ee 100644 +--- a/posix/fnmatch_loop.c ++++ b/posix/fnmatch_loop.c +@@ -412,7 +412,7 @@ FCT (pattern, string, string_end, no_leading_period, flags, ends, alloca_used) + _NL_CURRENT (LC_COLLATE, _NL_COLLATE_INDIRECTMB); + # endif + +- idx = findidx (&cp); ++ idx = findidx (&cp, 1); + if (idx != 0) + { + /* We found a table entry. Now see whether the +@@ -422,7 +422,7 @@ FCT (pattern, string, string_end, no_leading_period, flags, ends, alloca_used) + int32_t idx2; + const UCHAR *np = (const UCHAR *) n; + +- idx2 = findidx (&np); ++ idx2 = findidx (&np, string_end - n); + if (idx2 != 0 + && (idx >> 24) == (idx2 >> 24) + && len == weights[idx2 & 0xffffff]) +diff --git a/posix/regcomp.c b/posix/regcomp.c +index b238c08..34ee845 100644 +--- a/posix/regcomp.c ++++ b/posix/regcomp.c +@@ -1,5 +1,5 @@ + /* Extended regular expression matching and search library. +- Copyright (C) 2002-2007,2009,2010 Free Software Foundation, Inc. ++ Copyright (C) 2002-2007,2009,2010,2011 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Isamu Hasegawa . + +@@ -3409,19 +3409,18 @@ build_equiv_class (bitset_t sbcset, const unsigned char *name) + _NL_COLLATE_EXTRAMB); + indirect = (const int32_t *) _NL_CURRENT (LC_COLLATE, + _NL_COLLATE_INDIRECTMB); +- idx1 = findidx (&cp); +- if (BE (idx1 == 0 || cp < name + strlen ((const char *) name), 0)) ++ idx1 = findidx (&cp, -1); ++ if (BE (idx1 == 0 || *cp != '\0', 0)) + /* This isn't a valid character. */ + return REG_ECOLLATE; + + /* Build single byte matcing table for this equivalence class. */ +- char_buf[1] = (unsigned char) '\0'; + len = weights[idx1 & 0xffffff]; + for (ch = 0; ch < SBC_MAX; ++ch) + { + char_buf[0] = ch; + cp = char_buf; +- idx2 = findidx (&cp); ++ idx2 = findidx (&cp, 1); + /* + idx2 = table[ch]; + */ + +--- a/posix/regex_internal.h 2011-11-30 12:47:02.706567482 -0700 ++++ a/posix/regex_internal.h 2011-11-30 12:47:32.969558337 -0700 +@@ -756,7 +756,7 @@ + indirect = (const int32_t *) _NL_CURRENT (LC_COLLATE, + _NL_COLLATE_INDIRECTMB); + p = pstr->mbs + idx; +- tmp = findidx (&p); ++ tmp = findidx (&p, pstr->len - idx); + return p - pstr->mbs - idx; + } + else +diff --git a/posix/regexec.c b/posix/regexec.c +index 9e0c565..3ea810b 100644 +--- a/posix/regexec.c ++++ b/posix/regexec.c +@@ -3924,7 +3924,7 @@ check_node_accept_bytes (const re_dfa_t *dfa, int node_idx, + _NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAMB); + indirect = (const int32_t *) + _NL_CURRENT (LC_COLLATE, _NL_COLLATE_INDIRECTMB); +- int32_t idx = findidx (&cp); ++ int32_t idx = findidx (&cp, elem_len); + if (idx > 0) + for (i = 0; i < cset->nequiv_classes; ++i) + { +diff --git a/string/strcoll_l.c b/string/strcoll_l.c +index d8d1139..fb77d08 100644 +--- a/string/strcoll_l.c ++++ b/string/strcoll_l.c +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1995-1997,2002,2004,2007,2010 Free Software Foundation, Inc. ++/* Copyright (C) 1995-1997,2002,2004,2007,2010,2011 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Written by Ulrich Drepper , 1995. + +@@ -205,7 +205,7 @@ STRCOLL (s1, s2, l) + + while (*us1 != L('\0')) + { +- int32_t tmp = findidx (&us1); ++ int32_t tmp = findidx (&us1, -1); + rule1arr[idx1max] = tmp >> 24; + idx1arr[idx1max] = tmp & 0xffffff; + idx1cnt = idx1max++; +@@ -267,7 +267,7 @@ STRCOLL (s1, s2, l) + + while (*us2 != L('\0')) + { +- int32_t tmp = findidx (&us2); ++ int32_t tmp = findidx (&us2, -1); + rule2arr[idx2max] = tmp >> 24; + idx2arr[idx2max] = tmp & 0xffffff; + idx2cnt = idx2max++; +diff --git a/string/strxfrm_l.c b/string/strxfrm_l.c +index 220253c..b06556d 100644 +--- a/string/strxfrm_l.c ++++ b/string/strxfrm_l.c +@@ -176,7 +176,7 @@ STRXFRM (STRING_TYPE *dest, const STRING_TYPE *src, size_t n, __locale_t l) + idxmax = 0; + do + { +- int32_t tmp = findidx (&usrc); ++ int32_t tmp = findidx (&usrc, -1); + rulearr[idxmax] = tmp >> 24; + idxarr[idxmax] = tmp & 0xffffff; + diff --git a/SOURCES/glibc-rh766513.patch b/SOURCES/glibc-rh766513.patch new file mode 100644 index 0000000..3f629b4 --- /dev/null +++ b/SOURCES/glibc-rh766513.patch @@ -0,0 +1,14 @@ +diff -rup a/po/ja.po b/po/ja.po +--- a/po/ja.po 2010-05-04 05:27:23.000000000 -0600 ++++ b/po/ja.po 2012-02-07 12:21:03.023806370 -0700 +@@ -3549,8 +3549,8 @@ msgstr "%s: �����ʥ��ץ����Ǥ� -- %c\n + + #: posix/getopt.c:945 posix/getopt.c:948 + #, c-format +-msgid "%s: invalid option -- %c\n" +-msgstr "%s: ���ץ���󤬰㤤�ޤ� -- %c\n" ++msgid "%s: invalid option -- '%c'\n" ++msgstr "%s: ���ץ���󤬰㤤�ޤ� -- '%c'\n" + + #: posix/getopt.c:1003 posix/getopt.c:1022 posix/getopt.c:1234 + #: posix/getopt.c:1255 diff --git a/SOURCES/glibc-rh767146.patch b/SOURCES/glibc-rh767146.patch new file mode 100644 index 0000000..8252062 --- /dev/null +++ b/SOURCES/glibc-rh767146.patch @@ -0,0 +1,21 @@ +diff -rup a/elf/dl-load.c b/elf/dl-load.c +--- a/elf/dl-load.c 2012-02-03 10:59:58.917870716 -0700 ++++ b/elf/dl-load.c 2012-02-03 11:01:01.796580644 -0700 +@@ -1130,6 +1130,16 @@ _dl_map_object_from_fd (const char *name + = N_("ELF load command address/offset not properly aligned"); + goto call_lose; + } ++ if (__builtin_expect ((ph->p_offset + ph->p_filesz > st.st_size), 0)) ++ { ++ /* If the segment requires zeroing of part of its last ++ page, we'll crash when accessing the unmapped page. ++ There's still a possibility of a race, if the shared ++ object is truncated between the fxstat above and the ++ memset below. */ ++ errstring = N_("ELF load command past end of file"); ++ goto call_lose; ++ } + + c = &loadcmds[nloadcmds++]; + c->mapstart = ph->p_vaddr & ~(GLRO(dl_pagesize) - 1); +Only in b/elf: dl-load.c.orig diff --git a/SOURCES/glibc-rh767693-2.patch b/SOURCES/glibc-rh767693-2.patch new file mode 100644 index 0000000..4418ac6 --- /dev/null +++ b/SOURCES/glibc-rh767693-2.patch @@ -0,0 +1,79 @@ +Index: glibc-2.5-20061008T1257/sunrpc/svc_tcp.c +=================================================================== +--- glibc-2.5-20061008T1257.orig/sunrpc/svc_tcp.c ++++ glibc-2.5-20061008T1257/sunrpc/svc_tcp.c +@@ -50,6 +50,7 @@ static char sccsid[] = "@(#)svc_tcp.c 1. + #include + #include + #include ++#include + + #ifdef USE_IN_LIBIO + # include +@@ -249,6 +250,11 @@ again: + { + if (errno == EINTR) + goto again; ++ if (errno == EMFILE) ++ { ++ struct timespec ts = { .tv_sec = 0, .tv_nsec = 50000000 }; ++ __nanosleep(&ts , NULL); ++ } + return FALSE; + } + /* +Index: glibc-2.5-20061008T1257/sunrpc/svc_udp.c +=================================================================== +--- glibc-2.5-20061008T1257.orig/sunrpc/svc_udp.c ++++ glibc-2.5-20061008T1257/sunrpc/svc_udp.c +@@ -46,6 +46,7 @@ static char sccsid[] = "@(#)svc_udp.c 1. + #include + #include + #include ++#include + + #ifdef IP_PKTINFO + #include +@@ -277,8 +278,16 @@ again: + (int) su->su_iosz, 0, + (struct sockaddr *) &(xprt->xp_raddr), &len); + xprt->xp_addrlen = len; +- if (rlen == -1 && errno == EINTR) +- goto again; ++ if (rlen == -1) ++ { ++ if (errno == EINTR) ++ goto again; ++ if (errno == EMFILE) ++ { ++ struct timespec ts = { .tv_sec = 0, .tv_nsec = 50000000 }; ++ __nanosleep(&ts , NULL); ++ } ++ } + if (rlen < 16) /* < 4 32-bit ints? */ + return FALSE; + xdrs->x_op = XDR_DECODE; +Index: glibc-2.5-20061008T1257/sunrpc/svc_unix.c +=================================================================== +--- glibc-2.5-20061008T1257.orig/sunrpc/svc_unix.c ++++ glibc-2.5-20061008T1257/sunrpc/svc_unix.c +@@ -48,6 +48,7 @@ + #include + #include + #include ++#include + + #ifdef USE_IN_LIBIO + # include +@@ -247,6 +248,11 @@ again: + { + if (errno == EINTR) + goto again; ++ if (errno == EMFILE) ++ { ++ struct timespec ts = { .tv_sec = 0, .tv_nsec = 50000000 }; ++ __nanosleep(&ts , NULL); ++ } + return FALSE; + } + /* diff --git a/SOURCES/glibc-rh767693.patch b/SOURCES/glibc-rh767693.patch new file mode 100644 index 0000000..8f76beb --- /dev/null +++ b/SOURCES/glibc-rh767693.patch @@ -0,0 +1,89 @@ +commit 97ac2654b2d831acaa18a2b018b0736245903fd2 +Author: Ulrich Drepper +Date: Sat Dec 17 20:18:42 2011 -0500 + + Check values from TZ file header + + + [BZ #13506] + * time/tzfile.c (__tzfile_read): Check values from file header. + +diff -ru a/time/tzfile.c b/time/tzfile.c +--- a/time/tzfile.c 2010-05-04 11:27:23.000000000 +0000 ++++ b/time/tzfile.c 2011-12-19 06:39:49.875358578 +0000 +@@ -19,6 +19,7 @@ + + #include + #include ++#include + #include + #include + #include +@@ -234,23 +235,58 @@ + goto read_again; + } + ++ if (__builtin_expect (num_transitions ++ > ((SIZE_MAX - (__alignof__ (struct ttinfo) - 1)) ++ / (sizeof (time_t) + 1)), 0)) ++ goto lose; + total_size = num_transitions * (sizeof (time_t) + 1); + total_size = ((total_size + __alignof__ (struct ttinfo) - 1) + & ~(__alignof__ (struct ttinfo) - 1)); + types_idx = total_size; +- total_size += num_types * sizeof (struct ttinfo) + chars; ++ if (__builtin_expect (num_types ++ > (SIZE_MAX - total_size) / sizeof (struct ttinfo), 0)) ++ goto lose; ++ total_size += num_types * sizeof (struct ttinfo); ++ if (__builtin_expect (chars > SIZE_MAX - total_size, 0)) ++ goto lose; ++ total_size += chars; ++ if (__builtin_expect (__alignof__ (struct leap) - 1 ++ > SIZE_MAX - total_size, 0)) ++ goto lose; + total_size = ((total_size + __alignof__ (struct leap) - 1) + & ~(__alignof__ (struct leap) - 1)); + leaps_idx = total_size; ++ if (__builtin_expect (num_leaps ++ > (SIZE_MAX - total_size) / sizeof (struct leap), 0)) ++ goto lose; + total_size += num_leaps * sizeof (struct leap); +- tzspec_len = (sizeof (time_t) == 8 && trans_width == 8 +- ? st.st_size - (ftello (f) +- + num_transitions * (8 + 1) +- + num_types * 6 +- + chars +- + num_leaps * 12 +- + num_isstd +- + num_isgmt) - 1 : 0); ++ tzspec_len = 0; ++ if (sizeof (time_t) == 8 && trans_width == 8) ++ { ++ off_t rem = st.st_size - ftello (f); ++ if (__builtin_expect (rem < 0 ++ || (size_t) rem < (num_transitions * (8 + 1) ++ + num_types * 6 ++ + chars), 0)) ++ goto lose; ++ tzspec_len = (size_t) rem - (num_transitions * (8 + 1) ++ + num_types * 6 ++ + chars); ++ if (__builtin_expect (num_leaps > SIZE_MAX / 12 ++ || tzspec_len < num_leaps * 12, 0)) ++ goto lose; ++ tzspec_len -= num_leaps * 12; ++ if (__builtin_expect (tzspec_len < num_isstd, 0)) ++ goto lose; ++ tzspec_len -= num_isstd; ++ if (__builtin_expect (tzspec_len == 0 || tzspec_len - 1 < num_isgmt, 0)) ++ goto lose; ++ tzspec_len -= num_isgmt + 1; ++ if (__builtin_expect (SIZE_MAX - total_size < tzspec_len, 0)) ++ goto lose; ++ } ++ if (__builtin_expect (SIZE_MAX - total_size - tzspec_len < extra, 0)) ++ goto lose; + + /* Allocate enough memory including the extra block requested by the + caller. */ diff --git a/SOURCES/glibc-rh767746.patch b/SOURCES/glibc-rh767746.patch new file mode 100644 index 0000000..58d96d8 --- /dev/null +++ b/SOURCES/glibc-rh767746.patch @@ -0,0 +1,14 @@ +--- a/nptl/pthread_create.c 2011-12-13 11:41:37.000000000 -0700 ++++ b/nptl/pthread_create.c 2011-12-14 10:03:13.000000000 -0700 +@@ -440,8 +440,9 @@ + int err = ALLOCATE_STACK (iattr, &pd); + if (__builtin_expect (err != 0, 0)) + /* Something went wrong. Maybe a parameter of the attributes is +- invalid or we could not allocate memory. */ +- return err; ++ invalid or we could not allocate memory. Note we have to ++ translate error codes. */ ++ return err == ENOMEM ? EAGAIN : err; + + + /* Initialize the TCB. All initializations with zero should be diff --git a/SOURCES/glibc-rh771342.patch b/SOURCES/glibc-rh771342.patch new file mode 100644 index 0000000..0a49b8c --- /dev/null +++ b/SOURCES/glibc-rh771342.patch @@ -0,0 +1,155 @@ +2011-06-30 Ulrich Drepper + + * nptl-init.c (__nptl_set_robust): New function. + (pthread_functions): Add reference. + * npthreadP.h: Declare __nptl_set_robust. + * sysdeps/pthread/pthread-functions.h (pthread_functions): Add + ptr_set_robust member. + * sysdeps/unix/sysv/linux/fork.c: Call set_robust_list syscall in + child if threads are used. + +diff -Nrup a/nptl/nptl-init.c b/nptl/nptl-init.c +--- a/nptl/nptl-init.c 2011-12-20 00:29:54.645538691 -0700 ++++ b/nptl/nptl-init.c 2012-01-03 10:18:38.977513783 -0700 +@@ -69,6 +69,13 @@ extern void __libc_setup_tls (size_t tcb + #endif + + #ifdef SHARED ++static ++#else ++extern ++#endif ++void __nptl_set_robust (struct pthread *); ++ ++#ifdef SHARED + static void nptl_freeres (void); + + +@@ -131,13 +138,25 @@ static const struct pthread_functions pt + .ptr__nptl_deallocate_tsd = __nptl_deallocate_tsd, + .ptr__nptl_setxid = __nptl_setxid, + /* For now only the stack cache needs to be freed. */ +- .ptr_freeres = nptl_freeres ++ .ptr_freeres = nptl_freeres, ++ .ptr_set_robust = __nptl_set_robust + }; + # define ptr_pthread_functions &pthread_functions + #else + # define ptr_pthread_functions NULL + #endif + ++#ifdef SHARED ++static ++#endif ++void ++__nptl_set_robust (struct pthread *self) ++{ ++ INTERNAL_SYSCALL_DECL (err); ++ INTERNAL_SYSCALL (set_robust_list, err, 2, &self->robust_head, ++ sizeof (struct robust_list_head)); ++} ++ + + #ifdef SHARED + /* This function is called indirectly from the freeres code in libc. */ +diff -Nrup a/nptl/pthreadP.h b/nptl/pthreadP.h +--- a/nptl/pthreadP.h 2010-05-04 05:27:23.000000000 -0600 ++++ b/nptl/pthreadP.h 2012-01-03 10:12:35.599269269 -0700 +@@ -555,17 +555,20 @@ extern void __pthread_cleanup_pop_restor + + /* Old cleanup interfaces, still used in libc.so. */ + extern void _pthread_cleanup_push (struct _pthread_cleanup_buffer *buffer, +- void (*routine) (void *), void *arg); ++ void (*routine) (void *), void *arg); + extern void _pthread_cleanup_pop (struct _pthread_cleanup_buffer *buffer, +- int execute); ++ int execute); + extern void _pthread_cleanup_push_defer (struct _pthread_cleanup_buffer *buffer, +- void (*routine) (void *), void *arg); ++ void (*routine) (void *), void *arg); + extern void _pthread_cleanup_pop_restore (struct _pthread_cleanup_buffer *buffer, +- int execute); ++ int execute); + + extern void __nptl_deallocate_tsd (void) attribute_hidden; + + extern int __nptl_setxid (struct xid_command *cmdp) attribute_hidden; ++#ifndef SHARED ++extern void __nptl_set_robust (struct pthread *self); ++#endif + + extern void __free_stacks (size_t limit) attribute_hidden; + +diff -Nrup a/nptl/sysdeps/pthread/pthread-functions.h b/nptl/sysdeps/pthread/pthread-functions.h +--- a/nptl/sysdeps/pthread/pthread-functions.h 2010-05-04 05:27:23.000000000 -0600 ++++ b/nptl/sysdeps/pthread/pthread-functions.h 2012-01-03 10:12:35.639269301 -0700 +@@ -97,6 +97,7 @@ struct pthread_functions + void (*ptr__nptl_deallocate_tsd) (void); + int (*ptr__nptl_setxid) (struct xid_command *); + void (*ptr_freeres) (void); ++ void (*ptr_set_robust) (struct pthread *); + }; + + /* Variable in libc.so. */ +diff -Nrup a/nptl/sysdeps/unix/sysv/linux/fork.c b/nptl/sysdeps/unix/sysv/linux/fork.c +--- a/nptl/sysdeps/unix/sysv/linux/fork.c 2010-05-04 05:27:23.000000000 -0600 ++++ b/nptl/sysdeps/unix/sysv/linux/fork.c 2012-01-03 10:12:35.649269309 -0700 +@@ -29,6 +29,7 @@ + #include + #include + #include ++#include + + + unsigned long int *__fork_generation_pointer; +@@ -86,8 +87,8 @@ __libc_fork (void) + just go away. The unloading code works in the order of the + list. + +- While executing the registered handlers we are building a +- list of all the entries so that we can go backward later on. */ ++ While executing the registered handlers we are building a ++ list of all the entries so that we can go backward later on. */ + while (1) + { + /* Execute the handler if there is one. */ +@@ -154,6 +155,24 @@ __libc_fork (void) + GL(dl_cpuclock_offset) = now; + #endif + ++#ifdef __NR_set_robust_list ++ /* Initialize the robust mutex list which has been reset during ++ the fork. We do not check for errors since if it fails here ++ it failed at process start as well and noone could have used ++ robust mutexes. We also do not have to set ++ self->robust_head.futex_offset since we inherit the correct ++ value from the parent. */ ++# ifdef SHARED ++ if (__libc_pthread_functions.ptr_set_robust != NULL) ++ PTHFCT_CALL (ptr_set_robust, (self)); ++# else ++ extern __typeof (__nptl_set_robust) __nptl_set_robust ++ __attribute__((weak)); ++ if (__builtin_expect (__nptl_set_robust != NULL, 0)) ++ __nptl_set_robust (self); ++# endif ++#endif ++ + /* Reset the file list. These are recursive mutexes. */ + fresetlockfiles (); + +@@ -170,10 +189,10 @@ __libc_fork (void) + allp->handler->child_handler (); + + /* Note that we do not have to wake any possible waiter. +- This is the only thread in the new process. The count +- may have been bumped up by other threads doing a fork. +- We reset it to 1, to avoid waiting for non-existing +- thread(s) to release the count. */ ++ This is the only thread in the new process. The count ++ may have been bumped up by other threads doing a fork. ++ We reset it to 1, to avoid waiting for non-existing ++ thread(s) to release the count. */ + allp->handler->refcntr = 1; + + /* XXX We could at this point look through the object pool diff --git a/SOURCES/glibc-rh782585.patch b/SOURCES/glibc-rh782585.patch new file mode 100644 index 0000000..a554d4b --- /dev/null +++ b/SOURCES/glibc-rh782585.patch @@ -0,0 +1,329 @@ +diff -rup a/elf/dl-close.c b/elf/dl-close.c +--- a/elf/dl-close.c 2012-01-19 12:59:42.759484350 -0700 ++++ b/elf/dl-close.c 2012-01-19 14:10:20.439263806 -0700 +@@ -223,7 +223,7 @@ _dl_close_worker (struct link_map *map) + } + + /* Sort the entries. */ +- _dl_sort_fini (ns->_ns_loaded, maps, nloaded, used, nsid); ++ _dl_sort_fini (maps, nloaded, used, nsid); + + /* Call all termination functions at once. */ + #ifdef SHARED +diff -rup a/elf/dl-deps.c b/elf/dl-deps.c +--- a/elf/dl-deps.c 2012-01-19 12:59:42.716484301 -0700 ++++ b/elf/dl-deps.c 2012-01-19 13:52:35.223720556 -0700 +@@ -614,51 +614,67 @@ Filters not supported with LD_TRACE_PREL + map->l_searchlist.r_list[i]->l_reserved = 0; + } + +- /* Now determine the order in which the initialization has to happen. */ ++ /* Sort the initializer list to take dependencies into account. The binary ++ itself will always be initialize last. */ + memcpy (l_initfini, map->l_searchlist.r_list, + nlist * sizeof (struct link_map *)); +- /* We can skip looking for the binary itself which is at the front +- of the search list. Look through the list backward so that circular +- dependencies are not changing the order. */ +- for (i = 1; i < nlist; ++i) ++ if (__builtin_expect (nlist > 1, 1)) + { +- struct link_map *l = map->l_searchlist.r_list[i]; +- unsigned int j; +- unsigned int k; +- +- /* Find the place in the initfini list where the map is currently +- located. */ +- for (j = 1; l_initfini[j] != l; ++j) +- ; +- +- /* Find all object for which the current one is a dependency and +- move the found object (if necessary) in front. */ +- for (k = j + 1; k < nlist; ++k) ++ /* We can skip looking for the binary itself which is at the front ++ of the search list. */ ++ i = 1; ++ unsigned int seen[nlist]; ++ memset (seen, 0, nlist * sizeof (seen[0])); ++ while (1) + { +- struct link_map **runp; +- +- runp = l_initfini[k]->l_initfini; +- if (runp != NULL) ++ /* Keep track of which object we looked at this round. */ ++ ++seen[i]; ++ struct link_map *thisp = l_initfini[i]; ++ ++ /* Find the last object in the list for which the current one is ++ a dependency and move the current object behind the object ++ with the dependency. */ ++ unsigned int k = nlist - 1; ++ while (k > i) + { +- while (*runp != NULL) +- if (__builtin_expect (*runp++ == l, 0)) +- { +- struct link_map *here = l_initfini[k]; +- +- /* Move it now. */ +- memmove (&l_initfini[j] + 1, &l_initfini[j], +- (k - j) * sizeof (struct link_map *)); +- l_initfini[j] = here; +- +- /* Don't insert further matches before the last +- entry moved to the front. */ +- ++j; ++ struct link_map **runp = l_initfini[k]->l_initfini; ++ if (runp != NULL) ++ /* Look through the dependencies of the object. */ ++ while (*runp != NULL) ++ if (__builtin_expect (*runp++ == thisp, 0)) ++ { ++ /* Move the current object to the back past the last ++ object with it as the dependency. */ ++ memmove (&l_initfini[i], &l_initfini[i + 1], ++ (k - i) * sizeof (l_initfini[0])); ++ l_initfini[k] = thisp; ++ ++ if (seen[i + 1] > nlist - i - 2) ++ { ++ ++i; ++ goto next_clear; ++ } ++ ++ unsigned int this_seen = seen[i]; ++ memmove (&seen[i], &seen[i + 1], ++ (k - i) * sizeof (seen[0])); ++ seen[k] = this_seen; ++ ++ goto next; ++ } + +- break; +- } ++ --k; + } ++ ++ if (++i == nlist) ++ break; ++ next_clear: ++ memset (&seen[i], 0, (nlist - i) * sizeof (seen[0])); ++ ++ next:; + } + } ++ + /* Terminate the list of dependencies. */ + l_initfini[nlist] = NULL; + atomic_write_barrier (); +diff -rup a/elf/dl-fini.c b/elf/dl-fini.c +--- a/elf/dl-fini.c 2010-05-04 05:27:23.000000000 -0600 ++++ b/elf/dl-fini.c 2012-01-19 13:56:38.653842046 -0700 +@@ -1,5 +1,6 @@ + /* Call the termination functions of loaded shared objects. +- Copyright (C) 1995,96,1998-2002,2004-2005,2009 Free Software Foundation, Inc. ++ Copyright (C) 1995,96,1998-2002,2004-2005,2009,2011 ++ Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or +@@ -29,89 +30,100 @@ typedef void (*fini_t) (void); + + void + internal_function +-_dl_sort_fini (struct link_map *l, struct link_map **maps, size_t nmaps, +- char *used, Lmid_t ns) ++_dl_sort_fini (struct link_map **maps, size_t nmaps, char *used, Lmid_t ns) + { +- if (ns == LM_ID_BASE) +- /* The main executable always comes first. */ +- l = l->l_next; +- +- for (; l != NULL; l = l->l_next) +- /* Do not handle ld.so in secondary namespaces and object which +- are not removed. */ +- if (l == l->l_real && l->l_idx != -1) +- { +- /* Find the place in the 'maps' array. */ +- unsigned int j; +- for (j = ns == LM_ID_BASE ? 1 : 0; maps[j] != l; ++j) +- assert (j < nmaps); +- +- /* Find all object for which the current one is a dependency +- and move the found object (if necessary) in front. */ +- for (unsigned int k = j + 1; k < nmaps; ++k) +- { +- struct link_map **runp = maps[k]->l_initfini; +- if (runp != NULL) +- { +- while (*runp != NULL) +- if (*runp == l) +- { +- struct link_map *here = maps[k]; ++ /* A list of one element need not be sorted. */ ++ if (nmaps == 1) ++ return; ++ ++ /* We can skip looking for the binary itself which is at the front ++ of the search list for the main namespace. */ ++ unsigned int i = ns == LM_ID_BASE; ++ unsigned int seen[nmaps]; ++ memset (seen, 0, nmaps * sizeof (seen[0])); ++ while (1) ++ { ++ /* Keep track of which object we looked at this round. */ ++ ++seen[i]; ++ struct link_map *thisp = maps[i]; ++ ++ /* Do not handle ld.so in secondary namespaces and object which ++ are not removed. */ ++ if (thisp != thisp->l_real || thisp->l_idx == -1) ++ goto skip; ++ ++ /* Find the last object in the list for which the current one is ++ a dependency and move the current object behind the object ++ with the dependency. */ ++ unsigned int k = nmaps - 1; ++ while (k > i) ++ { ++ struct link_map **runp = maps[k]->l_initfini; ++ if (runp != NULL) ++ /* Look through the dependencies of the object. */ ++ while (*runp != NULL) ++ if (__builtin_expect (*runp++ == thisp, 0)) ++ { ++ move: ++ /* Move the current object to the back past the last ++ object with it as the dependency. */ ++ memmove (&maps[i], &maps[i + 1], ++ (k - i) * sizeof (maps[0])); ++ maps[k] = thisp; + +- /* Move it now. */ +- memmove (&maps[j] + 1, +- &maps[j], (k - j) * sizeof (struct link_map *)); +- maps[j] = here; ++ if (used != NULL) ++ { ++ char here_used = used[i]; ++ memmove (&used[i], &used[i + 1], ++ (k - i) * sizeof (used[0])); ++ used[k] = here_used; ++ } + +- if (used != NULL) +- { +- char here_used = used[k]; ++ if (seen[i + 1] > nmaps - i - 2) ++ { ++ ++i; ++ goto next_clear; ++ } + +- memmove (&used[j] + 1, +- &used[j], (k - j) * sizeof (char)); +- used[j] = here_used; +- } ++ unsigned int this_seen = seen[i]; ++ memmove (&seen[i], &seen[i + 1], (k - i) * sizeof (seen[0])); ++ seen[k] = this_seen; + +- ++j; ++ goto next; ++ } + +- break; +- } +- else +- ++runp; +- } +- +- if (__builtin_expect (maps[k]->l_reldeps != NULL, 0)) +- { +- unsigned int m = maps[k]->l_reldeps->act; +- struct link_map **relmaps = &maps[k]->l_reldeps->list[0]; ++ if (__builtin_expect (maps[k]->l_reldeps != NULL, 0)) ++ { ++ unsigned int m = maps[k]->l_reldeps->act; ++ struct link_map **relmaps = &maps[k]->l_reldeps->list[0]; + +- while (m-- > 0) ++ /* Look through the relocation dependencies of the object. */ ++ while (m-- > 0) ++ if (__builtin_expect (relmaps[m] == thisp, 0)) + { +- if (relmaps[m] == l) +- { +- struct link_map *here = maps[k]; +- +- /* Move it now. */ +- memmove (&maps[j] + 1, +- &maps[j], +- (k - j) * sizeof (struct link_map *)); +- maps[j] = here; +- +- if (used != NULL) +- { +- char here_used = used[k]; +- +- memmove (&used[j] + 1, +- &used[j], (k - j) * sizeof (char)); +- used[j] = here_used; +- } +- +- break; +- } ++ /* If a cycle exists with a link time dependency, ++ preserve the latter. */ ++ struct link_map **runp = thisp->l_initfini; ++ if (runp != NULL) ++ while (*runp != NULL) ++ if (__builtin_expect (*runp++ == maps[k], 0)) ++ goto ignore; ++ goto move; + } +- } +- } +- } ++ ignore:; ++ } ++ ++ --k; ++ } ++ ++ skip: ++ if (++i == nmaps) ++ break; ++ next_clear: ++ memset (&seen[i], 0, (nmaps - i) * sizeof (seen[0])); ++ ++ next:; ++ } + } + + +@@ -196,9 +208,8 @@ _dl_fini (void) + assert (ns == LM_ID_BASE || i == nloaded || i == nloaded - 1); + nmaps = i; + +- if (nmaps != 0) +- /* Now we have to do the sorting. */ +- _dl_sort_fini (GL(dl_ns)[ns]._ns_loaded, maps, nmaps, NULL, ns); ++ /* Now we have to do the sorting. */ ++ _dl_sort_fini (maps, nmaps, NULL, ns); + + /* We do not rely on the linked list of loaded object anymore from + this point on. We have our own list here (maps). The various +diff -rup a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h +--- a/sysdeps/generic/ldsodefs.h 2012-01-19 12:59:42.446483997 -0700 ++++ b/sysdeps/generic/ldsodefs.h 2012-01-19 14:16:36.242453532 -0700 +@@ -947,7 +947,7 @@ extern void _dl_init (struct link_map *m + extern void _dl_fini (void) internal_function; + + /* Sort array MAPS according to dependencies of the contained objects. */ +-extern void _dl_sort_fini (struct link_map *l, struct link_map **maps, ++extern void _dl_sort_fini (struct link_map **maps, + size_t nmaps, char *used, Lmid_t ns) + internal_function; + diff --git a/SOURCES/glibc-rh783979.patch b/SOURCES/glibc-rh783979.patch new file mode 100644 index 0000000..7540525 --- /dev/null +++ b/SOURCES/glibc-rh783979.patch @@ -0,0 +1,12 @@ +diff -rup a/sysdeps/powerpc/powerpc64/Makefile b/sysdeps/powerpc/powerpc64/Makefile +--- a/sysdeps/powerpc/powerpc64/Makefile 2012-02-01 09:34:07.018768021 -0700 ++++ b/sysdeps/powerpc/powerpc64/Makefile 2012-02-01 09:35:28.813356195 -0700 +@@ -31,7 +31,7 @@ elide-routines.os += hp-timing + ifneq ($(elf),no) + # The initfini generation code doesn't work in the presence of -fPIC, so + # we use -fpic instead which is much better. +-CFLAGS-initfini.s += -fpic -O1 ++CFLAGS-initfini.s += -fpic -O1 -fno-inline + endif + CFLAGS-libc-start.c += -fno-asynchronous-unwind-tables + endif diff --git a/SOURCES/glibc-rh784402.patch b/SOURCES/glibc-rh784402.patch new file mode 100644 index 0000000..d75773e --- /dev/null +++ b/SOURCES/glibc-rh784402.patch @@ -0,0 +1,166 @@ +commit 3e1aa84e7f9f38815f5db9cd7654b1a9497cf6e4 +Author: Ulrich Drepper +Date: Fri Jan 20 22:39:54 2012 -0500 + + Do not cache negative results in nscd if these are transient + +diff -rup a/nscd/aicache.c b/nscd/aicache.c +--- a/nscd/aicache.c 2012-01-24 20:32:58.906826425 -0700 ++++ b/nscd/aicache.c 2012-01-24 20:42:17.663968882 -0700 +@@ -511,9 +511,17 @@ next_nip: + if (fd != -1) + TEMP_FAILURE_RETRY (send (fd, ¬found, total, MSG_NOSIGNAL)); + +- dataset = mempool_alloc (db, sizeof (struct dataset) + req->key_len, 1); +- /* If we cannot permanently store the result, so be it. */ +- if (dataset != NULL) ++ /* If we have a transient error or cannot permanently store the ++ result, so be it. */ ++ if (rc4 == EAGAIN || __builtin_expect (db->negtimeout == 0, 0)) ++ { ++ /* Mark the old entry as obsolete. */ ++ if (dh != NULL) ++ dh->usable = false; ++ dataset = NULL; ++ } ++ else if ((dataset = mempool_alloc (db, (sizeof (struct dataset) ++ + req->key_len), 1)) != NULL) + { + dataset->head.allocsize = sizeof (struct dataset) + req->key_len; + dataset->head.recsize = total; +diff -rup a/nscd/grpcache.c b/nscd/grpcache.c +--- a/nscd/grpcache.c 2012-01-24 20:32:58.910826427 -0700 ++++ b/nscd/grpcache.c 2012-01-24 20:42:17.666968883 -0700 +@@ -114,13 +114,21 @@ cache_addgr (struct database_dyn *db, in + case. */ + total = sizeof (notfound); + +- written = TEMP_FAILURE_RETRY (send (fd, ¬found, total, +- MSG_NOSIGNAL)); ++ if (fd != -1) ++ written = TEMP_FAILURE_RETRY (send (fd, ¬found, total, ++ MSG_NOSIGNAL)); ++ else ++ written = total; + +- dataset = mempool_alloc (db, sizeof (struct dataset) + req->key_len, +- 1); +- /* If we cannot permanently store the result, so be it. */ +- if (dataset != NULL) ++ /* If we have a transient error or cannot permanently store ++ the result, so be it. */ ++ if (errno == EAGAIN || __builtin_expect (db->negtimeout == 0, 0)) ++ { ++ /* Mark the old entry as obsolete. */ ++ if (dh != NULL) ++ dh->usable = false; ++ } ++ else if ((dataset = mempool_alloc (db, sizeof (struct dataset) + req->key_len, 1)) != NULL) + { + dataset->head.allocsize = sizeof (struct dataset) + req->key_len; + dataset->head.recsize = total; +diff -rup a/nscd/hstcache.c b/nscd/hstcache.c +--- a/nscd/hstcache.c 2012-01-24 20:32:58.911826427 -0700 ++++ b/nscd/hstcache.c 2012-01-24 20:42:17.668968883 -0700 +@@ -141,10 +141,16 @@ cache_addhst (struct database_dyn *db, i + MSG_NOSIGNAL)) != total) + all_written = false; + +- dataset = mempool_alloc (db, sizeof (struct dataset) + req->key_len, +- 1); +- /* If we cannot permanently store the result, so be it. */ +- if (dataset != NULL) ++ /* If we have a transient error or cannot permanently store ++ the result, so be it. */ ++ if (errval == EAGAIN || __builtin_expect (db->negtimeout == 0, 0)) ++ { ++ /* Mark the old entry as obsolete. */ ++ if (dh != NULL) ++ dh->usable = false; ++ } ++ else if ((dataset = mempool_alloc (db, (sizeof (struct dataset) ++ + req->key_len), 1)) != NULL) + { + dataset->head.allocsize = sizeof (struct dataset) + req->key_len; + dataset->head.recsize = total; +diff -rup a/nscd/initgrcache.c b/nscd/initgrcache.c +--- a/nscd/initgrcache.c 2012-01-24 20:32:58.912826427 -0700 ++++ b/nscd/initgrcache.c 2012-01-24 20:42:17.671968883 -0700 +@@ -202,10 +202,16 @@ addinitgroupsX (struct database_dyn *db, + written = TEMP_FAILURE_RETRY (send (fd, ¬found, total, + MSG_NOSIGNAL)); + +- dataset = mempool_alloc (db, sizeof (struct dataset) + req->key_len, +- 1); +- /* If we cannot permanently store the result, so be it. */ +- if (dataset != NULL) ++ /* If we have a transient error or cannot permanently store ++ the result, so be it. */ ++ if (all_tryagain || __builtin_expect (db->negtimeout == 0, 0)) ++ { ++ /* Mark the old entry as obsolete. */ ++ if (dh != NULL) ++ dh->usable = false; ++ } ++ else if ((dataset = mempool_alloc (db, (sizeof (struct dataset) ++ + req->key_len), 1)) != NULL) + { + dataset->head.allocsize = sizeof (struct dataset) + req->key_len; + dataset->head.recsize = total; +diff -rup a/nscd/pwdcache.c b/nscd/pwdcache.c +--- a/nscd/pwdcache.c 2012-01-24 20:32:58.914826427 -0700 ++++ b/nscd/pwdcache.c 2012-01-24 20:42:17.671968883 -0700 +@@ -124,10 +124,16 @@ cache_addpw (struct database_dyn *db, in + written = TEMP_FAILURE_RETRY (send (fd, ¬found, total, + MSG_NOSIGNAL)); + +- dataset = mempool_alloc (db, sizeof (struct dataset) + req->key_len, +- 1); +- /* If we cannot permanently store the result, so be it. */ +- if (dataset != NULL) ++ /* If we have a transient error or cannot permanently store ++ the result, so be it. */ ++ if (errno == EAGAIN || __builtin_expect (db->negtimeout == 0, 0)) ++ { ++ /* Mark the old entry as obsolete. */ ++ if (dh != NULL) ++ dh->usable = false; ++ } ++ else if ((dataset = mempool_alloc (db, (sizeof (struct dataset) ++ + req->key_len), 1)) != NULL) + { + dataset->head.allocsize = sizeof (struct dataset) + req->key_len; + dataset->head.recsize = total; +diff -rup a/nscd/servicescache.c b/nscd/servicescache.c +--- a/nscd/servicescache.c 2012-01-24 20:32:58.915826427 -0700 ++++ b/nscd/servicescache.c 2012-01-24 20:42:17.672968884 -0700 +@@ -102,15 +102,22 @@ cache_addserv (struct database_dyn *db, + { + /* We have no data. This means we send the standard reply for this + case. */ +- total = sizeof (notfound); ++ written = total = sizeof (notfound); + +- written = TEMP_FAILURE_RETRY (send (fd, ¬found, total, +- MSG_NOSIGNAL)); ++ if (fd != -1) ++ written = TEMP_FAILURE_RETRY (send (fd, ¬found, total, ++ MSG_NOSIGNAL)); + +- dataset = mempool_alloc (db, sizeof (struct dataset) + req->key_len, +- 1); +- /* If we cannot permanently store the result, so be it. */ +- if (dataset != NULL) ++ /* If we have a transient error or cannot permanently store ++ the result, so be it. */ ++ if (errval == EAGAIN || __builtin_expect (db->negtimeout == 0, 0)) ++ { ++ /* Mark the old entry as obsolete. */ ++ if (dh != NULL) ++ dh->usable = false; ++ } ++ else if ((dataset = mempool_alloc (db, (sizeof (struct dataset) ++ + req->key_len), 1)) != NULL) + { + dataset->head.allocsize = sizeof (struct dataset) + req->key_len; + dataset->head.recsize = total; diff --git a/SOURCES/glibc-rh785984.patch b/SOURCES/glibc-rh785984.patch new file mode 100644 index 0000000..80ba5e8 --- /dev/null +++ b/SOURCES/glibc-rh785984.patch @@ -0,0 +1,20 @@ +diff -rup a/localedata/locales/zh_CN b/localedata/locales/zh_CN +--- a/localedata/locales/zh_CN 2006-07-30 16:19:43.000000000 -0600 ++++ b/localedata/locales/zh_CN 2012-01-30 21:24:46.905115483 -0700 +@@ -108,11 +108,11 @@ day "";/ + "";/ + "" + +-abmon "";"";/ +- "";"";/ +- "";"";/ +- "";"";/ +- "";"";/ ++abmon "";"";/ ++ "";"";/ ++ "";"";/ ++ "";"";/ ++ "";"";/ + "";"" + + mon "";"";"";/ diff --git a/SOURCES/glibc-rh788959-2.patch b/SOURCES/glibc-rh788959-2.patch new file mode 100644 index 0000000..1064640 --- /dev/null +++ b/SOURCES/glibc-rh788959-2.patch @@ -0,0 +1,153 @@ +diff -rcp a/nscd/grpcache.c b/nscd/grpcache.c +*** a/nscd/grpcache.c Wed Apr 11 12:50:07 2012 +--- b/nscd/grpcache.c Wed Apr 11 21:45:58 2012 +*************** cache_addgr (struct database_dyn *db, in +*** 178,184 **** + char *cp; + const size_t key_len = strlen (key); + const size_t buf_len = 3 * sizeof (grp->gr_gid) + key_len + 1; +! char *buf = alloca (buf_len); + ssize_t n; + size_t cnt; + +--- 178,185 ---- + char *cp; + const size_t key_len = strlen (key); + const size_t buf_len = 3 * sizeof (grp->gr_gid) + key_len + 1; +! size_t alloca_used = 0; +! char *buf = alloca_account (buf_len, alloca_used); + ssize_t n; + size_t cnt; + +*************** cache_addgr (struct database_dyn *db, in +*** 190,196 **** + /* Determine the length of all members. */ + while (grp->gr_mem[gr_mem_cnt]) + ++gr_mem_cnt; +! gr_mem_len = (uint32_t *) alloca (gr_mem_cnt * sizeof (uint32_t)); + for (gr_mem_cnt = 0; grp->gr_mem[gr_mem_cnt]; ++gr_mem_cnt) + { + gr_mem_len[gr_mem_cnt] = strlen (grp->gr_mem[gr_mem_cnt]) + 1; +--- 191,198 ---- + /* Determine the length of all members. */ + while (grp->gr_mem[gr_mem_cnt]) + ++gr_mem_cnt; +! gr_mem_len = (uint32_t *) alloca_account (gr_mem_cnt * sizeof (uint32_t), +! alloca_used); + for (gr_mem_cnt = 0; grp->gr_mem[gr_mem_cnt]; ++gr_mem_cnt) + { + gr_mem_len[gr_mem_cnt] = strlen (grp->gr_mem[gr_mem_cnt]) + 1; +*************** cache_addgr (struct database_dyn *db, in +*** 205,214 **** + change. Allocate memory on the cache since it is likely + discarded anyway. If it turns out to be necessary to have a + new record we can still allocate real memory. */ +! bool alloca_used = false; + dataset = NULL; + +! if (he == NULL) + dataset = (struct dataset *) mempool_alloc (db, total + n, 1); + + if (dataset == NULL) +--- 207,216 ---- + change. Allocate memory on the cache since it is likely + discarded anyway. If it turns out to be necessary to have a + new record we can still allocate real memory. */ +! bool dataset_in_stack_or_freed = false; + dataset = NULL; + +! if (he == NULL || ! __libc_use_alloca (alloca_used + total + n)) + dataset = (struct dataset *) mempool_alloc (db, total + n, 1); + + if (dataset == NULL) +*************** cache_addgr (struct database_dyn *db, in +*** 216,225 **** + /* We cannot permanently add the result in the moment. But + we can provide the result as is. Store the data in some + temporary memory. */ +! dataset = (struct dataset *) alloca (total + n); + + /* We cannot add this record to the permanent database. */ +! alloca_used = true; + } + + dataset->head.allocsize = total + n; +--- 218,227 ---- + /* We cannot permanently add the result in the moment. But + we can provide the result as is. Store the data in some + temporary memory. */ +! dataset = (struct dataset *) alloca_account (total + n, alloca_used); + + /* We cannot add this record to the permanent database. */ +! dataset_in_stack_or_freed = true; + } + + dataset->head.allocsize = total + n; +*************** cache_addgr (struct database_dyn *db, in +*** 273,278 **** +--- 275,288 ---- + allocated on the stack and need not be freed. */ + dh->timeout = dataset->head.timeout; + ++dh->nreloads; ++ ++ /* If the new record was not allocated on the stack, then it must ++ be freed. Note that it can no longer be used. */ ++ if (! dataset_in_stack_or_freed) ++ { ++ free (dataset); ++ dataset_in_stack_or_freed = true; ++ } + } + else + { +*************** cache_addgr (struct database_dyn *db, in +*** 288,294 **** + key_copy = (char *) newp + (key_copy - (char *) dataset); + + dataset = memcpy (newp, dataset, total + n); +! alloca_used = false; + } + + /* Mark the old record as obsolete. */ +--- 298,304 ---- + key_copy = (char *) newp + (key_copy - (char *) dataset); + + dataset = memcpy (newp, dataset, total + n); +! dataset_in_stack_or_freed = false; + } + + /* Mark the old record as obsolete. */ +*************** cache_addgr (struct database_dyn *db, in +*** 303,309 **** + assert (fd != -1); + + #ifdef HAVE_SENDFILE +! if (__builtin_expect (db->mmap_used, 1) && !alloca_used) + { + assert (db->wr_fd != -1); + assert ((char *) &dataset->resp > (char *) db->data); +--- 313,319 ---- + assert (fd != -1); + + #ifdef HAVE_SENDFILE +! if (__builtin_expect (db->mmap_used, 1) && !dataset_in_stack_or_freed) + { + assert (db->wr_fd != -1); + assert ((char *) &dataset->resp > (char *) db->data); +*************** cache_addgr (struct database_dyn *db, in +*** 330,336 **** + + /* Add the record to the database. But only if it has not been + stored on the stack. */ +! if (! alloca_used) + { + /* If necessary, we also propagate the data to disk. */ + if (db->persistent) +--- 340,346 ---- + + /* Add the record to the database. But only if it has not been + stored on the stack. */ +! if (! dataset_in_stack_or_freed) + { + /* If necessary, we also propagate the data to disk. */ + if (db->persistent) diff --git a/SOURCES/glibc-rh788959.patch b/SOURCES/glibc-rh788959.patch new file mode 100644 index 0000000..adc6c99 --- /dev/null +++ b/SOURCES/glibc-rh788959.patch @@ -0,0 +1,130 @@ +diff -pruN glibc-2.12-2-gc4ccff1/nis/nss_compat/compat-initgroups.c glibc-2.12-2-gc4ccff1.patched/nis/nss_compat/compat-initgroups.c +--- glibc-2.12-2-gc4ccff1/nis/nss_compat/compat-initgroups.c 2010-05-04 16:57:23.000000000 +0530 ++++ glibc-2.12-2-gc4ccff1.patched/nis/nss_compat/compat-initgroups.c 2012-02-21 11:11:19.877008465 +0530 +@@ -297,6 +297,8 @@ getgrent_next_nss (ent_t *ent, char *buf + if (nss_initgroups_dyn (user, group, &mystart, &mysize, &mygroups, + limit, errnop) == NSS_STATUS_SUCCESS) + { ++ status = NSS_STATUS_NOTFOUND; ++ + /* If there is no blacklist we can trust the underlying + initgroups implementation. */ + if (ent->blacklist.current <= 1) +@@ -309,6 +311,7 @@ getgrent_next_nss (ent_t *ent, char *buf + overwrite the pointer with one to a bigger buffer. */ + char *tmpbuf = buffer; + size_t tmplen = buflen; ++ bool use_malloc = false; + + for (int i = 0; i < mystart; i++) + { +@@ -316,21 +319,36 @@ getgrent_next_nss (ent_t *ent, char *buf + tmpbuf, tmplen, errnop)) + == NSS_STATUS_TRYAGAIN + && *errnop == ERANGE) +- if (tmpbuf == buffer) +- { +- tmplen *= 2; +- tmpbuf = __alloca (tmplen); +- } +- else +- tmpbuf = extend_alloca (tmpbuf, tmplen, 2 * tmplen); ++ { ++ if (__libc_use_alloca (tmplen * 2)) ++ { ++ if (tmpbuf == buffer) ++ { ++ tmplen *= 2; ++ tmpbuf = __alloca (tmplen); ++ } ++ else ++ tmpbuf = extend_alloca (tmpbuf, tmplen, tmplen * 2); ++ } ++ else ++ { ++ tmplen *= 2; ++ char *newbuf = realloc (use_malloc ? tmpbuf : NULL, tmplen); ++ ++ if (newbuf == NULL) ++ { ++ status = NSS_STATUS_TRYAGAIN; ++ goto done; ++ } ++ use_malloc = true; ++ tmpbuf = newbuf; ++ } ++ } + + if (__builtin_expect (status != NSS_STATUS_NOTFOUND, 1)) + { + if (__builtin_expect (status != NSS_STATUS_SUCCESS, 0)) +- { +- free (mygroups); +- return status; +- } ++ goto done; + + if (!in_blacklist (grpbuf.gr_name, + strlen (grpbuf.gr_name), ent) +@@ -348,11 +366,17 @@ getgrent_next_nss (ent_t *ent, char *buf + } + } + } ++ ++ status = NSS_STATUS_NOTFOUND; ++ ++ done: ++ if (use_malloc) ++ free (tmpbuf); + } + + free (mygroups); + +- return NSS_STATUS_NOTFOUND; ++ return status; + } + + free (mygroups); +@@ -506,6 +530,7 @@ _nss_compat_initgroups_dyn (const char * + char *tmpbuf; + enum nss_status status; + ent_t intern = { true, false, false, NULL, {NULL, 0, 0} }; ++ bool use_malloc = false; + + status = internal_setgrent (&intern); + if (status != NSS_STATUS_SUCCESS) +@@ -519,13 +544,32 @@ _nss_compat_initgroups_dyn (const char * + user, group, start, size, + groupsp, limit, errnop)) + == NSS_STATUS_TRYAGAIN && *errnop == ERANGE) +- tmpbuf = extend_alloca (tmpbuf, buflen, 2 * buflen); ++ if (__libc_use_alloca (buflen * 2)) ++ tmpbuf = extend_alloca (tmpbuf, buflen, 2 * buflen); ++ else ++ { ++ buflen *= 2; ++ char *newbuf = realloc (use_malloc ? tmpbuf : NULL, buflen); ++ if (newbuf == NULL) ++ { ++ status = NSS_STATUS_TRYAGAIN; ++ goto done; ++ } ++ use_malloc = true; ++ tmpbuf = newbuf; ++ } + } + while (status == NSS_STATUS_SUCCESS); + ++ status = NSS_STATUS_SUCCESS; ++ ++ done: ++ if (use_malloc) ++ free (tmpbuf); ++ + internal_endgrent (&intern); + +- return NSS_STATUS_SUCCESS; ++ return status; + } + + diff --git a/SOURCES/glibc-rh789189.patch b/SOURCES/glibc-rh789189.patch new file mode 100644 index 0000000..fc0e2e0 --- /dev/null +++ b/SOURCES/glibc-rh789189.patch @@ -0,0 +1,12 @@ +diff -rup a/resolv/res_init.c b/resolv/res_init.c +--- a/resolv/res_init.c 2010-05-04 05:27:23.000000000 -0600 ++++ b/resolv/res_init.c 2012-02-10 10:20:24.923578396 -0700 +@@ -325,7 +325,7 @@ __res_vinit(res_state statp, int preinit + struct in6_addr a6; + char *el; + +- if ((el = strchr(cp, '\n')) != NULL) ++ if ((el = strpbrk(cp, " \t\n")) != NULL) + *el = '\0'; + if ((el = strchr(cp, SCOPE_DELIMITER)) != NULL) + *el = '\0'; diff --git a/SOURCES/glibc-rh789209.patch b/SOURCES/glibc-rh789209.patch new file mode 100644 index 0000000..3aea97e --- /dev/null +++ b/SOURCES/glibc-rh789209.patch @@ -0,0 +1,12 @@ +diff -rup a/localedata/locales/uk_UA b/localedata/locales/uk_UA +--- a/localedata/locales/uk_UA 2010-05-04 05:27:23.000000000 -0600 ++++ b/localedata/locales/uk_UA 2012-02-10 09:59:16.934189715 -0700 +@@ -700,7 +700,7 @@ LC_MONETARY + % 200 hrv. - 200 hryven (money) + + % the local currency symbol +-currency_symbol "" % hr (hryvnya) ++currency_symbol "" % hr (hryvnya) + + % This must be a 4-character string containing the international currency + % symbol as defined by the ISO 4217 standard (three characters) followed diff --git a/SOURCES/glibc-rh789238-2.patch b/SOURCES/glibc-rh789238-2.patch new file mode 100644 index 0000000..62b5492 --- /dev/null +++ b/SOURCES/glibc-rh789238-2.patch @@ -0,0 +1,114 @@ +diff -rup a/malloc/arena.c b/malloc/arena.c +--- a/malloc/arena.c 2012-03-02 10:22:47.025002715 -0700 ++++ b/malloc/arena.c 2012-03-02 10:27:47.442361529 -0700 +@@ -123,14 +123,14 @@ int __malloc_initialized = -1; + if(ptr) \ + (void)mutex_lock(&ptr->mutex); \ + else \ +- ptr = arena_get2(ptr, (size)); \ ++ ptr = arena_get2(ptr, (size), false); \ + } while(0) + #else + #define arena_lock(ptr, size) do { \ + if(ptr && !mutex_trylock(&ptr->mutex)) { \ + THREAD_STAT(++(ptr->stat_lock_direct)); \ + } else \ +- ptr = arena_get2(ptr, (size)); \ ++ ptr = arena_get2(ptr, (size), false); \ + } while(0) + #endif + +@@ -982,7 +982,7 @@ get_free_list (void) + + + static mstate +-reused_arena (void) ++reused_arena (bool retrying) + { + mstate result; + static mstate next_to_use; +@@ -999,6 +999,15 @@ reused_arena (void) + } + while (result != next_to_use); + ++ /* If we are retrying due to a failure to allocate in the main ++ arena, don't wait for the main arena to become available, select ++ another. ++ ++ To really fix this right we would have to try the allocation ++ in every other arena, but that seems like severe overkill. */ ++ if (retrying && result == &main_arena) ++ result = result->next; ++ + /* No arena available. Wait for the next in line. */ + (void)mutex_lock(&result->mutex); + +@@ -1014,9 +1023,9 @@ reused_arena (void) + static mstate + internal_function + #if __STD_C +-arena_get2(mstate a_tsd, size_t size) ++arena_get2(mstate a_tsd, size_t size, bool retrying) + #else +-arena_get2(a_tsd, size) mstate a_tsd; size_t size; ++arena_get2(a_tsd, size, retrying) mstate a_tsd; size_t size; bool retrying + #endif + { + mstate a; +@@ -1055,7 +1064,7 @@ arena_get2(a_tsd, size) mstate a_tsd; si + catomic_decrement (&narenas); + } + else +- a = reused_arena (); ++ a = reused_arena (retrying); + } + #else + if(!a_tsd) +diff -rup a/malloc/malloc.c b/malloc/malloc.c +--- a/malloc/malloc.c 2012-03-02 10:22:47.061002519 -0700 ++++ b/malloc/malloc.c 2012-03-02 10:23:53.151643863 -0700 +@@ -3671,7 +3671,7 @@ public_mALLOc(size_t bytes) + /* ... or sbrk() has failed and there is still a chance to mmap() */ + mstate prev = ar_ptr->next ? ar_ptr : 0; + (void)mutex_unlock(&ar_ptr->mutex); +- ar_ptr = arena_get2(prev, bytes); ++ ar_ptr = arena_get2(prev, bytes, true); + if(ar_ptr) { + victim = _int_malloc(ar_ptr, bytes); + (void)mutex_unlock(&ar_ptr->mutex); +@@ -3892,7 +3892,7 @@ public_mEMALIGn(size_t alignment, size_t + /* ... or sbrk() has failed and there is still a chance to mmap() */ + mstate prev = ar_ptr->next ? ar_ptr : 0; + (void)mutex_unlock(&ar_ptr->mutex); +- ar_ptr = arena_get2(prev, bytes); ++ ar_ptr = arena_get2(prev, bytes, true); + if(ar_ptr) { + p = _int_memalign(ar_ptr, alignment, bytes); + (void)mutex_unlock(&ar_ptr->mutex); +@@ -3943,7 +3943,7 @@ public_vALLOc(size_t bytes) + /* ... or sbrk() has failed and there is still a chance to mmap() */ + mstate prev = ar_ptr->next ? ar_ptr : 0; + (void)mutex_unlock(&ar_ptr->mutex); +- ar_ptr = arena_get2(prev, bytes); ++ ar_ptr = arena_get2(prev, bytes, true); + if(ar_ptr) { + p = _int_memalign(ar_ptr, pagesz, bytes); + (void)mutex_unlock(&ar_ptr->mutex); +@@ -3992,7 +3992,7 @@ public_pVALLOc(size_t bytes) + /* ... or sbrk() has failed and there is still a chance to mmap() */ + mstate prev = ar_ptr->next ? ar_ptr : 0; + (void)mutex_unlock(&ar_ptr->mutex); +- ar_ptr = arena_get2(prev, bytes + 2*pagesz + MINSIZE); ++ ar_ptr = arena_get2(prev, bytes + 2*pagesz + MINSIZE, true); + if(ar_ptr) { + p = _int_memalign(ar_ptr, pagesz, rounded_bytes); + (void)mutex_unlock(&ar_ptr->mutex); +@@ -4086,7 +4086,7 @@ public_cALLOc(size_t n, size_t elem_size + /* ... or sbrk() has failed and there is still a chance to mmap() */ + mstate prev = av->next ? av : 0; + (void)mutex_unlock(&av->mutex); +- av = arena_get2(prev, sz); ++ av = arena_get2(prev, sz, true); + if(av) { + mem = _int_malloc(av, sz); + (void)mutex_unlock(&av->mutex); diff --git a/SOURCES/glibc-rh789238.patch b/SOURCES/glibc-rh789238.patch new file mode 100644 index 0000000..f2c90e2 --- /dev/null +++ b/SOURCES/glibc-rh789238.patch @@ -0,0 +1,119 @@ +diff -rup a/malloc/malloc.c b/malloc/malloc.c +--- a/malloc/malloc.c 2012-02-13 21:46:11.678847531 -0700 ++++ b/malloc/malloc.c 2012-02-13 22:43:14.788431976 -0700 +@@ -3669,8 +3669,9 @@ public_mALLOc(size_t bytes) + } else { + #if USE_ARENAS + /* ... or sbrk() has failed and there is still a chance to mmap() */ +- ar_ptr = arena_get2(ar_ptr->next ? ar_ptr : 0, bytes); +- (void)mutex_unlock(&main_arena.mutex); ++ mstate prev = ar_ptr->next ? ar_ptr : 0; ++ (void)mutex_unlock(&ar_ptr->mutex); ++ ar_ptr = arena_get2(prev, bytes); + if(ar_ptr) { + victim = _int_malloc(ar_ptr, bytes); + (void)mutex_unlock(&ar_ptr->mutex); +@@ -3929,10 +3930,10 @@ public_vALLOc(size_t bytes) + if(!ar_ptr) + return 0; + p = _int_valloc(ar_ptr, bytes); +- (void)mutex_unlock(&ar_ptr->mutex); + if(!p) { + /* Maybe the failure is due to running out of mmapped areas. */ + if(ar_ptr != &main_arena) { ++ (void)mutex_unlock(&ar_ptr->mutex); + ar_ptr = &main_arena; + (void)mutex_lock(&ar_ptr->mutex); + p = _int_memalign(ar_ptr, pagesz, bytes); +@@ -3940,14 +3941,17 @@ public_vALLOc(size_t bytes) + } else { + #if USE_ARENAS + /* ... or sbrk() has failed and there is still a chance to mmap() */ +- ar_ptr = arena_get2(ar_ptr->next ? ar_ptr : 0, bytes); ++ mstate prev = ar_ptr->next ? ar_ptr : 0; ++ (void)mutex_unlock(&ar_ptr->mutex); ++ ar_ptr = arena_get2(prev, bytes); + if(ar_ptr) { + p = _int_memalign(ar_ptr, pagesz, bytes); + (void)mutex_unlock(&ar_ptr->mutex); + } + #endif + } +- } ++ } else ++ (void)mutex_unlock(&ar_ptr->mutex); + assert(!p || chunk_is_mmapped(mem2chunk(p)) || + ar_ptr == arena_for_chunk(mem2chunk(p))); + +@@ -3975,10 +3979,10 @@ public_pVALLOc(size_t bytes) + + arena_get(ar_ptr, bytes + 2*pagesz + MINSIZE); + p = _int_pvalloc(ar_ptr, bytes); +- (void)mutex_unlock(&ar_ptr->mutex); + if(!p) { + /* Maybe the failure is due to running out of mmapped areas. */ + if(ar_ptr != &main_arena) { ++ (void)mutex_unlock(&ar_ptr->mutex); + ar_ptr = &main_arena; + (void)mutex_lock(&ar_ptr->mutex); + p = _int_memalign(ar_ptr, pagesz, rounded_bytes); +@@ -3986,15 +3990,17 @@ public_pVALLOc(size_t bytes) + } else { + #if USE_ARENAS + /* ... or sbrk() has failed and there is still a chance to mmap() */ +- ar_ptr = arena_get2(ar_ptr->next ? ar_ptr : 0, +- bytes + 2*pagesz + MINSIZE); ++ mstate prev = ar_ptr->next ? ar_ptr : 0; ++ (void)mutex_unlock(&ar_ptr->mutex); ++ ar_ptr = arena_get2(prev, bytes + 2*pagesz + MINSIZE); + if(ar_ptr) { + p = _int_memalign(ar_ptr, pagesz, rounded_bytes); + (void)mutex_unlock(&ar_ptr->mutex); + } + #endif + } +- } ++ } else ++ (void)mutex_unlock(&ar_ptr->mutex); + assert(!p || chunk_is_mmapped(mem2chunk(p)) || + ar_ptr == arena_for_chunk(mem2chunk(p))); + +@@ -4064,8 +4070,6 @@ public_cALLOc(size_t n, size_t elem_size + #endif + mem = _int_malloc(av, sz); + +- /* Only clearing follows, so we can unlock early. */ +- (void)mutex_unlock(&av->mutex); + + assert(!mem || chunk_is_mmapped(mem2chunk(mem)) || + av == arena_for_chunk(mem2chunk(mem))); +@@ -4073,15 +4077,16 @@ public_cALLOc(size_t n, size_t elem_size + if (mem == 0) { + /* Maybe the failure is due to running out of mmapped areas. */ + if(av != &main_arena) { ++ (void)mutex_unlock(&av->mutex); + (void)mutex_lock(&main_arena.mutex); + mem = _int_malloc(&main_arena, sz); + (void)mutex_unlock(&main_arena.mutex); + } else { + #if USE_ARENAS + /* ... or sbrk() has failed and there is still a chance to mmap() */ +- (void)mutex_lock(&main_arena.mutex); +- av = arena_get2(av->next ? av : 0, sz); +- (void)mutex_unlock(&main_arena.mutex); ++ mstate prev = av->next ? av : 0; ++ (void)mutex_unlock(&av->mutex); ++ av = arena_get2(prev, sz); + if(av) { + mem = _int_malloc(av, sz); + (void)mutex_unlock(&av->mutex); +@@ -4089,7 +4094,8 @@ public_cALLOc(size_t n, size_t elem_size + #endif + } + if (mem == 0) return 0; +- } ++ } else ++ (void)mutex_unlock(&av->mutex); + p = mem2chunk(mem); + + /* Two optional cases in which clearing not necessary */ diff --git a/SOURCES/glibc-rh794817-2.patch b/SOURCES/glibc-rh794817-2.patch new file mode 100644 index 0000000..15774b4 --- /dev/null +++ b/SOURCES/glibc-rh794817-2.patch @@ -0,0 +1,85 @@ +diff -rup a/stdio-common/vfprintf.c b/stdio-common/vfprintf.c +--- a/stdio-common/vfprintf.c 2012-03-05 09:43:14.705536167 -0700 ++++ b/stdio-common/vfprintf.c 2012-03-05 09:48:11.602890982 -0700 +@@ -822,7 +822,7 @@ vfprintf (FILE *s, const CHAR_T *format, + \ + if (function_done < 0) \ + { \ +- /* Error in print handler. */ \ ++ /* Error in print handler; up to handler to set errno. */ \ + done = -1; \ + goto all_done; \ + } \ +@@ -876,7 +876,7 @@ vfprintf (FILE *s, const CHAR_T *format, + \ + if (function_done < 0) \ + { \ +- /* Error in print handler. */ \ ++ /* Error in print handler; up to handler to set errno. */ \ + done = -1; \ + goto all_done; \ + } \ +@@ -1117,7 +1117,7 @@ vfprintf (FILE *s, const CHAR_T *format, + &mbstate); \ + if (len == (size_t) -1) \ + { \ +- /* Something went wron gduring the conversion. Bail out. */ \ ++ /* Something went wrong during the conversion. Bail out. */ \ + done = -1; \ + goto all_done; \ + } \ +@@ -1188,6 +1188,7 @@ vfprintf (FILE *s, const CHAR_T *format, + if (__mbsnrtowcs (ignore, &str2, strend - str2, \ + ignore_size, &ps) == (size_t) -1) \ + { \ ++ /* Conversion function has set errno. */ \ + done = -1; \ + goto all_done; \ + } \ +@@ -1599,6 +1600,7 @@ vfprintf (FILE *s, const CHAR_T *format, + if (spec == L_('\0')) + { + /* The format string ended before the specifier is complete. */ ++ __set_errno (EINVAL); + done = -1; + goto all_done; + } +@@ -1696,17 +1698,20 @@ do_positional: + + /* Determine the number of arguments the format string consumes. */ + nargs = MAX (nargs, max_ref_arg); ++ /* Calculate total size needed to represent a single argument across ++ all three argument-related arrays. */ + bytes_per_arg = sizeof (*args_value) + sizeof (*args_size) + + sizeof (*args_type); + + /* Check for potential integer overflow. */ +- if (nargs > SIZE_MAX / bytes_per_arg) ++ if (__builtin_expect (nargs > SIZE_MAX / bytes_per_arg, 0)) + { ++ __set_errno (ERANGE); + done = -1; + goto all_done; + } + +- /* Allocate memory for the argument descriptions. */ ++ /* Allocate memory for all three argument arrays. */ + if (__libc_use_alloca (nargs * bytes_per_arg)) + args_value = alloca (nargs * bytes_per_arg); + else +@@ -1937,6 +1942,7 @@ do_positional: + about # of chars. */ + if (function_done < 0) + { ++ /* Function has set errno. */ + done = -1; + goto all_done; + } +@@ -1971,6 +1977,7 @@ do_positional: + of chars. */ + if (function_done < 0) + { ++ /* Function has set errno. */ + done = -1; + goto all_done; + } diff --git a/SOURCES/glibc-rh794817.patch b/SOURCES/glibc-rh794817.patch new file mode 100644 index 0000000..e21caaa --- /dev/null +++ b/SOURCES/glibc-rh794817.patch @@ -0,0 +1,239 @@ +From libc-alpha-return-25252-listarch-libc-alpha=sources dot redhat dot com at sourceware dot org Thu Feb 16 16:21:17 2012 +Return-Path: +Delivered-To: listarch-libc-alpha at sources dot redhat dot com +Received: (qmail 5187 invoked by alias); 16 Feb 2012 16:21:14 -0000 +Delivered-To: moderator for libc-alpha at sourceware dot org +Received: (qmail 2174 invoked by uid 22791); 16 Feb 2012 16:17:18 -0000 +X-SWARE-Spam-Status: No, hits=-2.0 required=5.0 + tests=AWL,BAYES_00,RCVD_IN_DNSWL_NONE,SPF_HELO_PASS,TW_TV,TW_VB,TW_VF,T_RP_MATCHES_RCVD +X-Spam-Check-By: sourceware.org +Date: Thu, 16 Feb 2012 08:16:13 -0800 +From: Kees Cook +To: "Ryan S dot Arnold" +Cc: libc-alpha at sourceware dot org, Paul Eggert , + Roland McGrath , + Andreas Schwab +Subject: Re: [PATCH] vfprintf: validate nargs and maybe allocate from heap +Message-ID: <20120216161613.GZ20420@outflux.net> +References: <20120206062537.GM4979@outflux.net> + <20120207000509 dot GP4989 at outflux dot net> + <20120210192457 dot GF20420 at outflux dot net> + + <20120214223048 dot GM20420 at outflux dot net> + + <20120214224543 dot GN20420 at outflux dot net> +MIME-Version: 1.0 +Content-Type: text/plain; charset=us-ascii +Content-Disposition: inline +In-Reply-To: <20120214224543 dot GN20420 at outflux dot net> +X-MIMEDefang-Filter: outflux$Revision: 1.316 $ +X-HELO: www.outflux.net +Mailing-List: contact libc-alpha-help at sourceware dot org; run by ezmlm +Precedence: bulk +List-Id: +List-Subscribe: +List-Archive: +List-Post: +List-Help: , +Sender: libc-alpha-owner at sourceware dot org +Delivered-To: mailing list libc-alpha at sourceware dot org + +The nargs value can overflow when doing allocations, allowing arbitrary +memory writes via format strings, bypassing _FORTIFY_SOURCE: +http://www.phrack.org/issues.html?issue=67&id=9 + +This checks for nargs overflow and possibly allocates from heap instead of +stack, and adds a regression test for the situation. + +I have FSF assignment via Google. (Sent from @outflux since that's how I'm +subscribed here, but CL shows @chromium.org as part of my Google work.) + +This version disables the useless test on non-32-bit platforms. + +2012-02-16 Kees Cook + + [BZ #13656] + * stdio-common/vfprintf.c (vfprintf): Check for nargs overflow and + possibly allocate from heap instead of stack. + * stdio-common/bug-vfprintf-nargs.c: New file. + * stdio-common/Makefile (tests): Add nargs overflow test. + + +diff -rup a/stdio-common/Makefile b/stdio-common/Makefile +--- a/stdio-common/Makefile 2010-05-04 05:27:23.000000000 -0600 ++++ b/stdio-common/Makefile 2012-02-20 21:57:52.983040992 -0700 +@@ -60,7 +60,7 @@ tests := tstscanf test_rdwr test-popen t + tst-popen tst-unlockedio tst-fmemopen2 tst-put-error tst-fgets \ + tst-fwrite bug16 bug17 tst-swscanf tst-sprintf2 bug18 bug18a \ + bug19 bug19a tst-popen2 scanf13 scanf14 scanf15 bug20 bug21 bug22 \ +- scanf16 scanf17 tst-setvbuf1 ++ scanf16 scanf17 tst-setvbuf1 bug-vfprintf-nargs + + test-srcs = tst-unbputc tst-printf + +diff --git a/stdio-common/bug-vfprintf-nargs.c b/stdio-common/bug-vfprintf-nargs.c +new file mode 100644 +index 0000000..13c66c0 +--- /dev/null ++++ b/stdio-common/bug-vfprintf-nargs.c +@@ -0,0 +1,78 @@ ++/* Test for vfprintf nargs allocation overflow (BZ #13656). ++ Copyright (C) 2012 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Kees Cook , 2012. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, write to the Free ++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++ 02111-1307 USA. */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++static int ++format_failed (const char *fmt, const char *expected) ++{ ++ char output[80]; ++ ++ printf ("%s : ", fmt); ++ ++ memset (output, 0, sizeof output); ++ /* Having sprintf itself detect a failure is good. */ ++ if (sprintf (output, fmt, 1, 2, 3, "test") > 0 ++ && strcmp (output, expected) != 0) ++ { ++ printf ("FAIL (output '%s' != expected '%s')\n", output, expected); ++ return 1; ++ } ++ puts ("ok"); ++ return 0; ++} ++ ++static int ++do_test (void) ++{ ++ int rc = 0; ++ char buf[64]; ++ ++ /* Regular positionals work. */ ++ if (format_failed ("%1$d", "1") != 0) ++ rc = 1; ++ ++ /* Regular width positionals work. */ ++ if (format_failed ("%1$*2$d", " 1") != 0) ++ rc = 1; ++ ++ /* Positional arguments are constructed via read_int, so nargs can only ++ overflow on 32-bit systems. On 64-bit systems, it will attempt to ++ allocate a giant amount of memory and possibly crash, which is the ++ expected situation. Since the 64-bit behavior is arch-specific, only ++ test this on 32-bit systems. */ ++ if (sizeof (long int) == 4) ++ { ++ sprintf (buf, "%%1$d %%%" PRIdPTR "$d", UINT32_MAX / sizeof (int)); ++ if (format_failed (buf, "1 %$d") != 0) ++ rc = 1; ++ } ++ ++ return rc; ++} ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/stdio-common/vfprintf.c b/stdio-common/vfprintf.c +index 863cd5d..022e72b 100644 +--- a/stdio-common/vfprintf.c ++++ b/stdio-common/vfprintf.c +@@ -235,6 +235,9 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap) + 0 if unknown. */ + int readonly_format = 0; + ++ /* For the argument descriptions, which may be allocated on the heap. */ ++ void *args_malloced = NULL; ++ + /* This table maps a character into a number representing a + class. In each step there is a destination label for each + class. */ +@@ -1647,9 +1650,10 @@ do_positional: + determine the size of the array needed to store the argument + attributes. */ + size_t nargs = 0; +- int *args_type; +- union printf_arg *args_value = NULL; ++ size_t bytes_per_arg; ++ union printf_arg *args_value; + int *args_size; ++ int *args_type; + + /* Positional parameters refer to arguments directly. This could + also determine the maximum number of arguments. Track the +@@ -1698,13 +1702,33 @@ do_positional: + + /* Determine the number of arguments the format string consumes. */ + nargs = MAX (nargs, max_ref_arg); ++ bytes_per_arg = sizeof (*args_value) + sizeof (*args_size) ++ + sizeof (*args_type); ++ ++ /* Check for potential integer overflow. */ ++ if (nargs > SIZE_MAX / bytes_per_arg) ++ { ++ done = -1; ++ goto all_done; ++ } + + /* Allocate memory for the argument descriptions. */ +- args_type = alloca (nargs * sizeof (int)); ++ if (__libc_use_alloca (nargs * bytes_per_arg)) ++ args_value = alloca (nargs * bytes_per_arg); ++ else ++ { ++ args_value = args_malloced = malloc (nargs * bytes_per_arg); ++ if (args_value == NULL) ++ { ++ done = -1; ++ goto all_done; ++ } ++ } ++ ++ args_size = &args_value[nargs].pa_int; ++ args_type = &args_size[nargs]; + memset (args_type, s->_flags2 & _IO_FLAGS2_FORTIFY ? '\xff' : '\0', +- nargs * sizeof (int)); +- args_value = alloca (nargs * sizeof (union printf_arg)); +- args_size = alloca (nargs * sizeof (int)); ++ nargs * sizeof (*args_type)); + + /* XXX Could do sanity check here: If any element in ARGS_TYPE is + still zero after this loop, format is invalid. For now we +@@ -1973,8 +1997,8 @@ do_positional: + } + + all_done: +- if (__builtin_expect (workstart != NULL, 0)) +- free (workstart); ++ free (args_malloced); ++ free (workstart); + /* Unlock the stream. */ + _IO_funlockfile (s); + _IO_cleanup_region_end (0); +-- +1.7.5.4 + +-- +Kees Cook @outflux.net + diff --git a/SOURCES/glibc-rh795498.patch b/SOURCES/glibc-rh795498.patch new file mode 100644 index 0000000..729c5a4 --- /dev/null +++ b/SOURCES/glibc-rh795498.patch @@ -0,0 +1,13 @@ +diff --git a/resolv/nss_dns/dns-host.c b/resolv/nss_dns/dns-host.c +index 01369f6..44ad04d 100644 +--- a/resolv/nss_dns/dns-host.c ++++ b/resolv/nss_dns/dns-host.c +@@ -1219,7 +1219,7 @@ gaih_getanswer (const querybuf *answer1, int anslen1, const querybuf *answer2, + &first); + if ((status == NSS_STATUS_SUCCESS || status == NSS_STATUS_NOTFOUND + || (status == NSS_STATUS_TRYAGAIN +- && (errno != ERANGE || *h_errnop != NO_RECOVERY))) ++ && (*errnop != ERANGE || *h_errnop == NO_RECOVERY))) + && answer2 != NULL && anslen2 > 0) + { + enum nss_status status2 = gaih_getanswer_slice(answer2, anslen2, qname, diff --git a/SOURCES/glibc-rh797094-1.patch b/SOURCES/glibc-rh797094-1.patch new file mode 100644 index 0000000..e98b9c0 --- /dev/null +++ b/SOURCES/glibc-rh797094-1.patch @@ -0,0 +1,657 @@ +diff -rup a/include/alloca.h b/include/alloca.h +--- a/include/alloca.h 2012-02-29 13:11:19.439693476 -0700 ++++ b/include/alloca.h 2012-02-29 13:11:49.832530623 -0700 +@@ -49,15 +49,24 @@ libc_hidden_proto (__libc_alloca_cutoff) + + #if defined stackinfo_get_sp && defined stackinfo_sub_sp + # define alloca_account(size, avar) \ +- ({ void *old__ = stackinfo_get_sp (); \ +- void *m__ = __alloca (size); \ +- avar += stackinfo_sub_sp (old__); \ ++ ({ void *old__ = stackinfo_get_sp (); \ ++ void *m__ = __alloca (size); \ ++ avar += stackinfo_sub_sp (old__); \ ++ m__; }) ++# define extend_alloca_account(buf, len, newlen, avar) \ ++ ({ void *old__ = stackinfo_get_sp (); \ ++ void *m__ = extend_alloca (buf, len, newlen); \ ++ avar += stackinfo_sub_sp (old__); \ + m__; }) + #else + # define alloca_account(size, avar) \ +- ({ size_t s__ = (size); \ +- avar += s__; \ ++ ({ size_t s__ = (size); \ ++ avar += s__; \ + __alloca (s__); }) ++# define extend_alloca_account(buf, len, newlen, avar) \ ++ ({ size_t s__ = (newlen); \ ++ avar += s__; \ ++ extend_alloca (buf, len, s__); }) + #endif + + #endif +diff -rup a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c +--- a/sysdeps/posix/getaddrinfo.c 2012-02-29 13:11:19.588692676 -0700 ++++ b/sysdeps/posix/getaddrinfo.c 2012-02-29 13:12:42.972245862 -0700 +@@ -278,6 +278,7 @@ gaih_inet (const char *name, const struc + bool got_ipv6 = false; + const char *canon = NULL; + const char *orig_name = name; ++ size_t alloca_used = 0; + + if (req->ai_protocol || req->ai_socktype) + { +@@ -310,7 +311,7 @@ gaih_inet (const char *name, const struc + if (tp->name[0]) + { + st = (struct gaih_servtuple *) +- __alloca (sizeof (struct gaih_servtuple)); ++ alloca_account (sizeof (struct gaih_servtuple), alloca_used); + + if ((rc = gaih_inet_serv (service->name, tp, req, st))) + return rc; +@@ -334,7 +335,8 @@ gaih_inet (const char *name, const struc + continue; + + newp = (struct gaih_servtuple *) +- __alloca (sizeof (struct gaih_servtuple)); ++ alloca_account (sizeof (struct gaih_servtuple), ++ alloca_used); + + if ((rc = gaih_inet_serv (service->name, tp, req, newp))) + { +@@ -362,7 +364,7 @@ gaih_inet (const char *name, const struc + + if (req->ai_socktype || req->ai_protocol) + { +- st = __alloca (sizeof (struct gaih_servtuple)); ++ st = alloca_account (sizeof (struct gaih_servtuple), alloca_used); + st->next = NULL; + st->socktype = tp->socktype; + st->protocol = ((tp->protoflag & GAI_PROTO_PROTOANY) +@@ -379,7 +381,8 @@ gaih_inet (const char *name, const struc + { + struct gaih_servtuple *newp; + +- newp = __alloca (sizeof (struct gaih_servtuple)); ++ newp = alloca_account (sizeof (struct gaih_servtuple), ++ alloca_used); + newp->next = NULL; + newp->socktype = tp->socktype; + newp->protocol = tp->protocol; +@@ -391,10 +394,17 @@ gaih_inet (const char *name, const struc + } + } + ++ bool malloc_name = false; ++ bool malloc_addrmem = false; ++ struct gaih_addrtuple *addrmem = NULL; ++ bool malloc_canonbuf = false; ++ char *canonbuf = NULL; ++ bool malloc_tmpbuf = false; ++ char *tmpbuf = NULL; ++ int result = 0; + if (name != NULL) + { +- at = __alloca (sizeof (struct gaih_addrtuple)); +- ++ at = alloca_account (sizeof (struct gaih_addrtuple), alloca_used); + at->family = AF_UNSPEC; + at->scopeid = 0; + at->next = NULL; +@@ -412,6 +422,7 @@ gaih_inet (const char *name, const struc + rc = __idna_to_ascii_lz (name, &p, idn_flags); + if (rc != IDNA_SUCCESS) + { ++ /* No need to jump to free_and_return here. */ + if (rc == IDNA_MALLOC_ERROR) + return -EAI_MEMORY; + if (rc == IDNA_DLOPEN_ERROR) +@@ -421,10 +432,7 @@ gaih_inet (const char *name, const struc + /* In case the output string is the same as the input string + no new string has been allocated. */ + if (p != name) +- { +- name = strdupa (p); +- free (p); +- } ++ malloc_name = true; + } + #endif + +@@ -441,23 +449,59 @@ gaih_inet (const char *name, const struc + at->family = AF_INET6; + } + else +- return -EAI_ADDRFAMILY; ++ { ++ result = -EAI_ADDRFAMILY; ++ goto free_and_return; ++ } + + if (req->ai_flags & AI_CANONNAME) + canon = name; + } + else if (at->family == AF_UNSPEC) + { +- char *namebuf = (char *) name; + char *scope_delim = strchr (name, SCOPE_DELIMITER); ++ int e; + +- if (__builtin_expect (scope_delim != NULL, 0)) +- { +- namebuf = alloca (scope_delim - name + 1); +- *((char *) __mempcpy (namebuf, name, scope_delim - name)) = '\0'; +- } ++ { ++ bool malloc_namebuf = false; ++ char *namebuf = (char *) name; ++ ++ if (__builtin_expect (scope_delim != NULL, 0)) ++ { ++ if (malloc_name) ++ *scope_delim = '\0'; ++ else ++ { ++ if (__libc_use_alloca (alloca_used ++ + scope_delim - name + 1)) ++ { ++ namebuf = alloca_account (scope_delim - name + 1, ++ alloca_used); ++ *((char *) __mempcpy (namebuf, name, ++ scope_delim - name)) = '\0'; ++ } ++ else ++ { ++ namebuf = strndup (name, scope_delim - name); ++ if (namebuf == NULL) ++ { ++ assert (!malloc_name); ++ return -EAI_MEMORY; ++ } ++ malloc_namebuf = true; ++ } ++ } ++ } + +- if (inet_pton (AF_INET6, namebuf, at->addr) > 0) ++ e = inet_pton (AF_INET6, namebuf, at->addr); ++ ++ if (malloc_namebuf) ++ free (namebuf); ++ else if (scope_delim != NULL && malloc_name) ++ /* Undo what we did above. */ ++ *scope_delim = SCOPE_DELIMITER; ++ } ++ if (e > 0) + { + if (req->ai_family == AF_UNSPEC || req->ai_family == AF_INET6) + at->family = AF_INET6; +@@ -468,7 +512,10 @@ gaih_inet (const char *name, const struc + at->family = AF_INET; + } + else +- return -EAI_ADDRFAMILY; ++ { ++ result = -EAI_ADDRFAMILY; ++ goto free_and_return; ++ } + + if (scope_delim != NULL) + { +@@ -490,7 +537,10 @@ gaih_inet (const char *name, const struc + at->scopeid = (uint32_t) strtoul (scope_delim + 1, &end, + 10); + if (*end != '\0') +- return GAIH_OKIFUNSPEC | -EAI_NONAME; ++ { ++ result = GAIH_OKIFUNSPEC | -EAI_NONAME; ++ goto free_and_return; ++ } + } + } + +@@ -520,59 +570,80 @@ gaih_inet (const char *name, const struc + { + int family = req->ai_family; + size_t tmpbuflen = 512; +- char *tmpbuf = alloca (tmpbuflen); ++ assert (tmpbuf == NULL); ++ tmpbuf = alloca_account (tmpbuflen, alloca_used); + int rc; + struct hostent th; + struct hostent *h; + int herrno; + +- simple_again: + while (1) + { +- rc = __gethostbyname2_r (name, family, &th, tmpbuf, ++ rc = __gethostbyname2_r (name, AF_INET, &th, tmpbuf, + tmpbuflen, &h, &herrno); + if (rc != ERANGE || herrno != NETDB_INTERNAL) + break; +- tmpbuf = extend_alloca (tmpbuf, tmpbuflen, 2 * tmpbuflen); ++ ++ if (!malloc_tmpbuf ++ && __libc_use_alloca (alloca_used + 2 * tmpbuflen)) ++ tmpbuf = extend_alloca_account (tmpbuf, tmpbuflen, ++ 2 * tmpbuflen, ++ alloca_used); ++ else ++ { ++ char *newp = realloc (malloc_tmpbuf ? tmpbuf : NULL, ++ 2 * tmpbuflen); ++ if (newp == NULL) ++ { ++ result = -EAI_MEMORY; ++ goto free_and_return; ++ } ++ tmpbuf = newp; ++ malloc_tmpbuf = true; ++ tmpbuflen = 2 * tmpbuflen; ++ } + } + + if (rc == 0) + { +- if (h == NULL) ++ if (h != NULL) + { +- if (req->ai_family == AF_INET6 +- && (req->ai_flags & AI_V4MAPPED) +- && family == AF_INET6) ++ int i; ++ /* We found data, count the number of addresses. */ ++ for (i = 0; h->h_addr_list[i]; ++i) ++ ; ++ if (i > 0 && *pat != NULL) ++ --i; ++ ++ if (__libc_use_alloca (alloca_used ++ + i * sizeof (struct gaih_addrtuple))) ++ addrmem = alloca_account (i * sizeof (struct gaih_addrtuple), ++ alloca_used); ++ else + { +- /* Try again, this time looking for IPv4 +- addresses. */ +- family = AF_INET; +- goto simple_again; ++ addrmem = malloc (i ++ * sizeof (struct gaih_addrtuple)); ++ if (addrmem == NULL) ++ { ++ result = -EAI_MEMORY; ++ goto free_and_return; + } ++ malloc_addrmem = true; + } +- else +- { +- /* We found data, now convert it into the list. */ +- for (int i = 0; h->h_addr_list[i]; ++i) ++ ++ /* Now convert it into the list. */ ++ struct gaih_addrtuple *addrfree = addrmem; ++ for (i = 0; h->h_addr_list[i]; ++i) + { + if (*pat == NULL) + { +- *pat = __alloca (sizeof (struct gaih_addrtuple)); ++ *pat = addrfree++; + (*pat)->scopeid = 0; + } + (*pat)->next = NULL; +- (*pat)->family = req->ai_family; +- if (family == req->ai_family) ++ (*pat)->family = AF_INET; + memcpy ((*pat)->addr, h->h_addr_list[i], + h->h_length); +- else +- { +- uint32_t *addr = (uint32_t *) (*pat)->addr; +- addr[3] = *(uint32_t *) h->h_addr_list[i]; +- addr[2] = htonl (0xffff); +- addr[1] = 0; +- addr[0] = 0; +- } + pat = &((*pat)->next); + } + } +@@ -582,15 +653,16 @@ gaih_inet (const char *name, const struc + if (herrno == NETDB_INTERNAL) + { + __set_h_errno (herrno); +- return -EAI_SYSTEM; +- } +- if (herrno == TRY_AGAIN) +- { +- return -EAI_AGAIN; ++ result = -EAI_SYSTEM; + } ++ else if (herrno == TRY_AGAIN) ++ result = -EAI_AGAIN; ++ else + /* We made requests but they turned out no data. + The name is known, though. */ +- return GAIH_OKIFUNSPEC | -EAI_NODATA; ++ result = GAIH_OKIFUNSPEC | -EAI_NODATA; ++ ++ goto free_and_return; + } + + goto process_list; +@@ -613,21 +685,56 @@ gaih_inet (const char *name, const struc + bool added_canon = (req->ai_flags & AI_CANONNAME) == 0; + char *addrs = air->addrs; + ++ if (__libc_use_alloca (alloca_used ++ + air->naddrs * sizeof (struct gaih_addrtuple))) ++ addrmem = alloca_account (air->naddrs ++ * sizeof (struct gaih_addrtuple), ++ alloca_used); ++ else ++ { ++ addrmem = malloc (air->naddrs ++ * sizeof (struct gaih_addrtuple)); ++ if (addrmem == NULL) ++ { ++ result = -EAI_MEMORY; ++ goto free_and_return; ++ } ++ malloc_addrmem = true; ++ } ++ ++ struct gaih_addrtuple *addrfree = addrmem; + for (int i = 0; i < air->naddrs; ++i) + { + socklen_t size = (air->family[i] == AF_INET + ? INADDRSZ : IN6ADDRSZ); + if (*pat == NULL) + { +- *pat = __alloca (sizeof (struct gaih_addrtuple)); ++ *pat = addrfree++; + (*pat)->scopeid = 0; + } + uint32_t *pataddr = (*pat)->addr; + (*pat)->next = NULL; + if (added_canon || air->canon == NULL) + (*pat)->name = NULL; +- else +- canon = (*pat)->name = strdupa (air->canon); ++ else if (canonbuf == NULL) ++ { ++ size_t canonlen = strlen (air->canon) + 1; ++ if ((req->ai_flags & AI_CANONIDN) != 0 ++ && __libc_use_alloca (alloca_used + canonlen)) ++ canonbuf = alloca_account (canonlen, alloca_used); ++ else ++ { ++ canonbuf = malloc (canonlen); ++ if (canonbuf == NULL) ++ { ++ result = -EAI_MEMORY; ++ goto free_and_return; ++ } ++ malloc_canonbuf = true; ++ } ++ canon = (*pat)->name = memcpy (canonbuf, air->canon, ++ canonlen); ++ } + + if (air->family[i] == AF_INET + && req->ai_family == AF_INET6 +@@ -657,20 +764,26 @@ gaih_inet (const char *name, const struc + free (air); + + if (at->family == AF_UNSPEC) +- return GAIH_OKIFUNSPEC | -EAI_NONAME; ++ { ++ result = GAIH_OKIFUNSPEC | -EAI_NONAME; ++ goto free_and_return; ++ } + + goto process_list; + } + else if (err == 0) + /* The database contains a negative entry. */ +- return 0; ++ goto free_and_return; + else if (__nss_not_use_nscd_hosts == 0) + { + if (herrno == NETDB_INTERNAL && errno == ENOMEM) +- return -EAI_MEMORY; +- if (herrno == TRY_AGAIN) +- return -EAI_AGAIN; +- return -EAI_SYSTEM; ++ result = -EAI_MEMORY; ++ else if (herrno == TRY_AGAIN) ++ result = -EAI_AGAIN; ++ else ++ result = -EAI_SYSTEM; ++ ++ goto free_and_return; + } + } + #endif +@@ -699,7 +812,19 @@ gaih_inet (const char *name, const struc + _res.options &= ~RES_USE_INET6; + + size_t tmpbuflen = 1024; +- char *tmpbuf = alloca (tmpbuflen); ++ malloc_tmpbuf = !__libc_use_alloca (alloca_used + tmpbuflen); ++ assert (tmpbuf == NULL); ++ if (!malloc_tmpbuf) ++ tmpbuf = alloca_account (tmpbuflen, alloca_used); ++ else ++ { ++ tmpbuf = malloc (tmpbuflen); ++ if (tmpbuf == NULL) ++ { ++ result = -EAI_MEMORY; ++ goto free_and_return; ++ } ++ } + + while (!no_more) + { +@@ -728,8 +853,25 @@ gaih_inet (const char *name, const struc + no_data = herrno == NO_DATA; + break; + } +- tmpbuf = extend_alloca (tmpbuf, +- tmpbuflen, 2 * tmpbuflen); ++ ++ if (!malloc_tmpbuf ++ && __libc_use_alloca (alloca_used + 2 * tmpbuflen)) ++ tmpbuf = extend_alloca_account (tmpbuf, tmpbuflen, ++ 2 * tmpbuflen, ++ alloca_used); ++ else ++ { ++ char *newp = realloc (malloc_tmpbuf ? tmpbuf : NULL, ++ 2 * tmpbuflen); ++ if (newp == NULL) ++ { ++ result = -EAI_MEMORY; ++ goto free_and_return; ++ } ++ tmpbuf = newp; ++ malloc_tmpbuf = true; ++ tmpbuflen = 2 * tmpbuflen; ++ } + } + + if (status == NSS_STATUS_SUCCESS) +@@ -832,18 +974,40 @@ gaih_inet (const char *name, const struc + if (cfct != NULL) + { + const size_t max_fqdn_len = 256; +- char *buf = alloca (max_fqdn_len); ++ if ((req->ai_flags & AI_CANONIDN) != 0 ++ && __libc_use_alloca (alloca_used ++ + max_fqdn_len)) ++ canonbuf = alloca_account (max_fqdn_len, ++ alloca_used); ++ else ++ { ++ canonbuf = malloc (max_fqdn_len); ++ if (canonbuf == NULL) ++ { ++ result = -EAI_MEMORY; ++ goto free_and_return; ++ } ++ malloc_canonbuf = true; ++ } + char *s; + + if (DL_CALL_FCT (cfct, (at->name ?: name, +- buf, max_fqdn_len, ++ canonbuf, ++ max_fqdn_len, + &s, &rc, &herrno)) + == NSS_STATUS_SUCCESS) + canon = s; + else +- /* Set to name now to avoid using +- gethostbyaddr. */ +- canon = name; ++ { ++ /* Set to name now to avoid using ++ gethostbyaddr. */ ++ if (malloc_canonbuf) ++ { ++ free (canonbuf); ++ malloc_canonbuf = false; ++ } ++ canon = name; ++ } + } + } + status = NSS_STATUS_SUCCESS; +@@ -878,22 +1042,27 @@ gaih_inet (const char *name, const struc + { + /* If both requests timed out report this. */ + if (no_data == EAI_AGAIN && no_inet6_data == EAI_AGAIN) +- return -EAI_AGAIN; ++ result = -EAI_AGAIN; ++ else ++ /* We made requests but they turned out no data. The name ++ is known, though. */ ++ result = GAIH_OKIFUNSPEC | -EAI_NODATA; + +- /* We made requests but they turned out no data. The name +- is known, though. */ +- return GAIH_OKIFUNSPEC | -EAI_NODATA; ++ goto free_and_return; + } + } + + process_list: + if (at->family == AF_UNSPEC) +- return GAIH_OKIFUNSPEC | -EAI_NONAME; ++ { ++ result = GAIH_OKIFUNSPEC | -EAI_NONAME; ++ goto free_and_return; ++ } + } + else + { + struct gaih_addrtuple *atr; +- atr = at = __alloca (sizeof (struct gaih_addrtuple)); ++ atr = at = alloca_account (sizeof (struct gaih_addrtuple), alloca_used); + memset (at, '\0', sizeof (struct gaih_addrtuple)); + + if (req->ai_family == AF_UNSPEC) +@@ -932,6 +1101,9 @@ gaih_inet (const char *name, const struc + /* Only the first entry gets the canonical name. */ + if (at2 == at && (req->ai_flags & AI_CANONNAME) != 0) + { ++ char *tmpbuf2 = NULL; ++ bool malloc_tmpbuf2 = false; ++ + if (canon == NULL) + { + /* If the canonical name cannot be determined, use +@@ -952,11 +1124,16 @@ gaih_inet (const char *name, const struc + int rc = __idna_to_unicode_lzlz (canon, &out, idn_flags); + if (rc != IDNA_SUCCESS) + { ++ if (malloc_tmpbuf2) ++ free (tmpbuf2); ++ + if (rc == IDNA_MALLOC_ERROR) +- return -EAI_MEMORY; +- if (rc == IDNA_DLOPEN_ERROR) +- return -EAI_SYSTEM; +- return -EAI_IDN_ENCODE; ++ result = -EAI_MEMORY; ++ else if (rc == IDNA_DLOPEN_ERROR) ++ result = -EAI_SYSTEM; ++ else ++ result = -EAI_IDN_ENCODE; ++ goto free_and_return; + } + /* In case the output string is the same as the input + string no new string has been allocated and we +@@ -970,10 +1147,25 @@ gaih_inet (const char *name, const struc + #ifdef HAVE_LIBIDN + make_copy: + #endif +- canon = strdup (canon); +- if (canon == NULL) +- return -EAI_MEMORY; ++ if (malloc_canonbuf) ++ /* We already allocated the string using malloc. */ ++ malloc_canonbuf = false; ++ else ++ { ++ canon = strdup (canon); ++ if (canon == NULL) ++ { ++ if (malloc_tmpbuf2) ++ free (tmpbuf2); ++ ++ result = -EAI_MEMORY; ++ goto free_and_return; ++ } ++ } + } ++ ++ if (malloc_tmpbuf2) ++ free (tmpbuf2); + } + + family = at2->family; +@@ -999,7 +1191,8 @@ gaih_inet (const char *name, const struc + if (ai == NULL) + { + free ((char *) canon); +- return -EAI_MEMORY; ++ result = -EAI_MEMORY; ++ goto free_and_return; + } + + ai->ai_flags = req->ai_flags; +@@ -1052,7 +1245,18 @@ gaih_inet (const char *name, const struc + at2 = at2->next; + } + } +- return 0; ++ ++ free_and_return: ++ if (malloc_name) ++ free ((char *) name); ++ if (malloc_addrmem) ++ free (addrmem); ++ if (malloc_canonbuf) ++ free (canonbuf); ++ if (malloc_tmpbuf) ++ free (tmpbuf); ++ ++ return result; + } + + diff --git a/SOURCES/glibc-rh797094-2.patch b/SOURCES/glibc-rh797094-2.patch new file mode 100644 index 0000000..5aa9084 --- /dev/null +++ b/SOURCES/glibc-rh797094-2.patch @@ -0,0 +1,862 @@ +From: Ulrich Drepper +Date: Mon, 23 May 2011 03:04:16 +0000 (-0400) +Subject: Add a few more alloca size checks +X-Git-Tag: glibc-2.14~41 +X-Git-Url: http://sourceware.org/git/?p=glibc.git;a=commitdiff_plain;h=f2962a71959fd254a7a223437ca4b63b9e81130c + +Add a few more alloca size checks +--- + + 2011-05-22 Ulrich Drepper + + [BZ #12671] + * nis/nss_nis/nis-alias.c (_nss_nis_getaliasbyname_r): Use malloc in + some situations. + * nscd/nscd_getserv_r.c (nscd_getserv_r): Likewise. + * posix/glob.c (glob_in_dir): Take additional parameter alloca_used. + add in in __libc_use_alloca calls. Adjust callers. + (glob): Use malloc in some situations. +diff --git a/nis/nss_nis/nis-alias.c b/nis/nss_nis/nis-alias.c +index 9286e36..cfe4097 100644 +--- a/nis/nss_nis/nis-alias.c ++++ b/nis/nss_nis/nis-alias.c +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1996-2002, 2003, 2006 Free Software Foundation, Inc. ++/* Copyright (C) 1996-2002, 2003, 2006, 2011 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Thorsten Kukuk , 1996. + +@@ -142,10 +142,10 @@ internal_nis_getaliasent_r (struct aliasent *alias, char *buffer, + int yperr; + + if (new_start) +- yperr = yp_first (domain, "mail.aliases", &outkey, &keylen, &result, ++ yperr = yp_first (domain, "mail.aliases", &outkey, &keylen, &result, + &len); + else +- yperr = yp_next (domain, "mail.aliases", oldkey, oldkeylen, &outkey, ++ yperr = yp_next (domain, "mail.aliases", oldkey, oldkeylen, &outkey, + &keylen, &result, &len); + + if (__builtin_expect (yperr != YPERR_SUCCESS, 0)) +@@ -153,20 +153,20 @@ internal_nis_getaliasent_r (struct aliasent *alias, char *buffer, + enum nss_status retval = yperr2nss (yperr); + + if (retval == NSS_STATUS_TRYAGAIN) +- *errnop = errno; +- return retval; +- } ++ *errnop = errno; ++ return retval; ++ } + + if (__builtin_expect ((size_t) (len + 1) > buflen, 0)) +- { ++ { + free (result); +- *errnop = ERANGE; +- return NSS_STATUS_TRYAGAIN; +- } ++ *errnop = ERANGE; ++ return NSS_STATUS_TRYAGAIN; ++ } + char *p = strncpy (buffer, result, len); + buffer[len] = '\0'; + while (isspace (*p)) +- ++p; ++ ++p; + free (result); + + parse_res = _nss_nis_parse_aliasent (outkey, p, alias, buffer, +@@ -213,13 +213,25 @@ _nss_nis_getaliasbyname_r (const char *name, struct aliasent *alias, + return NSS_STATUS_UNAVAIL; + } + +- size_t namlen = strlen (name); +- char name2[namlen + 1]; +- + char *domain; + if (__builtin_expect (yp_get_default_domain (&domain), 0)) + return NSS_STATUS_UNAVAIL; + ++ size_t namlen = strlen (name); ++ char *name2; ++ int use_alloca = __libc_use_alloca (namlen + 1); ++ if (use_alloca) ++ name2 = __alloca (namlen + 1); ++ else ++ { ++ name2 = malloc (namlen + 1); ++ if (name2 == NULL) ++ { ++ *errnop = ENOMEM; ++ return NSS_STATUS_TRYAGAIN; ++ } ++ } ++ + /* Convert name to lowercase. */ + size_t i; + for (i = 0; i < namlen; ++i) +@@ -230,6 +242,9 @@ _nss_nis_getaliasbyname_r (const char *name, struct aliasent *alias, + int len; + int yperr = yp_match (domain, "mail.aliases", name2, namlen, &result, &len); + ++ if (!use_alloca) ++ free (name2); ++ + if (__builtin_expect (yperr != YPERR_SUCCESS, 0)) + { + enum nss_status retval = yperr2nss (yperr); +diff --git a/nscd/nscd_getserv_r.c b/nscd/nscd_getserv_r.c +index dce4165..de96a57 100644 +--- a/nscd/nscd_getserv_r.c ++++ b/nscd/nscd_getserv_r.c +@@ -1,4 +1,4 @@ +-/* Copyright (C) 2007, 2009 Free Software Foundation, Inc. ++/* Copyright (C) 2007, 2009, 2011 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 2007. + +@@ -17,6 +17,7 @@ + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + ++#include + #include + #include + #include +@@ -80,6 +81,7 @@ nscd_getserv_r (const char *crit, size_t critlen, const char *proto, + { + int gc_cycle; + int nretries = 0; ++ size_t alloca_used = 0; + + /* If the mapping is available, try to search there instead of + communicating with the nscd. */ +@@ -88,13 +90,23 @@ nscd_getserv_r (const char *crit, size_t critlen, const char *proto, + &gc_cycle); + size_t protolen = proto == NULL ? 0 : strlen (proto); + size_t keylen = critlen + 1 + protolen + 1; +- char *key = alloca (keylen); ++ int alloca_key = __libc_use_alloca (keylen); ++ char *key; ++ if (alloca_key) ++ key = alloca_account (keylen, alloca_used); ++ else ++ { ++ key = malloc (keylen); ++ if (key == NULL) ++ return -1; ++ } + memcpy (__mempcpy (__mempcpy (key, crit, critlen), + "/", 1), proto ?: "", protolen + 1); + + retry:; + const char *s_name = NULL; + const char *s_proto = NULL; ++ int alloca_aliases_len = 0; + const uint32_t *aliases_len = NULL; + const char *aliases_list = NULL; + int retval = -1; +@@ -136,8 +148,22 @@ nscd_getserv_r (const char *crit, size_t critlen, const char *proto, + if (((uintptr_t) aliases_len & (__alignof__ (*aliases_len) - 1)) + != 0) + { +- uint32_t *tmp = alloca (serv_resp.s_aliases_cnt +- * sizeof (uint32_t)); ++ uint32_t *tmp; ++ alloca_aliases_len ++ = __libc_use_alloca (alloca_used ++ + (serv_resp.s_aliases_cnt ++ * sizeof (uint32_t))); ++ if (alloca_aliases_len) ++ tmp = __alloca (serv_resp.s_aliases_cnt * sizeof (uint32_t)); ++ else ++ { ++ tmp = malloc (serv_resp.s_aliases_cnt * sizeof (uint32_t)); ++ if (tmp == NULL) ++ { ++ retval = ENOMEM; ++ goto out; ++ } ++ } + aliases_len = memcpy (tmp, aliases_len, + serv_resp.s_aliases_cnt + * sizeof (uint32_t)); +@@ -217,8 +243,24 @@ nscd_getserv_r (const char *crit, size_t critlen, const char *proto, + + if (serv_resp.s_aliases_cnt > 0) + { +- aliases_len = alloca (serv_resp.s_aliases_cnt +- * sizeof (uint32_t)); ++ assert (alloca_aliases_len == 0); ++ alloca_aliases_len ++ = __libc_use_alloca (alloca_used ++ + (serv_resp.s_aliases_cnt ++ * sizeof (uint32_t))); ++ if (alloca_aliases_len) ++ aliases_len = alloca (serv_resp.s_aliases_cnt ++ * sizeof (uint32_t)); ++ else ++ { ++ aliases_len = malloc (serv_resp.s_aliases_cnt ++ * sizeof (uint32_t)); ++ if (aliases_len == NULL) ++ { ++ retval = ENOMEM; ++ goto out_close; ++ } ++ } + vec[n].iov_base = (void *) aliases_len; + vec[n].iov_len = serv_resp.s_aliases_cnt * sizeof (uint32_t); + +@@ -329,5 +371,10 @@ nscd_getserv_r (const char *crit, size_t critlen, const char *proto, + goto retry; + } + ++ if (!alloca_aliases_len) ++ free ((void *) aliases_len); ++ if (!alloca_key) ++ free (key); ++ + return retval; + } +diff --git a/posix/glob.c b/posix/glob.c +index 6df083a..79b6e50 100644 +--- a/posix/glob.c ++++ b/posix/glob.c +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1991-2002, 2003, 2004, 2005, 2006, 2007, 2008, 2010 ++/* Copyright (C) 1991-2002, 2003, 2004, 2005, 2006, 2007, 2008, 2010, 2011 + Free Software Foundation, Inc. + This file is part of the GNU C Library. + +@@ -199,7 +199,7 @@ static const char *next_brace_sub (const char *begin, int flags) __THROW; + + static int glob_in_dir (const char *pattern, const char *directory, + int flags, int (*errfunc) (const char *, int), +- glob_t *pglob); ++ glob_t *pglob, size_t alloca_used); + extern int __glob_pattern_type (const char *pattern, int quote) + attribute_hidden; + +@@ -253,13 +253,18 @@ glob (pattern, flags, errfunc, pglob) + glob_t *pglob; + { + const char *filename; +- const char *dirname; ++ char *dirname = NULL; + size_t dirlen; + int status; + size_t oldcount; + int meta; + int dirname_modified; ++ int malloc_dirname = 0; + glob_t dirs; ++ int retval = 0; ++#ifdef _LIBC ++ size_t alloca_used = 0; ++#endif + + if (pattern == NULL || pglob == NULL || (flags & ~__GLOB_FLAGS) != 0) + { +@@ -308,20 +313,26 @@ glob (pattern, flags, errfunc, pglob) + const char *next; + const char *rest; + size_t rest_len; +-#ifdef __GNUC__ +- char onealt[strlen (pattern) - 1]; +-#else +- char *onealt = (char *) malloc (strlen (pattern) - 1); +- if (onealt == NULL) ++ char *onealt; ++ size_t pattern_len = strlen (pattern) - 1; ++#ifdef _LIBC ++ int alloca_onealt = __libc_use_alloca (alloca_used + pattern_len); ++ if (alloca_onealt) ++ onealt = alloca_account (pattern_len, alloca_used); ++ else ++#endif + { +- if (!(flags & GLOB_APPEND)) ++ onealt = (char *) malloc (pattern_len); ++ if (onealt == NULL) + { +- pglob->gl_pathc = 0; +- pglob->gl_pathv = NULL; ++ if (!(flags & GLOB_APPEND)) ++ { ++ pglob->gl_pathc = 0; ++ pglob->gl_pathv = NULL; ++ } ++ return GLOB_NOSPACE; + } +- return GLOB_NOSPACE; + } +-#endif + + /* We know the prefix for all sub-patterns. */ + alt_start = mempcpy (onealt, pattern, begin - pattern); +@@ -332,9 +343,11 @@ glob (pattern, flags, errfunc, pglob) + if (next == NULL) + { + /* It is an illegal expression. */ +-#ifndef __GNUC__ +- free (onealt); ++ illegal_brace: ++#ifdef _LIBC ++ if (__builtin_expect (!alloca_onealt, 0)) + #endif ++ free (onealt); + return glob (pattern, flags & ~GLOB_BRACE, errfunc, pglob); + } + +@@ -344,13 +357,8 @@ glob (pattern, flags, errfunc, pglob) + { + rest = next_brace_sub (rest + 1, flags); + if (rest == NULL) +- { +- /* It is an illegal expression. */ +-#ifndef __GNUC__ +- free (onealt); +-#endif +- return glob (pattern, flags & ~GLOB_BRACE, errfunc, pglob); +- } ++ /* It is an illegal expression. */ ++ goto illegal_brace; + } + /* Please note that we now can be sure the brace expression + is well-formed. */ +@@ -386,9 +394,10 @@ glob (pattern, flags, errfunc, pglob) + /* If we got an error, return it. */ + if (result && result != GLOB_NOMATCH) + { +-#ifndef __GNUC__ +- free (onealt); ++#ifdef _LIBC ++ if (__builtin_expect (!alloca_onealt, 0)) + #endif ++ free (onealt); + if (!(flags & GLOB_APPEND)) + { + globfree (pglob); +@@ -406,9 +415,10 @@ glob (pattern, flags, errfunc, pglob) + assert (next != NULL); + } + +-#ifndef __GNUC__ +- free (onealt); ++#ifdef _LIBC ++ if (__builtin_expect (!alloca_onealt, 0)) + #endif ++ free (onealt); + + if (pglob->gl_pathc != firstc) + /* We found some entries. */ +@@ -455,7 +465,7 @@ glob (pattern, flags, errfunc, pglob) + case is nothing but a notation for a directory. */ + if ((flags & (GLOB_TILDE|GLOB_TILDE_CHECK)) && pattern[0] == '~') + { +- dirname = pattern; ++ dirname = (char *) pattern; + dirlen = strlen (pattern); + + /* Set FILENAME to NULL as a special flag. This is ugly but +@@ -473,9 +483,9 @@ glob (pattern, flags, errfunc, pglob) + + filename = pattern; + #ifdef _AMIGA +- dirname = ""; ++ dirname = (char *) ""; + #else +- dirname = "."; ++ dirname = (char *) "."; + #endif + dirlen = 0; + } +@@ -485,7 +495,7 @@ glob (pattern, flags, errfunc, pglob) + && (flags & GLOB_NOESCAPE) == 0)) + { + /* "/pattern" or "\\/pattern". */ +- dirname = "/"; ++ dirname = (char *) "/"; + dirlen = 1; + ++filename; + } +@@ -511,7 +521,17 @@ glob (pattern, flags, errfunc, pglob) + from "d:/", since "d:" and "d:/" are not the same.*/ + } + #endif +- newp = (char *) __alloca (dirlen + 1); ++#ifdef _LIBC ++ if (__libc_use_alloca (alloca_used + dirlen + 1)) ++ newp = alloca_account (dirlen + 1, alloca_used); ++ else ++#endif ++ { ++ newp = malloc (dirlen + 1); ++ if (newp == NULL) ++ return GLOB_NOSPACE; ++ malloc_dirname = 1; ++ } + *((char *) mempcpy (newp, pattern, dirlen)) = '\0'; + dirname = newp; + ++filename; +@@ -551,7 +571,8 @@ glob (pattern, flags, errfunc, pglob) + oldcount = pglob->gl_pathc + pglob->gl_offs; + goto no_matches; + } +- return val; ++ retval = val; ++ goto out; + } + } + +@@ -563,7 +584,8 @@ glob (pattern, flags, errfunc, pglob) + && (dirname[2] == '\0' || dirname[2] == '/'))) + { + /* Look up home directory. */ +- const char *home_dir = getenv ("HOME"); ++ char *home_dir = getenv ("HOME"); ++ int malloc_home_dir = 0; + # ifdef _AMIGA + if (home_dir == NULL || home_dir[0] == '\0') + home_dir = "SYS:"; +@@ -582,7 +604,7 @@ glob (pattern, flags, errfunc, pglob) + /* `sysconf' does not support _SC_LOGIN_NAME_MAX. Try + a moderate value. */ + buflen = 20; +- name = (char *) __alloca (buflen); ++ name = alloca_account (buflen, alloca_used); + + success = getlogin_r (name, buflen) == 0; + if (success) +@@ -592,6 +614,7 @@ glob (pattern, flags, errfunc, pglob) + long int pwbuflen = GETPW_R_SIZE_MAX (); + char *pwtmpbuf; + struct passwd pwbuf; ++ int malloc_pwtmpbuf = 0; + int save = errno; + + # ifndef _LIBC +@@ -600,7 +623,18 @@ glob (pattern, flags, errfunc, pglob) + Try a moderate value. */ + pwbuflen = 1024; + # endif +- pwtmpbuf = (char *) __alloca (pwbuflen); ++ if (__libc_use_alloca (alloca_used + pwbuflen)) ++ pwtmpbuf = alloca_account (pwbuflen, alloca_used); ++ else ++ { ++ pwtmpbuf = malloc (pwbuflen); ++ if (pwtmpbuf == NULL) ++ { ++ retval = GLOB_NOSPACE; ++ goto out; ++ } ++ malloc_pwtmpbuf = 1; ++ } + + while (getpwnam_r (name, &pwbuf, pwtmpbuf, pwbuflen, &p) + != 0) +@@ -610,46 +644,115 @@ glob (pattern, flags, errfunc, pglob) + p = NULL; + break; + } +-# ifdef _LIBC +- pwtmpbuf = extend_alloca (pwtmpbuf, pwbuflen, ++ ++ if (!malloc_pwtmpbuf ++ && __libc_use_alloca (alloca_used ++ + 2 * pwbuflen)) ++ pwtmpbuf = extend_alloca_account (pwtmpbuf, pwbuflen, ++ 2 * pwbuflen, ++ alloca_used); ++ else ++ { ++ char *newp = realloc (malloc_pwtmpbuf ++ ? pwtmpbuf : NULL, + 2 * pwbuflen); +-# else +- pwbuflen *= 2; +- pwtmpbuf = (char *) __alloca (pwbuflen); +-# endif ++ if (newp == NULL) ++ { ++ if (__builtin_expect (malloc_pwtmpbuf, 0)) ++ free (pwtmpbuf); ++ retval = GLOB_NOSPACE; ++ goto out; ++ } ++ pwtmpbuf = newp; ++ pwbuflen = 2 * pwbuflen; ++ malloc_pwtmpbuf = 1; ++ } + __set_errno (save); + } + # else + p = getpwnam (name); + # endif + if (p != NULL) +- home_dir = p->pw_dir; ++ { ++ if (!malloc_pwtmpbuf) ++ home_dir = p->pw_dir; ++ else ++ { ++ size_t home_dir_len = strlen (p->pw_dir) + 1; ++ if (__libc_use_alloca (alloca_used + home_dir_len)) ++ home_dir = alloca_account (home_dir_len, ++ alloca_used); ++ else ++ { ++ home_dir = malloc (home_dir_len); ++ if (home_dir == NULL) ++ { ++ free (pwtmpbuf); ++ retval = GLOB_NOSPACE; ++ goto out; ++ } ++ malloc_home_dir = 1; ++ } ++ memcpy (home_dir, p->pw_dir, home_dir_len); ++ ++ free (pwtmpbuf); ++ } ++ } + } + } + if (home_dir == NULL || home_dir[0] == '\0') + { + if (flags & GLOB_TILDE_CHECK) +- return GLOB_NOMATCH; ++ { ++ if (__builtin_expect (malloc_home_dir, 0)) ++ free (home_dir); ++ retval = GLOB_NOMATCH; ++ goto out; ++ } + else +- home_dir = "~"; /* No luck. */ ++ home_dir = (char *) "~"; /* No luck. */ + } + # endif /* WINDOWS32 */ + # endif + /* Now construct the full directory. */ + if (dirname[1] == '\0') + { ++ if (__builtin_expect (malloc_dirname, 0)) ++ free (dirname); ++ + dirname = home_dir; + dirlen = strlen (dirname); ++ malloc_dirname = malloc_home_dir; + } + else + { + char *newp; + size_t home_len = strlen (home_dir); +- newp = (char *) __alloca (home_len + dirlen); ++ int use_alloca = __libc_use_alloca (alloca_used ++ + home_len + dirlen); ++ if (use_alloca) ++ newp = alloca_account (home_len + dirlen, alloca_used); ++ else ++ { ++ newp = malloc (home_len + dirlen); ++ if (newp == NULL) ++ { ++ if (__builtin_expect (malloc_home_dir, 0)) ++ free (home_dir); ++ retval = GLOB_NOSPACE; ++ goto out; ++ } ++ } ++ + mempcpy (mempcpy (newp, home_dir, home_len), + &dirname[1], dirlen); ++ ++ if (__builtin_expect (malloc_dirname, 0)) ++ free (dirname); ++ + dirname = newp; + dirlen += home_len - 1; ++ malloc_dirname = !use_alloca; + } + dirname_modified = 1; + } +@@ -657,7 +760,8 @@ glob (pattern, flags, errfunc, pglob) + else + { + char *end_name = strchr (dirname, '/'); +- const char *user_name; ++ char *user_name; ++ int malloc_user_name = 0; + const char *home_dir; + char *unescape = NULL; + +@@ -677,7 +781,18 @@ glob (pattern, flags, errfunc, pglob) + else + { + char *newp; +- newp = (char *) __alloca (end_name - dirname); ++ if (__libc_use_alloca (alloca_used + (end_name - dirname))) ++ newp = alloca_account (end_name - dirname, alloca_used); ++ else ++ { ++ newp = malloc (end_name - dirname); ++ if (newp == NULL) ++ { ++ retval = GLOB_NOSPACE; ++ goto out; ++ } ++ malloc_user_name = 1; ++ } + if (unescape != NULL) + { + char *p = mempcpy (newp, dirname + 1, +@@ -714,6 +829,7 @@ glob (pattern, flags, errfunc, pglob) + # if defined HAVE_GETPWNAM_R || defined _LIBC + long int buflen = GETPW_R_SIZE_MAX (); + char *pwtmpbuf; ++ int malloc_pwtmpbuf = 0; + struct passwd pwbuf; + int save = errno; + +@@ -723,7 +839,21 @@ glob (pattern, flags, errfunc, pglob) + moderate value. */ + buflen = 1024; + # endif +- pwtmpbuf = (char *) __alloca (buflen); ++ if (__libc_use_alloca (alloca_used + buflen)) ++ pwtmpbuf = alloca_account (buflen, alloca_used); ++ else ++ { ++ pwtmpbuf = malloc (buflen); ++ if (pwtmpbuf == NULL) ++ { ++ nomem_getpw: ++ if (__builtin_expect (malloc_user_name, 0)) ++ free (user_name); ++ retval = GLOB_NOSPACE; ++ goto out; ++ } ++ malloc_pwtmpbuf = 1; ++ } + + while (getpwnam_r (user_name, &pwbuf, pwtmpbuf, buflen, &p) != 0) + { +@@ -732,40 +862,77 @@ glob (pattern, flags, errfunc, pglob) + p = NULL; + break; + } +-# ifdef _LIBC +- pwtmpbuf = extend_alloca (pwtmpbuf, buflen, 2 * buflen); +-# else +- buflen *= 2; +- pwtmpbuf = __alloca (buflen); +-# endif ++ if (!malloc_pwtmpbuf ++ && __libc_use_alloca (alloca_used + 2 * buflen)) ++ pwtmpbuf = extend_alloca_account (pwtmpbuf, buflen, ++ 2 * buflen, alloca_used); ++ else ++ { ++ char *newp = realloc (malloc_pwtmpbuf ? pwtmpbuf : NULL, ++ 2 * buflen); ++ if (newp == NULL) ++ { ++ if (__builtin_expect (malloc_pwtmpbuf, 0)) ++ free (pwtmpbuf); ++ goto nomem_getpw; ++ } ++ pwtmpbuf = newp; ++ malloc_pwtmpbuf = 1; ++ } + __set_errno (save); + } + # else + p = getpwnam (user_name); + # endif ++ ++ if (__builtin_expect (malloc_user_name, 0)) ++ free (user_name); ++ ++ /* If we found a home directory use this. */ + if (p != NULL) +- home_dir = p->pw_dir; ++ { ++ size_t home_len = strlen (p->pw_dir); ++ size_t rest_len = end_name == NULL ? 0 : strlen (end_name); ++ ++ if (__builtin_expect (malloc_dirname, 0)) ++ free (dirname); ++ malloc_dirname = 0; ++ ++ if (__libc_use_alloca (alloca_used + home_len + rest_len + 1)) ++ dirname = alloca_account (home_len + rest_len + 1, ++ alloca_used); ++ else ++ { ++ dirname = malloc (home_len + rest_len + 1); ++ if (dirname == NULL) ++ { ++ if (__builtin_expect (malloc_pwtmpbuf, 0)) ++ free (pwtmpbuf); ++ retval = GLOB_NOSPACE; ++ goto out; ++ } ++ malloc_dirname = 1; ++ } ++ *((char *) mempcpy (mempcpy (dirname, p->pw_dir, home_len), ++ end_name, rest_len)) = '\0'; ++ ++ dirlen = home_len + rest_len; ++ dirname_modified = 1; ++ ++ if (__builtin_expect (malloc_pwtmpbuf, 0)) ++ free (pwtmpbuf); ++ } + else +- home_dir = NULL; ++ { ++ if (__builtin_expect (malloc_pwtmpbuf, 0)) ++ free (pwtmpbuf); ++ ++ if (flags & GLOB_TILDE_CHECK) ++ /* We have to regard it as an error if we cannot find the ++ home directory. */ ++ return GLOB_NOMATCH; ++ } + } +- /* If we found a home directory use this. */ +- if (home_dir != NULL) +- { +- char *newp; +- size_t home_len = strlen (home_dir); +- size_t rest_len = end_name == NULL ? 0 : strlen (end_name); +- newp = (char *) __alloca (home_len + rest_len + 1); +- *((char *) mempcpy (mempcpy (newp, home_dir, home_len), +- end_name, rest_len)) = '\0'; +- dirname = newp; +- dirlen = home_len + rest_len; +- dirname_modified = 1; +- } +- else +- if (flags & GLOB_TILDE_CHECK) +- /* We have to regard it as an error if we cannot find the +- home directory. */ +- return GLOB_NOMATCH; + } + # endif /* Not Amiga && not WINDOWS32. */ + } +@@ -899,7 +1066,7 @@ glob (pattern, flags, errfunc, pglob) + status = glob_in_dir (filename, dirs.gl_pathv[i], + ((flags | GLOB_APPEND) + & ~(GLOB_NOCHECK | GLOB_NOMAGIC)), +- errfunc, pglob); ++ errfunc, pglob, alloca_used); + if (status == GLOB_NOMATCH) + /* No matches in this directory. Try the next. */ + continue; +@@ -1000,7 +1167,8 @@ glob (pattern, flags, errfunc, pglob) + } + if (dirname_modified) + flags &= ~(GLOB_NOCHECK | GLOB_NOMAGIC); +- status = glob_in_dir (filename, dirname, flags, errfunc, pglob); ++ status = glob_in_dir (filename, dirname, flags, errfunc, pglob, ++ alloca_used); + if (status != 0) + { + if (status == GLOB_NOMATCH && flags != orig_flags +@@ -1063,7 +1231,11 @@ glob (pattern, flags, errfunc, pglob) + sizeof (char *), collated_compare); + } + +- return 0; ++ out: ++ if (__builtin_expect (malloc_dirname, 0)) ++ free (dirname); ++ ++ return retval; + } + #if defined _LIBC && !defined glob + libc_hidden_def (glob) +@@ -1273,7 +1445,7 @@ link_exists2_p (const char *dir, size_t dirlen, const char *fname, + static int + glob_in_dir (const char *pattern, const char *directory, int flags, + int (*errfunc) (const char *, int), +- glob_t *pglob) ++ glob_t *pglob, size_t alloca_used) + { + size_t dirlen = strlen (directory); + void *stream = NULL; +@@ -1288,11 +1460,12 @@ glob_in_dir (const char *pattern, const char *directory, int flags, + struct globnames *names = &init_names; + struct globnames *names_alloca = &init_names; + size_t nfound = 0; +- size_t allocasize = sizeof (init_names); + size_t cur = 0; + int meta; + int save; + ++ alloca_used += sizeof (init_names); ++ + init_names.next = NULL; + init_names.count = INITIAL_COUNT; + +@@ -1308,20 +1481,36 @@ glob_in_dir (const char *pattern, const char *directory, int flags, + { + /* Since we use the normal file functions we can also use stat() + to verify the file is there. */ +- struct stat st; +- struct_stat64 st64; ++ union ++ { ++ struct stat st; ++ struct_stat64 st64; ++ } ust; + size_t patlen = strlen (pattern); +- char *fullname = (char *) __alloca (dirlen + 1 + patlen + 1); ++ int alloca_fullname = __libc_use_alloca (alloca_used ++ + dirlen + 1 + patlen + 1); ++ char *fullname; ++ if (alloca_fullname) ++ fullname = alloca_account (dirlen + 1 + patlen + 1, alloca_used); ++ else ++ { ++ fullname = malloc (dirlen + 1 + patlen + 1); ++ if (fullname == NULL) ++ return GLOB_NOSPACE; ++ } + + mempcpy (mempcpy (mempcpy (fullname, directory, dirlen), + "/", 1), + pattern, patlen + 1); + if ((__builtin_expect (flags & GLOB_ALTDIRFUNC, 0) +- ? (*pglob->gl_stat) (fullname, &st) +- : __stat64 (fullname, &st64)) == 0) ++ ? (*pglob->gl_stat) (fullname, &ust.st) ++ : __stat64 (fullname, &ust.st64)) == 0) + /* We found this file to be existing. Now tell the rest + of the function to copy this name into the result. */ + flags |= GLOB_NOCHECK; ++ ++ if (__builtin_expect (!alloca_fullname, 0)) ++ free (fullname); + } + else + { +@@ -1409,9 +1598,9 @@ glob_in_dir (const char *pattern, const char *directory, int flags, + size_t size = (sizeof (struct globnames) + + ((count - INITIAL_COUNT) + * sizeof (char *))); +- allocasize += size; +- if (__libc_use_alloca (allocasize)) +- newnames = names_alloca = __alloca (size); ++ if (__libc_use_alloca (alloca_used + size)) ++ newnames = names_alloca ++ = alloca_account (size, alloca_used); + else if ((newnames = malloc (size)) + == NULL) + goto memory_error; diff --git a/SOURCES/glibc-rh804630.patch b/SOURCES/glibc-rh804630.patch new file mode 100644 index 0000000..75dbe94 --- /dev/null +++ b/SOURCES/glibc-rh804630.patch @@ -0,0 +1,23 @@ +diff -rup c/resolv/res_send.c d/resolv/res_send.c +--- c/resolv/res_send.c 2012-01-01 05:16:32.000000000 -0700 ++++ d/resolv/res_send.c 2012-03-30 12:39:30.862467628 -0600 +@@ -409,6 +409,7 @@ __libc_res_nsend(res_state statp, const + */ + if (EXT(statp).nsinit == 0) { + unsigned char map[MAXNS]; ++ unsigned int ext_total_nscount; + + memset (map, MAXNS, sizeof (map)); + for (n = 0; n < MAXNS; n++) { +@@ -422,8 +423,9 @@ __libc_res_nsend(res_state statp, const + } + } + n = statp->nscount; +- if (statp->nscount > EXT(statp).nscount) +- for (n = EXT(statp).nscount, ns = 0; ++ ext_total_nscount = EXT(statp).nscount + EXT(statp).nscount6; ++ if (statp->nscount > ext_total_nscount) ++ for (n = ext_total_nscount, ns = 0; + n < statp->nscount; n++) { + while (ns < MAXNS + && EXT(statp).nsmap[ns] != MAXNS) diff --git a/SOURCES/glibc-rh804689.patch b/SOURCES/glibc-rh804689.patch new file mode 100644 index 0000000..a96a33f --- /dev/null +++ b/SOURCES/glibc-rh804689.patch @@ -0,0 +1,23 @@ +diff -rup a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c +--- a/sysdeps/posix/getaddrinfo.c 2012-03-20 21:31:14.177358937 -0600 ++++ b/sysdeps/posix/getaddrinfo.c 2012-03-21 09:13:17.198290683 -0600 +@@ -560,15 +563,11 @@ gaih_inet (const char *name, const struc + int no_more; + int old_res_options; + +- /* If we do not have to look for IPv4 and IPv6 together, use +- the simple, old functions. */ +- if ((req->ai_family == AF_INET +- || (req->ai_family == AF_INET6 +- && ((req->ai_flags & AI_V4MAPPED) == 0 +- || (req->ai_flags & AI_ALL) == 0))) +- && (req->ai_flags & AI_CANONNAME) == 0) ++ /* If we do not have to look for IPv6 addresses, use ++ the simple, old functions, which do not support ++ IPv6 scope ids. */ ++ if (req->ai_family == AF_INET) + { +- int family = req->ai_family; + size_t tmpbuflen = 512; + assert (tmpbuf == NULL); + tmpbuf = alloca_account (tmpbuflen, alloca_used); diff --git a/SOURCES/glibc-rh808337.patch b/SOURCES/glibc-rh808337.patch new file mode 100644 index 0000000..bc20cbc --- /dev/null +++ b/SOURCES/glibc-rh808337.patch @@ -0,0 +1,21 @@ +commit 6a5ee1029b3966c5ae9adaaa881e255b2880f511 +Author: Ulrich Drepper +Date: Sun Mar 6 00:01:50 2011 -0500 + + Fix loading first object along a path when tracing. + +diff --git a/elf/dl-load.c b/elf/dl-load.c +index 1ad16a0..f866066 100644 +--- a/elf/dl-load.c ++++ b/elf/dl-load.c +@@ -2111,7 +2111,9 @@ _dl_map_object (struct link_map *loader, const char *name, + { + #ifdef SHARED + // XXX Correct to unconditionally default to namespace 0? +- l = loader ?: GL(dl_ns)[LM_ID_BASE]._ns_loaded; ++ l = (loader ++ ?: GL(dl_ns)[LM_ID_BASE]._ns_loaded ++ ?: &GL(dl_rtld_map)); + #else + l = loader; + #endif diff --git a/SOURCES/glibc-rh808545.patch b/SOURCES/glibc-rh808545.patch new file mode 100644 index 0000000..9a2cae3 --- /dev/null +++ b/SOURCES/glibc-rh808545.patch @@ -0,0 +1,44 @@ +diff -rup a/resolv/nss_dns/dns-host.c b/resolv/nss_dns/dns-host.c +--- a/resolv/nss_dns/dns-host.c 2012-04-18 11:17:31.527539744 -0600 ++++ b/resolv/nss_dns/dns-host.c 2012-04-18 11:21:45.441394159 -0600 +@@ -745,6 +745,10 @@ getanswer_r (const querybuf *answer, int + + if ((qtype == T_A || qtype == T_AAAA) && type == T_CNAME) + { ++ /* A CNAME could also have a TTL entry. */ ++ if (ttlp != NULL && ttl < *ttlp) ++ *ttlp = ttl; ++ + if (ap >= &host_data->aliases[MAX_NR_ALIASES - 1]) + continue; + n = dn_expand (answer->buf, end_of_message, cp, tbuf, sizeof tbuf); +@@ -906,7 +910,7 @@ getanswer_r (const querybuf *answer, int + { + register int nn; + +- if (ttlp != NULL) ++ if (ttlp != NULL && ttl < *ttlp) + *ttlp = ttl; + if (canonp != NULL) + *canonp = bp; +@@ -1082,6 +1086,11 @@ gaih_getanswer_slice (const querybuf *an + if (type == T_CNAME) + { + char tbuf[MAXDNAME]; ++ ++ /* A CNAME could also have a TTL entry. */ ++ if (ttlp != NULL && ttl < *ttlp) ++ *ttlp = ttl; ++ + n = dn_expand (answer->buf, end_of_message, cp, tbuf, sizeof tbuf); + if (__builtin_expect (n < 0 || res_hnok (tbuf) == 0, 0)) + { +@@ -1162,7 +1171,7 @@ gaih_getanswer_slice (const querybuf *an + + if (*firstp) + { +- if (ttlp != NULL) ++ if (ttlp != NULL && ttl < *ttlp) + *ttlp = ttl; + + (*pat)->name = canon ?: h_name; diff --git a/SOURCES/glibc-rh809602.patch b/SOURCES/glibc-rh809602.patch new file mode 100644 index 0000000..81aa63a --- /dev/null +++ b/SOURCES/glibc-rh809602.patch @@ -0,0 +1,47 @@ +diff -rup a/nscd/nscd_getserv_r.c b/nscd/nscd_getserv_r.c +--- a/nscd/nscd_getserv_r.c 2012-04-04 16:37:27.873951850 -0600 ++++ b/nscd/nscd_getserv_r.c 2012-04-04 16:37:49.904837348 -0600 +@@ -124,6 +123,7 @@ nscd_getserv_r (const char *crit, size_t + s_name = (char *) (&found->data[0].servdata + 1); + serv_resp = found->data[0].servdata; + s_proto = s_name + serv_resp.s_name_len; ++ alloca_aliases_len = 1; + aliases_len = (uint32_t *) (s_proto + serv_resp.s_proto_len); + aliases_list = ((char *) aliases_len + + serv_resp.s_aliases_cnt * sizeof (uint32_t)); +@@ -154,7 +154,9 @@ nscd_getserv_r (const char *crit, size_t + + (serv_resp.s_aliases_cnt + * sizeof (uint32_t))); + if (alloca_aliases_len) +- tmp = __alloca (serv_resp.s_aliases_cnt * sizeof (uint32_t)); ++ tmp = alloca_account (serv_resp.s_aliases_cnt ++ * sizeof (uint32_t), ++ alloca_used); + else + { + tmp = malloc (serv_resp.s_aliases_cnt * sizeof (uint32_t)); +@@ -249,8 +251,9 @@ nscd_getserv_r (const char *crit, size_t + + (serv_resp.s_aliases_cnt + * sizeof (uint32_t))); + if (alloca_aliases_len) +- aliases_len = alloca (serv_resp.s_aliases_cnt +- * sizeof (uint32_t)); ++ aliases_len = alloca_account (serv_resp.s_aliases_cnt ++ * sizeof (uint32_t), ++ alloca_used); + else + { + aliases_len = malloc (serv_resp.s_aliases_cnt +@@ -368,7 +371,11 @@ nscd_getserv_r (const char *crit, size_t + } + + if (retval != -1) +- goto retry; ++ { ++ if (!alloca_aliases_len) ++ free ((void *) aliases_len); ++ goto retry; ++ } + } + + if (!alloca_aliases_len) diff --git a/SOURCES/glibc-rh883974-2.patch b/SOURCES/glibc-rh883974-2.patch new file mode 100644 index 0000000..393c466 --- /dev/null +++ b/SOURCES/glibc-rh883974-2.patch @@ -0,0 +1,21 @@ +diff -Nrup a/timezone/zic.c b/timezone/zic.c +--- a/timezone/zic.c 2013-07-19 07:25:11.726506479 -0600 ++++ b/timezone/zic.c 2013-07-19 07:27:15.059083404 -0600 +@@ -2473,14 +2473,12 @@ oadd(t1, t2) + const long t1; + const long t2; + { +- register long t; +- +- t = t1 + t2; +- if ((t2 > 0 && t <= t1) || (t2 < 0 && t >= t1)) { ++ if (t1 < 0 ? t2 < LONG_MIN - t1 : LONG_MAX - t1 < t2) { + error(_("time overflow")); + exit(EXIT_FAILURE); + } +- return t; ++ ++ return t1 + t2; + } + + static zic_t diff --git a/SOURCES/glibc-rh883974.patch b/SOURCES/glibc-rh883974.patch new file mode 100644 index 0000000..d083eab --- /dev/null +++ b/SOURCES/glibc-rh883974.patch @@ -0,0 +1,48 @@ +diff -Nrup a/crypt/md5.c b/crypt/md5.c +--- a/crypt/md5.c 2010-05-04 05:27:23.000000000 -0600 ++++ b/crypt/md5.c 2013-01-02 13:21:20.140576889 -0700 +@@ -1,6 +1,6 @@ + /* Functions to compute MD5 message digest of files or memory blocks. + according to the definition of MD5 in RFC 1321 from April 1992. +- Copyright (C) 1995,1996,1997,1999,2000,2001,2005 ++ Copyright (C) 1995,1996,1997,1999,2000,2001,2005,2011 + Free Software Foundation, Inc. + This file is part of the GNU C Library. + +@@ -123,9 +123,9 @@ md5_finish_ctx (ctx, resbuf) + memcpy (&ctx->buffer[bytes], fillbuf, pad); + + /* Put the 64-bit file length in *bits* at the end of the buffer. */ +- *(md5_uint32 *) &ctx->buffer[bytes + pad] = SWAP (ctx->total[0] << 3); +- *(md5_uint32 *) &ctx->buffer[bytes + pad + 4] = SWAP ((ctx->total[1] << 3) | +- (ctx->total[0] >> 29)); ++ ctx->buffer32[(bytes + pad) / 4] = SWAP (ctx->total[0] << 3); ++ ctx->buffer32[(bytes + pad + 4) / 4] = SWAP ((ctx->total[1] << 3) | ++ (ctx->total[0] >> 29)); + + /* Process last bytes. */ + md5_process_block (ctx->buffer, bytes + pad + 8, ctx); +diff -Nrup a/crypt/md5.h b/crypt/md5.h +--- a/crypt/md5.h 2010-05-04 05:27:23.000000000 -0600 ++++ b/crypt/md5.h 2013-01-02 13:21:20.140576889 -0700 +@@ -1,6 +1,6 @@ + /* Declaration of functions and data types used for MD5 sum computing + library functions. +- Copyright (C) 1995-1997,1999,2000,2001,2004,2005 ++ Copyright (C) 1995-1997,1999,2000,2001,2004,2005,2011 + Free Software Foundation, Inc. + This file is part of the GNU C Library. + +@@ -88,7 +88,11 @@ struct md5_ctx + + md5_uint32 total[2]; + md5_uint32 buflen; +- char buffer[128] __attribute__ ((__aligned__ (__alignof__ (md5_uint32)))); ++ union ++ { ++ char buffer[128]; ++ md5_uint32 buffer32[32]; ++ }; + }; + + /* diff --git a/SOURCES/glibc-rh911307.patch b/SOURCES/glibc-rh911307.patch new file mode 100644 index 0000000..83158a6 --- /dev/null +++ b/SOURCES/glibc-rh911307.patch @@ -0,0 +1,61 @@ +# +# Red Hat BZ: +# https://bugzilla.redhat.com/show_bug.cgi?id=911307 +# +# Sourceware BZ: None. +# +# Upstreamm submission: Not yet completed. +# +# ChangeLog +# +# 2013-02-27 Carlos O'Donell +# +# * elf/Makefile (CFLAGS-.o): Add -fno-tree-loop-distribute-patterns. +# (CFLAGS-.os): Likewise. +# (CFLAGS-.op): Likewise. +# (CFLAGS-.ob): Likewise. +# (CFLAGS-.oS): Likewise. +# * string/Makefile (CFLAGS-.o): Likewise. +# (CFLAGS-.os): Likewise. +# (CFLAGS-.op): Likewise. +# (CFLAGS-.ob): Likewise. +# (CFLAGS-.oS): Likewise. +# +diff -Nrup a/elf/Makefile b/elf/Makefile +--- a/elf/Makefile 2013-05-28 09:56:09.798610050 -0600 ++++ b/elf/Makefile 2013-05-28 13:30:20.007930731 -0600 +@@ -461,6 +461,16 @@ CFLAGS-cache.c = $(SYSCONF-FLAGS) + CPPFLAGS-.os += $(if $(filter $(@F),$(patsubst %,%.os,$(all-rtld-routines))),\ + -DNOT_IN_libc=1 -DIS_IN_rtld=1 -DIN_LIB=rtld) + ++# Disable any optimization which might result in function calls during early ++# dynamic loader startup. We disable -ftree-loop-distribute-patterns which ++# might convert code into calls to functions like memcpy or memset when the PLT ++# is not yet setup. ++CFLAGS-.o += -fno-tree-loop-distribute-patterns ++CFLAGS-.os += -fno-tree-loop-distribute-patterns ++CFLAGS-.op += -fno-tree-loop-distribute-patterns ++CFLAGS-.ob += -fno-tree-loop-distribute-patterns ++CFLAGS-.oS += -fno-tree-loop-distribute-patterns ++ + test-modules = $(addprefix $(objpfx),$(addsuffix .so,$(strip $(modules-names)))) + generated += $(addsuffix .so,$(strip $(modules-names))) + +diff -Nrup a/string/Makefile b/string/Makefile +--- a/string/Makefile 2013-05-28 09:56:09.534610913 -0600 ++++ b/string/Makefile 2013-05-28 13:31:01.693053657 -0600 +@@ -77,6 +77,14 @@ CFLAGS-test-ffs.c = -fno-builtin + CFLAGS-tst-inlcall.c = -fno-builtin + CFLAGS-bug-strstr1.c = -fno-builtin + ++# Disable any optimization which might result in function calls to the very ++# same functions we are trying to compile, thus creating an infinite loop. ++CFLAGS-.o += -fno-tree-loop-distribute-patterns ++CFLAGS-.os += -fno-tree-loop-distribute-patterns ++CFLAGS-.op += -fno-tree-loop-distribute-patterns ++CFLAGS-.ob += -fno-tree-loop-distribute-patterns ++CFLAGS-.oS += -fno-tree-loop-distribute-patterns ++ + ifeq ($(cross-compiling),no) + tests: $(objpfx)tst-svc.out + $(objpfx)tst-svc.out: tst-svc.input $(objpfx)tst-svc diff --git a/SPECS/compat-glibc.spec b/SPECS/compat-glibc.spec new file mode 100644 index 0000000..ef12a5d --- /dev/null +++ b/SPECS/compat-glibc.spec @@ -0,0 +1,560 @@ +%define glibcsrcdir glibc-2.12-2-gc4ccff1 +%define glibcversion 2.12 +### glibc.spec.in follows: +%define run_glibc_tests 1 +%define auxarches noarch +%define xenarches noarch +%define buildxen 0 +%define xenpackage 0 +%define buildpower6 0 +%define rtkaioarches noarch +%define debuginfocommonarches noarch +%define _unpackaged_files_terminate_build 0 +%undefine _enable_debug_packages +# What's the right thing to do with these? +# XXX +%define biarcharches noarch +%define multiarcharches noarch +%define systemtaparches noarch +# XXX + +Summary: Compatibility C library +Name: compat-glibc +# XXX Should this bump? +Epoch: 1 +Version: %{glibcversion} +Release: 4%{?dist} +# GPLv2+ is used in a bunch of programs, LGPLv2+ is used for libraries. +# Things that are linked directly into dynamically linked programs +# and shared libraries (e.g. crt files, lib*_nonshared.a) have an additional +# exception which allows linking it into any kind of programs or shared +# libraries without restrictions. +License: LGPLv2+ and LGPLv2+ with exceptions and GPLv2+ +Group: Development/Libraries +URL: http://sources.redhat.com/glibc/ +Source0: %{?glibc_release_url}%{glibcsrcdir}.tar.bz2 +Source1: %{glibcsrcdir}-fedora.tar.bz2 +Source2: dummylib.sh +Patch0: glibc-fedora.patch +Patch1: glibc-ia64-lib64.patch +Patch2: glibc-rh587360.patch +Patch3: glibc-rh582738.patch +Patch4: glibc-getlogin-r.patch +Patch5: glibc-localedata.patch +Patch6: glibc-rh593396.patch +Patch7: glibc-recvmmsg.patch +Patch8: glibc-aliasing.patch +Patch9: glibc-rh593686.patch +Patch10: glibc-rh607461.patch +Patch11: glibc-rh621959.patch +Patch12: glibc-rh607010.patch +Patch13: glibc-rh630801.patch +Patch14: glibc-rh631011.patch +Patch15: glibc-rh641128.patch +Patch16: glibc-rh642584.patch +Patch17: glibc-rh643822.patch +Patch18: glibc-rh645672.patch +Patch19: glibc-rh580498.patch +Patch20: glibc-rh615090.patch +Patch21: glibc-rh623187.patch +Patch22: glibc-rh646954.patch +Patch23: glibc-rh647448.patch +Patch24: glibc-rh615701.patch +Patch25: glibc-rh652661.patch +Patch26: glibc-rh656530.patch +Patch27: glibc-rh656014.patch +Patch28: glibc-rh661982.patch +Patch29: glibc-rh601686.patch +Patch30: glibc-rh676076.patch +Patch31: glibc-rh667974.patch +Patch32: glibc-rh625893.patch +Patch33: glibc-rh681054.patch +Patch34: glibc-rh689471.patch +Patch35: glibc-rh692177.patch +Patch36: glibc-rh692838.patch +Patch37: glibc-rh703480.patch +Patch38: glibc-rh705465.patch +Patch39: glibc-rh703481.patch +Patch40: glibc-rh694386.patch +Patch41: glibc-rh676591.patch +Patch42: glibc-rh711987.patch +Patch43: glibc-rh695595.patch +Patch45: glibc-rh695963.patch +Patch46: glibc-rh713134.patch +Patch47: glibc-rh714823.patch +Patch48: glibc-rh718057.patch +Patch49: glibc-rh688980.patch +Patch50: glibc-rh712248.patch +Patch51: glibc-rh731042.patch +Patch52: glibc-rh730379.patch +Patch53: glibc-rh700507.patch +Patch54: glibc-rh699724.patch +Patch55: glibc-rh736346.patch +Patch56: glibc-rh737778.patch +Patch57: glibc-rh738665.patch +Patch58: glibc-rh738763.patch +Patch59: glibc-rh739184.patch +Patch60: glibc-rh711927.patch +Patch61: glibc-rh688720.patch +Patch62: glibc-rh726517.patch +Patch63: glibc-rh752122.patch +Patch64: glibc-rh739971.patch +Patch65: glibc-rh751750.patch +Patch66: glibc-rh740506.patch +Patch67: glibc-rh757888.patch +Patch68: glibc-rh750531.patch +Patch69: glibc-rh749188.patch +Patch70: glibc-rh767746.patch +Patch72: glibc-rh767693.patch +Patch73: glibc-rh740506-2.patch +Patch74: glibc-rh696472.patch +Patch75: glibc-rh771342.patch +Patch76: glibc-rh657572.patch +Patch77: glibc-rh767693-2.patch +Patch78: glibc-rh782585.patch +Patch79: glibc-rh784402.patch +Patch80: glibc-rh697421.patch +Patch81: glibc-rh785984.patch +Patch82: glibc-rh767146.patch +Patch83: glibc-rh766513.patch +Patch84: glibc-rh789209.patch +Patch85: glibc-rh788959.patch +Patch86: glibc-rh789189.patch +Patch88: glibc-rh789238.patch +Patch89: glibc-rh794817.patch +Patch90: glibc-rh797094-1.patch +Patch91: glibc-rh797094-2.patch +Patch92: glibc-rh789238-2.patch +Patch93: glibc-rh795498.patch +Patch94: glibc-rh794817-2.patch +Patch95: glibc-rh804689.patch +Patch96: glibc-rh809602.patch +Patch97: glibc-rh808337.patch +Patch98: glibc-rh804630.patch +Patch99: glibc-rh788959-2.patch +Patch100: glibc-rh808545.patch + +Patch10000: glibc-fix-implicit-rule.patch +Patch10001: glibc-gcc47-ctordtor.patch +Patch10002: glibc-rh783979.patch + +# I'm not sure why we didn't see strict aliasing warnings with RHEL 6 builds, perhaps +# it's due to the newer compiler in RHEL 7. +Patch10003: glibc-rh883974.patch + +# GCC recently removed -mnew-mnemonics for PPC +Patch10004: glibc-ppc-mnemonics.patch + +# Disable -ftree-loop-distribute-patterns which converts open code to +# memset, memcpy, etc. This can cause infinte loops when compiling those +# routines in glibc. Furthermore it can create calls through the PLT in +# the dynamic linker when the PLT hasn't been set up yet. +Patch10005: glibc-rh911307.patch + +# Newer compiler is also complaining about overflow problems +Patch10006: glibc-rh883974-2.patch + +# Fix namespace conflict with Altivec +Patch10007: glibc-rh1048853.patch + +Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) +Autoreq: true +Autoprov: false +Requires: compat-glibc-headers = %{epoch}:%{version}-%{release} +# This is for building auxiliary programs like memusage, nscd +# For initial glibc bootstraps it can be commented out +BuildRequires: gd-devel libpng-devel zlib-devel texinfo, libselinux-devel >= 1.33.4-3 +BuildRequires: audit-libs-devel >= 1.1.3, sed >= 3.95, libcap-devel, gettext, nss-devel +BuildRequires: /bin/ps, /bin/kill, /bin/awk +%ifarch %{systemtaparches} +BuildRequires: systemtap-sdt-devel +%endif +# This is to ensure that __frame_state_for is exported by glibc +# will be compatible with egcs 1.x.y +BuildRequires: gcc >= 3.2 +%define enablekernel 2.6.18 +%ifarch i386 +%define nptl_target_cpu i486 +%else +%define nptl_target_cpu %{_target_cpu} +%endif +%ifarch %{multiarcharches} +# Need STT_IFUNC support +%ifarch ppc ppc64 +BuildRequires: binutils >= 2.20.51.0.2 +Conflicts: binutils < 2.20.51.0.2 +%else +BuildRequires: binutils >= 2.19.51.0.10 +Conflicts: binutils < 2.19.51.0.10 +%endif +# Earlier releases have broken support for IRELATIVE relocations +Conflicts: prelink < 0.4.2 +%else +# Need AS_NEEDED directive +# Need --hash-style=* support +BuildRequires: binutils >= 2.17.50.0.2-5 +%endif +BuildRequires: gcc >= 3.2.1-5 +%ifarch ppc s390 s390x +BuildRequires: gcc >= 4.1.0-0.17 +%endif +%if 0%{?_enable_debug_packages} +BuildRequires: elfutils >= 0.72 +BuildRequires: rpm >= 4.2-0.56 +%endif +%define __find_provides %{_builddir}/%{glibcsrcdir}/find_provides.sh +%define _filter_GLIBC_PRIVATE 1 + +%description +This package contains stub shared libraries and static libraries +from Red Hat Enterprise Linux 6. + +To compile and link against these compatibility libraries, use +gcc -fgnu89-inline \ + -I %{_prefix}/lib/%{_target_cpu}-redhat-linux6E/include \ + -B %{_prefix}/lib/%{_target_cpu}-redhat-linux6E/%{_lib}/ + + +%package headers +Summary: Header files for development using standard C libraries. +Group: Development/Libraries +Provides: %{name}-headers(%{_target_cpu}) +Requires: compat-glibc = %{epoch}:%{version}-%{release} +%ifarch x86_64 +# If both -m32 and -m64 is to be supported on AMD64, x86_64 glibc-headers +# have to be installed, not i586 ones. +Obsoletes: %{name}-headers(i586) +Obsoletes: %{name}-headers(i686) +%endif +Requires(pre): kernel-headers +Requires: kernel-headers >= 2.2.1 +Requires: %{name} = %{epoch}:%{version}-%{release} +BuildRequires: kernel-headers >= 2.6.22 + +%description headers +The compat-glibc-headers package contains the header files from +Red Hat Enterprise Linux 56 + + +%prep +%setup -q -n %{glibcsrcdir} -b1 +%patch0 -E -p1 +%ifarch ia64 +%if "%{_lib}" == "lib64" +%patch1 -p1 +%endif +%endif +%patch2 -p1 +%patch3 -p1 +%patch4 -p1 +%patch5 -p1 +%patch6 -p1 +%patch7 -p1 +%patch8 -p1 +%patch9 -p1 +%patch10 -p1 +%patch11 -p1 +%patch12 -p1 +%patch13 -p1 +%patch14 -p1 +%patch15 -p1 +%patch16 -p1 +%patch17 -p1 +%patch18 -p1 +%patch19 -p1 +%patch20 -p1 +%patch21 -p1 +%patch22 -p1 +%patch23 -p1 +%patch24 -p1 +%patch25 -p1 +%patch26 -p1 +%patch27 -p1 +%patch28 -p1 +%patch29 -p1 +%patch30 -p1 +%patch31 -p1 +%patch32 -p1 +%patch33 -p1 +%patch34 -p1 +%patch35 -p1 +%patch36 -p1 +%patch37 -p1 +%patch38 -p1 +%patch39 -p1 +%patch40 -p1 +%patch41 -p1 +%patch42 -p1 +%patch43 -p1 +%patch45 -p1 +%patch46 -p1 +%patch47 -p1 +%patch48 -p1 +%patch49 -p1 +%patch50 -p1 +%patch51 -p1 +%patch52 -p1 +%patch53 -p1 +%patch54 -p1 +%patch55 -p1 +%patch56 -p1 +%patch57 -p1 +%patch58 -p1 +%patch59 -p1 +%patch60 -p1 +%patch61 -p1 +%patch62 -p1 +%patch63 -p1 +%patch64 -p1 +%patch65 -p1 +%patch66 -p1 +%patch67 -p1 +%patch68 -p1 +%patch69 -p1 +%patch70 -p1 +%patch72 -p1 +%patch73 -p1 +%patch74 -p1 +%patch75 -p1 +%patch76 -p1 +%patch77 -p1 +%patch78 -p1 +%patch79 -p1 +%patch80 -p1 +%patch81 -p1 +%patch82 -p1 +%patch83 -p1 +%patch84 -p1 +%patch85 -p1 +%patch86 -p1 +%patch88 -p1 +%patch89 -p1 +%patch90 -p1 +%patch91 -p1 +%patch92 -p1 +%patch93 -p1 +%patch94 -p1 +%patch95 -p1 +%patch96 -p1 +%patch97 -p1 +%patch98 -p1 +%patch99 -p1 +%patch100 -p1 + +# These are compat-glibc specific changes necessary for the old glibc to +# build with new compilers. +%patch10000 -p1 +%patch10001 -p1 +%patch10002 -p1 +%patch10003 -p1 +%patch10004 -p1 +%patch10005 -p1 +%patch10006 -p1 +%patch10007 -p1 + +find . -type f -size 0 -o -name "*.orig" -exec rm -f {} \; +touch `find . -name configure` +touch locale/programs/*-kw.h + +%build +GCC=gcc +GXX=g++ +%ifarch %{ix86} +BuildFlags="-march=%{nptl_target_cpu} -mtune=generic" +%endif +%ifarch i686 +BuildFlags="-march=i686 -mtune=generic" +%endif +%ifarch i386 i486 i586 +BuildFlags="$BuildFlags -mno-tls-direct-seg-refs" +%endif +%ifarch x86_64 +BuildFlags="-mtune=generic" +%endif +%ifarch alphaev6 +BuildFlags="-mcpu=ev6" +%endif +%ifarch sparc +BuildFlags="-fcall-used-g6" +GCC="gcc -m32" +GXX="g++ -m32" +%endif +%ifarch sparcv9 +BuildFlags="-mcpu=ultrasparc -fcall-used-g6" +GCC="gcc -m32" +GXX="g++ -m32" +%endif +%ifarch sparcv9v +BuildFlags="-mcpu=niagara -fcall-used-g6" +GCC="gcc -m32" +GXX="g++ -m32" +%endif +%ifarch sparc64 +BuildFlags="-mcpu=ultrasparc -mvis -fcall-used-g6" +GCC="gcc -m64" +GXX="g++ -m64" +%endif +%ifarch sparc64v +BuildFlags="-mcpu=niagara -mvis -fcall-used-g6" +GCC="gcc -m64" +GXX="g++ -m64" +%endif +%ifarch ppc64 +BuildFlags="-mno-minimal-toc" +GCC="gcc -m64" +GXX="g++ -m64" +%endif + +BuildFlags="$BuildFlags -fgnu89-inline" +# Add -DNDEBUG unless using a prerelease +case %{version} in + *.*.9[0-9]*) ;; + *) + BuildFlags="$BuildFlags -DNDEBUG" + ;; +esac +EnableKernel="--enable-kernel=%{enablekernel}" +echo "$GCC" > Gcc +AddOns=`echo */configure | sed -e 's!/configure!!g;s!\(linuxthreads\|nptl\|rtkaio\|powerpc-cpu\)\( \|$\)!!g;s! \+$!!;s! !,!g;s!^!,!;/^,\*$/d'` +%ifarch %{rtkaioarches} +AddOns=,rtkaio$AddOns +%endif + +build_nptl() +{ +builddir=build-%{nptl_target_cpu}-$1 +shift +rm -rf $builddir +mkdir $builddir ; cd $builddir +build_CFLAGS="$BuildFlags -g -O3 $*" +../configure CC="$GCC" CXX="$GXX" CFLAGS="$build_CFLAGS" \ + --prefix=%{_prefix} \ + --enable-add-ons=nptl$AddOns --without-cvs $EnableKernel \ + --without-selinux \ + --with-headers=%{_prefix}/include --enable-bind-now \ + --with-tls --with-__thread --build %{nptl_target_cpu}-redhat-linux \ + --host %{nptl_target_cpu}-redhat-linux \ +%ifarch %{multiarcharches} + --enable-multi-arch \ +%endif +%ifarch %{systemtaparches} + --enable-systemtap \ +%endif + --disable-profile --enable-experimental-malloc --enable-nss-crypt + +make %{?_smp_mflags} -r CFLAGS="$build_CFLAGS" PARALLELMFLAGS=-s + +cd .. +} + +build_nptl linuxnptl + +%install +GCC=`cat Gcc` + +rm -rf $RPM_BUILD_ROOT +mkdir -p $RPM_BUILD_ROOT +make -j1 install_root=$RPM_BUILD_ROOT install -C build-%{nptl_target_cpu}-linuxnptl PARALLELMFLAGS=-s +chmod +x $RPM_BUILD_ROOT%{_prefix}/libexec/pt_chown +%ifnarch %{auxarches} +cd build-%{nptl_target_cpu}-linuxnptl && \ + make %{?_smp_mflags} install_root=$RPM_BUILD_ROOT install-locales -C ../localedata objdir=`pwd` && \ + cd .. +%endif + +# Remove the files we don't want to distribute +rm -f $RPM_BUILD_ROOT%{_prefix}/%{_lib}/libNoVersion* +rm -f $RPM_BUILD_ROOT/%{_lib}/libNoVersion* +rm -f $RPM_BUILD_ROOT{%{_prefix},}/%{_lib}/lib{NoVersion,nss,BrokenLocale}* + +# NPTL is not usable outside of glibc, so include +# the generic one (#162634) +cp -a bits/stdio-lock.h $RPM_BUILD_ROOT%{_prefix}/include/bits/stdio-lock.h +# And needs sanitizing as well. +cp -a fedora/libc-lock.h $RPM_BUILD_ROOT%{_prefix}/include/bits/libc-lock.h + +ln -sf libbsd-compat.a $RPM_BUILD_ROOT%{_prefix}/%{_lib}/libbsd.a + +strip -g $RPM_BUILD_ROOT%{_prefix}/%{_lib}/*.o + +# rquota.x and rquota.h are now provided by quota +rm -f $RPM_BUILD_ROOT%{_prefix}/include/rpcsvc/rquota.[hx] + +COMPATD=$RPM_BUILD_ROOT%{_prefix}/lib/%{_target_cpu}-redhat-linux6E + +mkdir -p $COMPATD/%{_lib} + +mv -f $RPM_BUILD_ROOT%{_prefix}/include $COMPATD/ +mv -f $RPM_BUILD_ROOT%{_prefix}/%{_lib}/*.[oa] $COMPATD/%{_lib} +strip -R .comment -g $COMPATD/%{_lib}/*.a +ln -sf libbsd-compat.a $COMPATD/%{_lib}/libbsd.a +mkdir -p $RPM_BUILD_ROOT%{_prefix}/tmp +cp -a $RPM_BUILD_ROOT%{_prefix}/%{_lib}/*.so $RPM_BUILD_ROOT%{_prefix}/tmp +rm -f $RPM_BUILD_ROOT%{_prefix}/tmp/libc.so +rm -f $RPM_BUILD_ROOT%{_prefix}/tmp/libpthread.so +pushd $RPM_BUILD_ROOT%{_prefix}/tmp +ln -sf ../../%{_lib}/libc.so.6* libc.so +ln -sf ../../%{_lib}/libpthread.so.0* libpthread.so +popd + +cd build-%{nptl_target_cpu}-linuxnptl +for libpath in $RPM_BUILD_ROOT%{_prefix}/tmp/*.so; do + lib=`basename $libpath .so` + sh %{SOURCE2} $libpath $COMPATD/%{_lib}/$lib.so $lib.map +done + +mv $COMPATD/%{_lib}/libc.so $COMPATD/%{_lib}/libc_real.so +mv $COMPATD/%{_lib}/libpthread.so $COMPATD/%{_lib}/libpthread_real.so +LDIR=%{_prefix}/lib/%{_target_cpu}-redhat-linux6E/%{_lib} +sed 's~^GROUP.*$~GROUP ('$LDIR'/libc_real.so '$LDIR'/libc_nonshared.a )~' \ + $RPM_BUILD_ROOT%{_prefix}/%{_lib}/libc.so > $COMPATD/%{_lib}/libc.so +sed 's~^GROUP.*$~GROUP ('$LDIR'/libpthread_real.so '$LDIR'/libpthread_nonshared.a )~' \ + $RPM_BUILD_ROOT%{_prefix}/%{_lib}/libpthread.so > $COMPATD/%{_lib}/libpthread.so + +%clean +rm -rf "$RPM_BUILD_ROOT" + +%files +%defattr(-,root,root) +%dir %{_prefix}/lib/%{_target_cpu}-redhat-linux6E +%dir %{_prefix}/lib/%{_target_cpu}-redhat-linux6E/%{_lib} +%{_prefix}/lib/%{_target_cpu}-redhat-linux6E/%{_lib}/*.[oa] +%{_prefix}/lib/%{_target_cpu}-redhat-linux6E/%{_lib}/*.so + +%files headers +%defattr(-,root,root) +%dir %{_prefix}/lib/%{_target_cpu}-redhat-linux6E +%{_prefix}/lib/%{_target_cpu}-redhat-linux6E/include + + +%changelog +* Fri Jan 24 2014 Daniel Mach - 1:2.12-4 +- Mass rebuild 2014-01-24 + +* Tue Jan 7 2014 Siddhesh Poyarekar - 1:2.12-3 +- Fix namespace conflict with Altivec (#1048853). + +* Fri Dec 27 2013 Daniel Mach - 1:2.12-2 +- Mass rebuild 2013-12-27 + +* Fri Jul 19 2013 Jeff Law - 1:2.12-1.80.5 +- Backport timezone/zic.c change to avoid overflow in oadd (#883974) + +* Tue May 28 2013 Jeff Law - 1:2.12-1.80.4 +- Fix passing of -z execstack to the linker. +- Remove -mnew-mnenomics from PPC build flags +- Pull over patch for 911307 from Fedora + +* Mon May 20 2013 Jeff Law - 1:2.12-1.80.3 +- Add -z execstack to command line for building DSOs in + dummylib.sh (#883974) + +* Wed Jan 2 2013 Jeff Law - 1:2.12-1.80.2 +- Backport change to avoid strict-aliasing problems in + md5.c (#883974) + +* Wed Jun 13 2012 Daniel Mach - 1:2.12-1.80.1 +- add missing epoch to Requires: in headers package + +* Fri Jun 8 2012 Jeff Law - 1:2.12-1.80 +- changed into compatibility package