Sync from SUSE:SLFO:Main glibc revision 058493c2c68e50f1893f9c004487a7d3
This commit is contained in:
commit
3af50a3968
23
.gitattributes
vendored
Normal file
23
.gitattributes
vendored
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
## Default LFS
|
||||||
|
*.7z filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.bsp filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.bz2 filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.gem filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.gz filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.jar filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.lz filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.lzma filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.obscpio filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.oxt filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.pdf filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.png filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.rpm filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.tbz filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.tbz2 filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.tgz filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.ttf filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.txz filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.whl filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.xz filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.zip filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.zst filter=lfs diff=lfs merge=lfs -text
|
16
_constraints
Normal file
16
_constraints
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<constraints>
|
||||||
|
<overwrite>
|
||||||
|
<conditions>
|
||||||
|
<package>glibc:testsuite</package>
|
||||||
|
</conditions>
|
||||||
|
<hardware>
|
||||||
|
<memory>
|
||||||
|
<size unit="M">3000</size>
|
||||||
|
</memory>
|
||||||
|
<disk>
|
||||||
|
<size unit="M">5600</size>
|
||||||
|
</disk>
|
||||||
|
</hardware>
|
||||||
|
</overwrite>
|
||||||
|
</constraints>
|
9
_multibuild
Normal file
9
_multibuild
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
<multibuild>
|
||||||
|
<package>i686</package>
|
||||||
|
<package>utils</package>
|
||||||
|
<package>testsuite</package>
|
||||||
|
<package>cross-aarch64</package>
|
||||||
|
<package>cross-ppc64le</package>
|
||||||
|
<package>cross-riscv64</package>
|
||||||
|
<package>cross-s390x</package>
|
||||||
|
</multibuild>
|
29
aarch64-rawmemchr-unwind.patch
Normal file
29
aarch64-rawmemchr-unwind.patch
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
From 3f798427884fa57770e8e2291cf58d5918254bb5 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Andreas Schwab <schwab@suse.de>
|
||||||
|
Date: Thu, 23 Nov 2023 18:23:46 +0100
|
||||||
|
Subject: [PATCH] aarch64: correct CFI in rawmemchr (bug 31113)
|
||||||
|
|
||||||
|
The .cfi_return_column directive changes the return column for the whole
|
||||||
|
FDE range. But the actual intent is to tell the unwinder that the value
|
||||||
|
in x30 (lr) now resides in x15 after the move, and that is expressed by
|
||||||
|
the .cfi_register directive.
|
||||||
|
---
|
||||||
|
sysdeps/aarch64/rawmemchr.S | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/sysdeps/aarch64/rawmemchr.S b/sysdeps/aarch64/rawmemchr.S
|
||||||
|
index efc4b7007b..1fff094215 100644
|
||||||
|
--- a/sysdeps/aarch64/rawmemchr.S
|
||||||
|
+++ b/sysdeps/aarch64/rawmemchr.S
|
||||||
|
@@ -31,7 +31,7 @@ ENTRY (__rawmemchr)
|
||||||
|
|
||||||
|
L(do_strlen):
|
||||||
|
mov x15, x30
|
||||||
|
- cfi_return_column (x15)
|
||||||
|
+ cfi_register (x30, x15)
|
||||||
|
mov x14, x0
|
||||||
|
bl __strlen
|
||||||
|
add x0, x14, x0
|
||||||
|
--
|
||||||
|
2.43.0
|
||||||
|
|
29
add-locales.patch
Normal file
29
add-locales.patch
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
Index: glibc-2.27/localedata/SUPPORTED
|
||||||
|
===================================================================
|
||||||
|
--- glibc-2.27.orig/localedata/SUPPORTED
|
||||||
|
+++ glibc-2.27/localedata/SUPPORTED
|
||||||
|
@@ -135,6 +135,7 @@ en_CA.UTF-8/UTF-8 \
|
||||||
|
en_CA/ISO-8859-1 \
|
||||||
|
en_DK.UTF-8/UTF-8 \
|
||||||
|
en_DK/ISO-8859-1 \
|
||||||
|
+en_GB.ISO-8859-15/ISO-8859-15 \
|
||||||
|
en_GB.UTF-8/UTF-8 \
|
||||||
|
en_GB/ISO-8859-1 \
|
||||||
|
en_HK.UTF-8/UTF-8 \
|
||||||
|
@@ -152,6 +153,7 @@ en_PH/ISO-8859-1 \
|
||||||
|
en_SC.UTF-8/UTF-8 \
|
||||||
|
en_SG.UTF-8/UTF-8 \
|
||||||
|
en_SG/ISO-8859-1 \
|
||||||
|
+en_US.ISO-8859-15/ISO-8859-15 \
|
||||||
|
en_US.UTF-8/UTF-8 \
|
||||||
|
en_US/ISO-8859-1 \
|
||||||
|
en_ZA.UTF-8/UTF-8 \
|
||||||
|
@@ -277,6 +279,8 @@ it_IT/ISO-8859-1 \
|
||||||
|
it_IT@euro/ISO-8859-15 \
|
||||||
|
iu_CA/UTF-8 \
|
||||||
|
ja_JP.EUC-JP/EUC-JP \
|
||||||
|
+ja_JP.SHIFT_JISX0213/SHIFT_JISX0213 \
|
||||||
|
+ja_JP.SJIS/SHIFT_JIS \
|
||||||
|
ja_JP.UTF-8/UTF-8 \
|
||||||
|
ka_GE.UTF-8/UTF-8 \
|
||||||
|
ka_GE/GEORGIAN-PS \
|
28
baselibs.conf
Normal file
28
baselibs.conf
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
glibc
|
||||||
|
arch i586 block!
|
||||||
|
targettype x86 +/etc/ld.so.conf
|
||||||
|
targettype x86 "/lib/ld-linux.so.2 -> <prefix>/lib/ld-linux.so.2"
|
||||||
|
targettype x86 obsoletes "baselibs-x86"
|
||||||
|
targettype ia32 +/etc/ld.so.conf
|
||||||
|
targettype ia32 "/lib/ld-linux.so.2 -> <prefix>/lib/ld-linux.so.2"
|
||||||
|
prereq -glibc-x86
|
||||||
|
+/usr/lib/getconf/[^g]
|
||||||
|
+/usr/sbin/iconvconfig -> /usr/sbin/iconvconfig-<extension>
|
||||||
|
glibc-locale-base
|
||||||
|
arch i586 block!
|
||||||
|
+/usr/lib(64)?/gconv/gconv-modules
|
||||||
|
targettype x86 -/usr/lib(64)?/gconv/gconv-modules
|
||||||
|
obsoletes "glibc-locale-<targettype>"
|
||||||
|
post "/usr/sbin/iconvconfig-<extension>"
|
||||||
|
glibc-devel
|
||||||
|
requires "glibc-<targettype> = %version"
|
||||||
|
arch i586 block!
|
||||||
|
+^/usr/include/gnu/lib-names-.*\.h$
|
||||||
|
+^/usr/include/gnu/stubs-.*\.h$
|
||||||
|
glibc-devel-static
|
||||||
|
arch i586 block!
|
||||||
|
glibc-profile
|
||||||
|
arch i586 block!
|
||||||
|
glibc-utils
|
||||||
|
libnsl1
|
||||||
|
arch i586 block!
|
14
bindresvport.blacklist
Normal file
14
bindresvport.blacklist
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
#
|
||||||
|
# This file contains a list of port numbers between 600 and 1024,
|
||||||
|
# which should not be used by bindresvport. bindresvport is mostly
|
||||||
|
# called by RPC services. This mostly solves the problem, that a
|
||||||
|
# RPC service uses a well known port of another service.
|
||||||
|
#
|
||||||
|
623 # ASF, used by IPMI on some cards
|
||||||
|
631 # cups
|
||||||
|
636 # ldaps
|
||||||
|
664 # Secure ASF, used by IPMI on some cards
|
||||||
|
774 # rpasswd
|
||||||
|
921 # lwresd
|
||||||
|
993 # imaps
|
||||||
|
995 # pops
|
286
cache-amd-legacy.patch
Normal file
286
cache-amd-legacy.patch
Normal file
@ -0,0 +1,286 @@
|
|||||||
|
From ced101ed9d3b7cfd12d97ef24940cb00b8658c81 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Sajan Karumanchi <sajan.karumanchi@amd.com>
|
||||||
|
Date: Tue, 1 Aug 2023 15:20:55 +0000
|
||||||
|
Subject: [PATCH] x86: Fix for cache computation on AMD legacy cpus.
|
||||||
|
|
||||||
|
Some legacy AMD CPUs and hypervisors have the _cpuid_ '0x8000_001D'
|
||||||
|
set to Zero, thus resulting in zeroed-out computed cache values.
|
||||||
|
This patch reintroduces the old way of cache computation as a
|
||||||
|
fail-safe option to handle these exceptions.
|
||||||
|
Fixed 'level4_cache_size' value through handle_amd().
|
||||||
|
|
||||||
|
Reviewed-by: Premachandra Mallappa <premachandra.mallappa@amd.com>
|
||||||
|
Tested-by: Florian Weimer <fweimer@redhat.com>
|
||||||
|
---
|
||||||
|
sysdeps/x86/dl-cacheinfo.h | 226 ++++++++++++++++++++++++++++++++-----
|
||||||
|
1 file changed, 199 insertions(+), 27 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/sysdeps/x86/dl-cacheinfo.h b/sysdeps/x86/dl-cacheinfo.h
|
||||||
|
index cd4d0351ae..285773039f 100644
|
||||||
|
--- a/sysdeps/x86/dl-cacheinfo.h
|
||||||
|
+++ b/sysdeps/x86/dl-cacheinfo.h
|
||||||
|
@@ -315,40 +315,206 @@ handle_amd (int name)
|
||||||
|
{
|
||||||
|
unsigned int eax;
|
||||||
|
unsigned int ebx;
|
||||||
|
- unsigned int ecx;
|
||||||
|
+ unsigned int ecx = 0;
|
||||||
|
unsigned int edx;
|
||||||
|
- unsigned int count = 0x1;
|
||||||
|
+ unsigned int max_cpuid = 0;
|
||||||
|
+ unsigned int fn = 0;
|
||||||
|
|
||||||
|
/* No level 4 cache (yet). */
|
||||||
|
if (name > _SC_LEVEL3_CACHE_LINESIZE)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
- if (name >= _SC_LEVEL3_CACHE_SIZE)
|
||||||
|
- count = 0x3;
|
||||||
|
- else if (name >= _SC_LEVEL2_CACHE_SIZE)
|
||||||
|
- count = 0x2;
|
||||||
|
- else if (name >= _SC_LEVEL1_DCACHE_SIZE)
|
||||||
|
- count = 0x0;
|
||||||
|
+ __cpuid (0x80000000, max_cpuid, ebx, ecx, edx);
|
||||||
|
+
|
||||||
|
+ if (max_cpuid >= 0x8000001D)
|
||||||
|
+ /* Use __cpuid__ '0x8000_001D' to compute cache details. */
|
||||||
|
+ {
|
||||||
|
+ unsigned int count = 0x1;
|
||||||
|
+
|
||||||
|
+ if (name >= _SC_LEVEL3_CACHE_SIZE)
|
||||||
|
+ count = 0x3;
|
||||||
|
+ else if (name >= _SC_LEVEL2_CACHE_SIZE)
|
||||||
|
+ count = 0x2;
|
||||||
|
+ else if (name >= _SC_LEVEL1_DCACHE_SIZE)
|
||||||
|
+ count = 0x0;
|
||||||
|
+
|
||||||
|
+ __cpuid_count (0x8000001D, count, eax, ebx, ecx, edx);
|
||||||
|
+
|
||||||
|
+ if (ecx != 0)
|
||||||
|
+ {
|
||||||
|
+ switch (name)
|
||||||
|
+ {
|
||||||
|
+ case _SC_LEVEL1_ICACHE_ASSOC:
|
||||||
|
+ case _SC_LEVEL1_DCACHE_ASSOC:
|
||||||
|
+ case _SC_LEVEL2_CACHE_ASSOC:
|
||||||
|
+ case _SC_LEVEL3_CACHE_ASSOC:
|
||||||
|
+ return ((ebx >> 22) & 0x3ff) + 1;
|
||||||
|
+ case _SC_LEVEL1_ICACHE_LINESIZE:
|
||||||
|
+ case _SC_LEVEL1_DCACHE_LINESIZE:
|
||||||
|
+ case _SC_LEVEL2_CACHE_LINESIZE:
|
||||||
|
+ case _SC_LEVEL3_CACHE_LINESIZE:
|
||||||
|
+ return (ebx & 0xfff) + 1;
|
||||||
|
+ case _SC_LEVEL1_ICACHE_SIZE:
|
||||||
|
+ case _SC_LEVEL1_DCACHE_SIZE:
|
||||||
|
+ case _SC_LEVEL2_CACHE_SIZE:
|
||||||
|
+ case _SC_LEVEL3_CACHE_SIZE:
|
||||||
|
+ return (((ebx >> 22) & 0x3ff) + 1) * ((ebx & 0xfff) + 1) * (ecx + 1);
|
||||||
|
+ default:
|
||||||
|
+ __builtin_unreachable ();
|
||||||
|
+ }
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /* Legacy cache computation for CPUs prior to Bulldozer family.
|
||||||
|
+ This is also a fail-safe mechanism for some hypervisors that
|
||||||
|
+ accidentally configure __cpuid__ '0x8000_001D' to Zero. */
|
||||||
|
|
||||||
|
- __cpuid_count (0x8000001D, count, eax, ebx, ecx, edx);
|
||||||
|
+ fn = 0x80000005 + (name >= _SC_LEVEL2_CACHE_SIZE);
|
||||||
|
+
|
||||||
|
+ if (max_cpuid < fn)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ __cpuid (fn, eax, ebx, ecx, edx);
|
||||||
|
+
|
||||||
|
+ if (name < _SC_LEVEL1_DCACHE_SIZE)
|
||||||
|
+ {
|
||||||
|
+ name += _SC_LEVEL1_DCACHE_SIZE - _SC_LEVEL1_ICACHE_SIZE;
|
||||||
|
+ ecx = edx;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
switch (name)
|
||||||
|
{
|
||||||
|
- case _SC_LEVEL1_ICACHE_ASSOC:
|
||||||
|
- case _SC_LEVEL1_DCACHE_ASSOC:
|
||||||
|
- case _SC_LEVEL2_CACHE_ASSOC:
|
||||||
|
+ case _SC_LEVEL1_DCACHE_SIZE:
|
||||||
|
+ return (ecx >> 14) & 0x3fc00;
|
||||||
|
+
|
||||||
|
+ case _SC_LEVEL1_DCACHE_ASSOC:
|
||||||
|
+ ecx >>= 16;
|
||||||
|
+ if ((ecx & 0xff) == 0xff)
|
||||||
|
+ {
|
||||||
|
+ /* Fully associative. */
|
||||||
|
+ return (ecx << 2) & 0x3fc00;
|
||||||
|
+ }
|
||||||
|
+ return ecx & 0xff;
|
||||||
|
+
|
||||||
|
+ case _SC_LEVEL1_DCACHE_LINESIZE:
|
||||||
|
+ return ecx & 0xff;
|
||||||
|
+
|
||||||
|
+ case _SC_LEVEL2_CACHE_SIZE:
|
||||||
|
+ return (ecx & 0xf000) == 0 ? 0 : (ecx >> 6) & 0x3fffc00;
|
||||||
|
+
|
||||||
|
+ case _SC_LEVEL2_CACHE_ASSOC:
|
||||||
|
+ switch ((ecx >> 12) & 0xf)
|
||||||
|
+ {
|
||||||
|
+ case 0:
|
||||||
|
+ case 1:
|
||||||
|
+ case 2:
|
||||||
|
+ case 4:
|
||||||
|
+ return (ecx >> 12) & 0xf;
|
||||||
|
+ case 6:
|
||||||
|
+ return 8;
|
||||||
|
+ case 8:
|
||||||
|
+ return 16;
|
||||||
|
+ case 10:
|
||||||
|
+ return 32;
|
||||||
|
+ case 11:
|
||||||
|
+ return 48;
|
||||||
|
+ case 12:
|
||||||
|
+ return 64;
|
||||||
|
+ case 13:
|
||||||
|
+ return 96;
|
||||||
|
+ case 14:
|
||||||
|
+ return 128;
|
||||||
|
+ case 15:
|
||||||
|
+ return ((ecx >> 6) & 0x3fffc00) / (ecx & 0xff);
|
||||||
|
+ default:
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ case _SC_LEVEL2_CACHE_LINESIZE:
|
||||||
|
+ return (ecx & 0xf000) == 0 ? 0 : ecx & 0xff;
|
||||||
|
+
|
||||||
|
+ case _SC_LEVEL3_CACHE_SIZE:
|
||||||
|
+ {
|
||||||
|
+ long int total_l3_cache = 0, l3_cache_per_thread = 0;
|
||||||
|
+ unsigned int threads = 0;
|
||||||
|
+ const struct cpu_features *cpu_features;
|
||||||
|
+
|
||||||
|
+ if ((edx & 0xf000) == 0)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ total_l3_cache = (edx & 0x3ffc0000) << 1;
|
||||||
|
+ cpu_features = __get_cpu_features ();
|
||||||
|
+
|
||||||
|
+ /* Figure out the number of logical threads that share L3. */
|
||||||
|
+ if (max_cpuid >= 0x80000008)
|
||||||
|
+ {
|
||||||
|
+ /* Get width of APIC ID. */
|
||||||
|
+ __cpuid (0x80000008, eax, ebx, ecx, edx);
|
||||||
|
+ threads = (ecx & 0xff) + 1;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (threads == 0)
|
||||||
|
+ {
|
||||||
|
+ /* If APIC ID width is not available, use logical
|
||||||
|
+ processor count. */
|
||||||
|
+ __cpuid (0x00000001, eax, ebx, ecx, edx);
|
||||||
|
+ if ((edx & (1 << 28)) != 0)
|
||||||
|
+ threads = (ebx >> 16) & 0xff;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /* Cap usage of highest cache level to the number of
|
||||||
|
+ supported threads. */
|
||||||
|
+ if (threads > 0)
|
||||||
|
+ l3_cache_per_thread = total_l3_cache/threads;
|
||||||
|
+
|
||||||
|
+ /* Get shared cache per ccx for Zen architectures. */
|
||||||
|
+ if (cpu_features->basic.family >= 0x17)
|
||||||
|
+ {
|
||||||
|
+ long int l3_cache_per_ccx = 0;
|
||||||
|
+ /* Get number of threads share the L3 cache in CCX. */
|
||||||
|
+ __cpuid_count (0x8000001D, 0x3, eax, ebx, ecx, edx);
|
||||||
|
+ unsigned int threads_per_ccx = ((eax >> 14) & 0xfff) + 1;
|
||||||
|
+ l3_cache_per_ccx = l3_cache_per_thread * threads_per_ccx;
|
||||||
|
+ return l3_cache_per_ccx;
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ return l3_cache_per_thread;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
case _SC_LEVEL3_CACHE_ASSOC:
|
||||||
|
- return ecx ? ((ebx >> 22) & 0x3ff) + 1 : 0;
|
||||||
|
- case _SC_LEVEL1_ICACHE_LINESIZE:
|
||||||
|
- case _SC_LEVEL1_DCACHE_LINESIZE:
|
||||||
|
- case _SC_LEVEL2_CACHE_LINESIZE:
|
||||||
|
+ switch ((edx >> 12) & 0xf)
|
||||||
|
+ {
|
||||||
|
+ case 0:
|
||||||
|
+ case 1:
|
||||||
|
+ case 2:
|
||||||
|
+ case 4:
|
||||||
|
+ return (edx >> 12) & 0xf;
|
||||||
|
+ case 6:
|
||||||
|
+ return 8;
|
||||||
|
+ case 8:
|
||||||
|
+ return 16;
|
||||||
|
+ case 10:
|
||||||
|
+ return 32;
|
||||||
|
+ case 11:
|
||||||
|
+ return 48;
|
||||||
|
+ case 12:
|
||||||
|
+ return 64;
|
||||||
|
+ case 13:
|
||||||
|
+ return 96;
|
||||||
|
+ case 14:
|
||||||
|
+ return 128;
|
||||||
|
+ case 15:
|
||||||
|
+ return ((edx & 0x3ffc0000) << 1) / (edx & 0xff);
|
||||||
|
+ default:
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
case _SC_LEVEL3_CACHE_LINESIZE:
|
||||||
|
- return ecx ? (ebx & 0xfff) + 1 : 0;
|
||||||
|
- case _SC_LEVEL1_ICACHE_SIZE:
|
||||||
|
- case _SC_LEVEL1_DCACHE_SIZE:
|
||||||
|
- case _SC_LEVEL2_CACHE_SIZE:
|
||||||
|
- case _SC_LEVEL3_CACHE_SIZE:
|
||||||
|
- return ecx ? (((ebx >> 22) & 0x3ff) + 1) * ((ebx & 0xfff) + 1) * (ecx + 1): 0;
|
||||||
|
+ return (edx & 0xf000) == 0 ? 0 : edx & 0xff;
|
||||||
|
+
|
||||||
|
default:
|
||||||
|
__builtin_unreachable ();
|
||||||
|
}
|
||||||
|
@@ -703,7 +869,6 @@ dl_init_cacheinfo (struct cpu_features *cpu_features)
|
||||||
|
data = handle_amd (_SC_LEVEL1_DCACHE_SIZE);
|
||||||
|
core = handle_amd (_SC_LEVEL2_CACHE_SIZE);
|
||||||
|
shared = handle_amd (_SC_LEVEL3_CACHE_SIZE);
|
||||||
|
- shared_per_thread = shared;
|
||||||
|
|
||||||
|
level1_icache_size = handle_amd (_SC_LEVEL1_ICACHE_SIZE);
|
||||||
|
level1_icache_linesize = handle_amd (_SC_LEVEL1_ICACHE_LINESIZE);
|
||||||
|
@@ -716,13 +881,20 @@ dl_init_cacheinfo (struct cpu_features *cpu_features)
|
||||||
|
level3_cache_size = shared;
|
||||||
|
level3_cache_assoc = handle_amd (_SC_LEVEL3_CACHE_ASSOC);
|
||||||
|
level3_cache_linesize = handle_amd (_SC_LEVEL3_CACHE_LINESIZE);
|
||||||
|
+ level4_cache_size = handle_amd (_SC_LEVEL4_CACHE_SIZE);
|
||||||
|
|
||||||
|
if (shared <= 0)
|
||||||
|
- /* No shared L3 cache. All we have is the L2 cache. */
|
||||||
|
- shared = core;
|
||||||
|
+ {
|
||||||
|
+ /* No shared L3 cache. All we have is the L2 cache. */
|
||||||
|
+ shared = core;
|
||||||
|
+ }
|
||||||
|
+ else if (cpu_features->basic.family < 0x17)
|
||||||
|
+ {
|
||||||
|
+ /* Account for exclusive L2 and L3 caches. */
|
||||||
|
+ shared += core;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
- if (shared_per_thread <= 0)
|
||||||
|
- shared_per_thread = shared;
|
||||||
|
+ shared_per_thread = shared;
|
||||||
|
}
|
||||||
|
|
||||||
|
cpu_features->level1_icache_size = level1_icache_size;
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
45
cache-intel-shared.patch
Normal file
45
cache-intel-shared.patch
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
From 5ea70cc02626d9b85f1570153873d8648a47bf95 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Noah Goldstein <goldstein.w.n@gmail.com>
|
||||||
|
Date: Thu, 10 Aug 2023 19:28:24 -0500
|
||||||
|
Subject: [PATCH] x86: Fix incorrect scope of setting `shared_per_thread` [BZ#
|
||||||
|
30745]
|
||||||
|
|
||||||
|
The:
|
||||||
|
|
||||||
|
```
|
||||||
|
if (shared_per_thread > 0 && threads > 0)
|
||||||
|
shared_per_thread /= threads;
|
||||||
|
```
|
||||||
|
|
||||||
|
Code was accidentally moved to inside the else scope. This doesn't
|
||||||
|
match how it was previously (before af992e7abd).
|
||||||
|
|
||||||
|
This patch fixes that by putting the division after the `else` block.
|
||||||
|
|
||||||
|
(cherry picked from commit 084fb31bc2c5f95ae0b9e6df4d3cf0ff43471ede)
|
||||||
|
---
|
||||||
|
sysdeps/x86/dl-cacheinfo.h | 7 +++----
|
||||||
|
1 file changed, 3 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/sysdeps/x86/dl-cacheinfo.h b/sysdeps/x86/dl-cacheinfo.h
|
||||||
|
index 285773039f..5ddb35c9d9 100644
|
||||||
|
--- a/sysdeps/x86/dl-cacheinfo.h
|
||||||
|
+++ b/sysdeps/x86/dl-cacheinfo.h
|
||||||
|
@@ -770,11 +770,10 @@ get_common_cache_info (long int *shared_ptr, long int * shared_per_thread_ptr, u
|
||||||
|
level. */
|
||||||
|
threads = ((cpu_features->features[CPUID_INDEX_1].cpuid.ebx >> 16)
|
||||||
|
& 0xff);
|
||||||
|
-
|
||||||
|
- /* Get per-thread size of highest level cache. */
|
||||||
|
- if (shared_per_thread > 0 && threads > 0)
|
||||||
|
- shared_per_thread /= threads;
|
||||||
|
}
|
||||||
|
+ /* Get per-thread size of highest level cache. */
|
||||||
|
+ if (shared_per_thread > 0 && threads > 0)
|
||||||
|
+ shared_per_thread /= threads;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Account for non-inclusive L2 and L3 caches. */
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
37
call-init-proxy-objects.patch
Normal file
37
call-init-proxy-objects.patch
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
From 7ae211a01b085d0bde54bd13b887ce8f9d57c2b4 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Florian Weimer <fweimer@redhat.com>
|
||||||
|
Date: Tue, 22 Aug 2023 13:56:25 +0200
|
||||||
|
Subject: [PATCH] elf: Do not run constructors for proxy objects
|
||||||
|
|
||||||
|
Otherwise, the ld.so constructor runs for each audit namespace
|
||||||
|
and each dlmopen namespace.
|
||||||
|
|
||||||
|
(cherry picked from commit f6c8204fd7fabf0cf4162eaf10ccf23258e4d10e)
|
||||||
|
---
|
||||||
|
elf/dl-init.c | 8 ++++++--
|
||||||
|
1 file changed, 6 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/elf/dl-init.c b/elf/dl-init.c
|
||||||
|
index 5b0732590f..ba4d2fdc85 100644
|
||||||
|
--- a/elf/dl-init.c
|
||||||
|
+++ b/elf/dl-init.c
|
||||||
|
@@ -25,10 +25,14 @@
|
||||||
|
static void
|
||||||
|
call_init (struct link_map *l, int argc, char **argv, char **env)
|
||||||
|
{
|
||||||
|
+ /* Do not run constructors for proxy objects. */
|
||||||
|
+ if (l != l->l_real)
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
/* If the object has not been relocated, this is a bug. The
|
||||||
|
function pointers are invalid in this case. (Executables do not
|
||||||
|
- need relocation, and neither do proxy objects.) */
|
||||||
|
- assert (l->l_real->l_relocated || l->l_real->l_type == lt_executable);
|
||||||
|
+ need relocation.) */
|
||||||
|
+ assert (l->l_relocated || l->l_type == lt_executable);
|
||||||
|
|
||||||
|
if (l->l_init_called)
|
||||||
|
/* This object is all done. */
|
||||||
|
--
|
||||||
|
2.42.0
|
||||||
|
|
57
duplocale-global-locale.patch
Normal file
57
duplocale-global-locale.patch
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
From 513331b788a3fa633f1d0417d43915e16a0c88f0 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Andreas Schwab <schwab@suse.de>
|
||||||
|
Date: Wed, 6 Mar 2024 12:59:47 +0100
|
||||||
|
Subject: [PATCH] duplocale: protect use of global locale (bug 23970)
|
||||||
|
|
||||||
|
Protect the global locale from being modified while we compute the size of
|
||||||
|
the locale category names. That allows the use of the global locale in a
|
||||||
|
single thread, while all other threads use the thread safe locale
|
||||||
|
functions.
|
||||||
|
---
|
||||||
|
locale/duplocale.c | 14 ++++++++------
|
||||||
|
1 file changed, 8 insertions(+), 6 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/locale/duplocale.c b/locale/duplocale.c
|
||||||
|
index a755ac5c36..bad476700f 100644
|
||||||
|
--- a/locale/duplocale.c
|
||||||
|
+++ b/locale/duplocale.c
|
||||||
|
@@ -43,6 +43,11 @@ __duplocale (locale_t dataset)
|
||||||
|
int cnt;
|
||||||
|
size_t names_len = 0;
|
||||||
|
|
||||||
|
+ /* If dataset points to _nl_global_locale, we need to prevent other
|
||||||
|
+ threads from modifying it. We also modify global data below (the
|
||||||
|
+ usage counts). */
|
||||||
|
+ __libc_rwlock_wrlock (__libc_setlocale_lock);
|
||||||
|
+
|
||||||
|
/* Calculate the total space we need to store all the names. */
|
||||||
|
for (cnt = 0; cnt < __LC_LAST; ++cnt)
|
||||||
|
if (cnt != LC_ALL && dataset->__names[cnt] != _nl_C_name)
|
||||||
|
@@ -55,9 +60,6 @@ __duplocale (locale_t dataset)
|
||||||
|
{
|
||||||
|
char *namep = (char *) (result + 1);
|
||||||
|
|
||||||
|
- /* We modify global data (the usage counts). */
|
||||||
|
- __libc_rwlock_wrlock (__libc_setlocale_lock);
|
||||||
|
-
|
||||||
|
for (cnt = 0; cnt < __LC_LAST; ++cnt)
|
||||||
|
if (cnt != LC_ALL)
|
||||||
|
{
|
||||||
|
@@ -78,11 +80,11 @@ __duplocale (locale_t dataset)
|
||||||
|
result->__ctype_b = dataset->__ctype_b;
|
||||||
|
result->__ctype_tolower = dataset->__ctype_tolower;
|
||||||
|
result->__ctype_toupper = dataset->__ctype_toupper;
|
||||||
|
-
|
||||||
|
- /* It's done. */
|
||||||
|
- __libc_rwlock_unlock (__libc_setlocale_lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
+ /* It's done. */
|
||||||
|
+ __libc_rwlock_unlock (__libc_setlocale_lock);
|
||||||
|
+
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
weak_alias (__duplocale, duplocale)
|
||||||
|
--
|
||||||
|
2.44.0
|
||||||
|
|
165
fstat-implementation.patch
Normal file
165
fstat-implementation.patch
Normal file
@ -0,0 +1,165 @@
|
|||||||
|
From 551101e8240b7514fc646d1722f8b79c90362b8f Mon Sep 17 00:00:00 2001
|
||||||
|
From: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||||
|
Date: Mon, 11 Sep 2023 10:25:48 -0300
|
||||||
|
Subject: [PATCH] io: Do not implement fstat with fstatat
|
||||||
|
|
||||||
|
AT_EMPTY_PATH is a requirement to implement fstat over fstatat,
|
||||||
|
however it does not prevent the kernel to read the path argument.
|
||||||
|
It is not an issue, but on x86-64 with SMAP-capable CPUs the kernel is
|
||||||
|
forced to perform expensive user memory access. After that regular
|
||||||
|
lookup is performed which adds even more overhead.
|
||||||
|
|
||||||
|
Instead, issue the fstat syscall directly on LFS fstat implementation
|
||||||
|
(32 bit architectures will still continue to use statx, which is
|
||||||
|
required to have 64 bit time_t support). it should be even a
|
||||||
|
small performance gain on non x86_64, since there is no need
|
||||||
|
to handle the path argument.
|
||||||
|
|
||||||
|
Checked on x86_64-linux-gnu.
|
||||||
|
---
|
||||||
|
sysdeps/unix/sysv/linux/fstat64.c | 37 +++++++++++++++++++++++--
|
||||||
|
sysdeps/unix/sysv/linux/fstatat64.c | 12 ++------
|
||||||
|
sysdeps/unix/sysv/linux/internal-stat.h | 31 +++++++++++++++++++++
|
||||||
|
3 files changed, 68 insertions(+), 12 deletions(-)
|
||||||
|
create mode 100644 sysdeps/unix/sysv/linux/internal-stat.h
|
||||||
|
|
||||||
|
diff --git a/sysdeps/unix/sysv/linux/fstat64.c b/sysdeps/unix/sysv/linux/fstat64.c
|
||||||
|
index 124384e57f..a291f0825b 100644
|
||||||
|
--- a/sysdeps/unix/sysv/linux/fstat64.c
|
||||||
|
+++ b/sysdeps/unix/sysv/linux/fstat64.c
|
||||||
|
@@ -19,20 +19,53 @@
|
||||||
|
#define __fstat __redirect___fstat
|
||||||
|
#define fstat __redirect_fstat
|
||||||
|
#include <sys/stat.h>
|
||||||
|
+#undef __fstat
|
||||||
|
+#undef fstat
|
||||||
|
#include <fcntl.h>
|
||||||
|
-#include <kernel_stat.h>
|
||||||
|
-#include <stat_t64_cp.h>
|
||||||
|
+#include <internal-stat.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
__fstat64_time64 (int fd, struct __stat64_t64 *buf)
|
||||||
|
{
|
||||||
|
+#if !FSTATAT_USE_STATX
|
||||||
|
+# if XSTAT_IS_XSTAT64
|
||||||
|
+# ifdef __NR_fstat
|
||||||
|
+ /* 64-bit kABI, e.g. aarch64, ia64, powerpc64*, s390x, riscv64, and
|
||||||
|
+ x86_64. */
|
||||||
|
+ return INLINE_SYSCALL_CALL (fstat, fd, buf);
|
||||||
|
+# elif defined __NR_fstat64
|
||||||
|
+# if STAT64_IS_KERNEL_STAT64
|
||||||
|
+ /* 64-bit kABI outlier, e.g. alpha */
|
||||||
|
+ return INLINE_SYSCALL_CALL (fstat64, fd, buf);
|
||||||
|
+# else
|
||||||
|
+ /* 64-bit kABI outlier, e.g. sparc64. */
|
||||||
|
+ struct kernel_stat64 kst64;
|
||||||
|
+ int r = INLINE_SYSCALL_CALL (fstat64, fd, &kst64);
|
||||||
|
+ if (r == 0)
|
||||||
|
+ __cp_stat64_kstat64 (buf, &kst64);
|
||||||
|
+ return r;
|
||||||
|
+# endif /* STAT64_IS_KERNEL_STAT64 */
|
||||||
|
+# endif
|
||||||
|
+# else /* XSTAT_IS_XSTAT64 */
|
||||||
|
+ /* 64-bit kabi outlier, e.g. mips64 and mips64-n32. */
|
||||||
|
+ struct kernel_stat kst;
|
||||||
|
+ int r = INLINE_SYSCALL_CALL (fstat, fd, &kst);
|
||||||
|
+ if (r == 0)
|
||||||
|
+ __cp_kstat_stat64_t64 (&kst, buf);
|
||||||
|
+ return r;
|
||||||
|
+# endif
|
||||||
|
+#else /* !FSTATAT_USE_STATX */
|
||||||
|
+ /* All kABIs with non-LFS support and with old 32-bit time_t support
|
||||||
|
+ e.g. arm, csky, i386, hppa, m68k, microblaze, nios2, sh, powerpc32,
|
||||||
|
+ and sparc32. */
|
||||||
|
if (fd < 0)
|
||||||
|
{
|
||||||
|
__set_errno (EBADF);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return __fstatat64_time64 (fd, "", buf, AT_EMPTY_PATH);
|
||||||
|
+#endif
|
||||||
|
}
|
||||||
|
#if __TIMESIZE != 64
|
||||||
|
hidden_def (__fstat64_time64)
|
||||||
|
diff --git a/sysdeps/unix/sysv/linux/fstatat64.c b/sysdeps/unix/sysv/linux/fstatat64.c
|
||||||
|
index 3509d3ca6d..127c6ff601 100644
|
||||||
|
--- a/sysdeps/unix/sysv/linux/fstatat64.c
|
||||||
|
+++ b/sysdeps/unix/sysv/linux/fstatat64.c
|
||||||
|
@@ -21,12 +21,10 @@
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <string.h>
|
||||||
|
-#include <kernel_stat.h>
|
||||||
|
#include <sysdep.h>
|
||||||
|
#include <time.h>
|
||||||
|
-#include <kstat_cp.h>
|
||||||
|
-#include <stat_t64_cp.h>
|
||||||
|
#include <sys/sysmacros.h>
|
||||||
|
+#include <internal-stat.h>
|
||||||
|
|
||||||
|
#if __TIMESIZE == 64 \
|
||||||
|
&& (__WORDSIZE == 32 \
|
||||||
|
@@ -40,11 +38,7 @@ _Static_assert (sizeof (__blkcnt_t) == sizeof (__blkcnt64_t),
|
||||||
|
"__blkcnt_t and __blkcnt64_t must match");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
-#if (__WORDSIZE == 32 \
|
||||||
|
- && (!defined __SYSCALL_WORDSIZE || __SYSCALL_WORDSIZE == 32)) \
|
||||||
|
- || defined STAT_HAS_TIME32 \
|
||||||
|
- || (!defined __NR_newfstatat && !defined __NR_fstatat64)
|
||||||
|
-# define FSTATAT_USE_STATX 1
|
||||||
|
+#if FSTATAT_USE_STATX
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
fstatat64_time64_statx (int fd, const char *file, struct __stat64_t64 *buf,
|
||||||
|
@@ -79,8 +73,6 @@ fstatat64_time64_statx (int fd, const char *file, struct __stat64_t64 *buf,
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
-#else
|
||||||
|
-# define FSTATAT_USE_STATX 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Only statx supports 64-bit timestamps for 32-bit architectures with
|
||||||
|
diff --git a/sysdeps/unix/sysv/linux/internal-stat.h b/sysdeps/unix/sysv/linux/internal-stat.h
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000000..e3b0569853
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/sysdeps/unix/sysv/linux/internal-stat.h
|
||||||
|
@@ -0,0 +1,31 @@
|
||||||
|
+/* Internal stat definitions.
|
||||||
|
+ Copyright (C) 2023 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, see
|
||||||
|
+ <https://www.gnu.org/licenses/>. */
|
||||||
|
+
|
||||||
|
+#include <sysdep.h>
|
||||||
|
+#include <stat_t64_cp.h>
|
||||||
|
+#include <kernel_stat.h>
|
||||||
|
+#include <kstat_cp.h>
|
||||||
|
+
|
||||||
|
+#if (__WORDSIZE == 32 \
|
||||||
|
+ && (!defined __SYSCALL_WORDSIZE || __SYSCALL_WORDSIZE == 32)) \
|
||||||
|
+ || defined STAT_HAS_TIME32 \
|
||||||
|
+ || (!defined __NR_newfstatat && !defined __NR_fstatat64)
|
||||||
|
+# define FSTATAT_USE_STATX 1
|
||||||
|
+#else
|
||||||
|
+# define FSTATAT_USE_STATX 0
|
||||||
|
+#endif
|
||||||
|
--
|
||||||
|
2.42.0
|
||||||
|
|
855
gb18030-2022.patch
Normal file
855
gb18030-2022.patch
Normal file
@ -0,0 +1,855 @@
|
|||||||
|
From e1d3312015e8f70344620375aedf91afe7e7e7a4 Mon Sep 17 00:00:00 2001
|
||||||
|
From: lijianglin <lijianglin2@huawei.com>
|
||||||
|
Date: Tue, 27 Jun 2023 20:15:49 +0800
|
||||||
|
Subject: [PATCH] add GB18030-2022 charmap and test the entire GB18030 charmap
|
||||||
|
[BZ #30243]
|
||||||
|
|
||||||
|
support GB18030-2022 after add and change some transcoding relationship
|
||||||
|
of GB18030-2022.Details are as follows:
|
||||||
|
add 25 transcoding relationship
|
||||||
|
UE81E 0x82359037
|
||||||
|
UE826 0x82359038
|
||||||
|
UE82B 0x82359039
|
||||||
|
UE82C 0x82359130
|
||||||
|
UE832 0x82359131
|
||||||
|
UE843 0x82359132
|
||||||
|
UE854 0x82359133
|
||||||
|
UE864 0x82359134
|
||||||
|
UE78D 0x84318236
|
||||||
|
UE78F 0x84318237
|
||||||
|
UE78E 0x84318238
|
||||||
|
UE790 0x84318239
|
||||||
|
UE791 0x84318330
|
||||||
|
UE792 0x84318331
|
||||||
|
UE793 0x84318332
|
||||||
|
UE794 0x84318333
|
||||||
|
UE795 0x84318334
|
||||||
|
UE796 0x84318335
|
||||||
|
UE816 0xfe51
|
||||||
|
UE817 0xfe52
|
||||||
|
UE818 0xfe53
|
||||||
|
UE831 0xfe6c
|
||||||
|
UE83B 0xfe76
|
||||||
|
UE855 0xfe91
|
||||||
|
change 6 transcoding relationship
|
||||||
|
U20087 0x95329031
|
||||||
|
U20089 0x95329033
|
||||||
|
U200CC 0x95329730
|
||||||
|
U215D7 0x9536b937
|
||||||
|
U2298F 0x9630ba35
|
||||||
|
U241FE 0x9635b630
|
||||||
|
Test the entire GB18030 charmap, not only the Unicode BMP part.
|
||||||
|
|
||||||
|
Co-authored-by: yangyanchao <yangyanchao6@huawei.com>
|
||||||
|
Co-authored-by: liqingqing <liqingqing3@huawei.com>
|
||||||
|
Co-authored-by: Bruno Haible <bruno@clisp.org>
|
||||||
|
Reviewed-by: Andreas Schwab <schwab@suse.de>
|
||||||
|
Reviewed-by: Mike FABIAN <mfabian@redhat.com>
|
||||||
|
---
|
||||||
|
iconvdata/gb18030.c | 423 +++++++++++++++++++-----------------
|
||||||
|
iconvdata/tst-table-from.c | 5 +-
|
||||||
|
iconvdata/tst-table-to.c | 12 +-
|
||||||
|
iconvdata/tst-table.sh | 50 +++--
|
||||||
|
localedata/charmaps/GB18030 | 91 +++-----
|
||||||
|
5 files changed, 292 insertions(+), 289 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/iconvdata/gb18030.c b/iconvdata/gb18030.c
|
||||||
|
index 9996a59eaf..be6cfe652c 100644
|
||||||
|
--- a/iconvdata/gb18030.c
|
||||||
|
+++ b/iconvdata/gb18030.c
|
||||||
|
@@ -6009,49 +6009,50 @@ static const uint16_t __twobyte_to_ucs[] =
|
||||||
|
[0x5dc2] = 0xfa0e, [0x5dc3] = 0xfa0f, [0x5dc4] = 0xfa11, [0x5dc5] = 0xfa13,
|
||||||
|
[0x5dc6] = 0xfa14, [0x5dc7] = 0xfa18, [0x5dc8] = 0xfa1f, [0x5dc9] = 0xfa20,
|
||||||
|
[0x5dca] = 0xfa21, [0x5dcb] = 0xfa23, [0x5dcc] = 0xfa24, [0x5dcd] = 0xfa27,
|
||||||
|
- [0x5dce] = 0xfa28, [0x5dcf] = 0xfa29, [0x5dd0] = 0x2e81, [0x5dd4] = 0x2e84,
|
||||||
|
- [0x5dd5] = 0x3473, [0x5dd6] = 0x3447, [0x5dd7] = 0x2e88, [0x5dd8] = 0x2e8b,
|
||||||
|
- [0x5dd9] = 0x9fb4, [0x5dda] = 0x359e, [0x5ddb] = 0x361a, [0x5ddc] = 0x360e,
|
||||||
|
- [0x5ddd] = 0x2e8c, [0x5dde] = 0x2e97, [0x5ddf] = 0x396e, [0x5de0] = 0x3918,
|
||||||
|
- [0x5de1] = 0x9fb5, [0x5de2] = 0x39cf, [0x5de3] = 0x39df, [0x5de4] = 0x3a73,
|
||||||
|
- [0x5de5] = 0x39d0, [0x5de6] = 0x9fb6, [0x5de7] = 0x9fb7, [0x5de8] = 0x3b4e,
|
||||||
|
- [0x5de9] = 0x3c6e, [0x5dea] = 0x3ce0, [0x5deb] = 0x2ea7, [0x5ded] = 0x9fb8,
|
||||||
|
+ [0x5dce] = 0xfa28, [0x5dcf] = 0xfa29, [0x5dd0] = 0x2e81, [0x5dd1] = 0xe816,
|
||||||
|
+ [0x5dd2] = 0xe817, [0x5dd3] = 0xe818, [0x5dd4] = 0x2e84, [0x5dd5] = 0x3473,
|
||||||
|
+ [0x5dd6] = 0x3447, [0x5dd7] = 0x2e88, [0x5dd8] = 0x2e8b, [0x5dd9] = 0x9fb4,
|
||||||
|
+ [0x5dda] = 0x359e, [0x5ddb] = 0x361a, [0x5ddc] = 0x360e, [0x5ddd] = 0x2e8c,
|
||||||
|
+ [0x5dde] = 0x2e97, [0x5ddf] = 0x396e, [0x5de0] = 0x3918, [0x5de1] = 0x9fb5,
|
||||||
|
+ [0x5de2] = 0x39cf, [0x5de3] = 0x39df, [0x5de4] = 0x3a73, [0x5de5] = 0x39d0,
|
||||||
|
+ [0x5de6] = 0x9fb6, [0x5de7] = 0x9fb7, [0x5de8] = 0x3b4e, [0x5de9] = 0x3c6e,
|
||||||
|
+ [0x5dea] = 0x3ce0, [0x5deb] = 0x2ea7, [0x5dec] = 0xe831, [0x5ded] = 0x9fb8,
|
||||||
|
[0x5dee] = 0x2eaa, [0x5def] = 0x4056, [0x5df0] = 0x415f, [0x5df1] = 0x2eae,
|
||||||
|
[0x5df2] = 0x4337, [0x5df3] = 0x2eb3, [0x5df4] = 0x2eb6, [0x5df5] = 0x2eb7,
|
||||||
|
- [0x5df7] = 0x43b1, [0x5df8] = 0x43ac, [0x5df9] = 0x2ebb, [0x5dfa] = 0x43dd,
|
||||||
|
- [0x5dfb] = 0x44d6, [0x5dfc] = 0x4661, [0x5dfd] = 0x464c, [0x5dfe] = 0x9fb9,
|
||||||
|
- [0x5e00] = 0x4723, [0x5e01] = 0x4729, [0x5e02] = 0x477c, [0x5e03] = 0x478d,
|
||||||
|
- [0x5e04] = 0x2eca, [0x5e05] = 0x4947, [0x5e06] = 0x497a, [0x5e07] = 0x497d,
|
||||||
|
- [0x5e08] = 0x4982, [0x5e09] = 0x4983, [0x5e0a] = 0x4985, [0x5e0b] = 0x4986,
|
||||||
|
- [0x5e0c] = 0x499f, [0x5e0d] = 0x499b, [0x5e0e] = 0x49b7, [0x5e0f] = 0x49b6,
|
||||||
|
- [0x5e10] = 0x9fba, [0x5e12] = 0x4ca3, [0x5e13] = 0x4c9f, [0x5e14] = 0x4ca0,
|
||||||
|
- [0x5e15] = 0x4ca1, [0x5e16] = 0x4c77, [0x5e17] = 0x4ca2, [0x5e18] = 0x4d13,
|
||||||
|
- [0x5e19] = 0x4d14, [0x5e1a] = 0x4d15, [0x5e1b] = 0x4d16, [0x5e1c] = 0x4d17,
|
||||||
|
- [0x5e1d] = 0x4d18, [0x5e1e] = 0x4d19, [0x5e1f] = 0x4dae, [0x5e20] = 0x9fbb,
|
||||||
|
- [0x5e21] = 0xe468, [0x5e22] = 0xe469, [0x5e23] = 0xe46a, [0x5e24] = 0xe46b,
|
||||||
|
- [0x5e25] = 0xe46c, [0x5e26] = 0xe46d, [0x5e27] = 0xe46e, [0x5e28] = 0xe46f,
|
||||||
|
- [0x5e29] = 0xe470, [0x5e2a] = 0xe471, [0x5e2b] = 0xe472, [0x5e2c] = 0xe473,
|
||||||
|
- [0x5e2d] = 0xe474, [0x5e2e] = 0xe475, [0x5e2f] = 0xe476, [0x5e30] = 0xe477,
|
||||||
|
- [0x5e31] = 0xe478, [0x5e32] = 0xe479, [0x5e33] = 0xe47a, [0x5e34] = 0xe47b,
|
||||||
|
- [0x5e35] = 0xe47c, [0x5e36] = 0xe47d, [0x5e37] = 0xe47e, [0x5e38] = 0xe47f,
|
||||||
|
- [0x5e39] = 0xe480, [0x5e3a] = 0xe481, [0x5e3b] = 0xe482, [0x5e3c] = 0xe483,
|
||||||
|
- [0x5e3d] = 0xe484, [0x5e3e] = 0xe485, [0x5e3f] = 0xe486, [0x5e40] = 0xe487,
|
||||||
|
- [0x5e41] = 0xe488, [0x5e42] = 0xe489, [0x5e43] = 0xe48a, [0x5e44] = 0xe48b,
|
||||||
|
- [0x5e45] = 0xe48c, [0x5e46] = 0xe48d, [0x5e47] = 0xe48e, [0x5e48] = 0xe48f,
|
||||||
|
- [0x5e49] = 0xe490, [0x5e4a] = 0xe491, [0x5e4b] = 0xe492, [0x5e4c] = 0xe493,
|
||||||
|
- [0x5e4d] = 0xe494, [0x5e4e] = 0xe495, [0x5e4f] = 0xe496, [0x5e50] = 0xe497,
|
||||||
|
- [0x5e51] = 0xe498, [0x5e52] = 0xe499, [0x5e53] = 0xe49a, [0x5e54] = 0xe49b,
|
||||||
|
- [0x5e55] = 0xe49c, [0x5e56] = 0xe49d, [0x5e57] = 0xe49e, [0x5e58] = 0xe49f,
|
||||||
|
- [0x5e59] = 0xe4a0, [0x5e5a] = 0xe4a1, [0x5e5b] = 0xe4a2, [0x5e5c] = 0xe4a3,
|
||||||
|
- [0x5e5d] = 0xe4a4, [0x5e5e] = 0xe4a5, [0x5e5f] = 0xe4a6, [0x5e60] = 0xe4a7,
|
||||||
|
- [0x5e61] = 0xe4a8, [0x5e62] = 0xe4a9, [0x5e63] = 0xe4aa, [0x5e64] = 0xe4ab,
|
||||||
|
- [0x5e65] = 0xe4ac, [0x5e66] = 0xe4ad, [0x5e67] = 0xe4ae, [0x5e68] = 0xe4af,
|
||||||
|
- [0x5e69] = 0xe4b0, [0x5e6a] = 0xe4b1, [0x5e6b] = 0xe4b2, [0x5e6c] = 0xe4b3,
|
||||||
|
- [0x5e6d] = 0xe4b4, [0x5e6e] = 0xe4b5, [0x5e6f] = 0xe4b6, [0x5e70] = 0xe4b7,
|
||||||
|
- [0x5e71] = 0xe4b8, [0x5e72] = 0xe4b9, [0x5e73] = 0xe4ba, [0x5e74] = 0xe4bb,
|
||||||
|
- [0x5e75] = 0xe4bc, [0x5e76] = 0xe4bd, [0x5e77] = 0xe4be, [0x5e78] = 0xe4bf,
|
||||||
|
- [0x5e79] = 0xe4c0, [0x5e7a] = 0xe4c1, [0x5e7b] = 0xe4c2, [0x5e7c] = 0xe4c3,
|
||||||
|
- [0x5e7d] = 0xe4c4, [0x5e7e] = 0xe4c5,
|
||||||
|
+ [0x5df6] = 0xe83b, [0x5df7] = 0x43b1, [0x5df8] = 0x43ac, [0x5df9] = 0x2ebb,
|
||||||
|
+ [0x5dfa] = 0x43dd, [0x5dfb] = 0x44d6, [0x5dfc] = 0x4661, [0x5dfd] = 0x464c,
|
||||||
|
+ [0x5dfe] = 0x9fb9, [0x5e00] = 0x4723, [0x5e01] = 0x4729, [0x5e02] = 0x477c,
|
||||||
|
+ [0x5e03] = 0x478d, [0x5e04] = 0x2eca, [0x5e05] = 0x4947, [0x5e06] = 0x497a,
|
||||||
|
+ [0x5e07] = 0x497d, [0x5e08] = 0x4982, [0x5e09] = 0x4983, [0x5e0a] = 0x4985,
|
||||||
|
+ [0x5e0b] = 0x4986, [0x5e0c] = 0x499f, [0x5e0d] = 0x499b, [0x5e0e] = 0x49b7,
|
||||||
|
+ [0x5e0f] = 0x49b6, [0x5e10] = 0x9fba, [0x5e11] = 0xe855, [0x5e12] = 0x4ca3,
|
||||||
|
+ [0x5e13] = 0x4c9f, [0x5e14] = 0x4ca0, [0x5e15] = 0x4ca1, [0x5e16] = 0x4c77,
|
||||||
|
+ [0x5e17] = 0x4ca2, [0x5e18] = 0x4d13, [0x5e19] = 0x4d14, [0x5e1a] = 0x4d15,
|
||||||
|
+ [0x5e1b] = 0x4d16, [0x5e1c] = 0x4d17, [0x5e1d] = 0x4d18, [0x5e1e] = 0x4d19,
|
||||||
|
+ [0x5e1f] = 0x4dae, [0x5e20] = 0x9fbb, [0x5e21] = 0xe468, [0x5e22] = 0xe469,
|
||||||
|
+ [0x5e23] = 0xe46a, [0x5e24] = 0xe46b, [0x5e25] = 0xe46c, [0x5e26] = 0xe46d,
|
||||||
|
+ [0x5e27] = 0xe46e, [0x5e28] = 0xe46f, [0x5e29] = 0xe470, [0x5e2a] = 0xe471,
|
||||||
|
+ [0x5e2b] = 0xe472, [0x5e2c] = 0xe473, [0x5e2d] = 0xe474, [0x5e2e] = 0xe475,
|
||||||
|
+ [0x5e2f] = 0xe476, [0x5e30] = 0xe477, [0x5e31] = 0xe478, [0x5e32] = 0xe479,
|
||||||
|
+ [0x5e33] = 0xe47a, [0x5e34] = 0xe47b, [0x5e35] = 0xe47c, [0x5e36] = 0xe47d,
|
||||||
|
+ [0x5e37] = 0xe47e, [0x5e38] = 0xe47f, [0x5e39] = 0xe480, [0x5e3a] = 0xe481,
|
||||||
|
+ [0x5e3b] = 0xe482, [0x5e3c] = 0xe483, [0x5e3d] = 0xe484, [0x5e3e] = 0xe485,
|
||||||
|
+ [0x5e3f] = 0xe486, [0x5e40] = 0xe487, [0x5e41] = 0xe488, [0x5e42] = 0xe489,
|
||||||
|
+ [0x5e43] = 0xe48a, [0x5e44] = 0xe48b, [0x5e45] = 0xe48c, [0x5e46] = 0xe48d,
|
||||||
|
+ [0x5e47] = 0xe48e, [0x5e48] = 0xe48f, [0x5e49] = 0xe490, [0x5e4a] = 0xe491,
|
||||||
|
+ [0x5e4b] = 0xe492, [0x5e4c] = 0xe493, [0x5e4d] = 0xe494, [0x5e4e] = 0xe495,
|
||||||
|
+ [0x5e4f] = 0xe496, [0x5e50] = 0xe497, [0x5e51] = 0xe498, [0x5e52] = 0xe499,
|
||||||
|
+ [0x5e53] = 0xe49a, [0x5e54] = 0xe49b, [0x5e55] = 0xe49c, [0x5e56] = 0xe49d,
|
||||||
|
+ [0x5e57] = 0xe49e, [0x5e58] = 0xe49f, [0x5e59] = 0xe4a0, [0x5e5a] = 0xe4a1,
|
||||||
|
+ [0x5e5b] = 0xe4a2, [0x5e5c] = 0xe4a3, [0x5e5d] = 0xe4a4, [0x5e5e] = 0xe4a5,
|
||||||
|
+ [0x5e5f] = 0xe4a6, [0x5e60] = 0xe4a7, [0x5e61] = 0xe4a8, [0x5e62] = 0xe4a9,
|
||||||
|
+ [0x5e63] = 0xe4aa, [0x5e64] = 0xe4ab, [0x5e65] = 0xe4ac, [0x5e66] = 0xe4ad,
|
||||||
|
+ [0x5e67] = 0xe4ae, [0x5e68] = 0xe4af, [0x5e69] = 0xe4b0, [0x5e6a] = 0xe4b1,
|
||||||
|
+ [0x5e6b] = 0xe4b2, [0x5e6c] = 0xe4b3, [0x5e6d] = 0xe4b4, [0x5e6e] = 0xe4b5,
|
||||||
|
+ [0x5e6f] = 0xe4b6, [0x5e70] = 0xe4b7, [0x5e71] = 0xe4b8, [0x5e72] = 0xe4b9,
|
||||||
|
+ [0x5e73] = 0xe4ba, [0x5e74] = 0xe4bb, [0x5e75] = 0xe4bc, [0x5e76] = 0xe4bd,
|
||||||
|
+ [0x5e77] = 0xe4be, [0x5e78] = 0xe4bf, [0x5e79] = 0xe4c0, [0x5e7a] = 0xe4c1,
|
||||||
|
+ [0x5e7b] = 0xe4c2, [0x5e7c] = 0xe4c3, [0x5e7d] = 0xe4c4, [0x5e7e] = 0xe4c5,
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Table for GB18030 -> UCS-4, containing the four-byte characters only,
|
||||||
|
@@ -8680,7 +8681,9 @@ static const uint16_t __fourbyte_to_ucs[0x99e2 - 6637 - 2110 - 14404 - 4295] =
|
||||||
|
[0x2838] = 0x9fa6, [0x2839] = 0x9fa7, [0x283a] = 0x9fa8, [0x283b] = 0x9fa9,
|
||||||
|
[0x283c] = 0x9faa, [0x283d] = 0x9fab, [0x283e] = 0x9fac, [0x283f] = 0x9fad,
|
||||||
|
[0x2840] = 0x9fae, [0x2841] = 0x9faf, [0x2842] = 0x9fb0, [0x2843] = 0x9fb1,
|
||||||
|
- [0x2844] = 0x9fb2, [0x2845] = 0x9fb3, [0x284e] = 0xe76c, [0x284f] = 0xe7c8,
|
||||||
|
+ [0x2844] = 0x9fb2, [0x2845] = 0x9fb3, [0x2846] = 0xe81e, [0x2847] = 0xe826,
|
||||||
|
+ [0x2848] = 0xe82b, [0x2849] = 0xe82c, [0x284a] = 0xe832, [0x284b] = 0xe843,
|
||||||
|
+ [0x284c] = 0xe854, [0x284d] = 0xe864, [0x284e] = 0xe76c, [0x284f] = 0xe7c8,
|
||||||
|
[0x2850] = 0xe7e7, [0x2851] = 0xe7e8, [0x2852] = 0xe7e9, [0x2853] = 0xe7ea,
|
||||||
|
[0x2854] = 0xe7eb, [0x2855] = 0xe7ec, [0x2856] = 0xe7ed, [0x2857] = 0xe7ee,
|
||||||
|
[0x2858] = 0xe7ef, [0x2859] = 0xe7f0, [0x285a] = 0xe7f1, [0x285b] = 0xe7f2,
|
||||||
|
@@ -9008,84 +9011,86 @@ static const uint16_t __fourbyte_to_ucs[0x99e2 - 6637 - 2110 - 14404 - 4295] =
|
||||||
|
[0x2d60] = 0xfe02, [0x2d61] = 0xfe03, [0x2d62] = 0xfe04, [0x2d63] = 0xfe05,
|
||||||
|
[0x2d64] = 0xfe06, [0x2d65] = 0xfe07, [0x2d66] = 0xfe08, [0x2d67] = 0xfe09,
|
||||||
|
[0x2d68] = 0xfe0a, [0x2d69] = 0xfe0b, [0x2d6a] = 0xfe0c, [0x2d6b] = 0xfe0d,
|
||||||
|
- [0x2d6c] = 0xfe0e, [0x2d6d] = 0xfe0f, [0x2d78] = 0xfe1a, [0x2d79] = 0xfe1b,
|
||||||
|
- [0x2d7a] = 0xfe1c, [0x2d7b] = 0xfe1d, [0x2d7c] = 0xfe1e, [0x2d7d] = 0xfe1f,
|
||||||
|
- [0x2d7e] = 0xfe20, [0x2d7f] = 0xfe21, [0x2d80] = 0xfe22, [0x2d81] = 0xfe23,
|
||||||
|
- [0x2d82] = 0xfe24, [0x2d83] = 0xfe25, [0x2d84] = 0xfe26, [0x2d85] = 0xfe27,
|
||||||
|
- [0x2d86] = 0xfe28, [0x2d87] = 0xfe29, [0x2d88] = 0xfe2a, [0x2d89] = 0xfe2b,
|
||||||
|
- [0x2d8a] = 0xfe2c, [0x2d8b] = 0xfe2d, [0x2d8c] = 0xfe2e, [0x2d8d] = 0xfe2f,
|
||||||
|
- [0x2d8e] = 0xfe32, [0x2d8f] = 0xfe45, [0x2d90] = 0xfe46, [0x2d91] = 0xfe47,
|
||||||
|
- [0x2d92] = 0xfe48, [0x2d93] = 0xfe53, [0x2d94] = 0xfe58, [0x2d95] = 0xfe67,
|
||||||
|
- [0x2d96] = 0xfe6c, [0x2d97] = 0xfe6d, [0x2d98] = 0xfe6e, [0x2d99] = 0xfe6f,
|
||||||
|
- [0x2d9a] = 0xfe70, [0x2d9b] = 0xfe71, [0x2d9c] = 0xfe72, [0x2d9d] = 0xfe73,
|
||||||
|
- [0x2d9e] = 0xfe74, [0x2d9f] = 0xfe75, [0x2da0] = 0xfe76, [0x2da1] = 0xfe77,
|
||||||
|
- [0x2da2] = 0xfe78, [0x2da3] = 0xfe79, [0x2da4] = 0xfe7a, [0x2da5] = 0xfe7b,
|
||||||
|
- [0x2da6] = 0xfe7c, [0x2da7] = 0xfe7d, [0x2da8] = 0xfe7e, [0x2da9] = 0xfe7f,
|
||||||
|
- [0x2daa] = 0xfe80, [0x2dab] = 0xfe81, [0x2dac] = 0xfe82, [0x2dad] = 0xfe83,
|
||||||
|
- [0x2dae] = 0xfe84, [0x2daf] = 0xfe85, [0x2db0] = 0xfe86, [0x2db1] = 0xfe87,
|
||||||
|
- [0x2db2] = 0xfe88, [0x2db3] = 0xfe89, [0x2db4] = 0xfe8a, [0x2db5] = 0xfe8b,
|
||||||
|
- [0x2db6] = 0xfe8c, [0x2db7] = 0xfe8d, [0x2db8] = 0xfe8e, [0x2db9] = 0xfe8f,
|
||||||
|
- [0x2dba] = 0xfe90, [0x2dbb] = 0xfe91, [0x2dbc] = 0xfe92, [0x2dbd] = 0xfe93,
|
||||||
|
- [0x2dbe] = 0xfe94, [0x2dbf] = 0xfe95, [0x2dc0] = 0xfe96, [0x2dc1] = 0xfe97,
|
||||||
|
- [0x2dc2] = 0xfe98, [0x2dc3] = 0xfe99, [0x2dc4] = 0xfe9a, [0x2dc5] = 0xfe9b,
|
||||||
|
- [0x2dc6] = 0xfe9c, [0x2dc7] = 0xfe9d, [0x2dc8] = 0xfe9e, [0x2dc9] = 0xfe9f,
|
||||||
|
- [0x2dca] = 0xfea0, [0x2dcb] = 0xfea1, [0x2dcc] = 0xfea2, [0x2dcd] = 0xfea3,
|
||||||
|
- [0x2dce] = 0xfea4, [0x2dcf] = 0xfea5, [0x2dd0] = 0xfea6, [0x2dd1] = 0xfea7,
|
||||||
|
- [0x2dd2] = 0xfea8, [0x2dd3] = 0xfea9, [0x2dd4] = 0xfeaa, [0x2dd5] = 0xfeab,
|
||||||
|
- [0x2dd6] = 0xfeac, [0x2dd7] = 0xfead, [0x2dd8] = 0xfeae, [0x2dd9] = 0xfeaf,
|
||||||
|
- [0x2dda] = 0xfeb0, [0x2ddb] = 0xfeb1, [0x2ddc] = 0xfeb2, [0x2ddd] = 0xfeb3,
|
||||||
|
- [0x2dde] = 0xfeb4, [0x2ddf] = 0xfeb5, [0x2de0] = 0xfeb6, [0x2de1] = 0xfeb7,
|
||||||
|
- [0x2de2] = 0xfeb8, [0x2de3] = 0xfeb9, [0x2de4] = 0xfeba, [0x2de5] = 0xfebb,
|
||||||
|
- [0x2de6] = 0xfebc, [0x2de7] = 0xfebd, [0x2de8] = 0xfebe, [0x2de9] = 0xfebf,
|
||||||
|
- [0x2dea] = 0xfec0, [0x2deb] = 0xfec1, [0x2dec] = 0xfec2, [0x2ded] = 0xfec3,
|
||||||
|
- [0x2dee] = 0xfec4, [0x2def] = 0xfec5, [0x2df0] = 0xfec6, [0x2df1] = 0xfec7,
|
||||||
|
- [0x2df2] = 0xfec8, [0x2df3] = 0xfec9, [0x2df4] = 0xfeca, [0x2df5] = 0xfecb,
|
||||||
|
- [0x2df6] = 0xfecc, [0x2df7] = 0xfecd, [0x2df8] = 0xfece, [0x2df9] = 0xfecf,
|
||||||
|
- [0x2dfa] = 0xfed0, [0x2dfb] = 0xfed1, [0x2dfc] = 0xfed2, [0x2dfd] = 0xfed3,
|
||||||
|
- [0x2dfe] = 0xfed4, [0x2dff] = 0xfed5, [0x2e00] = 0xfed6, [0x2e01] = 0xfed7,
|
||||||
|
- [0x2e02] = 0xfed8, [0x2e03] = 0xfed9, [0x2e04] = 0xfeda, [0x2e05] = 0xfedb,
|
||||||
|
- [0x2e06] = 0xfedc, [0x2e07] = 0xfedd, [0x2e08] = 0xfede, [0x2e09] = 0xfedf,
|
||||||
|
- [0x2e0a] = 0xfee0, [0x2e0b] = 0xfee1, [0x2e0c] = 0xfee2, [0x2e0d] = 0xfee3,
|
||||||
|
- [0x2e0e] = 0xfee4, [0x2e0f] = 0xfee5, [0x2e10] = 0xfee6, [0x2e11] = 0xfee7,
|
||||||
|
- [0x2e12] = 0xfee8, [0x2e13] = 0xfee9, [0x2e14] = 0xfeea, [0x2e15] = 0xfeeb,
|
||||||
|
- [0x2e16] = 0xfeec, [0x2e17] = 0xfeed, [0x2e18] = 0xfeee, [0x2e19] = 0xfeef,
|
||||||
|
- [0x2e1a] = 0xfef0, [0x2e1b] = 0xfef1, [0x2e1c] = 0xfef2, [0x2e1d] = 0xfef3,
|
||||||
|
- [0x2e1e] = 0xfef4, [0x2e1f] = 0xfef5, [0x2e20] = 0xfef6, [0x2e21] = 0xfef7,
|
||||||
|
- [0x2e22] = 0xfef8, [0x2e23] = 0xfef9, [0x2e24] = 0xfefa, [0x2e25] = 0xfefb,
|
||||||
|
- [0x2e26] = 0xfefc, [0x2e27] = 0xfefd, [0x2e28] = 0xfefe, [0x2e29] = 0xfeff,
|
||||||
|
- [0x2e2a] = 0xff00, [0x2e2b] = 0xff5f, [0x2e2c] = 0xff60, [0x2e2d] = 0xff61,
|
||||||
|
- [0x2e2e] = 0xff62, [0x2e2f] = 0xff63, [0x2e30] = 0xff64, [0x2e31] = 0xff65,
|
||||||
|
- [0x2e32] = 0xff66, [0x2e33] = 0xff67, [0x2e34] = 0xff68, [0x2e35] = 0xff69,
|
||||||
|
- [0x2e36] = 0xff6a, [0x2e37] = 0xff6b, [0x2e38] = 0xff6c, [0x2e39] = 0xff6d,
|
||||||
|
- [0x2e3a] = 0xff6e, [0x2e3b] = 0xff6f, [0x2e3c] = 0xff70, [0x2e3d] = 0xff71,
|
||||||
|
- [0x2e3e] = 0xff72, [0x2e3f] = 0xff73, [0x2e40] = 0xff74, [0x2e41] = 0xff75,
|
||||||
|
- [0x2e42] = 0xff76, [0x2e43] = 0xff77, [0x2e44] = 0xff78, [0x2e45] = 0xff79,
|
||||||
|
- [0x2e46] = 0xff7a, [0x2e47] = 0xff7b, [0x2e48] = 0xff7c, [0x2e49] = 0xff7d,
|
||||||
|
- [0x2e4a] = 0xff7e, [0x2e4b] = 0xff7f, [0x2e4c] = 0xff80, [0x2e4d] = 0xff81,
|
||||||
|
- [0x2e4e] = 0xff82, [0x2e4f] = 0xff83, [0x2e50] = 0xff84, [0x2e51] = 0xff85,
|
||||||
|
- [0x2e52] = 0xff86, [0x2e53] = 0xff87, [0x2e54] = 0xff88, [0x2e55] = 0xff89,
|
||||||
|
- [0x2e56] = 0xff8a, [0x2e57] = 0xff8b, [0x2e58] = 0xff8c, [0x2e59] = 0xff8d,
|
||||||
|
- [0x2e5a] = 0xff8e, [0x2e5b] = 0xff8f, [0x2e5c] = 0xff90, [0x2e5d] = 0xff91,
|
||||||
|
- [0x2e5e] = 0xff92, [0x2e5f] = 0xff93, [0x2e60] = 0xff94, [0x2e61] = 0xff95,
|
||||||
|
- [0x2e62] = 0xff96, [0x2e63] = 0xff97, [0x2e64] = 0xff98, [0x2e65] = 0xff99,
|
||||||
|
- [0x2e66] = 0xff9a, [0x2e67] = 0xff9b, [0x2e68] = 0xff9c, [0x2e69] = 0xff9d,
|
||||||
|
- [0x2e6a] = 0xff9e, [0x2e6b] = 0xff9f, [0x2e6c] = 0xffa0, [0x2e6d] = 0xffa1,
|
||||||
|
- [0x2e6e] = 0xffa2, [0x2e6f] = 0xffa3, [0x2e70] = 0xffa4, [0x2e71] = 0xffa5,
|
||||||
|
- [0x2e72] = 0xffa6, [0x2e73] = 0xffa7, [0x2e74] = 0xffa8, [0x2e75] = 0xffa9,
|
||||||
|
- [0x2e76] = 0xffaa, [0x2e77] = 0xffab, [0x2e78] = 0xffac, [0x2e79] = 0xffad,
|
||||||
|
- [0x2e7a] = 0xffae, [0x2e7b] = 0xffaf, [0x2e7c] = 0xffb0, [0x2e7d] = 0xffb1,
|
||||||
|
- [0x2e7e] = 0xffb2, [0x2e7f] = 0xffb3, [0x2e80] = 0xffb4, [0x2e81] = 0xffb5,
|
||||||
|
- [0x2e82] = 0xffb6, [0x2e83] = 0xffb7, [0x2e84] = 0xffb8, [0x2e85] = 0xffb9,
|
||||||
|
- [0x2e86] = 0xffba, [0x2e87] = 0xffbb, [0x2e88] = 0xffbc, [0x2e89] = 0xffbd,
|
||||||
|
- [0x2e8a] = 0xffbe, [0x2e8b] = 0xffbf, [0x2e8c] = 0xffc0, [0x2e8d] = 0xffc1,
|
||||||
|
- [0x2e8e] = 0xffc2, [0x2e8f] = 0xffc3, [0x2e90] = 0xffc4, [0x2e91] = 0xffc5,
|
||||||
|
- [0x2e92] = 0xffc6, [0x2e93] = 0xffc7, [0x2e94] = 0xffc8, [0x2e95] = 0xffc9,
|
||||||
|
- [0x2e96] = 0xffca, [0x2e97] = 0xffcb, [0x2e98] = 0xffcc, [0x2e99] = 0xffcd,
|
||||||
|
- [0x2e9a] = 0xffce, [0x2e9b] = 0xffcf, [0x2e9c] = 0xffd0, [0x2e9d] = 0xffd1,
|
||||||
|
- [0x2e9e] = 0xffd2, [0x2e9f] = 0xffd3, [0x2ea0] = 0xffd4, [0x2ea1] = 0xffd5,
|
||||||
|
- [0x2ea2] = 0xffd6, [0x2ea3] = 0xffd7, [0x2ea4] = 0xffd8, [0x2ea5] = 0xffd9,
|
||||||
|
- [0x2ea6] = 0xffda, [0x2ea7] = 0xffdb, [0x2ea8] = 0xffdc, [0x2ea9] = 0xffdd,
|
||||||
|
- [0x2eaa] = 0xffde, [0x2eab] = 0xffdf,
|
||||||
|
+ [0x2d6c] = 0xfe0e, [0x2d6d] = 0xfe0f, [0x2d6e] = 0xe78d, [0x2d6f] = 0xe78f,
|
||||||
|
+ [0x2d70] = 0xe78e, [0x2d71] = 0xe790, [0x2d72] = 0xe791, [0x2d73] = 0xe792,
|
||||||
|
+ [0x2d74] = 0xe793, [0x2d75] = 0xe794, [0x2d76] = 0xe795, [0x2d77] = 0xe796,
|
||||||
|
+ [0x2d78] = 0xfe1a, [0x2d79] = 0xfe1b, [0x2d7a] = 0xfe1c, [0x2d7b] = 0xfe1d,
|
||||||
|
+ [0x2d7c] = 0xfe1e, [0x2d7d] = 0xfe1f, [0x2d7e] = 0xfe20, [0x2d7f] = 0xfe21,
|
||||||
|
+ [0x2d80] = 0xfe22, [0x2d81] = 0xfe23, [0x2d82] = 0xfe24, [0x2d83] = 0xfe25,
|
||||||
|
+ [0x2d84] = 0xfe26, [0x2d85] = 0xfe27, [0x2d86] = 0xfe28, [0x2d87] = 0xfe29,
|
||||||
|
+ [0x2d88] = 0xfe2a, [0x2d89] = 0xfe2b, [0x2d8a] = 0xfe2c, [0x2d8b] = 0xfe2d,
|
||||||
|
+ [0x2d8c] = 0xfe2e, [0x2d8d] = 0xfe2f, [0x2d8e] = 0xfe32, [0x2d8f] = 0xfe45,
|
||||||
|
+ [0x2d90] = 0xfe46, [0x2d91] = 0xfe47, [0x2d92] = 0xfe48, [0x2d93] = 0xfe53,
|
||||||
|
+ [0x2d94] = 0xfe58, [0x2d95] = 0xfe67, [0x2d96] = 0xfe6c, [0x2d97] = 0xfe6d,
|
||||||
|
+ [0x2d98] = 0xfe6e, [0x2d99] = 0xfe6f, [0x2d9a] = 0xfe70, [0x2d9b] = 0xfe71,
|
||||||
|
+ [0x2d9c] = 0xfe72, [0x2d9d] = 0xfe73, [0x2d9e] = 0xfe74, [0x2d9f] = 0xfe75,
|
||||||
|
+ [0x2da0] = 0xfe76, [0x2da1] = 0xfe77, [0x2da2] = 0xfe78, [0x2da3] = 0xfe79,
|
||||||
|
+ [0x2da4] = 0xfe7a, [0x2da5] = 0xfe7b, [0x2da6] = 0xfe7c, [0x2da7] = 0xfe7d,
|
||||||
|
+ [0x2da8] = 0xfe7e, [0x2da9] = 0xfe7f, [0x2daa] = 0xfe80, [0x2dab] = 0xfe81,
|
||||||
|
+ [0x2dac] = 0xfe82, [0x2dad] = 0xfe83, [0x2dae] = 0xfe84, [0x2daf] = 0xfe85,
|
||||||
|
+ [0x2db0] = 0xfe86, [0x2db1] = 0xfe87, [0x2db2] = 0xfe88, [0x2db3] = 0xfe89,
|
||||||
|
+ [0x2db4] = 0xfe8a, [0x2db5] = 0xfe8b, [0x2db6] = 0xfe8c, [0x2db7] = 0xfe8d,
|
||||||
|
+ [0x2db8] = 0xfe8e, [0x2db9] = 0xfe8f, [0x2dba] = 0xfe90, [0x2dbb] = 0xfe91,
|
||||||
|
+ [0x2dbc] = 0xfe92, [0x2dbd] = 0xfe93, [0x2dbe] = 0xfe94, [0x2dbf] = 0xfe95,
|
||||||
|
+ [0x2dc0] = 0xfe96, [0x2dc1] = 0xfe97, [0x2dc2] = 0xfe98, [0x2dc3] = 0xfe99,
|
||||||
|
+ [0x2dc4] = 0xfe9a, [0x2dc5] = 0xfe9b, [0x2dc6] = 0xfe9c, [0x2dc7] = 0xfe9d,
|
||||||
|
+ [0x2dc8] = 0xfe9e, [0x2dc9] = 0xfe9f, [0x2dca] = 0xfea0, [0x2dcb] = 0xfea1,
|
||||||
|
+ [0x2dcc] = 0xfea2, [0x2dcd] = 0xfea3, [0x2dce] = 0xfea4, [0x2dcf] = 0xfea5,
|
||||||
|
+ [0x2dd0] = 0xfea6, [0x2dd1] = 0xfea7, [0x2dd2] = 0xfea8, [0x2dd3] = 0xfea9,
|
||||||
|
+ [0x2dd4] = 0xfeaa, [0x2dd5] = 0xfeab, [0x2dd6] = 0xfeac, [0x2dd7] = 0xfead,
|
||||||
|
+ [0x2dd8] = 0xfeae, [0x2dd9] = 0xfeaf, [0x2dda] = 0xfeb0, [0x2ddb] = 0xfeb1,
|
||||||
|
+ [0x2ddc] = 0xfeb2, [0x2ddd] = 0xfeb3, [0x2dde] = 0xfeb4, [0x2ddf] = 0xfeb5,
|
||||||
|
+ [0x2de0] = 0xfeb6, [0x2de1] = 0xfeb7, [0x2de2] = 0xfeb8, [0x2de3] = 0xfeb9,
|
||||||
|
+ [0x2de4] = 0xfeba, [0x2de5] = 0xfebb, [0x2de6] = 0xfebc, [0x2de7] = 0xfebd,
|
||||||
|
+ [0x2de8] = 0xfebe, [0x2de9] = 0xfebf, [0x2dea] = 0xfec0, [0x2deb] = 0xfec1,
|
||||||
|
+ [0x2dec] = 0xfec2, [0x2ded] = 0xfec3, [0x2dee] = 0xfec4, [0x2def] = 0xfec5,
|
||||||
|
+ [0x2df0] = 0xfec6, [0x2df1] = 0xfec7, [0x2df2] = 0xfec8, [0x2df3] = 0xfec9,
|
||||||
|
+ [0x2df4] = 0xfeca, [0x2df5] = 0xfecb, [0x2df6] = 0xfecc, [0x2df7] = 0xfecd,
|
||||||
|
+ [0x2df8] = 0xfece, [0x2df9] = 0xfecf, [0x2dfa] = 0xfed0, [0x2dfb] = 0xfed1,
|
||||||
|
+ [0x2dfc] = 0xfed2, [0x2dfd] = 0xfed3, [0x2dfe] = 0xfed4, [0x2dff] = 0xfed5,
|
||||||
|
+ [0x2e00] = 0xfed6, [0x2e01] = 0xfed7, [0x2e02] = 0xfed8, [0x2e03] = 0xfed9,
|
||||||
|
+ [0x2e04] = 0xfeda, [0x2e05] = 0xfedb, [0x2e06] = 0xfedc, [0x2e07] = 0xfedd,
|
||||||
|
+ [0x2e08] = 0xfede, [0x2e09] = 0xfedf, [0x2e0a] = 0xfee0, [0x2e0b] = 0xfee1,
|
||||||
|
+ [0x2e0c] = 0xfee2, [0x2e0d] = 0xfee3, [0x2e0e] = 0xfee4, [0x2e0f] = 0xfee5,
|
||||||
|
+ [0x2e10] = 0xfee6, [0x2e11] = 0xfee7, [0x2e12] = 0xfee8, [0x2e13] = 0xfee9,
|
||||||
|
+ [0x2e14] = 0xfeea, [0x2e15] = 0xfeeb, [0x2e16] = 0xfeec, [0x2e17] = 0xfeed,
|
||||||
|
+ [0x2e18] = 0xfeee, [0x2e19] = 0xfeef, [0x2e1a] = 0xfef0, [0x2e1b] = 0xfef1,
|
||||||
|
+ [0x2e1c] = 0xfef2, [0x2e1d] = 0xfef3, [0x2e1e] = 0xfef4, [0x2e1f] = 0xfef5,
|
||||||
|
+ [0x2e20] = 0xfef6, [0x2e21] = 0xfef7, [0x2e22] = 0xfef8, [0x2e23] = 0xfef9,
|
||||||
|
+ [0x2e24] = 0xfefa, [0x2e25] = 0xfefb, [0x2e26] = 0xfefc, [0x2e27] = 0xfefd,
|
||||||
|
+ [0x2e28] = 0xfefe, [0x2e29] = 0xfeff, [0x2e2a] = 0xff00, [0x2e2b] = 0xff5f,
|
||||||
|
+ [0x2e2c] = 0xff60, [0x2e2d] = 0xff61, [0x2e2e] = 0xff62, [0x2e2f] = 0xff63,
|
||||||
|
+ [0x2e30] = 0xff64, [0x2e31] = 0xff65, [0x2e32] = 0xff66, [0x2e33] = 0xff67,
|
||||||
|
+ [0x2e34] = 0xff68, [0x2e35] = 0xff69, [0x2e36] = 0xff6a, [0x2e37] = 0xff6b,
|
||||||
|
+ [0x2e38] = 0xff6c, [0x2e39] = 0xff6d, [0x2e3a] = 0xff6e, [0x2e3b] = 0xff6f,
|
||||||
|
+ [0x2e3c] = 0xff70, [0x2e3d] = 0xff71, [0x2e3e] = 0xff72, [0x2e3f] = 0xff73,
|
||||||
|
+ [0x2e40] = 0xff74, [0x2e41] = 0xff75, [0x2e42] = 0xff76, [0x2e43] = 0xff77,
|
||||||
|
+ [0x2e44] = 0xff78, [0x2e45] = 0xff79, [0x2e46] = 0xff7a, [0x2e47] = 0xff7b,
|
||||||
|
+ [0x2e48] = 0xff7c, [0x2e49] = 0xff7d, [0x2e4a] = 0xff7e, [0x2e4b] = 0xff7f,
|
||||||
|
+ [0x2e4c] = 0xff80, [0x2e4d] = 0xff81, [0x2e4e] = 0xff82, [0x2e4f] = 0xff83,
|
||||||
|
+ [0x2e50] = 0xff84, [0x2e51] = 0xff85, [0x2e52] = 0xff86, [0x2e53] = 0xff87,
|
||||||
|
+ [0x2e54] = 0xff88, [0x2e55] = 0xff89, [0x2e56] = 0xff8a, [0x2e57] = 0xff8b,
|
||||||
|
+ [0x2e58] = 0xff8c, [0x2e59] = 0xff8d, [0x2e5a] = 0xff8e, [0x2e5b] = 0xff8f,
|
||||||
|
+ [0x2e5c] = 0xff90, [0x2e5d] = 0xff91, [0x2e5e] = 0xff92, [0x2e5f] = 0xff93,
|
||||||
|
+ [0x2e60] = 0xff94, [0x2e61] = 0xff95, [0x2e62] = 0xff96, [0x2e63] = 0xff97,
|
||||||
|
+ [0x2e64] = 0xff98, [0x2e65] = 0xff99, [0x2e66] = 0xff9a, [0x2e67] = 0xff9b,
|
||||||
|
+ [0x2e68] = 0xff9c, [0x2e69] = 0xff9d, [0x2e6a] = 0xff9e, [0x2e6b] = 0xff9f,
|
||||||
|
+ [0x2e6c] = 0xffa0, [0x2e6d] = 0xffa1, [0x2e6e] = 0xffa2, [0x2e6f] = 0xffa3,
|
||||||
|
+ [0x2e70] = 0xffa4, [0x2e71] = 0xffa5, [0x2e72] = 0xffa6, [0x2e73] = 0xffa7,
|
||||||
|
+ [0x2e74] = 0xffa8, [0x2e75] = 0xffa9, [0x2e76] = 0xffaa, [0x2e77] = 0xffab,
|
||||||
|
+ [0x2e78] = 0xffac, [0x2e79] = 0xffad, [0x2e7a] = 0xffae, [0x2e7b] = 0xffaf,
|
||||||
|
+ [0x2e7c] = 0xffb0, [0x2e7d] = 0xffb1, [0x2e7e] = 0xffb2, [0x2e7f] = 0xffb3,
|
||||||
|
+ [0x2e80] = 0xffb4, [0x2e81] = 0xffb5, [0x2e82] = 0xffb6, [0x2e83] = 0xffb7,
|
||||||
|
+ [0x2e84] = 0xffb8, [0x2e85] = 0xffb9, [0x2e86] = 0xffba, [0x2e87] = 0xffbb,
|
||||||
|
+ [0x2e88] = 0xffbc, [0x2e89] = 0xffbd, [0x2e8a] = 0xffbe, [0x2e8b] = 0xffbf,
|
||||||
|
+ [0x2e8c] = 0xffc0, [0x2e8d] = 0xffc1, [0x2e8e] = 0xffc2, [0x2e8f] = 0xffc3,
|
||||||
|
+ [0x2e90] = 0xffc4, [0x2e91] = 0xffc5, [0x2e92] = 0xffc6, [0x2e93] = 0xffc7,
|
||||||
|
+ [0x2e94] = 0xffc8, [0x2e95] = 0xffc9, [0x2e96] = 0xffca, [0x2e97] = 0xffcb,
|
||||||
|
+ [0x2e98] = 0xffcc, [0x2e99] = 0xffcd, [0x2e9a] = 0xffce, [0x2e9b] = 0xffcf,
|
||||||
|
+ [0x2e9c] = 0xffd0, [0x2e9d] = 0xffd1, [0x2e9e] = 0xffd2, [0x2e9f] = 0xffd3,
|
||||||
|
+ [0x2ea0] = 0xffd4, [0x2ea1] = 0xffd5, [0x2ea2] = 0xffd6, [0x2ea3] = 0xffd7,
|
||||||
|
+ [0x2ea4] = 0xffd8, [0x2ea5] = 0xffd9, [0x2ea6] = 0xffda, [0x2ea7] = 0xffdb,
|
||||||
|
+ [0x2ea8] = 0xffdc, [0x2ea9] = 0xffdd, [0x2eaa] = 0xffde, [0x2eab] = 0xffdf,
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Table for UCS-4 -> GB18030, for the range U+0080..U+9FBB.
|
||||||
|
@@ -23437,71 +23442,79 @@ static const unsigned char __ucs_to_gb18030_tab2[][2] =
|
||||||
|
[0x0783] = "\xa5\xfd", [0x0784] = "\xa5\xfe", [0x0785] = "\xa6\xb9",
|
||||||
|
[0x0786] = "\xa6\xba", [0x0787] = "\xa6\xbb", [0x0788] = "\xa6\xbc",
|
||||||
|
[0x0789] = "\xa6\xbd", [0x078a] = "\xa6\xbe", [0x078b] = "\xa6\xbf",
|
||||||
|
- [0x078c] = "\xa6\xc0", [0x0797] = "\xa6\xf6", [0x0798] = "\xa6\xf7",
|
||||||
|
- [0x0799] = "\xa6\xf8", [0x079a] = "\xa6\xf9", [0x079b] = "\xa6\xfa",
|
||||||
|
- [0x079c] = "\xa6\xfb", [0x079d] = "\xa6\xfc", [0x079e] = "\xa6\xfd",
|
||||||
|
- [0x079f] = "\xa6\xfe", [0x07a0] = "\xa7\xc2", [0x07a1] = "\xa7\xc3",
|
||||||
|
- [0x07a2] = "\xa7\xc4", [0x07a3] = "\xa7\xc5", [0x07a4] = "\xa7\xc6",
|
||||||
|
- [0x07a5] = "\xa7\xc7", [0x07a6] = "\xa7\xc8", [0x07a7] = "\xa7\xc9",
|
||||||
|
- [0x07a8] = "\xa7\xca", [0x07a9] = "\xa7\xcb", [0x07aa] = "\xa7\xcc",
|
||||||
|
- [0x07ab] = "\xa7\xcd", [0x07ac] = "\xa7\xce", [0x07ad] = "\xa7\xcf",
|
||||||
|
- [0x07ae] = "\xa7\xd0", [0x07af] = "\xa7\xf2", [0x07b0] = "\xa7\xf3",
|
||||||
|
- [0x07b1] = "\xa7\xf4", [0x07b2] = "\xa7\xf5", [0x07b3] = "\xa7\xf6",
|
||||||
|
- [0x07b4] = "\xa7\xf7", [0x07b5] = "\xa7\xf8", [0x07b6] = "\xa7\xf9",
|
||||||
|
- [0x07b7] = "\xa7\xfa", [0x07b8] = "\xa7\xfb", [0x07b9] = "\xa7\xfc",
|
||||||
|
- [0x07ba] = "\xa7\xfd", [0x07bb] = "\xa7\xfe", [0x07bc] = "\xa8\x96",
|
||||||
|
- [0x07bd] = "\xa8\x97", [0x07be] = "\xa8\x98", [0x07bf] = "\xa8\x99",
|
||||||
|
- [0x07c0] = "\xa8\x9a", [0x07c1] = "\xa8\x9b", [0x07c2] = "\xa8\x9c",
|
||||||
|
- [0x07c3] = "\xa8\x9d", [0x07c4] = "\xa8\x9e", [0x07c5] = "\xa8\x9f",
|
||||||
|
- [0x07c6] = "\xa8\xa0", [0x07c7] = "\x00\x01", [0x07c8] = "\x65\x9e",
|
||||||
|
- [0x07c9] = "\xa8\xc1", [0x07ca] = "\xa8\xc2", [0x07cb] = "\xa8\xc3",
|
||||||
|
- [0x07cc] = "\xa8\xc4", [0x07cd] = "\xa8\xea", [0x07ce] = "\xa8\xeb",
|
||||||
|
- [0x07cf] = "\xa8\xec", [0x07d0] = "\xa8\xed", [0x07d1] = "\xa8\xee",
|
||||||
|
- [0x07d2] = "\xa8\xef", [0x07d3] = "\xa8\xf0", [0x07d4] = "\xa8\xf1",
|
||||||
|
- [0x07d5] = "\xa8\xf2", [0x07d6] = "\xa8\xf3", [0x07d7] = "\xa8\xf4",
|
||||||
|
- [0x07d8] = "\xa8\xf5", [0x07d9] = "\xa8\xf6", [0x07da] = "\xa8\xf7",
|
||||||
|
- [0x07db] = "\xa8\xf8", [0x07dc] = "\xa8\xf9", [0x07dd] = "\xa8\xfa",
|
||||||
|
- [0x07de] = "\xa8\xfb", [0x07df] = "\xa8\xfc", [0x07e0] = "\xa8\xfd",
|
||||||
|
- [0x07e1] = "\xa8\xfe", [0x07e2] = "\xa9\x58", [0x07e3] = "\xa9\x5b",
|
||||||
|
- [0x07e4] = "\xa9\x5d", [0x07e5] = "\xa9\x5e", [0x07e6] = "\xa9\x5f",
|
||||||
|
- [0x07e7] = "\x65\x9f", [0x07e8] = "\x65\xa0", [0x07e9] = "\x65\xa1",
|
||||||
|
- [0x07ea] = "\x65\xa2", [0x07eb] = "\x65\xa3", [0x07ec] = "\x65\xa4",
|
||||||
|
- [0x07ed] = "\x65\xa5", [0x07ee] = "\x65\xa6", [0x07ef] = "\x65\xa7",
|
||||||
|
- [0x07f0] = "\x65\xa8", [0x07f1] = "\x65\xa9", [0x07f2] = "\x65\xaa",
|
||||||
|
- [0x07f3] = "\x65\xab", [0x07f4] = "\xa9\x97", [0x07f5] = "\xa9\x98",
|
||||||
|
- [0x07f6] = "\xa9\x99", [0x07f7] = "\xa9\x9a", [0x07f8] = "\xa9\x9b",
|
||||||
|
- [0x07f9] = "\xa9\x9c", [0x07fa] = "\xa9\x9d", [0x07fb] = "\xa9\x9e",
|
||||||
|
- [0x07fc] = "\xa9\x9f", [0x07fd] = "\xa9\xa0", [0x07fe] = "\xa9\xa1",
|
||||||
|
- [0x07ff] = "\xa9\xa2", [0x0800] = "\xa9\xa3", [0x0801] = "\xa9\xf0",
|
||||||
|
- [0x0802] = "\xa9\xf1", [0x0803] = "\xa9\xf2", [0x0804] = "\xa9\xf3",
|
||||||
|
- [0x0805] = "\xa9\xf4", [0x0806] = "\xa9\xf5", [0x0807] = "\xa9\xf6",
|
||||||
|
- [0x0808] = "\xa9\xf7", [0x0809] = "\xa9\xf8", [0x080a] = "\xa9\xf9",
|
||||||
|
- [0x080b] = "\xa9\xfa", [0x080c] = "\xa9\xfb", [0x080d] = "\xa9\xfc",
|
||||||
|
- [0x080e] = "\xa9\xfd", [0x080f] = "\xa9\xfe", [0x0810] = "\xd7\xfa",
|
||||||
|
- [0x0811] = "\xd7\xfb", [0x0812] = "\xd7\xfc", [0x0813] = "\xd7\xfd",
|
||||||
|
- [0x0814] = "\xd7\xfe", [0x0815] = "\x65\xac", [0x0819] = "\x65\xad",
|
||||||
|
- [0x081a] = "\x65\xae", [0x081b] = "\x65\xaf", [0x081c] = "\x65\xb0",
|
||||||
|
- [0x081d] = "\x65\xb1", [0x081f] = "\x65\xb2", [0x0820] = "\x65\xb3",
|
||||||
|
- [0x0821] = "\x65\xb4", [0x0822] = "\x65\xb5", [0x0823] = "\x65\xb6",
|
||||||
|
- [0x0824] = "\x65\xb7", [0x0825] = "\x65\xb8", [0x0827] = "\x65\xb9",
|
||||||
|
+ [0x078c] = "\xa6\xc0", [0x078d] = "\x7b\x84", [0x078e] = "\x7b\x86",
|
||||||
|
+ [0x078f] = "\x7b\x85", [0x0790] = "\x7b\x87", [0x0791] = "\x7b\x88",
|
||||||
|
+ [0x0792] = "\x7b\x89", [0x0793] = "\x7b\x8a", [0x0794] = "\x7b\x8b",
|
||||||
|
+ [0x0795] = "\x7b\x8c", [0x0796] = "\x7b\x8d", [0x0797] = "\xa6\xf6",
|
||||||
|
+ [0x0798] = "\xa6\xf7", [0x0799] = "\xa6\xf8", [0x079a] = "\xa6\xf9",
|
||||||
|
+ [0x079b] = "\xa6\xfa", [0x079c] = "\xa6\xfb", [0x079d] = "\xa6\xfc",
|
||||||
|
+ [0x079e] = "\xa6\xfd", [0x079f] = "\xa6\xfe", [0x07a0] = "\xa7\xc2",
|
||||||
|
+ [0x07a1] = "\xa7\xc3", [0x07a2] = "\xa7\xc4", [0x07a3] = "\xa7\xc5",
|
||||||
|
+ [0x07a4] = "\xa7\xc6", [0x07a5] = "\xa7\xc7", [0x07a6] = "\xa7\xc8",
|
||||||
|
+ [0x07a7] = "\xa7\xc9", [0x07a8] = "\xa7\xca", [0x07a9] = "\xa7\xcb",
|
||||||
|
+ [0x07aa] = "\xa7\xcc", [0x07ab] = "\xa7\xcd", [0x07ac] = "\xa7\xce",
|
||||||
|
+ [0x07ad] = "\xa7\xcf", [0x07ae] = "\xa7\xd0", [0x07af] = "\xa7\xf2",
|
||||||
|
+ [0x07b0] = "\xa7\xf3", [0x07b1] = "\xa7\xf4", [0x07b2] = "\xa7\xf5",
|
||||||
|
+ [0x07b3] = "\xa7\xf6", [0x07b4] = "\xa7\xf7", [0x07b5] = "\xa7\xf8",
|
||||||
|
+ [0x07b6] = "\xa7\xf9", [0x07b7] = "\xa7\xfa", [0x07b8] = "\xa7\xfb",
|
||||||
|
+ [0x07b9] = "\xa7\xfc", [0x07ba] = "\xa7\xfd", [0x07bb] = "\xa7\xfe",
|
||||||
|
+ [0x07bc] = "\xa8\x96", [0x07bd] = "\xa8\x97", [0x07be] = "\xa8\x98",
|
||||||
|
+ [0x07bf] = "\xa8\x99", [0x07c0] = "\xa8\x9a", [0x07c1] = "\xa8\x9b",
|
||||||
|
+ [0x07c2] = "\xa8\x9c", [0x07c3] = "\xa8\x9d", [0x07c4] = "\xa8\x9e",
|
||||||
|
+ [0x07c5] = "\xa8\x9f", [0x07c6] = "\xa8\xa0", [0x07c7] = "\x00\x01",
|
||||||
|
+ [0x07c8] = "\x65\x9e", [0x07c9] = "\xa8\xc1", [0x07ca] = "\xa8\xc2",
|
||||||
|
+ [0x07cb] = "\xa8\xc3", [0x07cc] = "\xa8\xc4", [0x07cd] = "\xa8\xea",
|
||||||
|
+ [0x07ce] = "\xa8\xeb", [0x07cf] = "\xa8\xec", [0x07d0] = "\xa8\xed",
|
||||||
|
+ [0x07d1] = "\xa8\xee", [0x07d2] = "\xa8\xef", [0x07d3] = "\xa8\xf0",
|
||||||
|
+ [0x07d4] = "\xa8\xf1", [0x07d5] = "\xa8\xf2", [0x07d6] = "\xa8\xf3",
|
||||||
|
+ [0x07d7] = "\xa8\xf4", [0x07d8] = "\xa8\xf5", [0x07d9] = "\xa8\xf6",
|
||||||
|
+ [0x07da] = "\xa8\xf7", [0x07db] = "\xa8\xf8", [0x07dc] = "\xa8\xf9",
|
||||||
|
+ [0x07dd] = "\xa8\xfa", [0x07de] = "\xa8\xfb", [0x07df] = "\xa8\xfc",
|
||||||
|
+ [0x07e0] = "\xa8\xfd", [0x07e1] = "\xa8\xfe", [0x07e2] = "\xa9\x58",
|
||||||
|
+ [0x07e3] = "\xa9\x5b", [0x07e4] = "\xa9\x5d", [0x07e5] = "\xa9\x5e",
|
||||||
|
+ [0x07e6] = "\xa9\x5f", [0x07e7] = "\x65\x9f", [0x07e8] = "\x65\xa0",
|
||||||
|
+ [0x07e9] = "\x65\xa1", [0x07ea] = "\x65\xa2", [0x07eb] = "\x65\xa3",
|
||||||
|
+ [0x07ec] = "\x65\xa4", [0x07ed] = "\x65\xa5", [0x07ee] = "\x65\xa6",
|
||||||
|
+ [0x07ef] = "\x65\xa7", [0x07f0] = "\x65\xa8", [0x07f1] = "\x65\xa9",
|
||||||
|
+ [0x07f2] = "\x65\xaa", [0x07f3] = "\x65\xab", [0x07f4] = "\xa9\x97",
|
||||||
|
+ [0x07f5] = "\xa9\x98", [0x07f6] = "\xa9\x99", [0x07f7] = "\xa9\x9a",
|
||||||
|
+ [0x07f8] = "\xa9\x9b", [0x07f9] = "\xa9\x9c", [0x07fa] = "\xa9\x9d",
|
||||||
|
+ [0x07fb] = "\xa9\x9e", [0x07fc] = "\xa9\x9f", [0x07fd] = "\xa9\xa0",
|
||||||
|
+ [0x07fe] = "\xa9\xa1", [0x07ff] = "\xa9\xa2", [0x0800] = "\xa9\xa3",
|
||||||
|
+ [0x0801] = "\xa9\xf0", [0x0802] = "\xa9\xf1", [0x0803] = "\xa9\xf2",
|
||||||
|
+ [0x0804] = "\xa9\xf3", [0x0805] = "\xa9\xf4", [0x0806] = "\xa9\xf5",
|
||||||
|
+ [0x0807] = "\xa9\xf6", [0x0808] = "\xa9\xf7", [0x0809] = "\xa9\xf8",
|
||||||
|
+ [0x080a] = "\xa9\xf9", [0x080b] = "\xa9\xfa", [0x080c] = "\xa9\xfb",
|
||||||
|
+ [0x080d] = "\xa9\xfc", [0x080e] = "\xa9\xfd", [0x080f] = "\xa9\xfe",
|
||||||
|
+ [0x0810] = "\xd7\xfa", [0x0811] = "\xd7\xfb", [0x0812] = "\xd7\xfc",
|
||||||
|
+ [0x0813] = "\xd7\xfd", [0x0814] = "\xd7\xfe", [0x0815] = "\x65\xac",
|
||||||
|
+ [0x0816] = "\xfe\x51", [0x0817] = "\xfe\x52", [0x0818] = "\xfe\x53",
|
||||||
|
+ [0x0819] = "\x65\xad", [0x081a] = "\x65\xae", [0x081b] = "\x65\xaf",
|
||||||
|
+ [0x081c] = "\x65\xb0", [0x081d] = "\x65\xb1", [0x081e] = "\x2d\x51",
|
||||||
|
+ [0x081f] = "\x65\xb2", [0x0820] = "\x65\xb3", [0x0821] = "\x65\xb4",
|
||||||
|
+ [0x0822] = "\x65\xb5", [0x0823] = "\x65\xb6", [0x0824] = "\x65\xb7",
|
||||||
|
+ [0x0825] = "\x65\xb8", [0x0826] = "\x2d\x52", [0x0827] = "\x65\xb9",
|
||||||
|
[0x0828] = "\x65\xba", [0x0829] = "\x65\xbb", [0x082a] = "\x65\xbc",
|
||||||
|
- [0x082d] = "\x65\xbd", [0x082e] = "\x65\xbe", [0x082f] = "\x65\xbf",
|
||||||
|
- [0x0830] = "\x65\xc0", [0x0833] = "\x65\xc1", [0x0834] = "\x65\xc2",
|
||||||
|
- [0x0835] = "\x65\xc3", [0x0836] = "\x65\xc4", [0x0837] = "\x65\xc5",
|
||||||
|
- [0x0838] = "\x65\xc6", [0x0839] = "\x65\xc7", [0x083a] = "\x65\xc8",
|
||||||
|
- [0x083c] = "\x65\xc9", [0x083d] = "\x65\xca", [0x083e] = "\x65\xcb",
|
||||||
|
- [0x083f] = "\x65\xcc", [0x0840] = "\x65\xcd", [0x0841] = "\x65\xce",
|
||||||
|
- [0x0842] = "\x65\xcf", [0x0844] = "\x65\xd0", [0x0845] = "\x65\xd1",
|
||||||
|
+ [0x082b] = "\x2d\x53", [0x082c] = "\x2d\x54", [0x082d] = "\x65\xbd",
|
||||||
|
+ [0x082e] = "\x65\xbe", [0x082f] = "\x65\xbf", [0x0830] = "\x65\xc0",
|
||||||
|
+ [0x0831] = "\xfe\x6c", [0x0832] = "\x2d\x55", [0x0833] = "\x65\xc1",
|
||||||
|
+ [0x0834] = "\x65\xc2", [0x0835] = "\x65\xc3", [0x0836] = "\x65\xc4",
|
||||||
|
+ [0x0837] = "\x65\xc5", [0x0838] = "\x65\xc6", [0x0839] = "\x65\xc7",
|
||||||
|
+ [0x083a] = "\x65\xc8", [0x083b] = "\xfe\x76", [0x083c] = "\x65\xc9",
|
||||||
|
+ [0x083d] = "\x65\xca", [0x083e] = "\x65\xcb", [0x083f] = "\x65\xcc",
|
||||||
|
+ [0x0840] = "\x65\xcd", [0x0841] = "\x65\xce", [0x0842] = "\x65\xcf",
|
||||||
|
+ [0x0843] = "\x2d\x56", [0x0844] = "\x65\xd0", [0x0845] = "\x65\xd1",
|
||||||
|
[0x0846] = "\x65\xd2", [0x0847] = "\x65\xd3", [0x0848] = "\x65\xd4",
|
||||||
|
[0x0849] = "\x65\xd5", [0x084a] = "\x65\xd6", [0x084b] = "\x65\xd7",
|
||||||
|
[0x084c] = "\x65\xd8", [0x084d] = "\x65\xd9", [0x084e] = "\x65\xda",
|
||||||
|
[0x084f] = "\x65\xdb", [0x0850] = "\x65\xdc", [0x0851] = "\x65\xdd",
|
||||||
|
- [0x0852] = "\x65\xde", [0x0853] = "\x65\xdf", [0x0856] = "\x65\xe0",
|
||||||
|
- [0x0857] = "\x65\xe1", [0x0858] = "\x65\xe2", [0x0859] = "\x65\xe3",
|
||||||
|
- [0x085a] = "\x65\xe4", [0x085b] = "\x65\xe5", [0x085c] = "\x65\xe6",
|
||||||
|
- [0x085d] = "\x65\xe7", [0x085e] = "\x65\xe8", [0x085f] = "\x65\xe9",
|
||||||
|
- [0x0860] = "\x65\xea", [0x0861] = "\x65\xeb", [0x0862] = "\x65\xec",
|
||||||
|
- [0x0863] = "\x65\xed", [0x0865] = "\xfd\x9c", [0x0866] = "\x76\xb5",
|
||||||
|
+ [0x0852] = "\x65\xde", [0x0853] = "\x65\xdf", [0x0854] = "\x2d\x57",
|
||||||
|
+ [0x0855] = "\xfe\x91", [0x0856] = "\x65\xe0", [0x0857] = "\x65\xe1",
|
||||||
|
+ [0x0858] = "\x65\xe2", [0x0859] = "\x65\xe3", [0x085a] = "\x65\xe4",
|
||||||
|
+ [0x085b] = "\x65\xe5", [0x085c] = "\x65\xe6", [0x085d] = "\x65\xe7",
|
||||||
|
+ [0x085e] = "\x65\xe8", [0x085f] = "\x65\xe9", [0x0860] = "\x65\xea",
|
||||||
|
+ [0x0861] = "\x65\xeb", [0x0862] = "\x65\xec", [0x0863] = "\x65\xed",
|
||||||
|
+ [0x0864] = "\x2d\x58", [0x0865] = "\xfd\x9c", [0x0866] = "\x76\xb5",
|
||||||
|
[0x0867] = "\x76\xb6", [0x0868] = "\x76\xb7", [0x0869] = "\x76\xb8",
|
||||||
|
[0x086a] = "\x76\xb9", [0x086b] = "\x76\xba", [0x086c] = "\x76\xbb",
|
||||||
|
[0x086d] = "\x76\xbc", [0x086e] = "\x76\xbd", [0x086f] = "\x76\xbe",
|
||||||
|
@@ -24211,24 +24224,8 @@ static const unsigned char __ucs_to_gb18030_tab2[][2] =
|
||||||
|
|| (ch = __twobyte_to_ucs[idx], \
|
||||||
|
ch == 0 && *inptr != '\0')) \
|
||||||
|
{ \
|
||||||
|
- /* Handle a few special cases. */ \
|
||||||
|
- if (idx == 0x5dd1) \
|
||||||
|
- ch = 0x20087; \
|
||||||
|
- else if (idx == 0x5dd2) \
|
||||||
|
- ch = 0x20089; \
|
||||||
|
- else if (idx == 0x5dd3) \
|
||||||
|
- ch = 0x200cc; \
|
||||||
|
- else if (idx == 0x5dec) \
|
||||||
|
- ch = 0x215D7; \
|
||||||
|
- else if (idx == 0x5df6) \
|
||||||
|
- ch = 0x2298F; \
|
||||||
|
- else if (idx == 0x5e11) \
|
||||||
|
- ch = 0x241FE; \
|
||||||
|
- else \
|
||||||
|
- { \
|
||||||
|
- /* This is an illegal character. */ \
|
||||||
|
- STANDARD_FROM_LOOP_ERR_HANDLER (2); \
|
||||||
|
- } \
|
||||||
|
+ /* This is an illegal character. */ \
|
||||||
|
+ STANDARD_FROM_LOOP_ERR_HANDLER (2); \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
inptr += 2; \
|
||||||
|
@@ -24320,17 +24317,35 @@ static const unsigned char __ucs_to_gb18030_tab2[][2] =
|
||||||
|
len = 4; \
|
||||||
|
} \
|
||||||
|
else if (ch == 0x20087) \
|
||||||
|
- cp = (const unsigned char *) "\xfe\x51"; \
|
||||||
|
+ { \
|
||||||
|
+ idx = 0x3E2CF; \
|
||||||
|
+ len = 4; \
|
||||||
|
+ } \
|
||||||
|
else if (ch == 0x20089) \
|
||||||
|
- cp = (const unsigned char *) "\xfe\x52"; \
|
||||||
|
+ { \
|
||||||
|
+ idx = 0x3E2D1; \
|
||||||
|
+ len = 4; \
|
||||||
|
+ } \
|
||||||
|
else if (ch == 0x200CC) \
|
||||||
|
- cp = (const unsigned char *) "\xfe\x53"; \
|
||||||
|
+ { \
|
||||||
|
+ idx = 0x3E314; \
|
||||||
|
+ len = 4; \
|
||||||
|
+ } \
|
||||||
|
else if (ch == 0x215d7) \
|
||||||
|
- cp = (const unsigned char *) "\xfe\x6c"; \
|
||||||
|
+ { \
|
||||||
|
+ idx = 0x3F81F; \
|
||||||
|
+ len = 4; \
|
||||||
|
+ } \
|
||||||
|
else if (ch == 0x2298F) \
|
||||||
|
- cp = (const unsigned char *) "\xfe\x76"; \
|
||||||
|
+ { \
|
||||||
|
+ idx = 0x40BD7; \
|
||||||
|
+ len = 4; \
|
||||||
|
+ } \
|
||||||
|
else if (ch == 0x241FE) \
|
||||||
|
- cp = (const unsigned char *) "\xfe\x91"; \
|
||||||
|
+ { \
|
||||||
|
+ idx = 0x42446; \
|
||||||
|
+ len = 4; \
|
||||||
|
+ } \
|
||||||
|
else if (ch >= 0x10000 && ch <= 0x10FFFF) \
|
||||||
|
{ \
|
||||||
|
idx = ch + 0x1E248; \
|
||||||
|
diff --git a/iconvdata/tst-table-from.c b/iconvdata/tst-table-from.c
|
||||||
|
index 09aaaf0942..55a7113d8c 100644
|
||||||
|
--- a/iconvdata/tst-table-from.c
|
||||||
|
+++ b/iconvdata/tst-table-from.c
|
||||||
|
@@ -194,10 +194,9 @@ main (int argc, char *argv[])
|
||||||
|
exit (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
- /* When testing UTF-8 or GB18030, stop at 0x10000, otherwise the output
|
||||||
|
+ /* When testing UTF-8, stop at 0x10000, otherwise the output
|
||||||
|
file gets too big. */
|
||||||
|
- bmp_only = (strcmp (charset, "UTF-8") == 0
|
||||||
|
- || strcmp (charset, "GB18030") == 0);
|
||||||
|
+ bmp_only = (strcmp (charset, "UTF-8") == 0);
|
||||||
|
search_depth = (strcmp (charset, "UTF-8") == 0 ? 3 : 4);
|
||||||
|
|
||||||
|
{
|
||||||
|
diff --git a/iconvdata/tst-table-to.c b/iconvdata/tst-table-to.c
|
||||||
|
index 4dec4acad1..2b75f0c6e8 100644
|
||||||
|
--- a/iconvdata/tst-table-to.c
|
||||||
|
+++ b/iconvdata/tst-table-to.c
|
||||||
|
@@ -32,6 +32,7 @@ main (int argc, char *argv[])
|
||||||
|
const char *charset;
|
||||||
|
iconv_t cd;
|
||||||
|
int bmp_only;
|
||||||
|
+ int no_tags;
|
||||||
|
|
||||||
|
if (argc != 2)
|
||||||
|
{
|
||||||
|
@@ -47,16 +48,19 @@ main (int argc, char *argv[])
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
- /* When testing UTF-8 or GB18030, stop at 0x10000, otherwise the output
|
||||||
|
+ /* When testing UTF-8, stop at 0x10000, otherwise the output
|
||||||
|
file gets too big. */
|
||||||
|
- bmp_only = (strcmp (charset, "UTF-8") == 0
|
||||||
|
+ bmp_only = (strcmp (charset, "UTF-8") == 0);
|
||||||
|
+ /* When testing any encoding other than UTF-8 or GB18030, stop at 0xE0000,
|
||||||
|
+ because the conversion drops Unicode tag characters (range
|
||||||
|
+ U+E0000..U+E007F). */
|
||||||
|
+ no_tags = !(strcmp (charset, "UTF-8") == 0
|
||||||
|
|| strcmp (charset, "GB18030") == 0);
|
||||||
|
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
unsigned char buf[10];
|
||||||
|
-
|
||||||
|
- for (i = 0; i < (bmp_only ? 0x10000 : 0x30000); i++)
|
||||||
|
+ for (i = 0; i < (bmp_only ? 0x10000 : no_tags ? 0xE0000 : 0x110000); i++)
|
||||||
|
{
|
||||||
|
unsigned char in[6];
|
||||||
|
unsigned int incount =
|
||||||
|
diff --git a/iconvdata/tst-table.sh b/iconvdata/tst-table.sh
|
||||||
|
index bc6f542b24..7ba15bbf5c 100755
|
||||||
|
--- a/iconvdata/tst-table.sh
|
||||||
|
+++ b/iconvdata/tst-table.sh
|
||||||
|
@@ -37,7 +37,8 @@ set -e
|
||||||
|
< ../localedata/charmaps/${charmap:-$charset} \
|
||||||
|
> ${objpfx}tst-${charset}.charmap.table
|
||||||
|
# When the charset is GB18030, truncate this table because for this encoding,
|
||||||
|
-# the tst-table-from and tst-table-to programs scan the Unicode BMP only.
|
||||||
|
+# the charmap contains ranges (<Unnnn>..<Ummmm> notation), which the
|
||||||
|
+# tst-table-charmap.sh script does not grok.
|
||||||
|
if test ${charset} = GB18030; then
|
||||||
|
grep '0x....$' < ${objpfx}tst-${charset}.charmap.table \
|
||||||
|
> ${objpfx}tst-${charset}.truncated.table
|
||||||
|
@@ -73,25 +74,42 @@ diff ${objpfx}tst-${charset}.charmap.table ${objpfx}tst-${charset}.inverse.table
|
||||||
|
|
||||||
|
# Check 1: charmap and iconv forward should be identical, except for
|
||||||
|
# precomposed characters.
|
||||||
|
-if test -f ${precomposed}; then
|
||||||
|
- cat ${objpfx}tst-${charset}.table ${precomposed} | sort | uniq -u \
|
||||||
|
- > ${objpfx}tst-${charset}.tmp.table
|
||||||
|
- cmp -s ${objpfx}tst-${charset}.charmap.table ${objpfx}tst-${charset}.tmp.table ||
|
||||||
|
+{ if test -f ${precomposed}; then
|
||||||
|
+ cat ${objpfx}tst-${charset}.table ${precomposed} | sort | uniq -u
|
||||||
|
+ else
|
||||||
|
+ cat ${objpfx}tst-${charset}.table
|
||||||
|
+ fi
|
||||||
|
+} | { if test ${charset} = GB18030; then grep '0x....$'; else cat; fi; } \
|
||||||
|
+ > ${objpfx}tst-${charset}.tmp1.table
|
||||||
|
+cmp -s ${objpfx}tst-${charset}.charmap.table ${objpfx}tst-${charset}.tmp1.table ||
|
||||||
|
exit 1
|
||||||
|
-else
|
||||||
|
- cmp -s ${objpfx}tst-${charset}.charmap.table ${objpfx}tst-${charset}.table ||
|
||||||
|
- exit 1
|
||||||
|
-fi
|
||||||
|
|
||||||
|
# Check 2: the difference between the charmap and iconv backward.
|
||||||
|
-if test -f ${irreversible}; then
|
||||||
|
- cat ${objpfx}tst-${charset}.charmap.table ${irreversible} | sort | uniq -u \
|
||||||
|
- > ${objpfx}tst-${charset}.tmp.table
|
||||||
|
- cmp -s ${objpfx}tst-${charset}.tmp.table ${objpfx}tst-${charset}.inverse.table ||
|
||||||
|
- exit 1
|
||||||
|
-else
|
||||||
|
- cmp -s ${objpfx}tst-${charset}.charmap.table ${objpfx}tst-${charset}.inverse.table ||
|
||||||
|
+{ if test -f ${irreversible}; then
|
||||||
|
+ cat ${objpfx}tst-${charset}.charmap.table ${irreversible} | sort | uniq -u
|
||||||
|
+ else
|
||||||
|
+ cat ${objpfx}tst-${charset}.charmap.table
|
||||||
|
+ fi
|
||||||
|
+} | { if test ${charset} = GB18030; then grep '0x....$'; else cat; fi; } \
|
||||||
|
+ > ${objpfx}tst-${charset}.tmp2c.table
|
||||||
|
+cat ${objpfx}tst-${charset}.inverse.table \
|
||||||
|
+ | { if test ${charset} = GB18030; then grep '0x....$'; else cat; fi; } \
|
||||||
|
+ > ${objpfx}tst-${charset}.tmp2i.table
|
||||||
|
+cmp -s ${objpfx}tst-${charset}.tmp2c.table ${objpfx}tst-${charset}.tmp2i.table ||
|
||||||
|
exit 1
|
||||||
|
+
|
||||||
|
+# Check 3: the difference between iconv forward and iconv backward. This is
|
||||||
|
+# necessary only for GB18030, because ${objpfx}tst-${charset}.charmap.table
|
||||||
|
+# is truncated for this encoding (see above).
|
||||||
|
+if test ${charset} = GB18030; then
|
||||||
|
+ { if test -f ${irreversible}; then
|
||||||
|
+ cat ${objpfx}tst-${charset}.table ${irreversible} | sort | uniq -u
|
||||||
|
+ else
|
||||||
|
+ cat ${objpfx}tst-${charset}.table
|
||||||
|
+ fi
|
||||||
|
+ } > ${objpfx}tst-${charset}.tmp3.table
|
||||||
|
+ cmp -s ${objpfx}tst-${charset}.tmp3.table ${objpfx}tst-${charset}.inverse.table ||
|
||||||
|
+ exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
exit 0
|
||||||
|
diff --git a/localedata/charmaps/GB18030 b/localedata/charmaps/GB18030
|
||||||
|
index ad6728c5bd..fc3b1d2d40 100644
|
||||||
|
--- a/localedata/charmaps/GB18030
|
||||||
|
+++ b/localedata/charmaps/GB18030
|
||||||
|
@@ -57234,32 +57234,16 @@ CHARMAP
|
||||||
|
<UE78A> /xa6/xbe <Private Use>
|
||||||
|
<UE78B> /xa6/xbf <Private Use>
|
||||||
|
<UE78C> /xa6/xc0 <Private Use>
|
||||||
|
-% The newest GB 18030-2005 standard still uses some private use area
|
||||||
|
-% code points. Any implementation which has Unicode 4.1 or newer
|
||||||
|
-% support should not use these PUA code points, and instead should
|
||||||
|
-% map these entries to their equivalent non-PUA code points. There
|
||||||
|
-% are 24 idiograms in GB 18030-2005 which have non-PUA equivalents.
|
||||||
|
-% In glibc we only support roundtrip code points, and so must choose
|
||||||
|
-% between supporting the old PUA code points, or using the newer
|
||||||
|
-% non-PUA code points. We choose to use the non-PUA code points to
|
||||||
|
-% be compatible with ICU's similar choice. In choosing the non-PUA
|
||||||
|
-% code points we can no longer convert the old PUA code points back
|
||||||
|
-% to GB-18030-2005 (technically only fixable if we added support
|
||||||
|
-% for non-roundtrip code points e.g. ICU's "fallback mapping").
|
||||||
|
-% The recommendation to use the non-PUA code points, where available,
|
||||||
|
-% is based on "CJKV Information Processing" 2nd Ed. by Dr. Ken Lunde.
|
||||||
|
-%
|
||||||
|
-% These 10 PUA mappings use equivalents from <UFE10> to <UFE19>.
|
||||||
|
-% <UE78D> /xa6/xd9 <Private Use>
|
||||||
|
-% <UE78E> /xa6/xda <Private Use>
|
||||||
|
-% <UE78F> /xa6/xdb <Private Use>
|
||||||
|
-% <UE790> /xa6/xdc <Private Use>
|
||||||
|
-% <UE791> /xa6/xdd <Private Use>
|
||||||
|
-% <UE792> /xa6/xde <Private Use>
|
||||||
|
-% <UE793> /xa6/xdf <Private Use>
|
||||||
|
-% <UE794> /xa6/xec <Private Use>
|
||||||
|
-% <UE795> /xa6/xed <Private Use>
|
||||||
|
-% <UE796> /xa6/xf3 <Private Use>
|
||||||
|
+<UE78D> /x84/x31/x82/x36 <Private Use>
|
||||||
|
+<UE78E> /x84/x31/x82/x38 <Private Use>
|
||||||
|
+<UE78F> /x84/x31/x82/x37 <Private Use>
|
||||||
|
+<UE790> /x84/x31/x82/x39 <Private Use>
|
||||||
|
+<UE791> /x84/x31/x83/x30 <Private Use>
|
||||||
|
+<UE792> /x84/x31/x83/x31 <Private Use>
|
||||||
|
+<UE793> /x84/x31/x83/x32 <Private Use>
|
||||||
|
+<UE794> /x84/x31/x83/x33 <Private Use>
|
||||||
|
+<UE795> /x84/x31/x83/x34 <Private Use>
|
||||||
|
+<UE796> /x84/x31/x83/x35 <Private Use>
|
||||||
|
<UE797> /xa6/xf6 <Private Use>
|
||||||
|
<UE798> /xa6/xf7 <Private Use>
|
||||||
|
<UE799> /xa6/xf8 <Private Use>
|
||||||
|
@@ -57387,17 +57371,15 @@ CHARMAP
|
||||||
|
<UE813> /xd7/xfd <Private Use>
|
||||||
|
<UE814> /xd7/xfe <Private Use>
|
||||||
|
<UE815> /x83/x36/xc9/x34 <Private Use>
|
||||||
|
-% These 3 PUA mappings use equivalents <U20087>, <U20089> and <U200CC>.
|
||||||
|
-% <UE816> /xfe/x51 <Private Use>
|
||||||
|
-% <UE817> /xfe/x52 <Private Use>
|
||||||
|
-% <UE818> /xfe/x53 <Private Use>
|
||||||
|
+<UE816> /xfe/x51 <Private Use>
|
||||||
|
+<UE817> /xfe/x52 <Private Use>
|
||||||
|
+<UE818> /xfe/x53 <Private Use>
|
||||||
|
<UE819> /x83/x36/xc9/x35 <Private Use>
|
||||||
|
<UE81A> /x83/x36/xc9/x36 <Private Use>
|
||||||
|
<UE81B> /x83/x36/xc9/x37 <Private Use>
|
||||||
|
<UE81C> /x83/x36/xc9/x38 <Private Use>
|
||||||
|
<UE81D> /x83/x36/xc9/x39 <Private Use>
|
||||||
|
-% This 1 PUA mapping uses the equivalent <U9FB4>.
|
||||||
|
-% <UE81E> /xfe/x59 <Private Use>
|
||||||
|
+<UE81E> /x82/x35/x90/x37 <Private Use>
|
||||||
|
<UE81F> /x83/x36/xca/x30 <Private Use>
|
||||||
|
<UE820> /x83/x36/xca/x31 <Private Use>
|
||||||
|
<UE821> /x83/x36/xca/x32 <Private Use>
|
||||||
|
@@ -57405,22 +57387,19 @@ CHARMAP
|
||||||
|
<UE823> /x83/x36/xca/x34 <Private Use>
|
||||||
|
<UE824> /x83/x36/xca/x35 <Private Use>
|
||||||
|
<UE825> /x83/x36/xca/x36 <Private Use>
|
||||||
|
-% This 1 PUA mapping uses the equivalent <U9FB5>.
|
||||||
|
-% <UE826> /xfe/x61 <Private Use>
|
||||||
|
+<UE826> /x82/x35/x90/x38 <Private Use>
|
||||||
|
<UE827> /x83/x36/xca/x37 <Private Use>
|
||||||
|
<UE828> /x83/x36/xca/x38 <Private Use>
|
||||||
|
<UE829> /x83/x36/xca/x39 <Private Use>
|
||||||
|
<UE82A> /x83/x36/xcb/x30 <Private Use>
|
||||||
|
-% These 2 PUA mappings use the equivalents <U9FB6> and <U9FB7>.
|
||||||
|
-% <UE82B> /xfe/x66 <Private Use>
|
||||||
|
-% <UE82C> /xfe/x67 <Private Use>
|
||||||
|
+<UE82B> /x82/x35/x90/x39 <Private Use>
|
||||||
|
+<UE82C> /x82/x35/x91/x30 <Private Use>
|
||||||
|
<UE82D> /x83/x36/xcb/x31 <Private Use>
|
||||||
|
<UE82E> /x83/x36/xcb/x32 <Private Use>
|
||||||
|
<UE82F> /x83/x36/xcb/x33 <Private Use>
|
||||||
|
<UE830> /x83/x36/xcb/x34 <Private Use>
|
||||||
|
-% These 2 PUA mappings use the equivalents <U215D7> and <U9FB8>.
|
||||||
|
-% <UE831> /xfe/x6c <Private Use>
|
||||||
|
-% <UE832> /xfe/x6d <Private Use>
|
||||||
|
+<UE831> /xfe/x6c <Private Use>
|
||||||
|
+<UE832> /x82/x35/x91/x31 <Private Use>
|
||||||
|
<UE833> /x83/x36/xcb/x35 <Private Use>
|
||||||
|
<UE834> /x83/x36/xcb/x36 <Private Use>
|
||||||
|
<UE835> /x83/x36/xcb/x37 <Private Use>
|
||||||
|
@@ -57429,8 +57408,7 @@ CHARMAP
|
||||||
|
<UE838> /x83/x36/xcc/x30 <Private Use>
|
||||||
|
<UE839> /x83/x36/xcc/x31 <Private Use>
|
||||||
|
<UE83A> /x83/x36/xcc/x32 <Private Use>
|
||||||
|
-% This 1 PUA mapping uses the equivalent <U2298F>.
|
||||||
|
-% <UE83B> /xfe/x76 <Private Use>
|
||||||
|
+<UE83B> /xfe/x76 <Private Use>
|
||||||
|
<UE83C> /x83/x36/xcc/x33 <Private Use>
|
||||||
|
<UE83D> /x83/x36/xcc/x34 <Private Use>
|
||||||
|
<UE83E> /x83/x36/xcc/x35 <Private Use>
|
||||||
|
@@ -57438,8 +57416,7 @@ CHARMAP
|
||||||
|
<UE840> /x83/x36/xcc/x37 <Private Use>
|
||||||
|
<UE841> /x83/x36/xcc/x38 <Private Use>
|
||||||
|
<UE842> /x83/x36/xcc/x39 <Private Use>
|
||||||
|
-% This 1 PUA mapping uses the equivalent <U9FB9>.
|
||||||
|
-% <UE843> /xfe/x7e <Private Use>
|
||||||
|
+<UE843> /x82/x35/x91/x32 <Private Use>
|
||||||
|
<UE844> /x83/x36/xcd/x30 <Private Use>
|
||||||
|
<UE845> /x83/x36/xcd/x31 <Private Use>
|
||||||
|
<UE846> /x83/x36/xcd/x32 <Private Use>
|
||||||
|
@@ -57456,9 +57433,8 @@ CHARMAP
|
||||||
|
<UE851> /x83/x36/xce/x33 <Private Use>
|
||||||
|
<UE852> /x83/x36/xce/x34 <Private Use>
|
||||||
|
<UE853> /x83/x36/xce/x35 <Private Use>
|
||||||
|
-% These 2 PUA mappings use the equivalents <U9FBA> and <U241FE>.
|
||||||
|
-% <UE854> /xfe/x90 <Private Use>
|
||||||
|
-% <UE855> /xfe/x91 <Private Use>
|
||||||
|
+<UE854> /x82/x35/x91/x33 <Private Use>
|
||||||
|
+<UE855> /xfe/x91 <Private Use>
|
||||||
|
<UE856> /x83/x36/xce/x36 <Private Use>
|
||||||
|
<UE857> /x83/x36/xce/x37 <Private Use>
|
||||||
|
<UE858> /x83/x36/xce/x38 <Private Use>
|
||||||
|
@@ -57473,8 +57449,7 @@ CHARMAP
|
||||||
|
<UE861> /x83/x36/xcf/x37 <Private Use>
|
||||||
|
<UE862> /x83/x36/xcf/x38 <Private Use>
|
||||||
|
<UE863> /x83/x36/xcf/x39 <Private Use>
|
||||||
|
-% This 1 PUA mapping uses the equivalent <U9FBB>.
|
||||||
|
-% <UE864> /xfe/xa0 <Private Use>
|
||||||
|
+<UE864> /x82/x35/x91/x34 <Private Use>
|
||||||
|
<UE865> /x83/x36/xd0/x30 <Private Use>
|
||||||
|
<UE866> /x83/x36/xd0/x31 <Private Use>
|
||||||
|
<UE867> /x83/x36/xd0/x32 <Private Use>
|
||||||
|
@@ -70447,19 +70422,14 @@ CHARMAP
|
||||||
|
<U00020068>..<U00020071> /x95/x32/x8d/x30 <CJK>
|
||||||
|
<U00020072>..<U0002007B> /x95/x32/x8e/x30 <CJK>
|
||||||
|
<U0002007C>..<U00020085> /x95/x32/x8f/x30 <CJK>
|
||||||
|
-<U00020086> /x95/x32/x90/x30 <CJK>
|
||||||
|
-<U00020087> /xfe/x51 <CJK>
|
||||||
|
-<U00020088> /x95/x32/x90/x32 <CJK>
|
||||||
|
-<U00020089> /xfe/x52 <CJK>
|
||||||
|
-<U0002008A>..<U0002008F> /x95/x32/x90/x34 <CJK>
|
||||||
|
+<U00020086>..<U0002008F> /x95/x32/x90/x30 <CJK>
|
||||||
|
<U00020090>..<U00020099> /x95/x32/x91/x30 <CJK>
|
||||||
|
<U0002009A>..<U000200A3> /x95/x32/x92/x30 <CJK>
|
||||||
|
<U000200A4>..<U000200AD> /x95/x32/x93/x30 <CJK>
|
||||||
|
<U000200AE>..<U000200B7> /x95/x32/x94/x30 <CJK>
|
||||||
|
<U000200B8>..<U000200C1> /x95/x32/x95/x30 <CJK>
|
||||||
|
<U000200C2>..<U000200CB> /x95/x32/x96/x30 <CJK>
|
||||||
|
-<U000200CC> /xfe/x53 <CJK>
|
||||||
|
-<U000200CD>..<U000200D5> /x95/x32/x97/x31 <CJK>
|
||||||
|
+<U000200CC>..<U000200D5> /x95/x32/x97/x30 <CJK>
|
||||||
|
<U000200D6>..<U000200DF> /x95/x32/x98/x30 <CJK>
|
||||||
|
<U000200E0>..<U000200E9> /x95/x32/x99/x30 <CJK>
|
||||||
|
<U000200EA>..<U000200F3> /x95/x32/x9a/x30 <CJK>
|
||||||
|
@@ -70998,8 +70968,7 @@ CHARMAP
|
||||||
|
<U000215BC>..<U000215C5> /x95/x36/xb7/x30 <CJK>
|
||||||
|
<U000215C6>..<U000215CF> /x95/x36/xb8/x30 <CJK>
|
||||||
|
<U000215D0>..<U000215D6> /x95/x36/xb9/x30 <CJK>
|
||||||
|
-<U000215D7> /xfe/x6c <CJK>
|
||||||
|
-<U000215D8>..<U000215D9> /x95/x36/xb9/x38 <CJK>
|
||||||
|
+<U000215D7>..<U000215D9> /x95/x36/xb9/x37 <CJK>
|
||||||
|
<U000215DA>..<U000215E3> /x95/x36/xba/x30 <CJK>
|
||||||
|
<U000215E4>..<U000215ED> /x95/x36/xbb/x30 <CJK>
|
||||||
|
<U000215EE>..<U000215F7> /x95/x36/xbc/x30 <CJK>
|
||||||
|
@@ -71505,8 +71474,7 @@ CHARMAP
|
||||||
|
<U00022976>..<U0002297F> /x96/x30/xb8/x30 <CJK>
|
||||||
|
<U00022980>..<U00022989> /x96/x30/xb9/x30 <CJK>
|
||||||
|
<U0002298A>..<U0002298E> /x96/x30/xba/x30 <CJK>
|
||||||
|
-<U0002298F> /xfe/x76 <CJK>
|
||||||
|
-<U00022990>..<U00022993> /x96/x30/xba/x36 <CJK>
|
||||||
|
+<U0002298F>..<U00022993> /x96/x30/xba/x35 <CJK>
|
||||||
|
<U00022994>..<U0002299D> /x96/x30/xbb/x30 <CJK>
|
||||||
|
<U0002299E>..<U000229A7> /x96/x30/xbc/x30 <CJK>
|
||||||
|
<U000229A8>..<U000229B1> /x96/x30/xbd/x30 <CJK>
|
||||||
|
@@ -72132,8 +72100,7 @@ CHARMAP
|
||||||
|
<U000241E0>..<U000241E9> /x96/x35/xb3/x30 <CJK>
|
||||||
|
<U000241EA>..<U000241F3> /x96/x35/xb4/x30 <CJK>
|
||||||
|
<U000241F4>..<U000241FD> /x96/x35/xb5/x30 <CJK>
|
||||||
|
-<U000241FE> /xfe/x91 <CJK>
|
||||||
|
-<U000241FF>..<U00024207> /x96/x35/xb6/x31 <CJK>
|
||||||
|
+<U000241FE>..<U00024207> /x96/x35/xb6/x30 <CJK>
|
||||||
|
<U00024208>..<U00024211> /x96/x35/xb7/x30 <CJK>
|
||||||
|
<U00024212>..<U0002421B> /x96/x35/xb8/x30 <CJK>
|
||||||
|
<U0002421C>..<U00024225> /x96/x35/xb9/x30 <CJK>
|
||||||
|
--
|
||||||
|
2.42.0
|
||||||
|
|
36
getaddrinfo-eai-memory.patch
Normal file
36
getaddrinfo-eai-memory.patch
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
From ae1e5217021e43e1f2de443d26e87ea3adfb221c Mon Sep 17 00:00:00 2001
|
||||||
|
From: Andreas Schwab <schwab@suse.de>
|
||||||
|
Date: Wed, 6 Dec 2023 14:48:22 +0100
|
||||||
|
Subject: [PATCH] getaddrinfo: translate ENOMEM to EAI_MEMORY (bug 31163)
|
||||||
|
|
||||||
|
When __resolv_context_get returns NULL due to out of memory, translate it
|
||||||
|
to a return value of EAI_MEMORY.
|
||||||
|
|
||||||
|
(cherry picked from commit 5eabdb6a6ac1599d23dd5966a37417215950245f)
|
||||||
|
---
|
||||||
|
sysdeps/posix/getaddrinfo.c | 9 ++++++++-
|
||||||
|
1 file changed, 8 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c
|
||||||
|
index 13082305d3..da573bea24 100644
|
||||||
|
--- a/sysdeps/posix/getaddrinfo.c
|
||||||
|
+++ b/sysdeps/posix/getaddrinfo.c
|
||||||
|
@@ -616,7 +616,14 @@ get_nss_addresses (const char *name, const struct addrinfo *req,
|
||||||
|
function variant. */
|
||||||
|
res_ctx = __resolv_context_get ();
|
||||||
|
if (res_ctx == NULL)
|
||||||
|
- no_more = 1;
|
||||||
|
+ {
|
||||||
|
+ if (errno == ENOMEM)
|
||||||
|
+ {
|
||||||
|
+ result = -EAI_MEMORY;
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+ no_more = 1;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
while (!no_more)
|
||||||
|
{
|
||||||
|
--
|
||||||
|
2.43.0
|
||||||
|
|
92
getaddrinfo-memory-leak.patch
Normal file
92
getaddrinfo-memory-leak.patch
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
From ec6b95c3303c700eb89eebeda2d7264cc184a796 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Romain Geissler <romain.geissler@amadeus.com>
|
||||||
|
Date: Mon, 25 Sep 2023 01:21:51 +0100
|
||||||
|
Subject: [PATCH] Fix leak in getaddrinfo introduced by the fix for
|
||||||
|
CVE-2023-4806 [BZ #30843]
|
||||||
|
|
||||||
|
This patch fixes a very recently added leak in getaddrinfo.
|
||||||
|
|
||||||
|
Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
|
||||||
|
---
|
||||||
|
nss/Makefile | 20 ++++++++++++++++++++
|
||||||
|
nss/tst-nss-gai-hv2-canonname.c | 3 +++
|
||||||
|
sysdeps/posix/getaddrinfo.c | 4 +---
|
||||||
|
3 files changed, 24 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/nss/Makefile b/nss/Makefile
|
||||||
|
index 8a5126ecf3..668ba34b18 100644
|
||||||
|
--- a/nss/Makefile
|
||||||
|
+++ b/nss/Makefile
|
||||||
|
@@ -149,6 +149,15 @@ endif
|
||||||
|
extra-test-objs += nss_test1.os nss_test2.os nss_test_errno.os \
|
||||||
|
nss_test_gai_hv2_canonname.os
|
||||||
|
|
||||||
|
+ifeq ($(run-built-tests),yes)
|
||||||
|
+ifneq (no,$(PERL))
|
||||||
|
+tests-special += $(objpfx)mtrace-tst-nss-gai-hv2-canonname.out
|
||||||
|
+endif
|
||||||
|
+endif
|
||||||
|
+
|
||||||
|
+generated += mtrace-tst-nss-gai-hv2-canonname.out \
|
||||||
|
+ tst-nss-gai-hv2-canonname.mtrace
|
||||||
|
+
|
||||||
|
include ../Rules
|
||||||
|
|
||||||
|
ifeq (yes,$(have-selinux))
|
||||||
|
@@ -217,6 +226,17 @@ endif
|
||||||
|
$(objpfx)tst-nss-files-alias-leak.out: $(objpfx)/libnss_files.so
|
||||||
|
$(objpfx)tst-nss-files-alias-truncated.out: $(objpfx)/libnss_files.so
|
||||||
|
|
||||||
|
+tst-nss-gai-hv2-canonname-ENV = \
|
||||||
|
+ MALLOC_TRACE=$(objpfx)tst-nss-gai-hv2-canonname.mtrace \
|
||||||
|
+ LD_PRELOAD=$(common-objpfx)/malloc/libc_malloc_debug.so
|
||||||
|
+$(objpfx)mtrace-tst-nss-gai-hv2-canonname.out: \
|
||||||
|
+ $(objpfx)tst-nss-gai-hv2-canonname.out
|
||||||
|
+ { test -r $(objpfx)tst-nss-gai-hv2-canonname.mtrace \
|
||||||
|
+ || ( echo "tst-nss-gai-hv2-canonname.mtrace does not exist"; exit 77; ) \
|
||||||
|
+ && $(common-objpfx)malloc/mtrace \
|
||||||
|
+ $(objpfx)tst-nss-gai-hv2-canonname.mtrace; } > $@; \
|
||||||
|
+ $(evaluate-test)
|
||||||
|
+
|
||||||
|
# Disable DT_RUNPATH on NSS tests so that the glibc internal NSS
|
||||||
|
# functions can load testing NSS modules via DT_RPATH.
|
||||||
|
LDFLAGS-tst-nss-test1 = -Wl,--disable-new-dtags
|
||||||
|
diff --git a/nss/tst-nss-gai-hv2-canonname.c b/nss/tst-nss-gai-hv2-canonname.c
|
||||||
|
index d5f10c07d6..7db53cf09d 100644
|
||||||
|
--- a/nss/tst-nss-gai-hv2-canonname.c
|
||||||
|
+++ b/nss/tst-nss-gai-hv2-canonname.c
|
||||||
|
@@ -21,6 +21,7 @@
|
||||||
|
#include <netdb.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
+#include <mcheck.h>
|
||||||
|
#include <support/check.h>
|
||||||
|
#include <support/xstdio.h>
|
||||||
|
#include "nss/tst-nss-gai-hv2-canonname.h"
|
||||||
|
@@ -41,6 +42,8 @@ static void do_prepare (int a, char **av)
|
||||||
|
static int
|
||||||
|
do_test (void)
|
||||||
|
{
|
||||||
|
+ mtrace ();
|
||||||
|
+
|
||||||
|
__nss_configure_lookup ("hosts", "test_gai_hv2_canonname");
|
||||||
|
|
||||||
|
struct addrinfo hints = {};
|
||||||
|
diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c
|
||||||
|
index 47f421fddf..531124958d 100644
|
||||||
|
--- a/sysdeps/posix/getaddrinfo.c
|
||||||
|
+++ b/sysdeps/posix/getaddrinfo.c
|
||||||
|
@@ -1196,9 +1196,7 @@ free_and_return:
|
||||||
|
if (malloc_name)
|
||||||
|
free ((char *) name);
|
||||||
|
free (addrmem);
|
||||||
|
- if (res.free_at)
|
||||||
|
- free (res.at);
|
||||||
|
- free (res.canon);
|
||||||
|
+ gaih_result_reset (&res);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.42.0
|
||||||
|
|
338
getcanonname-use-after-free.patch
Normal file
338
getcanonname-use-after-free.patch
Normal file
@ -0,0 +1,338 @@
|
|||||||
|
From 00ae4f10b504bc4564e9f22f00907093f1ab9338 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Siddhesh Poyarekar <siddhesh@sourceware.org>
|
||||||
|
Date: Fri, 15 Sep 2023 13:51:12 -0400
|
||||||
|
Subject: [PATCH] getaddrinfo: Fix use after free in getcanonname
|
||||||
|
(CVE-2023-4806)
|
||||||
|
|
||||||
|
When an NSS plugin only implements the _gethostbyname2_r and
|
||||||
|
_getcanonname_r callbacks, getaddrinfo could use memory that was freed
|
||||||
|
during tmpbuf resizing, through h_name in a previous query response.
|
||||||
|
|
||||||
|
The backing store for res->at->name when doing a query with
|
||||||
|
gethostbyname3_r or gethostbyname2_r is tmpbuf, which is reallocated in
|
||||||
|
gethosts during the query. For AF_INET6 lookup with AI_ALL |
|
||||||
|
AI_V4MAPPED, gethosts gets called twice, once for a v6 lookup and second
|
||||||
|
for a v4 lookup. In this case, if the first call reallocates tmpbuf
|
||||||
|
enough number of times, resulting in a malloc, th->h_name (that
|
||||||
|
res->at->name refers to) ends up on a heap allocated storage in tmpbuf.
|
||||||
|
Now if the second call to gethosts also causes the plugin callback to
|
||||||
|
return NSS_STATUS_TRYAGAIN, tmpbuf will get freed, resulting in a UAF
|
||||||
|
reference in res->at->name. This then gets dereferenced in the
|
||||||
|
getcanonname_r plugin call, resulting in the use after free.
|
||||||
|
|
||||||
|
Fix this by copying h_name over and freeing it at the end. This
|
||||||
|
resolves BZ #30843, which is assigned CVE-2023-4806.
|
||||||
|
|
||||||
|
Signed-off-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
|
||||||
|
(cherry picked from commit 973fe93a5675c42798b2161c6f29c01b0e243994)
|
||||||
|
---
|
||||||
|
nss/Makefile | 15 ++++-
|
||||||
|
nss/nss_test_gai_hv2_canonname.c | 56 +++++++++++++++++
|
||||||
|
nss/tst-nss-gai-hv2-canonname.c | 63 +++++++++++++++++++
|
||||||
|
nss/tst-nss-gai-hv2-canonname.h | 1 +
|
||||||
|
.../postclean.req | 0
|
||||||
|
.../tst-nss-gai-hv2-canonname.script | 2 +
|
||||||
|
sysdeps/posix/getaddrinfo.c | 25 +++++---
|
||||||
|
7 files changed, 152 insertions(+), 10 deletions(-)
|
||||||
|
create mode 100644 nss/nss_test_gai_hv2_canonname.c
|
||||||
|
create mode 100644 nss/tst-nss-gai-hv2-canonname.c
|
||||||
|
create mode 100644 nss/tst-nss-gai-hv2-canonname.h
|
||||||
|
create mode 100644 nss/tst-nss-gai-hv2-canonname.root/postclean.req
|
||||||
|
create mode 100644 nss/tst-nss-gai-hv2-canonname.root/tst-nss-gai-hv2-canonname.script
|
||||||
|
|
||||||
|
diff --git a/nss/Makefile b/nss/Makefile
|
||||||
|
index 06fcdc450f..8a5126ecf3 100644
|
||||||
|
--- a/nss/Makefile
|
||||||
|
+++ b/nss/Makefile
|
||||||
|
@@ -82,6 +82,7 @@ tests-container := \
|
||||||
|
tst-nss-test3 \
|
||||||
|
tst-reload1 \
|
||||||
|
tst-reload2 \
|
||||||
|
+ tst-nss-gai-hv2-canonname \
|
||||||
|
# tests-container
|
||||||
|
|
||||||
|
# Tests which need libdl
|
||||||
|
@@ -145,7 +146,8 @@ libnss_compat-inhibit-o = $(filter-out .os,$(object-suffixes))
|
||||||
|
ifeq ($(build-static-nss),yes)
|
||||||
|
tests-static += tst-nss-static
|
||||||
|
endif
|
||||||
|
-extra-test-objs += nss_test1.os nss_test2.os nss_test_errno.os
|
||||||
|
+extra-test-objs += nss_test1.os nss_test2.os nss_test_errno.os \
|
||||||
|
+ nss_test_gai_hv2_canonname.os
|
||||||
|
|
||||||
|
include ../Rules
|
||||||
|
|
||||||
|
@@ -180,12 +182,16 @@ rtld-tests-LDFLAGS += -Wl,--dynamic-list=nss_test.ver
|
||||||
|
libof-nss_test1 = extramodules
|
||||||
|
libof-nss_test2 = extramodules
|
||||||
|
libof-nss_test_errno = extramodules
|
||||||
|
+libof-nss_test_gai_hv2_canonname = extramodules
|
||||||
|
$(objpfx)/libnss_test1.so: $(objpfx)nss_test1.os $(link-libc-deps)
|
||||||
|
$(build-module)
|
||||||
|
$(objpfx)/libnss_test2.so: $(objpfx)nss_test2.os $(link-libc-deps)
|
||||||
|
$(build-module)
|
||||||
|
$(objpfx)/libnss_test_errno.so: $(objpfx)nss_test_errno.os $(link-libc-deps)
|
||||||
|
$(build-module)
|
||||||
|
+$(objpfx)/libnss_test_gai_hv2_canonname.so: \
|
||||||
|
+ $(objpfx)nss_test_gai_hv2_canonname.os $(link-libc-deps)
|
||||||
|
+ $(build-module)
|
||||||
|
$(objpfx)nss_test2.os : nss_test1.c
|
||||||
|
# Use the nss_files suffix for these objects as well.
|
||||||
|
$(objpfx)/libnss_test1.so$(libnss_files.so-version): $(objpfx)/libnss_test1.so
|
||||||
|
@@ -195,10 +201,14 @@ $(objpfx)/libnss_test2.so$(libnss_files.so-version): $(objpfx)/libnss_test2.so
|
||||||
|
$(objpfx)/libnss_test_errno.so$(libnss_files.so-version): \
|
||||||
|
$(objpfx)/libnss_test_errno.so
|
||||||
|
$(make-link)
|
||||||
|
+$(objpfx)/libnss_test_gai_hv2_canonname.so$(libnss_files.so-version): \
|
||||||
|
+ $(objpfx)/libnss_test_gai_hv2_canonname.so
|
||||||
|
+ $(make-link)
|
||||||
|
$(patsubst %,$(objpfx)%.out,$(tests) $(tests-container)) : \
|
||||||
|
$(objpfx)/libnss_test1.so$(libnss_files.so-version) \
|
||||||
|
$(objpfx)/libnss_test2.so$(libnss_files.so-version) \
|
||||||
|
- $(objpfx)/libnss_test_errno.so$(libnss_files.so-version)
|
||||||
|
+ $(objpfx)/libnss_test_errno.so$(libnss_files.so-version) \
|
||||||
|
+ $(objpfx)/libnss_test_gai_hv2_canonname.so$(libnss_files.so-version)
|
||||||
|
|
||||||
|
ifeq (yes,$(have-thread-library))
|
||||||
|
$(objpfx)tst-cancel-getpwuid_r: $(shared-thread-library)
|
||||||
|
@@ -215,3 +225,4 @@ LDFLAGS-tst-nss-test3 = -Wl,--disable-new-dtags
|
||||||
|
LDFLAGS-tst-nss-test4 = -Wl,--disable-new-dtags
|
||||||
|
LDFLAGS-tst-nss-test5 = -Wl,--disable-new-dtags
|
||||||
|
LDFLAGS-tst-nss-test_errno = -Wl,--disable-new-dtags
|
||||||
|
+LDFLAGS-tst-nss-test_gai_hv2_canonname = -Wl,--disable-new-dtags
|
||||||
|
diff --git a/nss/nss_test_gai_hv2_canonname.c b/nss/nss_test_gai_hv2_canonname.c
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000000..4439c83c9f
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/nss/nss_test_gai_hv2_canonname.c
|
||||||
|
@@ -0,0 +1,56 @@
|
||||||
|
+/* NSS service provider that only provides gethostbyname2_r.
|
||||||
|
+ Copyright The GNU Toolchain Authors.
|
||||||
|
+ 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, see
|
||||||
|
+ <https://www.gnu.org/licenses/>. */
|
||||||
|
+
|
||||||
|
+#include <nss.h>
|
||||||
|
+#include <stdlib.h>
|
||||||
|
+#include <string.h>
|
||||||
|
+#include "nss/tst-nss-gai-hv2-canonname.h"
|
||||||
|
+
|
||||||
|
+/* Catch misnamed and functions. */
|
||||||
|
+#pragma GCC diagnostic error "-Wmissing-prototypes"
|
||||||
|
+NSS_DECLARE_MODULE_FUNCTIONS (test_gai_hv2_canonname)
|
||||||
|
+
|
||||||
|
+extern enum nss_status _nss_files_gethostbyname2_r (const char *, int,
|
||||||
|
+ struct hostent *, char *,
|
||||||
|
+ size_t, int *, int *);
|
||||||
|
+
|
||||||
|
+enum nss_status
|
||||||
|
+_nss_test_gai_hv2_canonname_gethostbyname2_r (const char *name, int af,
|
||||||
|
+ struct hostent *result,
|
||||||
|
+ char *buffer, size_t buflen,
|
||||||
|
+ int *errnop, int *herrnop)
|
||||||
|
+{
|
||||||
|
+ return _nss_files_gethostbyname2_r (name, af, result, buffer, buflen, errnop,
|
||||||
|
+ herrnop);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+enum nss_status
|
||||||
|
+_nss_test_gai_hv2_canonname_getcanonname_r (const char *name, char *buffer,
|
||||||
|
+ size_t buflen, char **result,
|
||||||
|
+ int *errnop, int *h_errnop)
|
||||||
|
+{
|
||||||
|
+ /* We expect QUERYNAME, which is a small enough string that it shouldn't fail
|
||||||
|
+ the test. */
|
||||||
|
+ if (memcmp (QUERYNAME, name, sizeof (QUERYNAME))
|
||||||
|
+ || buflen < sizeof (QUERYNAME))
|
||||||
|
+ abort ();
|
||||||
|
+
|
||||||
|
+ strncpy (buffer, name, buflen);
|
||||||
|
+ *result = buffer;
|
||||||
|
+ return NSS_STATUS_SUCCESS;
|
||||||
|
+}
|
||||||
|
diff --git a/nss/tst-nss-gai-hv2-canonname.c b/nss/tst-nss-gai-hv2-canonname.c
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000000..d5f10c07d6
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/nss/tst-nss-gai-hv2-canonname.c
|
||||||
|
@@ -0,0 +1,63 @@
|
||||||
|
+/* Test NSS query path for plugins that only implement gethostbyname2
|
||||||
|
+ (#30843).
|
||||||
|
+ Copyright The GNU Toolchain Authors.
|
||||||
|
+ 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, see
|
||||||
|
+ <https://www.gnu.org/licenses/>. */
|
||||||
|
+
|
||||||
|
+#include <nss.h>
|
||||||
|
+#include <netdb.h>
|
||||||
|
+#include <stdlib.h>
|
||||||
|
+#include <string.h>
|
||||||
|
+#include <support/check.h>
|
||||||
|
+#include <support/xstdio.h>
|
||||||
|
+#include "nss/tst-nss-gai-hv2-canonname.h"
|
||||||
|
+
|
||||||
|
+#define PREPARE do_prepare
|
||||||
|
+
|
||||||
|
+static void do_prepare (int a, char **av)
|
||||||
|
+{
|
||||||
|
+ FILE *hosts = xfopen ("/etc/hosts", "w");
|
||||||
|
+ for (unsigned i = 2; i < 255; i++)
|
||||||
|
+ {
|
||||||
|
+ fprintf (hosts, "ff01::ff02:ff03:%u:2\ttest.example.com\n", i);
|
||||||
|
+ fprintf (hosts, "192.168.0.%u\ttest.example.com\n", i);
|
||||||
|
+ }
|
||||||
|
+ xfclose (hosts);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int
|
||||||
|
+do_test (void)
|
||||||
|
+{
|
||||||
|
+ __nss_configure_lookup ("hosts", "test_gai_hv2_canonname");
|
||||||
|
+
|
||||||
|
+ struct addrinfo hints = {};
|
||||||
|
+ struct addrinfo *result = NULL;
|
||||||
|
+
|
||||||
|
+ hints.ai_family = AF_INET6;
|
||||||
|
+ hints.ai_flags = AI_ALL | AI_V4MAPPED | AI_CANONNAME;
|
||||||
|
+
|
||||||
|
+ int ret = getaddrinfo (QUERYNAME, NULL, &hints, &result);
|
||||||
|
+
|
||||||
|
+ if (ret != 0)
|
||||||
|
+ FAIL_EXIT1 ("getaddrinfo failed: %s\n", gai_strerror (ret));
|
||||||
|
+
|
||||||
|
+ TEST_COMPARE_STRING (result->ai_canonname, QUERYNAME);
|
||||||
|
+
|
||||||
|
+ freeaddrinfo(result);
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+#include <support/test-driver.c>
|
||||||
|
diff --git a/nss/tst-nss-gai-hv2-canonname.h b/nss/tst-nss-gai-hv2-canonname.h
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000000..14f2a9cb08
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/nss/tst-nss-gai-hv2-canonname.h
|
||||||
|
@@ -0,0 +1 @@
|
||||||
|
+#define QUERYNAME "test.example.com"
|
||||||
|
diff --git a/nss/tst-nss-gai-hv2-canonname.root/postclean.req b/nss/tst-nss-gai-hv2-canonname.root/postclean.req
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000000..e69de29bb2
|
||||||
|
diff --git a/nss/tst-nss-gai-hv2-canonname.root/tst-nss-gai-hv2-canonname.script b/nss/tst-nss-gai-hv2-canonname.root/tst-nss-gai-hv2-canonname.script
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000000..31848b4a28
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/nss/tst-nss-gai-hv2-canonname.root/tst-nss-gai-hv2-canonname.script
|
||||||
|
@@ -0,0 +1,2 @@
|
||||||
|
+cp $B/nss/libnss_test_gai_hv2_canonname.so $L/libnss_test_gai_hv2_canonname.so.2
|
||||||
|
+su
|
||||||
|
diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c
|
||||||
|
index 0356b622be..b2236b105c 100644
|
||||||
|
--- a/sysdeps/posix/getaddrinfo.c
|
||||||
|
+++ b/sysdeps/posix/getaddrinfo.c
|
||||||
|
@@ -120,6 +120,7 @@ struct gaih_result
|
||||||
|
{
|
||||||
|
struct gaih_addrtuple *at;
|
||||||
|
char *canon;
|
||||||
|
+ char *h_name;
|
||||||
|
bool free_at;
|
||||||
|
bool got_ipv6;
|
||||||
|
};
|
||||||
|
@@ -165,6 +166,7 @@ gaih_result_reset (struct gaih_result *res)
|
||||||
|
if (res->free_at)
|
||||||
|
free (res->at);
|
||||||
|
free (res->canon);
|
||||||
|
+ free (res->h_name);
|
||||||
|
memset (res, 0, sizeof (*res));
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -203,9 +205,8 @@ gaih_inet_serv (const char *servicename, const struct gaih_typeproto *tp,
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
-/* Convert struct hostent to a list of struct gaih_addrtuple objects. h_name
|
||||||
|
- is not copied, and the struct hostent object must not be deallocated
|
||||||
|
- prematurely. The new addresses are appended to the tuple array in RES. */
|
||||||
|
+/* Convert struct hostent to a list of struct gaih_addrtuple objects. The new
|
||||||
|
+ addresses are appended to the tuple array in RES. */
|
||||||
|
static bool
|
||||||
|
convert_hostent_to_gaih_addrtuple (const struct addrinfo *req, int family,
|
||||||
|
struct hostent *h, struct gaih_result *res)
|
||||||
|
@@ -238,6 +239,15 @@ convert_hostent_to_gaih_addrtuple (const struct addrinfo *req, int family,
|
||||||
|
res->at = array;
|
||||||
|
res->free_at = true;
|
||||||
|
|
||||||
|
+ /* Duplicate h_name because it may get reclaimed when the underlying storage
|
||||||
|
+ is freed. */
|
||||||
|
+ if (res->h_name == NULL)
|
||||||
|
+ {
|
||||||
|
+ res->h_name = __strdup (h->h_name);
|
||||||
|
+ if (res->h_name == NULL)
|
||||||
|
+ return false;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
/* Update the next pointers on reallocation. */
|
||||||
|
for (size_t i = 0; i < old; i++)
|
||||||
|
array[i].next = array + i + 1;
|
||||||
|
@@ -262,7 +272,6 @@ convert_hostent_to_gaih_addrtuple (const struct addrinfo *req, int family,
|
||||||
|
}
|
||||||
|
array[i].next = array + i + 1;
|
||||||
|
}
|
||||||
|
- array[0].name = h->h_name;
|
||||||
|
array[count - 1].next = NULL;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
@@ -324,15 +333,15 @@ gethosts (nss_gethostbyname3_r fct, int family, const char *name,
|
||||||
|
memory allocation failure. The returned string is allocated on the
|
||||||
|
heap; the caller has to free it. */
|
||||||
|
static char *
|
||||||
|
-getcanonname (nss_action_list nip, struct gaih_addrtuple *at, const char *name)
|
||||||
|
+getcanonname (nss_action_list nip, const char *hname, const char *name)
|
||||||
|
{
|
||||||
|
nss_getcanonname_r *cfct = __nss_lookup_function (nip, "getcanonname_r");
|
||||||
|
char *s = (char *) name;
|
||||||
|
if (cfct != NULL)
|
||||||
|
{
|
||||||
|
char buf[256];
|
||||||
|
- if (DL_CALL_FCT (cfct, (at->name ?: name, buf, sizeof (buf),
|
||||||
|
- &s, &errno, &h_errno)) != NSS_STATUS_SUCCESS)
|
||||||
|
+ if (DL_CALL_FCT (cfct, (hname ?: name, buf, sizeof (buf), &s, &errno,
|
||||||
|
+ &h_errno)) != NSS_STATUS_SUCCESS)
|
||||||
|
/* If the canonical name cannot be determined, use the passed
|
||||||
|
string. */
|
||||||
|
s = (char *) name;
|
||||||
|
@@ -771,7 +780,7 @@ get_nss_addresses (const char *name, const struct addrinfo *req,
|
||||||
|
if ((req->ai_flags & AI_CANONNAME) != 0
|
||||||
|
&& res->canon == NULL)
|
||||||
|
{
|
||||||
|
- char *canonbuf = getcanonname (nip, res->at, name);
|
||||||
|
+ char *canonbuf = getcanonname (nip, res->h_name, name);
|
||||||
|
if (canonbuf == NULL)
|
||||||
|
{
|
||||||
|
__resolv_context_put (res_ctx);
|
||||||
|
--
|
||||||
|
2.42.0
|
||||||
|
|
44
glibc-2.3.2.no_archive.diff
Normal file
44
glibc-2.3.2.no_archive.diff
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
Wed Jun 4 14:29:07 CEST 2003 - kukuk@suse.de
|
||||||
|
|
||||||
|
- Make --no-archive default for localedef
|
||||||
|
|
||||||
|
Index: glibc-2.27/locale/programs/localedef.c
|
||||||
|
===================================================================
|
||||||
|
--- glibc-2.27.orig/locale/programs/localedef.c
|
||||||
|
+++ glibc-2.27/locale/programs/localedef.c
|
||||||
|
@@ -71,7 +71,7 @@ const char *alias_file;
|
||||||
|
static struct localedef_t *locales;
|
||||||
|
|
||||||
|
/* If true don't add locale data to archive. */
|
||||||
|
-bool no_archive;
|
||||||
|
+bool no_archive = true;
|
||||||
|
|
||||||
|
/* If true add named locales to archive. */
|
||||||
|
static bool add_to_archive;
|
||||||
|
@@ -101,6 +101,7 @@ void (*argp_program_version_hook) (FILE
|
||||||
|
#define OPT_REPLACE 307
|
||||||
|
#define OPT_DELETE_FROM_ARCHIVE 308
|
||||||
|
#define OPT_LIST_ARCHIVE 309
|
||||||
|
+#define OPT_ARCHIVE 310
|
||||||
|
#define OPT_LITTLE_ENDIAN 400
|
||||||
|
#define OPT_BIG_ENDIAN 401
|
||||||
|
#define OPT_NO_WARN 402
|
||||||
|
@@ -133,6 +134,8 @@ static const struct argp_option options[
|
||||||
|
"supported warnings are: ascii, intcurrsym") },
|
||||||
|
|
||||||
|
{ NULL, 0, NULL, 0, N_("Archive control:") },
|
||||||
|
+ { "archive", OPT_ARCHIVE, NULL, 0,
|
||||||
|
+ N_("Add new data to archive") },
|
||||||
|
{ "no-archive", OPT_NO_ARCHIVE, NULL, 0,
|
||||||
|
N_("Don't add new data to archive") },
|
||||||
|
{ "add-to-archive", OPT_ADD_TO_ARCHIVE, NULL, 0,
|
||||||
|
@@ -360,6 +363,9 @@ parse_opt (int key, char *arg, struct ar
|
||||||
|
case OPT_PREFIX:
|
||||||
|
output_prefix = arg;
|
||||||
|
break;
|
||||||
|
+ case OPT_ARCHIVE:
|
||||||
|
+ no_archive = false;
|
||||||
|
+ break;
|
||||||
|
case OPT_NO_ARCHIVE:
|
||||||
|
no_archive = true;
|
||||||
|
break;
|
21
glibc-2.3.3-nscd-db-path.diff
Normal file
21
glibc-2.3.3-nscd-db-path.diff
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
Index: glibc-2.27/nscd/nscd.h
|
||||||
|
===================================================================
|
||||||
|
--- glibc-2.27.orig/nscd/nscd.h
|
||||||
|
+++ glibc-2.27/nscd/nscd.h
|
||||||
|
@@ -161,11 +161,11 @@ struct database_dyn
|
||||||
|
|
||||||
|
|
||||||
|
/* Paths of the file for the persistent storage. */
|
||||||
|
-#define _PATH_NSCD_PASSWD_DB "/var/db/nscd/passwd"
|
||||||
|
-#define _PATH_NSCD_GROUP_DB "/var/db/nscd/group"
|
||||||
|
-#define _PATH_NSCD_HOSTS_DB "/var/db/nscd/hosts"
|
||||||
|
-#define _PATH_NSCD_SERVICES_DB "/var/db/nscd/services"
|
||||||
|
-#define _PATH_NSCD_NETGROUP_DB "/var/db/nscd/netgroup"
|
||||||
|
+#define _PATH_NSCD_PASSWD_DB "/var/lib/nscd/passwd"
|
||||||
|
+#define _PATH_NSCD_GROUP_DB "/var/lib/nscd/group"
|
||||||
|
+#define _PATH_NSCD_HOSTS_DB "/var/lib/nscd/hosts"
|
||||||
|
+#define _PATH_NSCD_SERVICES_DB "/var/lib/nscd/services"
|
||||||
|
+#define _PATH_NSCD_NETGROUP_DB "/var/lib/nscd/netgroup"
|
||||||
|
|
||||||
|
/* Path used when not using persistent storage. */
|
||||||
|
#define _PATH_NSCD_XYZ_DB_TMP "/var/run/nscd/dbXXXXXX"
|
54
glibc-2.3.90-langpackdir.diff
Normal file
54
glibc-2.3.90-langpackdir.diff
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
Index: glibc-2.38/debug/strcpy_chk.c
|
||||||
|
===================================================================
|
||||||
|
--- glibc-2.38.orig/debug/strcpy_chk.c
|
||||||
|
+++ glibc-2.38/debug/strcpy_chk.c
|
||||||
|
@@ -31,3 +31,4 @@ __strcpy_chk (char *dest, const char *sr
|
||||||
|
|
||||||
|
return memcpy (dest, src, len + 1);
|
||||||
|
}
|
||||||
|
+libc_hidden_builtin_def (__strcpy_chk)
|
||||||
|
Index: glibc-2.38/include/string.h
|
||||||
|
===================================================================
|
||||||
|
--- glibc-2.38.orig/include/string.h
|
||||||
|
+++ glibc-2.38/include/string.h
|
||||||
|
@@ -213,6 +213,7 @@ libc_hidden_builtin_proto (__memcpy_chk)
|
||||||
|
libc_hidden_builtin_proto (__memmove_chk)
|
||||||
|
libc_hidden_builtin_proto (__mempcpy_chk)
|
||||||
|
libc_hidden_builtin_proto (__memset_chk)
|
||||||
|
+libc_hidden_builtin_proto (__strcpy_chk)
|
||||||
|
libc_hidden_builtin_proto (__stpcpy_chk)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
Index: glibc-2.38/intl/loadmsgcat.c
|
||||||
|
===================================================================
|
||||||
|
--- glibc-2.38.orig/intl/loadmsgcat.c
|
||||||
|
+++ glibc-2.38/intl/loadmsgcat.c
|
||||||
|
@@ -796,8 +796,26 @@ _nl_load_domain (struct loaded_l10nfile
|
||||||
|
if (domain_file->filename == NULL)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
- /* Try to open the addressed file. */
|
||||||
|
- fd = open (domain_file->filename, O_RDONLY | O_BINARY);
|
||||||
|
+ /* Replace /locale/ with /usr/share/locale-langpack/ */
|
||||||
|
+ const char *langpackdir = "/usr/share/locale-langpack/";
|
||||||
|
+ char *filename_langpack = malloc (strlen (domain_file->filename)
|
||||||
|
+ + strlen (langpackdir));
|
||||||
|
+ if (filename_langpack != NULL)
|
||||||
|
+ {
|
||||||
|
+ char *p = strstr (domain_file->filename, "/locale/");
|
||||||
|
+ if (p != NULL)
|
||||||
|
+ {
|
||||||
|
+ strcpy (__stpcpy (filename_langpack, langpackdir), p + 8);
|
||||||
|
+ fd = open (filename_langpack, O_RDONLY | O_BINARY);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ free (filename_langpack);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (fd == -1)
|
||||||
|
+ /* Try to open the addressed file. */
|
||||||
|
+ fd = open (domain_file->filename, O_RDONLY | O_BINARY);
|
||||||
|
+
|
||||||
|
if (fd == -1)
|
||||||
|
goto out;
|
||||||
|
|
BIN
glibc-2.38.tar.xz
(Stored with Git LFS)
Normal file
BIN
glibc-2.38.tar.xz
(Stored with Git LFS)
Normal file
Binary file not shown.
16
glibc-2.38.tar.xz.sig
Normal file
16
glibc-2.38.tar.xz.sig
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
-----BEGIN PGP SIGNATURE-----
|
||||||
|
|
||||||
|
iQIzBAABCAAdFiEEcnNUKzmWLfeymZMUFnkrTqJTQPgFAmTIKMsACgkQFnkrTqJT
|
||||||
|
QPjMfg/9H6zpos/vnQnpMWKn/+eItqjJEgAJ4mSga2ncG+GugnuRMcR7BRjxrr8l
|
||||||
|
pEi9v9lKEHojUv0CvLjuZn0yR+rhApABqRmP+E65ECxEgYRsTweSnvGtn2OlJcYe
|
||||||
|
hVO2KDLKyiX5AbwXPSSZjYQpHpnO5Hcx5xnDlefLOOONHfut9LMbDuFpnbxXoPbm
|
||||||
|
cbuar0JAX9QxS8JVAj77gFYuyTgrVAApPv8GlLRDnOhaQks1/EP63kKMnm1tLx5n
|
||||||
|
HCZM6su0yVdT7gRLkyBeG12AhYa9zAXfEZZAZxDfpm9oHF7IoIC+uNP+1aH+K6Uy
|
||||||
|
NYKpIqvDDlkOSuZEazOjzHDQEWOTRBHo1hkrRjj8XNAejazfYB363qBChWP8MCvo
|
||||||
|
mqRkj88rmLVO+7RKvRasJGoMhJMkPqxdkwLMeB8EYfUgFt6eEul0hBZ1f533GoB8
|
||||||
|
h6G3fFiPodY5X2o5Kyj6BTruxIs+US96PgERagw/RcL6kis2qI5RYJHzkliInp9i
|
||||||
|
41MXx/hpw0vv3jX2b7mboYhMt+Ii+67B+mu9J4mOvXjfVo5lIf9k0FlnhKNhBRm4
|
||||||
|
x4X6PgZSc2VLQNXStMBbG5A7vShAeqd0icDIrWdNDOwp+4M1C2LqCttc61xRE5hX
|
||||||
|
00cL3f6r6vVbGp4PeYwN9LRlJdnK0cB5AS8dugmETP9qfYSDRyg=
|
||||||
|
=G5Md
|
||||||
|
-----END PGP SIGNATURE-----
|
22
glibc-2.4-china.diff
Normal file
22
glibc-2.4-china.diff
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
Index: glibc-2.27/localedata/locales/zh_TW
|
||||||
|
===================================================================
|
||||||
|
--- glibc-2.27.orig/localedata/locales/zh_TW
|
||||||
|
+++ glibc-2.27/localedata/locales/zh_TW
|
||||||
|
@@ -8,7 +8,7 @@ escape_char /
|
||||||
|
% exempt you from the conditions of the license if your use would
|
||||||
|
% otherwise be governed by that license.
|
||||||
|
|
||||||
|
-% Chinese language locale for Taiwan R.O.C.
|
||||||
|
+% Chinese language locale for Taiwan
|
||||||
|
%
|
||||||
|
% Original Author:
|
||||||
|
% Ming-Che Chuang
|
||||||
|
@@ -23,7 +23,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 ""
|
100
glibc-2.4.90-no_NO.diff
Normal file
100
glibc-2.4.90-no_NO.diff
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
Index: glibc-2.27/intl/locale.alias
|
||||||
|
===================================================================
|
||||||
|
--- glibc-2.27.orig/intl/locale.alias
|
||||||
|
+++ glibc-2.27/intl/locale.alias
|
||||||
|
@@ -65,8 +65,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
|
||||||
|
Index: glibc-2.27/localedata/SUPPORTED
|
||||||
|
===================================================================
|
||||||
|
--- glibc-2.27.orig/localedata/SUPPORTED
|
||||||
|
+++ glibc-2.27/localedata/SUPPORTED
|
||||||
|
@@ -355,6 +355,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 \
|
||||||
|
Index: glibc-2.27/localedata/locales/no_NO
|
||||||
|
===================================================================
|
||||||
|
--- /dev/null
|
||||||
|
+++ glibc-2.27/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
|
158
glibc-bindresvport-blacklist.diff
Normal file
158
glibc-bindresvport-blacklist.diff
Normal file
@ -0,0 +1,158 @@
|
|||||||
|
Index: glibc-2.32/inet/bindresvport.c
|
||||||
|
===================================================================
|
||||||
|
--- glibc-2.32.orig/inet/bindresvport.c
|
||||||
|
+++ glibc-2.32/inet/bindresvport.c
|
||||||
|
@@ -29,6 +29,9 @@
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
+#include <stdio.h>
|
||||||
|
+#include <ctype.h>
|
||||||
|
+#include <stdlib.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <string.h>
|
||||||
|
@@ -42,6 +45,93 @@
|
||||||
|
*/
|
||||||
|
__libc_lock_define_initialized (static, lock);
|
||||||
|
|
||||||
|
+#define STARTPORT 600
|
||||||
|
+#define LOWPORT 512
|
||||||
|
+#define ENDPORT (IPPORT_RESERVED - 1)
|
||||||
|
+#define NPORTS (ENDPORT - STARTPORT + 1)
|
||||||
|
+
|
||||||
|
+/* Read the file /etc/rpc.blacklisted, so that we don't bind to these
|
||||||
|
+ ports. */
|
||||||
|
+
|
||||||
|
+static int blacklist_read;
|
||||||
|
+static int *list;
|
||||||
|
+static int list_size = 0;
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+load_blacklist (void)
|
||||||
|
+{
|
||||||
|
+ FILE *fp;
|
||||||
|
+ char *buf = NULL;
|
||||||
|
+ size_t buflen = 0;
|
||||||
|
+ int size = 0, ptr = 0;
|
||||||
|
+
|
||||||
|
+ __libc_lock_lock (lock);
|
||||||
|
+ if (blacklist_read)
|
||||||
|
+ goto unlock;
|
||||||
|
+ blacklist_read = 1;
|
||||||
|
+
|
||||||
|
+ fp = fopen ("/etc/bindresvport.blacklist", "r");
|
||||||
|
+ if (fp == NULL)
|
||||||
|
+ goto unlock;
|
||||||
|
+
|
||||||
|
+ while (!feof_unlocked (fp))
|
||||||
|
+ {
|
||||||
|
+ unsigned long port;
|
||||||
|
+ char *tmp, *cp;
|
||||||
|
+ ssize_t n = __getline (&buf, &buflen, fp);
|
||||||
|
+ if (n < 1)
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
+ cp = buf;
|
||||||
|
+ /* Remove comments. */
|
||||||
|
+ tmp = strchr (cp, '#');
|
||||||
|
+ if (tmp)
|
||||||
|
+ *tmp = '\0';
|
||||||
|
+ /* Remove spaces and tabs. */
|
||||||
|
+ while (isspace ((unsigned char) *cp))
|
||||||
|
+ ++cp;
|
||||||
|
+ /* Ignore empty lines. */
|
||||||
|
+ if (*cp == '\0')
|
||||||
|
+ continue;
|
||||||
|
+ if (cp[strlen (cp) - 1] == '\n')
|
||||||
|
+ cp[strlen (cp) - 1] = '\0';
|
||||||
|
+
|
||||||
|
+ port = strtoul (cp, &tmp, 0);
|
||||||
|
+ while (isspace ((unsigned char) *tmp))
|
||||||
|
+ ++tmp;
|
||||||
|
+ if (*tmp != '\0' || (port == ULONG_MAX && errno == ERANGE))
|
||||||
|
+ continue;
|
||||||
|
+
|
||||||
|
+ /* Don't bother with out-of-range ports. */
|
||||||
|
+ if (port < LOWPORT || port > ENDPORT)
|
||||||
|
+ continue;
|
||||||
|
+
|
||||||
|
+ if (ptr >= size)
|
||||||
|
+ {
|
||||||
|
+ size += 10;
|
||||||
|
+ int *new_list = realloc (list, size * sizeof (int));
|
||||||
|
+ if (new_list == NULL)
|
||||||
|
+ {
|
||||||
|
+ free (list);
|
||||||
|
+ list = NULL;
|
||||||
|
+ free (buf);
|
||||||
|
+ goto unlock;
|
||||||
|
+ }
|
||||||
|
+ list = new_list;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ list[ptr++] = port;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ fclose (fp);
|
||||||
|
+ free (buf);
|
||||||
|
+ list_size = ptr;
|
||||||
|
+
|
||||||
|
+ unlock:
|
||||||
|
+ __libc_lock_unlock (lock);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* Bind a socket to a privileged IP port
|
||||||
|
*/
|
||||||
|
@@ -52,12 +142,11 @@ bindresvport (int sd, struct sockaddr_in
|
||||||
|
struct sockaddr_in myaddr;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
-#define STARTPORT 600
|
||||||
|
-#define LOWPORT 512
|
||||||
|
-#define ENDPORT (IPPORT_RESERVED - 1)
|
||||||
|
-#define NPORTS (ENDPORT - STARTPORT + 1)
|
||||||
|
static short startport = STARTPORT;
|
||||||
|
|
||||||
|
+ if (!blacklist_read)
|
||||||
|
+ load_blacklist ();
|
||||||
|
+
|
||||||
|
if (sin == (struct sockaddr_in *) 0)
|
||||||
|
{
|
||||||
|
sin = &myaddr;
|
||||||
|
@@ -75,6 +164,7 @@ bindresvport (int sd, struct sockaddr_in
|
||||||
|
port = (__getpid () % NPORTS) + STARTPORT;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ __set_errno (EADDRINUSE);
|
||||||
|
/* Initialize to make gcc happy. */
|
||||||
|
int res = -1;
|
||||||
|
|
||||||
|
@@ -86,12 +176,22 @@ bindresvport (int sd, struct sockaddr_in
|
||||||
|
again:
|
||||||
|
for (i = 0; i < nports; ++i)
|
||||||
|
{
|
||||||
|
- sin->sin_port = htons (port++);
|
||||||
|
- if (port > endport)
|
||||||
|
- port = startport;
|
||||||
|
+ int j;
|
||||||
|
+
|
||||||
|
+ sin->sin_port = htons (port);
|
||||||
|
+
|
||||||
|
+ /* Check that this port is not blacklisted. */
|
||||||
|
+ for (j = 0; j < list_size; j++)
|
||||||
|
+ if (port == list[j])
|
||||||
|
+ goto try_next_port;
|
||||||
|
+
|
||||||
|
res = __bind (sd, sin, sizeof (struct sockaddr_in));
|
||||||
|
if (res >= 0 || errno != EADDRINUSE)
|
||||||
|
break;
|
||||||
|
+
|
||||||
|
+ try_next_port:
|
||||||
|
+ if (++port > endport)
|
||||||
|
+ port = startport;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i == nports && startport != LOWPORT)
|
25
glibc-fix-double-loopback.diff
Normal file
25
glibc-fix-double-loopback.diff
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
This fixes the problem of getent ahosts localhost returning 127.0.0.1
|
||||||
|
_twice_ on systems that have no ipv6 interfaces up (hence are regarded
|
||||||
|
as ipv4 only by the lookup code), but still have localhost entries for
|
||||||
|
::1 and 127.0.0.1 in /etc/hosts (like most current systems).
|
||||||
|
|
||||||
|
Remapping ::1 to 127.0.0.1 is bogus when /etc/hosts is correct.
|
||||||
|
bnc #684534, #606980
|
||||||
|
http://sources.redhat.com/bugzilla/show_bug.cgi?id=4980
|
||||||
|
|
||||||
|
Index: glibc-2.27/nss/nss_files/files-hosts.c
|
||||||
|
===================================================================
|
||||||
|
--- glibc-2.27.orig/nss/nss_files/files-hosts.c
|
||||||
|
+++ glibc-2.27/nss/nss_files/files-hosts.c
|
||||||
|
@@ -70,11 +70,6 @@ LINE_PARSER
|
||||||
|
{
|
||||||
|
if (IN6_IS_ADDR_V4MAPPED (entdata->host_addr))
|
||||||
|
memcpy (entdata->host_addr, entdata->host_addr + 12, INADDRSZ);
|
||||||
|
- else if (IN6_IS_ADDR_LOOPBACK (entdata->host_addr))
|
||||||
|
- {
|
||||||
|
- in_addr_t localhost = htonl (INADDR_LOOPBACK);
|
||||||
|
- memcpy (entdata->host_addr, &localhost, sizeof (localhost));
|
||||||
|
- }
|
||||||
|
else
|
||||||
|
/* Illegal address: ignore line. */
|
||||||
|
return 0;
|
19
glibc-nscd.conf.patch
Normal file
19
glibc-nscd.conf.patch
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
Index: glibc-2.27/nscd/nscd.conf
|
||||||
|
===================================================================
|
||||||
|
--- glibc-2.27.orig/nscd/nscd.conf
|
||||||
|
+++ glibc-2.27/nscd/nscd.conf
|
||||||
|
@@ -61,11 +61,11 @@
|
||||||
|
auto-propagate group yes
|
||||||
|
|
||||||
|
enable-cache hosts yes
|
||||||
|
- positive-time-to-live hosts 3600
|
||||||
|
- negative-time-to-live hosts 20
|
||||||
|
+ positive-time-to-live hosts 600
|
||||||
|
+ negative-time-to-live hosts 0
|
||||||
|
suggested-size hosts 211
|
||||||
|
check-files hosts yes
|
||||||
|
- persistent hosts yes
|
||||||
|
+ persistent hosts no
|
||||||
|
shared hosts yes
|
||||||
|
max-db-size hosts 33554432
|
||||||
|
|
13
glibc-nsswitch-usr.diff
Normal file
13
glibc-nsswitch-usr.diff
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
Index: glibc-2.33/nss/nss_database.c
|
||||||
|
===================================================================
|
||||||
|
--- glibc-2.33.orig/nss/nss_database.c
|
||||||
|
+++ glibc-2.33/nss/nss_database.c
|
||||||
|
@@ -303,6 +303,8 @@ nss_database_reload (struct nss_database
|
||||||
|
{
|
||||||
|
FILE *fp = fopen (_PATH_NSSWITCH_CONF, "rce");
|
||||||
|
if (fp == NULL)
|
||||||
|
+ fp = fopen ("/usr" _PATH_NSSWITCH_CONF, "rce");
|
||||||
|
+ if (fp == NULL)
|
||||||
|
switch (errno)
|
||||||
|
{
|
||||||
|
case EACCES:
|
19
glibc-resolv-mdnshint.diff
Normal file
19
glibc-resolv-mdnshint.diff
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
Index: glibc-2.27/resolv/res_hconf.c
|
||||||
|
===================================================================
|
||||||
|
--- glibc-2.27.orig/resolv/res_hconf.c
|
||||||
|
+++ glibc-2.27/resolv/res_hconf.c
|
||||||
|
@@ -215,9 +215,12 @@ parse_line (const char *fname, int line_
|
||||||
|
if (c == NULL)
|
||||||
|
{
|
||||||
|
char *buf;
|
||||||
|
+ const char *hint = "";
|
||||||
|
|
||||||
|
- if (__asprintf (&buf, _("%s: line %d: bad command `%s'\n"),
|
||||||
|
- fname, line_num, start) < 0)
|
||||||
|
+ if (__strncasecmp (start, "mdns", len) == 0 && len == 4)
|
||||||
|
+ hint = "Multicast DNS is now configured in /etc/nsswitch.conf instead.\nSee also the package and manpage of nss-mdns.\n";
|
||||||
|
+ if (__asprintf (&buf, _("%s: line %d: bad command `%s'\n%s"),
|
||||||
|
+ fname, line_num, start, hint) < 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
__fxprintf (NULL, "%s", buf);
|
18
glibc-version.diff
Normal file
18
glibc-version.diff
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
Index: glibc-2.27/csu/version.c
|
||||||
|
===================================================================
|
||||||
|
--- glibc-2.27.orig/csu/version.c
|
||||||
|
+++ glibc-2.27/csu/version.c
|
||||||
|
@@ -24,11 +24,12 @@ static const char __libc_release[] = REL
|
||||||
|
static const char __libc_version[] = VERSION;
|
||||||
|
|
||||||
|
static const char banner[] =
|
||||||
|
-"GNU C Library "PKGVERSION RELEASE" release version "VERSION".\n\
|
||||||
|
+"GNU C Library "PKGVERSION RELEASE" release version "VERSION" (git "GITID").\n\
|
||||||
|
Copyright (C) 2023 Free Software Foundation, Inc.\n\
|
||||||
|
This is free software; see the source for copying conditions.\n\
|
||||||
|
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A\n\
|
||||||
|
PARTICULAR PURPOSE.\n\
|
||||||
|
+Configured for "CONFHOST".\n\
|
||||||
|
Compiled by GNU CC version "__VERSION__".\n"
|
||||||
|
#ifdef LIBC_ABIS_STRING
|
||||||
|
LIBC_ABIS_STRING
|
9670
glibc.changes
Normal file
9670
glibc.changes
Normal file
File diff suppressed because it is too large
Load Diff
1175
glibc.keyring
Normal file
1175
glibc.keyring
Normal file
File diff suppressed because it is too large
Load Diff
16
glibc.rpmlintrc
Normal file
16
glibc.rpmlintrc
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
# glibc-profile is a devel package
|
||||||
|
addFilter("glibc-profile.* devel-file-in-non-devel-package.*/usr/lib.*/lib.*_p\.a")
|
||||||
|
# glibc is not a devel package
|
||||||
|
addFilter("glibc\..* non-devel-file-in-devel-package")
|
||||||
|
# getent deliberately uses gethostbyname
|
||||||
|
addFilter("binary-or-shlib-calls-gethostbyname /usr/bin/getent")
|
||||||
|
# We do need to keep the symtab (see comments in glibc.spec), so this is intented:
|
||||||
|
addFilter("unstripped-binary-or-object")
|
||||||
|
# ld.so is special:
|
||||||
|
addFilter("shared-library-without-dependency-information /usr/lib.*/ld.*\.so")
|
||||||
|
# the cross..-devel packages contain everything, in non-std paths, so no
|
||||||
|
# ldconfig is wanted or needed (for sle-15 based trees), and we accept
|
||||||
|
# the *.so symlinks, and deliver (target) binaries
|
||||||
|
addFilter("cross.*library-without-ldconfig-post.*")
|
||||||
|
addFilter("cross.*non-devel-file-in-devel-package.*")
|
||||||
|
addFilter("cross.*arch-independent-package-contains-binary-or-object.*")
|
1446
glibc.spec
Normal file
1446
glibc.spec
Normal file
File diff suppressed because it is too large
Load Diff
30
iconv-error-verbosity.patch
Normal file
30
iconv-error-verbosity.patch
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
From fc72b6d7d818ab2868920af956d1542d03342a4d Mon Sep 17 00:00:00 2001
|
||||||
|
From: Andreas Schwab <schwab@suse.de>
|
||||||
|
Date: Tue, 1 Aug 2023 17:01:37 +0200
|
||||||
|
Subject: [PATCH] iconv: restore verbosity with unrecognized encoding names
|
||||||
|
(bug 30694)
|
||||||
|
|
||||||
|
Commit 91927b7c76 ("Rewrite iconv option parsing [BZ #19519]") changed the
|
||||||
|
iconv program to call __gconv_open directly instead of the iconv_open
|
||||||
|
wrapper, but the former does not set errno. Update the caller to
|
||||||
|
interpret the return codes like iconv_open does.
|
||||||
|
---
|
||||||
|
iconv/iconv_prog.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/iconv/iconv_prog.c b/iconv/iconv_prog.c
|
||||||
|
index bee898c63c..cf32cf9b44 100644
|
||||||
|
--- a/iconv/iconv_prog.c
|
||||||
|
+++ b/iconv/iconv_prog.c
|
||||||
|
@@ -187,7 +187,7 @@ main (int argc, char *argv[])
|
||||||
|
|
||||||
|
if (res != __GCONV_OK)
|
||||||
|
{
|
||||||
|
- if (errno == EINVAL)
|
||||||
|
+ if (res == __GCONV_NOCONV || res == __GCONV_NODB)
|
||||||
|
{
|
||||||
|
/* Try to be nice with the user and tell her which of the
|
||||||
|
two encoding names is wrong. This is possible because
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
39
intl-c-utf-8-like-c-locale.patch
Normal file
39
intl-c-utf-8-like-c-locale.patch
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
From 2897b231a6b71ee17d47d3d63f1112b2641a476c Mon Sep 17 00:00:00 2001
|
||||||
|
From: Bruno Haible <bruno@clisp.org>
|
||||||
|
Date: Mon, 4 Sep 2023 15:31:36 +0200
|
||||||
|
Subject: [PATCH] intl: Treat C.UTF-8 locale like C locale (BZ# 16621)
|
||||||
|
|
||||||
|
The wiki page https://sourceware.org/glibc/wiki/Proposals/C.UTF-8
|
||||||
|
says that "Setting LC_ALL=C.UTF-8 will ignore LANGUAGE just like it
|
||||||
|
does with LC_ALL=C." This patch implements it.
|
||||||
|
|
||||||
|
* intl/dcigettext.c (guess_category_value): Treat C.<encoding> locale
|
||||||
|
like the C locale.
|
||||||
|
|
||||||
|
Reviewed-by: Florian Weimer <fweimer@redhat.com>
|
||||||
|
---
|
||||||
|
intl/dcigettext.c | 8 ++++++--
|
||||||
|
1 file changed, 6 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/intl/dcigettext.c b/intl/dcigettext.c
|
||||||
|
index 7886ac9545..27063886d2 100644
|
||||||
|
--- a/intl/dcigettext.c
|
||||||
|
+++ b/intl/dcigettext.c
|
||||||
|
@@ -1560,8 +1560,12 @@ guess_category_value (int category, const char *categoryname)
|
||||||
|
2. The precise output of some programs in the "C" locale is specified
|
||||||
|
by POSIX and should not depend on environment variables like
|
||||||
|
"LANGUAGE" or system-dependent information. We allow such programs
|
||||||
|
- to use gettext(). */
|
||||||
|
- if (strcmp (locale, "C") == 0)
|
||||||
|
+ to use gettext().
|
||||||
|
+ Ignore LANGUAGE and its system-dependent analogon also if the locale is
|
||||||
|
+ set to "C.UTF-8" or, more generally, to "C.<encoding>", because that's
|
||||||
|
+ the by-design behaviour for glibc, see
|
||||||
|
+ <https://sourceware.org/glibc/wiki/Proposals/C.UTF-8>. */
|
||||||
|
+ if (locale[0] == 'C' && (locale[1] == '\0' || locale[1] == '.'))
|
||||||
|
return locale;
|
||||||
|
|
||||||
|
/* The highest priority value is the value of the 'LANGUAGE' environment
|
||||||
|
--
|
||||||
|
2.42.0
|
||||||
|
|
53
ldconfig-concurrency.patch
Normal file
53
ldconfig-concurrency.patch
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
* elf/cache.c (save_cache): Use unique temporary name.
|
||||||
|
(save_aux_cache): Likewise.
|
||||||
|
|
||||||
|
Index: glibc-2.34/elf/cache.c
|
||||||
|
===================================================================
|
||||||
|
--- glibc-2.34.orig/elf/cache.c
|
||||||
|
+++ glibc-2.34/elf/cache.c
|
||||||
|
@@ -716,12 +716,12 @@ save_cache (const char *cache_name)
|
||||||
|
/* Write out the cache. */
|
||||||
|
|
||||||
|
/* Write cache first to a temporary file and rename it later. */
|
||||||
|
- char *temp_name = xmalloc (strlen (cache_name) + 2);
|
||||||
|
- sprintf (temp_name, "%s~", cache_name);
|
||||||
|
+ char *temp_name;
|
||||||
|
+ if (asprintf (&temp_name, "%s.XXXXXX", cache_name) < 0)
|
||||||
|
+ error (EXIT_FAILURE, errno, _("Can't allocate temporary name for cache file"));
|
||||||
|
|
||||||
|
/* Create file. */
|
||||||
|
- int fd = open (temp_name, O_CREAT|O_WRONLY|O_TRUNC|O_NOFOLLOW,
|
||||||
|
- S_IRUSR|S_IWUSR);
|
||||||
|
+ int fd = mkostemp (temp_name, 0);
|
||||||
|
if (fd < 0)
|
||||||
|
error (EXIT_FAILURE, errno, _("Can't create temporary cache file %s"),
|
||||||
|
temp_name);
|
||||||
|
@@ -1128,8 +1128,9 @@ save_aux_cache (const char *aux_cache_na
|
||||||
|
/* Write out auxiliary cache file. */
|
||||||
|
/* Write auxiliary cache first to a temporary file and rename it later. */
|
||||||
|
|
||||||
|
- char *temp_name = xmalloc (strlen (aux_cache_name) + 2);
|
||||||
|
- sprintf (temp_name, "%s~", aux_cache_name);
|
||||||
|
+ char *temp_name;
|
||||||
|
+ if (asprintf (&temp_name, "%s.XXXXXX", aux_cache_name) < 0)
|
||||||
|
+ goto out_fail2;
|
||||||
|
|
||||||
|
/* Check that directory exists and create if needed. */
|
||||||
|
char *dir = strdupa (aux_cache_name);
|
||||||
|
@@ -1143,8 +1144,7 @@ save_aux_cache (const char *aux_cache_na
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Create file. */
|
||||||
|
- int fd = open (temp_name, O_CREAT|O_WRONLY|O_TRUNC|O_NOFOLLOW,
|
||||||
|
- S_IRUSR|S_IWUSR);
|
||||||
|
+ int fd = mkostemp (temp_name, 0);
|
||||||
|
if (fd < 0)
|
||||||
|
goto out_fail;
|
||||||
|
|
||||||
|
@@ -1167,5 +1167,6 @@ save_aux_cache (const char *aux_cache_na
|
||||||
|
out_fail:
|
||||||
|
/* Free allocated memory. */
|
||||||
|
free (temp_name);
|
||||||
|
+out_fail2:
|
||||||
|
free (file_entries);
|
||||||
|
}
|
26
ldconfig-process-elf-file.patch
Normal file
26
ldconfig-process-elf-file.patch
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
From bf5aa419cbf545d2cd09dc097e518033d6e4df5e Mon Sep 17 00:00:00 2001
|
||||||
|
From: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||||
|
Date: Thu, 7 Dec 2023 11:17:35 -0300
|
||||||
|
Subject: [PATCH] elf: Fix wrong break removal from 8ee878592c
|
||||||
|
|
||||||
|
Reported-by: Alexander Monakov <amonakov@ispras.ru>
|
||||||
|
(cherry picked from commit 546a1ba664626603660b595662249d524e429013)
|
||||||
|
---
|
||||||
|
elf/readelflib.c | 1 +
|
||||||
|
1 file changed, 1 insertion(+)
|
||||||
|
|
||||||
|
diff --git a/elf/readelflib.c b/elf/readelflib.c
|
||||||
|
index f5b8c80e38..64f1d662a9 100644
|
||||||
|
--- a/elf/readelflib.c
|
||||||
|
+++ b/elf/readelflib.c
|
||||||
|
@@ -107,6 +107,7 @@ process_elf_file (const char *file_name, const char *lib, int *flag,
|
||||||
|
case PT_INTERP:
|
||||||
|
program_interpreter = (char *) (file_contents + segment->p_offset);
|
||||||
|
check_ptr (program_interpreter);
|
||||||
|
+ break;
|
||||||
|
|
||||||
|
case PT_GNU_PROPERTY:
|
||||||
|
/* The NT_GNU_PROPERTY_TYPE_0 note must be aligned to 4 bytes
|
||||||
|
--
|
||||||
|
2.43.0
|
||||||
|
|
51
libio-io-vtables.patch
Normal file
51
libio-io-vtables.patch
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
From 92201f16cbcfd9eafe314ef6654be2ea7ba25675 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Adam Jackson <ajax@redhat.com>
|
||||||
|
Date: Fri, 8 Sep 2023 15:55:19 -0400
|
||||||
|
Subject: [PATCH] libio: Fix oversized __io_vtables
|
||||||
|
|
||||||
|
IO_VTABLES_LEN is the size of the struct array in bytes, not the number
|
||||||
|
of __IO_jump_t's in the array. Drops just under 384kb from .rodata on
|
||||||
|
LP64 machines.
|
||||||
|
|
||||||
|
Fixes: 3020f72618e ("libio: Remove the usage of __libc_IO_vtables")
|
||||||
|
Signed-off-by: Adam Jackson <ajax@redhat.com>
|
||||||
|
Reviewed-by: Florian Weimer <fweimer@redhat.com>
|
||||||
|
Tested-by: Florian Weimer <fweimer@redhat.com>
|
||||||
|
(cherry picked from commit 8cb69e054386f980f9ff4d93b157861d72b2019e)
|
||||||
|
---
|
||||||
|
libio/vtables.c | 5 ++++-
|
||||||
|
1 file changed, 4 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/libio/vtables.c b/libio/vtables.c
|
||||||
|
index 1d8ad612e9..34f7e15f1c 100644
|
||||||
|
--- a/libio/vtables.c
|
||||||
|
+++ b/libio/vtables.c
|
||||||
|
@@ -20,6 +20,7 @@
|
||||||
|
#include <libioP.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <ldsodefs.h>
|
||||||
|
+#include <array_length.h>
|
||||||
|
#include <pointer_guard.h>
|
||||||
|
#include <libio-macros.h>
|
||||||
|
|
||||||
|
@@ -88,7 +89,7 @@
|
||||||
|
# pragma weak __wprintf_buffer_as_file_xsputn
|
||||||
|
#endif
|
||||||
|
|
||||||
|
-const struct _IO_jump_t __io_vtables[IO_VTABLES_LEN] attribute_relro =
|
||||||
|
+const struct _IO_jump_t __io_vtables[] attribute_relro =
|
||||||
|
{
|
||||||
|
/* _IO_str_jumps */
|
||||||
|
[IO_STR_JUMPS] =
|
||||||
|
@@ -485,6 +486,8 @@ const struct _IO_jump_t __io_vtables[IO_VTABLES_LEN] attribute_relro =
|
||||||
|
},
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
+_Static_assert (array_length (__io_vtables) == IO_VTABLES_NUM,
|
||||||
|
+ "initializer count");
|
||||||
|
|
||||||
|
#ifdef SHARED
|
||||||
|
|
||||||
|
--
|
||||||
|
2.42.0
|
||||||
|
|
36
libio-wdo-write.patch
Normal file
36
libio-wdo-write.patch
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
From cfe121910013a46e2477562282c56ae8062089aa Mon Sep 17 00:00:00 2001
|
||||||
|
From: Florian Weimer <fweimer@redhat.com>
|
||||||
|
Date: Tue, 2 Jan 2024 14:36:17 +0100
|
||||||
|
Subject: [PATCH] libio: Check remaining buffer size in _IO_wdo_write (bug
|
||||||
|
31183)
|
||||||
|
|
||||||
|
The multibyte character needs to fit into the remaining buffer space,
|
||||||
|
not the already-written buffer space. Without the fix, we were never
|
||||||
|
moving the write pointer from the start of the buffer, always using
|
||||||
|
the single-character fallback buffer.
|
||||||
|
|
||||||
|
Fixes commit 04b76b5aa8b2d1d19066e42dd1 ("Don't error out writing
|
||||||
|
a multibyte character to an unbuffered stream (bug 17522)").
|
||||||
|
|
||||||
|
(cherry picked from commit ecc7c3deb9f347649c2078fcc0f94d4cedf92d60)
|
||||||
|
---
|
||||||
|
NEWS | 1 +
|
||||||
|
libio/wfileops.c | 2 +-
|
||||||
|
2 files changed, 2 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/libio/wfileops.c b/libio/wfileops.c
|
||||||
|
index f16f6db1c3..9ab8f2e7f3 100644
|
||||||
|
--- a/libio/wfileops.c
|
||||||
|
+++ b/libio/wfileops.c
|
||||||
|
@@ -55,7 +55,7 @@ _IO_wdo_write (FILE *fp, const wchar_t *data, size_t to_do)
|
||||||
|
char mb_buf[MB_LEN_MAX];
|
||||||
|
char *write_base, *write_ptr, *buf_end;
|
||||||
|
|
||||||
|
- if (fp->_IO_write_ptr - fp->_IO_write_base < sizeof (mb_buf))
|
||||||
|
+ if (fp->_IO_buf_end - fp->_IO_write_ptr < sizeof (mb_buf))
|
||||||
|
{
|
||||||
|
/* Make sure we have room for at least one multibyte
|
||||||
|
character. */
|
||||||
|
--
|
||||||
|
2.43.0
|
||||||
|
|
21
manpages.patch
Normal file
21
manpages.patch
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
Index: ./manpages/locale.alias.5
|
||||||
|
===================================================================
|
||||||
|
--- ./manpages/locale.alias.5.orig
|
||||||
|
+++ ./manpages/locale.alias.5
|
||||||
|
@@ -18,7 +18,7 @@
|
||||||
|
.SH "NAME"
|
||||||
|
locale.alias \- Locale name alias data base
|
||||||
|
.SH "DESCRIPTION"
|
||||||
|
-The locale.alias database file (/etc/locale.alias) is used by the
|
||||||
|
+The locale.alias database file (/usr/share/locale/locale.alias) is used by the
|
||||||
|
.B locale
|
||||||
|
command and the
|
||||||
|
.B X Window System
|
||||||
|
@@ -40,6 +40,6 @@ name, or simpler versions of the POSIX l
|
||||||
|
Lines beginning with Hash ("#") are treated as comments and ignored.
|
||||||
|
|
||||||
|
.SH "SEE ALSO"
|
||||||
|
-locale(1), localedef(1), locale-gen(8), locale.gen(5)
|
||||||
|
+locale(1), localedef(1)
|
||||||
|
.SH "AUTHOR"
|
||||||
|
Alastair McKinstry <mckinstry@computer.org>
|
BIN
manpages.tar.bz2
(Stored with Git LFS)
Normal file
BIN
manpages.tar.bz2
(Stored with Git LFS)
Normal file
Binary file not shown.
193
no-aaaa-read-overflow.patch
Normal file
193
no-aaaa-read-overflow.patch
Normal file
@ -0,0 +1,193 @@
|
|||||||
|
From bd77dd7e73e3530203be1c52c8a29d08270cb25d Mon Sep 17 00:00:00 2001
|
||||||
|
From: Florian Weimer <fweimer@redhat.com>
|
||||||
|
Date: Wed, 13 Sep 2023 14:10:56 +0200
|
||||||
|
Subject: [PATCH] CVE-2023-4527: Stack read overflow with large TCP responses
|
||||||
|
in no-aaaa mode
|
||||||
|
|
||||||
|
Without passing alt_dns_packet_buffer, __res_context_search can only
|
||||||
|
store 2048 bytes (what fits into dns_packet_buffer). However,
|
||||||
|
the function returns the total packet size, and the subsequent
|
||||||
|
DNS parsing code in _nss_dns_gethostbyname4_r reads beyond the end
|
||||||
|
of the stack-allocated buffer.
|
||||||
|
|
||||||
|
Fixes commit f282cdbe7f436c75864e5640a4 ("resolv: Implement no-aaaa
|
||||||
|
stub resolver option") and bug 30842.
|
||||||
|
---
|
||||||
|
NEWS | 6 +-
|
||||||
|
resolv/Makefile | 2 +
|
||||||
|
resolv/nss_dns/dns-host.c | 2 +-
|
||||||
|
resolv/tst-resolv-noaaaa-vc.c | 129 ++++++++++++++++++++++++++++++++++
|
||||||
|
4 files changed, 137 insertions(+), 2 deletions(-)
|
||||||
|
create mode 100644 resolv/tst-resolv-noaaaa-vc.c
|
||||||
|
|
||||||
|
diff --git a/resolv/Makefile b/resolv/Makefile
|
||||||
|
index 054b1fa36c..2f99eb3862 100644
|
||||||
|
--- a/resolv/Makefile
|
||||||
|
+++ b/resolv/Makefile
|
||||||
|
@@ -102,6 +102,7 @@ tests += \
|
||||||
|
tst-resolv-invalid-cname \
|
||||||
|
tst-resolv-network \
|
||||||
|
tst-resolv-noaaaa \
|
||||||
|
+ tst-resolv-noaaaa-vc \
|
||||||
|
tst-resolv-nondecimal \
|
||||||
|
tst-resolv-res_init-multi \
|
||||||
|
tst-resolv-search \
|
||||||
|
@@ -293,6 +294,7 @@ $(objpfx)tst-resolv-res_init-thread: $(objpfx)libresolv.so \
|
||||||
|
$(objpfx)tst-resolv-invalid-cname: $(objpfx)libresolv.so \
|
||||||
|
$(shared-thread-library)
|
||||||
|
$(objpfx)tst-resolv-noaaaa: $(objpfx)libresolv.so $(shared-thread-library)
|
||||||
|
+$(objpfx)tst-resolv-noaaaa-vc: $(objpfx)libresolv.so $(shared-thread-library)
|
||||||
|
$(objpfx)tst-resolv-nondecimal: $(objpfx)libresolv.so $(shared-thread-library)
|
||||||
|
$(objpfx)tst-resolv-qtypes: $(objpfx)libresolv.so $(shared-thread-library)
|
||||||
|
$(objpfx)tst-resolv-rotate: $(objpfx)libresolv.so $(shared-thread-library)
|
||||||
|
diff --git a/resolv/nss_dns/dns-host.c b/resolv/nss_dns/dns-host.c
|
||||||
|
index c8b77bbc35..119dc9f00f 100644
|
||||||
|
--- a/resolv/nss_dns/dns-host.c
|
||||||
|
+++ b/resolv/nss_dns/dns-host.c
|
||||||
|
@@ -427,7 +427,7 @@ _nss_dns_gethostbyname4_r (const char *name, struct gaih_addrtuple **pat,
|
||||||
|
{
|
||||||
|
n = __res_context_search (ctx, name, C_IN, T_A,
|
||||||
|
dns_packet_buffer, sizeof (dns_packet_buffer),
|
||||||
|
- NULL, NULL, NULL, NULL, NULL);
|
||||||
|
+ &alt_dns_packet_buffer, NULL, NULL, NULL, NULL);
|
||||||
|
if (n >= 0)
|
||||||
|
status = gaih_getanswer_noaaaa (alt_dns_packet_buffer, n,
|
||||||
|
&abuf, pat, errnop, herrnop, ttlp);
|
||||||
|
diff --git a/resolv/tst-resolv-noaaaa-vc.c b/resolv/tst-resolv-noaaaa-vc.c
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000000..9f5aebd99f
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/resolv/tst-resolv-noaaaa-vc.c
|
||||||
|
@@ -0,0 +1,129 @@
|
||||||
|
+/* Test the RES_NOAAAA resolver option with a large response.
|
||||||
|
+ Copyright (C) 2022-2023 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, see
|
||||||
|
+ <https://www.gnu.org/licenses/>. */
|
||||||
|
+
|
||||||
|
+#include <errno.h>
|
||||||
|
+#include <netdb.h>
|
||||||
|
+#include <resolv.h>
|
||||||
|
+#include <stdbool.h>
|
||||||
|
+#include <stdlib.h>
|
||||||
|
+#include <support/check.h>
|
||||||
|
+#include <support/check_nss.h>
|
||||||
|
+#include <support/resolv_test.h>
|
||||||
|
+#include <support/support.h>
|
||||||
|
+#include <support/xmemstream.h>
|
||||||
|
+
|
||||||
|
+/* Used to keep track of the number of queries. */
|
||||||
|
+static volatile unsigned int queries;
|
||||||
|
+
|
||||||
|
+/* If true, add a large TXT record at the start of the answer section. */
|
||||||
|
+static volatile bool stuff_txt;
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+response (const struct resolv_response_context *ctx,
|
||||||
|
+ struct resolv_response_builder *b,
|
||||||
|
+ const char *qname, uint16_t qclass, uint16_t qtype)
|
||||||
|
+{
|
||||||
|
+ /* If not using TCP, just force its use. */
|
||||||
|
+ if (!ctx->tcp)
|
||||||
|
+ {
|
||||||
|
+ struct resolv_response_flags flags = {.tc = true};
|
||||||
|
+ resolv_response_init (b, flags);
|
||||||
|
+ resolv_response_add_question (b, qname, qclass, qtype);
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /* The test needs to send four queries, the first three are used to
|
||||||
|
+ grow the NSS buffer via the ERANGE handshake. */
|
||||||
|
+ ++queries;
|
||||||
|
+ TEST_VERIFY (queries <= 4);
|
||||||
|
+
|
||||||
|
+ /* AAAA queries are supposed to be disabled. */
|
||||||
|
+ TEST_COMPARE (qtype, T_A);
|
||||||
|
+ TEST_COMPARE (qclass, C_IN);
|
||||||
|
+ TEST_COMPARE_STRING (qname, "example.com");
|
||||||
|
+
|
||||||
|
+ struct resolv_response_flags flags = {};
|
||||||
|
+ resolv_response_init (b, flags);
|
||||||
|
+ resolv_response_add_question (b, qname, qclass, qtype);
|
||||||
|
+
|
||||||
|
+ resolv_response_section (b, ns_s_an);
|
||||||
|
+
|
||||||
|
+ if (stuff_txt)
|
||||||
|
+ {
|
||||||
|
+ resolv_response_open_record (b, qname, qclass, T_TXT, 60);
|
||||||
|
+ int zero = 0;
|
||||||
|
+ for (int i = 0; i <= 15000; ++i)
|
||||||
|
+ resolv_response_add_data (b, &zero, sizeof (zero));
|
||||||
|
+ resolv_response_close_record (b);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ for (int i = 0; i < 200; ++i)
|
||||||
|
+ {
|
||||||
|
+ resolv_response_open_record (b, qname, qclass, qtype, 60);
|
||||||
|
+ char ipv4[4] = {192, 0, 2, i + 1};
|
||||||
|
+ resolv_response_add_data (b, &ipv4, sizeof (ipv4));
|
||||||
|
+ resolv_response_close_record (b);
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int
|
||||||
|
+do_test (void)
|
||||||
|
+{
|
||||||
|
+ struct resolv_test *obj = resolv_test_start
|
||||||
|
+ ((struct resolv_redirect_config)
|
||||||
|
+ {
|
||||||
|
+ .response_callback = response
|
||||||
|
+ });
|
||||||
|
+
|
||||||
|
+ _res.options |= RES_NOAAAA;
|
||||||
|
+
|
||||||
|
+ for (int do_stuff_txt = 0; do_stuff_txt < 2; ++do_stuff_txt)
|
||||||
|
+ {
|
||||||
|
+ queries = 0;
|
||||||
|
+ stuff_txt = do_stuff_txt;
|
||||||
|
+
|
||||||
|
+ struct addrinfo *ai = NULL;
|
||||||
|
+ int ret;
|
||||||
|
+ ret = getaddrinfo ("example.com", "80",
|
||||||
|
+ &(struct addrinfo)
|
||||||
|
+ {
|
||||||
|
+ .ai_family = AF_UNSPEC,
|
||||||
|
+ .ai_socktype = SOCK_STREAM,
|
||||||
|
+ }, &ai);
|
||||||
|
+
|
||||||
|
+ char *expected_result;
|
||||||
|
+ {
|
||||||
|
+ struct xmemstream mem;
|
||||||
|
+ xopen_memstream (&mem);
|
||||||
|
+ for (int i = 0; i < 200; ++i)
|
||||||
|
+ fprintf (mem.out, "address: STREAM/TCP 192.0.2.%d 80\n", i + 1);
|
||||||
|
+ xfclose_memstream (&mem);
|
||||||
|
+ expected_result = mem.buffer;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ check_addrinfo ("example.com", ai, ret, expected_result);
|
||||||
|
+
|
||||||
|
+ free (expected_result);
|
||||||
|
+ freeaddrinfo (ai);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ resolv_test_end (obj);
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+#include <support/test-driver.c>
|
||||||
|
--
|
||||||
|
2.42.0
|
||||||
|
|
13
nscd-server-user.patch
Normal file
13
nscd-server-user.patch
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
Index: glibc-2.27/nscd/nscd.conf
|
||||||
|
===================================================================
|
||||||
|
--- glibc-2.27.orig/nscd/nscd.conf
|
||||||
|
+++ glibc-2.27/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
|
22
nscd.service
Normal file
22
nscd.service
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
# systemd service file for nscd
|
||||||
|
|
||||||
|
[Unit]
|
||||||
|
Description=Name Service Cache Daemon
|
||||||
|
After=sysinit.target
|
||||||
|
Wants=nss-lookup.target nss-user-lookup.target
|
||||||
|
Before=nss-lookup.target nss-user-lookup.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=forking
|
||||||
|
ExecStart=/usr/sbin/nscd
|
||||||
|
ExecStop=/usr/sbin/nscd --shutdown
|
||||||
|
ExecReload=/usr/sbin/nscd -i passwd
|
||||||
|
ExecReload=/usr/sbin/nscd -i group
|
||||||
|
ExecReload=/usr/sbin/nscd -i hosts
|
||||||
|
ExecReload=/usr/sbin/nscd -i services
|
||||||
|
ExecReload=/usr/sbin/nscd -i netgroup
|
||||||
|
Restart=always
|
||||||
|
PIDFile=/run/nscd/nscd.pid
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
2
nscd.sysusers
Normal file
2
nscd.sysusers
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
#Type Name ID GECOS Home directory Shell
|
||||||
|
u nscd - "User for nscd" /run/nscd -
|
41
nss-db-path.patch
Normal file
41
nss-db-path.patch
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
Use /var/db for nss_db
|
||||||
|
|
||||||
|
Index: glibc-2.27/Makeconfig
|
||||||
|
===================================================================
|
||||||
|
--- glibc-2.27.orig/Makeconfig
|
||||||
|
+++ glibc-2.27/Makeconfig
|
||||||
|
@@ -245,7 +245,7 @@ inst_sysconfdir = $(install_root)$(sysco
|
||||||
|
|
||||||
|
# Directory for the database files and Makefile for nss_db.
|
||||||
|
ifndef vardbdir
|
||||||
|
-vardbdir = $(localstatedir)/db
|
||||||
|
+vardbdir = /var/lib/misc
|
||||||
|
endif
|
||||||
|
inst_vardbdir = $(install_root)$(vardbdir)
|
||||||
|
|
||||||
|
Index: glibc-2.27/nss/db-Makefile
|
||||||
|
===================================================================
|
||||||
|
--- glibc-2.27.orig/nss/db-Makefile
|
||||||
|
+++ glibc-2.27/nss/db-Makefile
|
||||||
|
@@ -22,7 +22,7 @@ DATABASES = $(wildcard /etc/passwd /etc/
|
||||||
|
/etc/rpc /etc/services /etc/shadow /etc/gshadow \
|
||||||
|
/etc/netgroup)
|
||||||
|
|
||||||
|
-VAR_DB = /var/db
|
||||||
|
+VAR_DB = /var/lib/misc
|
||||||
|
|
||||||
|
AWK = awk
|
||||||
|
MAKEDB = makedb --quiet
|
||||||
|
Index: glibc-2.27/sysdeps/unix/sysv/linux/paths.h
|
||||||
|
===================================================================
|
||||||
|
--- glibc-2.27.orig/sysdeps/unix/sysv/linux/paths.h
|
||||||
|
+++ glibc-2.27/sysdeps/unix/sysv/linux/paths.h
|
||||||
|
@@ -68,7 +68,7 @@
|
||||||
|
/* Provide trailing slash, since mostly used for building pathnames. */
|
||||||
|
#define _PATH_DEV "/dev/"
|
||||||
|
#define _PATH_TMP "/tmp/"
|
||||||
|
-#define _PATH_VARDB "/var/db/"
|
||||||
|
+#define _PATH_VARDB "/var/lib/misc/"
|
||||||
|
#define _PATH_VARRUN "/var/run/"
|
||||||
|
#define _PATH_VARTMP "/var/tmp/"
|
||||||
|
|
75
nsswitch.conf
Normal file
75
nsswitch.conf
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
#
|
||||||
|
# /etc/nsswitch.conf
|
||||||
|
#
|
||||||
|
# An example Name Service Switch config file. This file should be
|
||||||
|
# sorted with the most-used services at the beginning.
|
||||||
|
#
|
||||||
|
# Valid databases are: aliases, ethers, group, gshadow, hosts,
|
||||||
|
# initgroups, netgroup, networks, passwd, protocols, publickey,
|
||||||
|
# rpc, services, and shadow.
|
||||||
|
#
|
||||||
|
# Valid service provider entries include (in alphabetical order):
|
||||||
|
#
|
||||||
|
# compat Use /etc files plus *_compat pseudo-db
|
||||||
|
# db Use the pre-processed /var/db files
|
||||||
|
# dns Use DNS (Domain Name Service)
|
||||||
|
# files Use the local files in /etc
|
||||||
|
# hesiod Use Hesiod (DNS) for user lookups
|
||||||
|
# nis Use NIS (NIS version 2), also called YP
|
||||||
|
# nisplus Use NIS+ (NIS version 3)
|
||||||
|
#
|
||||||
|
# See `info libc 'NSS Basics'` for more information.
|
||||||
|
#
|
||||||
|
# Commonly used alternative service providers (may need installation):
|
||||||
|
#
|
||||||
|
# ldap Use LDAP directory server
|
||||||
|
# myhostname Use systemd host names
|
||||||
|
# mymachines Use systemd machine names
|
||||||
|
# mdns*, mdns*_minimal Use Avahi mDNS/DNS-SD
|
||||||
|
# resolve Use systemd resolved resolver
|
||||||
|
# sss Use System Security Services Daemon (sssd)
|
||||||
|
# systemd Use systemd for dynamic user option
|
||||||
|
# winbind Use Samba winbind support
|
||||||
|
# wins Use Samba wins support
|
||||||
|
# wrapper Use wrapper module for testing
|
||||||
|
#
|
||||||
|
# Notes:
|
||||||
|
#
|
||||||
|
# 'sssd' performs its own 'files'-based caching, so it should generally
|
||||||
|
# come before 'files'.
|
||||||
|
#
|
||||||
|
# WARNING: Running nscd with a secondary caching service like sssd may
|
||||||
|
# lead to unexpected behaviour, especially with how long
|
||||||
|
# entries are cached.
|
||||||
|
#
|
||||||
|
# Installation instructions:
|
||||||
|
#
|
||||||
|
# To use 'db', install the appropriate package(s) (provide 'makedb' and
|
||||||
|
# libnss_db.so.*), and place the 'db' in front of 'files' for entries
|
||||||
|
# you want to be looked up first in the databases, like this:
|
||||||
|
#
|
||||||
|
# passwd: db files
|
||||||
|
# shadow: db files
|
||||||
|
# group: db files
|
||||||
|
|
||||||
|
passwd: compat systemd
|
||||||
|
group: compat systemd
|
||||||
|
shadow: compat
|
||||||
|
# Allow initgroups to default to the setting for group.
|
||||||
|
# initgroups: compat
|
||||||
|
|
||||||
|
hosts: files dns
|
||||||
|
networks: files dns
|
||||||
|
|
||||||
|
aliases: files usrfiles
|
||||||
|
ethers: files usrfiles
|
||||||
|
gshadow: files usrfiles
|
||||||
|
netgroup: files nis
|
||||||
|
protocols: files usrfiles
|
||||||
|
publickey: files
|
||||||
|
rpc: files usrfiles
|
||||||
|
services: files usrfiles
|
||||||
|
|
||||||
|
automount: files nis
|
||||||
|
bootparams: files
|
||||||
|
netmasks: files
|
554
posix-memalign-fragmentation.patch
Normal file
554
posix-memalign-fragmentation.patch
Normal file
@ -0,0 +1,554 @@
|
|||||||
|
From 542b1105852568c3ebc712225ae78b8c8ba31a78 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Florian Weimer <fweimer@redhat.com>
|
||||||
|
Date: Fri, 11 Aug 2023 11:18:17 +0200
|
||||||
|
Subject: [PATCH] malloc: Enable merging of remainders in memalign (bug 30723)
|
||||||
|
|
||||||
|
Previously, calling _int_free from _int_memalign could put remainders
|
||||||
|
into the tcache or into fastbins, where they are invisible to the
|
||||||
|
low-level allocator. This results in missed merge opportunities
|
||||||
|
because once these freed chunks become available to the low-level
|
||||||
|
allocator, further memalign allocations (even of the same size are)
|
||||||
|
likely obstructing merges.
|
||||||
|
|
||||||
|
Furthermore, during forwards merging in _int_memalign, do not
|
||||||
|
completely give up when the remainder is too small to serve as a
|
||||||
|
chunk on its own. We can still give it back if it can be merged
|
||||||
|
with the following unused chunk. This makes it more likely that
|
||||||
|
memalign calls in a loop achieve a compact memory layout,
|
||||||
|
independently of initial heap layout.
|
||||||
|
|
||||||
|
Drop some useless (unsigned long) casts along the way, and tweak
|
||||||
|
the style to more closely match GNU on changed lines.
|
||||||
|
|
||||||
|
Reviewed-by: DJ Delorie <dj@redhat.com>
|
||||||
|
---
|
||||||
|
malloc/malloc.c | 197 +++++++++++++++++++++++++++++-------------------
|
||||||
|
1 file changed, 121 insertions(+), 76 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/malloc/malloc.c b/malloc/malloc.c
|
||||||
|
index e2f1a615a4..948f9759af 100644
|
||||||
|
--- a/malloc/malloc.c
|
||||||
|
+++ b/malloc/malloc.c
|
||||||
|
@@ -1086,6 +1086,11 @@ typedef struct malloc_chunk* mchunkptr;
|
||||||
|
|
||||||
|
static void* _int_malloc(mstate, size_t);
|
||||||
|
static void _int_free(mstate, mchunkptr, int);
|
||||||
|
+static void _int_free_merge_chunk (mstate, mchunkptr, INTERNAL_SIZE_T);
|
||||||
|
+static INTERNAL_SIZE_T _int_free_create_chunk (mstate,
|
||||||
|
+ mchunkptr, INTERNAL_SIZE_T,
|
||||||
|
+ mchunkptr, INTERNAL_SIZE_T);
|
||||||
|
+static void _int_free_maybe_consolidate (mstate, INTERNAL_SIZE_T);
|
||||||
|
static void* _int_realloc(mstate, mchunkptr, INTERNAL_SIZE_T,
|
||||||
|
INTERNAL_SIZE_T);
|
||||||
|
static void* _int_memalign(mstate, size_t, size_t);
|
||||||
|
@@ -4637,31 +4642,52 @@ _int_free (mstate av, mchunkptr p, int have_lock)
|
||||||
|
if (!have_lock)
|
||||||
|
__libc_lock_lock (av->mutex);
|
||||||
|
|
||||||
|
- nextchunk = chunk_at_offset(p, size);
|
||||||
|
-
|
||||||
|
- /* Lightweight tests: check whether the block is already the
|
||||||
|
- top block. */
|
||||||
|
- if (__glibc_unlikely (p == av->top))
|
||||||
|
- malloc_printerr ("double free or corruption (top)");
|
||||||
|
- /* Or whether the next chunk is beyond the boundaries of the arena. */
|
||||||
|
- if (__builtin_expect (contiguous (av)
|
||||||
|
- && (char *) nextchunk
|
||||||
|
- >= ((char *) av->top + chunksize(av->top)), 0))
|
||||||
|
- malloc_printerr ("double free or corruption (out)");
|
||||||
|
- /* Or whether the block is actually not marked used. */
|
||||||
|
- if (__glibc_unlikely (!prev_inuse(nextchunk)))
|
||||||
|
- malloc_printerr ("double free or corruption (!prev)");
|
||||||
|
-
|
||||||
|
- nextsize = chunksize(nextchunk);
|
||||||
|
- if (__builtin_expect (chunksize_nomask (nextchunk) <= CHUNK_HDR_SZ, 0)
|
||||||
|
- || __builtin_expect (nextsize >= av->system_mem, 0))
|
||||||
|
- malloc_printerr ("free(): invalid next size (normal)");
|
||||||
|
+ _int_free_merge_chunk (av, p, size);
|
||||||
|
|
||||||
|
- free_perturb (chunk2mem(p), size - CHUNK_HDR_SZ);
|
||||||
|
+ if (!have_lock)
|
||||||
|
+ __libc_lock_unlock (av->mutex);
|
||||||
|
+ }
|
||||||
|
+ /*
|
||||||
|
+ If the chunk was allocated via mmap, release via munmap().
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+ else {
|
||||||
|
+ munmap_chunk (p);
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/* Try to merge chunk P of SIZE bytes with its neighbors. Put the
|
||||||
|
+ resulting chunk on the appropriate bin list. P must not be on a
|
||||||
|
+ bin list yet, and it can be in use. */
|
||||||
|
+static void
|
||||||
|
+_int_free_merge_chunk (mstate av, mchunkptr p, INTERNAL_SIZE_T size)
|
||||||
|
+{
|
||||||
|
+ mchunkptr nextchunk = chunk_at_offset(p, size);
|
||||||
|
+
|
||||||
|
+ /* Lightweight tests: check whether the block is already the
|
||||||
|
+ top block. */
|
||||||
|
+ if (__glibc_unlikely (p == av->top))
|
||||||
|
+ malloc_printerr ("double free or corruption (top)");
|
||||||
|
+ /* Or whether the next chunk is beyond the boundaries of the arena. */
|
||||||
|
+ if (__builtin_expect (contiguous (av)
|
||||||
|
+ && (char *) nextchunk
|
||||||
|
+ >= ((char *) av->top + chunksize(av->top)), 0))
|
||||||
|
+ malloc_printerr ("double free or corruption (out)");
|
||||||
|
+ /* Or whether the block is actually not marked used. */
|
||||||
|
+ if (__glibc_unlikely (!prev_inuse(nextchunk)))
|
||||||
|
+ malloc_printerr ("double free or corruption (!prev)");
|
||||||
|
+
|
||||||
|
+ INTERNAL_SIZE_T nextsize = chunksize(nextchunk);
|
||||||
|
+ if (__builtin_expect (chunksize_nomask (nextchunk) <= CHUNK_HDR_SZ, 0)
|
||||||
|
+ || __builtin_expect (nextsize >= av->system_mem, 0))
|
||||||
|
+ malloc_printerr ("free(): invalid next size (normal)");
|
||||||
|
+
|
||||||
|
+ free_perturb (chunk2mem(p), size - CHUNK_HDR_SZ);
|
||||||
|
|
||||||
|
- /* consolidate backward */
|
||||||
|
- if (!prev_inuse(p)) {
|
||||||
|
- prevsize = prev_size (p);
|
||||||
|
+ /* Consolidate backward. */
|
||||||
|
+ if (!prev_inuse(p))
|
||||||
|
+ {
|
||||||
|
+ INTERNAL_SIZE_T prevsize = prev_size (p);
|
||||||
|
size += prevsize;
|
||||||
|
p = chunk_at_offset(p, -((long) prevsize));
|
||||||
|
if (__glibc_unlikely (chunksize(p) != prevsize))
|
||||||
|
@@ -4669,9 +4695,25 @@ _int_free (mstate av, mchunkptr p, int have_lock)
|
||||||
|
unlink_chunk (av, p);
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (nextchunk != av->top) {
|
||||||
|
+ /* Write the chunk header, maybe after merging with the following chunk. */
|
||||||
|
+ size = _int_free_create_chunk (av, p, size, nextchunk, nextsize);
|
||||||
|
+ _int_free_maybe_consolidate (av, size);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/* Create a chunk at P of SIZE bytes, with SIZE potentially increased
|
||||||
|
+ to cover the immediately following chunk NEXTCHUNK of NEXTSIZE
|
||||||
|
+ bytes (if NEXTCHUNK is unused). The chunk at P is not actually
|
||||||
|
+ read and does not have to be initialized. After creation, it is
|
||||||
|
+ placed on the appropriate bin list. The function returns the size
|
||||||
|
+ of the new chunk. */
|
||||||
|
+static INTERNAL_SIZE_T
|
||||||
|
+_int_free_create_chunk (mstate av, mchunkptr p, INTERNAL_SIZE_T size,
|
||||||
|
+ mchunkptr nextchunk, INTERNAL_SIZE_T nextsize)
|
||||||
|
+{
|
||||||
|
+ if (nextchunk != av->top)
|
||||||
|
+ {
|
||||||
|
/* get and clear inuse bit */
|
||||||
|
- nextinuse = inuse_bit_at_offset(nextchunk, nextsize);
|
||||||
|
+ bool nextinuse = inuse_bit_at_offset (nextchunk, nextsize);
|
||||||
|
|
||||||
|
/* consolidate forward */
|
||||||
|
if (!nextinuse) {
|
||||||
|
@@ -4686,8 +4728,8 @@ _int_free (mstate av, mchunkptr p, int have_lock)
|
||||||
|
been given one chance to be used in malloc.
|
||||||
|
*/
|
||||||
|
|
||||||
|
- bck = unsorted_chunks(av);
|
||||||
|
- fwd = bck->fd;
|
||||||
|
+ mchunkptr bck = unsorted_chunks (av);
|
||||||
|
+ mchunkptr fwd = bck->fd;
|
||||||
|
if (__glibc_unlikely (fwd->bk != bck))
|
||||||
|
malloc_printerr ("free(): corrupted unsorted chunks");
|
||||||
|
p->fd = fwd;
|
||||||
|
@@ -4706,61 +4748,52 @@ _int_free (mstate av, mchunkptr p, int have_lock)
|
||||||
|
check_free_chunk(av, p);
|
||||||
|
}
|
||||||
|
|
||||||
|
- /*
|
||||||
|
- If the chunk borders the current high end of memory,
|
||||||
|
- consolidate into top
|
||||||
|
- */
|
||||||
|
-
|
||||||
|
- else {
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ /* If the chunk borders the current high end of memory,
|
||||||
|
+ consolidate into top. */
|
||||||
|
size += nextsize;
|
||||||
|
set_head(p, size | PREV_INUSE);
|
||||||
|
av->top = p;
|
||||||
|
check_chunk(av, p);
|
||||||
|
}
|
||||||
|
|
||||||
|
- /*
|
||||||
|
- If freeing a large space, consolidate possibly-surrounding
|
||||||
|
- chunks. Then, if the total unused topmost memory exceeds trim
|
||||||
|
- threshold, ask malloc_trim to reduce top.
|
||||||
|
-
|
||||||
|
- Unless max_fast is 0, we don't know if there are fastbins
|
||||||
|
- bordering top, so we cannot tell for sure whether threshold
|
||||||
|
- has been reached unless fastbins are consolidated. But we
|
||||||
|
- don't want to consolidate on each free. As a compromise,
|
||||||
|
- consolidation is performed if FASTBIN_CONSOLIDATION_THRESHOLD
|
||||||
|
- is reached.
|
||||||
|
- */
|
||||||
|
+ return size;
|
||||||
|
+}
|
||||||
|
|
||||||
|
- if ((unsigned long)(size) >= FASTBIN_CONSOLIDATION_THRESHOLD) {
|
||||||
|
+/* If freeing a large space, consolidate possibly-surrounding
|
||||||
|
+ chunks. Then, if the total unused topmost memory exceeds trim
|
||||||
|
+ threshold, ask malloc_trim to reduce top. */
|
||||||
|
+static void
|
||||||
|
+_int_free_maybe_consolidate (mstate av, INTERNAL_SIZE_T size)
|
||||||
|
+{
|
||||||
|
+ /* Unless max_fast is 0, we don't know if there are fastbins
|
||||||
|
+ bordering top, so we cannot tell for sure whether threshold has
|
||||||
|
+ been reached unless fastbins are consolidated. But we don't want
|
||||||
|
+ to consolidate on each free. As a compromise, consolidation is
|
||||||
|
+ performed if FASTBIN_CONSOLIDATION_THRESHOLD is reached. */
|
||||||
|
+ if (size >= FASTBIN_CONSOLIDATION_THRESHOLD)
|
||||||
|
+ {
|
||||||
|
if (atomic_load_relaxed (&av->have_fastchunks))
|
||||||
|
malloc_consolidate(av);
|
||||||
|
|
||||||
|
- if (av == &main_arena) {
|
||||||
|
+ if (av == &main_arena)
|
||||||
|
+ {
|
||||||
|
#ifndef MORECORE_CANNOT_TRIM
|
||||||
|
- if ((unsigned long)(chunksize(av->top)) >=
|
||||||
|
- (unsigned long)(mp_.trim_threshold))
|
||||||
|
- systrim(mp_.top_pad, av);
|
||||||
|
+ if (chunksize (av->top) >= mp_.trim_threshold)
|
||||||
|
+ systrim (mp_.top_pad, av);
|
||||||
|
#endif
|
||||||
|
- } else {
|
||||||
|
- /* Always try heap_trim(), even if the top chunk is not
|
||||||
|
- large, because the corresponding heap might go away. */
|
||||||
|
- heap_info *heap = heap_for_ptr(top(av));
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ /* Always try heap_trim, even if the top chunk is not large,
|
||||||
|
+ because the corresponding heap might go away. */
|
||||||
|
+ heap_info *heap = heap_for_ptr (top (av));
|
||||||
|
|
||||||
|
- assert(heap->ar_ptr == av);
|
||||||
|
- heap_trim(heap, mp_.top_pad);
|
||||||
|
- }
|
||||||
|
+ assert (heap->ar_ptr == av);
|
||||||
|
+ heap_trim (heap, mp_.top_pad);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
-
|
||||||
|
- if (!have_lock)
|
||||||
|
- __libc_lock_unlock (av->mutex);
|
||||||
|
- }
|
||||||
|
- /*
|
||||||
|
- If the chunk was allocated via mmap, release via munmap().
|
||||||
|
- */
|
||||||
|
-
|
||||||
|
- else {
|
||||||
|
- munmap_chunk (p);
|
||||||
|
- }
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -5221,7 +5254,7 @@ _int_memalign (mstate av, size_t alignment, size_t bytes)
|
||||||
|
(av != &main_arena ? NON_MAIN_ARENA : 0));
|
||||||
|
set_inuse_bit_at_offset (newp, newsize);
|
||||||
|
set_head_size (p, leadsize | (av != &main_arena ? NON_MAIN_ARENA : 0));
|
||||||
|
- _int_free (av, p, 1);
|
||||||
|
+ _int_free_merge_chunk (av, p, leadsize);
|
||||||
|
p = newp;
|
||||||
|
|
||||||
|
assert (newsize >= nb &&
|
||||||
|
@@ -5232,15 +5265,27 @@ _int_memalign (mstate av, size_t alignment, size_t bytes)
|
||||||
|
if (!chunk_is_mmapped (p))
|
||||||
|
{
|
||||||
|
size = chunksize (p);
|
||||||
|
- if ((unsigned long) (size) > (unsigned long) (nb + MINSIZE))
|
||||||
|
+ mchunkptr nextchunk = chunk_at_offset(p, size);
|
||||||
|
+ INTERNAL_SIZE_T nextsize = chunksize(nextchunk);
|
||||||
|
+ if (size > nb)
|
||||||
|
{
|
||||||
|
remainder_size = size - nb;
|
||||||
|
- remainder = chunk_at_offset (p, nb);
|
||||||
|
- set_head (remainder, remainder_size | PREV_INUSE |
|
||||||
|
- (av != &main_arena ? NON_MAIN_ARENA : 0));
|
||||||
|
- set_head_size (p, nb);
|
||||||
|
- _int_free (av, remainder, 1);
|
||||||
|
- }
|
||||||
|
+ if (remainder_size >= MINSIZE
|
||||||
|
+ || nextchunk == av->top
|
||||||
|
+ || !inuse_bit_at_offset (nextchunk, nextsize))
|
||||||
|
+ {
|
||||||
|
+ /* We can only give back the tail if it is larger than
|
||||||
|
+ MINSIZE, or if the following chunk is unused (top
|
||||||
|
+ chunk or unused in-heap chunk). Otherwise we would
|
||||||
|
+ create a chunk that is smaller than MINSIZE. */
|
||||||
|
+ remainder = chunk_at_offset (p, nb);
|
||||||
|
+ set_head_size (p, nb);
|
||||||
|
+ remainder_size = _int_free_create_chunk (av, remainder,
|
||||||
|
+ remainder_size,
|
||||||
|
+ nextchunk, nextsize);
|
||||||
|
+ _int_free_maybe_consolidate (av, remainder_size);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
check_inuse_chunk (av, p);
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
||||||
|
From 0dc7fc1cf094406a138e4d1bcf9553e59edcf89d Mon Sep 17 00:00:00 2001
|
||||||
|
From: Florian Weimer <fweimer@redhat.com>
|
||||||
|
Date: Thu, 10 Aug 2023 19:36:56 +0200
|
||||||
|
Subject: [PATCH] malloc: Remove bin scanning from memalign (bug 30723)
|
||||||
|
|
||||||
|
On the test workload (mpv --cache=yes with VP9 video decoding), the
|
||||||
|
bin scanning has a very poor success rate (less than 2%). The tcache
|
||||||
|
scanning has about 50% success rate, so keep that.
|
||||||
|
|
||||||
|
Update comments in malloc/tst-memalign-2 to indicate the purpose
|
||||||
|
of the tests. Even with the scanning removed, the additional
|
||||||
|
merging opportunities since commit 542b1105852568c3ebc712225ae78b
|
||||||
|
("malloc: Enable merging of remainders in memalign (bug 30723)")
|
||||||
|
are sufficient to pass the existing large bins test.
|
||||||
|
|
||||||
|
Remove leftover variables from _int_free from refactoring in the
|
||||||
|
same commit.
|
||||||
|
|
||||||
|
Reviewed-by: DJ Delorie <dj@redhat.com>
|
||||||
|
---
|
||||||
|
malloc/malloc.c | 169 ++--------------------------------------
|
||||||
|
malloc/tst-memalign-2.c | 7 +-
|
||||||
|
2 files changed, 10 insertions(+), 166 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/malloc/malloc.c b/malloc/malloc.c
|
||||||
|
index 948f9759af..d0bbbf3710 100644
|
||||||
|
--- a/malloc/malloc.c
|
||||||
|
+++ b/malloc/malloc.c
|
||||||
|
@@ -4488,12 +4488,6 @@ _int_free (mstate av, mchunkptr p, int have_lock)
|
||||||
|
{
|
||||||
|
INTERNAL_SIZE_T size; /* its size */
|
||||||
|
mfastbinptr *fb; /* associated fastbin */
|
||||||
|
- mchunkptr nextchunk; /* next contiguous chunk */
|
||||||
|
- INTERNAL_SIZE_T nextsize; /* its size */
|
||||||
|
- int nextinuse; /* true if nextchunk is used */
|
||||||
|
- INTERNAL_SIZE_T prevsize; /* size of previous contiguous chunk */
|
||||||
|
- mchunkptr bck; /* misc temp for linking */
|
||||||
|
- mchunkptr fwd; /* misc temp for linking */
|
||||||
|
|
||||||
|
size = chunksize (p);
|
||||||
|
|
||||||
|
@@ -5032,42 +5026,6 @@ _int_realloc (mstate av, mchunkptr oldp, INTERNAL_SIZE_T oldsize,
|
||||||
|
------------------------------ memalign ------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
-/* Returns 0 if the chunk is not and does not contain the requested
|
||||||
|
- aligned sub-chunk, else returns the amount of "waste" from
|
||||||
|
- trimming. NB is the *chunk* byte size, not the user byte
|
||||||
|
- size. */
|
||||||
|
-static size_t
|
||||||
|
-chunk_ok_for_memalign (mchunkptr p, size_t alignment, size_t nb)
|
||||||
|
-{
|
||||||
|
- void *m = chunk2mem (p);
|
||||||
|
- INTERNAL_SIZE_T size = chunksize (p);
|
||||||
|
- void *aligned_m = m;
|
||||||
|
-
|
||||||
|
- if (__glibc_unlikely (misaligned_chunk (p)))
|
||||||
|
- malloc_printerr ("_int_memalign(): unaligned chunk detected");
|
||||||
|
-
|
||||||
|
- aligned_m = PTR_ALIGN_UP (m, alignment);
|
||||||
|
-
|
||||||
|
- INTERNAL_SIZE_T front_extra = (intptr_t) aligned_m - (intptr_t) m;
|
||||||
|
-
|
||||||
|
- /* We can't trim off the front as it's too small. */
|
||||||
|
- if (front_extra > 0 && front_extra < MINSIZE)
|
||||||
|
- return 0;
|
||||||
|
-
|
||||||
|
- /* If it's a perfect fit, it's an exception to the return value rule
|
||||||
|
- (we would return zero waste, which looks like "not usable"), so
|
||||||
|
- handle it here by returning a small non-zero value instead. */
|
||||||
|
- if (size == nb && front_extra == 0)
|
||||||
|
- return 1;
|
||||||
|
-
|
||||||
|
- /* If the block we need fits in the chunk, calculate total waste. */
|
||||||
|
- if (size > nb + front_extra)
|
||||||
|
- return size - nb;
|
||||||
|
-
|
||||||
|
- /* Can't use this chunk. */
|
||||||
|
- return 0;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
/* BYTES is user requested bytes, not requested chunksize bytes. */
|
||||||
|
static void *
|
||||||
|
_int_memalign (mstate av, size_t alignment, size_t bytes)
|
||||||
|
@@ -5082,7 +5040,6 @@ _int_memalign (mstate av, size_t alignment, size_t bytes)
|
||||||
|
mchunkptr remainder; /* spare room at end to split off */
|
||||||
|
unsigned long remainder_size; /* its size */
|
||||||
|
INTERNAL_SIZE_T size;
|
||||||
|
- mchunkptr victim;
|
||||||
|
|
||||||
|
nb = checked_request2size (bytes);
|
||||||
|
if (nb == 0)
|
||||||
|
@@ -5101,129 +5058,13 @@ _int_memalign (mstate av, size_t alignment, size_t bytes)
|
||||||
|
we don't find anything in those bins, the common malloc code will
|
||||||
|
scan starting at 2x. */
|
||||||
|
|
||||||
|
- /* This will be set if we found a candidate chunk. */
|
||||||
|
- victim = NULL;
|
||||||
|
-
|
||||||
|
- /* Fast bins are singly-linked, hard to remove a chunk from the middle
|
||||||
|
- and unlikely to meet our alignment requirements. We have not done
|
||||||
|
- any experimentation with searching for aligned fastbins. */
|
||||||
|
-
|
||||||
|
- if (av != NULL)
|
||||||
|
- {
|
||||||
|
- int first_bin_index;
|
||||||
|
- int first_largebin_index;
|
||||||
|
- int last_bin_index;
|
||||||
|
-
|
||||||
|
- if (in_smallbin_range (nb))
|
||||||
|
- first_bin_index = smallbin_index (nb);
|
||||||
|
- else
|
||||||
|
- first_bin_index = largebin_index (nb);
|
||||||
|
-
|
||||||
|
- if (in_smallbin_range (nb * 2))
|
||||||
|
- last_bin_index = smallbin_index (nb * 2);
|
||||||
|
- else
|
||||||
|
- last_bin_index = largebin_index (nb * 2);
|
||||||
|
-
|
||||||
|
- first_largebin_index = largebin_index (MIN_LARGE_SIZE);
|
||||||
|
-
|
||||||
|
- int victim_index; /* its bin index */
|
||||||
|
-
|
||||||
|
- for (victim_index = first_bin_index;
|
||||||
|
- victim_index < last_bin_index;
|
||||||
|
- victim_index ++)
|
||||||
|
- {
|
||||||
|
- victim = NULL;
|
||||||
|
-
|
||||||
|
- if (victim_index < first_largebin_index)
|
||||||
|
- {
|
||||||
|
- /* Check small bins. Small bin chunks are doubly-linked despite
|
||||||
|
- being the same size. */
|
||||||
|
-
|
||||||
|
- mchunkptr fwd; /* misc temp for linking */
|
||||||
|
- mchunkptr bck; /* misc temp for linking */
|
||||||
|
-
|
||||||
|
- bck = bin_at (av, victim_index);
|
||||||
|
- fwd = bck->fd;
|
||||||
|
- while (fwd != bck)
|
||||||
|
- {
|
||||||
|
- if (chunk_ok_for_memalign (fwd, alignment, nb) > 0)
|
||||||
|
- {
|
||||||
|
- victim = fwd;
|
||||||
|
-
|
||||||
|
- /* Unlink it */
|
||||||
|
- victim->fd->bk = victim->bk;
|
||||||
|
- victim->bk->fd = victim->fd;
|
||||||
|
- break;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- fwd = fwd->fd;
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
- else
|
||||||
|
- {
|
||||||
|
- /* Check large bins. */
|
||||||
|
- mchunkptr fwd; /* misc temp for linking */
|
||||||
|
- mchunkptr bck; /* misc temp for linking */
|
||||||
|
- mchunkptr best = NULL;
|
||||||
|
- size_t best_size = 0;
|
||||||
|
-
|
||||||
|
- bck = bin_at (av, victim_index);
|
||||||
|
- fwd = bck->fd;
|
||||||
|
+ /* Call malloc with worst case padding to hit alignment. */
|
||||||
|
+ m = (char *) (_int_malloc (av, nb + alignment + MINSIZE));
|
||||||
|
|
||||||
|
- while (fwd != bck)
|
||||||
|
- {
|
||||||
|
- int extra;
|
||||||
|
-
|
||||||
|
- if (chunksize (fwd) < nb)
|
||||||
|
- break;
|
||||||
|
- extra = chunk_ok_for_memalign (fwd, alignment, nb);
|
||||||
|
- if (extra > 0
|
||||||
|
- && (extra <= best_size || best == NULL))
|
||||||
|
- {
|
||||||
|
- best = fwd;
|
||||||
|
- best_size = extra;
|
||||||
|
- }
|
||||||
|
+ if (m == 0)
|
||||||
|
+ return 0; /* propagate failure */
|
||||||
|
|
||||||
|
- fwd = fwd->fd;
|
||||||
|
- }
|
||||||
|
- victim = best;
|
||||||
|
-
|
||||||
|
- if (victim != NULL)
|
||||||
|
- {
|
||||||
|
- unlink_chunk (av, victim);
|
||||||
|
- break;
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- if (victim != NULL)
|
||||||
|
- break;
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- /* Strategy: find a spot within that chunk that meets the alignment
|
||||||
|
- request, and then possibly free the leading and trailing space.
|
||||||
|
- This strategy is incredibly costly and can lead to external
|
||||||
|
- fragmentation if header and footer chunks are unused. */
|
||||||
|
-
|
||||||
|
- if (victim != NULL)
|
||||||
|
- {
|
||||||
|
- p = victim;
|
||||||
|
- m = chunk2mem (p);
|
||||||
|
- set_inuse (p);
|
||||||
|
- if (av != &main_arena)
|
||||||
|
- set_non_main_arena (p);
|
||||||
|
- }
|
||||||
|
- else
|
||||||
|
- {
|
||||||
|
- /* Call malloc with worst case padding to hit alignment. */
|
||||||
|
-
|
||||||
|
- m = (char *) (_int_malloc (av, nb + alignment + MINSIZE));
|
||||||
|
-
|
||||||
|
- if (m == 0)
|
||||||
|
- return 0; /* propagate failure */
|
||||||
|
-
|
||||||
|
- p = mem2chunk (m);
|
||||||
|
- }
|
||||||
|
+ p = mem2chunk (m);
|
||||||
|
|
||||||
|
if ((((unsigned long) (m)) % alignment) != 0) /* misaligned */
|
||||||
|
{
|
||||||
|
diff --git a/malloc/tst-memalign-2.c b/malloc/tst-memalign-2.c
|
||||||
|
index f229283dbf..ecd6fa249e 100644
|
||||||
|
--- a/malloc/tst-memalign-2.c
|
||||||
|
+++ b/malloc/tst-memalign-2.c
|
||||||
|
@@ -86,7 +86,8 @@ do_test (void)
|
||||||
|
TEST_VERIFY (tcache_allocs[i].ptr1 == tcache_allocs[i].ptr2);
|
||||||
|
}
|
||||||
|
|
||||||
|
- /* Test for non-head tcache hits. */
|
||||||
|
+ /* Test for non-head tcache hits. This exercises the memalign
|
||||||
|
+ scanning code to find matching allocations. */
|
||||||
|
for (i = 0; i < array_length (ptr); ++ i)
|
||||||
|
{
|
||||||
|
if (i == 4)
|
||||||
|
@@ -113,7 +114,9 @@ do_test (void)
|
||||||
|
free (p);
|
||||||
|
TEST_VERIFY (count > 0);
|
||||||
|
|
||||||
|
- /* Large bins test. */
|
||||||
|
+ /* Large bins test. This verifies that the over-allocated parts
|
||||||
|
+ that memalign releases for future allocations can be reused by
|
||||||
|
+ memalign itself at least in some cases. */
|
||||||
|
|
||||||
|
for (i = 0; i < LN; ++ i)
|
||||||
|
{
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
76
ppc64-flock-fob64.patch
Normal file
76
ppc64-flock-fob64.patch
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
From 434bf72a94de68f0cc7fbf3c44bf38c1911b70cb Mon Sep 17 00:00:00 2001
|
||||||
|
From: Aurelien Jarno <aurelien@aurel32.net>
|
||||||
|
Date: Mon, 28 Aug 2023 23:30:37 +0200
|
||||||
|
Subject: [PATCH] io: Fix record locking contants for powerpc64 with
|
||||||
|
__USE_FILE_OFFSET64
|
||||||
|
|
||||||
|
Commit 5f828ff824e3b7cd1 ("io: Fix F_GETLK, F_SETLK, and F_SETLKW for
|
||||||
|
powerpc64") fixed an issue with the value of the lock constants on
|
||||||
|
powerpc64 when not using __USE_FILE_OFFSET64, but it ended-up also
|
||||||
|
changing the value when using __USE_FILE_OFFSET64 causing an API change.
|
||||||
|
|
||||||
|
Fix that by also checking that define, restoring the pre
|
||||||
|
4d0fe291aed3a476a commit values:
|
||||||
|
|
||||||
|
Default values:
|
||||||
|
- F_GETLK: 5
|
||||||
|
- F_SETLK: 6
|
||||||
|
- F_SETLKW: 7
|
||||||
|
|
||||||
|
With -D_FILE_OFFSET_BITS=64:
|
||||||
|
- F_GETLK: 12
|
||||||
|
- F_SETLK: 13
|
||||||
|
- F_SETLKW: 14
|
||||||
|
|
||||||
|
At the same time, it has been noticed that there was no test for io lock
|
||||||
|
with __USE_FILE_OFFSET64, so just add one.
|
||||||
|
|
||||||
|
Tested on x86_64-linux-gnu, i686-linux-gnu and
|
||||||
|
powerpc64le-unknown-linux-gnu.
|
||||||
|
|
||||||
|
Resolves: BZ #30804.
|
||||||
|
Co-authored-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||||
|
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
|
||||||
|
---
|
||||||
|
io/Makefile | 1 +
|
||||||
|
io/tst-fcntl-lock-lfs.c | 2 ++
|
||||||
|
sysdeps/unix/sysv/linux/powerpc/bits/fcntl.h | 2 +-
|
||||||
|
3 files changed, 4 insertions(+), 1 deletion(-)
|
||||||
|
create mode 100644 io/tst-fcntl-lock-lfs.c
|
||||||
|
|
||||||
|
diff --git a/io/Makefile b/io/Makefile
|
||||||
|
index 6ccc0e8691..8a3c83a3bb 100644
|
||||||
|
--- a/io/Makefile
|
||||||
|
+++ b/io/Makefile
|
||||||
|
@@ -192,6 +192,7 @@ tests := \
|
||||||
|
tst-fchownat \
|
||||||
|
tst-fcntl \
|
||||||
|
tst-fcntl-lock \
|
||||||
|
+ tst-fcntl-lock-lfs \
|
||||||
|
tst-fstatat \
|
||||||
|
tst-fts \
|
||||||
|
tst-fts-lfs \
|
||||||
|
diff --git a/io/tst-fcntl-lock-lfs.c b/io/tst-fcntl-lock-lfs.c
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000000..f2a909fb02
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/io/tst-fcntl-lock-lfs.c
|
||||||
|
@@ -0,0 +1,2 @@
|
||||||
|
+#define _FILE_OFFSET_BITS 64
|
||||||
|
+#include <io/tst-fcntl-lock.c>
|
||||||
|
diff --git a/sysdeps/unix/sysv/linux/powerpc/bits/fcntl.h b/sysdeps/unix/sysv/linux/powerpc/bits/fcntl.h
|
||||||
|
index f7615a447e..d8a291a331 100644
|
||||||
|
--- a/sysdeps/unix/sysv/linux/powerpc/bits/fcntl.h
|
||||||
|
+++ b/sysdeps/unix/sysv/linux/powerpc/bits/fcntl.h
|
||||||
|
@@ -33,7 +33,7 @@
|
||||||
|
# define __O_LARGEFILE 0200000
|
||||||
|
#endif
|
||||||
|
|
||||||
|
-#if __WORDSIZE == 64
|
||||||
|
+#if __WORDSIZE == 64 && !defined __USE_FILE_OFFSET64
|
||||||
|
# define F_GETLK 5
|
||||||
|
# define F_SETLK 6
|
||||||
|
# define F_SETLKW 7
|
||||||
|
--
|
||||||
|
2.42.0
|
||||||
|
|
29
qsort-invalid-cmp.patch
Normal file
29
qsort-invalid-cmp.patch
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
Index: glibc-2.38/stdlib/qsort.c
|
||||||
|
===================================================================
|
||||||
|
--- glibc-2.38.orig/stdlib/qsort.c
|
||||||
|
+++ glibc-2.38/stdlib/qsort.c
|
||||||
|
@@ -136,10 +136,12 @@ _quicksort (void *const pbase, size_t to
|
||||||
|
that this algorithm runs much faster than others. */
|
||||||
|
do
|
||||||
|
{
|
||||||
|
- while ((*cmp) ((void *) left_ptr, (void *) mid, arg) < 0)
|
||||||
|
+ while (left_ptr != mid
|
||||||
|
+ && (*cmp) ((void *) left_ptr, (void *) mid, arg) < 0)
|
||||||
|
left_ptr += size;
|
||||||
|
|
||||||
|
- while ((*cmp) ((void *) mid, (void *) right_ptr, arg) < 0)
|
||||||
|
+ while (right_ptr != mid
|
||||||
|
+ && (*cmp) ((void *) mid, (void *) right_ptr, arg) < 0)
|
||||||
|
right_ptr -= size;
|
||||||
|
|
||||||
|
if (left_ptr < right_ptr)
|
||||||
|
@@ -224,7 +226,8 @@ _quicksort (void *const pbase, size_t to
|
||||||
|
while ((run_ptr += size) <= end_ptr)
|
||||||
|
{
|
||||||
|
tmp_ptr = run_ptr - size;
|
||||||
|
- while ((*cmp) ((void *) run_ptr, (void *) tmp_ptr, arg) < 0)
|
||||||
|
+ while (tmp_ptr != base_ptr
|
||||||
|
+ && (*cmp) ((void *) run_ptr, (void *) tmp_ptr, arg) < 0)
|
||||||
|
tmp_ptr -= size;
|
||||||
|
|
||||||
|
tmp_ptr += size;
|
157
s390-clone-error-clobber-r7.patch
Normal file
157
s390-clone-error-clobber-r7.patch
Normal file
@ -0,0 +1,157 @@
|
|||||||
|
From ee4806e978467d705b26ccb7dfddb9e0a710f8e4 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Stefan Liebler <stli@linux.ibm.com>
|
||||||
|
Date: Thu, 22 Feb 2024 15:03:27 +0100
|
||||||
|
Subject: [PATCH] S390: Do not clobber r7 in clone [BZ #31402]
|
||||||
|
|
||||||
|
Starting with commit e57d8fc97b90127de4ed3e3a9cdf663667580935
|
||||||
|
"S390: Always use svc 0"
|
||||||
|
clone clobbers the call-saved register r7 in error case:
|
||||||
|
function or stack is NULL.
|
||||||
|
|
||||||
|
This patch restores the saved registers also in the error case.
|
||||||
|
Furthermore the existing test misc/tst-clone is extended to check
|
||||||
|
all error cases and that clone does not clobber registers in this
|
||||||
|
error case.
|
||||||
|
|
||||||
|
(cherry picked from commit 02782fd12849b6673cb5c2728cb750e8ec295aa3)
|
||||||
|
Note: Added ia64 __clone2 call to tst-clone.c.
|
||||||
|
---
|
||||||
|
sysdeps/unix/sysv/linux/s390/s390-32/clone.S | 1 +
|
||||||
|
sysdeps/unix/sysv/linux/s390/s390-64/clone.S | 1 +
|
||||||
|
sysdeps/unix/sysv/linux/tst-clone.c | 76 ++++++++++++++++----
|
||||||
|
3 files changed, 65 insertions(+), 13 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/clone.S b/sysdeps/unix/sysv/linux/s390/s390-32/clone.S
|
||||||
|
index 5d8d873383..fd1e509cf4 100644
|
||||||
|
--- a/sysdeps/unix/sysv/linux/s390/s390-32/clone.S
|
||||||
|
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/clone.S
|
||||||
|
@@ -53,6 +53,7 @@ ENTRY(__clone)
|
||||||
|
br %r14
|
||||||
|
error:
|
||||||
|
lhi %r2,-EINVAL
|
||||||
|
+ lm %r6,%r7,24(%r15) /* Load registers. */
|
||||||
|
j SYSCALL_ERROR_LABEL
|
||||||
|
PSEUDO_END (__clone)
|
||||||
|
|
||||||
|
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/clone.S b/sysdeps/unix/sysv/linux/s390/s390-64/clone.S
|
||||||
|
index f1c4288a3d..7b37b18010 100644
|
||||||
|
--- a/sysdeps/unix/sysv/linux/s390/s390-64/clone.S
|
||||||
|
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/clone.S
|
||||||
|
@@ -54,6 +54,7 @@ ENTRY(__clone)
|
||||||
|
br %r14
|
||||||
|
error:
|
||||||
|
lghi %r2,-EINVAL
|
||||||
|
+ lmg %r6,%r7,48(%r15) /* Restore registers. */
|
||||||
|
jg SYSCALL_ERROR_LABEL
|
||||||
|
PSEUDO_END (__clone)
|
||||||
|
|
||||||
|
diff --git a/sysdeps/unix/sysv/linux/tst-clone.c b/sysdeps/unix/sysv/linux/tst-clone.c
|
||||||
|
index 56348707d4..95bd0f6ccb 100644
|
||||||
|
--- a/sysdeps/unix/sysv/linux/tst-clone.c
|
||||||
|
+++ b/sysdeps/unix/sysv/linux/tst-clone.c
|
||||||
|
@@ -16,12 +16,16 @@
|
||||||
|
License along with the GNU C Library; if not, see
|
||||||
|
<https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
-/* BZ #2386 */
|
||||||
|
+/* BZ #2386, BZ #31402 */
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sched.h>
|
||||||
|
+#include <stackinfo.h> /* For _STACK_GROWS_{UP,DOWN}. */
|
||||||
|
+#include <support/check.h>
|
||||||
|
+
|
||||||
|
+volatile unsigned v = 0xdeadbeef;
|
||||||
|
|
||||||
|
#ifdef __ia64__
|
||||||
|
extern int __clone2 (int (*__fn) (void *__arg), void *__child_stack_base,
|
||||||
|
@@ -35,26 +39,72 @@ int child_fn(void *arg)
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
-do_test (void)
|
||||||
|
+__attribute__((noinline))
|
||||||
|
+do_clone (int (*fn)(void *), void *stack)
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
+ unsigned int a = v;
|
||||||
|
+ unsigned int b = v;
|
||||||
|
+ unsigned int c = v;
|
||||||
|
+ unsigned int d = v;
|
||||||
|
+ unsigned int e = v;
|
||||||
|
+ unsigned int f = v;
|
||||||
|
+ unsigned int g = v;
|
||||||
|
+ unsigned int h = v;
|
||||||
|
+ unsigned int i = v;
|
||||||
|
+ unsigned int j = v;
|
||||||
|
+ unsigned int k = v;
|
||||||
|
+ unsigned int l = v;
|
||||||
|
+ unsigned int m = v;
|
||||||
|
+ unsigned int n = v;
|
||||||
|
+ unsigned int o = v;
|
||||||
|
|
||||||
|
#ifdef __ia64__
|
||||||
|
- result = __clone2 (child_fn, NULL, 0, 0, NULL, NULL, NULL);
|
||||||
|
+ result = __clone2 (fn, stack, stack != NULL ? 128 * 1024 : 0, 0, NULL, NULL,
|
||||||
|
+ NULL);
|
||||||
|
+#else
|
||||||
|
+ result = clone (fn, stack, 0, NULL);
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
+ /* Check that clone does not clobber call-saved registers. */
|
||||||
|
+ TEST_VERIFY (a == v && b == v && c == v && d == v && e == v && f == v
|
||||||
|
+ && g == v && h == v && i == v && j == v && k == v && l == v
|
||||||
|
+ && m == v && n == v && o == v);
|
||||||
|
+
|
||||||
|
+ return result;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+__attribute__((noinline))
|
||||||
|
+do_test_single (int (*fn)(void *), void *stack)
|
||||||
|
+{
|
||||||
|
+ printf ("%s (fn=%p, stack=%p)\n", __FUNCTION__, fn, stack);
|
||||||
|
+ errno = 0;
|
||||||
|
+
|
||||||
|
+ int result = do_clone (fn, stack);
|
||||||
|
+
|
||||||
|
+ TEST_COMPARE (errno, EINVAL);
|
||||||
|
+ TEST_COMPARE (result, -1);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int
|
||||||
|
+do_test (void)
|
||||||
|
+{
|
||||||
|
+ char st[128 * 1024] __attribute__ ((aligned));
|
||||||
|
+ void *stack = NULL;
|
||||||
|
+#if defined __ia64__ || _STACK_GROWS_UP
|
||||||
|
+ stack = st;
|
||||||
|
+#elif _STACK_GROWS_DOWN
|
||||||
|
+ stack = st + sizeof (st);
|
||||||
|
#else
|
||||||
|
- result = clone (child_fn, NULL, 0, NULL);
|
||||||
|
+# error "Define either _STACK_GROWS_DOWN or _STACK_GROWS_UP"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
- if (errno != EINVAL || result != -1)
|
||||||
|
- {
|
||||||
|
- printf ("FAIL: clone()=%d (wanted -1) errno=%d (wanted %d)\n",
|
||||||
|
- result, errno, EINVAL);
|
||||||
|
- return 1;
|
||||||
|
- }
|
||||||
|
+ do_test_single (child_fn, NULL);
|
||||||
|
+ do_test_single (NULL, stack);
|
||||||
|
+ do_test_single (NULL, NULL);
|
||||||
|
|
||||||
|
- puts ("All OK");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
-#define TEST_FUNCTION do_test ()
|
||||||
|
-#include "../test-skeleton.c"
|
||||||
|
+#include <support/test-driver.c>
|
||||||
|
--
|
||||||
|
2.44.0
|
||||||
|
|
92
sem-open-o-creat.patch
Normal file
92
sem-open-o-creat.patch
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
From 63dbbc5c52f9823f86270f32fce20d1e91cdf484 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Sergio Durigan Junior <sergiodj@sergiodj.net>
|
||||||
|
Date: Wed, 1 Nov 2023 18:15:23 -0400
|
||||||
|
Subject: [PATCH] sysdeps: sem_open: Clear O_CREAT when semaphore file is
|
||||||
|
expected to exist [BZ #30789]
|
||||||
|
|
||||||
|
When invoking sem_open with O_CREAT as one of its flags, we'll end up
|
||||||
|
in the second part of sem_open's "if ((oflag & O_CREAT) == 0 || (oflag
|
||||||
|
& O_EXCL) == 0)", which means that we don't expect the semaphore file
|
||||||
|
to exist.
|
||||||
|
|
||||||
|
In that part, open_flags is initialized as "O_RDWR | O_CREAT | O_EXCL
|
||||||
|
| O_CLOEXEC" and there's an attempt to open(2) the file, which will
|
||||||
|
likely fail because it won't exist. After that first (expected)
|
||||||
|
failure, some cleanup is done and we go back to the label "try_again",
|
||||||
|
which lives in the first part of the aforementioned "if".
|
||||||
|
|
||||||
|
The problem is that, in that part of the code, we expect the semaphore
|
||||||
|
file to exist, and as such O_CREAT (this time the flag we pass to
|
||||||
|
open(2)) needs to be cleaned from open_flags, otherwise we'll see
|
||||||
|
another failure (this time unexpected) when trying to open the file,
|
||||||
|
which will lead the call to sem_open to fail as well.
|
||||||
|
|
||||||
|
This can cause very strange bugs, especially with OpenMPI, which makes
|
||||||
|
extensive use of semaphores.
|
||||||
|
|
||||||
|
Fix the bug by simplifying the logic when choosing open(2) flags and
|
||||||
|
making sure O_CREAT is not set when the semaphore file is expected to
|
||||||
|
exist.
|
||||||
|
|
||||||
|
A regression test for this issue would require a complex and cpu time
|
||||||
|
consuming logic, since to trigger the wrong code path is not
|
||||||
|
straightforward due the racy condition. There is a somewhat reliable
|
||||||
|
reproducer in the bug, but it requires using OpenMPI.
|
||||||
|
|
||||||
|
This resolves BZ #30789.
|
||||||
|
|
||||||
|
See also: https://bugs.launchpad.net/ubuntu/+source/h5py/+bug/2031912
|
||||||
|
|
||||||
|
Signed-off-by: Sergio Durigan Junior <sergiodj@sergiodj.net>
|
||||||
|
Co-Authored-By: Simon Chopin <simon.chopin@canonical.com>
|
||||||
|
Co-Authored-By: Adhemerval Zanella Netto <adhemerval.zanella@linaro.org>
|
||||||
|
Fixes: 533deafbdf189f5fbb280c28562dd43ace2f4b0f ("Use O_CLOEXEC in more places (BZ #15722)")
|
||||||
|
(cherry picked from commit f957f47df75b9fab995754011491edebc6feb147)
|
||||||
|
---
|
||||||
|
NEWS | 2 ++
|
||||||
|
sysdeps/pthread/sem_open.c | 10 ++++------
|
||||||
|
2 files changed, 6 insertions(+), 6 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/sysdeps/pthread/sem_open.c b/sysdeps/pthread/sem_open.c
|
||||||
|
index e5db929d20..0e331a7445 100644
|
||||||
|
--- a/sysdeps/pthread/sem_open.c
|
||||||
|
+++ b/sysdeps/pthread/sem_open.c
|
||||||
|
@@ -32,11 +32,12 @@
|
||||||
|
# define __unlink unlink
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+#define SEM_OPEN_FLAGS (O_RDWR | O_NOFOLLOW | O_CLOEXEC)
|
||||||
|
+
|
||||||
|
sem_t *
|
||||||
|
__sem_open (const char *name, int oflag, ...)
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
- int open_flags;
|
||||||
|
sem_t *result;
|
||||||
|
|
||||||
|
/* Check that shared futexes are supported. */
|
||||||
|
@@ -65,10 +66,8 @@ __sem_open (const char *name, int oflag, ...)
|
||||||
|
/* If the semaphore object has to exist simply open it. */
|
||||||
|
if ((oflag & O_CREAT) == 0 || (oflag & O_EXCL) == 0)
|
||||||
|
{
|
||||||
|
- open_flags = O_RDWR | O_NOFOLLOW | O_CLOEXEC;
|
||||||
|
- open_flags |= (oflag & ~(O_CREAT|O_ACCMODE));
|
||||||
|
try_again:
|
||||||
|
- fd = __open (dirname.name, open_flags);
|
||||||
|
+ fd = __open (dirname.name, (oflag & O_EXCL) | SEM_OPEN_FLAGS);
|
||||||
|
|
||||||
|
if (fd == -1)
|
||||||
|
{
|
||||||
|
@@ -135,8 +134,7 @@ __sem_open (const char *name, int oflag, ...)
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Open the file. Make sure we do not overwrite anything. */
|
||||||
|
- open_flags = O_RDWR | O_CREAT | O_EXCL | O_CLOEXEC;
|
||||||
|
- fd = __open (tmpfname, open_flags, mode);
|
||||||
|
+ fd = __open (tmpfname, O_CREAT | O_EXCL | SEM_OPEN_FLAGS, mode);
|
||||||
|
if (fd == -1)
|
||||||
|
{
|
||||||
|
if (errno == EEXIST)
|
||||||
|
--
|
||||||
|
2.43.0
|
||||||
|
|
32
setxid-propagate-glibc-tunables.patch
Normal file
32
setxid-propagate-glibc-tunables.patch
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
From 73e3fcd1a552783e66ff1f65c5f322e2f17a81d1 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Siddhesh Poyarekar <siddhesh@sourceware.org>
|
||||||
|
Date: Tue, 19 Sep 2023 13:25:40 -0400
|
||||||
|
Subject: [PATCH] Propagate GLIBC_TUNABLES in setxid binaries
|
||||||
|
|
||||||
|
GLIBC_TUNABLES scrubbing happens earlier than envvar scrubbing and some
|
||||||
|
tunables are required to propagate past setxid boundary, like their
|
||||||
|
env_alias. Rely on tunable scrubbing to clean out GLIBC_TUNABLES like
|
||||||
|
before, restoring behaviour in glibc 2.37 and earlier.
|
||||||
|
|
||||||
|
Signed-off-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
|
||||||
|
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
|
||||||
|
(cherry picked from commit 0d5f9ea97f1b39f2a855756078771673a68497e1)
|
||||||
|
---
|
||||||
|
sysdeps/generic/unsecvars.h | 1 -
|
||||||
|
1 file changed, 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/sysdeps/generic/unsecvars.h b/sysdeps/generic/unsecvars.h
|
||||||
|
index 81397fb90b..8278c50a84 100644
|
||||||
|
--- a/sysdeps/generic/unsecvars.h
|
||||||
|
+++ b/sysdeps/generic/unsecvars.h
|
||||||
|
@@ -4,7 +4,6 @@
|
||||||
|
#define UNSECURE_ENVVARS \
|
||||||
|
"GCONV_PATH\0" \
|
||||||
|
"GETCONF_DIR\0" \
|
||||||
|
- "GLIBC_TUNABLES\0" \
|
||||||
|
"HOSTALIASES\0" \
|
||||||
|
"LD_AUDIT\0" \
|
||||||
|
"LD_DEBUG\0" \
|
||||||
|
--
|
||||||
|
2.42.0
|
||||||
|
|
75
sle-nsswitch.conf
Normal file
75
sle-nsswitch.conf
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
#
|
||||||
|
# /etc/nsswitch.conf
|
||||||
|
#
|
||||||
|
# An example Name Service Switch config file. This file should be
|
||||||
|
# sorted with the most-used services at the beginning.
|
||||||
|
#
|
||||||
|
# Valid databases are: aliases, ethers, group, gshadow, hosts,
|
||||||
|
# initgroups, netgroup, networks, passwd, protocols, publickey,
|
||||||
|
# rpc, services, and shadow.
|
||||||
|
#
|
||||||
|
# Valid service provider entries include (in alphabetical order):
|
||||||
|
#
|
||||||
|
# compat Use /etc files plus *_compat pseudo-db
|
||||||
|
# db Use the pre-processed /var/db files
|
||||||
|
# dns Use DNS (Domain Name Service)
|
||||||
|
# files Use the local files in /etc
|
||||||
|
# hesiod Use Hesiod (DNS) for user lookups
|
||||||
|
# nis Use NIS (NIS version 2), also called YP
|
||||||
|
# nisplus Use NIS+ (NIS version 3)
|
||||||
|
#
|
||||||
|
# See `info libc 'NSS Basics'` for more information.
|
||||||
|
#
|
||||||
|
# Commonly used alternative service providers (may need installation):
|
||||||
|
#
|
||||||
|
# ldap Use LDAP directory server
|
||||||
|
# myhostname Use systemd host names
|
||||||
|
# mymachines Use systemd machine names
|
||||||
|
# mdns*, mdns*_minimal Use Avahi mDNS/DNS-SD
|
||||||
|
# resolve Use systemd resolved resolver
|
||||||
|
# sss Use System Security Services Daemon (sssd)
|
||||||
|
# systemd Use systemd for dynamic user option
|
||||||
|
# winbind Use Samba winbind support
|
||||||
|
# wins Use Samba wins support
|
||||||
|
# wrapper Use wrapper module for testing
|
||||||
|
#
|
||||||
|
# Notes:
|
||||||
|
#
|
||||||
|
# 'sssd' performs its own 'files'-based caching, so it should generally
|
||||||
|
# come before 'files'.
|
||||||
|
#
|
||||||
|
# WARNING: Running nscd with a secondary caching service like sssd may
|
||||||
|
# lead to unexpected behaviour, especially with how long
|
||||||
|
# entries are cached.
|
||||||
|
#
|
||||||
|
# Installation instructions:
|
||||||
|
#
|
||||||
|
# To use 'db', install the appropriate package(s) (provide 'makedb' and
|
||||||
|
# libnss_db.so.*), and place the 'db' in front of 'files' for entries
|
||||||
|
# you want to be looked up first in the databases, like this:
|
||||||
|
#
|
||||||
|
# passwd: db files
|
||||||
|
# shadow: db files
|
||||||
|
# group: db files
|
||||||
|
|
||||||
|
passwd: compat
|
||||||
|
group: compat
|
||||||
|
shadow: compat
|
||||||
|
# Allow initgroups to default to the setting for group.
|
||||||
|
# initgroups: compat
|
||||||
|
|
||||||
|
hosts: files dns
|
||||||
|
networks: files dns
|
||||||
|
|
||||||
|
aliases: files usrfiles
|
||||||
|
ethers: files usrfiles
|
||||||
|
gshadow: files usrfiles
|
||||||
|
netgroup: files nis
|
||||||
|
protocols: files usrfiles
|
||||||
|
publickey: files
|
||||||
|
rpc: files usrfiles
|
||||||
|
services: files usrfiles
|
||||||
|
|
||||||
|
automount: files nis
|
||||||
|
bootparams: files
|
||||||
|
netmasks: files
|
213
syslog-buffer-overflow.patch
Normal file
213
syslog-buffer-overflow.patch
Normal file
@ -0,0 +1,213 @@
|
|||||||
|
diff --git a/misc/Makefile b/misc/Makefile
|
||||||
|
index 42899c2b6c..c273ec6974 100644
|
||||||
|
--- a/misc/Makefile
|
||||||
|
+++ b/misc/Makefile
|
||||||
|
@@ -289,7 +289,10 @@ tests-special += $(objpfx)tst-error1-mem.out \
|
||||||
|
$(objpfx)tst-allocate_once-mem.out
|
||||||
|
endif
|
||||||
|
|
||||||
|
-tests-container := tst-syslog
|
||||||
|
+tests-container := \
|
||||||
|
+ tst-syslog \
|
||||||
|
+ tst-syslog-long-progname \
|
||||||
|
+ # tests-container
|
||||||
|
|
||||||
|
CFLAGS-select.c += -fexceptions -fasynchronous-unwind-tables
|
||||||
|
CFLAGS-tsearch.c += $(uses-callbacks)
|
||||||
|
@@ -351,6 +354,9 @@ $(objpfx)tst-allocate_once-mem.out: $(objpfx)tst-allocate_once.out
|
||||||
|
$(common-objpfx)malloc/mtrace $(objpfx)tst-allocate_once.mtrace > $@; \
|
||||||
|
$(evaluate-test)
|
||||||
|
|
||||||
|
+tst-syslog-long-progname-ENV = GLIBC_TUNABLES=glibc.malloc.check=3 \
|
||||||
|
+ LD_PRELOAD=libc_malloc_debug.so.0
|
||||||
|
+
|
||||||
|
$(objpfx)tst-select: $(librt)
|
||||||
|
$(objpfx)tst-select-time64: $(librt)
|
||||||
|
$(objpfx)tst-pselect: $(librt)
|
||||||
|
diff --git a/misc/syslog.c b/misc/syslog.c
|
||||||
|
index 1b8cb722c5..4af87f54fd 100644
|
||||||
|
--- a/misc/syslog.c
|
||||||
|
+++ b/misc/syslog.c
|
||||||
|
@@ -41,6 +41,7 @@ static char sccsid[] = "@(#)syslog.c 8.4 (Berkeley) 3/18/94";
|
||||||
|
#include <sys/uio.h>
|
||||||
|
#include <sys/un.h>
|
||||||
|
#include <syslog.h>
|
||||||
|
+#include <limits.h>
|
||||||
|
|
||||||
|
static int LogType = SOCK_DGRAM; /* type of socket connection */
|
||||||
|
static int LogFile = -1; /* fd for log */
|
||||||
|
@@ -124,8 +125,9 @@ __vsyslog_internal (int pri, const char *fmt, va_list ap,
|
||||||
|
{
|
||||||
|
/* Try to use a static buffer as an optimization. */
|
||||||
|
char bufs[1024];
|
||||||
|
- char *buf = NULL;
|
||||||
|
- size_t bufsize = 0;
|
||||||
|
+ char *buf = bufs;
|
||||||
|
+ size_t bufsize;
|
||||||
|
+
|
||||||
|
int msgoff;
|
||||||
|
int saved_errno = errno;
|
||||||
|
|
||||||
|
@@ -177,29 +179,55 @@ __vsyslog_internal (int pri, const char *fmt, va_list ap,
|
||||||
|
#define SYSLOG_HEADER_WITHOUT_TS(__pri, __msgoff) \
|
||||||
|
"<%d>: %n", __pri, __msgoff
|
||||||
|
|
||||||
|
- int l;
|
||||||
|
+ int l, vl;
|
||||||
|
if (has_ts)
|
||||||
|
l = __snprintf (bufs, sizeof bufs,
|
||||||
|
SYSLOG_HEADER (pri, timestamp, &msgoff, pid));
|
||||||
|
else
|
||||||
|
l = __snprintf (bufs, sizeof bufs,
|
||||||
|
SYSLOG_HEADER_WITHOUT_TS (pri, &msgoff));
|
||||||
|
- if (0 <= l && l < sizeof bufs)
|
||||||
|
+ if (l < 0)
|
||||||
|
+ goto out;
|
||||||
|
+
|
||||||
|
+ char *pos;
|
||||||
|
+ size_t len;
|
||||||
|
+
|
||||||
|
+ if (l < sizeof bufs)
|
||||||
|
{
|
||||||
|
- va_list apc;
|
||||||
|
- va_copy (apc, ap);
|
||||||
|
+ /* At this point, there is still a chance that we can print the
|
||||||
|
+ remaining part of the log into bufs and use that. */
|
||||||
|
+ pos = bufs + l;
|
||||||
|
+ len = sizeof (bufs) - l;
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ buf = NULL;
|
||||||
|
+ /* We already know that bufs is too small to use for this log message.
|
||||||
|
+ The next vsnprintf into bufs is used only to calculate the total
|
||||||
|
+ required buffer length. We will discard bufs contents and allocate
|
||||||
|
+ an appropriately sized buffer later instead. */
|
||||||
|
+ pos = bufs;
|
||||||
|
+ len = sizeof (bufs);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
- /* Restore errno for %m format. */
|
||||||
|
- __set_errno (saved_errno);
|
||||||
|
+ {
|
||||||
|
+ va_list apc;
|
||||||
|
+ va_copy (apc, ap);
|
||||||
|
|
||||||
|
- int vl = __vsnprintf_internal (bufs + l, sizeof bufs - l, fmt, apc,
|
||||||
|
- mode_flags);
|
||||||
|
- if (0 <= vl && vl < sizeof bufs - l)
|
||||||
|
- buf = bufs;
|
||||||
|
- bufsize = l + vl;
|
||||||
|
+ /* Restore errno for %m format. */
|
||||||
|
+ __set_errno (saved_errno);
|
||||||
|
|
||||||
|
- va_end (apc);
|
||||||
|
- }
|
||||||
|
+ vl = __vsnprintf_internal (pos, len, fmt, apc, mode_flags);
|
||||||
|
+ va_end (apc);
|
||||||
|
+
|
||||||
|
+ if (vl < 0 || vl >= INT_MAX - l)
|
||||||
|
+ goto out;
|
||||||
|
+
|
||||||
|
+ if (vl >= len)
|
||||||
|
+ buf = NULL;
|
||||||
|
+
|
||||||
|
+ bufsize = l + vl;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
if (buf == NULL)
|
||||||
|
{
|
||||||
|
@@ -209,25 +237,37 @@ __vsyslog_internal (int pri, const char *fmt, va_list ap,
|
||||||
|
/* Tell the cancellation handler to free this buffer. */
|
||||||
|
clarg.buf = buf;
|
||||||
|
|
||||||
|
+ int cl;
|
||||||
|
if (has_ts)
|
||||||
|
- __snprintf (buf, l + 1,
|
||||||
|
- SYSLOG_HEADER (pri, timestamp, &msgoff, pid));
|
||||||
|
+ cl = __snprintf (buf, l + 1,
|
||||||
|
+ SYSLOG_HEADER (pri, timestamp, &msgoff, pid));
|
||||||
|
else
|
||||||
|
- __snprintf (buf, l + 1,
|
||||||
|
- SYSLOG_HEADER_WITHOUT_TS (pri, &msgoff));
|
||||||
|
+ cl = __snprintf (buf, l + 1,
|
||||||
|
+ SYSLOG_HEADER_WITHOUT_TS (pri, &msgoff));
|
||||||
|
+ if (cl != l)
|
||||||
|
+ goto out;
|
||||||
|
|
||||||
|
va_list apc;
|
||||||
|
va_copy (apc, ap);
|
||||||
|
- __vsnprintf_internal (buf + l, bufsize - l + 1, fmt, apc,
|
||||||
|
- mode_flags);
|
||||||
|
+ cl = __vsnprintf_internal (buf + l, bufsize - l + 1, fmt, apc,
|
||||||
|
+ mode_flags);
|
||||||
|
va_end (apc);
|
||||||
|
+
|
||||||
|
+ if (cl != vl)
|
||||||
|
+ goto out;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
+ int bl;
|
||||||
|
/* Nothing much to do but emit an error message. */
|
||||||
|
- bufsize = __snprintf (bufs, sizeof bufs,
|
||||||
|
- "out of memory[%d]", __getpid ());
|
||||||
|
+ bl = __snprintf (bufs, sizeof bufs,
|
||||||
|
+ "out of memory[%d]", __getpid ());
|
||||||
|
+ if (bl < 0 || bl >= sizeof bufs)
|
||||||
|
+ goto out;
|
||||||
|
+
|
||||||
|
+ bufsize = bl;
|
||||||
|
buf = bufs;
|
||||||
|
+ msgoff = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
diff --git a/misc/tst-syslog-long-progname.c b/misc/tst-syslog-long-progname.c
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000000..88f37a8a00
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/misc/tst-syslog-long-progname.c
|
||||||
|
@@ -0,0 +1,39 @@
|
||||||
|
+/* Test heap buffer overflow in syslog with long __progname (CVE-2023-6246)
|
||||||
|
+ Copyright (C) 2023 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, see
|
||||||
|
+ <https://www.gnu.org/licenses/>. */
|
||||||
|
+
|
||||||
|
+#include <syslog.h>
|
||||||
|
+#include <string.h>
|
||||||
|
+
|
||||||
|
+extern char * __progname;
|
||||||
|
+
|
||||||
|
+static int
|
||||||
|
+do_test (void)
|
||||||
|
+{
|
||||||
|
+ char long_progname[2048];
|
||||||
|
+
|
||||||
|
+ memset (long_progname, 'X', sizeof (long_progname) - 1);
|
||||||
|
+ long_progname[sizeof (long_progname) - 1] = '\0';
|
||||||
|
+
|
||||||
|
+ __progname = long_progname;
|
||||||
|
+
|
||||||
|
+ syslog (LOG_INFO, "Hello, World!");
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+#include <support/test-driver.c>
|
||||||
|
diff --git a/misc/tst-syslog-long-progname.root/postclean.req b/misc/tst-syslog-long-progname.root/postclean.req
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000000..e69de29bb2
|
53
tls-modid-reuse.patch
Normal file
53
tls-modid-reuse.patch
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
From ccdc4cba07684fe1397e1f5f134a0a827af98c04 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Hector Martin <marcan@marcan.st>
|
||||||
|
Date: Tue, 28 Nov 2023 15:23:07 +0900
|
||||||
|
Subject: [PATCH] elf: Fix TLS modid reuse generation assignment (BZ 29039)
|
||||||
|
|
||||||
|
_dl_assign_tls_modid() assigns a slotinfo entry for a new module, but
|
||||||
|
does *not* do anything to the generation counter. The first time this
|
||||||
|
happens, the generation is zero and map_generation() returns the current
|
||||||
|
generation to be used during relocation processing. However, if
|
||||||
|
a slotinfo entry is later reused, it will already have a generation
|
||||||
|
assigned. If this generation has fallen behind the current global max
|
||||||
|
generation, then this causes an obsolete generation to be assigned
|
||||||
|
during relocation processing, as map_generation() returns this
|
||||||
|
generation if nonzero. _dl_add_to_slotinfo() eventually resets the
|
||||||
|
generation, but by then it is too late. This causes DTV updates to be
|
||||||
|
skipped, leading to NULL or broken TLS slot pointers and segfaults.
|
||||||
|
|
||||||
|
Fix this by resetting the generation to zero in _dl_assign_tls_modid(),
|
||||||
|
so it behaves the same as the first time a slot is assigned.
|
||||||
|
_dl_add_to_slotinfo() will still assign the correct static generation
|
||||||
|
later during module load, but relocation processing will no longer use
|
||||||
|
an obsolete generation.
|
||||||
|
|
||||||
|
Note that slotinfo entry (aka modid) reuse typically happens after a
|
||||||
|
dlclose and only TLS access via dynamic tlsdesc is affected. Because
|
||||||
|
tlsdesc is optimized to use the optional part of static TLS, dynamic
|
||||||
|
tlsdesc can be avoided by increasing the glibc.rtld.optional_static_tls
|
||||||
|
tunable to a large enough value, or by LD_PRELOAD-ing the affected
|
||||||
|
modules.
|
||||||
|
|
||||||
|
Fixes bug 29039.
|
||||||
|
|
||||||
|
Reviewed-by: Szabolcs Nagy <szabolcs.nagy@arm.com>
|
||||||
|
(cherry picked from commit 3921c5b40f293c57cb326f58713c924b0662ef59)
|
||||||
|
---
|
||||||
|
elf/dl-tls.c | 1 +
|
||||||
|
1 file changed, 1 insertion(+)
|
||||||
|
|
||||||
|
diff --git a/elf/dl-tls.c b/elf/dl-tls.c
|
||||||
|
index 99b83ca696..1f6f820819 100644
|
||||||
|
--- a/elf/dl-tls.c
|
||||||
|
+++ b/elf/dl-tls.c
|
||||||
|
@@ -154,6 +154,7 @@ _dl_assign_tls_modid (struct link_map *l)
|
||||||
|
{
|
||||||
|
/* Mark the entry as used, so any dependency see it. */
|
||||||
|
atomic_store_relaxed (&runp->slotinfo[result - disp].map, l);
|
||||||
|
+ atomic_store_relaxed (&runp->slotinfo[result - disp].gen, 0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
--
|
||||||
|
2.43.0
|
||||||
|
|
157
tunables-string-parsing.patch
Normal file
157
tunables-string-parsing.patch
Normal file
@ -0,0 +1,157 @@
|
|||||||
|
From 750a45a783906a19591fb8ff6b7841470f1f5701 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Siddhesh Poyarekar <siddhesh@sourceware.org>
|
||||||
|
Date: Tue, 19 Sep 2023 18:39:32 -0400
|
||||||
|
Subject: [PATCH] tunables: Terminate if end of input is reached
|
||||||
|
(CVE-2023-4911)
|
||||||
|
|
||||||
|
The string parsing routine may end up writing beyond bounds of tunestr
|
||||||
|
if the input tunable string is malformed, of the form name=name=val.
|
||||||
|
This gets processed twice, first as name=name=val and next as name=val,
|
||||||
|
resulting in tunestr being name=name=val:name=val, thus overflowing
|
||||||
|
tunestr.
|
||||||
|
|
||||||
|
Terminate the parsing loop at the first instance itself so that tunestr
|
||||||
|
does not overflow.
|
||||||
|
|
||||||
|
This also fixes up tst-env-setuid-tunables to actually handle failures
|
||||||
|
correct and add new tests to validate the fix for this CVE.
|
||||||
|
|
||||||
|
Signed-off-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
|
||||||
|
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
|
||||||
|
(cherry picked from commit 1056e5b4c3f2d90ed2b4a55f96add28da2f4c8fa)
|
||||||
|
---
|
||||||
|
NEWS | 5 +++++
|
||||||
|
elf/dl-tunables.c | 17 +++++++++-------
|
||||||
|
elf/tst-env-setuid-tunables.c | 37 +++++++++++++++++++++++++++--------
|
||||||
|
3 files changed, 44 insertions(+), 15 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/elf/dl-tunables.c b/elf/dl-tunables.c
|
||||||
|
index 62b7332d95..cae67efa0a 100644
|
||||||
|
--- a/elf/dl-tunables.c
|
||||||
|
+++ b/elf/dl-tunables.c
|
||||||
|
@@ -180,11 +180,7 @@ parse_tunables (char *tunestr, char *valstring)
|
||||||
|
/* If we reach the end of the string before getting a valid name-value
|
||||||
|
pair, bail out. */
|
||||||
|
if (p[len] == '\0')
|
||||||
|
- {
|
||||||
|
- if (__libc_enable_secure)
|
||||||
|
- tunestr[off] = '\0';
|
||||||
|
- return;
|
||||||
|
- }
|
||||||
|
+ break;
|
||||||
|
|
||||||
|
/* We did not find a valid name-value pair before encountering the
|
||||||
|
colon. */
|
||||||
|
@@ -244,9 +240,16 @@ parse_tunables (char *tunestr, char *valstring)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (p[len] != '\0')
|
||||||
|
- p += len + 1;
|
||||||
|
+ /* We reached the end while processing the tunable string. */
|
||||||
|
+ if (p[len] == '\0')
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
+ p += len + 1;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ /* Terminate tunestr before we leave. */
|
||||||
|
+ if (__libc_enable_secure)
|
||||||
|
+ tunestr[off] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Enable the glibc.malloc.check tunable in SETUID/SETGID programs only when
|
||||||
|
diff --git a/elf/tst-env-setuid-tunables.c b/elf/tst-env-setuid-tunables.c
|
||||||
|
index 7dfb0e073a..f0b92c97e7 100644
|
||||||
|
--- a/elf/tst-env-setuid-tunables.c
|
||||||
|
+++ b/elf/tst-env-setuid-tunables.c
|
||||||
|
@@ -50,6 +50,8 @@ const char *teststrings[] =
|
||||||
|
"glibc.malloc.perturb=0x800:not_valid.malloc.check=2:glibc.malloc.mmap_threshold=4096",
|
||||||
|
"glibc.not_valid.check=2:glibc.malloc.mmap_threshold=4096",
|
||||||
|
"not_valid.malloc.check=2:glibc.malloc.mmap_threshold=4096",
|
||||||
|
+ "glibc.malloc.mmap_threshold=glibc.malloc.mmap_threshold=4096",
|
||||||
|
+ "glibc.malloc.check=2",
|
||||||
|
"glibc.malloc.garbage=2:glibc.maoc.mmap_threshold=4096:glibc.malloc.check=2",
|
||||||
|
"glibc.malloc.check=4:glibc.malloc.garbage=2:glibc.maoc.mmap_threshold=4096",
|
||||||
|
":glibc.malloc.garbage=2:glibc.malloc.check=1",
|
||||||
|
@@ -68,6 +70,8 @@ const char *resultstrings[] =
|
||||||
|
"glibc.malloc.perturb=0x800:glibc.malloc.mmap_threshold=4096",
|
||||||
|
"glibc.malloc.mmap_threshold=4096",
|
||||||
|
"glibc.malloc.mmap_threshold=4096",
|
||||||
|
+ "glibc.malloc.mmap_threshold=glibc.malloc.mmap_threshold=4096",
|
||||||
|
+ "",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
@@ -81,11 +85,18 @@ test_child (int off)
|
||||||
|
{
|
||||||
|
const char *val = getenv ("GLIBC_TUNABLES");
|
||||||
|
|
||||||
|
+ printf (" [%d] GLIBC_TUNABLES is %s\n", off, val);
|
||||||
|
+ fflush (stdout);
|
||||||
|
if (val != NULL && strcmp (val, resultstrings[off]) == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (val != NULL)
|
||||||
|
- printf ("[%d] Unexpected GLIBC_TUNABLES VALUE %s\n", off, val);
|
||||||
|
+ printf (" [%d] Unexpected GLIBC_TUNABLES VALUE %s, expected %s\n",
|
||||||
|
+ off, val, resultstrings[off]);
|
||||||
|
+ else
|
||||||
|
+ printf (" [%d] GLIBC_TUNABLES environment variable absent\n", off);
|
||||||
|
+
|
||||||
|
+ fflush (stdout);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
@@ -106,21 +117,26 @@ do_test (int argc, char **argv)
|
||||||
|
if (ret != 0)
|
||||||
|
exit (1);
|
||||||
|
|
||||||
|
- exit (EXIT_SUCCESS);
|
||||||
|
+ /* Special return code to make sure that the child executed all the way
|
||||||
|
+ through. */
|
||||||
|
+ exit (42);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
- int ret = 0;
|
||||||
|
-
|
||||||
|
/* Spawn tests. */
|
||||||
|
for (int i = 0; i < array_length (teststrings); i++)
|
||||||
|
{
|
||||||
|
char buf[INT_BUFSIZE_BOUND (int)];
|
||||||
|
|
||||||
|
- printf ("Spawned test for %s (%d)\n", teststrings[i], i);
|
||||||
|
+ printf ("[%d] Spawned test for %s\n", i, teststrings[i]);
|
||||||
|
snprintf (buf, sizeof (buf), "%d\n", i);
|
||||||
|
+ fflush (stdout);
|
||||||
|
if (setenv ("GLIBC_TUNABLES", teststrings[i], 1) != 0)
|
||||||
|
- exit (1);
|
||||||
|
+ {
|
||||||
|
+ printf (" [%d] Failed to set GLIBC_TUNABLES: %m", i);
|
||||||
|
+ support_record_failure ();
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
int status = support_capture_subprogram_self_sgid (buf);
|
||||||
|
|
||||||
|
@@ -128,9 +144,14 @@ do_test (int argc, char **argv)
|
||||||
|
if (WEXITSTATUS (status) == EXIT_UNSUPPORTED)
|
||||||
|
return EXIT_UNSUPPORTED;
|
||||||
|
|
||||||
|
- ret |= status;
|
||||||
|
+ if (WEXITSTATUS (status) != 42)
|
||||||
|
+ {
|
||||||
|
+ printf (" [%d] child failed with status %d\n", i,
|
||||||
|
+ WEXITSTATUS (status));
|
||||||
|
+ support_record_failure ();
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
- return ret;
|
||||||
|
+ return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
--
|
||||||
|
2.42.0
|
||||||
|
|
258
ulp-prologue-into-asm-functions.patch
Normal file
258
ulp-prologue-into-asm-functions.patch
Normal file
@ -0,0 +1,258 @@
|
|||||||
|
From 65bb10c34ff3734373a8b4be4e707f0494449f17 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Giuliano Belinassi <gbelinassi@suse.de>
|
||||||
|
Date: Wed, 24 May 2023 18:03:15 -0300
|
||||||
|
Subject: [PATCH] Add Userspace Livepatch prologue into ASM functions
|
||||||
|
|
||||||
|
Userspace Live Patching (ULP) refers to the process of applying
|
||||||
|
patches to the libraries used by a running process, without
|
||||||
|
interrupting it. In order to archive this, functions must have
|
||||||
|
the NOP prologue. This prologue is included automatically when
|
||||||
|
compiled with -fpatchable-function-entry, but for ASM functions
|
||||||
|
this have to be included manually. This patch does this.
|
||||||
|
|
||||||
|
Signed-off-by: Giuliano Belinassi <gbelinassi@suse.de>
|
||||||
|
---
|
||||||
|
Makeconfig | 5 +++++
|
||||||
|
config.h.in | 3 +++
|
||||||
|
config.make.in | 1 +
|
||||||
|
configure | 21 +++++++++++++++++++++
|
||||||
|
configure.ac | 13 +++++++++++++
|
||||||
|
sysdeps/x86/sysdep.h | 22 ++++++++++++++++++----
|
||||||
|
sysdeps/x86_64/multiarch/strcmp-avx2.S | 5 +----
|
||||||
|
sysdeps/x86_64/multiarch/strcmp-evex.S | 5 +----
|
||||||
|
sysdeps/x86_64/multiarch/strcmp-sse4_2.S | 5 +----
|
||||||
|
sysdeps/x86_64/sysdep.h | 13 +++++++++++++
|
||||||
|
10 files changed, 77 insertions(+), 16 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/Makeconfig b/Makeconfig
|
||||||
|
index 77d7fd14df..765d72bcf5 100644
|
||||||
|
--- a/Makeconfig
|
||||||
|
+++ b/Makeconfig
|
||||||
|
@@ -984,6 +984,11 @@ else
|
||||||
|
+cflags += $(no-fortify-source)
|
||||||
|
endif
|
||||||
|
|
||||||
|
+# Add flags for Userspace Livepatching support.
|
||||||
|
+ifeq (yes,$(enable-userspace-livepatch))
|
||||||
|
++cflags += -fpatchable-function-entry=16,14
|
||||||
|
+endif
|
||||||
|
+
|
||||||
|
# Each sysdeps directory can contain header files that both will be
|
||||||
|
# used to compile and will be installed. Each can also contain an
|
||||||
|
# include/ subdirectory, whose header files will be used to compile
|
||||||
|
diff --git a/config.h.in b/config.h.in
|
||||||
|
index 0dedc124f7..08b1868002 100644
|
||||||
|
--- a/config.h.in
|
||||||
|
+++ b/config.h.in
|
||||||
|
@@ -204,6 +204,9 @@
|
||||||
|
/* Define to 1 if libpthread actually resides in libc. */
|
||||||
|
#define PTHREAD_IN_LIBC 0
|
||||||
|
|
||||||
|
+/* Define to 1 if support for userspace livepatching is enabled. */
|
||||||
|
+#define ENABLE_USERSPACE_LIVEPATCH 0
|
||||||
|
+
|
||||||
|
/* An integer used to scale the timeout of test programs. */
|
||||||
|
#define TIMEOUTFACTOR 1
|
||||||
|
|
||||||
|
diff --git a/config.make.in b/config.make.in
|
||||||
|
index d487a4f4e9..e48351c59a 100644
|
||||||
|
--- a/config.make.in
|
||||||
|
+++ b/config.make.in
|
||||||
|
@@ -85,6 +85,7 @@ nss-crypt = @libc_cv_nss_crypt@
|
||||||
|
static-nss-crypt = @libc_cv_static_nss_crypt@
|
||||||
|
|
||||||
|
# Configuration options.
|
||||||
|
+enable-userspace-livepatch = @enable_userspace_livepatch@
|
||||||
|
build-shared = @shared@
|
||||||
|
build-profile = @profile@
|
||||||
|
build-static-nss = @static_nss@
|
||||||
|
diff --git a/configure b/configure
|
||||||
|
index c02c0b5825..e2000fdc4a 100755
|
||||||
|
--- a/configure
|
||||||
|
+++ b/configure
|
||||||
|
@@ -622,6 +622,7 @@ LIBOBJS
|
||||||
|
pthread_in_libc
|
||||||
|
RELEASE
|
||||||
|
VERSION
|
||||||
|
+enable_userspace_livepatch
|
||||||
|
mach_interface_list
|
||||||
|
DEFINES
|
||||||
|
static_nss
|
||||||
|
@@ -819,6 +820,7 @@ enable_cet
|
||||||
|
enable_scv
|
||||||
|
enable_fortify_source
|
||||||
|
with_cpu
|
||||||
|
+enable_userspace_livepatch
|
||||||
|
'
|
||||||
|
ac_precious_vars='build_alias
|
||||||
|
host_alias
|
||||||
|
@@ -1501,6 +1503,8 @@ Optional Features:
|
||||||
|
Use -D_FORTIFY_SOURCE=[1|2|3] to control code
|
||||||
|
hardening, defaults to highest possible value
|
||||||
|
supported by the build compiler.
|
||||||
|
+ --enable-userspace-livepatch
|
||||||
|
+ build with userspace livepatch support [default=no]
|
||||||
|
|
||||||
|
Optional Packages:
|
||||||
|
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
|
||||||
|
@@ -8004,6 +8008,23 @@ libc_cv_multidir=`${CC-cc} $CFLAGS $CPPFLAGS -print-multi-directory`
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
+# Check whether --enable-userspace-livepatch was given.
|
||||||
|
+if test ${enable_userspace_livepatch+y}
|
||||||
|
+then :
|
||||||
|
+ enableval=$enable_userspace_livepatch; enable_userspace_livepatch=$enableval
|
||||||
|
+else $as_nop
|
||||||
|
+ enable_userspace_livepatch=no
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+# Libpulp uses -fpatchable-function-entry to add padding NOPS to the
|
||||||
|
+# prologue of all functions.
|
||||||
|
+if test "x$enable_userspace_livepatch" = xyes; then
|
||||||
|
+ printf "%s\n" "#define ENABLE_USERSPACE_LIVEPATCH 1" >>confdefs.h
|
||||||
|
+
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+
|
||||||
|
VERSION=`sed -n -e 's/^#define VERSION "\([^"]*\)"/\1/p' < $srcdir/version.h`
|
||||||
|
RELEASE=`sed -n -e 's/^#define RELEASE "\([^"]*\)"/\1/p' < $srcdir/version.h`
|
||||||
|
|
||||||
|
diff --git a/configure.ac b/configure.ac
|
||||||
|
index 09553541fb..a07e3d6284 100644
|
||||||
|
--- a/configure.ac
|
||||||
|
+++ b/configure.ac
|
||||||
|
@@ -1827,6 +1827,19 @@ AC_SUBST(DEFINES)
|
||||||
|
dnl See sysdeps/mach/configure.ac for this variable.
|
||||||
|
AC_SUBST(mach_interface_list)
|
||||||
|
|
||||||
|
+AC_ARG_ENABLE([userspace-livepatch],
|
||||||
|
+ AS_HELP_STRING([--enable-userspace-livepatch],
|
||||||
|
+ [build with userspace livepatch support @<:@default=no@:>@]),
|
||||||
|
+ [enable_userspace_livepatch=$enableval],
|
||||||
|
+ [enable_userspace_livepatch=no])
|
||||||
|
+
|
||||||
|
+# Libpulp uses -fpatchable-function-entry to add padding NOPS to the
|
||||||
|
+# prologue of all functions.
|
||||||
|
+if test "x$enable_userspace_livepatch" = xyes; then
|
||||||
|
+ AC_DEFINE(ENABLE_USERSPACE_LIVEPATCH)
|
||||||
|
+fi
|
||||||
|
+AC_SUBST(enable_userspace_livepatch)
|
||||||
|
+
|
||||||
|
VERSION=`sed -n -e 's/^#define VERSION "\([^"]*\)"/\1/p' < $srcdir/version.h`
|
||||||
|
RELEASE=`sed -n -e 's/^#define RELEASE "\([^"]*\)"/\1/p' < $srcdir/version.h`
|
||||||
|
AC_SUBST(VERSION)
|
||||||
|
diff --git a/sysdeps/x86/sysdep.h b/sysdeps/x86/sysdep.h
|
||||||
|
index 0b3483a77a..329c16306e 100644
|
||||||
|
--- a/sysdeps/x86/sysdep.h
|
||||||
|
+++ b/sysdeps/x86/sysdep.h
|
||||||
|
@@ -77,15 +77,29 @@ enum cf_protection_level
|
||||||
|
#define ALIGNARG(log2) 1<<log2
|
||||||
|
#define ASM_SIZE_DIRECTIVE(name) .size name,.-name;
|
||||||
|
|
||||||
|
+/* For 32-bit glibc then define those macros as empty. */
|
||||||
|
+#ifndef ULP_PRE_PROLOGUE
|
||||||
|
+# define ULP_PRE_PROLOGUE
|
||||||
|
+#endif
|
||||||
|
+#ifndef ULP_POST_PROLOGUE
|
||||||
|
+# define ULP_POST_PROLOGUE
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
+/* Define the first instructions of a function. */
|
||||||
|
+#define FUNCTION_START(name) \
|
||||||
|
+ ULP_PRE_PROLOGUE; \
|
||||||
|
+ C_LABEL(name); \
|
||||||
|
+ cfi_startproc; \
|
||||||
|
+ _CET_ENDBR; \
|
||||||
|
+ ULP_POST_PROLOGUE; \
|
||||||
|
+ CALL_MCOUNT;
|
||||||
|
+
|
||||||
|
/* Define an entry point visible from C. */
|
||||||
|
#define ENTRY_P2ALIGN(name, alignment) \
|
||||||
|
.globl C_SYMBOL_NAME(name); \
|
||||||
|
.type C_SYMBOL_NAME(name),@function; \
|
||||||
|
.align ALIGNARG(alignment); \
|
||||||
|
- C_LABEL(name) \
|
||||||
|
- cfi_startproc; \
|
||||||
|
- _CET_ENDBR; \
|
||||||
|
- CALL_MCOUNT
|
||||||
|
+ FUNCTION_START(name)
|
||||||
|
|
||||||
|
/* Common entry 16 byte aligns. */
|
||||||
|
#define ENTRY(name) ENTRY_P2ALIGN (name, 4)
|
||||||
|
diff --git a/sysdeps/x86_64/multiarch/strcmp-avx2.S b/sysdeps/x86_64/multiarch/strcmp-avx2.S
|
||||||
|
index 8804338d75..d3584b2c5d 100644
|
||||||
|
--- a/sysdeps/x86_64/multiarch/strcmp-avx2.S
|
||||||
|
+++ b/sysdeps/x86_64/multiarch/strcmp-avx2.S
|
||||||
|
@@ -201,10 +201,7 @@ END (STRCASECMP)
|
||||||
|
# endif
|
||||||
|
|
||||||
|
.p2align 4
|
||||||
|
-STRCMP:
|
||||||
|
- cfi_startproc
|
||||||
|
- _CET_ENDBR
|
||||||
|
- CALL_MCOUNT
|
||||||
|
+FUNCTION_START(STRCMP)
|
||||||
|
|
||||||
|
# if defined USE_AS_STRCASECMP_L
|
||||||
|
/* We have to fall back on the C implementation for locales with
|
||||||
|
diff --git a/sysdeps/x86_64/multiarch/strcmp-evex.S b/sysdeps/x86_64/multiarch/strcmp-evex.S
|
||||||
|
index ae39cdf217..44a8d4cee7 100644
|
||||||
|
--- a/sysdeps/x86_64/multiarch/strcmp-evex.S
|
||||||
|
+++ b/sysdeps/x86_64/multiarch/strcmp-evex.S
|
||||||
|
@@ -224,10 +224,7 @@ END (STRCASECMP)
|
||||||
|
# endif
|
||||||
|
|
||||||
|
.p2align 4
|
||||||
|
-STRCMP:
|
||||||
|
- cfi_startproc
|
||||||
|
- _CET_ENDBR
|
||||||
|
- CALL_MCOUNT
|
||||||
|
+FUNCTION_START(STRCMP)
|
||||||
|
|
||||||
|
# if defined USE_AS_STRCASECMP_L
|
||||||
|
/* We have to fall back on the C implementation for locales with
|
||||||
|
diff --git a/sysdeps/x86_64/multiarch/strcmp-sse4_2.S b/sysdeps/x86_64/multiarch/strcmp-sse4_2.S
|
||||||
|
index cbb22884eb..327377daa6 100644
|
||||||
|
--- a/sysdeps/x86_64/multiarch/strcmp-sse4_2.S
|
||||||
|
+++ b/sysdeps/x86_64/multiarch/strcmp-sse4_2.S
|
||||||
|
@@ -103,10 +103,7 @@ END (STRCASECMP)
|
||||||
|
|
||||||
|
# define arg arg
|
||||||
|
|
||||||
|
-STRCMP:
|
||||||
|
- cfi_startproc
|
||||||
|
- _CET_ENDBR
|
||||||
|
- CALL_MCOUNT
|
||||||
|
+FUNCTION_START(STRCMP)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This implementation uses SSE to compare up to 16 bytes at a time.
|
||||||
|
diff --git a/sysdeps/x86_64/sysdep.h b/sysdeps/x86_64/sysdep.h
|
||||||
|
index 6ca169573d..c18f0ef914 100644
|
||||||
|
--- a/sysdeps/x86_64/sysdep.h
|
||||||
|
+++ b/sysdeps/x86_64/sysdep.h
|
||||||
|
@@ -24,6 +24,19 @@
|
||||||
|
|
||||||
|
#ifdef __ASSEMBLER__
|
||||||
|
|
||||||
|
+/* Libpulp uses -fpatchable-function-entry to add padding NOPS to the
|
||||||
|
+ prologue of all functions. This works for C functions. For functions
|
||||||
|
+ written in ASM, the way we do this is by adding this prologue manually. */
|
||||||
|
+
|
||||||
|
+#if ENABLE_USERSPACE_LIVEPATCH
|
||||||
|
+# undef ULP_PRE_PROLOGUE
|
||||||
|
+# undef ULP_POST_PROLOGUE
|
||||||
|
+# define ULP_PRE_PROLOGUE \
|
||||||
|
+ .rept 14; nop; .endr
|
||||||
|
+# define ULP_POST_PROLOGUE \
|
||||||
|
+ xchg %ax, %ax
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
/* Syntactic details of assembler. */
|
||||||
|
|
||||||
|
/* This macro is for setting proper CFI with DW_CFA_expression describing
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
Loading…
Reference in New Issue
Block a user