update to glibc-2.28-236.7.src.rpm
Signed-off-by: Zhao Hang <wb-zh951434@alibaba-inc.com>
This commit is contained in:
parent
41a2dbfa26
commit
7d4578be05
33 changed files with 1678 additions and 28435 deletions
|
@ -1,34 +0,0 @@
|
|||
From c5de7c407853b807e8d0c764e6325bb1311f39cd Mon Sep 17 00:00:00 2001
|
||||
From: Xing Li <lixing@loongson.cn>
|
||||
Date: Tue, 4 Jul 2023 15:10:03 +0800
|
||||
Subject: [PATCH 2/2] Fix tst-cancel21.c to suit kernel struct sigcontext
|
||||
change. * nptl/tst-cancel21.c
|
||||
|
||||
---
|
||||
nptl/tst-cancel21.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/nptl/tst-cancel21.c b/nptl/tst-cancel21.c
|
||||
index b10fdbc1..a3653f21 100644
|
||||
--- a/nptl/tst-cancel21.c
|
||||
+++ b/nptl/tst-cancel21.c
|
||||
@@ -217,14 +217,14 @@ static int
|
||||
do_test (void)
|
||||
{
|
||||
stack_t ss;
|
||||
- ss.ss_sp = malloc (2 * SIGSTKSZ);
|
||||
+ ss.ss_sp = malloc (4 * SIGSTKSZ);
|
||||
if (ss.ss_sp == NULL)
|
||||
{
|
||||
puts ("failed to allocate alternate stack");
|
||||
return 1;
|
||||
}
|
||||
ss.ss_flags = 0;
|
||||
- ss.ss_size = 2 * SIGSTKSZ;
|
||||
+ ss.ss_size = 4 * SIGSTKSZ;
|
||||
if (sigaltstack (&ss, NULL) < 0)
|
||||
{
|
||||
printf ("sigaltstack failed %m\n");
|
||||
--
|
||||
2.27.0
|
||||
|
2
dist
2
dist
|
@ -1 +1 @@
|
|||
an8_8
|
||||
an8_9
|
||||
|
|
|
@ -1,147 +0,0 @@
|
|||
From 58f93dff514cc0bdf3c72eff590dcf5fe5bf9e00 Mon Sep 17 00:00:00 2001
|
||||
From: "H.J. Lu" <hjl.tools@gmail.com>
|
||||
Date: Wed, 19 Jul 2023 23:09:09 +0800
|
||||
Subject: [PATCH 3/6] Add a testcase to check alignment of PT_LOAD segment [BZ
|
||||
#28676]
|
||||
|
||||
Backport from master commit: fc2334a
|
||||
|
||||
Signed-off-by: Rongwei Wang <rongwei.wang@linux.alibaba.com>
|
||||
---
|
||||
elf/Makefile | 13 ++++++++++++-
|
||||
elf/tst-align3.c | 38 ++++++++++++++++++++++++++++++++++++++
|
||||
elf/tst-alignmod3.c | 32 ++++++++++++++++++++++++++++++++
|
||||
3 files changed, 82 insertions(+), 1 deletion(-)
|
||||
create mode 100644 elf/tst-align3.c
|
||||
create mode 100644 elf/tst-alignmod3.c
|
||||
|
||||
diff --git a/elf/Makefile b/elf/Makefile
|
||||
index 634c3113..442817ca 100644
|
||||
--- a/elf/Makefile
|
||||
+++ b/elf/Makefile
|
||||
@@ -331,6 +331,7 @@ tests += \
|
||||
tst-addr1 \
|
||||
tst-align \
|
||||
tst-align2 \
|
||||
+ tst-align3 \
|
||||
tst-audit-tlsdesc \
|
||||
tst-audit-tlsdesc-dlopen \
|
||||
tst-audit1 \
|
||||
@@ -466,7 +467,9 @@ endif
|
||||
test-srcs = \
|
||||
tst-pathopt
|
||||
# tests-srcs
|
||||
-
|
||||
+ifeq (yes,$(have-fpie))
|
||||
+tests-pie += tst-align3
|
||||
+endif
|
||||
selinux-enabled := $(shell cat /selinux/enforce 2> /dev/null)
|
||||
|
||||
ifneq ($(selinux-enabled),1)
|
||||
@@ -647,6 +650,7 @@ modules-names = \
|
||||
tst-absolute-zero-lib \
|
||||
tst-alignmod \
|
||||
tst-alignmod2 \
|
||||
+ tst-alignmod3 \
|
||||
tst-array2dep \
|
||||
tst-array5dep \
|
||||
tst-audit-tlsdesc-mod1 \
|
||||
@@ -1669,6 +1673,13 @@ CFLAGS-tst-alignmod2.c += $(stack-align-test-flags)
|
||||
$(objpfx)tst-align: $(libdl)
|
||||
$(objpfx)tst-align.out: $(objpfx)tst-alignmod.so
|
||||
$(objpfx)tst-align2: $(objpfx)tst-alignmod2.so
|
||||
+$(objpfx)tst-align3: $(objpfx)tst-alignmod3.so
|
||||
+ifeq (yes,$(have-fpie))
|
||||
+CFLAGS-tst-align3.c += $(PIE-ccflag)
|
||||
+endif
|
||||
+LDFLAGS-tst-align3 += -Wl,-z,max-page-size=0x200000
|
||||
+LDFLAGS-tst-alignmod3.so += -Wl,-z,max-page-size=0x200000
|
||||
+$(objpfx)tst-alignmod3.so: $(libsupport)
|
||||
|
||||
$(objpfx)unload3: $(libdl)
|
||||
$(objpfx)unload3.out: $(objpfx)unload3mod1.so $(objpfx)unload3mod2.so \
|
||||
diff --git a/elf/tst-align3.c b/elf/tst-align3.c
|
||||
new file mode 100644
|
||||
index 00000000..ac86d623
|
||||
--- /dev/null
|
||||
+++ b/elf/tst-align3.c
|
||||
@@ -0,0 +1,38 @@
|
||||
+/* Check alignment of PT_LOAD segment in a shared library.
|
||||
+ Copyright (C) 2021 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 <support/check.h>
|
||||
+#include <tst-stack-align.h>
|
||||
+
|
||||
+/* This should cover all possible page sizes we currently support. */
|
||||
+#define ALIGN 0x200000
|
||||
+
|
||||
+int bar __attribute__ ((aligned (ALIGN))) = 1;
|
||||
+
|
||||
+extern int do_load_test (void);
|
||||
+
|
||||
+static int
|
||||
+do_test (void)
|
||||
+{
|
||||
+ printf ("bar: %p\n", &bar);
|
||||
+ TEST_VERIFY (is_aligned (&bar, ALIGN) == 0);
|
||||
+
|
||||
+ return do_load_test ();
|
||||
+}
|
||||
+
|
||||
+#include <support/test-driver.c>
|
||||
diff --git a/elf/tst-alignmod3.c b/elf/tst-alignmod3.c
|
||||
new file mode 100644
|
||||
index 00000000..0d33f237
|
||||
--- /dev/null
|
||||
+++ b/elf/tst-alignmod3.c
|
||||
@@ -0,0 +1,32 @@
|
||||
+/* Check alignment of PT_LOAD segment in a shared library.
|
||||
+ Copyright (C) 2021 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 <support/check.h>
|
||||
+#include <tst-stack-align.h>
|
||||
+
|
||||
+/* This should cover all possible page sizes we currently support. */
|
||||
+#define ALIGN 0x200000
|
||||
+
|
||||
+int foo __attribute__ ((aligned (ALIGN))) = 1;
|
||||
+
|
||||
+void
|
||||
+do_load_test (void)
|
||||
+{
|
||||
+ printf ("foo: %p\n", &foo);
|
||||
+ TEST_VERIFY (is_aligned (&foo, ALIGN) == 0);
|
||||
+}
|
||||
--
|
||||
2.27.0
|
||||
|
|
@ -1,325 +0,0 @@
|
|||
From 6152628751bf13f74c9336263a9c22f29ccd8ffb Mon Sep 17 00:00:00 2001
|
||||
From: "H.J. Lu" <hjl.tools@gmail.com>
|
||||
Date: Wed, 19 Jul 2023 23:01:53 +0800
|
||||
Subject: [PATCH 1/6] Properly check stack alignment [BZ #27901]
|
||||
|
||||
1. Replace
|
||||
|
||||
if ((((uintptr_t) &_d) & (__alignof (double) - 1)) != 0)
|
||||
|
||||
which may be optimized out by compiler, with
|
||||
|
||||
int
|
||||
__attribute__ ((weak, noclone, noinline))
|
||||
is_aligned (void *p, int align)
|
||||
{
|
||||
return (((uintptr_t) p) & (align - 1)) != 0;
|
||||
}
|
||||
|
||||
2. Add TEST_STACK_ALIGN_INIT to TEST_STACK_ALIGN.
|
||||
3. Add a common TEST_STACK_ALIGN_INIT to check 16-byte stack alignment
|
||||
for both i386 and x86-64.
|
||||
4. Update powerpc to use TEST_STACK_ALIGN_INIT.
|
||||
|
||||
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
|
||||
Signed-off-by: Rongwei Wang <rongwei.wang@linux.alibaba.com>
|
||||
---
|
||||
sysdeps/generic/tst-stack-align.h | 40 ++++++++++++++++---------
|
||||
sysdeps/i386/i686/tst-stack-align.h | 44 ---------------------------
|
||||
sysdeps/i386/tst-stack-align.h | 41 -------------------------
|
||||
sysdeps/powerpc/tst-stack-align.h | 27 +++++------------
|
||||
sysdeps/x86/tst-stack-align.h | 28 ++++++++++++++++++
|
||||
sysdeps/x86_64/tst-stack-align.h | 46 -----------------------------
|
||||
6 files changed, 61 insertions(+), 165 deletions(-)
|
||||
delete mode 100644 sysdeps/i386/i686/tst-stack-align.h
|
||||
delete mode 100644 sysdeps/i386/tst-stack-align.h
|
||||
create mode 100644 sysdeps/x86/tst-stack-align.h
|
||||
delete mode 100644 sysdeps/x86_64/tst-stack-align.h
|
||||
|
||||
diff --git a/sysdeps/generic/tst-stack-align.h b/sysdeps/generic/tst-stack-align.h
|
||||
index e5cb3310..e6050901 100644
|
||||
--- a/sysdeps/generic/tst-stack-align.h
|
||||
+++ b/sysdeps/generic/tst-stack-align.h
|
||||
@@ -1,4 +1,5 @@
|
||||
-/* Copyright (C) 2003-2018 Free Software Foundation, Inc.
|
||||
+/* Check stack alignment. Generic version.
|
||||
+ Copyright (C) 2003-2021 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
|
||||
@@ -18,17 +19,28 @@
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
|
||||
+int
|
||||
+__attribute__ ((weak, noclone, noinline))
|
||||
+is_aligned (void *p, int align)
|
||||
+{
|
||||
+ return (((uintptr_t) p) & (align - 1)) != 0;
|
||||
+}
|
||||
+
|
||||
+#ifndef TEST_STACK_ALIGN_INIT
|
||||
+# define TEST_STACK_ALIGN_INIT() 0
|
||||
+#endif
|
||||
+
|
||||
#define TEST_STACK_ALIGN() \
|
||||
- ({ \
|
||||
- double _d = 12.0; \
|
||||
- long double _ld = 15.0; \
|
||||
- int _ret = 0; \
|
||||
- printf ("double: %g %p %zu\n", _d, &_d, __alignof (double)); \
|
||||
- if ((((uintptr_t) &_d) & (__alignof (double) - 1)) != 0) \
|
||||
- _ret = 1; \
|
||||
- \
|
||||
- printf ("ldouble: %Lg %p %zu\n", _ld, &_ld, __alignof (long double)); \
|
||||
- if ((((uintptr_t) &_ld) & (__alignof (long double) - 1)) != 0) \
|
||||
- _ret = 1; \
|
||||
- _ret; \
|
||||
- })
|
||||
+ ({ \
|
||||
+ double _d = 12.0; \
|
||||
+ long double _ld = 15.0; \
|
||||
+ int _ret = TEST_STACK_ALIGN_INIT (); \
|
||||
+ \
|
||||
+ printf ("double: %g %p %zu\n", _d, &_d, __alignof (double)); \
|
||||
+ _ret += is_aligned (&_d, __alignof (double)); \
|
||||
+ \
|
||||
+ printf ("ldouble: %Lg %p %zu\n", _ld, &_ld, \
|
||||
+ __alignof (long double)); \
|
||||
+ _ret += is_aligned (&_ld, __alignof (long double)); \
|
||||
+ _ret; \
|
||||
+ })
|
||||
diff --git a/sysdeps/i386/i686/tst-stack-align.h b/sysdeps/i386/i686/tst-stack-align.h
|
||||
deleted file mode 100644
|
||||
index 975f26ef..00000000
|
||||
--- a/sysdeps/i386/i686/tst-stack-align.h
|
||||
+++ /dev/null
|
||||
@@ -1,44 +0,0 @@
|
||||
-/* Copyright (C) 2003-2018 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
|
||||
- <http://www.gnu.org/licenses/>. */
|
||||
-
|
||||
-#include <stdio.h>
|
||||
-#include <stdint.h>
|
||||
-#ifndef __SSE__
|
||||
-#include_next <tst-stack-align.h>
|
||||
-#else
|
||||
-#include <xmmintrin.h>
|
||||
-
|
||||
-#define TEST_STACK_ALIGN() \
|
||||
- ({ \
|
||||
- __m128 _m; \
|
||||
- double _d = 12.0; \
|
||||
- long double _ld = 15.0; \
|
||||
- int _ret = 0; \
|
||||
- printf ("__m128: %p %zu\n", &_m, __alignof (__m128)); \
|
||||
- if ((((uintptr_t) &_m) & (__alignof (__m128) - 1)) != 0) \
|
||||
- _ret = 1; \
|
||||
- \
|
||||
- printf ("double: %g %p %zu\n", _d, &_d, __alignof (double)); \
|
||||
- if ((((uintptr_t) &_d) & (__alignof (double) - 1)) != 0) \
|
||||
- _ret = 1; \
|
||||
- \
|
||||
- printf ("ldouble: %Lg %p %zu\n", _ld, &_ld, __alignof (long double)); \
|
||||
- if ((((uintptr_t) &_ld) & (__alignof (long double) - 1)) != 0) \
|
||||
- _ret = 1; \
|
||||
- _ret; \
|
||||
- })
|
||||
-#endif
|
||||
diff --git a/sysdeps/i386/tst-stack-align.h b/sysdeps/i386/tst-stack-align.h
|
||||
deleted file mode 100644
|
||||
index 394ff773..00000000
|
||||
--- a/sysdeps/i386/tst-stack-align.h
|
||||
+++ /dev/null
|
||||
@@ -1,41 +0,0 @@
|
||||
-/* Copyright (C) 2004-2018 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
|
||||
- <http://www.gnu.org/licenses/>. */
|
||||
-
|
||||
-#include <stdio.h>
|
||||
-#include <stdint.h>
|
||||
-
|
||||
-typedef struct { int i[4]; } int_al16 __attribute__((aligned (16)));
|
||||
-
|
||||
-#define TEST_STACK_ALIGN() \
|
||||
- ({ \
|
||||
- int_al16 _m; \
|
||||
- double _d = 12.0; \
|
||||
- long double _ld = 15.0; \
|
||||
- int _ret = 0; \
|
||||
- printf ("int_al16: %p %zu\n", &_m, __alignof (int_al16)); \
|
||||
- if ((((uintptr_t) &_m) & (__alignof (int_al16) - 1)) != 0) \
|
||||
- _ret = 1; \
|
||||
- \
|
||||
- printf ("double: %g %p %zu\n", _d, &_d, __alignof (double)); \
|
||||
- if ((((uintptr_t) &_d) & (__alignof (double) - 1)) != 0) \
|
||||
- _ret = 1; \
|
||||
- \
|
||||
- printf ("ldouble: %Lg %p %zu\n", _ld, &_ld, __alignof (long double)); \
|
||||
- if ((((uintptr_t) &_ld) & (__alignof (long double) - 1)) != 0) \
|
||||
- _ret = 1; \
|
||||
- _ret; \
|
||||
- })
|
||||
diff --git a/sysdeps/powerpc/tst-stack-align.h b/sysdeps/powerpc/tst-stack-align.h
|
||||
index 7fd7013b..d7400b28 100644
|
||||
--- a/sysdeps/powerpc/tst-stack-align.h
|
||||
+++ b/sysdeps/powerpc/tst-stack-align.h
|
||||
@@ -1,4 +1,5 @@
|
||||
-/* Copyright (C) 2005-2018 Free Software Foundation, Inc.
|
||||
+/* Check stack alignment. PowerPC version.
|
||||
+ Copyright (C) 2005-2021 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
|
||||
@@ -15,10 +16,7 @@
|
||||
License along with the GNU C Library; if not, see
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
-#include <stdio.h>
|
||||
-#include <stdint.h>
|
||||
-
|
||||
-#define TEST_STACK_ALIGN() \
|
||||
+#define TEST_STACK_ALIGN_INIT() \
|
||||
({ \
|
||||
/* Altivec __vector int etc. needs 16byte aligned stack. \
|
||||
Instead of using altivec.h here, use aligned attribute instead. */ \
|
||||
@@ -27,20 +25,9 @@
|
||||
int _i __attribute__((aligned (16))); \
|
||||
int _j[3]; \
|
||||
} _s = { ._i = 18, ._j[0] = 19, ._j[1] = 20, ._j[2] = 21 }; \
|
||||
- double _d = 12.0; \
|
||||
- long double _ld = 15.0; \
|
||||
- int _ret = 0; \
|
||||
printf ("__vector int: { %d, %d, %d, %d } %p %zu\n", _s._i, _s._j[0], \
|
||||
_s._j[1], _s._j[2], &_s, __alignof (_s)); \
|
||||
- if ((((uintptr_t) &_s) & (__alignof (_s) - 1)) != 0) \
|
||||
- _ret = 1; \
|
||||
- \
|
||||
- printf ("double: %g %p %zu\n", _d, &_d, __alignof (double)); \
|
||||
- if ((((uintptr_t) &_d) & (__alignof (double) - 1)) != 0) \
|
||||
- _ret = 1; \
|
||||
- \
|
||||
- printf ("ldouble: %Lg %p %zu\n", _ld, &_ld, __alignof (long double)); \
|
||||
- if ((((uintptr_t) &_ld) & (__alignof (long double) - 1)) != 0) \
|
||||
- _ret = 1; \
|
||||
- _ret; \
|
||||
- })
|
||||
+ is_aligned (&_s, __alignof (_s)); \
|
||||
+ })
|
||||
+
|
||||
+#include_next <tst-stack-align.h>
|
||||
diff --git a/sysdeps/x86/tst-stack-align.h b/sysdeps/x86/tst-stack-align.h
|
||||
new file mode 100644
|
||||
index 00000000..02ecc72d
|
||||
--- /dev/null
|
||||
+++ b/sysdeps/x86/tst-stack-align.h
|
||||
@@ -0,0 +1,28 @@
|
||||
+/* Check stack alignment. X86 version.
|
||||
+ Copyright (C) 2021 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/>. */
|
||||
+
|
||||
+typedef struct { int i[16]; } int_al16 __attribute__((aligned (16)));
|
||||
+
|
||||
+#define TEST_STACK_ALIGN_INIT() \
|
||||
+ ({ \
|
||||
+ int_al16 _m; \
|
||||
+ printf ("int_al16: %p %zu\n", &_m, __alignof (int_al16)); \
|
||||
+ is_aligned (&_m, __alignof (int_al16)); \
|
||||
+ })
|
||||
+
|
||||
+#include_next <tst-stack-align.h>
|
||||
diff --git a/sysdeps/x86_64/tst-stack-align.h b/sysdeps/x86_64/tst-stack-align.h
|
||||
deleted file mode 100644
|
||||
index b2ef77f6..00000000
|
||||
--- a/sysdeps/x86_64/tst-stack-align.h
|
||||
+++ /dev/null
|
||||
@@ -1,46 +0,0 @@
|
||||
-/* Copyright (C) 2003-2018 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
|
||||
- <http://www.gnu.org/licenses/>. */
|
||||
-
|
||||
-#include <stdio.h>
|
||||
-#include <stdint.h>
|
||||
-
|
||||
-#define TEST_STACK_ALIGN() \
|
||||
- ({ \
|
||||
- /* AMD64 ABI mandates 16byte aligned stack. \
|
||||
- Unfortunately, current GCC doesn't support __int128 or __float128 \
|
||||
- types, so use aligned attribute instead. */ \
|
||||
- struct _S \
|
||||
- { \
|
||||
- int _i __attribute__((aligned (16))); \
|
||||
- int _pad[3]; \
|
||||
- } _s = { ._i = 18 }; \
|
||||
- double _d = 12.0; \
|
||||
- long double _ld = 15.0; \
|
||||
- int _ret = 0; \
|
||||
- printf ("__int128: %d %p %zu\n", _s._i, &_s, __alignof (_s)); \
|
||||
- if ((((uintptr_t) &_s) & (__alignof (_s) - 1)) != 0) \
|
||||
- _ret = 1; \
|
||||
- \
|
||||
- printf ("double: %g %p %zu\n", _d, &_d, __alignof (double)); \
|
||||
- if ((((uintptr_t) &_d) & (__alignof (double) - 1)) != 0) \
|
||||
- _ret = 1; \
|
||||
- \
|
||||
- printf ("ldouble: %Lg %p %zu\n", _ld, &_ld, __alignof (long double)); \
|
||||
- if ((((uintptr_t) &_ld) & (__alignof (long double) - 1)) != 0) \
|
||||
- _ret = 1; \
|
||||
- _ret; \
|
||||
- })
|
||||
--
|
||||
2.27.0
|
||||
|
22
glibc-RHEL-2435-2.patch
Normal file
22
glibc-RHEL-2435-2.patch
Normal file
|
@ -0,0 +1,22 @@
|
|||
Work around in the test case, the fact that RHEL-8 NSS modules
|
||||
infrastructure incorrectly allows merging in the hosts database. This
|
||||
is a RHEL-8 only fix.
|
||||
|
||||
diff --git a/nss/tst-nss-gai-actions.c b/nss/tst-nss-gai-actions.c
|
||||
index efca6cd1837a172a..c35e752896eceb2a 100644
|
||||
--- a/nss/tst-nss-gai-actions.c
|
||||
+++ b/nss/tst-nss-gai-actions.c
|
||||
@@ -87,6 +87,13 @@ do_one_test (int action, int family, bool canon)
|
||||
case ACTION_MERGE:
|
||||
if (ret == 0)
|
||||
{
|
||||
+ if (hints.ai_flags == 0 && hints.ai_family == AF_INET)
|
||||
+ {
|
||||
+ printf ("***** RHEL-8 limitation: "
|
||||
+ "NSS modules infrastructure incorrectly allows MERGE\n");
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
char *formatted = support_format_addrinfo (ai, ret);
|
||||
|
||||
printf ("merge unexpectedly succeeded:\n %s\n", formatted);
|
|
@ -1,4 +1,4 @@
|
|||
commit 1c37b8022e8763fedbb3f79c02e05c6acfe5a215
|
||||
commit 228cdb00a045ae3b68a91b35c7548bab6029446e
|
||||
Author: Siddhesh Poyarekar <siddhesh@sourceware.org>
|
||||
Date: Thu Mar 17 11:44:34 2022 +0530
|
||||
|
||||
|
@ -22,6 +22,7 @@ Date: Thu Mar 17 11:44:34 2022 +0530
|
|||
|
||||
Signed-off-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
|
||||
Reviewed-by: DJ Delorie <dj@redhat.com>
|
||||
(cherry picked from commit 1c37b8022e8763fedbb3f79c02e05c6acfe5a215)
|
||||
|
||||
Conflicts:
|
||||
nss/Makefile
|
||||
|
@ -29,8 +30,6 @@ Conflicts:
|
|||
sysdeps/posix/getaddrinfo.c
|
||||
(RES_USE_INET6 still present in RHEL-8 and NSS module traversal rewrite
|
||||
not in RHEL-8)
|
||||
nss/tst-nss-gai-actions.c
|
||||
(Adapted SUCCESS=merge result to RHEL-8)
|
||||
|
||||
diff --git a/nss/Makefile b/nss/Makefile
|
||||
index e8a7d9c7b3cefcdf..cfb255c6e7a3a4de 100644
|
||||
|
@ -48,10 +47,10 @@ index e8a7d9c7b3cefcdf..cfb255c6e7a3a4de 100644
|
|||
ifeq (yes,$(build-shared))
|
||||
diff --git a/nss/tst-nss-gai-actions.c b/nss/tst-nss-gai-actions.c
|
||||
new file mode 100644
|
||||
index 0000000000000000..c35e752896eceb2a
|
||||
index 0000000000000000..efca6cd1837a172a
|
||||
--- /dev/null
|
||||
+++ b/nss/tst-nss-gai-actions.c
|
||||
@@ -0,0 +1,156 @@
|
||||
@@ -0,0 +1,149 @@
|
||||
+/* Test continue and merge NSS actions for getaddrinfo.
|
||||
+ Copyright The GNU Toolchain Authors.
|
||||
+ This file is part of the GNU C Library.
|
||||
|
@ -141,13 +140,6 @@ index 0000000000000000..c35e752896eceb2a
|
|||
+ case ACTION_MERGE:
|
||||
+ if (ret == 0)
|
||||
+ {
|
||||
+ if (hints.ai_flags == 0 && hints.ai_family == AF_INET)
|
||||
+ {
|
||||
+ printf ("***** RHEL-8 limitation: "
|
||||
+ "NSS modules infrastructure incorrectly allows MERGE\n");
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ char *formatted = support_format_addrinfo (ai, ret);
|
||||
+
|
||||
+ printf ("merge unexpectedly succeeded:\n %s\n", formatted);
|
|
@ -1,171 +0,0 @@
|
|||
From 2e86602d21fcaa8353c529f2f6768125396da39f Mon Sep 17 00:00:00 2001
|
||||
From: "H.J. Lu" <hjl.tools@gmail.com>
|
||||
Date: Wed, 19 Jul 2023 23:12:30 +0800
|
||||
Subject: [PATCH 5/6] Support target specific ALIGN for variable alignment test
|
||||
[BZ #28676]
|
||||
|
||||
Add <tst-file-align.h> to support target specific ALIGN for variable
|
||||
alignment test:
|
||||
|
||||
1. Alpha: Use 0x10000.
|
||||
2. MicroBlaze and Nios II: Use 0x8000.
|
||||
3. All others: Use 0x200000.
|
||||
|
||||
Backport from master commit: 4435c29
|
||||
|
||||
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||
Signed-off-by: Rongwei Wang <rongwei.wang@linux.alibaba.com>
|
||||
---
|
||||
elf/tst-align3.c | 4 +---
|
||||
elf/tst-alignmod3.c | 4 +---
|
||||
sysdeps/alpha/tst-file-align.h | 20 ++++++++++++++++++++
|
||||
sysdeps/generic/tst-file-align.h | 20 ++++++++++++++++++++
|
||||
sysdeps/microblaze/tst-file-align.h | 20 ++++++++++++++++++++
|
||||
sysdeps/nios2/tst-file-align.h | 20 ++++++++++++++++++++
|
||||
6 files changed, 82 insertions(+), 6 deletions(-)
|
||||
create mode 100644 sysdeps/alpha/tst-file-align.h
|
||||
create mode 100644 sysdeps/generic/tst-file-align.h
|
||||
create mode 100644 sysdeps/microblaze/tst-file-align.h
|
||||
create mode 100644 sysdeps/nios2/tst-file-align.h
|
||||
|
||||
diff --git a/elf/tst-align3.c b/elf/tst-align3.c
|
||||
index ac86d623..87a8ff81 100644
|
||||
--- a/elf/tst-align3.c
|
||||
+++ b/elf/tst-align3.c
|
||||
@@ -17,11 +17,9 @@
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <support/check.h>
|
||||
+#include <tst-file-align.h>
|
||||
#include <tst-stack-align.h>
|
||||
|
||||
-/* This should cover all possible page sizes we currently support. */
|
||||
-#define ALIGN 0x200000
|
||||
-
|
||||
int bar __attribute__ ((aligned (ALIGN))) = 1;
|
||||
|
||||
extern int do_load_test (void);
|
||||
diff --git a/elf/tst-alignmod3.c b/elf/tst-alignmod3.c
|
||||
index 0d33f237..9520c352 100644
|
||||
--- a/elf/tst-alignmod3.c
|
||||
+++ b/elf/tst-alignmod3.c
|
||||
@@ -17,11 +17,9 @@
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <support/check.h>
|
||||
+#include <tst-file-align.h>
|
||||
#include <tst-stack-align.h>
|
||||
|
||||
-/* This should cover all possible page sizes we currently support. */
|
||||
-#define ALIGN 0x200000
|
||||
-
|
||||
int foo __attribute__ ((aligned (ALIGN))) = 1;
|
||||
|
||||
void
|
||||
diff --git a/sysdeps/alpha/tst-file-align.h b/sysdeps/alpha/tst-file-align.h
|
||||
new file mode 100644
|
||||
index 00000000..8fc3c940
|
||||
--- /dev/null
|
||||
+++ b/sysdeps/alpha/tst-file-align.h
|
||||
@@ -0,0 +1,20 @@
|
||||
+/* Check file alignment. Alpha version.
|
||||
+ Copyright (C) 2021 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/>. */
|
||||
+
|
||||
+/* This should cover all possible alignments we currently support. */
|
||||
+#define ALIGN 0x10000
|
||||
diff --git a/sysdeps/generic/tst-file-align.h b/sysdeps/generic/tst-file-align.h
|
||||
new file mode 100644
|
||||
index 00000000..6ee6783a
|
||||
--- /dev/null
|
||||
+++ b/sysdeps/generic/tst-file-align.h
|
||||
@@ -0,0 +1,20 @@
|
||||
+/* Check file alignment. Generic version.
|
||||
+ Copyright (C) 2021 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/>. */
|
||||
+
|
||||
+/* This should cover all possible page sizes we currently support. */
|
||||
+#define ALIGN 0x200000
|
||||
diff --git a/sysdeps/microblaze/tst-file-align.h b/sysdeps/microblaze/tst-file-align.h
|
||||
new file mode 100644
|
||||
index 00000000..43c58b29
|
||||
--- /dev/null
|
||||
+++ b/sysdeps/microblaze/tst-file-align.h
|
||||
@@ -0,0 +1,20 @@
|
||||
+/* Check file alignment. MicroBlaze version.
|
||||
+ Copyright (C) 2021 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/>. */
|
||||
+
|
||||
+/* This should cover all possible alignments we currently support. */
|
||||
+#define ALIGN 0x8000
|
||||
diff --git a/sysdeps/nios2/tst-file-align.h b/sysdeps/nios2/tst-file-align.h
|
||||
new file mode 100644
|
||||
index 00000000..589a2d5a
|
||||
--- /dev/null
|
||||
+++ b/sysdeps/nios2/tst-file-align.h
|
||||
@@ -0,0 +1,20 @@
|
||||
+/* Check file alignment. Nios II version.
|
||||
+ Copyright (C) 2021 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/>. */
|
||||
+
|
||||
+/* This should cover all possible alignments we currently support. */
|
||||
+#define ALIGN 0x8000
|
||||
--
|
||||
2.27.0
|
||||
|
File diff suppressed because it is too large
Load diff
|
@ -1,183 +0,0 @@
|
|||
From b9f145df85145506f8e61bac38b792584a38d88f Mon Sep 17 00:00:00 2001
|
||||
From: Krzysztof Koch <Krzysztof.Koch@arm.com>
|
||||
Date: Tue, 5 Nov 2019 17:35:18 +0000
|
||||
Subject: [PATCH 02/14] aarch64: Increase small and medium cases for
|
||||
__memcpy_generic
|
||||
|
||||
Increase the upper bound on medium cases from 96 to 128 bytes.
|
||||
Now, up to 128 bytes are copied unrolled.
|
||||
|
||||
Increase the upper bound on small cases from 16 to 32 bytes so that
|
||||
copies of 17-32 bytes are not impacted by the larger medium case.
|
||||
|
||||
Benchmarking:
|
||||
The attached figures show relative timing difference with respect
|
||||
to 'memcpy_generic', which is the existing implementation.
|
||||
'memcpy_med_128' denotes the the version of memcpy_generic with
|
||||
only the medium case enlarged. The 'memcpy_med_128_small_32' numbers
|
||||
are for the version of memcpy_generic submitted in this patch, which
|
||||
has both medium and small cases enlarged. The figures were generated
|
||||
using the script from:
|
||||
https://www.sourceware.org/ml/libc-alpha/2019-10/msg00563.html
|
||||
|
||||
Depending on the platform, the performance improvement in the
|
||||
bench-memcpy-random.c benchmark ranges from 6% to 20% between
|
||||
the original and final version of memcpy.S
|
||||
|
||||
Tested against GLIBC testsuite and randomized tests.
|
||||
---
|
||||
sysdeps/aarch64/memcpy.S | 82 +++++++++++++++++++++++-----------------
|
||||
1 file changed, 47 insertions(+), 35 deletions(-)
|
||||
|
||||
diff --git a/sysdeps/aarch64/memcpy.S b/sysdeps/aarch64/memcpy.S
|
||||
index 6e4f4a74bd..10801aa0f4 100644
|
||||
--- a/sysdeps/aarch64/memcpy.S
|
||||
+++ b/sysdeps/aarch64/memcpy.S
|
||||
@@ -41,17 +41,19 @@
|
||||
#define C_h x11
|
||||
#define D_l x12
|
||||
#define D_h x13
|
||||
-#define E_l src
|
||||
-#define E_h count
|
||||
-#define F_l srcend
|
||||
-#define F_h dst
|
||||
+#define E_l x14
|
||||
+#define E_h x15
|
||||
+#define F_l x16
|
||||
+#define F_h x17
|
||||
#define G_l count
|
||||
#define G_h dst
|
||||
+#define H_l src
|
||||
+#define H_h srcend
|
||||
#define tmp1 x14
|
||||
|
||||
-/* Copies are split into 3 main cases: small copies of up to 16 bytes,
|
||||
- medium copies of 17..96 bytes which are fully unrolled. Large copies
|
||||
- of more than 96 bytes align the destination and use an unrolled loop
|
||||
+/* Copies are split into 3 main cases: small copies of up to 32 bytes,
|
||||
+ medium copies of 33..128 bytes which are fully unrolled. Large copies
|
||||
+ of more than 128 bytes align the destination and use an unrolled loop
|
||||
processing 64 bytes per iteration.
|
||||
In order to share code with memmove, small and medium copies read all
|
||||
data before writing, allowing any kind of overlap. So small, medium
|
||||
@@ -73,7 +75,7 @@ ENTRY_ALIGN (MEMMOVE, 6)
|
||||
DELOUSE (2)
|
||||
|
||||
sub tmp1, dstin, src
|
||||
- cmp count, 96
|
||||
+ cmp count, 128
|
||||
ccmp tmp1, count, 2, hi
|
||||
b.lo L(move_long)
|
||||
|
||||
@@ -89,31 +91,39 @@ ENTRY (MEMCPY)
|
||||
prfm PLDL1KEEP, [src]
|
||||
add srcend, src, count
|
||||
add dstend, dstin, count
|
||||
- cmp count, 16
|
||||
- b.ls L(copy16)
|
||||
- cmp count, 96
|
||||
+ cmp count, 32
|
||||
+ b.ls L(copy32)
|
||||
+ cmp count, 128
|
||||
b.hi L(copy_long)
|
||||
|
||||
- /* Medium copies: 17..96 bytes. */
|
||||
- sub tmp1, count, 1
|
||||
+ /* Medium copies: 33..128 bytes. */
|
||||
ldp A_l, A_h, [src]
|
||||
- tbnz tmp1, 6, L(copy96)
|
||||
- ldp D_l, D_h, [srcend, -16]
|
||||
- tbz tmp1, 5, 1f
|
||||
ldp B_l, B_h, [src, 16]
|
||||
ldp C_l, C_h, [srcend, -32]
|
||||
+ ldp D_l, D_h, [srcend, -16]
|
||||
+ cmp count, 64
|
||||
+ b.hi L(copy128)
|
||||
+ stp A_l, A_h, [dstin]
|
||||
stp B_l, B_h, [dstin, 16]
|
||||
stp C_l, C_h, [dstend, -32]
|
||||
-1:
|
||||
- stp A_l, A_h, [dstin]
|
||||
stp D_l, D_h, [dstend, -16]
|
||||
ret
|
||||
|
||||
.p2align 4
|
||||
- /* Small copies: 0..16 bytes. */
|
||||
-L(copy16):
|
||||
- cmp count, 8
|
||||
+ /* Small copies: 0..32 bytes. */
|
||||
+L(copy32):
|
||||
+ /* 16-32 bytes. */
|
||||
+ cmp count, 16
|
||||
b.lo 1f
|
||||
+ ldp A_l, A_h, [src]
|
||||
+ ldp B_l, B_h, [srcend, -16]
|
||||
+ stp A_l, A_h, [dstin]
|
||||
+ stp B_l, B_h, [dstend, -16]
|
||||
+ ret
|
||||
+ .p2align 4
|
||||
+1:
|
||||
+ /* 8-15 bytes. */
|
||||
+ tbz count, 3, 1f
|
||||
ldr A_l, [src]
|
||||
ldr A_h, [srcend, -8]
|
||||
str A_l, [dstin]
|
||||
@@ -121,6 +131,7 @@ L(copy16):
|
||||
ret
|
||||
.p2align 4
|
||||
1:
|
||||
+ /* 4-7 bytes. */
|
||||
tbz count, 2, 1f
|
||||
ldr A_lw, [src]
|
||||
ldr A_hw, [srcend, -4]
|
||||
@@ -142,24 +153,25 @@ L(copy16):
|
||||
2: ret
|
||||
|
||||
.p2align 4
|
||||
- /* Copy 64..96 bytes. Copy 64 bytes from the start and
|
||||
- 32 bytes from the end. */
|
||||
-L(copy96):
|
||||
- ldp B_l, B_h, [src, 16]
|
||||
- ldp C_l, C_h, [src, 32]
|
||||
- ldp D_l, D_h, [src, 48]
|
||||
- ldp E_l, E_h, [srcend, -32]
|
||||
- ldp F_l, F_h, [srcend, -16]
|
||||
+ /* Copy 65..128 bytes. Copy 64 bytes from the start and
|
||||
+ 64 bytes from the end. */
|
||||
+L(copy128):
|
||||
+ ldp E_l, E_h, [src, 32]
|
||||
+ ldp F_l, F_h, [src, 48]
|
||||
+ ldp G_l, G_h, [srcend, -64]
|
||||
+ ldp H_l, H_h, [srcend, -48]
|
||||
stp A_l, A_h, [dstin]
|
||||
stp B_l, B_h, [dstin, 16]
|
||||
- stp C_l, C_h, [dstin, 32]
|
||||
- stp D_l, D_h, [dstin, 48]
|
||||
- stp E_l, E_h, [dstend, -32]
|
||||
- stp F_l, F_h, [dstend, -16]
|
||||
+ stp E_l, E_h, [dstin, 32]
|
||||
+ stp F_l, F_h, [dstin, 48]
|
||||
+ stp G_l, G_h, [dstend, -64]
|
||||
+ stp H_l, H_h, [dstend, -48]
|
||||
+ stp C_l, C_h, [dstend, -32]
|
||||
+ stp D_l, D_h, [dstend, -16]
|
||||
ret
|
||||
|
||||
/* Align DST to 16 byte alignment so that we don't cross cache line
|
||||
- boundaries on both loads and stores. There are at least 96 bytes
|
||||
+ boundaries on both loads and stores. There are at least 128 bytes
|
||||
to copy, so copy 16 bytes unaligned and then align. The loop
|
||||
copies 64 bytes per iteration and prefetches one iteration ahead. */
|
||||
|
||||
@@ -215,7 +227,7 @@ L(move_long):
|
||||
add dstend, dstin, count
|
||||
|
||||
/* Align dstend to 16 byte alignment so that we don't cross cache line
|
||||
- boundaries on both loads and stores. There are at least 96 bytes
|
||||
+ boundaries on both loads and stores. There are at least 128 bytes
|
||||
to copy, so copy 16 bytes unaligned and then align. The loop
|
||||
copies 64 bytes per iteration and prefetches one iteration ahead. */
|
||||
|
||||
--
|
||||
2.39.3
|
||||
|
|
@ -1,36 +0,0 @@
|
|||
From bf126f79dff0370d1e52ef8193da7fd593c37833 Mon Sep 17 00:00:00 2001
|
||||
From: "H.J. Lu" <hjl.tools@gmail.com>
|
||||
Date: Wed, 19 Jul 2023 23:10:48 +0800
|
||||
Subject: [PATCH 4/6] elf: Align argument of __munmap to page size [BZ #28676]
|
||||
|
||||
On Linux/x86-64, for elf/tst-align3, we now get
|
||||
|
||||
munmap(0x7f88f9401000, 1126424) = 0
|
||||
|
||||
instead of
|
||||
|
||||
munmap(0x7f1615200018, 544768) = -1 EINVAL (Invalid argument)
|
||||
|
||||
Backport from master commit: fd6062e
|
||||
|
||||
Reviewed-by: Florian Weimer <fweimer@redhat.com>
|
||||
Signed-off-by: Rongwei Wang <rongwei.wang@linux.alibaba.com>
|
||||
---
|
||||
elf/dl-map-segments.h | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/elf/dl-map-segments.h b/elf/dl-map-segments.h
|
||||
index 61ba04cd..f1f7ad88 100644
|
||||
--- a/elf/dl-map-segments.h
|
||||
+++ b/elf/dl-map-segments.h
|
||||
@@ -55,6 +55,7 @@ _dl_map_segment (const struct loadcmd *c, ElfW(Addr) mappref,
|
||||
if (delta)
|
||||
__munmap ((void *) map_start, delta);
|
||||
ElfW(Addr) map_end = map_start_aligned + maplength;
|
||||
+ map_end = ALIGN_UP (map_end, GLRO(dl_pagesize));
|
||||
delta = map_start + maplen - map_end;
|
||||
if (delta)
|
||||
__munmap ((void *) map_end, delta);
|
||||
--
|
||||
2.27.0
|
||||
|
|
@ -1,40 +0,0 @@
|
|||
From 8b39d3b4bf2fc49ab31f31cf30aa80104afa3432 Mon Sep 17 00:00:00 2001
|
||||
From: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||
Date: Wed, 19 Jul 2023 23:14:33 +0800
|
||||
Subject: [PATCH 6/6] elf: Fix tst-align3
|
||||
|
||||
The elf/tst-align3.c declares the function using a wrong prototype.
|
||||
|
||||
Checked on aarch64-linux-gnu.
|
||||
|
||||
Signed-off-by: Rongwei Wang <rongwei.wang@linux.alibaba.com>
|
||||
---
|
||||
elf/tst-align3.c | 5 +++--
|
||||
1 file changed, 3 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/elf/tst-align3.c b/elf/tst-align3.c
|
||||
index 87a8ff81..731dd59f 100644
|
||||
--- a/elf/tst-align3.c
|
||||
+++ b/elf/tst-align3.c
|
||||
@@ -22,7 +22,7 @@
|
||||
|
||||
int bar __attribute__ ((aligned (ALIGN))) = 1;
|
||||
|
||||
-extern int do_load_test (void);
|
||||
+extern void do_load_test (void);
|
||||
|
||||
static int
|
||||
do_test (void)
|
||||
@@ -30,7 +30,8 @@ do_test (void)
|
||||
printf ("bar: %p\n", &bar);
|
||||
TEST_VERIFY (is_aligned (&bar, ALIGN) == 0);
|
||||
|
||||
- return do_load_test ();
|
||||
+ do_load_test ();
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
#include <support/test-driver.c>
|
||||
--
|
||||
2.27.0
|
||||
|
|
@ -1,137 +0,0 @@
|
|||
From fe5893121176136b0ae3a5f9198536feeb6f64f8 Mon Sep 17 00:00:00 2001
|
||||
From: Rongwei Wang <rongwei.wang@linux.alibaba.com>
|
||||
Date: Wed, 19 Jul 2023 23:05:39 +0800
|
||||
Subject: [PATCH 2/6] elf: Properly align PT_LOAD segments [BZ #28676]
|
||||
|
||||
When PT_LOAD segment alignment > the page size, allocate enough space to
|
||||
ensure that the segment can be properly aligned. This change helps code
|
||||
segments use huge pages become simple and available.
|
||||
|
||||
This fixes [BZ #28676].
|
||||
|
||||
Backport from master commit: 718fdd8
|
||||
|
||||
Signed-off-by: Xu Yu <xuyu@linux.alibaba.com>
|
||||
Signed-off-by: Rongwei Wang <rongwei.wang@linux.alibaba.com>
|
||||
---
|
||||
elf/dl-load.c | 2 ++
|
||||
elf/dl-load.h | 3 ++-
|
||||
elf/dl-map-segments.h | 50 +++++++++++++++++++++++++++++++++++++++----
|
||||
3 files changed, 50 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/elf/dl-load.c b/elf/dl-load.c
|
||||
index 0b45e6e3..132e4233 100644
|
||||
--- a/elf/dl-load.c
|
||||
+++ b/elf/dl-load.c
|
||||
@@ -1,5 +1,6 @@
|
||||
/* Map in a shared object's segments from the file.
|
||||
Copyright (C) 1995-2018 Free Software Foundation, Inc.
|
||||
+ 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
|
||||
@@ -1076,6 +1077,7 @@ _dl_map_object_from_fd (const char *name, const char *origname, int fd,
|
||||
c->mapend = ALIGN_UP (ph->p_vaddr + ph->p_filesz, GLRO(dl_pagesize));
|
||||
c->dataend = ph->p_vaddr + ph->p_filesz;
|
||||
c->allocend = ph->p_vaddr + ph->p_memsz;
|
||||
+ c->mapalign = ph->p_align;
|
||||
c->mapoff = ALIGN_DOWN (ph->p_offset, GLRO(dl_pagesize));
|
||||
|
||||
/* Determine whether there is a gap between the last segment
|
||||
diff --git a/elf/dl-load.h b/elf/dl-load.h
|
||||
index 66ea2e92..d9f648ea 100644
|
||||
--- a/elf/dl-load.h
|
||||
+++ b/elf/dl-load.h
|
||||
@@ -1,5 +1,6 @@
|
||||
/* Map in a shared object's segments from the file.
|
||||
Copyright (C) 1995-2018 Free Software Foundation, Inc.
|
||||
+ 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
|
||||
@@ -74,7 +75,7 @@ ELF_PREFERRED_ADDRESS_DATA;
|
||||
Its details have been expanded out and converted. */
|
||||
struct loadcmd
|
||||
{
|
||||
- ElfW(Addr) mapstart, mapend, dataend, allocend;
|
||||
+ ElfW(Addr) mapstart, mapend, dataend, allocend, mapalign;
|
||||
ElfW(Off) mapoff;
|
||||
int prot; /* PROT_* bits. */
|
||||
};
|
||||
diff --git a/elf/dl-map-segments.h b/elf/dl-map-segments.h
|
||||
index 084076a2..61ba04cd 100644
|
||||
--- a/elf/dl-map-segments.h
|
||||
+++ b/elf/dl-map-segments.h
|
||||
@@ -1,5 +1,6 @@
|
||||
/* Map in a shared object's segments. Generic version.
|
||||
Copyright (C) 1995-2018 Free Software Foundation, Inc.
|
||||
+ 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
|
||||
@@ -18,6 +19,50 @@
|
||||
|
||||
#include <dl-load.h>
|
||||
|
||||
+/* Map a segment and align it properly. */
|
||||
+
|
||||
+static __always_inline ElfW(Addr)
|
||||
+_dl_map_segment (const struct loadcmd *c, ElfW(Addr) mappref,
|
||||
+ const size_t maplength, int fd)
|
||||
+{
|
||||
+ if (__glibc_likely (c->mapalign <= GLRO(dl_pagesize)))
|
||||
+ return (ElfW(Addr)) __mmap ((void *) mappref, maplength, c->prot,
|
||||
+ MAP_COPY|MAP_FILE, fd, c->mapoff);
|
||||
+
|
||||
+ /* If the segment alignment > the page size, allocate enough space to
|
||||
+ ensure that the segment can be properly aligned. */
|
||||
+ ElfW(Addr) maplen = (maplength >= c->mapalign
|
||||
+ ? (maplength + c->mapalign)
|
||||
+ : (2 * c->mapalign));
|
||||
+ ElfW(Addr) map_start = (ElfW(Addr)) __mmap ((void *) mappref, maplen,
|
||||
+ PROT_NONE,
|
||||
+ MAP_ANONYMOUS|MAP_PRIVATE,
|
||||
+ -1, 0);
|
||||
+ if (__glibc_unlikely ((void *) map_start == MAP_FAILED))
|
||||
+ return map_start;
|
||||
+
|
||||
+ ElfW(Addr) map_start_aligned = ALIGN_UP (map_start, c->mapalign);
|
||||
+ map_start_aligned = (ElfW(Addr)) __mmap ((void *) map_start_aligned,
|
||||
+ maplength, c->prot,
|
||||
+ MAP_COPY|MAP_FILE|MAP_FIXED,
|
||||
+ fd, c->mapoff);
|
||||
+ if (__glibc_unlikely ((void *) map_start_aligned == MAP_FAILED))
|
||||
+ __munmap ((void *) map_start, maplen);
|
||||
+ else
|
||||
+ {
|
||||
+ /* Unmap the unused regions. */
|
||||
+ ElfW(Addr) delta = map_start_aligned - map_start;
|
||||
+ if (delta)
|
||||
+ __munmap ((void *) map_start, delta);
|
||||
+ ElfW(Addr) map_end = map_start_aligned + maplength;
|
||||
+ delta = map_start + maplen - map_end;
|
||||
+ if (delta)
|
||||
+ __munmap ((void *) map_end, delta);
|
||||
+ }
|
||||
+
|
||||
+ return map_start_aligned;
|
||||
+}
|
||||
+
|
||||
/* This implementation assumes (as does the corresponding implementation
|
||||
of _dl_unmap_segments, in dl-unmap-segments.h) that shared objects
|
||||
are always laid out with all segments contiguous (or with gaps
|
||||
@@ -53,10 +98,7 @@ _dl_map_segments (struct link_map *l, int fd,
|
||||
- MAP_BASE_ADDR (l));
|
||||
|
||||
/* Remember which part of the address space this object uses. */
|
||||
- l->l_map_start = (ElfW(Addr)) __mmap ((void *) mappref, maplength,
|
||||
- c->prot,
|
||||
- MAP_COPY|MAP_FILE,
|
||||
- fd, c->mapoff);
|
||||
+ l->l_map_start = _dl_map_segment (c, mappref, maplength, fd);
|
||||
if (__glibc_unlikely ((void *) l->l_map_start == MAP_FAILED))
|
||||
return DL_MAP_SEGMENTS_ERROR_MAP_SEGMENT;
|
||||
|
||||
--
|
||||
2.27.0
|
||||
|
|
@ -1,797 +0,0 @@
|
|||
diff --git a/iconvdata/gb18030.c b/iconvdata/gb18030.c
|
||||
index 0b03b9bb..ca383dc0 100644
|
||||
--- a/iconvdata/gb18030.c
|
||||
+++ b/iconvdata/gb18030.c
|
||||
@@ -6020,49 +6020,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,
|
||||
@@ -8691,7 +8692,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,
|
||||
@@ -9019,84 +9022,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.
|
||||
@@ -23448,71 +23453,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",
|
||||
@@ -24222,24 +24235,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; \
|
||||
@@ -24331,17 +24328,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 9ad1f44e..c881c86b 100644
|
||||
--- a/iconvdata/tst-table-from.c
|
||||
+++ b/iconvdata/tst-table-from.c
|
||||
@@ -195,10 +195,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 6f0aa29c..8d097527 100644
|
||||
--- a/iconvdata/tst-table-to.c
|
||||
+++ b/iconvdata/tst-table-to.c
|
||||
@@ -33,6 +33,7 @@ main (int argc, char *argv[])
|
||||
const char *charset;
|
||||
iconv_t cd;
|
||||
int bmp_only;
|
||||
+ int no_tags;
|
||||
|
||||
if (argc != 2)
|
||||
{
|
||||
@@ -48,16 +49,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 04c06136..3c6927ee 100755
|
||||
--- a/iconvdata/tst-table.sh
|
||||
+++ b/iconvdata/tst-table.sh
|
||||
@@ -38,7 +38,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
|
||||
@@ -74,25 +75,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 ad6728c5..fc3b1d2d 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>
|
121
glibc-rh2172949.patch
Normal file
121
glibc-rh2172949.patch
Normal file
|
@ -0,0 +1,121 @@
|
|||
commit 969e9733c7d17edf1e239a73fa172f357561f440
|
||||
Author: Florian Weimer <fweimer@redhat.com>
|
||||
Date: Tue Feb 21 09:20:28 2023 +0100
|
||||
|
||||
gshadow: Matching sgetsgent, sgetsgent_r ERANGE handling (bug 30151)
|
||||
|
||||
Before this change, sgetsgent_r did not set errno to ERANGE, but
|
||||
sgetsgent only check errno, not the return value from sgetsgent_r.
|
||||
Consequently, sgetsgent did not detect any error, and reported
|
||||
success to the caller, without initializing the struct sgrp object
|
||||
whose address was returned.
|
||||
|
||||
This commit changes sgetsgent_r to set errno as well. This avoids
|
||||
similar issues in applications which only change errno.
|
||||
|
||||
Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
|
||||
|
||||
diff --git a/gshadow/Makefile b/gshadow/Makefile
|
||||
index 796fbbf473..a95524593a 100644
|
||||
--- a/gshadow/Makefile
|
||||
+++ b/gshadow/Makefile
|
||||
@@ -26,7 +26,7 @@ headers = gshadow.h
|
||||
routines = getsgent getsgnam sgetsgent fgetsgent putsgent \
|
||||
getsgent_r getsgnam_r sgetsgent_r fgetsgent_r
|
||||
|
||||
-tests = tst-gshadow tst-putsgent tst-fgetsgent_r
|
||||
+tests = tst-gshadow tst-putsgent tst-fgetsgent_r tst-sgetsgent
|
||||
|
||||
CFLAGS-getsgent_r.c += -fexceptions
|
||||
CFLAGS-getsgent.c += -fexceptions
|
||||
diff --git a/gshadow/sgetsgent_r.c b/gshadow/sgetsgent_r.c
|
||||
index ea085e91d7..c75624e1f7 100644
|
||||
--- a/gshadow/sgetsgent_r.c
|
||||
+++ b/gshadow/sgetsgent_r.c
|
||||
@@ -61,7 +61,10 @@ __sgetsgent_r (const char *string, struct sgrp *resbuf, char *buffer,
|
||||
buffer[buflen - 1] = '\0';
|
||||
sp = strncpy (buffer, string, buflen);
|
||||
if (buffer[buflen - 1] != '\0')
|
||||
- return ERANGE;
|
||||
+ {
|
||||
+ __set_errno (ERANGE);
|
||||
+ return ERANGE;
|
||||
+ }
|
||||
}
|
||||
else
|
||||
sp = (char *) string;
|
||||
diff --git a/gshadow/tst-sgetsgent.c b/gshadow/tst-sgetsgent.c
|
||||
new file mode 100644
|
||||
index 0000000000..0370c10fd0
|
||||
--- /dev/null
|
||||
+++ b/gshadow/tst-sgetsgent.c
|
||||
@@ -0,0 +1,69 @@
|
||||
+/* Test large input for sgetsgent (bug 30151).
|
||||
+ 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 <gshadow.h>
|
||||
+#include <stddef.h>
|
||||
+#include <support/check.h>
|
||||
+#include <support/support.h>
|
||||
+#include <support/xmemstream.h>
|
||||
+#include <stdlib.h>
|
||||
+
|
||||
+static int
|
||||
+do_test (void)
|
||||
+{
|
||||
+ /* Create a shadow group with 1000 members. */
|
||||
+ struct xmemstream mem;
|
||||
+ xopen_memstream (&mem);
|
||||
+ const char *passwd = "k+zD0nucwfxAo3sw1NXUj6K5vt5M16+X0TVGdE1uFvq5R8V7efJ";
|
||||
+ fprintf (mem.out, "group-name:%s::m0", passwd);
|
||||
+ for (int i = 1; i < 1000; ++i)
|
||||
+ fprintf (mem.out, ",m%d", i);
|
||||
+ xfclose_memstream (&mem);
|
||||
+
|
||||
+ /* Call sgetsgent. */
|
||||
+ char *input = mem.buffer;
|
||||
+ struct sgrp *e = sgetsgent (input);
|
||||
+ TEST_VERIFY_EXIT (e != NULL);
|
||||
+ TEST_COMPARE_STRING (e->sg_namp, "group-name");
|
||||
+ TEST_COMPARE_STRING (e->sg_passwd, passwd);
|
||||
+ /* No administrators. */
|
||||
+ TEST_COMPARE_STRING (e->sg_adm[0], NULL);
|
||||
+ /* Check the members list. */
|
||||
+ for (int i = 0; i < 1000; ++i)
|
||||
+ {
|
||||
+ char *member = xasprintf ("m%d", i);
|
||||
+ TEST_COMPARE_STRING (e->sg_mem[i], member);
|
||||
+ free (member);
|
||||
+ }
|
||||
+ TEST_COMPARE_STRING (e->sg_mem[1000], NULL);
|
||||
+
|
||||
+ /* Check that putsgent brings back the input string. */
|
||||
+ xopen_memstream (&mem);
|
||||
+ TEST_COMPARE (putsgent (e, mem.out), 0);
|
||||
+ xfclose_memstream (&mem);
|
||||
+ /* Compare without the trailing '\n' that putsgent added. */
|
||||
+ TEST_COMPARE (mem.buffer[mem.length - 1], '\n');
|
||||
+ mem.buffer[mem.length - 1] = '\0';
|
||||
+ TEST_COMPARE_STRING (mem.buffer, input);
|
||||
+
|
||||
+ free (mem.buffer);
|
||||
+ free (input);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+#include <support/test-driver.c>
|
144
glibc-rh2176707-1.patch
Normal file
144
glibc-rh2176707-1.patch
Normal file
|
@ -0,0 +1,144 @@
|
|||
From 436a604b7dc741fc76b5a6704c6cd8bb178518e7 Mon Sep 17 00:00:00 2001
|
||||
From: Adam Yi <ayi@janestreet.com>
|
||||
Date: Tue, 7 Mar 2023 07:30:02 -0500
|
||||
Subject: posix: Fix system blocks SIGCHLD erroneously [BZ #30163]
|
||||
|
||||
Fix bug that SIGCHLD is erroneously blocked forever in the following
|
||||
scenario:
|
||||
|
||||
1. Thread A calls system but hasn't returned yet
|
||||
2. Thread B calls another system but returns
|
||||
|
||||
SIGCHLD would be blocked forever in thread B after its system() returns,
|
||||
even after the system() in thread A returns.
|
||||
|
||||
Although POSIX does not require, glibc system implementation aims to be
|
||||
thread and cancellation safe. This bug was introduced in
|
||||
5fb7fc96350575c9adb1316833e48ca11553be49 when we moved reverting signal
|
||||
mask to happen when the last concurrently running system returns,
|
||||
despite that signal mask is per thread. This commit reverts this logic
|
||||
and adds a test.
|
||||
|
||||
Signed-off-by: Adam Yi <ayi@janestreet.com>
|
||||
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||
|
||||
[DJ: Edited to use integer sleep() instead of nanosleep() dependency rabbit hole]
|
||||
diff --git a/stdlib/tst-system.c b/stdlib/tst-system.c
|
||||
index 634acfe264..47a0afe6bf 100644
|
||||
--- a/stdlib/tst-system.c
|
||||
+++ b/stdlib/tst-system.c
|
||||
@@ -25,6 +25,7 @@
|
||||
#include <support/check.h>
|
||||
#include <support/temp_file.h>
|
||||
#include <support/support.h>
|
||||
+#include <support/xthread.h>
|
||||
#include <support/xunistd.h>
|
||||
|
||||
static char *tmpdir;
|
||||
@@ -71,6 +72,20 @@ call_system (void *closure)
|
||||
}
|
||||
}
|
||||
|
||||
+static void *
|
||||
+sleep_and_check_sigchld (void *closure)
|
||||
+{
|
||||
+ double *seconds = (double *) closure;
|
||||
+ char cmd[namemax];
|
||||
+ sprintf (cmd, "sleep %lf" , *seconds);
|
||||
+ TEST_COMPARE (system (cmd), 0);
|
||||
+
|
||||
+ sigset_t blocked = {0};
|
||||
+ TEST_COMPARE (sigprocmask (SIG_BLOCK, NULL, &blocked), 0);
|
||||
+ TEST_COMPARE (sigismember (&blocked, SIGCHLD), 0);
|
||||
+ return NULL;
|
||||
+}
|
||||
+
|
||||
static int
|
||||
do_test (void)
|
||||
{
|
||||
@@ -154,6 +169,17 @@ do_test (void)
|
||||
xchmod (_PATH_BSHELL, st.st_mode);
|
||||
}
|
||||
|
||||
+ {
|
||||
+ pthread_t long_sleep_thread = xpthread_create (NULL,
|
||||
+ sleep_and_check_sigchld,
|
||||
+ &(double) { 2 });
|
||||
+ pthread_t short_sleep_thread = xpthread_create (NULL,
|
||||
+ sleep_and_check_sigchld,
|
||||
+ &(double) { 1 });
|
||||
+ xpthread_join (short_sleep_thread);
|
||||
+ xpthread_join (long_sleep_thread);
|
||||
+ }
|
||||
+
|
||||
TEST_COMPARE (system (""), 0);
|
||||
|
||||
return 0;
|
||||
diff --git a/support/shell-container.c b/support/shell-container.c
|
||||
index ffa3378b5e..b1f9e793c1 100644
|
||||
--- a/support/shell-container.c
|
||||
+++ b/support/shell-container.c
|
||||
@@ -169,6 +170,31 @@ kill_func (char **argv)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+/* Emulate the "/bin/sleep" command. No suffix support. Options are
|
||||
+ ignored. */
|
||||
+static int
|
||||
+sleep_func (char **argv)
|
||||
+{
|
||||
+ if (argv[0] == NULL)
|
||||
+ {
|
||||
+ fprintf (stderr, "sleep: missing operand\n");
|
||||
+ return 1;
|
||||
+ }
|
||||
+ char *endptr = NULL;
|
||||
+ long sec = strtol (argv[0], &endptr, 0);
|
||||
+ if (endptr == argv[0] || errno == ERANGE || sec < 0)
|
||||
+ {
|
||||
+ fprintf (stderr, "sleep: invalid time interval '%s'\n", argv[0]);
|
||||
+ return 1;
|
||||
+ }
|
||||
+ if (sleep (sec) < 0)
|
||||
+ {
|
||||
+ fprintf (stderr, "sleep: failed to nanosleep\n");
|
||||
+ return 1;
|
||||
+ }
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
/* This is a list of all the built-in commands we understand. */
|
||||
static struct {
|
||||
const char *name;
|
||||
@@ -179,6 +206,7 @@ static struct {
|
||||
{ "cp", copy_func },
|
||||
{ "exit", exit_func },
|
||||
{ "kill", kill_func },
|
||||
+ { "sleep", sleep_func },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
diff --git a/sysdeps/posix/system.c b/sysdeps/posix/system.c
|
||||
index 2335a99184..d77720a625 100644
|
||||
--- a/sysdeps/posix/system.c
|
||||
+++ b/sysdeps/posix/system.c
|
||||
@@ -179,16 +179,16 @@ do_system (const char *line)
|
||||
as if the shell had terminated using _exit(127). */
|
||||
status = W_EXITCODE (127, 0);
|
||||
|
||||
+ /* sigaction can not fail with SIGINT/SIGQUIT used with old
|
||||
+ disposition. Same applies for sigprocmask. */
|
||||
DO_LOCK ();
|
||||
if (SUB_REF () == 0)
|
||||
{
|
||||
- /* sigaction can not fail with SIGINT/SIGQUIT used with old
|
||||
- disposition. Same applies for sigprocmask. */
|
||||
__sigaction (SIGINT, &intr, NULL);
|
||||
__sigaction (SIGQUIT, &quit, NULL);
|
||||
- __sigprocmask (SIG_SETMASK, &omask, NULL);
|
||||
}
|
||||
DO_UNLOCK ();
|
||||
+ __sigprocmask (SIG_SETMASK, &omask, NULL);
|
||||
|
||||
if (ret != 0)
|
||||
__set_errno (ret);
|
27
glibc-rh2176707-2.patch
Normal file
27
glibc-rh2176707-2.patch
Normal file
|
@ -0,0 +1,27 @@
|
|||
From d03094649d39949a30513bf3ffb03a28fecbccd8 Mon Sep 17 00:00:00 2001
|
||||
From: Adam Yi <ayi@janestreet.com>
|
||||
Date: Wed, 8 Mar 2023 03:11:47 -0500
|
||||
Subject: hurd: fix build of tst-system.c
|
||||
|
||||
We made tst-system.c depend on pthread, but that requires linking with
|
||||
$(shared-thread-library). It does not fail under Linux because the
|
||||
variable expands to nothing under Linux, but it fails for Hurd.
|
||||
|
||||
I tested verified via cross-compiling that "make check" now works
|
||||
for Hurd.
|
||||
|
||||
Signed-off-by: Adam Yi <ayi@janestreet.com>
|
||||
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||
|
||||
[DJ: Edited for RHEL 8]
|
||||
diff -rup a/stdlib/Makefile b/stdlib/Makefile
|
||||
--- a/stdlib/Makefile 2023-07-07 00:44:55.810981644 -0400
|
||||
+++ b/stdlib/Makefile 2023-07-07 00:46:47.541411091 -0400
|
||||
@@ -102,6 +102,7 @@ LDLIBS-test-atexit-race = $(shared-threa
|
||||
LDLIBS-test-at_quick_exit-race = $(shared-thread-library)
|
||||
LDLIBS-test-cxa_atexit-race = $(shared-thread-library)
|
||||
LDLIBS-test-on_exit-race = $(shared-thread-library)
|
||||
+LDLIBS-tst-system = $(shared-thread-library)
|
||||
|
||||
LDLIBS-test-dlclose-exit-race = $(shared-thread-library) $(libdl)
|
||||
LDFLAGS-test-dlclose-exit-race = $(LDFLAGS-rdynamic)
|
42
glibc-rh2176707-3.patch
Normal file
42
glibc-rh2176707-3.patch
Normal file
|
@ -0,0 +1,42 @@
|
|||
This patch is a RHEL-only patch which modifies the custom changes
|
||||
in the previous patches in this series to make the test case look
|
||||
more like the upstream test case.
|
||||
|
||||
diff -rup a/stdlib/tst-system.c b/stdlib/tst-system.c
|
||||
--- a/stdlib/tst-system.c 2023-07-10 13:37:53.089505036 -0400
|
||||
+++ b/stdlib/tst-system.c 2023-07-10 14:04:03.922610279 -0400
|
||||
@@ -173,10 +173,10 @@ do_test (void)
|
||||
{
|
||||
pthread_t long_sleep_thread = xpthread_create (NULL,
|
||||
sleep_and_check_sigchld,
|
||||
- &(double) { 2 });
|
||||
+ &(double) { 0.2 });
|
||||
pthread_t short_sleep_thread = xpthread_create (NULL,
|
||||
sleep_and_check_sigchld,
|
||||
- &(double) { 1 });
|
||||
+ &(double) { 0.1 });
|
||||
xpthread_join (short_sleep_thread);
|
||||
xpthread_join (long_sleep_thread);
|
||||
}
|
||||
diff -rup a/support/shell-container.c b/support/shell-container.c
|
||||
--- a/support/shell-container.c 2023-07-10 13:37:53.089505036 -0400
|
||||
+++ b/support/shell-container.c 2023-07-10 14:03:20.392920627 -0400
|
||||
@@ -182,15 +182,15 @@ sleep_func (char **argv)
|
||||
return 1;
|
||||
}
|
||||
char *endptr = NULL;
|
||||
- long sec = strtol (argv[0], &endptr, 0);
|
||||
+ double sec = strtod (argv[0], &endptr);
|
||||
if (endptr == argv[0] || errno == ERANGE || sec < 0)
|
||||
{
|
||||
fprintf (stderr, "sleep: invalid time interval '%s'\n", argv[0]);
|
||||
return 1;
|
||||
}
|
||||
- if (sleep (sec) < 0)
|
||||
+ if (usleep ((useconds_t)(sec * 1000000.0)) < 0)
|
||||
{
|
||||
- fprintf (stderr, "sleep: failed to nanosleep\n");
|
||||
+ fprintf (stderr, "sleep: failed to usleep: %s\n", strerror (errno));
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
70
glibc-rh2180155-1.patch
Normal file
70
glibc-rh2180155-1.patch
Normal file
|
@ -0,0 +1,70 @@
|
|||
commit 801af9fafd4689337ebf27260aa115335a0cb2bc
|
||||
Author: Леонид Юрьев (Leonid Yuriev) <leo@yuriev.ru>
|
||||
Date: Sat Feb 4 14:41:38 2023 +0300
|
||||
|
||||
gmon: Fix allocated buffer overflow (bug 29444)
|
||||
|
||||
The `__monstartup()` allocates a buffer used to store all the data
|
||||
accumulated by the monitor.
|
||||
|
||||
The size of this buffer depends on the size of the internal structures
|
||||
used and the address range for which the monitor is activated, as well
|
||||
as on the maximum density of call instructions and/or callable functions
|
||||
that could be potentially on a segment of executable code.
|
||||
|
||||
In particular a hash table of arcs is placed at the end of this buffer.
|
||||
The size of this hash table is calculated in bytes as
|
||||
p->fromssize = p->textsize / HASHFRACTION;
|
||||
|
||||
but actually should be
|
||||
p->fromssize = ROUNDUP(p->textsize / HASHFRACTION, sizeof(*p->froms));
|
||||
|
||||
This results in writing beyond the end of the allocated buffer when an
|
||||
added arc corresponds to a call near from the end of the monitored
|
||||
address range, since `_mcount()` check the incoming caller address for
|
||||
monitored range but not the intermediate result hash-like index that
|
||||
uses to write into the table.
|
||||
|
||||
It should be noted that when the results are output to `gmon.out`, the
|
||||
table is read to the last element calculated from the allocated size in
|
||||
bytes, so the arcs stored outside the buffer boundary did not fall into
|
||||
`gprof` for analysis. Thus this "feature" help me to found this bug
|
||||
during working with https://sourceware.org/bugzilla/show_bug.cgi?id=29438
|
||||
|
||||
Just in case, I will explicitly note that the problem breaks the
|
||||
`make test t=gmon/tst-gmon-dso` added for Bug 29438.
|
||||
There, the arc of the `f3()` call disappears from the output, since in
|
||||
the DSO case, the call to `f3` is located close to the end of the
|
||||
monitored range.
|
||||
|
||||
Signed-off-by: Леонид Юрьев (Leonid Yuriev) <leo@yuriev.ru>
|
||||
|
||||
Another minor error seems a related typo in the calculation of
|
||||
`kcountsize`, but since kcounts are smaller than froms, this is
|
||||
actually to align the p->froms data.
|
||||
|
||||
Co-authored-by: DJ Delorie <dj@redhat.com>
|
||||
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
|
||||
|
||||
diff --git a/gmon/gmon.c b/gmon/gmon.c
|
||||
index dee64803ada583d7..bf76358d5b1aa2da 100644
|
||||
--- a/gmon/gmon.c
|
||||
+++ b/gmon/gmon.c
|
||||
@@ -132,6 +132,8 @@ __monstartup (u_long lowpc, u_long highpc)
|
||||
p->lowpc = ROUNDDOWN(lowpc, HISTFRACTION * sizeof(HISTCOUNTER));
|
||||
p->highpc = ROUNDUP(highpc, HISTFRACTION * sizeof(HISTCOUNTER));
|
||||
p->textsize = p->highpc - p->lowpc;
|
||||
+ /* This looks like a typo, but it's here to align the p->froms
|
||||
+ section. */
|
||||
p->kcountsize = ROUNDUP(p->textsize / HISTFRACTION, sizeof(*p->froms));
|
||||
p->hashfraction = HASHFRACTION;
|
||||
p->log_hashfraction = -1;
|
||||
@@ -142,7 +144,7 @@ __monstartup (u_long lowpc, u_long highpc)
|
||||
instead of integer division. Precompute shift amount. */
|
||||
p->log_hashfraction = ffs(p->hashfraction * sizeof(*p->froms)) - 1;
|
||||
}
|
||||
- p->fromssize = p->textsize / HASHFRACTION;
|
||||
+ p->fromssize = ROUNDUP(p->textsize / HASHFRACTION, sizeof(*p->froms));
|
||||
p->tolimit = p->textsize * ARCDENSITY / 100;
|
||||
if (p->tolimit < MINARCS)
|
||||
p->tolimit = MINARCS;
|
477
glibc-rh2180155-2.patch
Normal file
477
glibc-rh2180155-2.patch
Normal file
|
@ -0,0 +1,477 @@
|
|||
This patch adds the required @order directives to preserve the
|
||||
GLIBC_PRIVATE ABI.
|
||||
|
||||
commit 31be941e4367c001b2009308839db5c67bf9dcbc
|
||||
Author: Simon Kissane <skissane@gmail.com>
|
||||
Date: Sat Feb 11 20:12:13 2023 +1100
|
||||
|
||||
gmon: improve mcount overflow handling [BZ# 27576]
|
||||
|
||||
When mcount overflows, no gmon.out file is generated, but no message is printed
|
||||
to the user, leaving the user with no idea why, and thinking maybe there is
|
||||
some bug - which is how BZ 27576 ended up being logged. Print a message to
|
||||
stderr in this case so the user knows what is going on.
|
||||
|
||||
As a comment in sys/gmon.h acknowledges, the hardcoded MAXARCS value is too
|
||||
small for some large applications, including the test case in that BZ. Rather
|
||||
than increase it, add tunables to enable MINARCS and MAXARCS to be overridden
|
||||
at runtime (glibc.gmon.minarcs and glibc.gmon.maxarcs). So if a user gets the
|
||||
mcount overflow error, they can try increasing maxarcs (they might need to
|
||||
increase minarcs too if the heuristic is wrong in their case.)
|
||||
|
||||
Note setting minarcs/maxarcs too large can cause monstartup to fail with an
|
||||
out of memory error. If you set them large enough, it can cause an integer
|
||||
overflow in calculating the buffer size. I haven't done anything to defend
|
||||
against that - it would not generally be a security vulnerability, since these
|
||||
tunables will be ignored in suid/sgid programs (due to the SXID_ERASE default),
|
||||
and if you can set GLIBC_TUNABLES in the environment of a process, you can take
|
||||
it over anyway (LD_PRELOAD, LD_LIBRARY_PATH, etc). I thought about modifying
|
||||
the code of monstartup to defend against integer overflows, but doing so is
|
||||
complicated, and I realise the existing code is susceptible to them even prior
|
||||
to this change (e.g. try passing a pathologically large highpc argument to
|
||||
monstartup), so I decided just to leave that possibility in-place.
|
||||
|
||||
Add a test case which demonstrates mcount overflow and the tunables.
|
||||
|
||||
Document the new tunables in the manual.
|
||||
|
||||
Signed-off-by: Simon Kissane <skissane@gmail.com>
|
||||
Reviewed-by: DJ Delorie <dj@redhat.com>
|
||||
|
||||
Conflicts:
|
||||
manual/tunables.texi
|
||||
(missing tunables downstream)
|
||||
|
||||
diff --git a/elf/dl-tunables.list b/elf/dl-tunables.list
|
||||
index f11ca5b3e8b09b43..dc2999796042dbaf 100644
|
||||
--- a/elf/dl-tunables.list
|
||||
+++ b/elf/dl-tunables.list
|
||||
@@ -149,4 +149,17 @@ glibc {
|
||||
default: 2
|
||||
}
|
||||
}
|
||||
+
|
||||
+ gmon {
|
||||
+ minarcs {
|
||||
+ type: INT_32
|
||||
+ minval: 50
|
||||
+ default: 50
|
||||
+ }
|
||||
+ maxarcs {
|
||||
+ type: INT_32
|
||||
+ minval: 50
|
||||
+ default: 1048576
|
||||
+ }
|
||||
+ }
|
||||
}
|
||||
diff --git a/gmon/Makefile b/gmon/Makefile
|
||||
index d94593c9d8a882eb..54f05894d4dd8c4a 100644
|
||||
--- a/gmon/Makefile
|
||||
+++ b/gmon/Makefile
|
||||
@@ -25,7 +25,7 @@ include ../Makeconfig
|
||||
headers := sys/gmon.h sys/gmon_out.h sys/profil.h
|
||||
routines := gmon mcount profil sprofil prof-freq
|
||||
|
||||
-tests = tst-sprofil tst-gmon
|
||||
+tests = tst-sprofil tst-gmon tst-mcount-overflow
|
||||
ifeq ($(build-profile),yes)
|
||||
tests += tst-profile-static
|
||||
tests-static += tst-profile-static
|
||||
@@ -56,6 +56,18 @@ ifeq ($(run-built-tests),yes)
|
||||
tests-special += $(objpfx)tst-gmon-gprof.out
|
||||
endif
|
||||
|
||||
+CFLAGS-tst-mcount-overflow.c := -fno-omit-frame-pointer -pg
|
||||
+tst-mcount-overflow-no-pie = yes
|
||||
+CRT-tst-mcount-overflow := $(csu-objpfx)g$(start-installed-name)
|
||||
+# Intentionally use invalid config where maxarcs<minarcs to check warning is printed
|
||||
+tst-mcount-overflow-ENV := GMON_OUT_PREFIX=$(objpfx)tst-mcount-overflow.data \
|
||||
+ GLIBC_TUNABLES=glibc.gmon.minarcs=51:glibc.gmon.maxarcs=50
|
||||
+# Send stderr into output file because we make sure expected messages are printed
|
||||
+tst-mcount-overflow-ARGS := 2>&1 1>/dev/null | cat
|
||||
+ifeq ($(run-built-tests),yes)
|
||||
+tests-special += $(objpfx)tst-mcount-overflow-check.out
|
||||
+endif
|
||||
+
|
||||
CFLAGS-tst-gmon-static.c := $(PIE-ccflag) -fno-omit-frame-pointer -pg
|
||||
CRT-tst-gmon-static := $(csu-objpfx)gcrt1.o
|
||||
tst-gmon-static-no-pie = yes
|
||||
@@ -103,6 +115,14 @@ $(objpfx)tst-gmon.out: clean-tst-gmon-data
|
||||
clean-tst-gmon-data:
|
||||
rm -f $(objpfx)tst-gmon.data.*
|
||||
|
||||
+$(objpfx)tst-mcount-overflow.o: clean-tst-mcount-overflow-data
|
||||
+clean-tst-mcount-overflow-data:
|
||||
+ rm -f $(objpfx)tst-mcount-overflow.data.*
|
||||
+
|
||||
+$(objpfx)tst-mcount-overflow-check.out: tst-mcount-overflow-check.sh $(objpfx)tst-mcount-overflow.out
|
||||
+ $(SHELL) $< $(objpfx)tst-mcount-overflow > $@; \
|
||||
+ $(evaluate-test)
|
||||
+
|
||||
$(objpfx)tst-gmon-gprof.out: tst-gmon-gprof.sh $(objpfx)tst-gmon.out
|
||||
$(SHELL) $< $(GPROF) $(objpfx)tst-gmon $(objpfx)tst-gmon.data.* > $@; \
|
||||
$(evaluate-test)
|
||||
diff --git a/gmon/gmon.c b/gmon/gmon.c
|
||||
index bf76358d5b1aa2da..689bf80141e559ca 100644
|
||||
--- a/gmon/gmon.c
|
||||
+++ b/gmon/gmon.c
|
||||
@@ -46,6 +46,11 @@
|
||||
#include <libc-internal.h>
|
||||
#include <not-cancel.h>
|
||||
|
||||
+#if HAVE_TUNABLES
|
||||
+# define TUNABLE_NAMESPACE gmon
|
||||
+# include <elf/dl-tunables.h>
|
||||
+#endif
|
||||
+
|
||||
#ifdef PIC
|
||||
# include <link.h>
|
||||
|
||||
@@ -124,6 +129,22 @@ __monstartup (u_long lowpc, u_long highpc)
|
||||
int o;
|
||||
char *cp;
|
||||
struct gmonparam *p = &_gmonparam;
|
||||
+ long int minarcs, maxarcs;
|
||||
+
|
||||
+#if HAVE_TUNABLES
|
||||
+ /* Read minarcs/maxarcs tunables. */
|
||||
+ minarcs = TUNABLE_GET (minarcs, int32_t, NULL);
|
||||
+ maxarcs = TUNABLE_GET (maxarcs, int32_t, NULL);
|
||||
+ if (maxarcs < minarcs)
|
||||
+ {
|
||||
+ ERR("monstartup: maxarcs < minarcs, setting maxarcs = minarcs\n");
|
||||
+ maxarcs = minarcs;
|
||||
+ }
|
||||
+#else
|
||||
+ /* No tunables, we use hardcoded defaults */
|
||||
+ minarcs = MINARCS;
|
||||
+ maxarcs = MAXARCS;
|
||||
+#endif
|
||||
|
||||
/*
|
||||
* round lowpc and highpc to multiples of the density we're using
|
||||
@@ -146,10 +167,10 @@ __monstartup (u_long lowpc, u_long highpc)
|
||||
}
|
||||
p->fromssize = ROUNDUP(p->textsize / HASHFRACTION, sizeof(*p->froms));
|
||||
p->tolimit = p->textsize * ARCDENSITY / 100;
|
||||
- if (p->tolimit < MINARCS)
|
||||
- p->tolimit = MINARCS;
|
||||
- else if (p->tolimit > MAXARCS)
|
||||
- p->tolimit = MAXARCS;
|
||||
+ if (p->tolimit < minarcs)
|
||||
+ p->tolimit = minarcs;
|
||||
+ else if (p->tolimit > maxarcs)
|
||||
+ p->tolimit = maxarcs;
|
||||
p->tossize = p->tolimit * sizeof(struct tostruct);
|
||||
|
||||
cp = calloc (p->kcountsize + p->fromssize + p->tossize, 1);
|
||||
diff --git a/gmon/mcount.c b/gmon/mcount.c
|
||||
index 9d4a1a50fa6ab21a..f7180fdb83399a14 100644
|
||||
--- a/gmon/mcount.c
|
||||
+++ b/gmon/mcount.c
|
||||
@@ -41,6 +41,10 @@ static char sccsid[] = "@(#)mcount.c 8.1 (Berkeley) 6/4/93";
|
||||
|
||||
#include <atomic.h>
|
||||
|
||||
+#include <not-cancel.h>
|
||||
+#include <unistd.h>
|
||||
+#define ERR(s) __write_nocancel (STDERR_FILENO, s, sizeof (s) - 1)
|
||||
+
|
||||
/*
|
||||
* mcount is called on entry to each function compiled with the profiling
|
||||
* switch set. _mcount(), which is declared in a machine-dependent way
|
||||
@@ -170,6 +174,7 @@ done:
|
||||
return;
|
||||
overflow:
|
||||
p->state = GMON_PROF_ERROR;
|
||||
+ ERR("mcount: call graph buffer size limit exceeded, gmon.out will not be generated\n");
|
||||
return;
|
||||
}
|
||||
|
||||
diff --git a/gmon/sys/gmon.h b/gmon/sys/gmon.h
|
||||
index b4cc3b043a2aec77..af0582a3717085b5 100644
|
||||
--- a/gmon/sys/gmon.h
|
||||
+++ b/gmon/sys/gmon.h
|
||||
@@ -111,6 +111,8 @@ extern struct __bb *__bb_head;
|
||||
* Always allocate at least this many tostructs. This
|
||||
* hides the inadequacy of the ARCDENSITY heuristic, at least
|
||||
* for small programs.
|
||||
+ *
|
||||
+ * Value can be overridden at runtime by glibc.gmon.minarcs tunable.
|
||||
*/
|
||||
#define MINARCS 50
|
||||
|
||||
@@ -124,8 +126,8 @@ extern struct __bb *__bb_head;
|
||||
* Used to be max representable value of ARCINDEX minus 2, but now
|
||||
* that ARCINDEX is a long, that's too large; we don't really want
|
||||
* to allow a 48 gigabyte table.
|
||||
- * The old value of 1<<16 wasn't high enough in practice for large C++
|
||||
- * programs; will 1<<20 be adequate for long? FIXME
|
||||
+ *
|
||||
+ * Value can be overridden at runtime by glibc.gmon.maxarcs tunable.
|
||||
*/
|
||||
#define MAXARCS (1 << 20)
|
||||
|
||||
diff --git a/gmon/tst-mcount-overflow-check.sh b/gmon/tst-mcount-overflow-check.sh
|
||||
new file mode 100644
|
||||
index 0000000000000000..27eb5538fd573a6e
|
||||
--- /dev/null
|
||||
+++ b/gmon/tst-mcount-overflow-check.sh
|
||||
@@ -0,0 +1,45 @@
|
||||
+#!/bin/sh
|
||||
+# Test expected messages generated when mcount overflows
|
||||
+# Copyright (C) 2017-2023 Free Software Foundation, Inc.
|
||||
+# 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/>.
|
||||
+
|
||||
+LC_ALL=C
|
||||
+export LC_ALL
|
||||
+set -e
|
||||
+exec 2>&1
|
||||
+
|
||||
+program="$1"
|
||||
+
|
||||
+check_msg() {
|
||||
+ if ! grep -q "$1" "$program.out"; then
|
||||
+ echo "FAIL: expected message not in output: $1"
|
||||
+ exit 1
|
||||
+ fi
|
||||
+}
|
||||
+
|
||||
+check_msg 'monstartup: maxarcs < minarcs, setting maxarcs = minarcs'
|
||||
+check_msg 'mcount: call graph buffer size limit exceeded, gmon.out will not be generated'
|
||||
+
|
||||
+for data_file in $1.data.*; do
|
||||
+ if [ -f "$data_file" ]; then
|
||||
+ echo "FAIL: expected no data files, but found $data_file"
|
||||
+ exit 1
|
||||
+ fi
|
||||
+done
|
||||
+
|
||||
+echo PASS
|
||||
diff --git a/gmon/tst-mcount-overflow.c b/gmon/tst-mcount-overflow.c
|
||||
new file mode 100644
|
||||
index 0000000000000000..06cc93ef872eb7c1
|
||||
--- /dev/null
|
||||
+++ b/gmon/tst-mcount-overflow.c
|
||||
@@ -0,0 +1,72 @@
|
||||
+/* Test program to trigger mcount overflow in profiling collection.
|
||||
+ Copyright (C) 2017-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/>. */
|
||||
+
|
||||
+/* Program with sufficiently complex, yet pointless, call graph
|
||||
+ that it will trigger an mcount overflow, when you set the
|
||||
+ minarcs/maxarcs tunables to very low values. */
|
||||
+
|
||||
+#define PREVENT_TAIL_CALL asm volatile ("")
|
||||
+
|
||||
+/* Calls REP(n) macro 16 times, for n=0..15.
|
||||
+ * You need to define REP(n) before using this.
|
||||
+ */
|
||||
+#define REPS \
|
||||
+ REP(0) REP(1) REP(2) REP(3) REP(4) REP(5) REP(6) REP(7) \
|
||||
+ REP(8) REP(9) REP(10) REP(11) REP(12) REP(13) REP(14) REP(15)
|
||||
+
|
||||
+/* Defines 16 leaf functions named f1_0 to f1_15 */
|
||||
+#define REP(n) \
|
||||
+ __attribute__ ((noinline, noclone, weak)) void f1_##n (void) {};
|
||||
+REPS
|
||||
+#undef REP
|
||||
+
|
||||
+/* Calls all 16 leaf functions f1_* in succession */
|
||||
+__attribute__ ((noinline, noclone, weak)) void
|
||||
+f2 (void)
|
||||
+{
|
||||
+# define REP(n) f1_##n();
|
||||
+ REPS
|
||||
+# undef REP
|
||||
+ PREVENT_TAIL_CALL;
|
||||
+}
|
||||
+
|
||||
+/* Defines 16 functions named f2_0 to f2_15, which all just call f2 */
|
||||
+#define REP(n) \
|
||||
+ __attribute__ ((noinline, noclone, weak)) void \
|
||||
+ f2_##n (void) { f2(); PREVENT_TAIL_CALL; };
|
||||
+REPS
|
||||
+#undef REP
|
||||
+
|
||||
+__attribute__ ((noinline, noclone, weak)) void
|
||||
+f3 (int count)
|
||||
+{
|
||||
+ for (int i = 0; i < count; ++i)
|
||||
+ {
|
||||
+ /* Calls f1_0(), f2_0(), f1_1(), f2_1(), f3_0(), etc */
|
||||
+# define REP(n) f1_##n(); f2_##n();
|
||||
+ REPS
|
||||
+# undef REP
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+int
|
||||
+main (void)
|
||||
+{
|
||||
+ f3 (1000);
|
||||
+ return 0;
|
||||
+}
|
||||
diff --git a/manual/tunables.texi b/manual/tunables.texi
|
||||
index 7b70e80391ee87f7..00eafcf44b562b9e 100644
|
||||
--- a/manual/tunables.texi
|
||||
+++ b/manual/tunables.texi
|
||||
@@ -73,6 +73,9 @@ glibc.malloc.check: 0 (min: 0, max: 3)
|
||||
* Elision Tunables:: Tunables in elision subsystem
|
||||
* Hardware Capability Tunables:: Tunables that modify the hardware
|
||||
capabilities seen by @theglibc{}
|
||||
+* gmon Tunables:: Tunables that control the gmon profiler, used in
|
||||
+ conjunction with gprof
|
||||
+
|
||||
@end menu
|
||||
|
||||
@node Tunable names
|
||||
@@ -506,3 +509,59 @@ instead.
|
||||
|
||||
This tunable is specific to i386 and x86-64.
|
||||
@end deftp
|
||||
+
|
||||
+@node gmon Tunables
|
||||
+@section gmon Tunables
|
||||
+@cindex gmon tunables
|
||||
+
|
||||
+@deftp {Tunable namespace} glibc.gmon
|
||||
+This tunable namespace affects the behaviour of the gmon profiler.
|
||||
+gmon is a component of @theglibc{} which is normally used in
|
||||
+conjunction with gprof.
|
||||
+
|
||||
+When GCC compiles a program with the @code{-pg} option, it instruments
|
||||
+the program with calls to the @code{mcount} function, to record the
|
||||
+program's call graph. At program startup, a memory buffer is allocated
|
||||
+to store this call graph; the size of the buffer is calculated using a
|
||||
+heuristic based on code size. If during execution, the buffer is found
|
||||
+to be too small, profiling will be aborted and no @file{gmon.out} file
|
||||
+will be produced. In that case, you will see the following message
|
||||
+printed to standard error:
|
||||
+
|
||||
+@example
|
||||
+mcount: call graph buffer size limit exceeded, gmon.out will not be generated
|
||||
+@end example
|
||||
+
|
||||
+Most of the symbols discussed in this section are defined in the header
|
||||
+@code{sys/gmon.h}. However, some symbols (for example @code{mcount})
|
||||
+are not defined in any header file, since they are only intended to be
|
||||
+called from code generated by the compiler.
|
||||
+@end deftp
|
||||
+
|
||||
+@deftp Tunable glibc.mem.minarcs
|
||||
+The heuristic for sizing the call graph buffer is known to be
|
||||
+insufficient for small programs; hence, the calculated value is clamped
|
||||
+to be at least a minimum size. The default minimum (in units of
|
||||
+call graph entries, @code{struct tostruct}), is given by the macro
|
||||
+@code{MINARCS}. If you have some program with an unusually complex
|
||||
+call graph, for which the heuristic fails to allocate enough space,
|
||||
+you can use this tunable to increase the minimum to a larger value.
|
||||
+@end deftp
|
||||
+
|
||||
+@deftp Tunable glibc.mem.maxarcs
|
||||
+To prevent excessive memory consumption when profiling very large
|
||||
+programs, the call graph buffer is allowed to have a maximum of
|
||||
+@code{MAXARCS} entries. For some very large programs, the default
|
||||
+value of @code{MAXARCS} defined in @file{sys/gmon.h} is too small; in
|
||||
+that case, you can use this tunable to increase it.
|
||||
+
|
||||
+Note the value of the @code{maxarcs} tunable must be greater or equal
|
||||
+to that of the @code{minarcs} tunable; if this constraint is violated,
|
||||
+a warning will printed to standard error at program startup, and
|
||||
+the @code{minarcs} value will be used as the maximum as well.
|
||||
+
|
||||
+Setting either tunable too high may result in a call graph buffer
|
||||
+whose size exceeds the available memory; in that case, an out of memory
|
||||
+error will be printed at program startup, the profiler will be
|
||||
+disabled, and no @file{gmon.out} file will be generated.
|
||||
+@end deftp
|
||||
diff --git a/sysdeps/unix/sysv/linux/aarch64/dl-tunables.list b/sysdeps/unix/sysv/linux/aarch64/dl-tunables.list
|
||||
index 5c3c5292025607a1..265f82ef2be42fd0 100644
|
||||
--- a/sysdeps/unix/sysv/linux/aarch64/dl-tunables.list
|
||||
+++ b/sysdeps/unix/sysv/linux/aarch64/dl-tunables.list
|
||||
@@ -24,3 +24,7 @@
|
||||
|
||||
# Tunables added in RHEL 8.8.0
|
||||
@order glibc.rtld.dynamic_sort
|
||||
+
|
||||
+# Tunables added in RHEL 8.9.0
|
||||
+@order glibc.gmon.minarcs
|
||||
+@order glibc.gmon.maxarcs
|
||||
diff --git a/sysdeps/unix/sysv/linux/i386/dl-tunables.list b/sysdeps/unix/sysv/linux/i386/dl-tunables.list
|
||||
index b9cad4af62d9f2e5..9c1ccb86501c61e7 100644
|
||||
--- a/sysdeps/unix/sysv/linux/i386/dl-tunables.list
|
||||
+++ b/sysdeps/unix/sysv/linux/i386/dl-tunables.list
|
||||
@@ -31,3 +31,7 @@
|
||||
|
||||
# Tunables added in RHEL 8.8.0
|
||||
@order glibc.rtld.dynamic_sort
|
||||
+
|
||||
+# Tunables added in RHEL 8.9.0
|
||||
+@order glibc.gmon.minarcs
|
||||
+@order glibc.gmon.maxarcs
|
||||
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/dl-tunables.list b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/dl-tunables.list
|
||||
index ee1e6fca95e1f2da..c8bb1a8ec0283ac8 100644
|
||||
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/dl-tunables.list
|
||||
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/dl-tunables.list
|
||||
@@ -24,3 +24,7 @@
|
||||
|
||||
# Tunables added in RHEL 8.8.0
|
||||
@order glibc.rtld.dynamic_sort
|
||||
+
|
||||
+# Tunables added in RHEL 8.9.0
|
||||
+@order glibc.gmon.minarcs
|
||||
+@order glibc.gmon.maxarcs
|
||||
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/dl-tunables.list b/sysdeps/unix/sysv/linux/s390/s390-64/dl-tunables.list
|
||||
index 099e28d8f8e67944..85b3a014ffcadc45 100644
|
||||
--- a/sysdeps/unix/sysv/linux/s390/s390-64/dl-tunables.list
|
||||
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/dl-tunables.list
|
||||
@@ -23,3 +23,7 @@
|
||||
|
||||
# Tunables added in RHEL 8.8.0
|
||||
@order glibc.rtld.dynamic_sort
|
||||
+
|
||||
+# Tunables added in RHEL 8.9.0
|
||||
+@order glibc.gmon.minarcs
|
||||
+@order glibc.gmon.maxarcs
|
||||
diff --git a/sysdeps/unix/sysv/linux/x86_64/64/dl-tunables.list b/sysdeps/unix/sysv/linux/x86_64/64/dl-tunables.list
|
||||
index b9cad4af62d9f2e5..9c1ccb86501c61e7 100644
|
||||
--- a/sysdeps/unix/sysv/linux/x86_64/64/dl-tunables.list
|
||||
+++ b/sysdeps/unix/sysv/linux/x86_64/64/dl-tunables.list
|
||||
@@ -31,3 +31,7 @@
|
||||
|
||||
# Tunables added in RHEL 8.8.0
|
||||
@order glibc.rtld.dynamic_sort
|
||||
+
|
||||
+# Tunables added in RHEL 8.9.0
|
||||
+@order glibc.gmon.minarcs
|
||||
+@order glibc.gmon.maxarcs
|
191
glibc-rh2180155-3.patch
Normal file
191
glibc-rh2180155-3.patch
Normal file
|
@ -0,0 +1,191 @@
|
|||
commit bde121872001d8f3224eeafa5b7effb871c3fbca
|
||||
Author: Simon Kissane <skissane@gmail.com>
|
||||
Date: Sat Feb 11 08:58:02 2023 +1100
|
||||
|
||||
gmon: fix memory corruption issues [BZ# 30101]
|
||||
|
||||
V2 of this patch fixes an issue in V1, where the state was changed to ON not
|
||||
OFF at end of _mcleanup. I hadn't noticed that (counterintuitively) ON=0 and
|
||||
OFF=3, hence zeroing the buffer turned it back on. So set the state to OFF
|
||||
after the memset.
|
||||
|
||||
1. Prevent double free, and reads from unallocated memory, when
|
||||
_mcleanup is (incorrectly) called two or more times in a row,
|
||||
without an intervening call to __monstartup; with this patch, the
|
||||
second and subsequent calls effectively become no-ops instead.
|
||||
While setting tos=NULL is minimal fix, safest action is to zero the
|
||||
whole gmonparam buffer.
|
||||
|
||||
2. Prevent memory leak when __monstartup is (incorrectly) called two
|
||||
or more times in a row, without an intervening call to _mcleanup;
|
||||
with this patch, the second and subsequent calls effectively become
|
||||
no-ops instead.
|
||||
|
||||
3. After _mcleanup, treat __moncontrol(1) as __moncontrol(0) instead.
|
||||
With zeroing of gmonparam buffer in _mcleanup, this stops the
|
||||
state incorrectly being changed to GMON_PROF_ON despite profiling
|
||||
actually being off. If we'd just done the minimal fix to _mcleanup
|
||||
of setting tos=NULL, there is risk of far worse memory corruption:
|
||||
kcount would point to deallocated memory, and the __profil syscall
|
||||
would make the kernel write profiling data into that memory,
|
||||
which could have since been reallocated to something unrelated.
|
||||
|
||||
4. Ensure __moncontrol(0) still turns off profiling even in error
|
||||
state. Otherwise, if mcount overflows and sets state to
|
||||
GMON_PROF_ERROR, when _mcleanup calls __moncontrol(0), the __profil
|
||||
syscall to disable profiling will not be invoked. _mcleanup will
|
||||
free the buffer, but the kernel will still be writing profiling
|
||||
data into it, potentially corrupted arbitrary memory.
|
||||
|
||||
Also adds a test case for (1). Issues (2)-(4) are not feasible to test.
|
||||
|
||||
Signed-off-by: Simon Kissane <skissane@gmail.com>
|
||||
Reviewed-by: DJ Delorie <dj@redhat.com>
|
||||
|
||||
Conflicts:
|
||||
gmon/Makefile
|
||||
(copyright year update)
|
||||
|
||||
diff --git a/gmon/Makefile b/gmon/Makefile
|
||||
index 54f05894d4dd8c4a..1bc4ad6e14e292a9 100644
|
||||
--- a/gmon/Makefile
|
||||
+++ b/gmon/Makefile
|
||||
@@ -1,4 +1,5 @@
|
||||
-# Copyright (C) 1995-2018 Free Software Foundation, Inc.
|
||||
+# Copyright (C) 1995-2023 Free Software Foundation, Inc.
|
||||
+# 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
|
||||
@@ -25,7 +26,7 @@ include ../Makeconfig
|
||||
headers := sys/gmon.h sys/gmon_out.h sys/profil.h
|
||||
routines := gmon mcount profil sprofil prof-freq
|
||||
|
||||
-tests = tst-sprofil tst-gmon tst-mcount-overflow
|
||||
+tests = tst-sprofil tst-gmon tst-mcount-overflow tst-mcleanup
|
||||
ifeq ($(build-profile),yes)
|
||||
tests += tst-profile-static
|
||||
tests-static += tst-profile-static
|
||||
@@ -68,6 +69,14 @@ ifeq ($(run-built-tests),yes)
|
||||
tests-special += $(objpfx)tst-mcount-overflow-check.out
|
||||
endif
|
||||
|
||||
+CFLAGS-tst-mcleanup.c := -fno-omit-frame-pointer -pg
|
||||
+tst-mcleanup-no-pie = yes
|
||||
+CRT-tst-mcleanup := $(csu-objpfx)g$(start-installed-name)
|
||||
+tst-mcleanup-ENV := GMON_OUT_PREFIX=$(objpfx)tst-mcleanup.data
|
||||
+ifeq ($(run-built-tests),yes)
|
||||
+tests-special += $(objpfx)tst-mcleanup.out
|
||||
+endif
|
||||
+
|
||||
CFLAGS-tst-gmon-static.c := $(PIE-ccflag) -fno-omit-frame-pointer -pg
|
||||
CRT-tst-gmon-static := $(csu-objpfx)gcrt1.o
|
||||
tst-gmon-static-no-pie = yes
|
||||
@@ -123,6 +132,10 @@ $(objpfx)tst-mcount-overflow-check.out: tst-mcount-overflow-check.sh $(objpfx)ts
|
||||
$(SHELL) $< $(objpfx)tst-mcount-overflow > $@; \
|
||||
$(evaluate-test)
|
||||
|
||||
+$(objpfx)tst-mcleanup.out: clean-tst-mcleanup-data
|
||||
+clean-tst-mcleanup-data:
|
||||
+ rm -f $(objpfx)tst-mcleanup.data.*
|
||||
+
|
||||
$(objpfx)tst-gmon-gprof.out: tst-gmon-gprof.sh $(objpfx)tst-gmon.out
|
||||
$(SHELL) $< $(GPROF) $(objpfx)tst-gmon $(objpfx)tst-gmon.data.* > $@; \
|
||||
$(evaluate-test)
|
||||
diff --git a/gmon/gmon.c b/gmon/gmon.c
|
||||
index 689bf80141e559ca..5e99a7351dc71666 100644
|
||||
--- a/gmon/gmon.c
|
||||
+++ b/gmon/gmon.c
|
||||
@@ -102,11 +102,8 @@ __moncontrol (int mode)
|
||||
{
|
||||
struct gmonparam *p = &_gmonparam;
|
||||
|
||||
- /* Don't change the state if we ran into an error. */
|
||||
- if (p->state == GMON_PROF_ERROR)
|
||||
- return;
|
||||
-
|
||||
- if (mode)
|
||||
+ /* Treat start request as stop if error or gmon not initialized. */
|
||||
+ if (mode && p->state != GMON_PROF_ERROR && p->tos != NULL)
|
||||
{
|
||||
/* start */
|
||||
__profil((void *) p->kcount, p->kcountsize, p->lowpc, s_scale);
|
||||
@@ -116,7 +113,9 @@ __moncontrol (int mode)
|
||||
{
|
||||
/* stop */
|
||||
__profil(NULL, 0, 0, 0);
|
||||
- p->state = GMON_PROF_OFF;
|
||||
+ /* Don't change the state if we ran into an error. */
|
||||
+ if (p->state != GMON_PROF_ERROR)
|
||||
+ p->state = GMON_PROF_OFF;
|
||||
}
|
||||
}
|
||||
libc_hidden_def (__moncontrol)
|
||||
@@ -146,6 +145,14 @@ __monstartup (u_long lowpc, u_long highpc)
|
||||
maxarcs = MAXARCS;
|
||||
#endif
|
||||
|
||||
+ /*
|
||||
+ * If we are incorrectly called twice in a row (without an
|
||||
+ * intervening call to _mcleanup), ignore the second call to
|
||||
+ * prevent leaking memory.
|
||||
+ */
|
||||
+ if (p->tos != NULL)
|
||||
+ return;
|
||||
+
|
||||
/*
|
||||
* round lowpc and highpc to multiples of the density we're using
|
||||
* so the rest of the scaling (here and in gprof) stays in ints.
|
||||
@@ -463,9 +470,14 @@ _mcleanup (void)
|
||||
{
|
||||
__moncontrol (0);
|
||||
|
||||
- if (_gmonparam.state != GMON_PROF_ERROR)
|
||||
+ if (_gmonparam.state != GMON_PROF_ERROR && _gmonparam.tos != NULL)
|
||||
write_gmon ();
|
||||
|
||||
/* free the memory. */
|
||||
free (_gmonparam.tos);
|
||||
+
|
||||
+ /* reset buffer to initial state for safety */
|
||||
+ memset(&_gmonparam, 0, sizeof _gmonparam);
|
||||
+ /* somewhat confusingly, ON=0, OFF=3 */
|
||||
+ _gmonparam.state = GMON_PROF_OFF;
|
||||
}
|
||||
diff --git a/gmon/tst-mcleanup.c b/gmon/tst-mcleanup.c
|
||||
new file mode 100644
|
||||
index 0000000000000000..b259653ec833aca4
|
||||
--- /dev/null
|
||||
+++ b/gmon/tst-mcleanup.c
|
||||
@@ -0,0 +1,31 @@
|
||||
+/* Test program for repeated invocation of _mcleanup
|
||||
+ 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/>. */
|
||||
+
|
||||
+/* Intentionally calls _mcleanup() twice: once manually, it will be
|
||||
+ called again as an atexit handler. This is incorrect use of the API,
|
||||
+ but the point of the test is to make sure we don't crash when the
|
||||
+ API is misused in this way. */
|
||||
+
|
||||
+#include <sys/gmon.h>
|
||||
+
|
||||
+int
|
||||
+main (void)
|
||||
+{
|
||||
+ _mcleanup();
|
||||
+ return 0;
|
||||
+}
|
216
glibc-rh2180462-1.patch
Normal file
216
glibc-rh2180462-1.patch
Normal file
|
@ -0,0 +1,216 @@
|
|||
From af992e7abdc9049714da76cae1e5e18bc4838fb8 Mon Sep 17 00:00:00 2001
|
||||
From: Noah Goldstein <goldstein.w.n@gmail.com>
|
||||
Date: Wed, 7 Jun 2023 13:18:01 -0500
|
||||
Subject: [PATCH] x86: Increase `non_temporal_threshold` to roughly `sizeof_L3
|
||||
/ 4`
|
||||
Content-type: text/plain; charset=UTF-8
|
||||
|
||||
Current `non_temporal_threshold` set to roughly '3/4 * sizeof_L3 /
|
||||
ncores_per_socket'. This patch updates that value to roughly
|
||||
'sizeof_L3 / 4`
|
||||
|
||||
The original value (specifically dividing the `ncores_per_socket`) was
|
||||
done to limit the amount of other threads' data a `memcpy`/`memset`
|
||||
could evict.
|
||||
|
||||
Dividing by 'ncores_per_socket', however leads to exceedingly low
|
||||
non-temporal thresholds and leads to using non-temporal stores in
|
||||
cases where REP MOVSB is multiple times faster.
|
||||
|
||||
Furthermore, non-temporal stores are written directly to main memory
|
||||
so using it at a size much smaller than L3 can place soon to be
|
||||
accessed data much further away than it otherwise could be. As well,
|
||||
modern machines are able to detect streaming patterns (especially if
|
||||
REP MOVSB is used) and provide LRU hints to the memory subsystem. This
|
||||
in affect caps the total amount of eviction at 1/cache_associativity,
|
||||
far below meaningfully thrashing the entire cache.
|
||||
|
||||
As best I can tell, the benchmarks that lead this small threshold
|
||||
where done comparing non-temporal stores versus standard cacheable
|
||||
stores. A better comparison (linked below) is to be REP MOVSB which,
|
||||
on the measure systems, is nearly 2x faster than non-temporal stores
|
||||
at the low-end of the previous threshold, and within 10% for over
|
||||
100MB copies (well past even the current threshold). In cases with a
|
||||
low number of threads competing for bandwidth, REP MOVSB is ~2x faster
|
||||
up to `sizeof_L3`.
|
||||
|
||||
The divisor of `4` is a somewhat arbitrary value. From benchmarks it
|
||||
seems Skylake and Icelake both prefer a divisor of `2`, but older CPUs
|
||||
such as Broadwell prefer something closer to `8`. This patch is meant
|
||||
to be followed up by another one to make the divisor cpu-specific, but
|
||||
in the meantime (and for easier backporting), this patch settles on
|
||||
`4` as a middle-ground.
|
||||
|
||||
Benchmarks comparing non-temporal stores, REP MOVSB, and cacheable
|
||||
stores where done using:
|
||||
https://github.com/goldsteinn/memcpy-nt-benchmarks
|
||||
|
||||
Sheets results (also available in pdf on the github):
|
||||
https://docs.google.com/spreadsheets/d/e/2PACX-1vS183r0rW_jRX6tG_E90m9qVuFiMbRIJvi5VAE8yYOvEOIEEc3aSNuEsrFbuXw5c3nGboxMmrupZD7K/pubhtml
|
||||
Reviewed-by: DJ Delorie <dj@redhat.com>
|
||||
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
|
||||
---
|
||||
sysdeps/x86/dl-cacheinfo.h | 70 +++++++++++++++++++++++---------------
|
||||
1 file changed, 43 insertions(+), 27 deletions(-)
|
||||
|
||||
[DJ - ported to C8S]
|
||||
|
||||
diff -rup a/sysdeps/x86/cacheinfo.h b/sysdeps/x86/cacheinfo.h
|
||||
--- a/sysdeps/x86/cacheinfo.h 2023-08-08 11:54:09.969791421 -0400
|
||||
+++ b/sysdeps/x86/cacheinfo.h 2023-08-08 13:44:55.185333601 -0400
|
||||
@@ -46,7 +46,7 @@ long int __x86_rep_movsb_threshold attri
|
||||
long int __x86_rep_stosb_threshold attribute_hidden = 2048;
|
||||
|
||||
static void
|
||||
-get_common_cache_info (long int *shared_ptr, unsigned int *threads_ptr,
|
||||
+get_common_cache_info (long int *shared_ptr, long int * shared_per_thread_ptr, unsigned int *threads_ptr,
|
||||
long int core)
|
||||
{
|
||||
unsigned int eax;
|
||||
@@ -65,6 +65,7 @@ get_common_cache_info (long int *shared_
|
||||
unsigned int family = cpu_features->basic.family;
|
||||
unsigned int model = cpu_features->basic.model;
|
||||
long int shared = *shared_ptr;
|
||||
+ long int shared_per_thread = *shared_per_thread_ptr;
|
||||
unsigned int threads = *threads_ptr;
|
||||
bool inclusive_cache = true;
|
||||
bool support_count_mask = true;
|
||||
@@ -80,6 +81,7 @@ get_common_cache_info (long int *shared_
|
||||
/* Try L2 otherwise. */
|
||||
level = 2;
|
||||
shared = core;
|
||||
+ shared_per_thread = core;
|
||||
threads_l2 = 0;
|
||||
threads_l3 = -1;
|
||||
}
|
||||
@@ -236,29 +238,28 @@ get_common_cache_info (long int *shared_
|
||||
}
|
||||
else
|
||||
{
|
||||
-intel_bug_no_cache_info:
|
||||
- /* Assume that all logical threads share the highest cache
|
||||
- level. */
|
||||
- threads
|
||||
- = ((cpu_features->features[COMMON_CPUID_INDEX_1].cpuid.ebx
|
||||
- >> 16) & 0xff);
|
||||
- }
|
||||
-
|
||||
- /* Cap usage of highest cache level to the number of supported
|
||||
- threads. */
|
||||
- if (shared > 0 && threads > 0)
|
||||
- shared /= threads;
|
||||
+ intel_bug_no_cache_info:
|
||||
+ /* Assume that all logical threads share the highest cache
|
||||
+ level. */
|
||||
+ threads = ((cpu_features->features[COMMON_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;
|
||||
+ }
|
||||
}
|
||||
|
||||
/* Account for non-inclusive L2 and L3 caches. */
|
||||
if (!inclusive_cache)
|
||||
{
|
||||
if (threads_l2 > 0)
|
||||
- core /= threads_l2;
|
||||
+ shared_per_thread += core / threads_l2;
|
||||
shared += core;
|
||||
}
|
||||
|
||||
*shared_ptr = shared;
|
||||
+ *shared_per_thread_ptr = shared_per_thread;
|
||||
*threads_ptr = threads;
|
||||
}
|
||||
|
||||
@@ -272,6 +273,7 @@ init_cacheinfo (void)
|
||||
int max_cpuid_ex;
|
||||
long int data = -1;
|
||||
long int shared = -1;
|
||||
+ long int shared_per_thread = -1;
|
||||
long int core;
|
||||
unsigned int threads = 0;
|
||||
const struct cpu_features *cpu_features = __get_cpu_features ();
|
||||
@@ -287,22 +289,25 @@ init_cacheinfo (void)
|
||||
data = handle_intel (_SC_LEVEL1_DCACHE_SIZE, cpu_features);
|
||||
core = handle_intel (_SC_LEVEL2_CACHE_SIZE, cpu_features);
|
||||
shared = handle_intel (_SC_LEVEL3_CACHE_SIZE, cpu_features);
|
||||
+ shared_per_thread = shared;
|
||||
|
||||
- get_common_cache_info (&shared, &threads, core);
|
||||
+ get_common_cache_info (&shared, &shared_per_thread, &threads, core);
|
||||
}
|
||||
else if (cpu_features->basic.kind == arch_kind_zhaoxin)
|
||||
{
|
||||
data = handle_zhaoxin (_SC_LEVEL1_DCACHE_SIZE);
|
||||
core = handle_zhaoxin (_SC_LEVEL2_CACHE_SIZE);
|
||||
shared = handle_zhaoxin (_SC_LEVEL3_CACHE_SIZE);
|
||||
+ shared_per_thread = shared;
|
||||
|
||||
- get_common_cache_info (&shared, &threads, core);
|
||||
+ get_common_cache_info (&shared, &shared_per_thread, &threads, core);
|
||||
}
|
||||
else if (cpu_features->basic.kind == arch_kind_amd)
|
||||
{
|
||||
data = handle_amd (_SC_LEVEL1_DCACHE_SIZE);
|
||||
long int core = handle_amd (_SC_LEVEL2_CACHE_SIZE);
|
||||
shared = handle_amd (_SC_LEVEL3_CACHE_SIZE);
|
||||
+ shared_per_thread = shared;
|
||||
|
||||
/* Get maximum extended function. */
|
||||
__cpuid (0x80000000, max_cpuid_ex, ebx, ecx, edx);
|
||||
@@ -352,6 +357,9 @@ init_cacheinfo (void)
|
||||
shared += core;
|
||||
}
|
||||
}
|
||||
+
|
||||
+ if (shared_per_thread <= 0)
|
||||
+ shared_per_thread = shared;
|
||||
}
|
||||
|
||||
if (cpu_features->data_cache_size != 0)
|
||||
@@ -380,20 +388,30 @@ init_cacheinfo (void)
|
||||
__x86_shared_cache_size = shared;
|
||||
}
|
||||
|
||||
- /* The default setting for the non_temporal threshold is 3/4 of one
|
||||
- thread's share of the chip's cache. For most Intel and AMD processors
|
||||
- with an initial release date between 2017 and 2020, a thread's typical
|
||||
- share of the cache is from 500 KBytes to 2 MBytes. Using the 3/4
|
||||
- threshold leaves 125 KBytes to 500 KBytes of the thread's data
|
||||
- in cache after a maximum temporal copy, which will maintain
|
||||
- in cache a reasonable portion of the thread's stack and other
|
||||
- active data. If the threshold is set higher than one thread's
|
||||
- share of the cache, it has a substantial risk of negatively
|
||||
- impacting the performance of other threads running on the chip. */
|
||||
+ /* The default setting for the non_temporal threshold is 1/4 of size
|
||||
+ of the chip's cache. For most Intel and AMD processors with an
|
||||
+ initial release date between 2017 and 2023, a thread's typical
|
||||
+ share of the cache is from 18-64MB. Using the 1/4 L3 is meant to
|
||||
+ estimate the point where non-temporal stores begin out-competing
|
||||
+ REP MOVSB. As well the point where the fact that non-temporal
|
||||
+ stores are forced back to main memory would already occurred to the
|
||||
+ majority of the lines in the copy. Note, concerns about the
|
||||
+ entire L3 cache being evicted by the copy are mostly alleviated
|
||||
+ by the fact that modern HW detects streaming patterns and
|
||||
+ provides proper LRU hints so that the maximum thrashing
|
||||
+ capped at 1/associativity. */
|
||||
+ unsigned long int non_temporal_threshold = shared / 4;
|
||||
+ /* If no ERMS, we use the per-thread L3 chunking. Normal cacheable stores run
|
||||
+ a higher risk of actually thrashing the cache as they don't have a HW LRU
|
||||
+ hint. As well, their performance in highly parallel situations is
|
||||
+ noticeably worse. */
|
||||
+ if (!CPU_FEATURE_USABLE_P (cpu_features, ERMS))
|
||||
+ non_temporal_threshold = shared_per_thread * 3 / 4;
|
||||
+
|
||||
__x86_shared_non_temporal_threshold
|
||||
= (cpu_features->non_temporal_threshold != 0
|
||||
? cpu_features->non_temporal_threshold
|
||||
- : __x86_shared_cache_size * 3 / 4);
|
||||
+ : non_temporal_threshold);
|
||||
|
||||
/* NB: The REP MOVSB threshold must be greater than VEC_SIZE * 8. */
|
||||
unsigned int minimum_rep_movsb_threshold;
|
||||
Only in b/sysdeps/x86: cacheinfo.h~
|
47
glibc-rh2180462-2.patch
Normal file
47
glibc-rh2180462-2.patch
Normal file
|
@ -0,0 +1,47 @@
|
|||
From 47f747217811db35854ea06741be3685e8bbd44d Mon Sep 17 00:00:00 2001
|
||||
From: Noah Goldstein <goldstein.w.n@gmail.com>
|
||||
Date: Mon, 17 Jul 2023 23:14:33 -0500
|
||||
Subject: [PATCH] x86: Fix slight bug in `shared_per_thread` cache size
|
||||
calculation.
|
||||
Content-type: text/plain; charset=UTF-8
|
||||
|
||||
After:
|
||||
```
|
||||
commit af992e7abdc9049714da76cae1e5e18bc4838fb8
|
||||
Author: Noah Goldstein <goldstein.w.n@gmail.com>
|
||||
Date: Wed Jun 7 13:18:01 2023 -0500
|
||||
|
||||
x86: Increase `non_temporal_threshold` to roughly `sizeof_L3 / 4`
|
||||
```
|
||||
|
||||
Split `shared` (cumulative cache size) from `shared_per_thread` (cache
|
||||
size per socket), the `shared_per_thread` *can* be slightly off from
|
||||
the previous calculation.
|
||||
|
||||
Previously we added `core` even if `threads_l2` was invalid, and only
|
||||
used `threads_l2` to divide `core` if it was present. The changed
|
||||
version only included `core` if `threads_l2` was valid.
|
||||
|
||||
This change restores the old behavior if `threads_l2` is invalid by
|
||||
adding the entire value of `core`.
|
||||
Reviewed-by: DJ Delorie <dj@redhat.com>
|
||||
---
|
||||
sysdeps/x86/dl-cacheinfo.h | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
[DJ - ported to C8S]
|
||||
|
||||
diff -rup b1/sysdeps/x86/cacheinfo.h b2/sysdeps/x86/cacheinfo.h
|
||||
--- b1/sysdeps/x86/cacheinfo.h 2023-08-08 13:44:55.185333601 -0400
|
||||
+++ b2/sysdeps/x86/cacheinfo.h 2023-08-08 13:55:16.474680016 -0400
|
||||
@@ -253,8 +253,8 @@ get_common_cache_info (long int *shared_
|
||||
/* Account for non-inclusive L2 and L3 caches. */
|
||||
if (!inclusive_cache)
|
||||
{
|
||||
- if (threads_l2 > 0)
|
||||
- shared_per_thread += core / threads_l2;
|
||||
+ long int core_per_thread = threads_l2 > 0 ? (core / threads_l2) : core;
|
||||
+ shared_per_thread += core_per_thread;
|
||||
shared += core;
|
||||
}
|
||||
|
44
glibc-rh2180462-3.patch
Normal file
44
glibc-rh2180462-3.patch
Normal file
|
@ -0,0 +1,44 @@
|
|||
From 8b9a0af8ca012217bf90d1dc0694f85b49ae09da Mon Sep 17 00:00:00 2001
|
||||
From: Noah Goldstein <goldstein.w.n@gmail.com>
|
||||
Date: Tue, 18 Jul 2023 10:27:59 -0500
|
||||
Subject: [PATCH] [PATCH v1] x86: Use `3/4*sizeof(per-thread-L3)` as low bound
|
||||
for NT threshold.
|
||||
Content-type: text/plain; charset=UTF-8
|
||||
|
||||
On some machines we end up with incomplete cache information. This can
|
||||
make the new calculation of `sizeof(total-L3)/custom-divisor` end up
|
||||
lower than intended (and lower than the prior value). So reintroduce
|
||||
the old bound as a lower bound to avoid potentially regressing code
|
||||
where we don't have complete information to make the decision.
|
||||
Reviewed-by: DJ Delorie <dj@redhat.com>
|
||||
---
|
||||
sysdeps/x86/dl-cacheinfo.h | 15 ++++++++++++---
|
||||
1 file changed, 12 insertions(+), 3 deletions(-)
|
||||
|
||||
[DJ - ported to C8S]
|
||||
|
||||
diff -rup b2/sysdeps/x86/cacheinfo.h b3/sysdeps/x86/cacheinfo.h
|
||||
--- b2/sysdeps/x86/cacheinfo.h 2023-08-08 13:55:16.474680016 -0400
|
||||
+++ b3/sysdeps/x86/cacheinfo.h 2023-08-08 13:59:14.507988958 -0400
|
||||
@@ -401,12 +401,20 @@ init_cacheinfo (void)
|
||||
provides proper LRU hints so that the maximum thrashing
|
||||
capped at 1/associativity. */
|
||||
unsigned long int non_temporal_threshold = shared / 4;
|
||||
+ /* If the computed non_temporal_threshold <= 3/4 * per-thread L3, we most
|
||||
+ likely have incorrect/incomplete cache info in which case, default to
|
||||
+ 3/4 * per-thread L3 to avoid regressions. */
|
||||
+ unsigned long int non_temporal_threshold_lowbound
|
||||
+ = shared_per_thread * 3 / 4;
|
||||
+ if (non_temporal_threshold < non_temporal_threshold_lowbound)
|
||||
+ non_temporal_threshold = non_temporal_threshold_lowbound;
|
||||
+
|
||||
/* If no ERMS, we use the per-thread L3 chunking. Normal cacheable stores run
|
||||
a higher risk of actually thrashing the cache as they don't have a HW LRU
|
||||
hint. As well, their performance in highly parallel situations is
|
||||
noticeably worse. */
|
||||
if (!CPU_FEATURE_USABLE_P (cpu_features, ERMS))
|
||||
- non_temporal_threshold = shared_per_thread * 3 / 4;
|
||||
+ non_temporal_threshold = non_temporal_threshold_lowbound;
|
||||
|
||||
__x86_shared_non_temporal_threshold
|
||||
= (cpu_features->non_temporal_threshold != 0
|
39
glibc-rh2180462-4.patch
Normal file
39
glibc-rh2180462-4.patch
Normal file
|
@ -0,0 +1,39 @@
|
|||
Adjusted for backport to c8s by modifying sysdeps/x86/cacheinfo.h.
|
||||
|
||||
commit 885a7f0feee951f514a121788f46f33b2867110f
|
||||
Author: Noah Goldstein <goldstein.w.n@gmail.com>
|
||||
Date: Fri Aug 11 12:29:11 2023 -0500
|
||||
|
||||
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.
|
||||
|
||||
diff --git a/sysdeps/x86/cacheinfo.h b/sysdeps/x86/cacheinfo.h
|
||||
index 4dbfa979ef052eaa..e53fa25106c95253 100644
|
||||
--- a/sysdeps/x86/cacheinfo.h
|
||||
+++ b/sysdeps/x86/cacheinfo.h
|
||||
@@ -243,11 +243,10 @@ get_common_cache_info (long int *shared_ptr, long int * shared_per_thread_ptr, u
|
||||
level. */
|
||||
threads = ((cpu_features->features[COMMON_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. */
|
35
glibc-rh2183081-1.patch
Normal file
35
glibc-rh2183081-1.patch
Normal file
|
@ -0,0 +1,35 @@
|
|||
commit 5d1ccdda7b0c625751661d50977f3dfbc73f8eae
|
||||
Author: Florian Weimer <fweimer@redhat.com>
|
||||
Date: Mon Apr 3 17:23:11 2023 +0200
|
||||
|
||||
x86_64: Fix asm constraints in feraiseexcept (bug 30305)
|
||||
|
||||
The divss instruction clobbers its first argument, and the constraints
|
||||
need to reflect that. Fortunately, with GCC 12, generated code does
|
||||
not actually change, so there is no externally visible bug.
|
||||
|
||||
Suggested-by: Jakub Jelinek <jakub@redhat.com>
|
||||
Reviewed-by: Noah Goldstein <goldstein.w.n@gmail.com>
|
||||
|
||||
diff --git a/sysdeps/x86_64/fpu/fraiseexcpt.c b/sysdeps/x86_64/fpu/fraiseexcpt.c
|
||||
index ca1c223053bf016b..fb886ed540b52100 100644
|
||||
--- a/sysdeps/x86_64/fpu/fraiseexcpt.c
|
||||
+++ b/sysdeps/x86_64/fpu/fraiseexcpt.c
|
||||
@@ -33,7 +33,7 @@ __feraiseexcept (int excepts)
|
||||
/* One example of an invalid operation is 0.0 / 0.0. */
|
||||
float f = 0.0;
|
||||
|
||||
- __asm__ __volatile__ ("divss %0, %0 " : : "x" (f));
|
||||
+ __asm__ __volatile__ ("divss %0, %0 " : "+x" (f));
|
||||
(void) &f;
|
||||
}
|
||||
|
||||
@@ -43,7 +43,7 @@ __feraiseexcept (int excepts)
|
||||
float f = 1.0;
|
||||
float g = 0.0;
|
||||
|
||||
- __asm__ __volatile__ ("divss %1, %0" : : "x" (f), "x" (g));
|
||||
+ __asm__ __volatile__ ("divss %1, %0" : "+x" (f) : "x" (g));
|
||||
(void) &f;
|
||||
}
|
||||
|
28
glibc-rh2183081-2.patch
Normal file
28
glibc-rh2183081-2.patch
Normal file
|
@ -0,0 +1,28 @@
|
|||
Apply a fix similar to upstream commit 5d1ccdda7b0c625751661d50977f3dfbc73f8eae
|
||||
to the installed header file. Upstream, the header file has been removed
|
||||
in its uncorrected state, so there is no upstream fix to backport.
|
||||
|
||||
Suggested by Jakub Jelinek.
|
||||
|
||||
diff --git a/sysdeps/x86/fpu/bits/fenv.h b/sysdeps/x86/fpu/bits/fenv.h
|
||||
index 4103982d8c8ae014..4ae2d2a04c6754bd 100644
|
||||
--- a/sysdeps/x86/fpu/bits/fenv.h
|
||||
+++ b/sysdeps/x86/fpu/bits/fenv.h
|
||||
@@ -132,7 +132,7 @@ __NTH (__feraiseexcept_invalid_divbyzero (int __excepts))
|
||||
float __f = 0.0;
|
||||
|
||||
# ifdef __SSE_MATH__
|
||||
- __asm__ __volatile__ ("divss %0, %0 " : : "x" (__f));
|
||||
+ __asm__ __volatile__ ("divss %0, %0 " : "+x" (__f));
|
||||
# else
|
||||
__asm__ __volatile__ ("fdiv %%st, %%st(0); fwait"
|
||||
: "=t" (__f) : "0" (__f));
|
||||
@@ -145,7 +145,7 @@ __NTH (__feraiseexcept_invalid_divbyzero (int __excepts))
|
||||
float __g = 0.0;
|
||||
|
||||
# ifdef __SSE_MATH__
|
||||
- __asm__ __volatile__ ("divss %1, %0" : : "x" (__f), "x" (__g));
|
||||
+ __asm__ __volatile__ ("divss %1, %0" : "+x" (__f) : "x" (__g));
|
||||
# else
|
||||
__asm__ __volatile__ ("fdivp %%st, %%st(1); fwait"
|
||||
: "=t" (__f) : "0" (__f), "u" (__g) : "st(1)");
|
46
glibc-rh2186781.patch
Normal file
46
glibc-rh2186781.patch
Normal file
|
@ -0,0 +1,46 @@
|
|||
Only backport po/it.po and po/ja.po changes for the ESTALE message
|
||||
translation which we use during CI testing.
|
||||
|
||||
commit 7ff33eca6860648fb909df954da4996ce853d01d
|
||||
Author: Carlos O'Donell <carlos@redhat.com>
|
||||
Date: Fri Jul 7 11:27:08 2023 -0400
|
||||
|
||||
Translations: Add new ro support and update others.
|
||||
|
||||
This brings in the new Romanian language translations, and updates
|
||||
nine other translations. Important translations in this update
|
||||
include the Italian and Japanese translations for ESTALE which
|
||||
remove the mention of "NFS" from the error message translation.
|
||||
|
||||
diff --git a/po/it.po b/po/it.po
|
||||
index 2750575a1082f1db..6c2be3a4df5611ff 100644
|
||||
--- a/po/it.po
|
||||
+++ b/po/it.po
|
||||
@@ -6793,10 +6793,8 @@ msgstr "Quota disco superata"
|
||||
#. TRANS Repairing this condition usually requires unmounting, possibly repairing
|
||||
#. TRANS and remounting the file system.
|
||||
#: sysdeps/gnu/errlist.c:788
|
||||
-#, fuzzy
|
||||
-#| msgid "Stale NFS file handle"
|
||||
msgid "Stale file handle"
|
||||
-msgstr "Gestione del file NFS interrotta"
|
||||
+msgstr "Riferimento al file obsoleto"
|
||||
|
||||
# lf
|
||||
#. TRANS An attempt was made to NFS-mount a remote file system with a file name that
|
||||
diff --git a/po/ja.po b/po/ja.po
|
||||
index bd9b7ffbbd3e3bf6..8fb598c5edbc5891 100644
|
||||
--- a/po/ja.po
|
||||
+++ b/po/ja.po
|
||||
@@ -6360,10 +6360,8 @@ msgstr "ディスク使用量制限を超過しました"
|
||||
#. TRANS Repairing this condition usually requires unmounting, possibly repairing
|
||||
#. TRANS and remounting the file system.
|
||||
#: sysdeps/gnu/errlist.c:788
|
||||
-#, fuzzy
|
||||
-#| msgid "Stale NFS file handle"
|
||||
msgid "Stale file handle"
|
||||
-msgstr "実効性のないNFSファイルハンドルです"
|
||||
+msgstr "古いファイルハンドルです"
|
||||
|
||||
#. TRANS An attempt was made to NFS-mount a remote file system with a file name that
|
||||
#. TRANS already specifies an NFS-mounted file.
|
26
glibc-rh2213909.patch
Normal file
26
glibc-rh2213909.patch
Normal file
|
@ -0,0 +1,26 @@
|
|||
From abcf8db7fa46b73fd5b8193ce11f9312301b84c7 Mon Sep 17 00:00:00 2001
|
||||
From: Andreas Schwab <schwab@suse.de>
|
||||
Date: Wed, 7 Jun 2023 11:21:48 +0200
|
||||
Subject: resolv_conf: release lock on allocation failure (bug 30527)
|
||||
|
||||
When the initial allocation of global fails, the local lock is left
|
||||
locked.
|
||||
|
||||
Reported by Steffen Lammel of SAP HANA development.
|
||||
|
||||
diff --git a/resolv/resolv_conf.c b/resolv/resolv_conf.c
|
||||
index bd5890773b..8bc9edc634 100644
|
||||
--- a/resolv/resolv_conf.c
|
||||
+++ b/resolv/resolv_conf.c
|
||||
@@ -93,7 +93,10 @@ get_locked_global (void)
|
||||
{
|
||||
global_copy = calloc (1, sizeof (*global));
|
||||
if (global_copy == NULL)
|
||||
- return NULL;
|
||||
+ {
|
||||
+ __libc_lock_unlock (lock);
|
||||
+ return NULL;
|
||||
+ }
|
||||
atomic_store_relaxed (&global, global_copy);
|
||||
resolv_conf_array_init (&global_copy->array);
|
||||
}
|
27
glibc-rh2224348.patch
Normal file
27
glibc-rh2224348.patch
Normal file
|
@ -0,0 +1,27 @@
|
|||
commit 0fda2a41baf7e978d07322aa278e964f4dce8802
|
||||
Author: Florian Weimer <fweimer@redhat.com>
|
||||
Date: Thu Jul 20 18:31:48 2023 +0200
|
||||
|
||||
debug: Mark libSegFault.so as NODELETE
|
||||
|
||||
The signal handler installed in the ELF constructor cannot easily
|
||||
be removed again (because the program may have changed handlers
|
||||
in the meantime). Mark the object as NODELETE so that the registered
|
||||
handler function is never unloaded.
|
||||
|
||||
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
|
||||
(cherry picked from commit 23ee92deea4c99d0e6a5f48fa7b942909b123ec5)
|
||||
|
||||
diff --git a/debug/Makefile b/debug/Makefile
|
||||
index b0f0b7beb6d5cef5..8bce89ddcd0a61ed 100644
|
||||
--- a/debug/Makefile
|
||||
+++ b/debug/Makefile
|
||||
@@ -213,6 +213,8 @@ extra-libs-others = $(extra-libs)
|
||||
|
||||
libSegFault-routines = segfault
|
||||
libSegFault-inhibit-o = $(filter-out .os,$(object-suffixes))
|
||||
+# libSegFault.so installs a signal handler in its ELF constructor.
|
||||
+LDFLAGS-SegFault.so = -Wl,--enable-new-dtags,-z,nodelete
|
||||
|
||||
libpcprofile-routines = pcprofile
|
||||
libpcprofile-inhibit-o = $(filter-out .os,$(object-suffixes))
|
117
glibc.spec
117
glibc.spec
|
@ -1,7 +1,6 @@
|
|||
%global anolis_release .0.5
|
||||
%define glibcsrcdir glibc-2.28
|
||||
%define glibcversion 2.28
|
||||
%define glibcrelease 225%{anolis_release}%{?dist}
|
||||
%define glibcrelease 236%{?dist}
|
||||
# Pre-release tarballs are pulled in from git using a command that is
|
||||
# effectively:
|
||||
#
|
||||
|
@ -133,7 +132,7 @@ end \
|
|||
Summary: The GNU libc libraries
|
||||
Name: glibc
|
||||
Version: %{glibcversion}
|
||||
Release: %{glibcrelease}.6
|
||||
Release: %{glibcrelease}.7
|
||||
|
||||
# In general, GPLv2+ is used by programs, LGPLv2+ is used for
|
||||
# libraries.
|
||||
|
@ -199,9 +198,6 @@ rpm.define("__find_debuginfo " .. wrapper .. " " .. sysroot .. " " .. original)
|
|||
# - See each individual patch file for origin and upstream status.
|
||||
# - For new patches follow template.patch format.
|
||||
##############################################################################
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=30243
|
||||
Patch0: glibc-gb18030-2022-bug30243.patch
|
||||
|
||||
Patch2: glibc-fedora-nscd.patch
|
||||
Patch3: glibc-rh697421.patch
|
||||
Patch4: glibc-fedora-linux-tcsetattr.patch
|
||||
|
@ -1035,22 +1031,28 @@ Patch838: glibc-rh2142937-3.patch
|
|||
Patch839: glibc-rh2144568.patch
|
||||
Patch840: glibc-rh2154914-1.patch
|
||||
Patch841: glibc-rh2154914-2.patch
|
||||
# (Reverted fixes for rh2237433 were here.)
|
||||
Patch848: glibc-rh2234713.patch
|
||||
Patch849: glibc-RHEL-2434.patch
|
||||
Patch850: glibc-RHEL-2422.patch
|
||||
Patch851: glibc-RHEL-3035.patch
|
||||
|
||||
Patch2000: glibc-Properly-check-stack-alignment-BZ-27901.patch
|
||||
Patch2001: glibc-elf-Properly-align-PT_LOAD-segments-BZ-28676-1.patch
|
||||
Patch2002: glibc-Add-a-testcase-to-check-alignment-of-PT_LOAD-segment-2.patch
|
||||
Patch2003: glibc-elf-Align-argument-of-__munmap-to-page-size-BZ-28676-3.patch
|
||||
Patch2004: glibc-Support-target-specific-ALIGN-for-variable-alignment-4.patch
|
||||
Patch2005: glibc-elf-Fix-tst-align3.patch
|
||||
|
||||
Patch2006: glibc-Sync-to-lnd-35-for-LoongArch.patch
|
||||
Patch2007: Fix-tst-cancel21.c-to-suit-kernel-struct-sigcontext-.patch
|
||||
Patch2008: glibc-aarch64-Increase-small-and-medium-cases-for-__memcpy.patch
|
||||
Patch842: glibc-rh2183081-1.patch
|
||||
Patch843: glibc-rh2183081-2.patch
|
||||
Patch844: glibc-rh2172949.patch
|
||||
Patch845: glibc-rh2180155-1.patch
|
||||
Patch846: glibc-rh2180155-2.patch
|
||||
Patch847: glibc-rh2180155-3.patch
|
||||
Patch848: glibc-rh2213909.patch
|
||||
Patch849: glibc-rh2176707-1.patch
|
||||
Patch850: glibc-rh2176707-2.patch
|
||||
Patch851: glibc-rh2186781.patch
|
||||
Patch852: glibc-rh2224348.patch
|
||||
Patch853: glibc-rh2176707-3.patch
|
||||
Patch854: glibc-rh2180462-1.patch
|
||||
Patch855: glibc-rh2180462-2.patch
|
||||
Patch856: glibc-rh2180462-3.patch
|
||||
Patch857: glibc-rh2180462-4.patch
|
||||
# (Reverted fixes for rh2233338 were here.)
|
||||
Patch864: glibc-rh2234714.patch
|
||||
Patch865: glibc-RHEL-2435.patch
|
||||
Patch866: glibc-RHEL-2435-2.patch
|
||||
Patch867: glibc-RHEL-2423.patch
|
||||
Patch868: glibc-RHEL-3036.patch
|
||||
|
||||
##############################################################################
|
||||
# Continued list of core "glibc" package information:
|
||||
|
@ -1731,11 +1733,6 @@ build()
|
|||
%ifarch %{ix86}
|
||||
--disable-multi-arch \
|
||||
%endif
|
||||
%ifarch loongarch64
|
||||
--enable-stackguard-randomization \
|
||||
--with-selinux \
|
||||
--enable-shared \
|
||||
%endif
|
||||
%if %{without werror}
|
||||
--disable-werror \
|
||||
%endif
|
||||
|
@ -2803,7 +2800,7 @@ fi
|
|||
%ifarch s390x
|
||||
/lib/ld64.so.1
|
||||
%endif
|
||||
%verify(not md5 size mtime) %config(noreplace) /etc/nsswitch.conf
|
||||
%verify(not md5 size mtime link) %config(noreplace) /etc/nsswitch.conf
|
||||
%verify(not md5 size mtime) %config(noreplace) /etc/ld.so.conf
|
||||
%verify(not md5 size mtime) %config(noreplace) /etc/rpc
|
||||
%dir /etc/ld.so.conf.d
|
||||
|
@ -2886,31 +2883,59 @@ fi
|
|||
%files -f compat-libpthread-nonshared.filelist -n compat-libpthread-nonshared
|
||||
|
||||
%changelog
|
||||
* Mon Dec 11 2023 Kaiqiang Wang <wangkaiqiang@inspur.com> - 2.28-225.0.5.6
|
||||
* aarch64: Increase small and medium cases for __memcpy_generic (bug#7060)
|
||||
* Wed Sep 20 2023 Siddhesh Poyarekar <siddhesh@redhat.com> - 2.28-236.7
|
||||
- CVE-2023-4911 glibc: buffer overflow in ld.so leading to privilege escalation (RHEL-3036)
|
||||
|
||||
* Sun Oct 08 2023 Rongwei Wang <rongwei.wang@linux.alibaba.com> - 2.28-225.0.4.6
|
||||
- elf: Properly align PT_LOAD segments
|
||||
- Sync loongarch64 code to lnd.35. (lixing@loongson.cn)
|
||||
- Add patch for gb18030-2022 from upstream bug#30243 (fundawang@yeah.net)
|
||||
* Tue Sep 19 2023 Carlos O'Donell <carlos@redhat.com> - 2.28-236.6
|
||||
- Revert: Always call destructors in reverse constructor order (#2233338)
|
||||
|
||||
* Wed Sep 20 2023 Siddhesh Poyarekar <siddhesh@redhat.com> - 2.28-236.6
|
||||
- CVE-2023-4911 glibc: buffer overflow in ld.so leading to privilege escalation (RHEL-3035)
|
||||
* Tue Sep 19 2023 Siddhesh Poyarekar <siddhesh@redhat.com> - 2.28-236.5
|
||||
- CVE-2023-4806 glibc: potential use-after-free in getaddrinfo (RHEL-2423)
|
||||
|
||||
* Tue Sep 19 2023 Carlos O'Donell <carlos@redhat.com> - 2.28-236.5
|
||||
- Revert: Always call destructors in reverse constructor order (#2237433)
|
||||
* Tue Sep 19 2023 Siddhesh Poyarekar <siddhesh@redhat.com> - 2.28-236.4
|
||||
- CVE-2023-4813: Work around RHEL-8 limitation in test (RHEL-2435)
|
||||
|
||||
* Mon Sep 18 2023 Siddhesh Poyarekar <siddhesh@redhat.com> - 2.28-225.4
|
||||
- CVE-2023-4806: potential use-after-free in getaddrinfo (RHEL-2422)
|
||||
* Fri Sep 15 2023 Siddhesh Poyarekar <siddhesh@redhat.com> - 2.28-236.3
|
||||
- CVE-2023-4813: potential use-after-free in gaih_inet (RHEL-2435)
|
||||
|
||||
* Fri Sep 15 2023 Siddhesh Poyarekar <siddhesh@redhat.com> - 2.28-225.3
|
||||
- CVE-2023-4813: potential use-after-free in gaih_inet (RHEL-2434)
|
||||
* Wed Sep 13 2023 Florian Weimer <fweimer@redhat.com> - 2.28-236.2
|
||||
- CVE-2023-4527: Stack read overflow in getaddrinfo in no-aaaa mode (#2234714)
|
||||
|
||||
* Fri Sep 15 2023 Carlos O'Donell <carlos@redhat.com> - 2.28-225.2
|
||||
- CVE-2023-4527: Stack read overflow in getaddrinfo in no-aaaa mode (#2234713)
|
||||
* Mon Sep 11 2023 Florian Weimer <fweimer@redhat.com> - 2.28-236.1
|
||||
- Always call destructors in reverse constructor order (#2233338)
|
||||
|
||||
* Tue Sep 12 2023 Florian Weimer <fweimer@redhat.com> - 2.28-225.1
|
||||
- Always call destructors in reverse constructor order (#2237433)
|
||||
* Tue Aug 15 2023 Carlos O'Donell <carlos@redhat.com> - 2.28-236
|
||||
- Fix string and memory function tuning on small systems (#2180462)
|
||||
|
||||
* Tue Aug 8 2023 DJ Delorie <dj@redhat.com> - 2.28-235
|
||||
- Fix temporal threshold calculations (#2180462)
|
||||
|
||||
* Mon Aug 7 2023 Florian Weimer <fweimer@redhat.com> - 2.28-234
|
||||
- Ignore symbolic link change on /etc/nsswitch.conf (#2229709)
|
||||
|
||||
* Wed Jul 26 2023 DJ Delorie <dj@redhat.com> - 2.28-233
|
||||
- Update test to closer match upstream. (#2176707)
|
||||
|
||||
* Fri Jul 21 2023 Florian Weimer <fweimer@redhat.com> - 2.28-232
|
||||
- Make libSegFault.so NODELETE (#2224348)
|
||||
|
||||
* Sun Jul 9 2023 Carlos O'Donell <carlos@redhat.com> - 2.28-231
|
||||
- Update ESTALE error message translations (#2186781)
|
||||
|
||||
* Fri Jul 7 2023 DJ Delorie <dj@redhat.com> - 2.28-230
|
||||
- Don't block SIGCHILD when system() is called concurrently (#2176707)
|
||||
|
||||
* Mon Jul 3 2023 DJ Delorie <dj@redhat.com> - 2.28-229
|
||||
- resolv_conf: release lock on allocation failure (#2213909)
|
||||
|
||||
* Mon May 22 2023 Florian Weimer <fweimer@redhat.com> - 2.28-228
|
||||
- gmon: Various bug fixes (#2180155)
|
||||
|
||||
* Thu May 18 2023 Patsy Griffin <patsy@redhat.com> - 2.28-227
|
||||
- Change sgetsgent_r to set errno. (#2172949)
|
||||
|
||||
* Wed May 3 2023 Florian Weimer <fweimer@redhat.com> - 2.28-226
|
||||
- Fix incorrect inline feraiseexcept on i686, x86-64 (#2183081)
|
||||
|
||||
* Fri Jan 20 2023 Florian Weimer <fweimer@redhat.com> - 2.28-225
|
||||
- Enforce a specififc internal ordering for tunables (#2154914)
|
||||
|
|
Loading…
Add table
Reference in a new issue