forked from pool/glibc
Compare commits
27 Commits
Author | SHA256 | Date | |
---|---|---|---|
99d9e86c19 | |||
0f02b9038e | |||
9c1c2b081c | |||
5bd8466551 | |||
27334820a5 | |||
3127b0cbf2 | |||
6d9b33432f | |||
c83b499904 | |||
6221b919c5 | |||
c7778fe3e4 | |||
239a3794f8 | |||
4a1755eb7b | |||
502561a1bc | |||
2944293d8d | |||
3e4496ae49 | |||
a9219ffbc4 | |||
65696cf8bf | |||
b8816f2fbf | |||
d4ecb2ad0f | |||
23b7c8f1e6 | |||
b1148a59be | |||
5b59e136b2 | |||
7c5fa00607 | |||
7cf128760d | |||
38c25e64ac | |||
2b44d049a5 | |||
fb6d67127b |
@@ -1,40 +0,0 @@
|
|||||||
From 63295e4fda1f6dab4bf7442706fe303bf283036c Mon Sep 17 00:00:00 2001
|
|
||||||
From: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
|
||||||
Date: Mon, 5 Feb 2024 16:10:24 +0000
|
|
||||||
Subject: [PATCH] arm: Remove wrong ldr from _dl_start_user (BZ 31339)
|
|
||||||
|
|
||||||
The commit 49d877a80b29d3002887b084eec6676d9f5fec18 (arm: Remove
|
|
||||||
_dl_skip_args usage) removed the _SKIP_ARGS literal, which was
|
|
||||||
previously loader to r4 on loader _start. However, the cleanup did not
|
|
||||||
remove the following 'ldr r4, [sl, r4]' on _dl_start_user, used to check
|
|
||||||
to skip the arguments after ld self-relocations.
|
|
||||||
|
|
||||||
In my testing, the kernel initially set r4 to 0, which makes the
|
|
||||||
ldr instruction just read the _GLOBAL_OFFSET_TABLE_. However, since r4
|
|
||||||
is a callee-saved register; a different runtime might not zero
|
|
||||||
initialize it and thus trigger an invalid memory access.
|
|
||||||
|
|
||||||
Checked on arm-linux-gnu.
|
|
||||||
|
|
||||||
Reported-by: Adrian Ratiu <adrian.ratiu@collabora.com>
|
|
||||||
Reviewed-by: Szabolcs Nagy <szabolcs.nagy@arm.com>
|
|
||||||
(cherry picked from commit 1e25112dc0cb2515d27d8d178b1ecce778a9d37a)
|
|
||||||
---
|
|
||||||
sysdeps/arm/dl-machine.h | 1 -
|
|
||||||
1 file changed, 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/sysdeps/arm/dl-machine.h b/sysdeps/arm/dl-machine.h
|
|
||||||
index b857bbc868..dd1a0f6b6e 100644
|
|
||||||
--- a/sysdeps/arm/dl-machine.h
|
|
||||||
+++ b/sysdeps/arm/dl-machine.h
|
|
||||||
@@ -139,7 +139,6 @@ _start:\n\
|
|
||||||
_dl_start_user:\n\
|
|
||||||
adr r6, .L_GET_GOT\n\
|
|
||||||
add sl, sl, r6\n\
|
|
||||||
- ldr r4, [sl, r4]\n\
|
|
||||||
@ save the entry point in another register\n\
|
|
||||||
mov r6, r0\n\
|
|
||||||
@ get the original arg count\n\
|
|
||||||
--
|
|
||||||
2.43.0
|
|
||||||
|
|
@@ -1,57 +0,0 @@
|
|||||||
From 513331b788a3fa633f1d0417d43915e16a0c88f0 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Andreas Schwab <schwab@suse.de>
|
|
||||||
Date: Wed, 6 Mar 2024 12:59:47 +0100
|
|
||||||
Subject: [PATCH] duplocale: protect use of global locale (bug 23970)
|
|
||||||
|
|
||||||
Protect the global locale from being modified while we compute the size of
|
|
||||||
the locale category names. That allows the use of the global locale in a
|
|
||||||
single thread, while all other threads use the thread safe locale
|
|
||||||
functions.
|
|
||||||
---
|
|
||||||
locale/duplocale.c | 14 ++++++++------
|
|
||||||
1 file changed, 8 insertions(+), 6 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/locale/duplocale.c b/locale/duplocale.c
|
|
||||||
index a755ac5c36..bad476700f 100644
|
|
||||||
--- a/locale/duplocale.c
|
|
||||||
+++ b/locale/duplocale.c
|
|
||||||
@@ -43,6 +43,11 @@ __duplocale (locale_t dataset)
|
|
||||||
int cnt;
|
|
||||||
size_t names_len = 0;
|
|
||||||
|
|
||||||
+ /* If dataset points to _nl_global_locale, we need to prevent other
|
|
||||||
+ threads from modifying it. We also modify global data below (the
|
|
||||||
+ usage counts). */
|
|
||||||
+ __libc_rwlock_wrlock (__libc_setlocale_lock);
|
|
||||||
+
|
|
||||||
/* Calculate the total space we need to store all the names. */
|
|
||||||
for (cnt = 0; cnt < __LC_LAST; ++cnt)
|
|
||||||
if (cnt != LC_ALL && dataset->__names[cnt] != _nl_C_name)
|
|
||||||
@@ -55,9 +60,6 @@ __duplocale (locale_t dataset)
|
|
||||||
{
|
|
||||||
char *namep = (char *) (result + 1);
|
|
||||||
|
|
||||||
- /* We modify global data (the usage counts). */
|
|
||||||
- __libc_rwlock_wrlock (__libc_setlocale_lock);
|
|
||||||
-
|
|
||||||
for (cnt = 0; cnt < __LC_LAST; ++cnt)
|
|
||||||
if (cnt != LC_ALL)
|
|
||||||
{
|
|
||||||
@@ -78,11 +80,11 @@ __duplocale (locale_t dataset)
|
|
||||||
result->__ctype_b = dataset->__ctype_b;
|
|
||||||
result->__ctype_tolower = dataset->__ctype_tolower;
|
|
||||||
result->__ctype_toupper = dataset->__ctype_toupper;
|
|
||||||
-
|
|
||||||
- /* It's done. */
|
|
||||||
- __libc_rwlock_unlock (__libc_setlocale_lock);
|
|
||||||
}
|
|
||||||
|
|
||||||
+ /* It's done. */
|
|
||||||
+ __libc_rwlock_unlock (__libc_setlocale_lock);
|
|
||||||
+
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
weak_alias (__duplocale, duplocale)
|
|
||||||
--
|
|
||||||
2.44.0
|
|
||||||
|
|
@@ -1,215 +0,0 @@
|
|||||||
From 71149c2a2e85a8233631cc816030d449f021bb2a Mon Sep 17 00:00:00 2001
|
|
||||||
From: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
|
||||||
Date: Mon, 6 May 2024 13:18:45 -0300
|
|
||||||
Subject: [PATCH] elf: Only process multiple tunable once (BZ 31686)
|
|
||||||
|
|
||||||
The 680c597e9c3 commit made loader reject ill-formatted strings by
|
|
||||||
first tracking all set tunables and then applying them. However, it does
|
|
||||||
not take into consideration if the same tunable is set multiple times,
|
|
||||||
where parse_tunables_string appends the found tunable without checking
|
|
||||||
if it was already in the list. It leads to a stack-based buffer overflow
|
|
||||||
if the tunable is specified more than the total number of tunables. For
|
|
||||||
instance:
|
|
||||||
|
|
||||||
GLIBC_TUNABLES=glibc.malloc.check=2:... (repeat over the number of
|
|
||||||
total support for different tunable).
|
|
||||||
|
|
||||||
Instead, use the index of the tunable list to get the expected tunable
|
|
||||||
entry. Since now the initial list is zero-initialized, the compiler
|
|
||||||
might emit an extra memset and this requires some minor adjustment
|
|
||||||
on some ports.
|
|
||||||
|
|
||||||
Checked on x86_64-linux-gnu and aarch64-linux-gnu.
|
|
||||||
|
|
||||||
Reported-by: Yuto Maeda <maeda@cyberdefense.jp>
|
|
||||||
Reported-by: Yutaro Shimizu <shimizu@cyberdefense.jp>
|
|
||||||
Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
|
|
||||||
(cherry picked from commit bcae44ea8536b30a7119c0986ff5692bddacb672)
|
|
||||||
---
|
|
||||||
elf/dl-tunables.c | 28 ++++++----
|
|
||||||
elf/tst-tunables.c | 61 +++++++++++++++++++++-
|
|
||||||
sysdeps/aarch64/multiarch/memset_generic.S | 4 ++
|
|
||||||
sysdeps/sparc/sparc64/rtld-memset.c | 3 ++
|
|
||||||
4 files changed, 84 insertions(+), 12 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/elf/dl-tunables.c b/elf/dl-tunables.c
|
|
||||||
index 03e1a68675..614ac9c047 100644
|
|
||||||
--- a/elf/dl-tunables.c
|
|
||||||
+++ b/elf/dl-tunables.c
|
|
||||||
@@ -32,6 +32,7 @@
|
|
||||||
#include <ldsodefs.h>
|
|
||||||
#include <array_length.h>
|
|
||||||
#include <dl-minimal-malloc.h>
|
|
||||||
+#include <dl-symbol-redir-ifunc.h>
|
|
||||||
|
|
||||||
#define TUNABLES_INTERNAL 1
|
|
||||||
#include "dl-tunables.h"
|
|
||||||
@@ -223,6 +224,7 @@ parse_tunables_string (const char *valstring, struct tunable_toset_t *tunables)
|
|
||||||
{
|
|
||||||
tunables[ntunables++] =
|
|
||||||
(struct tunable_toset_t) { cur, value, p - value };
|
|
||||||
+
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -234,23 +236,27 @@ parse_tunables_string (const char *valstring, struct tunable_toset_t *tunables)
|
|
||||||
static void
|
|
||||||
parse_tunables (const char *valstring)
|
|
||||||
{
|
|
||||||
- struct tunable_toset_t tunables[tunables_list_size];
|
|
||||||
- int ntunables = parse_tunables_string (valstring, tunables);
|
|
||||||
- if (ntunables == -1)
|
|
||||||
+ struct tunable_toset_t tunables[tunables_list_size] = { 0 };
|
|
||||||
+ if (parse_tunables_string (valstring, tunables) == -1)
|
|
||||||
{
|
|
||||||
_dl_error_printf (
|
|
||||||
"WARNING: ld.so: invalid GLIBC_TUNABLES `%s': ignored.\n", valstring);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
- for (int i = 0; i < ntunables; i++)
|
|
||||||
- if (!tunable_initialize (tunables[i].t, tunables[i].value,
|
|
||||||
- tunables[i].len))
|
|
||||||
- _dl_error_printf ("WARNING: ld.so: invalid GLIBC_TUNABLES value `%.*s' "
|
|
||||||
- "for option `%s': ignored.\n",
|
|
||||||
- (int) tunables[i].len,
|
|
||||||
- tunables[i].value,
|
|
||||||
- tunables[i].t->name);
|
|
||||||
+ for (int i = 0; i < tunables_list_size; i++)
|
|
||||||
+ {
|
|
||||||
+ if (tunables[i].t == NULL)
|
|
||||||
+ continue;
|
|
||||||
+
|
|
||||||
+ if (!tunable_initialize (tunables[i].t, tunables[i].value,
|
|
||||||
+ tunables[i].len))
|
|
||||||
+ _dl_error_printf ("WARNING: ld.so: invalid GLIBC_TUNABLES value `%.*s' "
|
|
||||||
+ "for option `%s': ignored.\n",
|
|
||||||
+ (int) tunables[i].len,
|
|
||||||
+ tunables[i].value,
|
|
||||||
+ tunables[i].t->name);
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Initialize the tunables list from the environment. For now we only use the
|
|
||||||
diff --git a/elf/tst-tunables.c b/elf/tst-tunables.c
|
|
||||||
index 095b5c81d9..dff34ed748 100644
|
|
||||||
--- a/elf/tst-tunables.c
|
|
||||||
+++ b/elf/tst-tunables.c
|
|
||||||
@@ -17,6 +17,10 @@
|
|
||||||
<https://www.gnu.org/licenses/>. */
|
|
||||||
|
|
||||||
#include <array_length.h>
|
|
||||||
+/* The test uses the tunable_list size, which is only exported for
|
|
||||||
+ ld.so. This will result in a copy of tunable_list, which is ununsed by
|
|
||||||
+ the test itself. */
|
|
||||||
+#define TUNABLES_INTERNAL 1
|
|
||||||
#include <dl-tunables.h>
|
|
||||||
#include <getopt.h>
|
|
||||||
#include <intprops.h>
|
|
||||||
@@ -24,12 +28,13 @@
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <support/capture_subprocess.h>
|
|
||||||
#include <support/check.h>
|
|
||||||
+#include <support/support.h>
|
|
||||||
|
|
||||||
static int restart;
|
|
||||||
#define CMDLINE_OPTIONS \
|
|
||||||
{ "restart", no_argument, &restart, 1 },
|
|
||||||
|
|
||||||
-static const struct test_t
|
|
||||||
+static struct test_t
|
|
||||||
{
|
|
||||||
const char *name;
|
|
||||||
const char *value;
|
|
||||||
@@ -284,6 +289,29 @@ static const struct test_t
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
},
|
|
||||||
+ /* Also check for repeated tunables with a count larger than the total number
|
|
||||||
+ of tunables. */
|
|
||||||
+ {
|
|
||||||
+ "GLIBC_TUNABLES",
|
|
||||||
+ NULL,
|
|
||||||
+ 2,
|
|
||||||
+ 0,
|
|
||||||
+ 0,
|
|
||||||
+ },
|
|
||||||
+ {
|
|
||||||
+ "GLIBC_TUNABLES",
|
|
||||||
+ NULL,
|
|
||||||
+ 1,
|
|
||||||
+ 0,
|
|
||||||
+ 0,
|
|
||||||
+ },
|
|
||||||
+ {
|
|
||||||
+ "GLIBC_TUNABLES",
|
|
||||||
+ NULL,
|
|
||||||
+ 0,
|
|
||||||
+ 0,
|
|
||||||
+ 0,
|
|
||||||
+ },
|
|
||||||
};
|
|
||||||
|
|
||||||
static int
|
|
||||||
@@ -327,6 +355,37 @@ do_test (int argc, char *argv[])
|
|
||||||
spargv[i] = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
+ /* Create a tunable line with the duplicate values with a total number
|
|
||||||
+ larger than the different number of tunables. */
|
|
||||||
+ {
|
|
||||||
+ enum { tunables_list_size = array_length (tunable_list) };
|
|
||||||
+ const char *value = "";
|
|
||||||
+ for (int i = 0; i < tunables_list_size; i++)
|
|
||||||
+ value = xasprintf ("%sglibc.malloc.check=2%c",
|
|
||||||
+ value,
|
|
||||||
+ i == (tunables_list_size - 1) ? '\0' : ':');
|
|
||||||
+ tests[33].value = value;
|
|
||||||
+ }
|
|
||||||
+ /* Same as before, but the last tunable values is differen than the
|
|
||||||
+ rest. */
|
|
||||||
+ {
|
|
||||||
+ enum { tunables_list_size = array_length (tunable_list) };
|
|
||||||
+ const char *value = "";
|
|
||||||
+ for (int i = 0; i < tunables_list_size - 1; i++)
|
|
||||||
+ value = xasprintf ("%sglibc.malloc.check=2:", value);
|
|
||||||
+ value = xasprintf ("%sglibc.malloc.check=1", value);
|
|
||||||
+ tests[34].value = value;
|
|
||||||
+ }
|
|
||||||
+ /* Same as before, but with an invalid last entry. */
|
|
||||||
+ {
|
|
||||||
+ enum { tunables_list_size = array_length (tunable_list) };
|
|
||||||
+ const char *value = "";
|
|
||||||
+ for (int i = 0; i < tunables_list_size - 1; i++)
|
|
||||||
+ value = xasprintf ("%sglibc.malloc.check=2:", value);
|
|
||||||
+ value = xasprintf ("%sglibc.malloc.check=1=1", value);
|
|
||||||
+ tests[35].value = value;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
for (int i = 0; i < array_length (tests); i++)
|
|
||||||
{
|
|
||||||
snprintf (nteststr, sizeof nteststr, "%d", i);
|
|
||||||
diff --git a/sysdeps/aarch64/multiarch/memset_generic.S b/sysdeps/aarch64/multiarch/memset_generic.S
|
|
||||||
index 81748bdbce..e125a5ed85 100644
|
|
||||||
--- a/sysdeps/aarch64/multiarch/memset_generic.S
|
|
||||||
+++ b/sysdeps/aarch64/multiarch/memset_generic.S
|
|
||||||
@@ -33,3 +33,7 @@
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <../memset.S>
|
|
||||||
+
|
|
||||||
+#if IS_IN (rtld)
|
|
||||||
+strong_alias (memset, __memset_generic)
|
|
||||||
+#endif
|
|
||||||
diff --git a/sysdeps/sparc/sparc64/rtld-memset.c b/sysdeps/sparc/sparc64/rtld-memset.c
|
|
||||||
index 55f3835790..a19202a620 100644
|
|
||||||
--- a/sysdeps/sparc/sparc64/rtld-memset.c
|
|
||||||
+++ b/sysdeps/sparc/sparc64/rtld-memset.c
|
|
||||||
@@ -1 +1,4 @@
|
|
||||||
#include <string/memset.c>
|
|
||||||
+#if IS_IN(rtld)
|
|
||||||
+strong_alias (memset, __memset_ultra1)
|
|
||||||
+#endif
|
|
||||||
--
|
|
||||||
2.45.0
|
|
||||||
|
|
28
gen-tempname-randomness.patch
Normal file
28
gen-tempname-randomness.patch
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
From 5f62cf88c4530c11904482775b7582bd7f6d80d2 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Andreas Schwab <schwab@suse.de>
|
||||||
|
Date: Wed, 25 Sep 2024 11:49:30 +0200
|
||||||
|
Subject: [PATCH] Fix missing randomness in __gen_tempname (bug 32214)
|
||||||
|
|
||||||
|
Make sure to update the random value also if getrandom fails.
|
||||||
|
|
||||||
|
Fixes: 686d542025 ("posix: Sync tempname with gnulib")
|
||||||
|
---
|
||||||
|
sysdeps/posix/tempname.c | 2 ++
|
||||||
|
1 file changed, 2 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/sysdeps/posix/tempname.c b/sysdeps/posix/tempname.c
|
||||||
|
index c00fe0c181..fc30958a0c 100644
|
||||||
|
--- a/sysdeps/posix/tempname.c
|
||||||
|
+++ b/sysdeps/posix/tempname.c
|
||||||
|
@@ -117,6 +117,8 @@ random_bits (random_value *r, random_value s)
|
||||||
|
succeed. */
|
||||||
|
#if !_LIBC
|
||||||
|
*r = mix_random_values (v, clock ());
|
||||||
|
+#else
|
||||||
|
+ *r = v;
|
||||||
|
#endif
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.46.2
|
||||||
|
|
@@ -1,54 +0,0 @@
|
|||||||
Index: glibc-2.38/debug/strcpy_chk.c
|
|
||||||
===================================================================
|
|
||||||
--- glibc-2.38.orig/debug/strcpy_chk.c
|
|
||||||
+++ glibc-2.38/debug/strcpy_chk.c
|
|
||||||
@@ -31,3 +31,4 @@ __strcpy_chk (char *dest, const char *sr
|
|
||||||
|
|
||||||
return memcpy (dest, src, len + 1);
|
|
||||||
}
|
|
||||||
+libc_hidden_builtin_def (__strcpy_chk)
|
|
||||||
Index: glibc-2.38/include/string.h
|
|
||||||
===================================================================
|
|
||||||
--- glibc-2.38.orig/include/string.h
|
|
||||||
+++ glibc-2.38/include/string.h
|
|
||||||
@@ -213,6 +213,7 @@ libc_hidden_builtin_proto (__memcpy_chk)
|
|
||||||
libc_hidden_builtin_proto (__memmove_chk)
|
|
||||||
libc_hidden_builtin_proto (__mempcpy_chk)
|
|
||||||
libc_hidden_builtin_proto (__memset_chk)
|
|
||||||
+libc_hidden_builtin_proto (__strcpy_chk)
|
|
||||||
libc_hidden_builtin_proto (__stpcpy_chk)
|
|
||||||
libc_hidden_builtin_proto (__strncpy_chk)
|
|
||||||
|
|
||||||
Index: glibc-2.38/intl/loadmsgcat.c
|
|
||||||
===================================================================
|
|
||||||
--- glibc-2.38.orig/intl/loadmsgcat.c
|
|
||||||
+++ glibc-2.38/intl/loadmsgcat.c
|
|
||||||
@@ -796,8 +796,26 @@ _nl_load_domain (struct loaded_l10nfile
|
|
||||||
if (domain_file->filename == NULL)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
- /* Try to open the addressed file. */
|
|
||||||
- fd = open (domain_file->filename, O_RDONLY | O_BINARY);
|
|
||||||
+ /* Replace /locale/ with /usr/share/locale-langpack/ */
|
|
||||||
+ const char *langpackdir = "/usr/share/locale-langpack/";
|
|
||||||
+ char *filename_langpack = malloc (strlen (domain_file->filename)
|
|
||||||
+ + strlen (langpackdir));
|
|
||||||
+ if (filename_langpack != NULL)
|
|
||||||
+ {
|
|
||||||
+ char *p = strstr (domain_file->filename, "/locale/");
|
|
||||||
+ if (p != NULL)
|
|
||||||
+ {
|
|
||||||
+ strcpy (__stpcpy (filename_langpack, langpackdir), p + 8);
|
|
||||||
+ fd = open (filename_langpack, O_RDONLY | O_BINARY);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ free (filename_langpack);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (fd == -1)
|
|
||||||
+ /* Try to open the addressed file. */
|
|
||||||
+ fd = open (domain_file->filename, O_RDONLY | O_BINARY);
|
|
||||||
+
|
|
||||||
if (fd == -1)
|
|
||||||
goto out;
|
|
||||||
|
|
@@ -1,3 +0,0 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
|
||||||
oid sha256:f77bd47cf8170c57365ae7bf86696c118adb3b120d3259c64c502d3dc1e2d926
|
|
||||||
size 18520988
|
|
@@ -1,16 +0,0 @@
|
|||||||
-----BEGIN PGP SIGNATURE-----
|
|
||||||
|
|
||||||
iQIzBAABCAAdFiEEcnNUKzmWLfeymZMUFnkrTqJTQPgFAmW6xDIACgkQFnkrTqJT
|
|
||||||
QPgAAg/9FnW6kXC3eth/BhuzaEEjOmy8BiTSrEHVLWz9veRTuBBYavxH/XUKfLrg
|
|
||||||
dAFMnASU4DtDUFI2kFWGJIDLk8E/rUau8a0f5Skh4W3VSrc7MDvQhMMt1HggRIqE
|
|
||||||
O2G7fS6uKZokZElcvEKYrTnq7iwH25K1lvXUKAeaUnVQg6upGYnCe8vuZutuZR9x
|
|
||||||
OFkewctLM8Canc6wvW0V92Oy+6eZsDq08HCJenFklSh1wz9+MUzyivkv/b6fXK6E
|
|
||||||
lKGLxpPH7vzfKao6YJBrAHT5raFxdz3yUGzevfeBE9S8UrOYHhsoBRZsaQUWkyKU
|
|
||||||
A3Gn1ioTkxj8szfgHCrweN6A4Y4MlGgMeQbplQnrjQEfUTVo9N2zkQwWRsM4VGeF
|
|
||||||
RkbWwpIQg6zMi3BFfizHqAZZWjjWb0wu6mDWmnQBaQ97dN0DAuKJ7cDNmLe6+vOE
|
|
||||||
OkXRTses8Ta3npAxKjrWNm6WjcrYAzEYLGUT6hLBmZj+WulHmRDPEyuo8H3eihuL
|
|
||||||
JzJXc7X6O3HntgCqqGrC4yNGtjRF0r3FjZ9Zrv6snEzWHVBnDw/9C5Ss9aZ+VSxO
|
|
||||||
Uqo0nESWKHtz9UBS73yA/H1k1rMnQS9yeugMoqBil+cJD5xMZETNKFbUGwR8feQ4
|
|
||||||
O6w8uH1q70ZwtTVf3l6sbijMeORfcrS0WEErxm8IREmUbqPIMRw=
|
|
||||||
=uGia
|
|
||||||
-----END PGP SIGNATURE-----
|
|
BIN
glibc-2.40.tar.xz
(Stored with Git LFS)
Normal file
BIN
glibc-2.40.tar.xz
(Stored with Git LFS)
Normal file
Binary file not shown.
16
glibc-2.40.tar.xz.sig
Normal file
16
glibc-2.40.tar.xz.sig
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
-----BEGIN PGP SIGNATURE-----
|
||||||
|
|
||||||
|
iQIzBAABCAAdFiEEcnNUKzmWLfeymZMUFnkrTqJTQPgFAmaeSXIACgkQFnkrTqJT
|
||||||
|
QPhcfw/+LG5lo6bi7F8Kggp7rsxw1QpRsT76HUNdsoVZRbKvERYihexEQST8rNM/
|
||||||
|
BvzWv+eAxE8h1XcBdYk3qKtyvsggVogaxnsfRq1+5yonrI0FGDdQZEjDhYVBEPma
|
||||||
|
T1m8qmZywPingm37gT5RevQJP3vg2OBW9l5/nwGk9K33e+09RXCAyvZVrn7binTV
|
||||||
|
27VESY5/6X7uC2Ga1WnZG2omu3W5+vAsGWoFnCNjJHfqyW6agaGLbGNSBJnSABv+
|
||||||
|
mTy4v8S6zpRovWZOA2hi7FUVbtDyvyJrGZLnTNBA/DxqKiKc2ZQUljXy7Uv+piDt
|
||||||
|
H0bwNsrC0mcRxdqsA8FNUv/gIpHcuBaLjUz37bA6d0iwkvqf8YCJ47O6KbMuuDeu
|
||||||
|
DudKO+QIVTgs0ahUnbomW27Un46cvkM2JM7dU9Akt5Cja9hImOOn1cbotkaMfmsL
|
||||||
|
c3Hq+O3LYwI76p3HUwsjg3xjgoLZy24+46PaXRncrYImgTif6yGq4uVjWXnaFsLs
|
||||||
|
WtE16EU9fvU1zCBRbdcT6cI6TiNQvQdc8aBGxKs4oFTMROWiczfwKmcIrC6OROIJ
|
||||||
|
kW5V0nI5t3Sk8XSubUxj4dZhk6E1e58RhKm/5pcdOVzwbd3H9sb5q/BhlWB7M49M
|
||||||
|
i5n7p77a1YCjuhl/m43Q036uDCER7/JSbnekU6zsTYUDX/ZfWiA=
|
||||||
|
=hPC5
|
||||||
|
-----END PGP SIGNATURE-----
|
@@ -1,38 +0,0 @@
|
|||||||
From 1263d583d2e28afb8be53f8d6922f0842036f35d Mon Sep 17 00:00:00 2001
|
|
||||||
From: Florian Weimer <fweimer@redhat.com>
|
|
||||||
Date: Thu, 25 Apr 2024 15:00:45 +0200
|
|
||||||
Subject: [PATCH] CVE-2024-33599: nscd: Stack-based buffer overflow in netgroup
|
|
||||||
cache (bug 31677)
|
|
||||||
|
|
||||||
Using alloca matches what other caches do. The request length is
|
|
||||||
bounded by MAXKEYLEN.
|
|
||||||
|
|
||||||
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
|
|
||||||
(cherry picked from commit 87801a8fd06db1d654eea3e4f7626ff476a9bdaa)
|
|
||||||
---
|
|
||||||
nscd/netgroupcache.c | 5 +++--
|
|
||||||
1 file changed, 3 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/nscd/netgroupcache.c b/nscd/netgroupcache.c
|
|
||||||
index 0c6e46f15c..f227dc7fa2 100644
|
|
||||||
--- a/nscd/netgroupcache.c
|
|
||||||
+++ b/nscd/netgroupcache.c
|
|
||||||
@@ -502,12 +502,13 @@ addinnetgrX (struct database_dyn *db, int fd, request_header *req,
|
|
||||||
= (struct indataset *) mempool_alloc (db,
|
|
||||||
sizeof (*dataset) + req->key_len,
|
|
||||||
1);
|
|
||||||
- struct indataset dataset_mem;
|
|
||||||
bool cacheable = true;
|
|
||||||
if (__glibc_unlikely (dataset == NULL))
|
|
||||||
{
|
|
||||||
cacheable = false;
|
|
||||||
- dataset = &dataset_mem;
|
|
||||||
+ /* The alloca is safe because nscd_run_worker verfies that
|
|
||||||
+ key_len is not larger than MAXKEYLEN. */
|
|
||||||
+ dataset = alloca (sizeof (*dataset) + req->key_len);
|
|
||||||
}
|
|
||||||
|
|
||||||
datahead_init_pos (&dataset->head, sizeof (*dataset) + req->key_len,
|
|
||||||
--
|
|
||||||
2.45.0
|
|
||||||
|
|
@@ -1,60 +0,0 @@
|
|||||||
From c99f886de54446cd4447db6b44be93dabbdc2f8b Mon Sep 17 00:00:00 2001
|
|
||||||
From: Florian Weimer <fweimer@redhat.com>
|
|
||||||
Date: Thu, 25 Apr 2024 15:01:07 +0200
|
|
||||||
Subject: [PATCH] CVE-2024-33600: nscd: Avoid null pointer crashes after
|
|
||||||
notfound response (bug 31678)
|
|
||||||
|
|
||||||
The addgetnetgrentX call in addinnetgrX may have failed to produce
|
|
||||||
a result, so the result variable in addinnetgrX can be NULL.
|
|
||||||
Use db->negtimeout as the fallback value if there is no result data;
|
|
||||||
the timeout is also overwritten below.
|
|
||||||
|
|
||||||
Also avoid sending a second not-found response. (The client
|
|
||||||
disconnects after receiving the first response, so the data stream did
|
|
||||||
not go out of sync even without this fix.) It is still beneficial to
|
|
||||||
add the negative response to the mapping, so that the client can get
|
|
||||||
it from there in the future, instead of going through the socket.
|
|
||||||
|
|
||||||
Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
|
|
||||||
(cherry picked from commit b048a482f088e53144d26a61c390bed0210f49f2)
|
|
||||||
---
|
|
||||||
nscd/netgroupcache.c | 11 +++++++----
|
|
||||||
1 file changed, 7 insertions(+), 4 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/nscd/netgroupcache.c b/nscd/netgroupcache.c
|
|
||||||
index c18fe111f3..e22ffa5884 100644
|
|
||||||
--- a/nscd/netgroupcache.c
|
|
||||||
+++ b/nscd/netgroupcache.c
|
|
||||||
@@ -511,14 +511,15 @@ addinnetgrX (struct database_dyn *db, int fd, request_header *req,
|
|
||||||
|
|
||||||
datahead_init_pos (&dataset->head, sizeof (*dataset) + req->key_len,
|
|
||||||
sizeof (innetgroup_response_header),
|
|
||||||
- he == NULL ? 0 : dh->nreloads + 1, result->head.ttl);
|
|
||||||
+ he == NULL ? 0 : dh->nreloads + 1,
|
|
||||||
+ result == NULL ? db->negtimeout : result->head.ttl);
|
|
||||||
/* Set the notfound status and timeout based on the result from
|
|
||||||
getnetgrent. */
|
|
||||||
- dataset->head.notfound = result->head.notfound;
|
|
||||||
+ dataset->head.notfound = result == NULL || result->head.notfound;
|
|
||||||
dataset->head.timeout = timeout;
|
|
||||||
|
|
||||||
dataset->resp.version = NSCD_VERSION;
|
|
||||||
- dataset->resp.found = result->resp.found;
|
|
||||||
+ dataset->resp.found = result != NULL && result->resp.found;
|
|
||||||
/* Until we find a matching entry the result is 0. */
|
|
||||||
dataset->resp.result = 0;
|
|
||||||
|
|
||||||
@@ -566,7 +567,9 @@ addinnetgrX (struct database_dyn *db, int fd, request_header *req,
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
- if (he == NULL)
|
|
||||||
+ /* addgetnetgrentX may have already sent a notfound response. Do
|
|
||||||
+ not send another one. */
|
|
||||||
+ if (he == NULL && dataset->resp.found)
|
|
||||||
{
|
|
||||||
/* We write the dataset before inserting it to the database
|
|
||||||
since while inserting this thread might block and so would
|
|
||||||
--
|
|
||||||
2.45.0
|
|
||||||
|
|
@@ -1,59 +0,0 @@
|
|||||||
From 5a508e0b508c8ad53bd0d2fb48fd71b242626341 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Florian Weimer <fweimer@redhat.com>
|
|
||||||
Date: Thu, 25 Apr 2024 15:01:07 +0200
|
|
||||||
Subject: [PATCH] CVE-2024-33600: nscd: Do not send missing not-found response
|
|
||||||
in addgetnetgrentX (bug 31678)
|
|
||||||
|
|
||||||
If we failed to add a not-found response to the cache, the dataset
|
|
||||||
point can be null, resulting in a null pointer dereference.
|
|
||||||
|
|
||||||
Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
|
|
||||||
(cherry picked from commit 7835b00dbce53c3c87bbbb1754a95fb5e58187aa)
|
|
||||||
---
|
|
||||||
nscd/netgroupcache.c | 14 ++++++--------
|
|
||||||
1 file changed, 6 insertions(+), 8 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/nscd/netgroupcache.c b/nscd/netgroupcache.c
|
|
||||||
index f227dc7fa2..c18fe111f3 100644
|
|
||||||
--- a/nscd/netgroupcache.c
|
|
||||||
+++ b/nscd/netgroupcache.c
|
|
||||||
@@ -147,7 +147,7 @@ addgetnetgrentX (struct database_dyn *db, int fd, request_header *req,
|
|
||||||
/* No such service. */
|
|
||||||
cacheable = do_notfound (db, fd, req, key, &dataset, &total, &timeout,
|
|
||||||
&key_copy);
|
|
||||||
- goto writeout;
|
|
||||||
+ goto maybe_cache_add;
|
|
||||||
}
|
|
||||||
|
|
||||||
memset (&data, '\0', sizeof (data));
|
|
||||||
@@ -348,7 +348,7 @@ addgetnetgrentX (struct database_dyn *db, int fd, request_header *req,
|
|
||||||
{
|
|
||||||
cacheable = do_notfound (db, fd, req, key, &dataset, &total, &timeout,
|
|
||||||
&key_copy);
|
|
||||||
- goto writeout;
|
|
||||||
+ goto maybe_cache_add;
|
|
||||||
}
|
|
||||||
|
|
||||||
total = buffilled;
|
|
||||||
@@ -410,14 +410,12 @@ addgetnetgrentX (struct database_dyn *db, int fd, request_header *req,
|
|
||||||
}
|
|
||||||
|
|
||||||
if (he == NULL && fd != -1)
|
|
||||||
- {
|
|
||||||
- /* We write the dataset before inserting it to the database
|
|
||||||
- since while inserting this thread might block and so would
|
|
||||||
- unnecessarily let the receiver wait. */
|
|
||||||
- writeout:
|
|
||||||
+ /* We write the dataset before inserting it to the database since
|
|
||||||
+ while inserting this thread might block and so would
|
|
||||||
+ unnecessarily let the receiver wait. */
|
|
||||||
writeall (fd, &dataset->resp, dataset->head.recsize);
|
|
||||||
- }
|
|
||||||
|
|
||||||
+ maybe_cache_add:
|
|
||||||
if (cacheable)
|
|
||||||
{
|
|
||||||
/* If necessary, we also propagate the data to disk. */
|
|
||||||
--
|
|
||||||
2.45.0
|
|
||||||
|
|
@@ -1,390 +0,0 @@
|
|||||||
From a9a8d3eebb145779a18d90e3966009a1daa63cd8 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Florian Weimer <fweimer@redhat.com>
|
|
||||||
Date: Thu, 25 Apr 2024 15:01:07 +0200
|
|
||||||
Subject: [PATCH] CVE-2024-33601, CVE-2024-33602: nscd: netgroup: Use two
|
|
||||||
buffers in addgetnetgrentX (bug 31680)
|
|
||||||
|
|
||||||
This avoids potential memory corruption when the underlying NSS
|
|
||||||
callback function does not use the buffer space to store all strings
|
|
||||||
(e.g., for constant strings).
|
|
||||||
|
|
||||||
Instead of custom buffer management, two scratch buffers are used.
|
|
||||||
This increases stack usage somewhat.
|
|
||||||
|
|
||||||
Scratch buffer allocation failure is handled by return -1
|
|
||||||
(an invalid timeout value) instead of terminating the process.
|
|
||||||
This fixes bug 31679.
|
|
||||||
|
|
||||||
Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
|
|
||||||
(cherry picked from commit c04a21e050d64a1193a6daab872bca2528bda44b)
|
|
||||||
---
|
|
||||||
nscd/netgroupcache.c | 219 ++++++++++++++++++++++++-------------------
|
|
||||||
1 file changed, 121 insertions(+), 98 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/nscd/netgroupcache.c b/nscd/netgroupcache.c
|
|
||||||
index e22ffa5884..e8fe041846 100644
|
|
||||||
--- a/nscd/netgroupcache.c
|
|
||||||
+++ b/nscd/netgroupcache.c
|
|
||||||
@@ -23,6 +23,7 @@
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <sys/mman.h>
|
|
||||||
+#include <scratch_buffer.h>
|
|
||||||
|
|
||||||
#include "../nss/netgroup.h"
|
|
||||||
#include "nscd.h"
|
|
||||||
@@ -65,6 +66,16 @@ struct dataset
|
|
||||||
char strdata[0];
|
|
||||||
};
|
|
||||||
|
|
||||||
+/* Send a notfound response to FD. Always returns -1 to indicate an
|
|
||||||
+ ephemeral error. */
|
|
||||||
+static time_t
|
|
||||||
+send_notfound (int fd)
|
|
||||||
+{
|
|
||||||
+ if (fd != -1)
|
|
||||||
+ TEMP_FAILURE_RETRY (send (fd, ¬found, sizeof (notfound), MSG_NOSIGNAL));
|
|
||||||
+ return -1;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
/* Sends a notfound message and prepares a notfound dataset to write to the
|
|
||||||
cache. Returns true if there was enough memory to allocate the dataset and
|
|
||||||
returns the dataset in DATASETP, total bytes to write in TOTALP and the
|
|
||||||
@@ -83,8 +94,7 @@ do_notfound (struct database_dyn *db, int fd, request_header *req,
|
|
||||||
total = sizeof (notfound);
|
|
||||||
timeout = time (NULL) + db->negtimeout;
|
|
||||||
|
|
||||||
- if (fd != -1)
|
|
||||||
- TEMP_FAILURE_RETRY (send (fd, ¬found, total, MSG_NOSIGNAL));
|
|
||||||
+ send_notfound (fd);
|
|
||||||
|
|
||||||
dataset = mempool_alloc (db, sizeof (struct dataset) + req->key_len, 1);
|
|
||||||
/* If we cannot permanently store the result, so be it. */
|
|
||||||
@@ -109,11 +119,78 @@ do_notfound (struct database_dyn *db, int fd, request_header *req,
|
|
||||||
return cacheable;
|
|
||||||
}
|
|
||||||
|
|
||||||
+struct addgetnetgrentX_scratch
|
|
||||||
+{
|
|
||||||
+ /* This is the result that the caller should use. It can be NULL,
|
|
||||||
+ point into buffer, or it can be in the cache. */
|
|
||||||
+ struct dataset *dataset;
|
|
||||||
+
|
|
||||||
+ struct scratch_buffer buffer;
|
|
||||||
+
|
|
||||||
+ /* Used internally in addgetnetgrentX as a staging area. */
|
|
||||||
+ struct scratch_buffer tmp;
|
|
||||||
+
|
|
||||||
+ /* Number of bytes in buffer that are actually used. */
|
|
||||||
+ size_t buffer_used;
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+static void
|
|
||||||
+addgetnetgrentX_scratch_init (struct addgetnetgrentX_scratch *scratch)
|
|
||||||
+{
|
|
||||||
+ scratch->dataset = NULL;
|
|
||||||
+ scratch_buffer_init (&scratch->buffer);
|
|
||||||
+ scratch_buffer_init (&scratch->tmp);
|
|
||||||
+
|
|
||||||
+ /* Reserve space for the header. */
|
|
||||||
+ scratch->buffer_used = sizeof (struct dataset);
|
|
||||||
+ static_assert (sizeof (struct dataset) < sizeof (scratch->tmp.__space),
|
|
||||||
+ "initial buffer space");
|
|
||||||
+ memset (scratch->tmp.data, 0, sizeof (struct dataset));
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static void
|
|
||||||
+addgetnetgrentX_scratch_free (struct addgetnetgrentX_scratch *scratch)
|
|
||||||
+{
|
|
||||||
+ scratch_buffer_free (&scratch->buffer);
|
|
||||||
+ scratch_buffer_free (&scratch->tmp);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+/* Copy LENGTH bytes from S into SCRATCH. Returns NULL if SCRATCH
|
|
||||||
+ could not be resized, otherwise a pointer to the copy. */
|
|
||||||
+static char *
|
|
||||||
+addgetnetgrentX_append_n (struct addgetnetgrentX_scratch *scratch,
|
|
||||||
+ const char *s, size_t length)
|
|
||||||
+{
|
|
||||||
+ while (true)
|
|
||||||
+ {
|
|
||||||
+ size_t remaining = scratch->buffer.length - scratch->buffer_used;
|
|
||||||
+ if (remaining >= length)
|
|
||||||
+ break;
|
|
||||||
+ if (!scratch_buffer_grow_preserve (&scratch->buffer))
|
|
||||||
+ return NULL;
|
|
||||||
+ }
|
|
||||||
+ char *copy = scratch->buffer.data + scratch->buffer_used;
|
|
||||||
+ memcpy (copy, s, length);
|
|
||||||
+ scratch->buffer_used += length;
|
|
||||||
+ return copy;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+/* Copy S into SCRATCH, including its null terminator. Returns false
|
|
||||||
+ if SCRATCH could not be resized. */
|
|
||||||
+static bool
|
|
||||||
+addgetnetgrentX_append (struct addgetnetgrentX_scratch *scratch, const char *s)
|
|
||||||
+{
|
|
||||||
+ if (s == NULL)
|
|
||||||
+ s = "";
|
|
||||||
+ return addgetnetgrentX_append_n (scratch, s, strlen (s) + 1) != NULL;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+/* Caller must initialize and free *SCRATCH. If the return value is
|
|
||||||
+ negative, this function has sent a notfound response. */
|
|
||||||
static time_t
|
|
||||||
addgetnetgrentX (struct database_dyn *db, int fd, request_header *req,
|
|
||||||
const char *key, uid_t uid, struct hashentry *he,
|
|
||||||
- struct datahead *dh, struct dataset **resultp,
|
|
||||||
- void **tofreep)
|
|
||||||
+ struct datahead *dh, struct addgetnetgrentX_scratch *scratch)
|
|
||||||
{
|
|
||||||
if (__glibc_unlikely (debug_level > 0))
|
|
||||||
{
|
|
||||||
@@ -132,14 +209,10 @@ addgetnetgrentX (struct database_dyn *db, int fd, request_header *req,
|
|
||||||
|
|
||||||
char *key_copy = NULL;
|
|
||||||
struct __netgrent data;
|
|
||||||
- size_t buflen = MAX (1024, sizeof (*dataset) + req->key_len);
|
|
||||||
- size_t buffilled = sizeof (*dataset);
|
|
||||||
- char *buffer = NULL;
|
|
||||||
size_t nentries = 0;
|
|
||||||
size_t group_len = strlen (key) + 1;
|
|
||||||
struct name_list *first_needed
|
|
||||||
= alloca (sizeof (struct name_list) + group_len);
|
|
||||||
- *tofreep = NULL;
|
|
||||||
|
|
||||||
if (netgroup_database == NULL
|
|
||||||
&& !__nss_database_get (nss_database_netgroup, &netgroup_database))
|
|
||||||
@@ -151,8 +224,6 @@ addgetnetgrentX (struct database_dyn *db, int fd, request_header *req,
|
|
||||||
}
|
|
||||||
|
|
||||||
memset (&data, '\0', sizeof (data));
|
|
||||||
- buffer = xmalloc (buflen);
|
|
||||||
- *tofreep = buffer;
|
|
||||||
first_needed->next = first_needed;
|
|
||||||
memcpy (first_needed->name, key, group_len);
|
|
||||||
data.needed_groups = first_needed;
|
|
||||||
@@ -195,8 +266,8 @@ addgetnetgrentX (struct database_dyn *db, int fd, request_header *req,
|
|
||||||
while (1)
|
|
||||||
{
|
|
||||||
int e;
|
|
||||||
- status = getfct.f (&data, buffer + buffilled,
|
|
||||||
- buflen - buffilled - req->key_len, &e);
|
|
||||||
+ status = getfct.f (&data, scratch->tmp.data,
|
|
||||||
+ scratch->tmp.length, &e);
|
|
||||||
if (status == NSS_STATUS_SUCCESS)
|
|
||||||
{
|
|
||||||
if (data.type == triple_val)
|
|
||||||
@@ -204,68 +275,10 @@ addgetnetgrentX (struct database_dyn *db, int fd, request_header *req,
|
|
||||||
const char *nhost = data.val.triple.host;
|
|
||||||
const char *nuser = data.val.triple.user;
|
|
||||||
const char *ndomain = data.val.triple.domain;
|
|
||||||
-
|
|
||||||
- size_t hostlen = strlen (nhost ?: "") + 1;
|
|
||||||
- size_t userlen = strlen (nuser ?: "") + 1;
|
|
||||||
- size_t domainlen = strlen (ndomain ?: "") + 1;
|
|
||||||
-
|
|
||||||
- if (nhost == NULL || nuser == NULL || ndomain == NULL
|
|
||||||
- || nhost > nuser || nuser > ndomain)
|
|
||||||
- {
|
|
||||||
- const char *last = nhost;
|
|
||||||
- if (last == NULL
|
|
||||||
- || (nuser != NULL && nuser > last))
|
|
||||||
- last = nuser;
|
|
||||||
- if (last == NULL
|
|
||||||
- || (ndomain != NULL && ndomain > last))
|
|
||||||
- last = ndomain;
|
|
||||||
-
|
|
||||||
- size_t bufused
|
|
||||||
- = (last == NULL
|
|
||||||
- ? buffilled
|
|
||||||
- : last + strlen (last) + 1 - buffer);
|
|
||||||
-
|
|
||||||
- /* We have to make temporary copies. */
|
|
||||||
- size_t needed = hostlen + userlen + domainlen;
|
|
||||||
-
|
|
||||||
- if (buflen - req->key_len - bufused < needed)
|
|
||||||
- {
|
|
||||||
- buflen += MAX (buflen, 2 * needed);
|
|
||||||
- /* Save offset in the old buffer. We don't
|
|
||||||
- bother with the NULL check here since
|
|
||||||
- we'll do that later anyway. */
|
|
||||||
- size_t nhostdiff = nhost - buffer;
|
|
||||||
- size_t nuserdiff = nuser - buffer;
|
|
||||||
- size_t ndomaindiff = ndomain - buffer;
|
|
||||||
-
|
|
||||||
- char *newbuf = xrealloc (buffer, buflen);
|
|
||||||
- /* Fix up the triplet pointers into the new
|
|
||||||
- buffer. */
|
|
||||||
- nhost = (nhost ? newbuf + nhostdiff
|
|
||||||
- : NULL);
|
|
||||||
- nuser = (nuser ? newbuf + nuserdiff
|
|
||||||
- : NULL);
|
|
||||||
- ndomain = (ndomain ? newbuf + ndomaindiff
|
|
||||||
- : NULL);
|
|
||||||
- *tofreep = buffer = newbuf;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
- nhost = memcpy (buffer + bufused,
|
|
||||||
- nhost ?: "", hostlen);
|
|
||||||
- nuser = memcpy ((char *) nhost + hostlen,
|
|
||||||
- nuser ?: "", userlen);
|
|
||||||
- ndomain = memcpy ((char *) nuser + userlen,
|
|
||||||
- ndomain ?: "", domainlen);
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
- char *wp = buffer + buffilled;
|
|
||||||
- wp = memmove (wp, nhost ?: "", hostlen);
|
|
||||||
- wp += hostlen;
|
|
||||||
- wp = memmove (wp, nuser ?: "", userlen);
|
|
||||||
- wp += userlen;
|
|
||||||
- wp = memmove (wp, ndomain ?: "", domainlen);
|
|
||||||
- wp += domainlen;
|
|
||||||
- buffilled = wp - buffer;
|
|
||||||
+ if (!(addgetnetgrentX_append (scratch, nhost)
|
|
||||||
+ && addgetnetgrentX_append (scratch, nuser)
|
|
||||||
+ && addgetnetgrentX_append (scratch, ndomain)))
|
|
||||||
+ return send_notfound (fd);
|
|
||||||
++nentries;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
@@ -317,8 +330,8 @@ addgetnetgrentX (struct database_dyn *db, int fd, request_header *req,
|
|
||||||
}
|
|
||||||
else if (status == NSS_STATUS_TRYAGAIN && e == ERANGE)
|
|
||||||
{
|
|
||||||
- buflen *= 2;
|
|
||||||
- *tofreep = buffer = xrealloc (buffer, buflen);
|
|
||||||
+ if (!scratch_buffer_grow (&scratch->tmp))
|
|
||||||
+ return send_notfound (fd);
|
|
||||||
}
|
|
||||||
else if (status == NSS_STATUS_RETURN
|
|
||||||
|| status == NSS_STATUS_NOTFOUND
|
|
||||||
@@ -351,10 +364,17 @@ addgetnetgrentX (struct database_dyn *db, int fd, request_header *req,
|
|
||||||
goto maybe_cache_add;
|
|
||||||
}
|
|
||||||
|
|
||||||
- total = buffilled;
|
|
||||||
+ /* Capture the result size without the key appended. */
|
|
||||||
+ total = scratch->buffer_used;
|
|
||||||
+
|
|
||||||
+ /* Make a copy of the key. The scratch buffer must not move after
|
|
||||||
+ this point. */
|
|
||||||
+ key_copy = addgetnetgrentX_append_n (scratch, key, req->key_len);
|
|
||||||
+ if (key_copy == NULL)
|
|
||||||
+ return send_notfound (fd);
|
|
||||||
|
|
||||||
/* Fill in the dataset. */
|
|
||||||
- dataset = (struct dataset *) buffer;
|
|
||||||
+ dataset = scratch->buffer.data;
|
|
||||||
timeout = datahead_init_pos (&dataset->head, total + req->key_len,
|
|
||||||
total - offsetof (struct dataset, resp),
|
|
||||||
he == NULL ? 0 : dh->nreloads + 1,
|
|
||||||
@@ -363,11 +383,7 @@ addgetnetgrentX (struct database_dyn *db, int fd, request_header *req,
|
|
||||||
dataset->resp.version = NSCD_VERSION;
|
|
||||||
dataset->resp.found = 1;
|
|
||||||
dataset->resp.nresults = nentries;
|
|
||||||
- dataset->resp.result_len = buffilled - sizeof (*dataset);
|
|
||||||
-
|
|
||||||
- assert (buflen - buffilled >= req->key_len);
|
|
||||||
- key_copy = memcpy (buffer + buffilled, key, req->key_len);
|
|
||||||
- buffilled += req->key_len;
|
|
||||||
+ dataset->resp.result_len = total - sizeof (*dataset);
|
|
||||||
|
|
||||||
/* Now we can determine whether on refill we have to create a new
|
|
||||||
record or not. */
|
|
||||||
@@ -398,7 +414,7 @@ addgetnetgrentX (struct database_dyn *db, int fd, request_header *req,
|
|
||||||
if (__glibc_likely (newp != NULL))
|
|
||||||
{
|
|
||||||
/* Adjust pointer into the memory block. */
|
|
||||||
- key_copy = (char *) newp + (key_copy - buffer);
|
|
||||||
+ key_copy = (char *) newp + (key_copy - (char *) dataset);
|
|
||||||
|
|
||||||
dataset = memcpy (newp, dataset, total + req->key_len);
|
|
||||||
cacheable = true;
|
|
||||||
@@ -439,7 +455,7 @@ addgetnetgrentX (struct database_dyn *db, int fd, request_header *req,
|
|
||||||
}
|
|
||||||
|
|
||||||
out:
|
|
||||||
- *resultp = dataset;
|
|
||||||
+ scratch->dataset = dataset;
|
|
||||||
|
|
||||||
return timeout;
|
|
||||||
}
|
|
||||||
@@ -460,6 +476,9 @@ addinnetgrX (struct database_dyn *db, int fd, request_header *req,
|
|
||||||
if (user != NULL)
|
|
||||||
key = strchr (key, '\0') + 1;
|
|
||||||
const char *domain = *key++ ? key : NULL;
|
|
||||||
+ struct addgetnetgrentX_scratch scratch;
|
|
||||||
+
|
|
||||||
+ addgetnetgrentX_scratch_init (&scratch);
|
|
||||||
|
|
||||||
if (__glibc_unlikely (debug_level > 0))
|
|
||||||
{
|
|
||||||
@@ -475,12 +494,8 @@ addinnetgrX (struct database_dyn *db, int fd, request_header *req,
|
|
||||||
group, group_len,
|
|
||||||
db, uid);
|
|
||||||
time_t timeout;
|
|
||||||
- void *tofree;
|
|
||||||
if (result != NULL)
|
|
||||||
- {
|
|
||||||
- timeout = result->head.timeout;
|
|
||||||
- tofree = NULL;
|
|
||||||
- }
|
|
||||||
+ timeout = result->head.timeout;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
request_header req_get =
|
|
||||||
@@ -489,7 +504,10 @@ addinnetgrX (struct database_dyn *db, int fd, request_header *req,
|
|
||||||
.key_len = group_len
|
|
||||||
};
|
|
||||||
timeout = addgetnetgrentX (db, -1, &req_get, group, uid, NULL, NULL,
|
|
||||||
- &result, &tofree);
|
|
||||||
+ &scratch);
|
|
||||||
+ result = scratch.dataset;
|
|
||||||
+ if (timeout < 0)
|
|
||||||
+ goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct indataset
|
|
||||||
@@ -603,7 +621,7 @@ addinnetgrX (struct database_dyn *db, int fd, request_header *req,
|
|
||||||
}
|
|
||||||
|
|
||||||
out:
|
|
||||||
- free (tofree);
|
|
||||||
+ addgetnetgrentX_scratch_free (&scratch);
|
|
||||||
return timeout;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -613,11 +631,12 @@ addgetnetgrentX_ignore (struct database_dyn *db, int fd, request_header *req,
|
|
||||||
const char *key, uid_t uid, struct hashentry *he,
|
|
||||||
struct datahead *dh)
|
|
||||||
{
|
|
||||||
- struct dataset *ignore;
|
|
||||||
- void *tofree;
|
|
||||||
- time_t timeout = addgetnetgrentX (db, fd, req, key, uid, he, dh,
|
|
||||||
- &ignore, &tofree);
|
|
||||||
- free (tofree);
|
|
||||||
+ struct addgetnetgrentX_scratch scratch;
|
|
||||||
+ addgetnetgrentX_scratch_init (&scratch);
|
|
||||||
+ time_t timeout = addgetnetgrentX (db, fd, req, key, uid, he, dh, &scratch);
|
|
||||||
+ addgetnetgrentX_scratch_free (&scratch);
|
|
||||||
+ if (timeout < 0)
|
|
||||||
+ timeout = 0;
|
|
||||||
return timeout;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -661,5 +680,9 @@ readdinnetgr (struct database_dyn *db, struct hashentry *he,
|
|
||||||
.key_len = he->len
|
|
||||||
};
|
|
||||||
|
|
||||||
- return addinnetgrX (db, -1, &req, db->data + he->key, he->owner, he, dh);
|
|
||||||
+ int timeout = addinnetgrX (db, -1, &req, db->data + he->key, he->owner,
|
|
||||||
+ he, dh);
|
|
||||||
+ if (timeout < 0)
|
|
||||||
+ timeout = 0;
|
|
||||||
+ return timeout;
|
|
||||||
}
|
|
||||||
--
|
|
||||||
2.45.0
|
|
||||||
|
|
149
glibc.changes
149
glibc.changes
@@ -1,16 +1,159 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Thu Jul 24 10:14:52 UTC 2025 - Andreas Schwab <schwab@suse.de>
|
||||||
|
|
||||||
|
- regcomp-double-free.patch: posix: Fix double-free after allocation
|
||||||
|
failure in regcomp (CVE-2025-8058, bsc#1246965, BZ #33185)
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Tue Jun 17 09:11:26 UTC 2025 - Andreas Schwab <schwab@suse.de>
|
||||||
|
|
||||||
|
- ppc64le-revert-power10-strcmp.patch: Revert optimized POWER10 strcmp,
|
||||||
|
strncmp implementations (CVE-2025-5745, CVE-2025-5702, bsc#1244184,
|
||||||
|
bsc#1244182, BZ #33060, BZ #33056)
|
||||||
|
- ppc64le-revert-power10-memcmp.patch: Revert optimized POWER10 memcmp
|
||||||
|
implementation (BZ #33059)
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Thu Jun 5 09:18:29 UTC 2025 - Andreas Schwab <schwab@suse.de>
|
||||||
|
|
||||||
|
- Add support for userspace livepatching for ppc64le (jsc#PED-11850)
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Mon Jun 2 12:09:30 UTC 2025 - Andreas Schwab <schwab@suse.de>
|
||||||
|
|
||||||
|
- Filter GLIBC_PRIVATE symbols again
|
||||||
|
- Drop ngpt provides
|
||||||
|
- Compile functions in libc_nonshared.a as PIC
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Thu Apr 3 14:43:21 UTC 2025 - Andreas Schwab <schwab@suse.de>
|
||||||
|
|
||||||
|
- pthread-wakeup.patch: pthreads NPTL: lost wakeup fix 2 (bsc#1234128, BZ
|
||||||
|
#25847)
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Mon Mar 24 15:24:22 UTC 2025 - Andreas Schwab <schwab@suse.de>
|
||||||
|
|
||||||
|
- Mark functions in libc_nonshared.a as hidden (bsc#1239883)
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Wed Mar 12 10:28:15 UTC 2025 - Andreas Schwab <schwab@suse.de>
|
||||||
|
|
||||||
|
- Do not build libnsl1 (bsc#1239459)
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Wed Feb 26 15:32:06 UTC 2025 - Andreas Schwab <schwab@suse.de>
|
||||||
|
|
||||||
|
- Bump minimal kernel version to 4.3 to enable use of direct socketcalls
|
||||||
|
on x86-32 and s390x (bsc#1234713)
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Mon Feb 17 10:37:02 UTC 2025 - Andreas Schwab <schwab@suse.de>
|
||||||
|
|
||||||
|
- Remove nis from nsswitch.conf (bsc#1237210)
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Mon Feb 10 12:19:00 UTC 2025 - Andreas Schwab <schwab@suse.de>
|
||||||
|
|
||||||
|
- Use rpm.execute when available (bsc#1236869)
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Mon Jan 20 13:33:58 UTC 2025 - Andreas Schwab <schwab@suse.de>
|
||||||
|
|
||||||
|
- Disable nscd support (bsc#1235247)
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Tue Jan 7 10:28:36 UTC 2025 - Andreas Schwab <schwab@suse.de>
|
||||||
|
|
||||||
|
- Correctly determine livepatching support
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Sun Jan 5 11:43:47 UTC 2025 - Andreas Schwab <schwab@suse.de>
|
||||||
|
|
||||||
|
- Define _enable_debug_packages for rpm 4.20
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Mon Dec 2 14:02:08 UTC 2024 - Andreas Schwab <schwab@suse.de>
|
||||||
|
|
||||||
|
- Add support for loongarch64
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Wed Oct 9 07:42:01 UTC 2024 - Andreas Schwab <schwab@suse.de>
|
||||||
|
|
||||||
|
- Apply libc_nonshared.a workaround also on s390x and ppc64le (bsc#1231051)
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Mon Sep 30 20:56:18 UTC 2024 - Stanislav Brabec <sbrabec@suse.com>
|
||||||
|
|
||||||
|
- langpacks are no more used. Drop glibc-2.3.90-langpackdir.diff.
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Thu Sep 26 11:45:57 UTC 2024 - Andreas Schwab <schwab@suse.de>
|
||||||
|
|
||||||
|
- gen-tempname-randomness.patch: Fix missing randomness in __gen_tempname
|
||||||
|
(bsc#1230965, BZ #32214)
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Wed Sep 18 15:11:48 UTC 2024 - Andreas Schwab <schwab@suse.de>
|
||||||
|
|
||||||
|
- Use nss-systemd by default also in SLE (bsc#1230638)
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Mon Jul 29 07:50:31 UTC 2024 - Andreas Schwab <schwab@suse.de>
|
||||||
|
|
||||||
|
- Update to glibc 2.40
|
||||||
|
* The <stdbit.h> header type-generic macros have been changed when using
|
||||||
|
GCC 14.1 or later to use __builtin_stdc_bit_ceil etc. built-in functions
|
||||||
|
* The GNU C Library now supports a feature test macro _ISOC23_SOURCE to
|
||||||
|
enable features from the ISO C23 standard
|
||||||
|
* The ISO C23 function families introduced in TS
|
||||||
|
18661-4:2015 are now supported in <math.h>
|
||||||
|
* A new tunable, glibc.rtld.enable_secure, can be used to run a program
|
||||||
|
as if it were a setuid process
|
||||||
|
* On Linux, the epoll header was updated to include epoll ioctl definitions
|
||||||
|
and the related structure added in Linux kernel 6.9
|
||||||
|
* The fortify functionality has been significantly enhanced for building
|
||||||
|
programs with clang against the GNU C Library
|
||||||
|
* Many functions have been added to the vector library for aarch64
|
||||||
|
* On x86, memset can now use non-temporal stores to improve the performance
|
||||||
|
of large writes
|
||||||
|
* Architectures which use a 32-bit seconds-since-epoch field in struct
|
||||||
|
lastlog, struct utmp, struct utmpx (such as i386, powerpc64le, rv32,
|
||||||
|
rv64, x86-64) switched from a signed to an unsigned type for that
|
||||||
|
field
|
||||||
|
* __rseq_size now denotes the size of the active rseq area (20 bytes
|
||||||
|
initially), not the size of struct rseq (32 bytes initially).
|
||||||
|
- arm-dl-start-user.patch, duplocale-global-locale.patch,
|
||||||
|
elf-parse-tunables.patch,
|
||||||
|
glibc-CVE-2024-33599-nscd-Stack-based-buffer-overflow-in-n.patch,
|
||||||
|
glibc-CVE-2024-33600-nscd-Avoid-null-pointer-crashes-after.patch,
|
||||||
|
glibc-CVE-2024-33600-nscd-Do-not-send-missing-not-found-re.patch,
|
||||||
|
glibc-CVE-2024-33601-CVE-2024-33602-nscd-netgroup-Use-two.patch,
|
||||||
|
iconv-iso-2022-cn-ext.patch, nscd-netgroup-cache-timeout.patch,
|
||||||
|
s390-clone-error-clobber-r7.patch, sigisemptyset.patch,
|
||||||
|
stdbit-builtins.patch, utmp-time-bits.patch: Removed
|
||||||
|
- glibc-2.3.90-langpackdir.diff: Rediff
|
||||||
|
- bsc#1228041
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Mon Jun 3 08:24:38 UTC 2024 - Dominique Leuenberger <dimstar@opensuse.org>
|
Mon Jun 3 08:24:38 UTC 2024 - Dominique Leuenberger <dimstar@opensuse.org>
|
||||||
|
|
||||||
- Also provide glibc-locale-base-<targettype> from
|
- Also provide glibc-locale-base-<targettype> from
|
||||||
glibc-<targettype>: the package was merged in the baselibs.conf
|
glibc-gconv-modules-extra-<targettype>: the package was merged in the
|
||||||
case, so the capability is there. Steam for one has a requires
|
baselibs.conf case, so the capability is there. Steam for one has a
|
||||||
on the symbol (boo#1225809).
|
requires on the symbol (boo#1225809).
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Tue May 28 07:27:01 UTC 2024 - Andreas Schwab <schwab@suse.de>
|
Tue May 28 07:27:01 UTC 2024 - Andreas Schwab <schwab@suse.de>
|
||||||
|
|
||||||
- Obsolete glibc-locale-base-<targettype> from glibc-<targettype>
|
- Obsolete glibc-locale-base-<targettype> from glibc-<targettype>
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Thu May 23 11:31:34 UTC 2024 - Andreas Schwab <schwab@suse.de>
|
||||||
|
|
||||||
|
- Add workaround for invalid use of libc_nonshared.a with non-SUSE libc
|
||||||
|
(bsc#1221482)
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Tue May 21 09:44:46 UTC 2024 - Andreas Schwab <schwab@suse.de>
|
Tue May 21 09:44:46 UTC 2024 - Andreas Schwab <schwab@suse.de>
|
||||||
|
|
||||||
|
264
glibc.keyring
264
glibc.keyring
@@ -188,138 +188,6 @@ ZthBvjkZUZCOl+wjwbn3k4bpiEYEGBECAAYFAj0n9DwACgkQWDlSU/gp6efSHgCc
|
|||||||
DxXIOrZyOO3jtbtsTYR/VrsdK9sAn0lrUm/jZKWyvK6V1CCA3TwXyvLQ
|
DxXIOrZyOO3jtbtsTYR/VrsdK9sAn0lrUm/jZKWyvK6V1CCA3TwXyvLQ
|
||||||
=dSXY
|
=dSXY
|
||||||
-----END PGP PUBLIC KEY BLOCK-----
|
-----END PGP PUBLIC KEY BLOCK-----
|
||||||
GPG keys of Siddhesh Poyarekar <siddhesh>
|
|
||||||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
|
||||||
|
|
||||||
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
|
|
||||||
TKN3JdfTyacfNU4=
|
|
||||||
=IcJn
|
|
||||||
-----END PGP PUBLIC KEY BLOCK-----
|
|
||||||
GPG keys of Carlos O'Donell <codonell>
|
GPG keys of Carlos O'Donell <codonell>
|
||||||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||||
Version: GnuPG v1
|
Version: GnuPG v1
|
||||||
@@ -645,6 +513,138 @@ N7JGzLVNo+A=
|
|||||||
=fZUN
|
=fZUN
|
||||||
-----END PGP PUBLIC KEY BLOCK-----
|
-----END PGP PUBLIC KEY BLOCK-----
|
||||||
|
|
||||||
|
GPG keys of Siddhesh Poyarekar <siddhesh>
|
||||||
|
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||||
|
|
||||||
|
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
|
||||||
|
TKN3JdfTyacfNU4=
|
||||||
|
=IcJn
|
||||||
|
-----END PGP PUBLIC KEY BLOCK-----
|
||||||
GPG keys of Eric Blake <ericb>
|
GPG keys of Eric Blake <ericb>
|
||||||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||||
Version: GnuPG v1.4.10 (GNU/Linux)
|
Version: GnuPG v1.4.10 (GNU/Linux)
|
||||||
|
202
glibc.spec
202
glibc.spec
@@ -1,7 +1,7 @@
|
|||||||
#
|
#
|
||||||
# spec file for package glibc
|
# spec file for package glibc
|
||||||
#
|
#
|
||||||
# Copyright (c) 2024 SUSE LLC
|
# Copyright (c) 2025 SUSE LLC
|
||||||
#
|
#
|
||||||
# All modifications and additions to the file contributed by third parties
|
# All modifications and additions to the file contributed by third parties
|
||||||
# remain the property of their copyright owners, unless otherwise agreed
|
# remain the property of their copyright owners, unless otherwise agreed
|
||||||
@@ -57,15 +57,14 @@
|
|||||||
%bcond_with usrmerged
|
%bcond_with usrmerged
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
%if 0%{?gcc_version} < 13
|
%if 0%{?suse_version} >= 1600
|
||||||
%define with_gcc 13
|
%bcond_with nscd
|
||||||
|
%else
|
||||||
|
%bcond_without nscd
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
# Enable support for livepatching.
|
%if 0%{?gcc_version} < 13
|
||||||
%ifarch x86_64
|
%define with_gcc 13
|
||||||
%bcond_without livepatching
|
|
||||||
%else
|
|
||||||
%bcond_with livepatching
|
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
%bcond_with build_all
|
%bcond_with build_all
|
||||||
@@ -95,6 +94,7 @@ ExclusiveArch: do_not_build
|
|||||||
%define build_testsuite 0
|
%define build_testsuite 0
|
||||||
%define build_cross 1
|
%define build_cross 1
|
||||||
%undefine _build_create_debug
|
%undefine _build_create_debug
|
||||||
|
%define _enable_debug_packages 0
|
||||||
ExcludeArch: %{cross_arch}
|
ExcludeArch: %{cross_arch}
|
||||||
%if 0%{?suse_version} < 1600
|
%if 0%{?suse_version} < 1600
|
||||||
ExclusiveArch: do_not_build
|
ExclusiveArch: do_not_build
|
||||||
@@ -102,13 +102,39 @@ ExclusiveArch: do_not_build
|
|||||||
%endif
|
%endif
|
||||||
%define host_arch %{?cross_cpu}%{!?cross_cpu:%{_target_cpu}}
|
%define host_arch %{?cross_cpu}%{!?cross_cpu:%{_target_cpu}}
|
||||||
|
|
||||||
|
# Enable support for livepatching.
|
||||||
|
%define have_livepatching_support 0
|
||||||
|
%if %{build_cross}
|
||||||
|
%if "%{cross_arch}" == "x86_64" || "%{cross_arch}" == "ppc64le"
|
||||||
|
%define have_livepatching_support 1
|
||||||
|
%endif
|
||||||
|
%else
|
||||||
|
%ifarch x86_64 ppc64le
|
||||||
|
%define have_livepatching_support 1
|
||||||
|
%endif
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if %{have_livepatching_support}
|
||||||
|
%bcond_without livepatching
|
||||||
|
%else
|
||||||
|
%bcond_with livepatching
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if %{suse_version} >= 1600
|
||||||
|
%define build_libnsl1 0
|
||||||
|
%else
|
||||||
|
%define build_libnsl1 1
|
||||||
|
%endif
|
||||||
|
|
||||||
%if %{build_main}
|
%if %{build_main}
|
||||||
%define name_suffix %{nil}
|
%define name_suffix %{nil}
|
||||||
%else
|
%else
|
||||||
%define name_suffix -%{flavor}-src
|
%define name_suffix -%{flavor}-src
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
%define __filter_GLIBC_PRIVATE 1
|
# Nothing outside of glibc must use these symbols
|
||||||
|
%define __requires_exclude GLIBC_PRIVATE
|
||||||
|
%define __provides_exclude GLIBC_PRIVATE
|
||||||
%ifarch i686
|
%ifarch i686
|
||||||
# For i686 let's only build what's different from i586, so
|
# For i686 let's only build what's different from i586, so
|
||||||
# no need to build documentation
|
# no need to build documentation
|
||||||
@@ -133,26 +159,28 @@ ExclusiveArch: do_not_build
|
|||||||
%define disable_assert 0
|
%define disable_assert 0
|
||||||
%define enable_stackguard_randomization 1
|
%define enable_stackguard_randomization 1
|
||||||
# glibc requires at least kernel 3.2
|
# glibc requires at least kernel 3.2
|
||||||
%define enablekernel 3.2
|
# Bump to 4.3 to enable use of direct socketcalls on x86-32 and s390x
|
||||||
|
%define enablekernel 4.3
|
||||||
# some architectures need a newer kernel
|
# some architectures need a newer kernel
|
||||||
%ifarch ppc64le
|
|
||||||
%define enablekernel 3.10
|
|
||||||
%endif
|
|
||||||
%ifarch aarch64
|
|
||||||
%define enablekernel 3.7
|
|
||||||
%endif
|
|
||||||
%ifarch ia64
|
|
||||||
%define enablekernel 3.2.18
|
|
||||||
%endif
|
|
||||||
%ifarch riscv64
|
%ifarch riscv64
|
||||||
%define enablekernel 4.15
|
%define enablekernel 4.15
|
||||||
%endif
|
%endif
|
||||||
|
%ifarch loongarch64
|
||||||
|
%define enablekernel 5.19
|
||||||
|
%endif
|
||||||
|
|
||||||
|
# Before 2.29
|
||||||
|
%define libnsl_archs %ix86 %alpha hppa m68k %mips32 %mips64 %sparc ppc ppc64 ppc64le x86_64 s390 s390x %arm aarch64 riscv64
|
||||||
|
# Before 2.34
|
||||||
|
%define libutil_archs %libnsl_archs
|
||||||
|
# Before 2.35
|
||||||
|
%define libanl_archs %libutil_archs
|
||||||
|
|
||||||
Name: glibc%{name_suffix}
|
Name: glibc%{name_suffix}
|
||||||
Summary: Standard Shared Libraries (from the GNU C Library)
|
Summary: Standard Shared Libraries (from the GNU C Library)
|
||||||
License: GPL-2.0-or-later AND LGPL-2.1-or-later AND LGPL-2.1-or-later WITH GCC-exception-2.0
|
License: GPL-2.0-or-later AND LGPL-2.1-or-later AND LGPL-2.1-or-later WITH GCC-exception-2.0
|
||||||
Group: System/Libraries
|
Group: System/Libraries
|
||||||
Version: 2.39
|
Version: 2.40
|
||||||
Release: 0
|
Release: 0
|
||||||
%if %{without snapshot}
|
%if %{without snapshot}
|
||||||
%define git_id ef321e23c2
|
%define git_id ef321e23c2
|
||||||
@@ -170,7 +198,6 @@ Source1: https://ftp.gnu.org/pub/gnu/glibc/glibc-%{version}.tar.xz.sig
|
|||||||
Source2: http://savannah.gnu.org/project/memberlist-gpgkeys.php?group=libc&download=1#/glibc.keyring
|
Source2: http://savannah.gnu.org/project/memberlist-gpgkeys.php?group=libc&download=1#/glibc.keyring
|
||||||
Source4: manpages.tar.bz2
|
Source4: manpages.tar.bz2
|
||||||
Source5: nsswitch.conf
|
Source5: nsswitch.conf
|
||||||
Source6: sle-nsswitch.conf
|
|
||||||
Source7: bindresvport.blacklist
|
Source7: bindresvport.blacklist
|
||||||
Source9: glibc.rpmlintrc
|
Source9: glibc.rpmlintrc
|
||||||
Source10: baselibs.conf
|
Source10: baselibs.conf
|
||||||
@@ -180,11 +207,9 @@ Source21: nscd.service
|
|||||||
Source22: nscd.sysusers
|
Source22: nscd.sysusers
|
||||||
|
|
||||||
%if %{build_main}
|
%if %{build_main}
|
||||||
# ngpt was used in 8.1 and SLES8
|
%if %{without nscd}
|
||||||
Obsoletes: ngpt < 2.2.2
|
Obsoletes: nscd <= %{version}
|
||||||
Obsoletes: ngpt-devel < 2.2.2
|
%endif
|
||||||
Provides: ngpt = 2.2.2
|
|
||||||
Provides: ngpt-devel = 2.2.2
|
|
||||||
Conflicts: kernel < %{enablekernel}
|
Conflicts: kernel < %{enablekernel}
|
||||||
%if %{with usrmerged}
|
%if %{with usrmerged}
|
||||||
# make sure we have post-usrmerge filesystem package
|
# make sure we have post-usrmerge filesystem package
|
||||||
@@ -276,8 +301,6 @@ Patch10: glibc-version.diff
|
|||||||
Patch13: glibc-2.3.2.no_archive.diff
|
Patch13: glibc-2.3.2.no_archive.diff
|
||||||
# PATCH-FIX-OPENSUSE -- add blacklist for bindresvport
|
# PATCH-FIX-OPENSUSE -- add blacklist for bindresvport
|
||||||
Patch14: glibc-bindresvport-blacklist.diff
|
Patch14: glibc-bindresvport-blacklist.diff
|
||||||
# PATCH-FIX-OPENSUSE prefer -lang rpm packages
|
|
||||||
Patch15: glibc-2.3.90-langpackdir.diff
|
|
||||||
# PATCH-FEATURE-SLE Use nscd user for nscd
|
# PATCH-FEATURE-SLE Use nscd user for nscd
|
||||||
Patch19: nscd-server-user.patch
|
Patch19: nscd-server-user.patch
|
||||||
# PATCH-FEATURE-SLE read nsswich.conf from /usr
|
# PATCH-FEATURE-SLE read nsswich.conf from /usr
|
||||||
@@ -302,33 +325,17 @@ Patch306: glibc-fix-double-loopback.diff
|
|||||||
%if %{without snapshot}
|
%if %{without snapshot}
|
||||||
###
|
###
|
||||||
# Patches from upstream
|
# Patches from upstream
|
||||||
|
# PATCH-FIX-UPSTREAM Fix missing randomness in __gen_tempname (BZ #32214)
|
||||||
|
Patch1000: gen-tempname-randomness.patch
|
||||||
|
# PATCH-FIX-UPSTREAM pthreads NPTL: lost wakeup fix 2 (BZ #25847)
|
||||||
|
Patch1001: pthread-wakeup.patch
|
||||||
|
# PATCH-FIX-UPSTREAM Revert optimized POWER10 strcmp, strncmp implementations (CVE-2025-5745, CVE-2025-5702, BZ #33060, BZ #33056)
|
||||||
|
Patch1006: ppc64le-revert-power10-strcmp.patch
|
||||||
|
# PATCH-FIX-UPSTREAM Revert optimized POWER10 memcmp (BZ #33059)
|
||||||
|
Patch1007: ppc64le-revert-power10-memcmp.patch
|
||||||
|
# PATCH-FIX-UPSTREAM posix: Fix double-free after allocation failure in regcomp (BZ #33185)
|
||||||
|
Patch1008: regcomp-double-free.patch
|
||||||
###
|
###
|
||||||
# PATCH-FIX-UPSTREAM arm: Remove wrong ldr from _dl_start_user (BZ #31339)
|
|
||||||
Patch1000: arm-dl-start-user.patch
|
|
||||||
# PATCH-FIX-UPSTREAM S390: Do not clobber r7 in clone (BZ #31402)
|
|
||||||
Patch1001: s390-clone-error-clobber-r7.patch
|
|
||||||
# PATCH-FIX-UPSTREAM duplocale: protect use of global locale (BZ #23970)
|
|
||||||
Patch1002: duplocale-global-locale.patch
|
|
||||||
# PATCH-FIX-UPSTREAM linux/sigsetops: fix type confusion (BZ #31468)
|
|
||||||
Patch1003: sigisemptyset.patch
|
|
||||||
# PATCH-FIX-UPSTREAM Use gcc __builtin_stdc_* builtins in stdbit.h if possible
|
|
||||||
Patch1004: stdbit-builtins.patch
|
|
||||||
# PATCH-FIX-UPSTREAM iconv: ISO-2022-CN-EXT: fix out-of-bound writes when writing escape sequence (CVE-2024-2961)
|
|
||||||
Patch1005: iconv-iso-2022-cn-ext.patch
|
|
||||||
# PATCH-FIX-UPSTREAM login: structs utmp, utmpx, lastlog _TIME_BITS independence (BZ #30701)
|
|
||||||
Patch1006: utmp-time-bits.patch
|
|
||||||
# PATCH-FIX-UPSTREAM elf: Only process multiple tunable once (BZ #31686)
|
|
||||||
Patch1007: elf-parse-tunables.patch
|
|
||||||
# PATCH-FIX-UPSTREAM nscd: Stack-based buffer overflow in netgroup cache (CVE-2024-33599, BZ #31677)
|
|
||||||
Patch1008: glibc-CVE-2024-33599-nscd-Stack-based-buffer-overflow-in-n.patch
|
|
||||||
# PATCH-FIX-UPSTREAM nscd: Do not send missing not found response in addgetnetgrentX (CVE-2024-33600, BZ #31678)
|
|
||||||
Patch1009: glibc-CVE-2024-33600-nscd-Do-not-send-missing-not-found-re.patch
|
|
||||||
# PATCH-FIX-UPSTREAM nscd: Avoid null pointer crashes after notfound response (CVE-2024-33600, BZ #31678)
|
|
||||||
Patch1010: glibc-CVE-2024-33600-nscd-Avoid-null-pointer-crashes-after.patch
|
|
||||||
# PATCH-FIX-UPSTREAM nscd netgroup: Use two buffers in addgetnetgrentX (CVE-2024-33601, CVE-2024-33602, BZ #31680)
|
|
||||||
Patch1011: glibc-CVE-2024-33601-CVE-2024-33602-nscd-netgroup-Use-two.patch
|
|
||||||
# PATCH-FIX-UPSTREAM nscd: Use time_t for return type of addgetnetgrentX (CVE-2024-33602)
|
|
||||||
Patch1012: nscd-netgroup-cache-timeout.patch
|
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
###
|
###
|
||||||
@@ -730,8 +737,12 @@ profile="--disable-profile"
|
|||||||
%if %{with livepatching}
|
%if %{with livepatching}
|
||||||
--enable-userspace-livepatch \
|
--enable-userspace-livepatch \
|
||||||
%endif
|
%endif
|
||||||
--disable-crypt || \
|
--disable-crypt \
|
||||||
{
|
%if %{without nscd}
|
||||||
|
--disable-build-nscd \
|
||||||
|
--disable-nscd \
|
||||||
|
%endif
|
||||||
|
|| {
|
||||||
rc=$?;
|
rc=$?;
|
||||||
echo "------- BEGIN config.log ------";
|
echo "------- BEGIN config.log ------";
|
||||||
%{__cat} config.log;
|
%{__cat} config.log;
|
||||||
@@ -747,6 +758,46 @@ echo 'CFLAGS-.os += -fdump-ipa-clones' \
|
|||||||
%endif
|
%endif
|
||||||
|
|
||||||
make %{?_smp_mflags} %{?make_output_sync}
|
make %{?_smp_mflags} %{?make_output_sync}
|
||||||
|
|
||||||
|
%if %{build_main} && !0%{?is_opensuse}
|
||||||
|
%ifarch x86_64 i686 s390x ppc64le
|
||||||
|
# Horrible workaround for bsc#1221482
|
||||||
|
%ifarch x86_64 i686
|
||||||
|
archsub=x86
|
||||||
|
%endif
|
||||||
|
%ifarch s390x
|
||||||
|
archsub=s390
|
||||||
|
%endif
|
||||||
|
%ifarch ppc64le
|
||||||
|
archsub=powerpc
|
||||||
|
%endif
|
||||||
|
xstatbuild ()
|
||||||
|
{
|
||||||
|
gcc -O2 -fpic -I ../sysdeps/unix/sysv/linux/$archsub -xc - -c -o $1stat$2.oS <<EOF
|
||||||
|
#include <bits/wordsize.h>
|
||||||
|
#include <xstatver.h>
|
||||||
|
int __$1xstat$2 (int, $3, void *);
|
||||||
|
|
||||||
|
int
|
||||||
|
__attribute__ ((visibility ("hidden")))
|
||||||
|
$1stat$2 ($3 file, void *buf)
|
||||||
|
{
|
||||||
|
return __$1xstat$2 (_STAT_VER, file, buf);
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
ar r libc_nonshared.a $1stat$2.oS
|
||||||
|
}
|
||||||
|
xstatbuild "" "" "const char *"
|
||||||
|
xstatbuild f "" int
|
||||||
|
xstatbuild l "" "const char *"
|
||||||
|
%ifarch i686
|
||||||
|
xstatbuild "" 64 "const char *"
|
||||||
|
xstatbuild f 64 int
|
||||||
|
xstatbuild l 64 "const char *"
|
||||||
|
%endif
|
||||||
|
%endif
|
||||||
|
%endif
|
||||||
|
|
||||||
cd ..
|
cd ..
|
||||||
|
|
||||||
#
|
#
|
||||||
@@ -756,8 +807,10 @@ cd ..
|
|||||||
make %{?_smp_mflags} %{?make_output_sync} -C cc-base html
|
make %{?_smp_mflags} %{?make_output_sync} -C cc-base html
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
|
%if %{with nscd}
|
||||||
# sysusers.d
|
# sysusers.d
|
||||||
%sysusers_generate_pre %{SOURCE22} nscd nscd.conf
|
%sysusers_generate_pre %{SOURCE22} nscd nscd.conf
|
||||||
|
%endif
|
||||||
|
|
||||||
%check
|
%check
|
||||||
%if %{build_testsuite}
|
%if %{build_testsuite}
|
||||||
@@ -839,6 +892,9 @@ make %{?_smp_mflags} %{?make_output_sync} -C cc-base test t=elf/check-localplt
|
|||||||
%define rtldlib lib
|
%define rtldlib lib
|
||||||
%define rtld_name ld-linux-riscv64-lp64d.so.1
|
%define rtld_name ld-linux-riscv64-lp64d.so.1
|
||||||
%endif
|
%endif
|
||||||
|
%ifarch loongarch64
|
||||||
|
%define rtld_name ld-linux-loongarch-lp64d.so.1
|
||||||
|
%endif
|
||||||
|
|
||||||
%if %{with usrmerged}
|
%if %{with usrmerged}
|
||||||
%define rootsbindir %{_sbindir}
|
%define rootsbindir %{_sbindir}
|
||||||
@@ -946,7 +1002,7 @@ install -m 644 %{SOURCE7} %{buildroot}/etc
|
|||||||
%if %suse_version > 1500
|
%if %suse_version > 1500
|
||||||
install -D -m 644 %{SOURCE5} %{buildroot}%{_prefix}/etc/nsswitch.conf
|
install -D -m 644 %{SOURCE5} %{buildroot}%{_prefix}/etc/nsswitch.conf
|
||||||
%else
|
%else
|
||||||
install -m 644 %{SOURCE6} %{buildroot}/etc/nsswitch.conf
|
install -m 644 %{SOURCE5} %{buildroot}/etc/nsswitch.conf
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
%if %{build_html}
|
%if %{build_html}
|
||||||
@@ -956,6 +1012,7 @@ cp -p cc-base/manual/libc/*.html %{buildroot}%{_datadir}/doc/glibc
|
|||||||
|
|
||||||
cd manpages; make install_root=%{buildroot} install; cd ..
|
cd manpages; make install_root=%{buildroot} install; cd ..
|
||||||
|
|
||||||
|
%if %{with nscd}
|
||||||
# nscd tools:
|
# nscd tools:
|
||||||
|
|
||||||
%ifnarch i686
|
%ifnarch i686
|
||||||
@@ -965,6 +1022,7 @@ ln -sf %{rootsbindir}/service %{buildroot}%{_sbindir}/rcnscd
|
|||||||
mkdir -p %{buildroot}/run/nscd
|
mkdir -p %{buildroot}/run/nscd
|
||||||
mkdir -p %{buildroot}/var/lib/nscd
|
mkdir -p %{buildroot}/var/lib/nscd
|
||||||
%endif
|
%endif
|
||||||
|
%endif
|
||||||
|
|
||||||
#
|
#
|
||||||
# Create ld.so.conf
|
# Create ld.so.conf
|
||||||
@@ -993,6 +1051,11 @@ chmod 644 %{buildroot}%{_bindir}/ldd
|
|||||||
|
|
||||||
rm -f %{buildroot}%{rootsbindir}/sln
|
rm -f %{buildroot}%{rootsbindir}/sln
|
||||||
|
|
||||||
|
%if !%build_libnsl1
|
||||||
|
rm -f %{buildroot}%{slibdir}/libnsl.so.1
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if %{with nscd}
|
||||||
%ifnarch i686
|
%ifnarch i686
|
||||||
mkdir -p %{buildroot}/usr/lib/tmpfiles.d/
|
mkdir -p %{buildroot}/usr/lib/tmpfiles.d/
|
||||||
install -m 644 %{SOURCE20} %{buildroot}/usr/lib/tmpfiles.d/
|
install -m 644 %{SOURCE20} %{buildroot}/usr/lib/tmpfiles.d/
|
||||||
@@ -1001,6 +1064,7 @@ install -m 644 %{SOURCE21} %{buildroot}/usr/lib/systemd/system
|
|||||||
mkdir -p %{buildroot}/usr/lib/sysusers.d/
|
mkdir -p %{buildroot}/usr/lib/sysusers.d/
|
||||||
install -m 644 %{SOURCE22} %{buildroot}/usr/lib/sysusers.d/nscd.conf
|
install -m 644 %{SOURCE22} %{buildroot}/usr/lib/sysusers.d/nscd.conf
|
||||||
%endif
|
%endif
|
||||||
|
%endif
|
||||||
|
|
||||||
%if 0%{?rtld_oldname:1}
|
%if 0%{?rtld_oldname:1}
|
||||||
# Provide compatibility link
|
# Provide compatibility link
|
||||||
@@ -1027,8 +1091,10 @@ rm -rf %{buildroot}%{_libdir}/audit
|
|||||||
# Remove files from glibc-{extra,info,i18ndata}, nscd
|
# Remove files from glibc-{extra,info,i18ndata}, nscd
|
||||||
rm -rf %{buildroot}%{_infodir} %{buildroot}%{_prefix}/share/i18n
|
rm -rf %{buildroot}%{_infodir} %{buildroot}%{_prefix}/share/i18n
|
||||||
rm -f %{buildroot}%{_bindir}/makedb %{buildroot}/var/lib/misc/Makefile
|
rm -f %{buildroot}%{_bindir}/makedb %{buildroot}/var/lib/misc/Makefile
|
||||||
|
%if %{with nscd}
|
||||||
rm -f %{buildroot}%{_sbindir}/nscd
|
rm -f %{buildroot}%{_sbindir}/nscd
|
||||||
%endif
|
%endif
|
||||||
|
%endif
|
||||||
|
|
||||||
%ifnarch i686
|
%ifnarch i686
|
||||||
# /var/lib/misc is incompatible with transactional updates (bsc#1138726)
|
# /var/lib/misc is incompatible with transactional updates (bsc#1138726)
|
||||||
@@ -1125,6 +1191,9 @@ rm %{buildroot}/sbin
|
|||||||
%if %{build_main}
|
%if %{build_main}
|
||||||
|
|
||||||
%post -p <lua>
|
%post -p <lua>
|
||||||
|
%if %{suse_version} >= 1600
|
||||||
|
exec = rpm.execute
|
||||||
|
%else
|
||||||
function exec(path, ...)
|
function exec(path, ...)
|
||||||
local pid = posix.fork()
|
local pid = posix.fork()
|
||||||
if pid == 0 then
|
if pid == 0 then
|
||||||
@@ -1137,6 +1206,7 @@ function exec(path, ...)
|
|||||||
end
|
end
|
||||||
posix.wait(pid)
|
posix.wait(pid)
|
||||||
end
|
end
|
||||||
|
%endif
|
||||||
|
|
||||||
-- First, get rid of platform-optimized libraries. We remove any we have
|
-- First, get rid of platform-optimized libraries. We remove any we have
|
||||||
-- ever built, since otherwise we might end up using some old leftover
|
-- ever built, since otherwise we might end up using some old leftover
|
||||||
@@ -1246,7 +1316,9 @@ exit 0
|
|||||||
%endif
|
%endif
|
||||||
|
|
||||||
%{slibdir}/libBrokenLocale.so.1
|
%{slibdir}/libBrokenLocale.so.1
|
||||||
|
%ifarch %libanl_archs
|
||||||
%{slibdir}/libanl.so.1
|
%{slibdir}/libanl.so.1
|
||||||
|
%endif
|
||||||
%{slibdir}/libc.so.6*
|
%{slibdir}/libc.so.6*
|
||||||
%{slibdir}/libc_malloc_debug.so.0
|
%{slibdir}/libc_malloc_debug.so.0
|
||||||
%{slibdir}/libdl.so.2*
|
%{slibdir}/libdl.so.2*
|
||||||
@@ -1263,7 +1335,9 @@ exit 0
|
|||||||
%{slibdir}/libresolv.so.2
|
%{slibdir}/libresolv.so.2
|
||||||
%{slibdir}/librt.so.1
|
%{slibdir}/librt.so.1
|
||||||
%{slibdir}/libthread_db.so.1
|
%{slibdir}/libthread_db.so.1
|
||||||
|
%ifarch %libutil_archs
|
||||||
%{slibdir}/libutil.so.1
|
%{slibdir}/libutil.so.1
|
||||||
|
%endif
|
||||||
%dir %attr(0700,root,root) /var/cache/ldconfig
|
%dir %attr(0700,root,root) /var/cache/ldconfig
|
||||||
%{rootsbindir}/ldconfig
|
%{rootsbindir}/ldconfig
|
||||||
%{_bindir}/gencat
|
%{_bindir}/gencat
|
||||||
@@ -1343,7 +1417,9 @@ exit 0
|
|||||||
%{_includedir}/*
|
%{_includedir}/*
|
||||||
%{_libdir}/*.o
|
%{_libdir}/*.o
|
||||||
%{_libdir}/libBrokenLocale.so
|
%{_libdir}/libBrokenLocale.so
|
||||||
|
%ifarch %libanl_archs
|
||||||
%{_libdir}/libanl.so
|
%{_libdir}/libanl.so
|
||||||
|
%endif
|
||||||
%{_libdir}/libc.so
|
%{_libdir}/libc.so
|
||||||
%{_libdir}/libc_malloc_debug.so
|
%{_libdir}/libc_malloc_debug.so
|
||||||
%{_libdir}/libm.so
|
%{_libdir}/libm.so
|
||||||
@@ -1371,7 +1447,9 @@ exit 0
|
|||||||
%files devel-static
|
%files devel-static
|
||||||
%defattr(-,root,root)
|
%defattr(-,root,root)
|
||||||
%{_libdir}/libBrokenLocale.a
|
%{_libdir}/libBrokenLocale.a
|
||||||
|
%ifarch %libanl_archs
|
||||||
%{_libdir}/libanl.a
|
%{_libdir}/libanl.a
|
||||||
|
%endif
|
||||||
%{_libdir}/libc.a
|
%{_libdir}/libc.a
|
||||||
%{_libdir}/libm.a
|
%{_libdir}/libm.a
|
||||||
%ifarch x86_64 aarch64
|
%ifarch x86_64 aarch64
|
||||||
@@ -1397,6 +1475,7 @@ exit 0
|
|||||||
%defattr(-,root,root)
|
%defattr(-,root,root)
|
||||||
%{_prefix}/share/i18n
|
%{_prefix}/share/i18n
|
||||||
|
|
||||||
|
%if %{with nscd}
|
||||||
%files -n nscd
|
%files -n nscd
|
||||||
%defattr(-,root,root)
|
%defattr(-,root,root)
|
||||||
%config(noreplace) /etc/nscd.conf
|
%config(noreplace) /etc/nscd.conf
|
||||||
@@ -1417,13 +1496,16 @@ exit 0
|
|||||||
%attr(0600,root,root) %verify(not md5 size mtime) %ghost %config(missingok,noreplace) /var/lib/nscd/services
|
%attr(0600,root,root) %verify(not md5 size mtime) %ghost %config(missingok,noreplace) /var/lib/nscd/services
|
||||||
%attr(0600,root,root) %verify(not md5 size mtime) %ghost %config(missingok,noreplace) /var/lib/nscd/netgroup
|
%attr(0600,root,root) %verify(not md5 size mtime) %ghost %config(missingok,noreplace) /var/lib/nscd/netgroup
|
||||||
%endif
|
%endif
|
||||||
|
%endif
|
||||||
|
|
||||||
%if %{build_profile}
|
%if %{build_profile}
|
||||||
%files profile
|
%files profile
|
||||||
%defattr(-,root,root)
|
%defattr(-,root,root)
|
||||||
%{_libdir}/libc_p.a
|
%{_libdir}/libc_p.a
|
||||||
%{_libdir}/libBrokenLocale_p.a
|
%{_libdir}/libBrokenLocale_p.a
|
||||||
|
%ifarch %libanl_archs
|
||||||
%{_libdir}/libanl_p.a
|
%{_libdir}/libanl_p.a
|
||||||
|
%endif
|
||||||
%{_libdir}/libm_p.a
|
%{_libdir}/libm_p.a
|
||||||
%ifarch x86_64 aarch64
|
%ifarch x86_64 aarch64
|
||||||
%{_libdir}/libmvec_p.a
|
%{_libdir}/libmvec_p.a
|
||||||
@@ -1431,7 +1513,9 @@ exit 0
|
|||||||
%{_libdir}/libpthread_p.a
|
%{_libdir}/libpthread_p.a
|
||||||
%{_libdir}/libresolv_p.a
|
%{_libdir}/libresolv_p.a
|
||||||
%{_libdir}/librt_p.a
|
%{_libdir}/librt_p.a
|
||||||
|
%ifarch %libutil_archs
|
||||||
%{_libdir}/libutil_p.a
|
%{_libdir}/libutil_p.a
|
||||||
|
%endif
|
||||||
%{_libdir}/libdl_p.a
|
%{_libdir}/libdl_p.a
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
@@ -1445,10 +1529,12 @@ exit 0
|
|||||||
%files lang -f libc.lang
|
%files lang -f libc.lang
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
%ifarch %ix86 %alpha hppa m68k %mips32 %mips64 %sparc ppc ppc64 ppc64le x86_64 s390 s390x %arm aarch64 riscv64
|
%if %build_libnsl1
|
||||||
|
%ifarch %libnsl_archs
|
||||||
%files -n libnsl1
|
%files -n libnsl1
|
||||||
%{slibdir}/libnsl.so.1
|
%{slibdir}/libnsl.so.1
|
||||||
%endif
|
%endif
|
||||||
|
%endif
|
||||||
|
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
|
@@ -1,216 +0,0 @@
|
|||||||
From 31da30f23cddd36db29d5b6a1c7619361b271fb4 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Charles Fol <folcharles@gmail.com>
|
|
||||||
Date: Thu, 28 Mar 2024 12:25:38 -0300
|
|
||||||
Subject: [PATCH] iconv: ISO-2022-CN-EXT: fix out-of-bound writes when writing
|
|
||||||
escape sequence (CVE-2024-2961)
|
|
||||||
|
|
||||||
ISO-2022-CN-EXT uses escape sequences to indicate character set changes
|
|
||||||
(as specified by RFC 1922). While the SOdesignation has the expected
|
|
||||||
bounds checks, neither SS2designation nor SS3designation have its;
|
|
||||||
allowing a write overflow of 1, 2, or 3 bytes with fixed values:
|
|
||||||
'$+I', '$+J', '$+K', '$+L', '$+M', or '$*H'.
|
|
||||||
|
|
||||||
Checked on aarch64-linux-gnu.
|
|
||||||
|
|
||||||
Co-authored-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
|
||||||
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
|
|
||||||
Tested-by: Carlos O'Donell <carlos@redhat.com>
|
|
||||||
|
|
||||||
(cherry picked from commit f9dc609e06b1136bb0408be9605ce7973a767ada)
|
|
||||||
---
|
|
||||||
iconvdata/Makefile | 5 +-
|
|
||||||
iconvdata/iso-2022-cn-ext.c | 12 +++
|
|
||||||
iconvdata/tst-iconv-iso-2022-cn-ext.c | 128 ++++++++++++++++++++++++++
|
|
||||||
3 files changed, 144 insertions(+), 1 deletion(-)
|
|
||||||
create mode 100644 iconvdata/tst-iconv-iso-2022-cn-ext.c
|
|
||||||
|
|
||||||
diff --git a/iconvdata/Makefile b/iconvdata/Makefile
|
|
||||||
index ea019ce5c0..7196a8744b 100644
|
|
||||||
--- a/iconvdata/Makefile
|
|
||||||
+++ b/iconvdata/Makefile
|
|
||||||
@@ -75,7 +75,8 @@ ifeq (yes,$(build-shared))
|
|
||||||
tests = bug-iconv1 bug-iconv2 tst-loading tst-e2big tst-iconv4 bug-iconv4 \
|
|
||||||
tst-iconv6 bug-iconv5 bug-iconv6 tst-iconv7 bug-iconv8 bug-iconv9 \
|
|
||||||
bug-iconv10 bug-iconv11 bug-iconv12 tst-iconv-big5-hkscs-to-2ucs4 \
|
|
||||||
- bug-iconv13 bug-iconv14 bug-iconv15
|
|
||||||
+ bug-iconv13 bug-iconv14 bug-iconv15 \
|
|
||||||
+ tst-iconv-iso-2022-cn-ext
|
|
||||||
ifeq ($(have-thread-library),yes)
|
|
||||||
tests += bug-iconv3
|
|
||||||
endif
|
|
||||||
@@ -330,6 +331,8 @@ $(objpfx)bug-iconv14.out: $(addprefix $(objpfx), $(gconv-modules)) \
|
|
||||||
$(addprefix $(objpfx),$(modules.so))
|
|
||||||
$(objpfx)bug-iconv15.out: $(addprefix $(objpfx), $(gconv-modules)) \
|
|
||||||
$(addprefix $(objpfx),$(modules.so))
|
|
||||||
+$(objpfx)tst-iconv-iso-2022-cn-ext.out: $(addprefix $(objpfx), $(gconv-modules)) \
|
|
||||||
+ $(addprefix $(objpfx),$(modules.so))
|
|
||||||
|
|
||||||
$(objpfx)iconv-test.out: run-iconv-test.sh \
|
|
||||||
$(addprefix $(objpfx), $(gconv-modules)) \
|
|
||||||
diff --git a/iconvdata/iso-2022-cn-ext.c b/iconvdata/iso-2022-cn-ext.c
|
|
||||||
index b34c8a36f4..cce29b1969 100644
|
|
||||||
--- a/iconvdata/iso-2022-cn-ext.c
|
|
||||||
+++ b/iconvdata/iso-2022-cn-ext.c
|
|
||||||
@@ -574,6 +574,12 @@ DIAG_IGNORE_Os_NEEDS_COMMENT (5, "-Wmaybe-uninitialized");
|
|
||||||
{ \
|
|
||||||
const char *escseq; \
|
|
||||||
\
|
|
||||||
+ if (outptr + 4 > outend) \
|
|
||||||
+ { \
|
|
||||||
+ result = __GCONV_FULL_OUTPUT; \
|
|
||||||
+ break; \
|
|
||||||
+ } \
|
|
||||||
+ \
|
|
||||||
assert (used == CNS11643_2_set); /* XXX */ \
|
|
||||||
escseq = "*H"; \
|
|
||||||
*outptr++ = ESC; \
|
|
||||||
@@ -587,6 +593,12 @@ DIAG_IGNORE_Os_NEEDS_COMMENT (5, "-Wmaybe-uninitialized");
|
|
||||||
{ \
|
|
||||||
const char *escseq; \
|
|
||||||
\
|
|
||||||
+ if (outptr + 4 > outend) \
|
|
||||||
+ { \
|
|
||||||
+ result = __GCONV_FULL_OUTPUT; \
|
|
||||||
+ break; \
|
|
||||||
+ } \
|
|
||||||
+ \
|
|
||||||
assert ((used >> 5) >= 3 && (used >> 5) <= 7); \
|
|
||||||
escseq = "+I+J+K+L+M" + ((used >> 5) - 3) * 2; \
|
|
||||||
*outptr++ = ESC; \
|
|
||||||
diff --git a/iconvdata/tst-iconv-iso-2022-cn-ext.c b/iconvdata/tst-iconv-iso-2022-cn-ext.c
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000000..96a8765fd5
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/iconvdata/tst-iconv-iso-2022-cn-ext.c
|
|
||||||
@@ -0,0 +1,128 @@
|
|
||||||
+/* Verify ISO-2022-CN-EXT does not write out of the bounds.
|
|
||||||
+ Copyright (C) 2024 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 <stdio.h>
|
|
||||||
+#include <string.h>
|
|
||||||
+
|
|
||||||
+#include <errno.h>
|
|
||||||
+#include <iconv.h>
|
|
||||||
+#include <sys/mman.h>
|
|
||||||
+
|
|
||||||
+#include <support/xunistd.h>
|
|
||||||
+#include <support/check.h>
|
|
||||||
+#include <support/support.h>
|
|
||||||
+
|
|
||||||
+/* The test sets up a two memory page buffer with the second page marked
|
|
||||||
+ PROT_NONE to trigger a fault if the conversion writes beyond the exact
|
|
||||||
+ expected amount. Then we carry out various conversions and precisely
|
|
||||||
+ place the start of the output buffer in order to trigger a SIGSEGV if the
|
|
||||||
+ process writes anywhere between 1 and page sized bytes more (only one
|
|
||||||
+ PROT_NONE page is setup as a canary) than expected. These tests exercise
|
|
||||||
+ all three of the cases in ISO-2022-CN-EXT where the converter must switch
|
|
||||||
+ character sets and may run out of buffer space while doing the
|
|
||||||
+ operation. */
|
|
||||||
+
|
|
||||||
+static int
|
|
||||||
+do_test (void)
|
|
||||||
+{
|
|
||||||
+ iconv_t cd = iconv_open ("ISO-2022-CN-EXT", "UTF-8");
|
|
||||||
+ TEST_VERIFY_EXIT (cd != (iconv_t) -1);
|
|
||||||
+
|
|
||||||
+ char *ntf;
|
|
||||||
+ size_t ntfsize;
|
|
||||||
+ char *outbufbase;
|
|
||||||
+ {
|
|
||||||
+ int pgz = getpagesize ();
|
|
||||||
+ TEST_VERIFY_EXIT (pgz > 0);
|
|
||||||
+ ntfsize = 2 * pgz;
|
|
||||||
+
|
|
||||||
+ ntf = xmmap (NULL, ntfsize, PROT_READ | PROT_WRITE, MAP_PRIVATE
|
|
||||||
+ | MAP_ANONYMOUS, -1);
|
|
||||||
+ xmprotect (ntf + pgz, pgz, PROT_NONE);
|
|
||||||
+
|
|
||||||
+ outbufbase = ntf + pgz;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ /* Check if SOdesignation escape sequence does not trigger an OOB write. */
|
|
||||||
+ {
|
|
||||||
+ char inbuf[] = "\xe4\xba\xa4\xe6\x8d\xa2";
|
|
||||||
+
|
|
||||||
+ for (int i = 0; i < 9; i++)
|
|
||||||
+ {
|
|
||||||
+ char *inp = inbuf;
|
|
||||||
+ size_t inleft = sizeof (inbuf) - 1;
|
|
||||||
+
|
|
||||||
+ char *outp = outbufbase - i;
|
|
||||||
+ size_t outleft = i;
|
|
||||||
+
|
|
||||||
+ TEST_VERIFY_EXIT (iconv (cd, &inp, &inleft, &outp, &outleft)
|
|
||||||
+ == (size_t) -1);
|
|
||||||
+ TEST_COMPARE (errno, E2BIG);
|
|
||||||
+
|
|
||||||
+ TEST_VERIFY_EXIT (iconv (cd, NULL, NULL, NULL, NULL) == 0);
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ /* Same as before for SS2designation. */
|
|
||||||
+ {
|
|
||||||
+ char inbuf[] = "㴽 \xe3\xb4\xbd";
|
|
||||||
+
|
|
||||||
+ for (int i = 0; i < 14; i++)
|
|
||||||
+ {
|
|
||||||
+ char *inp = inbuf;
|
|
||||||
+ size_t inleft = sizeof (inbuf) - 1;
|
|
||||||
+
|
|
||||||
+ char *outp = outbufbase - i;
|
|
||||||
+ size_t outleft = i;
|
|
||||||
+
|
|
||||||
+ TEST_VERIFY_EXIT (iconv (cd, &inp, &inleft, &outp, &outleft)
|
|
||||||
+ == (size_t) -1);
|
|
||||||
+ TEST_COMPARE (errno, E2BIG);
|
|
||||||
+
|
|
||||||
+ TEST_VERIFY_EXIT (iconv (cd, NULL, NULL, NULL, NULL) == 0);
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ /* Same as before for SS3designation. */
|
|
||||||
+ {
|
|
||||||
+ char inbuf[] = "劄 \xe5\x8a\x84";
|
|
||||||
+
|
|
||||||
+ for (int i = 0; i < 14; i++)
|
|
||||||
+ {
|
|
||||||
+ char *inp = inbuf;
|
|
||||||
+ size_t inleft = sizeof (inbuf) - 1;
|
|
||||||
+
|
|
||||||
+ char *outp = outbufbase - i;
|
|
||||||
+ size_t outleft = i;
|
|
||||||
+
|
|
||||||
+ TEST_VERIFY_EXIT (iconv (cd, &inp, &inleft, &outp, &outleft)
|
|
||||||
+ == (size_t) -1);
|
|
||||||
+ TEST_COMPARE (errno, E2BIG);
|
|
||||||
+
|
|
||||||
+ TEST_VERIFY_EXIT (iconv (cd, NULL, NULL, NULL, NULL) == 0);
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ TEST_VERIFY_EXIT (iconv_close (cd) != -1);
|
|
||||||
+
|
|
||||||
+ xmunmap (ntf, ntfsize);
|
|
||||||
+
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+#include <support/test-driver.c>
|
|
||||||
--
|
|
||||||
2.44.0
|
|
||||||
|
|
@@ -1,36 +0,0 @@
|
|||||||
From acc56074b0a5127631a64640aef1b7c5c103ebd8 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Florian Weimer <fweimer@redhat.com>
|
|
||||||
Date: Thu, 2 May 2024 17:06:19 +0200
|
|
||||||
Subject: [PATCH] nscd: Use time_t for return type of addgetnetgrentX
|
|
||||||
|
|
||||||
Using int may give false results for future dates (timeouts after the
|
|
||||||
year 2028).
|
|
||||||
|
|
||||||
Fixes commit 04a21e050d64a1193a6daab872bca2528bda44b ("CVE-2024-33601,
|
|
||||||
CVE-2024-33602: nscd: netgroup: Use two buffers in addgetnetgrentX
|
|
||||||
(bug 31680)").
|
|
||||||
|
|
||||||
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
|
|
||||||
(cherry picked from commit 4bbca1a44691a6e9adcee5c6798a707b626bc331)
|
|
||||||
---
|
|
||||||
nscd/netgroupcache.c | 4 ++--
|
|
||||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/nscd/netgroupcache.c b/nscd/netgroupcache.c
|
|
||||||
index e8fe041846..01d554af9c 100644
|
|
||||||
--- a/nscd/netgroupcache.c
|
|
||||||
+++ b/nscd/netgroupcache.c
|
|
||||||
@@ -680,8 +680,8 @@ readdinnetgr (struct database_dyn *db, struct hashentry *he,
|
|
||||||
.key_len = he->len
|
|
||||||
};
|
|
||||||
|
|
||||||
- int timeout = addinnetgrX (db, -1, &req, db->data + he->key, he->owner,
|
|
||||||
- he, dh);
|
|
||||||
+ time_t timeout = addinnetgrX (db, -1, &req, db->data + he->key, he->owner,
|
|
||||||
+ he, dh);
|
|
||||||
if (timeout < 0)
|
|
||||||
timeout = 0;
|
|
||||||
return timeout;
|
|
||||||
--
|
|
||||||
2.45.0
|
|
||||||
|
|
@@ -64,12 +64,12 @@ networks: files dns
|
|||||||
aliases: files usrfiles
|
aliases: files usrfiles
|
||||||
ethers: files usrfiles
|
ethers: files usrfiles
|
||||||
gshadow: files usrfiles
|
gshadow: files usrfiles
|
||||||
netgroup: files nis
|
netgroup: files
|
||||||
protocols: files usrfiles
|
protocols: files usrfiles
|
||||||
publickey: files
|
publickey: files
|
||||||
rpc: files usrfiles
|
rpc: files usrfiles
|
||||||
services: files usrfiles
|
services: files usrfiles
|
||||||
|
|
||||||
automount: files nis
|
automount: files
|
||||||
bootparams: files
|
bootparams: files
|
||||||
netmasks: files
|
netmasks: files
|
||||||
|
417
ppc64le-revert-power10-memcmp.patch
Normal file
417
ppc64le-revert-power10-memcmp.patch
Normal file
@@ -0,0 +1,417 @@
|
|||||||
|
Index: glibc-2.40/sysdeps/powerpc/powerpc64/le/power10/memchr.S
|
||||||
|
===================================================================
|
||||||
|
--- glibc-2.40.orig/sysdeps/powerpc/powerpc64/le/power10/memchr.S
|
||||||
|
+++ /dev/null
|
||||||
|
@@ -1,315 +0,0 @@
|
||||||
|
-/* Optimized memchr implementation for POWER10 LE.
|
||||||
|
- Copyright (C) 2021-2024 Free Software Foundation, Inc.
|
||||||
|
- This file is part of the GNU C Library.
|
||||||
|
-
|
||||||
|
- The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
- modify it under the terms of the GNU Lesser General Public
|
||||||
|
- License as published by the Free Software Foundation; either
|
||||||
|
- version 2.1 of the License, or (at your option) any later version.
|
||||||
|
-
|
||||||
|
- The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
- Lesser General Public License for more details.
|
||||||
|
-
|
||||||
|
- You should have received a copy of the GNU Lesser General Public
|
||||||
|
- License along with the GNU C Library; if not, see
|
||||||
|
- <https://www.gnu.org/licenses/>. */
|
||||||
|
-
|
||||||
|
-#include <sysdep.h>
|
||||||
|
-
|
||||||
|
-# ifndef MEMCHR
|
||||||
|
-# define MEMCHR __memchr
|
||||||
|
-# endif
|
||||||
|
-# define M_VREG_ZERO v20
|
||||||
|
-# define M_OFF_START_LOOP 256
|
||||||
|
-# define MEMCHR_SUBTRACT_VECTORS \
|
||||||
|
- vsububm v4,v4,v18; \
|
||||||
|
- vsububm v5,v5,v18; \
|
||||||
|
- vsububm v6,v6,v18; \
|
||||||
|
- vsububm v7,v7,v18;
|
||||||
|
-# define M_TAIL(vreg,increment) \
|
||||||
|
- vctzlsbb r4,vreg; \
|
||||||
|
- cmpld r5,r4; \
|
||||||
|
- ble L(null); \
|
||||||
|
- addi r4,r4,increment; \
|
||||||
|
- add r3,r6,r4; \
|
||||||
|
- blr
|
||||||
|
-
|
||||||
|
-/* TODO: Replace macros by the actual instructions when minimum binutils becomes
|
||||||
|
- >= 2.35. This is used to keep compatibility with older versions. */
|
||||||
|
-#define M_VEXTRACTBM(rt,vrb) \
|
||||||
|
- .long(((4)<<(32-6)) \
|
||||||
|
- | ((rt)<<(32-11)) \
|
||||||
|
- | ((8)<<(32-16)) \
|
||||||
|
- | ((vrb)<<(32-21)) \
|
||||||
|
- | 1602)
|
||||||
|
-
|
||||||
|
-#define M_LXVP(xtp,dq,ra) \
|
||||||
|
- .long(((6)<<(32-6)) \
|
||||||
|
- | ((((xtp)-32)>>1)<<(32-10)) \
|
||||||
|
- | ((1)<<(32-11)) \
|
||||||
|
- | ((ra)<<(32-16)) \
|
||||||
|
- | dq)
|
||||||
|
-
|
||||||
|
-#define CHECK16B(vreg,offset,addr,label) \
|
||||||
|
- lxv vreg+32,offset(addr); \
|
||||||
|
- vcmpequb. vreg,vreg,v18; \
|
||||||
|
- bne cr6,L(label); \
|
||||||
|
- cmpldi r5,16; \
|
||||||
|
- ble L(null); \
|
||||||
|
- addi r5,r5,-16;
|
||||||
|
-
|
||||||
|
-/* Load 4 quadwords, merge into one VR for speed and check for NULLs. r6 has #
|
||||||
|
- of bytes already checked. */
|
||||||
|
-#define CHECK64B(offset,addr,label) \
|
||||||
|
- M_LXVP(v4+32,offset,addr); \
|
||||||
|
- M_LXVP(v6+32,offset+32,addr); \
|
||||||
|
- MEMCHR_SUBTRACT_VECTORS; \
|
||||||
|
- vminub v14,v4,v5; \
|
||||||
|
- vminub v15,v6,v7; \
|
||||||
|
- vminub v16,v14,v15; \
|
||||||
|
- vcmpequb. v0,v16,M_VREG_ZERO; \
|
||||||
|
- beq cr6,$+12; \
|
||||||
|
- li r7,offset; \
|
||||||
|
- b L(label); \
|
||||||
|
- cmpldi r5,64; \
|
||||||
|
- ble L(null); \
|
||||||
|
- addi r5,r5,-64
|
||||||
|
-
|
||||||
|
-/* Implements the function
|
||||||
|
- void *[r3] memchr (const void *s [r3], int c [r4], size_t n [r5]). */
|
||||||
|
-
|
||||||
|
- .machine power9
|
||||||
|
-
|
||||||
|
-ENTRY_TOCLESS (MEMCHR)
|
||||||
|
- CALL_MCOUNT 3
|
||||||
|
-
|
||||||
|
- cmpldi r5,0
|
||||||
|
- beq L(null)
|
||||||
|
- mr r0,r5
|
||||||
|
- xori r6,r4,0xff
|
||||||
|
-
|
||||||
|
- mtvsrd v18+32,r4 /* matching char in v18 */
|
||||||
|
- mtvsrd v19+32,r6 /* non matching char in v19 */
|
||||||
|
-
|
||||||
|
- vspltb v18,v18,7 /* replicate */
|
||||||
|
- vspltb v19,v19,7 /* replicate */
|
||||||
|
- vspltisb M_VREG_ZERO,0
|
||||||
|
-
|
||||||
|
- /* Next 16B-aligned address. Prepare address for L(aligned). */
|
||||||
|
- addi r6,r3,16
|
||||||
|
- clrrdi r6,r6,4
|
||||||
|
-
|
||||||
|
- /* Align data and fill bytes not loaded with non matching char. */
|
||||||
|
- lvx v0,0,r3
|
||||||
|
- lvsr v1,0,r3
|
||||||
|
- vperm v0,v19,v0,v1
|
||||||
|
-
|
||||||
|
- vcmpequb. v6,v0,v18
|
||||||
|
- bne cr6,L(found)
|
||||||
|
- sub r4,r6,r3
|
||||||
|
- cmpld r5,r4
|
||||||
|
- ble L(null)
|
||||||
|
- sub r5,r5,r4
|
||||||
|
-
|
||||||
|
- /* Test up to OFF_START_LOOP-16 bytes in 16B chunks. The main loop is
|
||||||
|
- optimized for longer strings, so checking the first bytes in 16B
|
||||||
|
- chunks benefits a lot small strings. */
|
||||||
|
- .p2align 5
|
||||||
|
-L(aligned):
|
||||||
|
- cmpldi r5,0
|
||||||
|
- beq L(null)
|
||||||
|
-
|
||||||
|
- CHECK16B(v0,0,r6,tail1)
|
||||||
|
- CHECK16B(v1,16,r6,tail2)
|
||||||
|
- CHECK16B(v2,32,r6,tail3)
|
||||||
|
- CHECK16B(v3,48,r6,tail4)
|
||||||
|
- CHECK16B(v4,64,r6,tail5)
|
||||||
|
- CHECK16B(v5,80,r6,tail6)
|
||||||
|
- CHECK16B(v6,96,r6,tail7)
|
||||||
|
- CHECK16B(v7,112,r6,tail8)
|
||||||
|
- CHECK16B(v8,128,r6,tail9)
|
||||||
|
- CHECK16B(v9,144,r6,tail10)
|
||||||
|
- CHECK16B(v10,160,r6,tail11)
|
||||||
|
- CHECK16B(v0,176,r6,tail12)
|
||||||
|
- CHECK16B(v1,192,r6,tail13)
|
||||||
|
- CHECK16B(v2,208,r6,tail14)
|
||||||
|
- CHECK16B(v3,224,r6,tail15)
|
||||||
|
-
|
||||||
|
- cmpdi cr5,r4,0 /* Check if c == 0. This will be useful to
|
||||||
|
- choose how we will perform the main loop. */
|
||||||
|
-
|
||||||
|
- /* Prepare address for the loop. */
|
||||||
|
- addi r4,r3,M_OFF_START_LOOP
|
||||||
|
- clrrdi r4,r4,6
|
||||||
|
- sub r6,r4,r3
|
||||||
|
- sub r5,r0,r6
|
||||||
|
- addi r6,r4,128
|
||||||
|
-
|
||||||
|
- /* If c == 0, use the loop without the vsububm. */
|
||||||
|
- beq cr5,L(loop)
|
||||||
|
-
|
||||||
|
- /* This is very similar to the block after L(loop), the difference is
|
||||||
|
- that here MEMCHR_SUBTRACT_VECTORS is not empty, and we subtract
|
||||||
|
- each byte loaded by the char we are looking for, this way we can keep
|
||||||
|
- using vminub to merge the results and checking for nulls. */
|
||||||
|
- .p2align 5
|
||||||
|
-L(memchr_loop):
|
||||||
|
- CHECK64B(0,r4,pre_tail_64b)
|
||||||
|
- CHECK64B(64,r4,pre_tail_64b)
|
||||||
|
- addi r4,r4,256
|
||||||
|
-
|
||||||
|
- CHECK64B(0,r6,tail_64b)
|
||||||
|
- CHECK64B(64,r6,tail_64b)
|
||||||
|
- addi r6,r6,256
|
||||||
|
-
|
||||||
|
- CHECK64B(0,r4,pre_tail_64b)
|
||||||
|
- CHECK64B(64,r4,pre_tail_64b)
|
||||||
|
- addi r4,r4,256
|
||||||
|
-
|
||||||
|
- CHECK64B(0,r6,tail_64b)
|
||||||
|
- CHECK64B(64,r6,tail_64b)
|
||||||
|
- addi r6,r6,256
|
||||||
|
-
|
||||||
|
- b L(memchr_loop)
|
||||||
|
- /* Switch to a more aggressive approach checking 64B each time. Use 2
|
||||||
|
- pointers 128B apart and unroll the loop once to make the pointer
|
||||||
|
- updates and usages separated enough to avoid stalls waiting for
|
||||||
|
- address calculation. */
|
||||||
|
- .p2align 5
|
||||||
|
-L(loop):
|
||||||
|
-#undef MEMCHR_SUBTRACT_VECTORS
|
||||||
|
-#define MEMCHR_SUBTRACT_VECTORS /* nothing */
|
||||||
|
- CHECK64B(0,r4,pre_tail_64b)
|
||||||
|
- CHECK64B(64,r4,pre_tail_64b)
|
||||||
|
- addi r4,r4,256
|
||||||
|
-
|
||||||
|
- CHECK64B(0,r6,tail_64b)
|
||||||
|
- CHECK64B(64,r6,tail_64b)
|
||||||
|
- addi r6,r6,256
|
||||||
|
-
|
||||||
|
- CHECK64B(0,r4,pre_tail_64b)
|
||||||
|
- CHECK64B(64,r4,pre_tail_64b)
|
||||||
|
- addi r4,r4,256
|
||||||
|
-
|
||||||
|
- CHECK64B(0,r6,tail_64b)
|
||||||
|
- CHECK64B(64,r6,tail_64b)
|
||||||
|
- addi r6,r6,256
|
||||||
|
-
|
||||||
|
- b L(loop)
|
||||||
|
-
|
||||||
|
- .p2align 5
|
||||||
|
-L(pre_tail_64b):
|
||||||
|
- mr r6,r4
|
||||||
|
-L(tail_64b):
|
||||||
|
- /* OK, we found a null byte. Let's look for it in the current 64-byte
|
||||||
|
- block and mark it in its corresponding VR. lxvp vx,0(ry) puts the
|
||||||
|
- low 16B bytes into vx+1, and the high into vx, so the order here is
|
||||||
|
- v5, v4, v7, v6. */
|
||||||
|
- vcmpequb v1,v5,M_VREG_ZERO
|
||||||
|
- vcmpequb v2,v4,M_VREG_ZERO
|
||||||
|
- vcmpequb v3,v7,M_VREG_ZERO
|
||||||
|
- vcmpequb v4,v6,M_VREG_ZERO
|
||||||
|
-
|
||||||
|
- /* Take into account the other 64B blocks we had already checked. */
|
||||||
|
- add r6,r6,r7
|
||||||
|
- /* Extract first bit of each byte. */
|
||||||
|
- M_VEXTRACTBM(r8,v1)
|
||||||
|
- M_VEXTRACTBM(r9,v2)
|
||||||
|
- M_VEXTRACTBM(r10,v3)
|
||||||
|
- M_VEXTRACTBM(r11,v4)
|
||||||
|
-
|
||||||
|
- /* Shift each value into their corresponding position. */
|
||||||
|
- sldi r9,r9,16
|
||||||
|
- sldi r10,r10,32
|
||||||
|
- sldi r11,r11,48
|
||||||
|
-
|
||||||
|
- /* Merge the results. */
|
||||||
|
- or r8,r8,r9
|
||||||
|
- or r9,r10,r11
|
||||||
|
- or r11,r9,r8
|
||||||
|
-
|
||||||
|
- cnttzd r0,r11 /* Count trailing zeros before the match. */
|
||||||
|
- cmpld r5,r0
|
||||||
|
- ble L(null)
|
||||||
|
- add r3,r6,r0 /* Compute final address. */
|
||||||
|
- blr
|
||||||
|
-
|
||||||
|
- .p2align 5
|
||||||
|
-L(tail1):
|
||||||
|
- M_TAIL(v0,0)
|
||||||
|
-
|
||||||
|
- .p2align 5
|
||||||
|
-L(tail2):
|
||||||
|
- M_TAIL(v1,16)
|
||||||
|
-
|
||||||
|
- .p2align 5
|
||||||
|
-L(tail3):
|
||||||
|
- M_TAIL(v2,32)
|
||||||
|
-
|
||||||
|
- .p2align 5
|
||||||
|
-L(tail4):
|
||||||
|
- M_TAIL(v3,48)
|
||||||
|
-
|
||||||
|
- .p2align 5
|
||||||
|
-L(tail5):
|
||||||
|
- M_TAIL(v4,64)
|
||||||
|
-
|
||||||
|
- .p2align 5
|
||||||
|
-L(tail6):
|
||||||
|
- M_TAIL(v5,80)
|
||||||
|
-
|
||||||
|
- .p2align 5
|
||||||
|
-L(tail7):
|
||||||
|
- M_TAIL(v6,96)
|
||||||
|
-
|
||||||
|
- .p2align 5
|
||||||
|
-L(tail8):
|
||||||
|
- M_TAIL(v7,112)
|
||||||
|
-
|
||||||
|
- .p2align 5
|
||||||
|
-L(tail9):
|
||||||
|
- M_TAIL(v8,128)
|
||||||
|
-
|
||||||
|
- .p2align 5
|
||||||
|
-L(tail10):
|
||||||
|
- M_TAIL(v9,144)
|
||||||
|
-
|
||||||
|
- .p2align 5
|
||||||
|
-L(tail11):
|
||||||
|
- M_TAIL(v10,160)
|
||||||
|
-
|
||||||
|
- .p2align 5
|
||||||
|
-L(tail12):
|
||||||
|
- M_TAIL(v0,176)
|
||||||
|
-
|
||||||
|
- .p2align 5
|
||||||
|
-L(tail13):
|
||||||
|
- M_TAIL(v1,192)
|
||||||
|
-
|
||||||
|
- .p2align 5
|
||||||
|
-L(tail14):
|
||||||
|
- M_TAIL(v2,208)
|
||||||
|
-
|
||||||
|
- .p2align 5
|
||||||
|
-L(tail15):
|
||||||
|
- M_TAIL(v3,224)
|
||||||
|
-
|
||||||
|
- .p2align 5
|
||||||
|
-L(found):
|
||||||
|
- vctzlsbb r7,v6
|
||||||
|
- cmpld r5,r7
|
||||||
|
- ble L(null)
|
||||||
|
- add r3,r3,r7
|
||||||
|
- blr
|
||||||
|
-
|
||||||
|
- .p2align 5
|
||||||
|
-L(null):
|
||||||
|
- li r3,0
|
||||||
|
- blr
|
||||||
|
-
|
||||||
|
-END (MEMCHR)
|
||||||
|
-
|
||||||
|
-weak_alias (__memchr, memchr)
|
||||||
|
-libc_hidden_builtin_def (memchr)
|
||||||
|
Index: glibc-2.40/sysdeps/powerpc/powerpc64/multiarch/Makefile
|
||||||
|
===================================================================
|
||||||
|
--- glibc-2.40.orig/sysdeps/powerpc/powerpc64/multiarch/Makefile
|
||||||
|
+++ glibc-2.40/sysdeps/powerpc/powerpc64/multiarch/Makefile
|
||||||
|
@@ -31,7 +31,7 @@ sysdep_routines += memcpy-power8-cached
|
||||||
|
strncase-power8
|
||||||
|
|
||||||
|
ifneq (,$(filter %le,$(config-machine)))
|
||||||
|
-sysdep_routines += memchr-power10 memcmp-power10 memcpy-power10 \
|
||||||
|
+sysdep_routines += memcmp-power10 memcpy-power10 \
|
||||||
|
memmove-power10 memset-power10 rawmemchr-power9 \
|
||||||
|
rawmemchr-power10 strcmp-power9 \
|
||||||
|
strncmp-power9 strcpy-power9 stpcpy-power9 \
|
||||||
|
Index: glibc-2.40/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c
|
||||||
|
===================================================================
|
||||||
|
--- glibc-2.40.orig/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c
|
||||||
|
+++ glibc-2.40/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c
|
||||||
|
@@ -226,12 +226,6 @@ __libc_ifunc_impl_list (const char *name
|
||||||
|
|
||||||
|
/* Support sysdeps/powerpc/powerpc64/multiarch/memchr.c. */
|
||||||
|
IFUNC_IMPL (i, name, memchr,
|
||||||
|
-#ifdef __LITTLE_ENDIAN__
|
||||||
|
- IFUNC_IMPL_ADD (array, i, memchr,
|
||||||
|
- hwcap2 & PPC_FEATURE2_ARCH_3_1
|
||||||
|
- && hwcap & PPC_FEATURE_HAS_VSX,
|
||||||
|
- __memchr_power10)
|
||||||
|
-#endif
|
||||||
|
IFUNC_IMPL_ADD (array, i, memchr,
|
||||||
|
hwcap2 & PPC_FEATURE2_ARCH_2_07
|
||||||
|
&& hwcap & PPC_FEATURE_HAS_ALTIVEC,
|
||||||
|
Index: glibc-2.40/sysdeps/powerpc/powerpc64/multiarch/memchr-power10.S
|
||||||
|
===================================================================
|
||||||
|
--- glibc-2.40.orig/sysdeps/powerpc/powerpc64/multiarch/memchr-power10.S
|
||||||
|
+++ /dev/null
|
||||||
|
@@ -1,28 +0,0 @@
|
||||||
|
-/* Optimized memchr implementation for POWER10/PPC64.
|
||||||
|
- Copyright (C) 2016-2024 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/>. */
|
||||||
|
-
|
||||||
|
-#if defined __LITTLE_ENDIAN__ && IS_IN (libc)
|
||||||
|
-#define MEMCHR __memchr_power10
|
||||||
|
-
|
||||||
|
-#undef libc_hidden_builtin_def
|
||||||
|
-#define libc_hidden_builtin_def(name)
|
||||||
|
-#undef weak_alias
|
||||||
|
-#define weak_alias(name,alias)
|
||||||
|
-
|
||||||
|
-#include <sysdeps/powerpc/powerpc64/le/power10/memchr.S>
|
||||||
|
-#endif
|
||||||
|
Index: glibc-2.40/sysdeps/powerpc/powerpc64/multiarch/memchr.c
|
||||||
|
===================================================================
|
||||||
|
--- glibc-2.40.orig/sysdeps/powerpc/powerpc64/multiarch/memchr.c
|
||||||
|
+++ glibc-2.40/sysdeps/powerpc/powerpc64/multiarch/memchr.c
|
||||||
|
@@ -25,23 +25,15 @@ extern __typeof (__memchr) __memchr_ppc
|
||||||
|
extern __typeof (__memchr) __memchr_power7 attribute_hidden;
|
||||||
|
extern __typeof (__memchr) __memchr_power8 attribute_hidden;
|
||||||
|
|
||||||
|
-# ifdef __LITTLE_ENDIAN__
|
||||||
|
-extern __typeof (__memchr) __memchr_power10 attribute_hidden;
|
||||||
|
-# endif
|
||||||
|
/* Avoid DWARF definition DIE on ifunc symbol so that GDB can handle
|
||||||
|
ifunc symbol properly. */
|
||||||
|
libc_ifunc (__memchr,
|
||||||
|
-# ifdef __LITTLE_ENDIAN__
|
||||||
|
- (hwcap2 & PPC_FEATURE2_ARCH_3_1
|
||||||
|
- && hwcap & PPC_FEATURE_HAS_VSX)
|
||||||
|
- ? __memchr_power10 :
|
||||||
|
-# endif
|
||||||
|
- (hwcap2 & PPC_FEATURE2_ARCH_2_07
|
||||||
|
- && hwcap & PPC_FEATURE_HAS_ALTIVEC)
|
||||||
|
- ? __memchr_power8 :
|
||||||
|
- (hwcap & PPC_FEATURE_ARCH_2_06)
|
||||||
|
- ? __memchr_power7
|
||||||
|
- : __memchr_ppc);
|
||||||
|
+ (hwcap2 & PPC_FEATURE2_ARCH_2_07
|
||||||
|
+ && hwcap & PPC_FEATURE_HAS_ALTIVEC)
|
||||||
|
+ ? __memchr_power8 :
|
||||||
|
+ (hwcap & PPC_FEATURE_ARCH_2_06)
|
||||||
|
+ ? __memchr_power7
|
||||||
|
+ : __memchr_ppc);
|
||||||
|
|
||||||
|
weak_alias (__memchr, memchr)
|
||||||
|
libc_hidden_builtin_def (memchr)
|
658
ppc64le-revert-power10-strcmp.patch
Normal file
658
ppc64le-revert-power10-strcmp.patch
Normal file
@@ -0,0 +1,658 @@
|
|||||||
|
Index: glibc-2.40/sysdeps/powerpc/powerpc64/le/power10/strcmp.S
|
||||||
|
===================================================================
|
||||||
|
--- glibc-2.40.orig/sysdeps/powerpc/powerpc64/le/power10/strcmp.S
|
||||||
|
+++ /dev/null
|
||||||
|
@@ -1,233 +0,0 @@
|
||||||
|
-/* Optimized strcmp implementation for PowerPC64/POWER10.
|
||||||
|
- Copyright (C) 2021-2024 Free Software Foundation, Inc.
|
||||||
|
- This file is part of the GNU C Library.
|
||||||
|
-
|
||||||
|
- The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
- modify it under the terms of the GNU Lesser General Public
|
||||||
|
- License as published by the Free Software Foundation; either
|
||||||
|
- version 2.1 of the License, or (at your option) any later version.
|
||||||
|
-
|
||||||
|
- The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
- Lesser General Public License for more details.
|
||||||
|
-
|
||||||
|
- You should have received a copy of the GNU Lesser General Public
|
||||||
|
- License along with the GNU C Library; if not, see
|
||||||
|
- <https://www.gnu.org/licenses/>. */
|
||||||
|
-#include <sysdep.h>
|
||||||
|
-
|
||||||
|
-#ifndef STRCMP
|
||||||
|
-# define STRCMP strcmp
|
||||||
|
-#endif
|
||||||
|
-
|
||||||
|
-/* Implements the function
|
||||||
|
- int [r3] strcmp (const char *s1 [r3], const char *s2 [r4]). */
|
||||||
|
-
|
||||||
|
-/* TODO: Change this to actual instructions when minimum binutils is upgraded
|
||||||
|
- to 2.27. Macros are defined below for these newer instructions in order
|
||||||
|
- to maintain compatibility. */
|
||||||
|
-
|
||||||
|
-#define LXVP(xtp,dq,ra) \
|
||||||
|
- .long(((6)<<(32-6)) \
|
||||||
|
- | ((((xtp)-32)>>1)<<(32-10)) \
|
||||||
|
- | ((1)<<(32-11)) \
|
||||||
|
- | ((ra)<<(32-16)) \
|
||||||
|
- | dq)
|
||||||
|
-
|
||||||
|
-#define COMPARE_16(vreg1,vreg2,offset) \
|
||||||
|
- lxv vreg1+32,offset(r3); \
|
||||||
|
- lxv vreg2+32,offset(r4); \
|
||||||
|
- vcmpnezb. v7,vreg1,vreg2; \
|
||||||
|
- bne cr6,L(different); \
|
||||||
|
-
|
||||||
|
-#define COMPARE_32(vreg1,vreg2,offset,label1,label2) \
|
||||||
|
- LXVP(vreg1+32,offset,r3); \
|
||||||
|
- LXVP(vreg2+32,offset,r4); \
|
||||||
|
- vcmpnezb. v7,vreg1+1,vreg2+1; \
|
||||||
|
- bne cr6,L(label1); \
|
||||||
|
- vcmpnezb. v7,vreg1,vreg2; \
|
||||||
|
- bne cr6,L(label2); \
|
||||||
|
-
|
||||||
|
-#define TAIL(vreg1,vreg2) \
|
||||||
|
- vctzlsbb r6,v7; \
|
||||||
|
- vextubrx r5,r6,vreg1; \
|
||||||
|
- vextubrx r4,r6,vreg2; \
|
||||||
|
- subf r3,r4,r5; \
|
||||||
|
- blr; \
|
||||||
|
-
|
||||||
|
-#define CHECK_N_BYTES(reg1,reg2,len_reg) \
|
||||||
|
- sldi r0,len_reg,56; \
|
||||||
|
- lxvl 32+v4,reg1,r0; \
|
||||||
|
- lxvl 32+v5,reg2,r0; \
|
||||||
|
- add reg1,reg1,len_reg; \
|
||||||
|
- add reg2,reg2,len_reg; \
|
||||||
|
- vcmpnezb v7,v4,v5; \
|
||||||
|
- vctzlsbb r6,v7; \
|
||||||
|
- cmpld cr7,r6,len_reg; \
|
||||||
|
- blt cr7,L(different); \
|
||||||
|
-
|
||||||
|
- /* TODO: change this to .machine power10 when the minimum required
|
||||||
|
- binutils allows it. */
|
||||||
|
-
|
||||||
|
- .machine power9
|
||||||
|
-ENTRY_TOCLESS (STRCMP, 4)
|
||||||
|
- andi. r7,r3,4095
|
||||||
|
- andi. r8,r4,4095
|
||||||
|
- cmpldi cr0,r7,4096-16
|
||||||
|
- cmpldi cr1,r8,4096-16
|
||||||
|
- bgt cr0,L(crosses)
|
||||||
|
- bgt cr1,L(crosses)
|
||||||
|
- COMPARE_16(v4,v5,0)
|
||||||
|
-
|
||||||
|
-L(crosses):
|
||||||
|
- andi. r7,r3,15
|
||||||
|
- subfic r7,r7,16 /* r7(nalign1) = 16 - (str1 & 15). */
|
||||||
|
- andi. r9,r4,15
|
||||||
|
- subfic r5,r9,16 /* r5(nalign2) = 16 - (str2 & 15). */
|
||||||
|
- cmpld cr7,r7,r5
|
||||||
|
- beq cr7,L(same_aligned)
|
||||||
|
- blt cr7,L(nalign1_min)
|
||||||
|
-
|
||||||
|
- /* nalign2 is minimum and s2 pointer is aligned. */
|
||||||
|
- CHECK_N_BYTES(r3,r4,r5)
|
||||||
|
- /* Are we on the 64B hunk which crosses a page? */
|
||||||
|
- andi. r10,r3,63 /* Determine offset into 64B hunk. */
|
||||||
|
- andi. r8,r3,15 /* The offset into the 16B hunk. */
|
||||||
|
- neg r7,r3
|
||||||
|
- andi. r9,r7,15 /* Number of bytes after a 16B cross. */
|
||||||
|
- rlwinm. r7,r7,26,0x3F /* ((r3-4096))>>6&63. */
|
||||||
|
- beq L(compare_64_pagecross)
|
||||||
|
- mtctr r7
|
||||||
|
- b L(compare_64B_unaligned)
|
||||||
|
-
|
||||||
|
- /* nalign1 is minimum and s1 pointer is aligned. */
|
||||||
|
-L(nalign1_min):
|
||||||
|
- CHECK_N_BYTES(r3,r4,r7)
|
||||||
|
- /* Are we on the 64B hunk which crosses a page? */
|
||||||
|
- andi. r10,r4,63 /* Determine offset into 64B hunk. */
|
||||||
|
- andi. r8,r4,15 /* The offset into the 16B hunk. */
|
||||||
|
- neg r7,r4
|
||||||
|
- andi. r9,r7,15 /* Number of bytes after a 16B cross. */
|
||||||
|
- rlwinm. r7,r7,26,0x3F /* ((r4-4096))>>6&63. */
|
||||||
|
- beq L(compare_64_pagecross)
|
||||||
|
- mtctr r7
|
||||||
|
-
|
||||||
|
- .p2align 5
|
||||||
|
-L(compare_64B_unaligned):
|
||||||
|
- COMPARE_16(v4,v5,0)
|
||||||
|
- COMPARE_16(v4,v5,16)
|
||||||
|
- COMPARE_16(v4,v5,32)
|
||||||
|
- COMPARE_16(v4,v5,48)
|
||||||
|
- addi r3,r3,64
|
||||||
|
- addi r4,r4,64
|
||||||
|
- bdnz L(compare_64B_unaligned)
|
||||||
|
-
|
||||||
|
- /* Cross the page boundary of s2, carefully. Only for first
|
||||||
|
- iteration we have to get the count of 64B blocks to be checked.
|
||||||
|
- From second iteration and beyond, loop counter is always 63. */
|
||||||
|
-L(compare_64_pagecross):
|
||||||
|
- li r11, 63
|
||||||
|
- mtctr r11
|
||||||
|
- cmpldi r10,16
|
||||||
|
- ble L(cross_4)
|
||||||
|
- cmpldi r10,32
|
||||||
|
- ble L(cross_3)
|
||||||
|
- cmpldi r10,48
|
||||||
|
- ble L(cross_2)
|
||||||
|
-L(cross_1):
|
||||||
|
- CHECK_N_BYTES(r3,r4,r9)
|
||||||
|
- CHECK_N_BYTES(r3,r4,r8)
|
||||||
|
- COMPARE_16(v4,v5,0)
|
||||||
|
- COMPARE_16(v4,v5,16)
|
||||||
|
- COMPARE_16(v4,v5,32)
|
||||||
|
- addi r3,r3,48
|
||||||
|
- addi r4,r4,48
|
||||||
|
- b L(compare_64B_unaligned)
|
||||||
|
-L(cross_2):
|
||||||
|
- COMPARE_16(v4,v5,0)
|
||||||
|
- addi r3,r3,16
|
||||||
|
- addi r4,r4,16
|
||||||
|
- CHECK_N_BYTES(r3,r4,r9)
|
||||||
|
- CHECK_N_BYTES(r3,r4,r8)
|
||||||
|
- COMPARE_16(v4,v5,0)
|
||||||
|
- COMPARE_16(v4,v5,16)
|
||||||
|
- addi r3,r3,32
|
||||||
|
- addi r4,r4,32
|
||||||
|
- b L(compare_64B_unaligned)
|
||||||
|
-L(cross_3):
|
||||||
|
- COMPARE_16(v4,v5,0)
|
||||||
|
- COMPARE_16(v4,v5,16)
|
||||||
|
- addi r3,r3,32
|
||||||
|
- addi r4,r4,32
|
||||||
|
- CHECK_N_BYTES(r3,r4,r9)
|
||||||
|
- CHECK_N_BYTES(r3,r4,r8)
|
||||||
|
- COMPARE_16(v4,v5,0)
|
||||||
|
- addi r3,r3,16
|
||||||
|
- addi r4,r4,16
|
||||||
|
- b L(compare_64B_unaligned)
|
||||||
|
-L(cross_4):
|
||||||
|
- COMPARE_16(v4,v5,0)
|
||||||
|
- COMPARE_16(v4,v5,16)
|
||||||
|
- COMPARE_16(v4,v5,32)
|
||||||
|
- addi r3,r3,48
|
||||||
|
- addi r4,r4,48
|
||||||
|
- CHECK_N_BYTES(r3,r4,r9)
|
||||||
|
- CHECK_N_BYTES(r3,r4,r8)
|
||||||
|
- b L(compare_64B_unaligned)
|
||||||
|
-
|
||||||
|
-L(same_aligned):
|
||||||
|
- CHECK_N_BYTES(r3,r4,r7)
|
||||||
|
- /* Align s1 to 32B and adjust s2 address.
|
||||||
|
- Use lxvp only if both s1 and s2 are 32B aligned. */
|
||||||
|
- COMPARE_16(v4,v5,0)
|
||||||
|
- COMPARE_16(v4,v5,16)
|
||||||
|
- COMPARE_16(v4,v5,32)
|
||||||
|
- COMPARE_16(v4,v5,48)
|
||||||
|
- addi r3,r3,64
|
||||||
|
- addi r4,r4,64
|
||||||
|
- COMPARE_16(v4,v5,0)
|
||||||
|
- COMPARE_16(v4,v5,16)
|
||||||
|
-
|
||||||
|
- clrldi r6,r3,59
|
||||||
|
- subfic r5,r6,32
|
||||||
|
- add r3,r3,r5
|
||||||
|
- add r4,r4,r5
|
||||||
|
- andi. r5,r4,0x1F
|
||||||
|
- beq cr0,L(32B_aligned_loop)
|
||||||
|
-
|
||||||
|
- .p2align 5
|
||||||
|
-L(16B_aligned_loop):
|
||||||
|
- COMPARE_16(v4,v5,0)
|
||||||
|
- COMPARE_16(v4,v5,16)
|
||||||
|
- COMPARE_16(v4,v5,32)
|
||||||
|
- COMPARE_16(v4,v5,48)
|
||||||
|
- addi r3,r3,64
|
||||||
|
- addi r4,r4,64
|
||||||
|
- b L(16B_aligned_loop)
|
||||||
|
-
|
||||||
|
- /* Calculate and return the difference. */
|
||||||
|
-L(different):
|
||||||
|
- TAIL(v4,v5)
|
||||||
|
-
|
||||||
|
- .p2align 5
|
||||||
|
-L(32B_aligned_loop):
|
||||||
|
- COMPARE_32(v14,v16,0,tail1,tail2)
|
||||||
|
- COMPARE_32(v18,v20,32,tail3,tail4)
|
||||||
|
- COMPARE_32(v22,v24,64,tail5,tail6)
|
||||||
|
- COMPARE_32(v26,v28,96,tail7,tail8)
|
||||||
|
- addi r3,r3,128
|
||||||
|
- addi r4,r4,128
|
||||||
|
- b L(32B_aligned_loop)
|
||||||
|
-
|
||||||
|
-L(tail1): TAIL(v15,v17)
|
||||||
|
-L(tail2): TAIL(v14,v16)
|
||||||
|
-L(tail3): TAIL(v19,v21)
|
||||||
|
-L(tail4): TAIL(v18,v20)
|
||||||
|
-L(tail5): TAIL(v23,v25)
|
||||||
|
-L(tail6): TAIL(v22,v24)
|
||||||
|
-L(tail7): TAIL(v27,v29)
|
||||||
|
-L(tail8): TAIL(v26,v28)
|
||||||
|
-
|
||||||
|
-END (STRCMP)
|
||||||
|
-libc_hidden_builtin_def (strcmp)
|
||||||
|
Index: glibc-2.40/sysdeps/powerpc/powerpc64/le/power10/strncmp.S
|
||||||
|
===================================================================
|
||||||
|
--- glibc-2.40.orig/sysdeps/powerpc/powerpc64/le/power10/strncmp.S
|
||||||
|
+++ /dev/null
|
||||||
|
@@ -1,271 +0,0 @@
|
||||||
|
-/* Optimized strncmp implementation for PowerPC64/POWER10.
|
||||||
|
- Copyright (C) 2024 Free Software Foundation, Inc.
|
||||||
|
- This file is part of the GNU C Library.
|
||||||
|
-
|
||||||
|
- The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
- modify it under the terms of the GNU Lesser General Public
|
||||||
|
- License as published by the Free Software Foundation; either
|
||||||
|
- version 2.1 of the License, or (at your option) any later version.
|
||||||
|
-
|
||||||
|
- The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
- Lesser General Public License for more details.
|
||||||
|
-
|
||||||
|
- You should have received a copy of the GNU Lesser General Public
|
||||||
|
- License along with the GNU C Library; if not, see
|
||||||
|
- <https://www.gnu.org/licenses/>. */
|
||||||
|
-
|
||||||
|
-#include <sysdep.h>
|
||||||
|
-
|
||||||
|
-/* Implements the function
|
||||||
|
-
|
||||||
|
- int [r3] strncmp (const char *s1 [r3], const char *s2 [r4], size_t [r5] n)
|
||||||
|
-
|
||||||
|
- The implementation uses unaligned doubleword access to avoid specialized
|
||||||
|
- code paths depending of data alignment for first 32 bytes and uses
|
||||||
|
- vectorised loops after that. */
|
||||||
|
-
|
||||||
|
-#ifndef STRNCMP
|
||||||
|
-# define STRNCMP strncmp
|
||||||
|
-#endif
|
||||||
|
-
|
||||||
|
-/* TODO: Change this to actual instructions when minimum binutils is upgraded
|
||||||
|
- to 2.27. Macros are defined below for these newer instructions in order
|
||||||
|
- to maintain compatibility. */
|
||||||
|
-
|
||||||
|
-#define LXVP(xtp,dq,ra) \
|
||||||
|
- .long(((6)<<(32-6)) \
|
||||||
|
- | ((((xtp)-32)>>1)<<(32-10)) \
|
||||||
|
- | ((1)<<(32-11)) \
|
||||||
|
- | ((ra)<<(32-16)) \
|
||||||
|
- | dq)
|
||||||
|
-
|
||||||
|
-#define COMPARE_16(vreg1,vreg2,offset) \
|
||||||
|
- lxv vreg1+32,offset(r3); \
|
||||||
|
- lxv vreg2+32,offset(r4); \
|
||||||
|
- vcmpnezb. v7,vreg1,vreg2; \
|
||||||
|
- bne cr6,L(different); \
|
||||||
|
- cmpldi cr7,r5,16; \
|
||||||
|
- ble cr7,L(ret0); \
|
||||||
|
- addi r5,r5,-16;
|
||||||
|
-
|
||||||
|
-#define COMPARE_32(vreg1,vreg2,offset,label1,label2) \
|
||||||
|
- LXVP(vreg1+32,offset,r3); \
|
||||||
|
- LXVP(vreg2+32,offset,r4); \
|
||||||
|
- vcmpnezb. v7,vreg1+1,vreg2+1; \
|
||||||
|
- bne cr6,L(label1); \
|
||||||
|
- vcmpnezb. v7,vreg1,vreg2; \
|
||||||
|
- bne cr6,L(label2); \
|
||||||
|
- cmpldi cr7,r5,32; \
|
||||||
|
- ble cr7,L(ret0); \
|
||||||
|
- addi r5,r5,-32;
|
||||||
|
-
|
||||||
|
-#define TAIL_FIRST_16B(vreg1,vreg2) \
|
||||||
|
- vctzlsbb r6,v7; \
|
||||||
|
- cmpld cr7,r5,r6; \
|
||||||
|
- ble cr7,L(ret0); \
|
||||||
|
- vextubrx r5,r6,vreg1; \
|
||||||
|
- vextubrx r4,r6,vreg2; \
|
||||||
|
- subf r3,r4,r5; \
|
||||||
|
- blr;
|
||||||
|
-
|
||||||
|
-#define TAIL_SECOND_16B(vreg1,vreg2) \
|
||||||
|
- vctzlsbb r6,v7; \
|
||||||
|
- addi r0,r6,16; \
|
||||||
|
- cmpld cr7,r5,r0; \
|
||||||
|
- ble cr7,L(ret0); \
|
||||||
|
- vextubrx r5,r6,vreg1; \
|
||||||
|
- vextubrx r4,r6,vreg2; \
|
||||||
|
- subf r3,r4,r5; \
|
||||||
|
- blr;
|
||||||
|
-
|
||||||
|
-#define CHECK_N_BYTES(reg1,reg2,len_reg) \
|
||||||
|
- sldi r6,len_reg,56; \
|
||||||
|
- lxvl 32+v4,reg1,r6; \
|
||||||
|
- lxvl 32+v5,reg2,r6; \
|
||||||
|
- add reg1,reg1,len_reg; \
|
||||||
|
- add reg2,reg2,len_reg; \
|
||||||
|
- vcmpnezb v7,v4,v5; \
|
||||||
|
- vctzlsbb r6,v7; \
|
||||||
|
- cmpld cr7,r6,len_reg; \
|
||||||
|
- blt cr7,L(different); \
|
||||||
|
- cmpld cr7,r5,len_reg; \
|
||||||
|
- ble cr7,L(ret0); \
|
||||||
|
- sub r5,r5,len_reg; \
|
||||||
|
-
|
||||||
|
- /* TODO: change this to .machine power10 when the minimum required
|
||||||
|
- binutils allows it. */
|
||||||
|
- .machine power9
|
||||||
|
-ENTRY_TOCLESS (STRNCMP, 4)
|
||||||
|
- /* Check if size is 0. */
|
||||||
|
- cmpdi cr0,r5,0
|
||||||
|
- beq cr0,L(ret0)
|
||||||
|
- andi. r7,r3,4095
|
||||||
|
- andi. r8,r4,4095
|
||||||
|
- cmpldi cr0,r7,4096-16
|
||||||
|
- cmpldi cr1,r8,4096-16
|
||||||
|
- bgt cr0,L(crosses)
|
||||||
|
- bgt cr1,L(crosses)
|
||||||
|
- COMPARE_16(v4,v5,0)
|
||||||
|
- addi r3,r3,16
|
||||||
|
- addi r4,r4,16
|
||||||
|
-
|
||||||
|
-L(crosses):
|
||||||
|
- andi. r7,r3,15
|
||||||
|
- subfic r7,r7,16 /* r7(nalign1) = 16 - (str1 & 15). */
|
||||||
|
- andi. r9,r4,15
|
||||||
|
- subfic r8,r9,16 /* r8(nalign2) = 16 - (str2 & 15). */
|
||||||
|
- cmpld cr7,r7,r8
|
||||||
|
- beq cr7,L(same_aligned)
|
||||||
|
- blt cr7,L(nalign1_min)
|
||||||
|
-
|
||||||
|
- /* nalign2 is minimum and s2 pointer is aligned. */
|
||||||
|
- CHECK_N_BYTES(r3,r4,r8)
|
||||||
|
- /* Are we on the 64B hunk which crosses a page? */
|
||||||
|
- andi. r10,r3,63 /* Determine offset into 64B hunk. */
|
||||||
|
- andi. r8,r3,15 /* The offset into the 16B hunk. */
|
||||||
|
- neg r7,r3
|
||||||
|
- andi. r9,r7,15 /* Number of bytes after a 16B cross. */
|
||||||
|
- rlwinm. r7,r7,26,0x3F /* ((r4-4096))>>6&63. */
|
||||||
|
- beq L(compare_64_pagecross)
|
||||||
|
- mtctr r7
|
||||||
|
- b L(compare_64B_unaligned)
|
||||||
|
-
|
||||||
|
- /* nalign1 is minimum and s1 pointer is aligned. */
|
||||||
|
-L(nalign1_min):
|
||||||
|
- CHECK_N_BYTES(r3,r4,r7)
|
||||||
|
- /* Are we on the 64B hunk which crosses a page? */
|
||||||
|
- andi. r10,r4,63 /* Determine offset into 64B hunk. */
|
||||||
|
- andi. r8,r4,15 /* The offset into the 16B hunk. */
|
||||||
|
- neg r7,r4
|
||||||
|
- andi. r9,r7,15 /* Number of bytes after a 16B cross. */
|
||||||
|
- rlwinm. r7,r7,26,0x3F /* ((r4-4096))>>6&63. */
|
||||||
|
- beq L(compare_64_pagecross)
|
||||||
|
- mtctr r7
|
||||||
|
-
|
||||||
|
- .p2align 5
|
||||||
|
-L(compare_64B_unaligned):
|
||||||
|
- COMPARE_16(v4,v5,0)
|
||||||
|
- COMPARE_16(v4,v5,16)
|
||||||
|
- COMPARE_16(v4,v5,32)
|
||||||
|
- COMPARE_16(v4,v5,48)
|
||||||
|
- addi r3,r3,64
|
||||||
|
- addi r4,r4,64
|
||||||
|
- bdnz L(compare_64B_unaligned)
|
||||||
|
-
|
||||||
|
- /* Cross the page boundary of s2, carefully. Only for first
|
||||||
|
- iteration we have to get the count of 64B blocks to be checked.
|
||||||
|
- From second iteration and beyond, loop counter is always 63. */
|
||||||
|
-L(compare_64_pagecross):
|
||||||
|
- li r11, 63
|
||||||
|
- mtctr r11
|
||||||
|
- cmpldi r10,16
|
||||||
|
- ble L(cross_4)
|
||||||
|
- cmpldi r10,32
|
||||||
|
- ble L(cross_3)
|
||||||
|
- cmpldi r10,48
|
||||||
|
- ble L(cross_2)
|
||||||
|
-L(cross_1):
|
||||||
|
- CHECK_N_BYTES(r3,r4,r9)
|
||||||
|
- CHECK_N_BYTES(r3,r4,r8)
|
||||||
|
- COMPARE_16(v4,v5,0)
|
||||||
|
- COMPARE_16(v4,v5,16)
|
||||||
|
- COMPARE_16(v4,v5,32)
|
||||||
|
- addi r3,r3,48
|
||||||
|
- addi r4,r4,48
|
||||||
|
- b L(compare_64B_unaligned)
|
||||||
|
-L(cross_2):
|
||||||
|
- COMPARE_16(v4,v5,0)
|
||||||
|
- addi r3,r3,16
|
||||||
|
- addi r4,r4,16
|
||||||
|
- CHECK_N_BYTES(r3,r4,r9)
|
||||||
|
- CHECK_N_BYTES(r3,r4,r8)
|
||||||
|
- COMPARE_16(v4,v5,0)
|
||||||
|
- COMPARE_16(v4,v5,16)
|
||||||
|
- addi r3,r3,32
|
||||||
|
- addi r4,r4,32
|
||||||
|
- b L(compare_64B_unaligned)
|
||||||
|
-L(cross_3):
|
||||||
|
- COMPARE_16(v4,v5,0)
|
||||||
|
- COMPARE_16(v4,v5,16)
|
||||||
|
- addi r3,r3,32
|
||||||
|
- addi r4,r4,32
|
||||||
|
- CHECK_N_BYTES(r3,r4,r9)
|
||||||
|
- CHECK_N_BYTES(r3,r4,r8)
|
||||||
|
- COMPARE_16(v4,v5,0)
|
||||||
|
- addi r3,r3,16
|
||||||
|
- addi r4,r4,16
|
||||||
|
- b L(compare_64B_unaligned)
|
||||||
|
-L(cross_4):
|
||||||
|
- COMPARE_16(v4,v5,0)
|
||||||
|
- COMPARE_16(v4,v5,16)
|
||||||
|
- COMPARE_16(v4,v5,32)
|
||||||
|
- addi r3,r3,48
|
||||||
|
- addi r4,r4,48
|
||||||
|
- CHECK_N_BYTES(r3,r4,r9)
|
||||||
|
- CHECK_N_BYTES(r3,r4,r8)
|
||||||
|
- b L(compare_64B_unaligned)
|
||||||
|
-
|
||||||
|
-L(same_aligned):
|
||||||
|
- CHECK_N_BYTES(r3,r4,r7)
|
||||||
|
- /* Align s1 to 32B and adjust s2 address.
|
||||||
|
- Use lxvp only if both s1 and s2 are 32B aligned. */
|
||||||
|
- COMPARE_16(v4,v5,0)
|
||||||
|
- COMPARE_16(v4,v5,16)
|
||||||
|
- COMPARE_16(v4,v5,32)
|
||||||
|
- COMPARE_16(v4,v5,48)
|
||||||
|
- addi r3,r3,64
|
||||||
|
- addi r4,r4,64
|
||||||
|
- COMPARE_16(v4,v5,0)
|
||||||
|
- COMPARE_16(v4,v5,16)
|
||||||
|
- addi r5,r5,32
|
||||||
|
-
|
||||||
|
- clrldi r6,r3,59
|
||||||
|
- subfic r7,r6,32
|
||||||
|
- add r3,r3,r7
|
||||||
|
- add r4,r4,r7
|
||||||
|
- subf r5,r7,r5
|
||||||
|
- andi. r7,r4,0x1F
|
||||||
|
- beq cr0,L(32B_aligned_loop)
|
||||||
|
-
|
||||||
|
- .p2align 5
|
||||||
|
-L(16B_aligned_loop):
|
||||||
|
- COMPARE_16(v4,v5,0)
|
||||||
|
- COMPARE_16(v4,v5,16)
|
||||||
|
- COMPARE_16(v4,v5,32)
|
||||||
|
- COMPARE_16(v4,v5,48)
|
||||||
|
- addi r3,r3,64
|
||||||
|
- addi r4,r4,64
|
||||||
|
- b L(16B_aligned_loop)
|
||||||
|
-
|
||||||
|
- /* Calculate and return the difference. */
|
||||||
|
-L(different):
|
||||||
|
- TAIL_FIRST_16B(v4,v5)
|
||||||
|
-
|
||||||
|
- .p2align 5
|
||||||
|
-L(32B_aligned_loop):
|
||||||
|
- COMPARE_32(v14,v16,0,tail1,tail2)
|
||||||
|
- COMPARE_32(v18,v20,32,tail3,tail4)
|
||||||
|
- COMPARE_32(v22,v24,64,tail5,tail6)
|
||||||
|
- COMPARE_32(v26,v28,96,tail7,tail8)
|
||||||
|
- addi r3,r3,128
|
||||||
|
- addi r4,r4,128
|
||||||
|
- b L(32B_aligned_loop)
|
||||||
|
-
|
||||||
|
-L(tail1): TAIL_FIRST_16B(v15,v17)
|
||||||
|
-L(tail2): TAIL_SECOND_16B(v14,v16)
|
||||||
|
-L(tail3): TAIL_FIRST_16B(v19,v21)
|
||||||
|
-L(tail4): TAIL_SECOND_16B(v18,v20)
|
||||||
|
-L(tail5): TAIL_FIRST_16B(v23,v25)
|
||||||
|
-L(tail6): TAIL_SECOND_16B(v22,v24)
|
||||||
|
-L(tail7): TAIL_FIRST_16B(v27,v29)
|
||||||
|
-L(tail8): TAIL_SECOND_16B(v26,v28)
|
||||||
|
-
|
||||||
|
- .p2align 5
|
||||||
|
-L(ret0):
|
||||||
|
- li r3,0
|
||||||
|
- blr
|
||||||
|
-
|
||||||
|
-END(STRNCMP)
|
||||||
|
-libc_hidden_builtin_def(strncmp)
|
||||||
|
Index: glibc-2.40/sysdeps/powerpc/powerpc64/multiarch/Makefile
|
||||||
|
===================================================================
|
||||||
|
--- glibc-2.40.orig/sysdeps/powerpc/powerpc64/multiarch/Makefile
|
||||||
|
+++ glibc-2.40/sysdeps/powerpc/powerpc64/multiarch/Makefile
|
||||||
|
@@ -33,8 +33,8 @@ sysdep_routines += memcpy-power8-cached
|
||||||
|
ifneq (,$(filter %le,$(config-machine)))
|
||||||
|
sysdep_routines += memchr-power10 memcmp-power10 memcpy-power10 \
|
||||||
|
memmove-power10 memset-power10 rawmemchr-power9 \
|
||||||
|
- rawmemchr-power10 strcmp-power9 strcmp-power10 \
|
||||||
|
- strncmp-power9 strncmp-power10 strcpy-power9 stpcpy-power9 \
|
||||||
|
+ rawmemchr-power10 strcmp-power9 \
|
||||||
|
+ strncmp-power9 strcpy-power9 stpcpy-power9 \
|
||||||
|
strlen-power9 strncpy-power9 stpncpy-power9 strlen-power10
|
||||||
|
endif
|
||||||
|
CFLAGS-strncase-power7.c += -mcpu=power7 -funroll-loops
|
||||||
|
Index: glibc-2.40/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c
|
||||||
|
===================================================================
|
||||||
|
--- glibc-2.40.orig/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c
|
||||||
|
+++ glibc-2.40/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c
|
||||||
|
@@ -164,9 +164,6 @@ __libc_ifunc_impl_list (const char *name
|
||||||
|
/* Support sysdeps/powerpc/powerpc64/multiarch/strncmp.c. */
|
||||||
|
IFUNC_IMPL (i, name, strncmp,
|
||||||
|
#ifdef __LITTLE_ENDIAN__
|
||||||
|
- IFUNC_IMPL_ADD (array, i, strncmp, hwcap2 & PPC_FEATURE2_ARCH_3_1
|
||||||
|
- && hwcap & PPC_FEATURE_HAS_VSX,
|
||||||
|
- __strncmp_power10)
|
||||||
|
IFUNC_IMPL_ADD (array, i, strncmp, hwcap2 & PPC_FEATURE2_ARCH_3_00
|
||||||
|
&& hwcap & PPC_FEATURE_HAS_ALTIVEC,
|
||||||
|
__strncmp_power9)
|
||||||
|
@@ -387,10 +384,6 @@ __libc_ifunc_impl_list (const char *name
|
||||||
|
IFUNC_IMPL (i, name, strcmp,
|
||||||
|
#ifdef __LITTLE_ENDIAN__
|
||||||
|
IFUNC_IMPL_ADD (array, i, strcmp,
|
||||||
|
- (hwcap2 & PPC_FEATURE2_ARCH_3_1)
|
||||||
|
- && (hwcap & PPC_FEATURE_HAS_VSX),
|
||||||
|
- __strcmp_power10)
|
||||||
|
- IFUNC_IMPL_ADD (array, i, strcmp,
|
||||||
|
hwcap2 & PPC_FEATURE2_ARCH_3_00
|
||||||
|
&& hwcap & PPC_FEATURE_HAS_ALTIVEC,
|
||||||
|
__strcmp_power9)
|
||||||
|
Index: glibc-2.40/sysdeps/powerpc/powerpc64/multiarch/strcmp-power10.S
|
||||||
|
===================================================================
|
||||||
|
--- glibc-2.40.orig/sysdeps/powerpc/powerpc64/multiarch/strcmp-power10.S
|
||||||
|
+++ /dev/null
|
||||||
|
@@ -1,26 +0,0 @@
|
||||||
|
-/* Optimized strcmp implementation for POWER10/PPC64.
|
||||||
|
- Copyright (C) 2021-2024 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/>. */
|
||||||
|
-
|
||||||
|
-#if defined __LITTLE_ENDIAN__ && IS_IN (libc)
|
||||||
|
-#define STRCMP __strcmp_power10
|
||||||
|
-
|
||||||
|
-#undef libc_hidden_builtin_def
|
||||||
|
-#define libc_hidden_builtin_def(name)
|
||||||
|
-
|
||||||
|
-#include <sysdeps/powerpc/powerpc64/le/power10/strcmp.S>
|
||||||
|
-#endif /* __LITTLE_ENDIAN__ && IS_IN (libc) */
|
||||||
|
Index: glibc-2.40/sysdeps/powerpc/powerpc64/multiarch/strcmp.c
|
||||||
|
===================================================================
|
||||||
|
--- glibc-2.40.orig/sysdeps/powerpc/powerpc64/multiarch/strcmp.c
|
||||||
|
+++ glibc-2.40/sysdeps/powerpc/powerpc64/multiarch/strcmp.c
|
||||||
|
@@ -29,16 +29,12 @@ extern __typeof (strcmp) __strcmp_power7
|
||||||
|
extern __typeof (strcmp) __strcmp_power8 attribute_hidden;
|
||||||
|
# ifdef __LITTLE_ENDIAN__
|
||||||
|
extern __typeof (strcmp) __strcmp_power9 attribute_hidden;
|
||||||
|
-extern __typeof (strcmp) __strcmp_power10 attribute_hidden;
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# undef strcmp
|
||||||
|
|
||||||
|
libc_ifunc_redirected (__redirect_strcmp, strcmp,
|
||||||
|
# ifdef __LITTLE_ENDIAN__
|
||||||
|
- (hwcap2 & PPC_FEATURE2_ARCH_3_1
|
||||||
|
- && hwcap & PPC_FEATURE_HAS_VSX)
|
||||||
|
- ? __strcmp_power10 :
|
||||||
|
(hwcap2 & PPC_FEATURE2_ARCH_3_00
|
||||||
|
&& hwcap & PPC_FEATURE_HAS_ALTIVEC)
|
||||||
|
? __strcmp_power9 :
|
||||||
|
Index: glibc-2.40/sysdeps/powerpc/powerpc64/multiarch/strncmp-power10.S
|
||||||
|
===================================================================
|
||||||
|
--- glibc-2.40.orig/sysdeps/powerpc/powerpc64/multiarch/strncmp-power10.S
|
||||||
|
+++ /dev/null
|
||||||
|
@@ -1,25 +0,0 @@
|
||||||
|
-/* Copyright (C) 2024 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/>. */
|
||||||
|
-
|
||||||
|
-#if defined __LITTLE_ENDIAN__ && IS_IN (libc)
|
||||||
|
-#define STRNCMP __strncmp_power10
|
||||||
|
-
|
||||||
|
-#undef libc_hidden_builtin_def
|
||||||
|
-#define libc_hidden_builtin_def(name)
|
||||||
|
-
|
||||||
|
-#include <sysdeps/powerpc/powerpc64/le/power10/strncmp.S>
|
||||||
|
-#endif
|
||||||
|
Index: glibc-2.40/sysdeps/powerpc/powerpc64/multiarch/strncmp.c
|
||||||
|
===================================================================
|
||||||
|
--- glibc-2.40.orig/sysdeps/powerpc/powerpc64/multiarch/strncmp.c
|
||||||
|
+++ glibc-2.40/sysdeps/powerpc/powerpc64/multiarch/strncmp.c
|
||||||
|
@@ -29,7 +29,6 @@ extern __typeof (strncmp) __strncmp_ppc
|
||||||
|
extern __typeof (strncmp) __strncmp_power8 attribute_hidden;
|
||||||
|
# ifdef __LITTLE_ENDIAN__
|
||||||
|
extern __typeof (strncmp) __strncmp_power9 attribute_hidden;
|
||||||
|
-extern __typeof (strncmp) __strncmp_power10 attribute_hidden;
|
||||||
|
# endif
|
||||||
|
# undef strncmp
|
||||||
|
|
||||||
|
@@ -37,9 +36,6 @@ extern __typeof (strncmp) __strncmp_powe
|
||||||
|
ifunc symbol properly. */
|
||||||
|
libc_ifunc_redirected (__redirect_strncmp, strncmp,
|
||||||
|
# ifdef __LITTLE_ENDIAN__
|
||||||
|
- (hwcap2 & PPC_FEATURE2_ARCH_3_1
|
||||||
|
- && hwcap & PPC_FEATURE_HAS_VSX)
|
||||||
|
- ? __strncmp_power10 :
|
||||||
|
(hwcap2 & PPC_FEATURE2_ARCH_3_00
|
||||||
|
&& hwcap & PPC_FEATURE_HAS_ALTIVEC)
|
||||||
|
? __strncmp_power9 :
|
650
pthread-wakeup.patch
Normal file
650
pthread-wakeup.patch
Normal file
@@ -0,0 +1,650 @@
|
|||||||
|
diff --git c/nptl/pthread_cond_broadcast.c w/nptl/pthread_cond_broadcast.c
|
||||||
|
index 7409958394..f5793e715f 100644
|
||||||
|
--- c/nptl/pthread_cond_broadcast.c
|
||||||
|
+++ w/nptl/pthread_cond_broadcast.c
|
||||||
|
@@ -57,10 +57,10 @@ ___pthread_cond_broadcast (pthread_cond_t *cond)
|
||||||
|
{
|
||||||
|
/* Add as many signals as the remaining size of the group. */
|
||||||
|
atomic_fetch_add_relaxed (cond->__data.__g_signals + g1,
|
||||||
|
- cond->__data.__g_size[g1] << 1);
|
||||||
|
+ cond->__data.__g_size[g1]);
|
||||||
|
cond->__data.__g_size[g1] = 0;
|
||||||
|
|
||||||
|
- /* We need to wake G1 waiters before we quiesce G1 below. */
|
||||||
|
+ /* We need to wake G1 waiters before we switch G1 below. */
|
||||||
|
/* TODO Only set it if there are indeed futex waiters. We could
|
||||||
|
also try to move this out of the critical section in cases when
|
||||||
|
G2 is empty (and we don't need to quiesce). */
|
||||||
|
@@ -69,11 +69,11 @@ ___pthread_cond_broadcast (pthread_cond_t *cond)
|
||||||
|
|
||||||
|
/* G1 is complete. Step (2) is next unless there are no waiters in G2, in
|
||||||
|
which case we can stop. */
|
||||||
|
- if (__condvar_quiesce_and_switch_g1 (cond, wseq, &g1, private))
|
||||||
|
+ if (__condvar_switch_g1 (cond, wseq, &g1, private))
|
||||||
|
{
|
||||||
|
/* Step (3): Send signals to all waiters in the old G2 / new G1. */
|
||||||
|
atomic_fetch_add_relaxed (cond->__data.__g_signals + g1,
|
||||||
|
- cond->__data.__g_size[g1] << 1);
|
||||||
|
+ cond->__data.__g_size[g1]);
|
||||||
|
cond->__data.__g_size[g1] = 0;
|
||||||
|
/* TODO Only set it if there are indeed futex waiters. */
|
||||||
|
do_futex_wake = true;
|
||||||
|
diff --git c/nptl/pthread_cond_common.c w/nptl/pthread_cond_common.c
|
||||||
|
index 7440bb18e6..99640968f1 100644
|
||||||
|
--- c/nptl/pthread_cond_common.c
|
||||||
|
+++ w/nptl/pthread_cond_common.c
|
||||||
|
@@ -189,19 +189,17 @@ __condvar_get_private (int flags)
|
||||||
|
return FUTEX_SHARED;
|
||||||
|
}
|
||||||
|
|
||||||
|
-/* This closes G1 (whose index is in G1INDEX), waits for all futex waiters to
|
||||||
|
- leave G1, converts G1 into a fresh G2, and then switches group roles so that
|
||||||
|
- the former G2 becomes the new G1 ending at the current __wseq value when we
|
||||||
|
- eventually make the switch (WSEQ is just an observation of __wseq by the
|
||||||
|
- signaler).
|
||||||
|
+/* This closes G1 (whose index is in G1INDEX), converts G1 into a fresh G2,
|
||||||
|
+ and then switches group roles so that the former G2 becomes the new G1
|
||||||
|
+ ending at the current __wseq value when we eventually make the switch
|
||||||
|
+ (WSEQ is just an observation of __wseq by the signaler).
|
||||||
|
If G2 is empty, it will not switch groups because then it would create an
|
||||||
|
empty G1 which would require switching groups again on the next signal.
|
||||||
|
Returns false iff groups were not switched because G2 was empty. */
|
||||||
|
static bool __attribute__ ((unused))
|
||||||
|
-__condvar_quiesce_and_switch_g1 (pthread_cond_t *cond, uint64_t wseq,
|
||||||
|
+__condvar_switch_g1 (pthread_cond_t *cond, uint64_t wseq,
|
||||||
|
unsigned int *g1index, int private)
|
||||||
|
{
|
||||||
|
- const unsigned int maxspin = 0;
|
||||||
|
unsigned int g1 = *g1index;
|
||||||
|
|
||||||
|
/* If there is no waiter in G2, we don't do anything. The expression may
|
||||||
|
@@ -210,96 +208,23 @@ __condvar_quiesce_and_switch_g1 (pthread_cond_t *cond, uint64_t wseq,
|
||||||
|
behavior.
|
||||||
|
Note that this works correctly for a zero-initialized condvar too. */
|
||||||
|
unsigned int old_orig_size = __condvar_get_orig_size (cond);
|
||||||
|
- uint64_t old_g1_start = __condvar_load_g1_start_relaxed (cond) >> 1;
|
||||||
|
- if (((unsigned) (wseq - old_g1_start - old_orig_size)
|
||||||
|
- + cond->__data.__g_size[g1 ^ 1]) == 0)
|
||||||
|
+ uint64_t old_g1_start = __condvar_load_g1_start_relaxed (cond);
|
||||||
|
+ uint64_t new_g1_start = old_g1_start + old_orig_size;
|
||||||
|
+ if (((unsigned) (wseq - new_g1_start) + cond->__data.__g_size[g1 ^ 1]) == 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
- /* Now try to close and quiesce G1. We have to consider the following kinds
|
||||||
|
- of waiters:
|
||||||
|
+ /* We have to consider the following kinds of waiters:
|
||||||
|
* Waiters from less recent groups than G1 are not affected because
|
||||||
|
nothing will change for them apart from __g1_start getting larger.
|
||||||
|
* New waiters arriving concurrently with the group switching will all go
|
||||||
|
into G2 until we atomically make the switch. Waiters existing in G2
|
||||||
|
are not affected.
|
||||||
|
- * Waiters in G1 will be closed out immediately by setting a flag in
|
||||||
|
- __g_signals, which will prevent waiters from blocking using a futex on
|
||||||
|
- __g_signals and also notifies them that the group is closed. As a
|
||||||
|
- result, they will eventually remove their group reference, allowing us
|
||||||
|
- to close switch group roles. */
|
||||||
|
+ * Waiters in G1 have already received a signal and been woken. */
|
||||||
|
|
||||||
|
- /* First, set the closed flag on __g_signals. This tells waiters that are
|
||||||
|
- about to wait that they shouldn't do that anymore. This basically
|
||||||
|
- serves as an advance notification of the upcoming change to __g1_start;
|
||||||
|
- waiters interpret it as if __g1_start was larger than their waiter
|
||||||
|
- sequence position. This allows us to change __g1_start after waiting
|
||||||
|
- for all existing waiters with group references to leave, which in turn
|
||||||
|
- makes recovery after stealing a signal simpler because it then can be
|
||||||
|
- skipped if __g1_start indicates that the group is closed (otherwise,
|
||||||
|
- we would have to recover always because waiters don't know how big their
|
||||||
|
- groups are). Relaxed MO is fine. */
|
||||||
|
- atomic_fetch_or_relaxed (cond->__data.__g_signals + g1, 1);
|
||||||
|
-
|
||||||
|
- /* Wait until there are no group references anymore. The fetch-or operation
|
||||||
|
- injects us into the modification order of __g_refs; release MO ensures
|
||||||
|
- that waiters incrementing __g_refs after our fetch-or see the previous
|
||||||
|
- changes to __g_signals and to __g1_start that had to happen before we can
|
||||||
|
- switch this G1 and alias with an older group (we have two groups, so
|
||||||
|
- aliasing requires switching group roles twice). Note that nobody else
|
||||||
|
- can have set the wake-request flag, so we do not have to act upon it.
|
||||||
|
-
|
||||||
|
- Also note that it is harmless if older waiters or waiters from this G1
|
||||||
|
- get a group reference after we have quiesced the group because it will
|
||||||
|
- remain closed for them either because of the closed flag in __g_signals
|
||||||
|
- or the later update to __g1_start. New waiters will never arrive here
|
||||||
|
- but instead continue to go into the still current G2. */
|
||||||
|
- unsigned r = atomic_fetch_or_release (cond->__data.__g_refs + g1, 0);
|
||||||
|
- while ((r >> 1) > 0)
|
||||||
|
- {
|
||||||
|
- for (unsigned int spin = maxspin; ((r >> 1) > 0) && (spin > 0); spin--)
|
||||||
|
- {
|
||||||
|
- /* TODO Back off. */
|
||||||
|
- r = atomic_load_relaxed (cond->__data.__g_refs + g1);
|
||||||
|
- }
|
||||||
|
- if ((r >> 1) > 0)
|
||||||
|
- {
|
||||||
|
- /* There is still a waiter after spinning. Set the wake-request
|
||||||
|
- flag and block. Relaxed MO is fine because this is just about
|
||||||
|
- this futex word.
|
||||||
|
-
|
||||||
|
- Update r to include the set wake-request flag so that the upcoming
|
||||||
|
- futex_wait only blocks if the flag is still set (otherwise, we'd
|
||||||
|
- violate the basic client-side futex protocol). */
|
||||||
|
- r = atomic_fetch_or_relaxed (cond->__data.__g_refs + g1, 1) | 1;
|
||||||
|
-
|
||||||
|
- if ((r >> 1) > 0)
|
||||||
|
- futex_wait_simple (cond->__data.__g_refs + g1, r, private);
|
||||||
|
- /* Reload here so we eventually see the most recent value even if we
|
||||||
|
- do not spin. */
|
||||||
|
- r = atomic_load_relaxed (cond->__data.__g_refs + g1);
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
- /* Acquire MO so that we synchronize with the release operation that waiters
|
||||||
|
- use to decrement __g_refs and thus happen after the waiters we waited
|
||||||
|
- for. */
|
||||||
|
- atomic_thread_fence_acquire ();
|
||||||
|
-
|
||||||
|
- /* Update __g1_start, which finishes closing this group. The value we add
|
||||||
|
- will never be negative because old_orig_size can only be zero when we
|
||||||
|
- switch groups the first time after a condvar was initialized, in which
|
||||||
|
- case G1 will be at index 1 and we will add a value of 1. See above for
|
||||||
|
- why this takes place after waiting for quiescence of the group.
|
||||||
|
- Relaxed MO is fine because the change comes with no additional
|
||||||
|
- constraints that others would have to observe. */
|
||||||
|
- __condvar_add_g1_start_relaxed (cond,
|
||||||
|
- (old_orig_size << 1) + (g1 == 1 ? 1 : - 1));
|
||||||
|
-
|
||||||
|
- /* Now reopen the group, thus enabling waiters to again block using the
|
||||||
|
- futex controlled by __g_signals. Release MO so that observers that see
|
||||||
|
- no signals (and thus can block) also see the write __g1_start and thus
|
||||||
|
- that this is now a new group (see __pthread_cond_wait_common for the
|
||||||
|
- matching acquire MO loads). */
|
||||||
|
- atomic_store_release (cond->__data.__g_signals + g1, 0);
|
||||||
|
+ /* Update __g1_start, which closes this group. Relaxed MO is fine because
|
||||||
|
+ the change comes with no additional constraints that others would have
|
||||||
|
+ to observe. */
|
||||||
|
+ __condvar_add_g1_start_relaxed (cond, old_orig_size);
|
||||||
|
|
||||||
|
/* At this point, the old G1 is now a valid new G2 (but not in use yet).
|
||||||
|
No old waiter can neither grab a signal nor acquire a reference without
|
||||||
|
@@ -311,9 +236,13 @@ __condvar_quiesce_and_switch_g1 (pthread_cond_t *cond, uint64_t wseq,
|
||||||
|
g1 ^= 1;
|
||||||
|
*g1index ^= 1;
|
||||||
|
|
||||||
|
+ /* Now advance the new G1 g_signals to the new g1_start, giving it
|
||||||
|
+ an effective signal count of 0 to start. */
|
||||||
|
+ atomic_store_release (cond->__data.__g_signals + g1, (unsigned)new_g1_start);
|
||||||
|
+
|
||||||
|
/* These values are just observed by signalers, and thus protected by the
|
||||||
|
lock. */
|
||||||
|
- unsigned int orig_size = wseq - (old_g1_start + old_orig_size);
|
||||||
|
+ unsigned int orig_size = wseq - new_g1_start;
|
||||||
|
__condvar_set_orig_size (cond, orig_size);
|
||||||
|
/* Use and addition to not loose track of cancellations in what was
|
||||||
|
previously G2. */
|
||||||
|
diff --git c/nptl/pthread_cond_signal.c w/nptl/pthread_cond_signal.c
|
||||||
|
index 9ac4bd9f75..bdc1e82466 100644
|
||||||
|
--- c/nptl/pthread_cond_signal.c
|
||||||
|
+++ w/nptl/pthread_cond_signal.c
|
||||||
|
@@ -69,19 +69,18 @@ ___pthread_cond_signal (pthread_cond_t *cond)
|
||||||
|
bool do_futex_wake = false;
|
||||||
|
|
||||||
|
/* If G1 is still receiving signals, we put the signal there. If not, we
|
||||||
|
- check if G2 has waiters, and if so, quiesce and switch G1 to the former
|
||||||
|
- G2; if this results in a new G1 with waiters (G2 might have cancellations
|
||||||
|
- already, see __condvar_quiesce_and_switch_g1), we put the signal in the
|
||||||
|
- new G1. */
|
||||||
|
+ check if G2 has waiters, and if so, switch G1 to the former G2; if this
|
||||||
|
+ results in a new G1 with waiters (G2 might have cancellations already,
|
||||||
|
+ see __condvar_switch_g1), we put the signal in the new G1. */
|
||||||
|
if ((cond->__data.__g_size[g1] != 0)
|
||||||
|
- || __condvar_quiesce_and_switch_g1 (cond, wseq, &g1, private))
|
||||||
|
+ || __condvar_switch_g1 (cond, wseq, &g1, private))
|
||||||
|
{
|
||||||
|
/* Add a signal. Relaxed MO is fine because signaling does not need to
|
||||||
|
- establish a happens-before relation (see above). We do not mask the
|
||||||
|
- release-MO store when initializing a group in
|
||||||
|
- __condvar_quiesce_and_switch_g1 because we use an atomic
|
||||||
|
- read-modify-write and thus extend that store's release sequence. */
|
||||||
|
- atomic_fetch_add_relaxed (cond->__data.__g_signals + g1, 2);
|
||||||
|
+ establish a happens-before relation (see above). We do not mask the
|
||||||
|
+ release-MO store when initializing a group in __condvar_switch_g1
|
||||||
|
+ because we use an atomic read-modify-write and thus extend that
|
||||||
|
+ store's release sequence. */
|
||||||
|
+ atomic_fetch_add_relaxed (cond->__data.__g_signals + g1, 1);
|
||||||
|
cond->__data.__g_size[g1]--;
|
||||||
|
/* TODO Only set it if there are indeed futex waiters. */
|
||||||
|
do_futex_wake = true;
|
||||||
|
diff --git c/nptl/pthread_cond_wait.c w/nptl/pthread_cond_wait.c
|
||||||
|
index 806c432d13..d919b3622a 100644
|
||||||
|
--- c/nptl/pthread_cond_wait.c
|
||||||
|
+++ w/nptl/pthread_cond_wait.c
|
||||||
|
@@ -84,7 +84,7 @@ __condvar_cancel_waiting (pthread_cond_t *cond, uint64_t seq, unsigned int g,
|
||||||
|
not hold a reference on the group. */
|
||||||
|
__condvar_acquire_lock (cond, private);
|
||||||
|
|
||||||
|
- uint64_t g1_start = __condvar_load_g1_start_relaxed (cond) >> 1;
|
||||||
|
+ uint64_t g1_start = __condvar_load_g1_start_relaxed (cond);
|
||||||
|
if (g1_start > seq)
|
||||||
|
{
|
||||||
|
/* Our group is closed, so someone provided enough signals for it.
|
||||||
|
@@ -143,23 +143,6 @@ __condvar_cancel_waiting (pthread_cond_t *cond, uint64_t seq, unsigned int g,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
-/* Wake up any signalers that might be waiting. */
|
||||||
|
-static void
|
||||||
|
-__condvar_dec_grefs (pthread_cond_t *cond, unsigned int g, int private)
|
||||||
|
-{
|
||||||
|
- /* Release MO to synchronize-with the acquire load in
|
||||||
|
- __condvar_quiesce_and_switch_g1. */
|
||||||
|
- if (atomic_fetch_add_release (cond->__data.__g_refs + g, -2) == 3)
|
||||||
|
- {
|
||||||
|
- /* Clear the wake-up request flag before waking up. We do not need more
|
||||||
|
- than relaxed MO and it doesn't matter if we apply this for an aliased
|
||||||
|
- group because we wake all futex waiters right after clearing the
|
||||||
|
- flag. */
|
||||||
|
- atomic_fetch_and_relaxed (cond->__data.__g_refs + g, ~(unsigned int) 1);
|
||||||
|
- futex_wake (cond->__data.__g_refs + g, INT_MAX, private);
|
||||||
|
- }
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
/* Clean-up for cancellation of waiters waiting for normal signals. We cancel
|
||||||
|
our registration as a waiter, confirm we have woken up, and re-acquire the
|
||||||
|
mutex. */
|
||||||
|
@@ -171,8 +154,6 @@ __condvar_cleanup_waiting (void *arg)
|
||||||
|
pthread_cond_t *cond = cbuffer->cond;
|
||||||
|
unsigned g = cbuffer->wseq & 1;
|
||||||
|
|
||||||
|
- __condvar_dec_grefs (cond, g, cbuffer->private);
|
||||||
|
-
|
||||||
|
__condvar_cancel_waiting (cond, cbuffer->wseq >> 1, g, cbuffer->private);
|
||||||
|
/* FIXME With the current cancellation implementation, it is possible that
|
||||||
|
a thread is cancelled after it has returned from a syscall. This could
|
||||||
|
@@ -238,9 +219,7 @@ __condvar_cleanup_waiting (void *arg)
|
||||||
|
signaled), and a reference count.
|
||||||
|
|
||||||
|
The group reference count is used to maintain the number of waiters that
|
||||||
|
- are using the group's futex. Before a group can change its role, the
|
||||||
|
- reference count must show that no waiters are using the futex anymore; this
|
||||||
|
- prevents ABA issues on the futex word.
|
||||||
|
+ are using the group's futex.
|
||||||
|
|
||||||
|
To represent which intervals in the waiter sequence the groups cover (and
|
||||||
|
thus also which group slot contains G1 or G2), we use a 64b counter to
|
||||||
|
@@ -251,7 +230,7 @@ __condvar_cleanup_waiting (void *arg)
|
||||||
|
figure out whether they are in a group that has already been completely
|
||||||
|
signaled (i.e., if the current G1 starts at a later position that the
|
||||||
|
waiter's position). Waiters cannot determine whether they are currently
|
||||||
|
- in G2 or G1 -- but they do not have too because all they are interested in
|
||||||
|
+ in G2 or G1 -- but they do not have to because all they are interested in
|
||||||
|
is whether there are available signals, and they always start in G2 (whose
|
||||||
|
group slot they know because of the bit in the waiter sequence. Signalers
|
||||||
|
will simply fill the right group until it is completely signaled and can
|
||||||
|
@@ -280,7 +259,6 @@ __condvar_cleanup_waiting (void *arg)
|
||||||
|
* Waiters fetch-add while having acquire the mutex associated with the
|
||||||
|
condvar. Signalers load it and fetch-xor it concurrently.
|
||||||
|
__g1_start: Starting position of G1 (inclusive)
|
||||||
|
- * LSB is index of current G2.
|
||||||
|
* Modified by signalers while having acquired the condvar-internal lock
|
||||||
|
and observed concurrently by waiters.
|
||||||
|
__g1_orig_size: Initial size of G1
|
||||||
|
@@ -300,11 +278,10 @@ __condvar_cleanup_waiting (void *arg)
|
||||||
|
last reference.
|
||||||
|
* Reference count used by waiters concurrently with signalers that have
|
||||||
|
acquired the condvar-internal lock.
|
||||||
|
- __g_signals: The number of signals that can still be consumed.
|
||||||
|
+ __g_signals: The number of signals that can still be consumed, relative to
|
||||||
|
+ the current g1_start. (i.e. g1_start with the signal count added)
|
||||||
|
* Used as a futex word by waiters. Used concurrently by waiters and
|
||||||
|
signalers.
|
||||||
|
- * LSB is true iff this group has been completely signaled (i.e., it is
|
||||||
|
- closed).
|
||||||
|
__g_size: Waiters remaining in this group (i.e., which have not been
|
||||||
|
signaled yet.
|
||||||
|
* Accessed by signalers and waiters that cancel waiting (both do so only
|
||||||
|
@@ -328,27 +305,6 @@ __condvar_cleanup_waiting (void *arg)
|
||||||
|
sufficient because if a waiter can see a sufficiently large value, it could
|
||||||
|
have also consume a signal in the waiters group.
|
||||||
|
|
||||||
|
- Waiters try to grab a signal from __g_signals without holding a reference
|
||||||
|
- count, which can lead to stealing a signal from a more recent group after
|
||||||
|
- their own group was already closed. They cannot always detect whether they
|
||||||
|
- in fact did because they do not know when they stole, but they can
|
||||||
|
- conservatively add a signal back to the group they stole from; if they
|
||||||
|
- did so unnecessarily, all that happens is a spurious wake-up. To make this
|
||||||
|
- even less likely, __g1_start contains the index of the current g2 too,
|
||||||
|
- which allows waiters to check if there aliasing on the group slots; if
|
||||||
|
- there wasn't, they didn't steal from the current G1, which means that the
|
||||||
|
- G1 they stole from must have been already closed and they do not need to
|
||||||
|
- fix anything.
|
||||||
|
-
|
||||||
|
- It is essential that the last field in pthread_cond_t is __g_signals[1]:
|
||||||
|
- The previous condvar used a pointer-sized field in pthread_cond_t, so a
|
||||||
|
- PTHREAD_COND_INITIALIZER from that condvar implementation might only
|
||||||
|
- initialize 4 bytes to zero instead of the 8 bytes we need (i.e., 44 bytes
|
||||||
|
- in total instead of the 48 we need). __g_signals[1] is not accessed before
|
||||||
|
- the first group switch (G2 starts at index 0), which will set its value to
|
||||||
|
- zero after a harmless fetch-or whose return value is ignored. This
|
||||||
|
- effectively completes initialization.
|
||||||
|
-
|
||||||
|
|
||||||
|
Limitations:
|
||||||
|
* This condvar isn't designed to allow for more than
|
||||||
|
@@ -379,7 +335,6 @@ static __always_inline int
|
||||||
|
__pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex,
|
||||||
|
clockid_t clockid, const struct __timespec64 *abstime)
|
||||||
|
{
|
||||||
|
- const int maxspin = 0;
|
||||||
|
int err;
|
||||||
|
int result = 0;
|
||||||
|
|
||||||
|
@@ -396,8 +351,7 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex,
|
||||||
|
because we do not need to establish any happens-before relation with
|
||||||
|
signalers (see __pthread_cond_signal); modification order alone
|
||||||
|
establishes a total order of waiters/signals. We do need acquire MO
|
||||||
|
- to synchronize with group reinitialization in
|
||||||
|
- __condvar_quiesce_and_switch_g1. */
|
||||||
|
+ to synchronize with group reinitialization in __condvar_switch_g1. */
|
||||||
|
uint64_t wseq = __condvar_fetch_add_wseq_acquire (cond, 2);
|
||||||
|
/* Find our group's index. We always go into what was G2 when we acquired
|
||||||
|
our position. */
|
||||||
|
@@ -424,178 +378,64 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex,
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
- /* Now wait until a signal is available in our group or it is closed.
|
||||||
|
- Acquire MO so that if we observe a value of zero written after group
|
||||||
|
- switching in __condvar_quiesce_and_switch_g1, we synchronize with that
|
||||||
|
- store and will see the prior update of __g1_start done while switching
|
||||||
|
- groups too. */
|
||||||
|
- unsigned int signals = atomic_load_acquire (cond->__data.__g_signals + g);
|
||||||
|
|
||||||
|
- do
|
||||||
|
+ while (1)
|
||||||
|
{
|
||||||
|
- while (1)
|
||||||
|
- {
|
||||||
|
- /* Spin-wait first.
|
||||||
|
- Note that spinning first without checking whether a timeout
|
||||||
|
- passed might lead to what looks like a spurious wake-up even
|
||||||
|
- though we should return ETIMEDOUT (e.g., if the caller provides
|
||||||
|
- an absolute timeout that is clearly in the past). However,
|
||||||
|
- (1) spurious wake-ups are allowed, (2) it seems unlikely that a
|
||||||
|
- user will (ab)use pthread_cond_wait as a check for whether a
|
||||||
|
- point in time is in the past, and (3) spinning first without
|
||||||
|
- having to compare against the current time seems to be the right
|
||||||
|
- choice from a performance perspective for most use cases. */
|
||||||
|
- unsigned int spin = maxspin;
|
||||||
|
- while (signals == 0 && spin > 0)
|
||||||
|
- {
|
||||||
|
- /* Check that we are not spinning on a group that's already
|
||||||
|
- closed. */
|
||||||
|
- if (seq < (__condvar_load_g1_start_relaxed (cond) >> 1))
|
||||||
|
- goto done;
|
||||||
|
-
|
||||||
|
- /* TODO Back off. */
|
||||||
|
-
|
||||||
|
- /* Reload signals. See above for MO. */
|
||||||
|
- signals = atomic_load_acquire (cond->__data.__g_signals + g);
|
||||||
|
- spin--;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- /* If our group will be closed as indicated by the flag on signals,
|
||||||
|
- don't bother grabbing a signal. */
|
||||||
|
- if (signals & 1)
|
||||||
|
- goto done;
|
||||||
|
-
|
||||||
|
- /* If there is an available signal, don't block. */
|
||||||
|
- if (signals != 0)
|
||||||
|
- break;
|
||||||
|
-
|
||||||
|
- /* No signals available after spinning, so prepare to block.
|
||||||
|
- We first acquire a group reference and use acquire MO for that so
|
||||||
|
- that we synchronize with the dummy read-modify-write in
|
||||||
|
- __condvar_quiesce_and_switch_g1 if we read from that. In turn,
|
||||||
|
- in this case this will make us see the closed flag on __g_signals
|
||||||
|
- that designates a concurrent attempt to reuse the group's slot.
|
||||||
|
- We use acquire MO for the __g_signals check to make the
|
||||||
|
- __g1_start check work (see spinning above).
|
||||||
|
- Note that the group reference acquisition will not mask the
|
||||||
|
- release MO when decrementing the reference count because we use
|
||||||
|
- an atomic read-modify-write operation and thus extend the release
|
||||||
|
- sequence. */
|
||||||
|
- atomic_fetch_add_acquire (cond->__data.__g_refs + g, 2);
|
||||||
|
- if (((atomic_load_acquire (cond->__data.__g_signals + g) & 1) != 0)
|
||||||
|
- || (seq < (__condvar_load_g1_start_relaxed (cond) >> 1)))
|
||||||
|
- {
|
||||||
|
- /* Our group is closed. Wake up any signalers that might be
|
||||||
|
- waiting. */
|
||||||
|
- __condvar_dec_grefs (cond, g, private);
|
||||||
|
- goto done;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- // Now block.
|
||||||
|
- struct _pthread_cleanup_buffer buffer;
|
||||||
|
- struct _condvar_cleanup_buffer cbuffer;
|
||||||
|
- cbuffer.wseq = wseq;
|
||||||
|
- cbuffer.cond = cond;
|
||||||
|
- cbuffer.mutex = mutex;
|
||||||
|
- cbuffer.private = private;
|
||||||
|
- __pthread_cleanup_push (&buffer, __condvar_cleanup_waiting, &cbuffer);
|
||||||
|
-
|
||||||
|
- err = __futex_abstimed_wait_cancelable64 (
|
||||||
|
- cond->__data.__g_signals + g, 0, clockid, abstime, private);
|
||||||
|
-
|
||||||
|
- __pthread_cleanup_pop (&buffer, 0);
|
||||||
|
-
|
||||||
|
- if (__glibc_unlikely (err == ETIMEDOUT || err == EOVERFLOW))
|
||||||
|
- {
|
||||||
|
- __condvar_dec_grefs (cond, g, private);
|
||||||
|
- /* If we timed out, we effectively cancel waiting. Note that
|
||||||
|
- we have decremented __g_refs before cancellation, so that a
|
||||||
|
- deadlock between waiting for quiescence of our group in
|
||||||
|
- __condvar_quiesce_and_switch_g1 and us trying to acquire
|
||||||
|
- the lock during cancellation is not possible. */
|
||||||
|
- __condvar_cancel_waiting (cond, seq, g, private);
|
||||||
|
- result = err;
|
||||||
|
- goto done;
|
||||||
|
- }
|
||||||
|
- else
|
||||||
|
- __condvar_dec_grefs (cond, g, private);
|
||||||
|
-
|
||||||
|
- /* Reload signals. See above for MO. */
|
||||||
|
- signals = atomic_load_acquire (cond->__data.__g_signals + g);
|
||||||
|
+ /* Now wait until a signal is available in our group or it is closed.
|
||||||
|
+ Acquire MO so that if we observe (signals == lowseq) after group
|
||||||
|
+ switching in __condvar_switch_g1, we synchronize with that store and
|
||||||
|
+ will see the prior update of __g1_start done while switching groups
|
||||||
|
+ too. */
|
||||||
|
+ unsigned int signals = atomic_load_acquire (cond->__data.__g_signals + g);
|
||||||
|
+ uint64_t g1_start = __condvar_load_g1_start_relaxed (cond);
|
||||||
|
+
|
||||||
|
+ if (seq < g1_start)
|
||||||
|
+ {
|
||||||
|
+ /* If the group is closed already,
|
||||||
|
+ then this waiter originally had enough extra signals to
|
||||||
|
+ consume, up until the time its group was closed. */
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /* If there is an available signal, don't block.
|
||||||
|
+ If __g1_start has advanced at all, then we must be in G1
|
||||||
|
+ by now, perhaps in the process of switching back to an older
|
||||||
|
+ G2, but in either case we're allowed to consume the available
|
||||||
|
+ signal and should not block anymore. */
|
||||||
|
+ if ((int)(signals - (unsigned int)g1_start) > 0)
|
||||||
|
+ {
|
||||||
|
+ /* Try to grab a signal. See above for MO. (if we do another loop
|
||||||
|
+ iteration we need to see the correct value of g1_start) */
|
||||||
|
+ if (atomic_compare_exchange_weak_acquire (
|
||||||
|
+ cond->__data.__g_signals + g,
|
||||||
|
+ &signals, signals - 1))
|
||||||
|
+ break;
|
||||||
|
+ else
|
||||||
|
+ continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ // Now block.
|
||||||
|
+ struct _pthread_cleanup_buffer buffer;
|
||||||
|
+ struct _condvar_cleanup_buffer cbuffer;
|
||||||
|
+ cbuffer.wseq = wseq;
|
||||||
|
+ cbuffer.cond = cond;
|
||||||
|
+ cbuffer.mutex = mutex;
|
||||||
|
+ cbuffer.private = private;
|
||||||
|
+ __pthread_cleanup_push (&buffer, __condvar_cleanup_waiting, &cbuffer);
|
||||||
|
+
|
||||||
|
+ err = __futex_abstimed_wait_cancelable64 (
|
||||||
|
+ cond->__data.__g_signals + g, signals, clockid, abstime, private);
|
||||||
|
+
|
||||||
|
+ __pthread_cleanup_pop (&buffer, 0);
|
||||||
|
+
|
||||||
|
+ if (__glibc_unlikely (err == ETIMEDOUT || err == EOVERFLOW))
|
||||||
|
+ {
|
||||||
|
+ /* If we timed out, we effectively cancel waiting. */
|
||||||
|
+ __condvar_cancel_waiting (cond, seq, g, private);
|
||||||
|
+ result = err;
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
- /* Try to grab a signal. Use acquire MO so that we see an up-to-date value
|
||||||
|
- of __g1_start below (see spinning above for a similar case). In
|
||||||
|
- particular, if we steal from a more recent group, we will also see a
|
||||||
|
- more recent __g1_start below. */
|
||||||
|
- while (!atomic_compare_exchange_weak_acquire (cond->__data.__g_signals + g,
|
||||||
|
- &signals, signals - 2));
|
||||||
|
-
|
||||||
|
- /* We consumed a signal but we could have consumed from a more recent group
|
||||||
|
- that aliased with ours due to being in the same group slot. If this
|
||||||
|
- might be the case our group must be closed as visible through
|
||||||
|
- __g1_start. */
|
||||||
|
- uint64_t g1_start = __condvar_load_g1_start_relaxed (cond);
|
||||||
|
- if (seq < (g1_start >> 1))
|
||||||
|
- {
|
||||||
|
- /* We potentially stole a signal from a more recent group but we do not
|
||||||
|
- know which group we really consumed from.
|
||||||
|
- We do not care about groups older than current G1 because they are
|
||||||
|
- closed; we could have stolen from these, but then we just add a
|
||||||
|
- spurious wake-up for the current groups.
|
||||||
|
- We will never steal a signal from current G2 that was really intended
|
||||||
|
- for G2 because G2 never receives signals (until it becomes G1). We
|
||||||
|
- could have stolen a signal from G2 that was conservatively added by a
|
||||||
|
- previous waiter that also thought it stole a signal -- but given that
|
||||||
|
- that signal was added unnecessarily, it's not a problem if we steal
|
||||||
|
- it.
|
||||||
|
- Thus, the remaining case is that we could have stolen from the current
|
||||||
|
- G1, where "current" means the __g1_start value we observed. However,
|
||||||
|
- if the current G1 does not have the same slot index as we do, we did
|
||||||
|
- not steal from it and do not need to undo that. This is the reason
|
||||||
|
- for putting a bit with G2's index into__g1_start as well. */
|
||||||
|
- if (((g1_start & 1) ^ 1) == g)
|
||||||
|
- {
|
||||||
|
- /* We have to conservatively undo our potential mistake of stealing
|
||||||
|
- a signal. We can stop trying to do that when the current G1
|
||||||
|
- changes because other spinning waiters will notice this too and
|
||||||
|
- __condvar_quiesce_and_switch_g1 has checked that there are no
|
||||||
|
- futex waiters anymore before switching G1.
|
||||||
|
- Relaxed MO is fine for the __g1_start load because we need to
|
||||||
|
- merely be able to observe this fact and not have to observe
|
||||||
|
- something else as well.
|
||||||
|
- ??? Would it help to spin for a little while to see whether the
|
||||||
|
- current G1 gets closed? This might be worthwhile if the group is
|
||||||
|
- small or close to being closed. */
|
||||||
|
- unsigned int s = atomic_load_relaxed (cond->__data.__g_signals + g);
|
||||||
|
- while (__condvar_load_g1_start_relaxed (cond) == g1_start)
|
||||||
|
- {
|
||||||
|
- /* Try to add a signal. We don't need to acquire the lock
|
||||||
|
- because at worst we can cause a spurious wake-up. If the
|
||||||
|
- group is in the process of being closed (LSB is true), this
|
||||||
|
- has an effect similar to us adding a signal. */
|
||||||
|
- if (((s & 1) != 0)
|
||||||
|
- || atomic_compare_exchange_weak_relaxed
|
||||||
|
- (cond->__data.__g_signals + g, &s, s + 2))
|
||||||
|
- {
|
||||||
|
- /* If we added a signal, we also need to add a wake-up on
|
||||||
|
- the futex. We also need to do that if we skipped adding
|
||||||
|
- a signal because the group is being closed because
|
||||||
|
- while __condvar_quiesce_and_switch_g1 could have closed
|
||||||
|
- the group, it might still be waiting for futex waiters to
|
||||||
|
- leave (and one of those waiters might be the one we stole
|
||||||
|
- the signal from, which cause it to block using the
|
||||||
|
- futex). */
|
||||||
|
- futex_wake (cond->__data.__g_signals + g, 1, private);
|
||||||
|
- break;
|
||||||
|
- }
|
||||||
|
- /* TODO Back off. */
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- done:
|
||||||
|
|
||||||
|
/* Confirm that we have been woken. We do that before acquiring the mutex
|
||||||
|
to allow for execution of pthread_cond_destroy while having acquired the
|
||||||
|
diff --git c/nptl/tst-cond22.c w/nptl/tst-cond22.c
|
||||||
|
index 1336e9c79d..bdcb45c536 100644
|
||||||
|
--- c/nptl/tst-cond22.c
|
||||||
|
+++ w/nptl/tst-cond22.c
|
||||||
|
@@ -106,13 +106,13 @@ do_test (void)
|
||||||
|
status = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
- printf ("cond = { 0x%x:%x, 0x%x:%x, %u/%u/%u, %u/%u/%u, %u, %u }\n",
|
||||||
|
+ printf ("cond = { 0x%x:%x, 0x%x:%x, %u/%u, %u/%u, %u, %u }\n",
|
||||||
|
c.__data.__wseq.__value32.__high,
|
||||||
|
c.__data.__wseq.__value32.__low,
|
||||||
|
c.__data.__g1_start.__value32.__high,
|
||||||
|
c.__data.__g1_start.__value32.__low,
|
||||||
|
- c.__data.__g_signals[0], c.__data.__g_refs[0], c.__data.__g_size[0],
|
||||||
|
- c.__data.__g_signals[1], c.__data.__g_refs[1], c.__data.__g_size[1],
|
||||||
|
+ c.__data.__g_signals[0], c.__data.__g_size[0],
|
||||||
|
+ c.__data.__g_signals[1], c.__data.__g_size[1],
|
||||||
|
c.__data.__g1_orig_size, c.__data.__wrefs);
|
||||||
|
|
||||||
|
if (pthread_create (&th, NULL, tf, (void *) 1l) != 0)
|
||||||
|
@@ -152,13 +152,13 @@ do_test (void)
|
||||||
|
status = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
- printf ("cond = { 0x%x:%x, 0x%x:%x, %u/%u/%u, %u/%u/%u, %u, %u }\n",
|
||||||
|
+ printf ("cond = { 0x%x:%x, 0x%x:%x, %u/%u, %u/%u, %u, %u }\n",
|
||||||
|
c.__data.__wseq.__value32.__high,
|
||||||
|
c.__data.__wseq.__value32.__low,
|
||||||
|
c.__data.__g1_start.__value32.__high,
|
||||||
|
c.__data.__g1_start.__value32.__low,
|
||||||
|
- c.__data.__g_signals[0], c.__data.__g_refs[0], c.__data.__g_size[0],
|
||||||
|
- c.__data.__g_signals[1], c.__data.__g_refs[1], c.__data.__g_size[1],
|
||||||
|
+ c.__data.__g_signals[0], c.__data.__g_size[0],
|
||||||
|
+ c.__data.__g_signals[1], c.__data.__g_size[1],
|
||||||
|
c.__data.__g1_orig_size, c.__data.__wrefs);
|
||||||
|
|
||||||
|
return status;
|
||||||
|
diff --git c/sysdeps/nptl/bits/thread-shared-types.h w/sysdeps/nptl/bits/thread-shared-types.h
|
||||||
|
index 2de6ff9caf..3fe5d4afc0 100644
|
||||||
|
--- c/sysdeps/nptl/bits/thread-shared-types.h
|
||||||
|
+++ w/sysdeps/nptl/bits/thread-shared-types.h
|
||||||
|
@@ -95,11 +95,12 @@ struct __pthread_cond_s
|
||||||
|
{
|
||||||
|
__atomic_wide_counter __wseq;
|
||||||
|
__atomic_wide_counter __g1_start;
|
||||||
|
- unsigned int __g_refs[2] __LOCK_ALIGNMENT;
|
||||||
|
- unsigned int __g_size[2];
|
||||||
|
+ unsigned int __g_size[2] __LOCK_ALIGNMENT;
|
||||||
|
unsigned int __g1_orig_size;
|
||||||
|
unsigned int __wrefs;
|
||||||
|
unsigned int __g_signals[2];
|
||||||
|
+ unsigned int __unused_initialized_1;
|
||||||
|
+ unsigned int __unused_initialized_2;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef unsigned int __tss_t;
|
||||||
|
diff --git c/sysdeps/nptl/pthread.h w/sysdeps/nptl/pthread.h
|
||||||
|
index 7f65483542..476cd0ed54 100644
|
||||||
|
--- c/sysdeps/nptl/pthread.h
|
||||||
|
+++ w/sysdeps/nptl/pthread.h
|
||||||
|
@@ -152,7 +152,7 @@ enum
|
||||||
|
|
||||||
|
|
||||||
|
/* Conditional variable handling. */
|
||||||
|
-#define PTHREAD_COND_INITIALIZER { { {0}, {0}, {0, 0}, {0, 0}, 0, 0, {0, 0} } }
|
||||||
|
+#define PTHREAD_COND_INITIALIZER { { {0}, {0}, {0, 0}, 0, 0, {0, 0}, 0, 0 } }
|
||||||
|
|
||||||
|
|
||||||
|
/* Cleanup buffers */
|
240
regcomp-double-free.patch
Normal file
240
regcomp-double-free.patch
Normal file
@@ -0,0 +1,240 @@
|
|||||||
|
From 2eb180377b96771b8368b0915669c8c7b267e739 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Florian Weimer <fweimer@redhat.com>
|
||||||
|
Date: Mon, 21 Jul 2025 21:43:49 +0200
|
||||||
|
Subject: [PATCH] posix: Fix double-free after allocation failure in regcomp
|
||||||
|
(bug 33185)
|
||||||
|
|
||||||
|
If a memory allocation failure occurs during bracket expression
|
||||||
|
parsing in regcomp, a double-free error may result.
|
||||||
|
|
||||||
|
Reported-by: Anastasia Belova <abelova@astralinux.ru>
|
||||||
|
Co-authored-by: Paul Eggert <eggert@cs.ucla.edu>
|
||||||
|
Reviewed-by: Andreas K. Huettel <dilfridge@gentoo.org>
|
||||||
|
(cherry picked from commit 7ea06e994093fa0bcca0d0ee2c1db271d8d7885d)
|
||||||
|
---
|
||||||
|
NEWS | 1 +
|
||||||
|
posix/Makefile | 1 +
|
||||||
|
posix/regcomp.c | 4 +-
|
||||||
|
posix/tst-regcomp-bracket-free.c | 176 +++++++++++++++++++++++++++++++
|
||||||
|
4 files changed, 181 insertions(+), 1 deletion(-)
|
||||||
|
create mode 100644 posix/tst-regcomp-bracket-free.c
|
||||||
|
|
||||||
|
diff --git a/posix/Makefile b/posix/Makefile
|
||||||
|
index 2c598cd20a..830278a423 100644
|
||||||
|
--- a/posix/Makefile
|
||||||
|
+++ b/posix/Makefile
|
||||||
|
@@ -303,6 +303,7 @@ tests := \
|
||||||
|
tst-posix_spawn-setsid \
|
||||||
|
tst-preadwrite \
|
||||||
|
tst-preadwrite64 \
|
||||||
|
+ tst-regcomp-bracket-free \
|
||||||
|
tst-regcomp-truncated \
|
||||||
|
tst-regex \
|
||||||
|
tst-regex2 \
|
||||||
|
diff --git a/posix/regcomp.c b/posix/regcomp.c
|
||||||
|
index 5380d3c7b9..6595bb3c0d 100644
|
||||||
|
--- a/posix/regcomp.c
|
||||||
|
+++ b/posix/regcomp.c
|
||||||
|
@@ -3384,6 +3384,7 @@ parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token,
|
||||||
|
{
|
||||||
|
#ifdef RE_ENABLE_I18N
|
||||||
|
free_charset (mbcset);
|
||||||
|
+ mbcset = NULL;
|
||||||
|
#endif
|
||||||
|
/* Build a tree for simple bracket. */
|
||||||
|
br_token.type = SIMPLE_BRACKET;
|
||||||
|
@@ -3399,7 +3400,8 @@ parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token,
|
||||||
|
parse_bracket_exp_free_return:
|
||||||
|
re_free (sbcset);
|
||||||
|
#ifdef RE_ENABLE_I18N
|
||||||
|
- free_charset (mbcset);
|
||||||
|
+ if (__glibc_likely (mbcset != NULL))
|
||||||
|
+ free_charset (mbcset);
|
||||||
|
#endif /* RE_ENABLE_I18N */
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
diff --git a/posix/tst-regcomp-bracket-free.c b/posix/tst-regcomp-bracket-free.c
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000000..3c091d8c44
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/posix/tst-regcomp-bracket-free.c
|
||||||
|
@@ -0,0 +1,176 @@
|
||||||
|
+/* Test regcomp bracket parsing with injected allocation failures (bug 33185).
|
||||||
|
+ Copyright (C) 2025 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 test invokes regcomp multiple times, failing one memory
|
||||||
|
+ allocation in each call. The function call should fail with
|
||||||
|
+ REG_ESPACE (or succeed if it can recover from the allocation
|
||||||
|
+ failure). Previously, there was double-free bug. */
|
||||||
|
+
|
||||||
|
+#include <errno.h>
|
||||||
|
+#include <regex.h>
|
||||||
|
+#include <stdio.h>
|
||||||
|
+#include <string.h>
|
||||||
|
+#include <support/check.h>
|
||||||
|
+#include <support/namespace.h>
|
||||||
|
+#include <support/support.h>
|
||||||
|
+
|
||||||
|
+/* Data structure allocated via MAP_SHARED, so that writes from the
|
||||||
|
+ subprocess are visible. */
|
||||||
|
+struct shared_data
|
||||||
|
+{
|
||||||
|
+ /* Number of tracked allocations performed so far. */
|
||||||
|
+ volatile unsigned int allocation_count;
|
||||||
|
+
|
||||||
|
+ /* If this number is reached, one allocation fails. */
|
||||||
|
+ volatile unsigned int failing_allocation;
|
||||||
|
+
|
||||||
|
+ /* The subprocess stores the expected name here. */
|
||||||
|
+ char name[100];
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+/* Allocation count in shared mapping. */
|
||||||
|
+static struct shared_data *shared;
|
||||||
|
+
|
||||||
|
+/* Returns true if a failure should be injected for this allocation. */
|
||||||
|
+static bool
|
||||||
|
+fail_this_allocation (void)
|
||||||
|
+{
|
||||||
|
+ if (shared != NULL)
|
||||||
|
+ {
|
||||||
|
+ unsigned int count = shared->allocation_count;
|
||||||
|
+ shared->allocation_count = count + 1;
|
||||||
|
+ return count == shared->failing_allocation;
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ return false;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/* Failure-injecting wrappers for allocation functions used by glibc. */
|
||||||
|
+
|
||||||
|
+void *
|
||||||
|
+malloc (size_t size)
|
||||||
|
+{
|
||||||
|
+ if (fail_this_allocation ())
|
||||||
|
+ {
|
||||||
|
+ errno = ENOMEM;
|
||||||
|
+ return NULL;
|
||||||
|
+ }
|
||||||
|
+ extern __typeof (malloc) __libc_malloc;
|
||||||
|
+ return __libc_malloc (size);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+void *
|
||||||
|
+calloc (size_t a, size_t b)
|
||||||
|
+{
|
||||||
|
+ if (fail_this_allocation ())
|
||||||
|
+ {
|
||||||
|
+ errno = ENOMEM;
|
||||||
|
+ return NULL;
|
||||||
|
+ }
|
||||||
|
+ extern __typeof (calloc) __libc_calloc;
|
||||||
|
+ return __libc_calloc (a, b);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+void *
|
||||||
|
+realloc (void *ptr, size_t size)
|
||||||
|
+{
|
||||||
|
+ if (fail_this_allocation ())
|
||||||
|
+ {
|
||||||
|
+ errno = ENOMEM;
|
||||||
|
+ return NULL;
|
||||||
|
+ }
|
||||||
|
+ extern __typeof (realloc) __libc_realloc;
|
||||||
|
+ return __libc_realloc (ptr, size);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/* No-op subprocess to verify that support_isolate_in_subprocess does
|
||||||
|
+ not perform any heap allocations. */
|
||||||
|
+static void
|
||||||
|
+no_op (void *ignored)
|
||||||
|
+{
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/* Perform a regcomp call in a subprocess. Used to count its
|
||||||
|
+ allocations. */
|
||||||
|
+static void
|
||||||
|
+initialize (void *regexp1)
|
||||||
|
+{
|
||||||
|
+ const char *regexp = regexp1;
|
||||||
|
+
|
||||||
|
+ shared->allocation_count = 0;
|
||||||
|
+
|
||||||
|
+ regex_t reg;
|
||||||
|
+ TEST_COMPARE (regcomp (®, regexp, 0), 0);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/* Perform regcomp in a subprocess with fault injection. */
|
||||||
|
+static void
|
||||||
|
+test_in_subprocess (void *regexp1)
|
||||||
|
+{
|
||||||
|
+ const char *regexp = regexp1;
|
||||||
|
+ unsigned int inject_at = shared->failing_allocation;
|
||||||
|
+
|
||||||
|
+ regex_t reg;
|
||||||
|
+ int ret = regcomp (®, regexp, 0);
|
||||||
|
+
|
||||||
|
+ if (ret != 0)
|
||||||
|
+ {
|
||||||
|
+ TEST_COMPARE (ret, REG_ESPACE);
|
||||||
|
+ printf ("info: allocation %u failure results in return value %d,"
|
||||||
|
+ " error %s (%d)\n",
|
||||||
|
+ inject_at, ret, strerrorname_np (errno), errno);
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int
|
||||||
|
+do_test (void)
|
||||||
|
+{
|
||||||
|
+ char regexp[] = "[:alpha:]";
|
||||||
|
+
|
||||||
|
+ shared = support_shared_allocate (sizeof (*shared));
|
||||||
|
+
|
||||||
|
+ /* Disable fault injection. */
|
||||||
|
+ shared->failing_allocation = ~0U;
|
||||||
|
+
|
||||||
|
+ support_isolate_in_subprocess (no_op, NULL);
|
||||||
|
+ TEST_COMPARE (shared->allocation_count, 0);
|
||||||
|
+
|
||||||
|
+ support_isolate_in_subprocess (initialize, regexp);
|
||||||
|
+
|
||||||
|
+ /* The number of allocations in the successful case, plus some
|
||||||
|
+ slack. Once the number of expected allocations is exceeded,
|
||||||
|
+ injecting further failures does not make a difference. */
|
||||||
|
+ unsigned int maximum_allocation_count = shared->allocation_count;
|
||||||
|
+ printf ("info: successful call performs %u allocations\n",
|
||||||
|
+ maximum_allocation_count);
|
||||||
|
+ maximum_allocation_count += 10;
|
||||||
|
+
|
||||||
|
+ for (unsigned int inject_at = 0; inject_at <= maximum_allocation_count;
|
||||||
|
+ ++inject_at)
|
||||||
|
+ {
|
||||||
|
+ shared->allocation_count = 0;
|
||||||
|
+ shared->failing_allocation = inject_at;
|
||||||
|
+ support_isolate_in_subprocess (test_in_subprocess, regexp);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ support_shared_free (shared);
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+#include <support/test-driver.c>
|
||||||
|
--
|
||||||
|
2.50.1
|
||||||
|
|
@@ -1,148 +0,0 @@
|
|||||||
From 02782fd12849b6673cb5c2728cb750e8ec295aa3 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Stefan Liebler <stli@linux.ibm.com>
|
|
||||||
Date: Thu, 22 Feb 2024 15:03:27 +0100
|
|
||||||
Subject: [PATCH] S390: Do not clobber r7 in clone [BZ #31402]
|
|
||||||
|
|
||||||
Starting with commit e57d8fc97b90127de4ed3e3a9cdf663667580935
|
|
||||||
"S390: Always use svc 0"
|
|
||||||
clone clobbers the call-saved register r7 in error case:
|
|
||||||
function or stack is NULL.
|
|
||||||
|
|
||||||
This patch restores the saved registers also in the error case.
|
|
||||||
Furthermore the existing test misc/tst-clone is extended to check
|
|
||||||
all error cases and that clone does not clobber registers in this
|
|
||||||
error case.
|
|
||||||
---
|
|
||||||
sysdeps/unix/sysv/linux/s390/s390-32/clone.S | 1 +
|
|
||||||
sysdeps/unix/sysv/linux/s390/s390-64/clone.S | 1 +
|
|
||||||
sysdeps/unix/sysv/linux/tst-clone.c | 73 ++++++++++++++++----
|
|
||||||
3 files changed, 63 insertions(+), 12 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/clone.S b/sysdeps/unix/sysv/linux/s390/s390-32/clone.S
|
|
||||||
index 4c882ef2ee..a7a863242c 100644
|
|
||||||
--- a/sysdeps/unix/sysv/linux/s390/s390-32/clone.S
|
|
||||||
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/clone.S
|
|
||||||
@@ -53,6 +53,7 @@ ENTRY(__clone)
|
|
||||||
br %r14
|
|
||||||
error:
|
|
||||||
lhi %r2,-EINVAL
|
|
||||||
+ lm %r6,%r7,24(%r15) /* Load registers. */
|
|
||||||
j SYSCALL_ERROR_LABEL
|
|
||||||
PSEUDO_END (__clone)
|
|
||||||
|
|
||||||
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/clone.S b/sysdeps/unix/sysv/linux/s390/s390-64/clone.S
|
|
||||||
index 4eb104be71..c552a6b8de 100644
|
|
||||||
--- a/sysdeps/unix/sysv/linux/s390/s390-64/clone.S
|
|
||||||
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/clone.S
|
|
||||||
@@ -54,6 +54,7 @@ ENTRY(__clone)
|
|
||||||
br %r14
|
|
||||||
error:
|
|
||||||
lghi %r2,-EINVAL
|
|
||||||
+ lmg %r6,%r7,48(%r15) /* Restore registers. */
|
|
||||||
jg SYSCALL_ERROR_LABEL
|
|
||||||
PSEUDO_END (__clone)
|
|
||||||
|
|
||||||
diff --git a/sysdeps/unix/sysv/linux/tst-clone.c b/sysdeps/unix/sysv/linux/tst-clone.c
|
|
||||||
index 470676ab2b..2bc7124983 100644
|
|
||||||
--- a/sysdeps/unix/sysv/linux/tst-clone.c
|
|
||||||
+++ b/sysdeps/unix/sysv/linux/tst-clone.c
|
|
||||||
@@ -16,12 +16,16 @@
|
|
||||||
License along with the GNU C Library; if not, see
|
|
||||||
<https://www.gnu.org/licenses/>. */
|
|
||||||
|
|
||||||
-/* BZ #2386 */
|
|
||||||
+/* BZ #2386, BZ #31402 */
|
|
||||||
#include <errno.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <sched.h>
|
|
||||||
+#include <stackinfo.h> /* For _STACK_GROWS_{UP,DOWN}. */
|
|
||||||
+#include <support/check.h>
|
|
||||||
+
|
|
||||||
+volatile unsigned v = 0xdeadbeef;
|
|
||||||
|
|
||||||
int child_fn(void *arg)
|
|
||||||
{
|
|
||||||
@@ -30,22 +34,67 @@ int child_fn(void *arg)
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
-do_test (void)
|
|
||||||
+__attribute__((noinline))
|
|
||||||
+do_clone (int (*fn)(void *), void *stack)
|
|
||||||
{
|
|
||||||
int result;
|
|
||||||
+ unsigned int a = v;
|
|
||||||
+ unsigned int b = v;
|
|
||||||
+ unsigned int c = v;
|
|
||||||
+ unsigned int d = v;
|
|
||||||
+ unsigned int e = v;
|
|
||||||
+ unsigned int f = v;
|
|
||||||
+ unsigned int g = v;
|
|
||||||
+ unsigned int h = v;
|
|
||||||
+ unsigned int i = v;
|
|
||||||
+ unsigned int j = v;
|
|
||||||
+ unsigned int k = v;
|
|
||||||
+ unsigned int l = v;
|
|
||||||
+ unsigned int m = v;
|
|
||||||
+ unsigned int n = v;
|
|
||||||
+ unsigned int o = v;
|
|
||||||
+
|
|
||||||
+ result = clone (fn, stack, 0, NULL);
|
|
||||||
+
|
|
||||||
+ /* Check that clone does not clobber call-saved registers. */
|
|
||||||
+ TEST_VERIFY (a == v && b == v && c == v && d == v && e == v && f == v
|
|
||||||
+ && g == v && h == v && i == v && j == v && k == v && l == v
|
|
||||||
+ && m == v && n == v && o == v);
|
|
||||||
+
|
|
||||||
+ return result;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static void
|
|
||||||
+__attribute__((noinline))
|
|
||||||
+do_test_single (int (*fn)(void *), void *stack)
|
|
||||||
+{
|
|
||||||
+ printf ("%s (fn=%p, stack=%p)\n", __FUNCTION__, fn, stack);
|
|
||||||
+ errno = 0;
|
|
||||||
+
|
|
||||||
+ int result = do_clone (fn, stack);
|
|
||||||
+
|
|
||||||
+ TEST_COMPARE (errno, EINVAL);
|
|
||||||
+ TEST_COMPARE (result, -1);
|
|
||||||
+}
|
|
||||||
|
|
||||||
- result = clone (child_fn, NULL, 0, NULL);
|
|
||||||
+static int
|
|
||||||
+do_test (void)
|
|
||||||
+{
|
|
||||||
+ char st[128 * 1024] __attribute__ ((aligned));
|
|
||||||
+ void *stack = NULL;
|
|
||||||
+#if _STACK_GROWS_DOWN
|
|
||||||
+ stack = st + sizeof (st);
|
|
||||||
+#elif _STACK_GROWS_UP
|
|
||||||
+ stack = st;
|
|
||||||
+#else
|
|
||||||
+# error "Define either _STACK_GROWS_DOWN or _STACK_GROWS_UP"
|
|
||||||
+#endif
|
|
||||||
|
|
||||||
- if (errno != EINVAL || result != -1)
|
|
||||||
- {
|
|
||||||
- printf ("FAIL: clone()=%d (wanted -1) errno=%d (wanted %d)\n",
|
|
||||||
- result, errno, EINVAL);
|
|
||||||
- return 1;
|
|
||||||
- }
|
|
||||||
+ do_test_single (child_fn, NULL);
|
|
||||||
+ do_test_single (NULL, stack);
|
|
||||||
+ do_test_single (NULL, NULL);
|
|
||||||
|
|
||||||
- puts ("All OK");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
-#define TEST_FUNCTION do_test ()
|
|
||||||
-#include "../test-skeleton.c"
|
|
||||||
+#include <support/test-driver.c>
|
|
||||||
--
|
|
||||||
2.44.0
|
|
||||||
|
|
@@ -1,128 +0,0 @@
|
|||||||
From 2173173d57971d042c0ad4b281431ae127e9b5b8 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Andreas Schwab <schwab@suse.de>
|
|
||||||
Date: Mon, 11 Mar 2024 15:13:09 +0100
|
|
||||||
Subject: [PATCH] linux/sigsetops: fix type confusion (bug 31468)
|
|
||||||
|
|
||||||
Each mask in the sigset array is an unsigned long, so fix __sigisemptyset
|
|
||||||
to use that instead of int. The __sigword function returns a simple array
|
|
||||||
index, so it can return int instead of unsigned long.
|
|
||||||
---
|
|
||||||
signal/tst-sigisemptyset.c | 11 +++++++++++
|
|
||||||
sysdeps/unix/sysv/linux/internal-sigset.h | 8 ++++----
|
|
||||||
sysdeps/unix/sysv/linux/sigsetops.h | 10 +++++-----
|
|
||||||
3 files changed, 20 insertions(+), 9 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/signal/tst-sigisemptyset.c b/signal/tst-sigisemptyset.c
|
|
||||||
index f5e35e8c22..11e7f39d09 100644
|
|
||||||
--- a/signal/tst-sigisemptyset.c
|
|
||||||
+++ b/signal/tst-sigisemptyset.c
|
|
||||||
@@ -89,6 +89,17 @@ do_test (void)
|
|
||||||
TEST_COMPARE (sigisemptyset (&set), 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
+ {
|
|
||||||
+ sigset_t set;
|
|
||||||
+ for (int sig = 1; sig <= NSIG; sig++)
|
|
||||||
+ {
|
|
||||||
+ sigemptyset (&set);
|
|
||||||
+ if (sigaddset (&set, sig) < 0)
|
|
||||||
+ continue;
|
|
||||||
+ TEST_COMPARE (sigisemptyset (&set), 0);
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
diff --git a/sysdeps/unix/sysv/linux/internal-sigset.h b/sysdeps/unix/sysv/linux/internal-sigset.h
|
|
||||||
index 3c21c3b6d5..5d7020b42d 100644
|
|
||||||
--- a/sysdeps/unix/sysv/linux/internal-sigset.h
|
|
||||||
+++ b/sysdeps/unix/sysv/linux/internal-sigset.h
|
|
||||||
@@ -54,7 +54,7 @@ static inline int
|
|
||||||
internal_sigisemptyset (const internal_sigset_t *set)
|
|
||||||
{
|
|
||||||
int cnt = __NSIG_WORDS;
|
|
||||||
- int ret = set->__val[--cnt];
|
|
||||||
+ unsigned long int ret = set->__val[--cnt];
|
|
||||||
while (ret == 0 && --cnt >= 0)
|
|
||||||
ret = set->__val[cnt];
|
|
||||||
return ret == 0;
|
|
||||||
@@ -82,7 +82,7 @@ static inline int
|
|
||||||
internal_sigismember (const internal_sigset_t *set, int sig)
|
|
||||||
{
|
|
||||||
unsigned long int mask = __sigmask (sig);
|
|
||||||
- unsigned long int word = __sigword (sig);
|
|
||||||
+ int word = __sigword (sig);
|
|
||||||
return set->__val[word] & mask ? 1 : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -90,7 +90,7 @@ static inline void
|
|
||||||
internal_sigaddset (internal_sigset_t *set, int sig)
|
|
||||||
{
|
|
||||||
unsigned long int mask = __sigmask (sig);
|
|
||||||
- unsigned long int word = __sigword (sig);
|
|
||||||
+ int word = __sigword (sig);
|
|
||||||
set->__val[word] |= mask;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -98,7 +98,7 @@ static inline void
|
|
||||||
internal_sigdelset (internal_sigset_t *set, int sig)
|
|
||||||
{
|
|
||||||
unsigned long int mask = __sigmask (sig);
|
|
||||||
- unsigned long int word = __sigword (sig);
|
|
||||||
+ int word = __sigword (sig);
|
|
||||||
set->__val[word] &= ~mask;
|
|
||||||
}
|
|
||||||
|
|
||||||
diff --git a/sysdeps/unix/sysv/linux/sigsetops.h b/sysdeps/unix/sysv/linux/sigsetops.h
|
|
||||||
index abd5576172..33db4f77b8 100644
|
|
||||||
--- a/sysdeps/unix/sysv/linux/sigsetops.h
|
|
||||||
+++ b/sysdeps/unix/sysv/linux/sigsetops.h
|
|
||||||
@@ -28,7 +28,7 @@
|
|
||||||
(1UL << (((sig) - 1) % ULONG_WIDTH))
|
|
||||||
|
|
||||||
/* Return the word index for SIG. */
|
|
||||||
-static inline unsigned long int
|
|
||||||
+static inline int
|
|
||||||
__sigword (int sig)
|
|
||||||
{
|
|
||||||
return (sig - 1) / ULONG_WIDTH;
|
|
||||||
@@ -66,7 +66,7 @@ static inline int
|
|
||||||
__sigisemptyset (const sigset_t *set)
|
|
||||||
{
|
|
||||||
int cnt = __NSIG_WORDS;
|
|
||||||
- int ret = set->__val[--cnt];
|
|
||||||
+ unsigned long int ret = set->__val[--cnt];
|
|
||||||
while (ret == 0 && --cnt >= 0)
|
|
||||||
ret = set->__val[cnt];
|
|
||||||
return ret == 0;
|
|
||||||
@@ -92,7 +92,7 @@ static inline int
|
|
||||||
__sigismember (const sigset_t *set, int sig)
|
|
||||||
{
|
|
||||||
unsigned long int mask = __sigmask (sig);
|
|
||||||
- unsigned long int word = __sigword (sig);
|
|
||||||
+ int word = __sigword (sig);
|
|
||||||
return set->__val[word] & mask ? 1 : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -100,7 +100,7 @@ static inline void
|
|
||||||
__sigaddset (sigset_t *set, int sig)
|
|
||||||
{
|
|
||||||
unsigned long int mask = __sigmask (sig);
|
|
||||||
- unsigned long int word = __sigword (sig);
|
|
||||||
+ int word = __sigword (sig);
|
|
||||||
set->__val[word] |= mask;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -108,7 +108,7 @@ static inline void
|
|
||||||
__sigdelset (sigset_t *set, int sig)
|
|
||||||
{
|
|
||||||
unsigned long int mask = __sigmask (sig);
|
|
||||||
- unsigned long int word = __sigword (sig);
|
|
||||||
+ int word = __sigword (sig);
|
|
||||||
set->__val[word] &= ~mask;
|
|
||||||
}
|
|
||||||
|
|
||||||
--
|
|
||||||
2.44.0
|
|
||||||
|
|
@@ -1,75 +0,0 @@
|
|||||||
#
|
|
||||||
# /etc/nsswitch.conf
|
|
||||||
#
|
|
||||||
# An example Name Service Switch config file. This file should be
|
|
||||||
# sorted with the most-used services at the beginning.
|
|
||||||
#
|
|
||||||
# Valid databases are: aliases, ethers, group, gshadow, hosts,
|
|
||||||
# initgroups, netgroup, networks, passwd, protocols, publickey,
|
|
||||||
# rpc, services, and shadow.
|
|
||||||
#
|
|
||||||
# Valid service provider entries include (in alphabetical order):
|
|
||||||
#
|
|
||||||
# compat Use /etc files plus *_compat pseudo-db
|
|
||||||
# db Use the pre-processed /var/db files
|
|
||||||
# dns Use DNS (Domain Name Service)
|
|
||||||
# files Use the local files in /etc
|
|
||||||
# hesiod Use Hesiod (DNS) for user lookups
|
|
||||||
# nis Use NIS (NIS version 2), also called YP
|
|
||||||
# nisplus Use NIS+ (NIS version 3)
|
|
||||||
#
|
|
||||||
# See `info libc 'NSS Basics'` for more information.
|
|
||||||
#
|
|
||||||
# Commonly used alternative service providers (may need installation):
|
|
||||||
#
|
|
||||||
# ldap Use LDAP directory server
|
|
||||||
# myhostname Use systemd host names
|
|
||||||
# mymachines Use systemd machine names
|
|
||||||
# mdns*, mdns*_minimal Use Avahi mDNS/DNS-SD
|
|
||||||
# resolve Use systemd resolved resolver
|
|
||||||
# sss Use System Security Services Daemon (sssd)
|
|
||||||
# systemd Use systemd for dynamic user option
|
|
||||||
# winbind Use Samba winbind support
|
|
||||||
# wins Use Samba wins support
|
|
||||||
# wrapper Use wrapper module for testing
|
|
||||||
#
|
|
||||||
# Notes:
|
|
||||||
#
|
|
||||||
# 'sssd' performs its own 'files'-based caching, so it should generally
|
|
||||||
# come before 'files'.
|
|
||||||
#
|
|
||||||
# WARNING: Running nscd with a secondary caching service like sssd may
|
|
||||||
# lead to unexpected behaviour, especially with how long
|
|
||||||
# entries are cached.
|
|
||||||
#
|
|
||||||
# Installation instructions:
|
|
||||||
#
|
|
||||||
# To use 'db', install the appropriate package(s) (provide 'makedb' and
|
|
||||||
# libnss_db.so.*), and place the 'db' in front of 'files' for entries
|
|
||||||
# you want to be looked up first in the databases, like this:
|
|
||||||
#
|
|
||||||
# passwd: db files
|
|
||||||
# shadow: db files
|
|
||||||
# group: db files
|
|
||||||
|
|
||||||
passwd: compat
|
|
||||||
group: compat
|
|
||||||
shadow: compat
|
|
||||||
# Allow initgroups to default to the setting for group.
|
|
||||||
# initgroups: compat
|
|
||||||
|
|
||||||
hosts: files dns
|
|
||||||
networks: files dns
|
|
||||||
|
|
||||||
aliases: files usrfiles
|
|
||||||
ethers: files usrfiles
|
|
||||||
gshadow: files usrfiles
|
|
||||||
netgroup: files nis
|
|
||||||
protocols: files usrfiles
|
|
||||||
publickey: files
|
|
||||||
rpc: files usrfiles
|
|
||||||
services: files usrfiles
|
|
||||||
|
|
||||||
automount: files nis
|
|
||||||
bootparams: files
|
|
||||||
netmasks: files
|
|
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
|||||||
From ec4f0a28ed48c51165e3e72c7427efb0ae14a124 Mon Sep 17 00:00:00 2001
|
From 14848b3c532520e71ba2614eb23f173f83c541d2 Mon Sep 17 00:00:00 2001
|
||||||
From: Giuliano Belinassi <gbelinassi@suse.de>
|
From: Giuliano Belinassi <gbelinassi@suse.de>
|
||||||
Date: Mon, 6 May 2024 20:09:55 -0300
|
Date: Thu, 2 Jan 2025 22:40:22 +0100
|
||||||
Subject: [PATCH] Add Userspace Livepatch prologue into ASM functions
|
Subject: [PATCH] Add Userspace Livepatch prologue into ASM functions
|
||||||
|
|
||||||
Userspace Live Patching (ULP) refers to the process of applying
|
Userspace Live Patching (ULP) refers to the process of applying
|
||||||
@@ -12,38 +12,24 @@ this have to be included manually. This patch does this.
|
|||||||
|
|
||||||
Signed-off-by: Giuliano Belinassi <gbelinassi@suse.de>
|
Signed-off-by: Giuliano Belinassi <gbelinassi@suse.de>
|
||||||
---
|
---
|
||||||
Makeconfig | 5 +++
|
|
||||||
config.h.in | 3 ++
|
config.h.in | 3 ++
|
||||||
config.make.in | 1 +
|
config.make.in | 1 +
|
||||||
configure | 21 +++++++++
|
configure | 22 ++++++++++
|
||||||
configure.ac | 13 ++++++
|
configure.ac | 13 ++++++
|
||||||
|
sysdeps/powerpc/powerpc64/le/Makefile | 5 +++
|
||||||
|
sysdeps/powerpc/powerpc64/sysdep.h | 55 ++++++++++++++++++++++--
|
||||||
|
sysdeps/x86_64/Makefile | 5 +++
|
||||||
sysdeps/x86_64/multiarch/strcmp-avx2.S | 5 +--
|
sysdeps/x86_64/multiarch/strcmp-avx2.S | 5 +--
|
||||||
sysdeps/x86_64/multiarch/strcmp-evex.S | 5 +--
|
sysdeps/x86_64/multiarch/strcmp-evex.S | 5 +--
|
||||||
sysdeps/x86_64/multiarch/strcmp-sse4_2.S | 5 +--
|
sysdeps/x86_64/multiarch/strcmp-sse4_2.S | 5 +--
|
||||||
sysdeps/x86_64/sysdep.h | 54 ++++++++++++++++++++++--
|
sysdeps/x86_64/sysdep.h | 54 +++++++++++++++++++++--
|
||||||
9 files changed, 96 insertions(+), 16 deletions(-)
|
11 files changed, 153 insertions(+), 20 deletions(-)
|
||||||
|
|
||||||
diff --git a/Makeconfig b/Makeconfig
|
|
||||||
index e583765712..b136e10224 100644
|
|
||||||
--- a/Makeconfig
|
|
||||||
+++ b/Makeconfig
|
|
||||||
@@ -981,6 +981,11 @@ else
|
|
||||||
+cflags += $(no-fortify-source)
|
|
||||||
endif
|
|
||||||
|
|
||||||
+# Add flags for Userspace Livepatching support.
|
|
||||||
+ifeq (yes,$(enable-userspace-livepatch))
|
|
||||||
++cflags += -fpatchable-function-entry=16,14
|
|
||||||
+endif
|
|
||||||
+
|
|
||||||
# Each sysdeps directory can contain header files that both will be
|
|
||||||
# used to compile and will be installed. Each can also contain an
|
|
||||||
# include/ subdirectory, whose header files will be used to compile
|
|
||||||
diff --git a/config.h.in b/config.h.in
|
diff --git a/config.h.in b/config.h.in
|
||||||
index c4cc7d3b9a..dc70ed03d0 100644
|
index f495f11244..6c46990c8d 100644
|
||||||
--- a/config.h.in
|
--- a/config.h.in
|
||||||
+++ b/config.h.in
|
+++ b/config.h.in
|
||||||
@@ -205,6 +205,9 @@
|
@@ -214,6 +214,9 @@
|
||||||
/* Define to 1 if libpthread actually resides in libc. */
|
/* Define to 1 if libpthread actually resides in libc. */
|
||||||
#define PTHREAD_IN_LIBC 0
|
#define PTHREAD_IN_LIBC 0
|
||||||
|
|
||||||
@@ -54,7 +40,7 @@ index c4cc7d3b9a..dc70ed03d0 100644
|
|||||||
#define TIMEOUTFACTOR 1
|
#define TIMEOUTFACTOR 1
|
||||||
|
|
||||||
diff --git a/config.make.in b/config.make.in
|
diff --git a/config.make.in b/config.make.in
|
||||||
index 55e8b7563b..0f14c05d62 100644
|
index 36096881b7..04cf873fad 100644
|
||||||
--- a/config.make.in
|
--- a/config.make.in
|
||||||
+++ b/config.make.in
|
+++ b/config.make.in
|
||||||
@@ -81,6 +81,7 @@ mach-interface-list = @mach_interface_list@
|
@@ -81,6 +81,7 @@ mach-interface-list = @mach_interface_list@
|
||||||
@@ -66,10 +52,10 @@ index 55e8b7563b..0f14c05d62 100644
|
|||||||
build-profile = @profile@
|
build-profile = @profile@
|
||||||
build-static-nss = @static_nss@
|
build-static-nss = @static_nss@
|
||||||
diff --git a/configure b/configure
|
diff --git a/configure b/configure
|
||||||
index 432e40a592..eb6b203925 100755
|
index 1d543548cd..f6275d327e 100755
|
||||||
--- a/configure
|
--- a/configure
|
||||||
+++ b/configure
|
+++ b/configure
|
||||||
@@ -622,6 +622,7 @@ LIBOBJS
|
@@ -615,6 +615,7 @@ LIBOBJS
|
||||||
pthread_in_libc
|
pthread_in_libc
|
||||||
RELEASE
|
RELEASE
|
||||||
VERSION
|
VERSION
|
||||||
@@ -77,7 +63,7 @@ index 432e40a592..eb6b203925 100755
|
|||||||
mach_interface_list
|
mach_interface_list
|
||||||
DEFINES
|
DEFINES
|
||||||
static_nss
|
static_nss
|
||||||
@@ -812,6 +813,7 @@ enable_cet
|
@@ -809,6 +810,7 @@ enable_cet
|
||||||
enable_scv
|
enable_scv
|
||||||
enable_fortify_source
|
enable_fortify_source
|
||||||
with_cpu
|
with_cpu
|
||||||
@@ -85,7 +71,7 @@ index 432e40a592..eb6b203925 100755
|
|||||||
'
|
'
|
||||||
ac_precious_vars='build_alias
|
ac_precious_vars='build_alias
|
||||||
host_alias
|
host_alias
|
||||||
@@ -1490,6 +1492,8 @@ Optional Features:
|
@@ -1491,6 +1493,8 @@ Optional Features:
|
||||||
Use -D_FORTIFY_SOURCE=[1|2|3] to control code
|
Use -D_FORTIFY_SOURCE=[1|2|3] to control code
|
||||||
hardening, defaults to highest possible value
|
hardening, defaults to highest possible value
|
||||||
supported by the build compiler.
|
supported by the build compiler.
|
||||||
@@ -94,7 +80,7 @@ index 432e40a592..eb6b203925 100755
|
|||||||
|
|
||||||
Optional Packages:
|
Optional Packages:
|
||||||
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
|
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
|
||||||
@@ -7867,6 +7871,23 @@ libc_cv_multidir=`${CC-cc} $CFLAGS $CPPFLAGS -print-multi-directory`
|
@@ -8096,6 +8100,24 @@ libc_cv_multidir=`${CC-cc} $CFLAGS $CPPFLAGS -print-multi-directory`
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -102,8 +88,9 @@ index 432e40a592..eb6b203925 100755
|
|||||||
+if test ${enable_userspace_livepatch+y}
|
+if test ${enable_userspace_livepatch+y}
|
||||||
+then :
|
+then :
|
||||||
+ enableval=$enable_userspace_livepatch; enable_userspace_livepatch=$enableval
|
+ enableval=$enable_userspace_livepatch; enable_userspace_livepatch=$enableval
|
||||||
+else $as_nop
|
+else case e in #(
|
||||||
+ enable_userspace_livepatch=no
|
+ e) enable_userspace_livepatch=no ;;
|
||||||
|
+esac
|
||||||
+fi
|
+fi
|
||||||
+
|
+
|
||||||
+
|
+
|
||||||
@@ -119,10 +106,10 @@ index 432e40a592..eb6b203925 100755
|
|||||||
RELEASE=`sed -n -e 's/^#define RELEASE "\([^"]*\)"/\1/p' < $srcdir/version.h`
|
RELEASE=`sed -n -e 's/^#define RELEASE "\([^"]*\)"/\1/p' < $srcdir/version.h`
|
||||||
|
|
||||||
diff --git a/configure.ac b/configure.ac
|
diff --git a/configure.ac b/configure.ac
|
||||||
index bdc385d03c..cb4d28b3d8 100644
|
index 9cbc0bf68f..4ba19209b7 100644
|
||||||
--- a/configure.ac
|
--- a/configure.ac
|
||||||
+++ b/configure.ac
|
+++ b/configure.ac
|
||||||
@@ -1756,6 +1756,19 @@ AC_SUBST(DEFINES)
|
@@ -1780,6 +1780,19 @@ AC_SUBST(DEFINES)
|
||||||
dnl See sysdeps/mach/configure.ac for this variable.
|
dnl See sysdeps/mach/configure.ac for this variable.
|
||||||
AC_SUBST(mach_interface_list)
|
AC_SUBST(mach_interface_list)
|
||||||
|
|
||||||
@@ -142,6 +129,114 @@ index bdc385d03c..cb4d28b3d8 100644
|
|||||||
VERSION=`sed -n -e 's/^#define VERSION "\([^"]*\)"/\1/p' < $srcdir/version.h`
|
VERSION=`sed -n -e 's/^#define VERSION "\([^"]*\)"/\1/p' < $srcdir/version.h`
|
||||||
RELEASE=`sed -n -e 's/^#define RELEASE "\([^"]*\)"/\1/p' < $srcdir/version.h`
|
RELEASE=`sed -n -e 's/^#define RELEASE "\([^"]*\)"/\1/p' < $srcdir/version.h`
|
||||||
AC_SUBST(VERSION)
|
AC_SUBST(VERSION)
|
||||||
|
diff --git a/sysdeps/powerpc/powerpc64/le/Makefile b/sysdeps/powerpc/powerpc64/le/Makefile
|
||||||
|
index b77775cf95..2f81e562db 100644
|
||||||
|
--- a/sysdeps/powerpc/powerpc64/le/Makefile
|
||||||
|
+++ b/sysdeps/powerpc/powerpc64/le/Makefile
|
||||||
|
@@ -1,3 +1,8 @@
|
||||||
|
+# Add flags for Userspace Livepatching support.
|
||||||
|
+ifeq (yes,$(enable-userspace-livepatch))
|
||||||
|
++cflags += -fpatchable-function-entry=14,13 -msplit-patch-nops
|
||||||
|
+endif
|
||||||
|
+
|
||||||
|
# When building float128 we need to ensure -mfloat128 is
|
||||||
|
# passed to all such object files.
|
||||||
|
type-float128-CFLAGS := -mfloat128
|
||||||
|
diff --git a/sysdeps/powerpc/powerpc64/sysdep.h b/sysdeps/powerpc/powerpc64/sysdep.h
|
||||||
|
index c363939e1a..33ed236407 100644
|
||||||
|
--- a/sysdeps/powerpc/powerpc64/sysdep.h
|
||||||
|
+++ b/sysdeps/powerpc/powerpc64/sysdep.h
|
||||||
|
@@ -162,6 +162,46 @@
|
||||||
|
BODY_LABEL(\name):
|
||||||
|
.endm
|
||||||
|
|
||||||
|
+/* Libpulp uses -fpatchable-function-entry to add padding NOPS to the
|
||||||
|
+ prologue of all functions. This works for C functions. For functions
|
||||||
|
+ written in ASM, the way we do this is by adding this prologue manually. */
|
||||||
|
+
|
||||||
|
+#if ENABLE_USERSPACE_LIVEPATCH
|
||||||
|
+
|
||||||
|
+/* Instructions to be inserted before the function label. */
|
||||||
|
+# define ULP_NOPS_PRE_PROLOGUE .rept 13; nop; .endr
|
||||||
|
+
|
||||||
|
+/* Instruction to be inserted after the function label. */
|
||||||
|
+# define ULP_NOPS_POST_PROLOGUE .rept 1; nop; .endr
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+/* this macro expands according to the following condition:
|
||||||
|
+ * if name = _start, then the prologue is not inserted.
|
||||||
|
+ * if name = _dl_relocate_static_pie, then the prologue is not inserted.
|
||||||
|
+ * if name = anything else, then the prologue is inserted.
|
||||||
|
+ **/
|
||||||
|
+# define __ULP_PRE_PROLOGUE_dl_relocate_static_pie ,
|
||||||
|
+# define __ULP_PRE_PROLOGUE_start ,
|
||||||
|
+# define __ULP_PRE_PROLOGUE(x, y,...) y
|
||||||
|
+# define _ULP_PRE_PROLOGUE(x, ...) __ULP_PRE_PROLOGUE(x, __VA_ARGS__)
|
||||||
|
+# define ULP_PRE_PROLOGUE(name) _ULP_PRE_PROLOGUE(__ULP_PRE_PROLOGUE##name, ULP_NOPS_PRE_PROLOGUE,)
|
||||||
|
+
|
||||||
|
+/* this macro expands according to the following condition:
|
||||||
|
+ * if name = _start, then the postlogue is not inserted.
|
||||||
|
+ * if name = _dl_relocate_static_pie, then the postlogue is not inserted.
|
||||||
|
+ * if name = anything else, then the postlogue is inserted.
|
||||||
|
+ **/
|
||||||
|
+# define __ULP_POST_PROLOGUE_dl_relocate_static_pie ,
|
||||||
|
+# define __ULP_POST_PROLOGUE_start ,
|
||||||
|
+# define __ULP_POST_PROLOGUE(x, y,...) y
|
||||||
|
+# define _ULP_POST_PROLOGUE(x, ...) __ULP_POST_PROLOGUE(x, __VA_ARGS__)
|
||||||
|
+# define ULP_POST_PROLOGUE(name) _ULP_POST_PROLOGUE(__ULP_POST_PROLOGUE##name, ULP_NOPS_POST_PROLOGUE,)
|
||||||
|
+
|
||||||
|
+#else
|
||||||
|
+# define ULP_PRE_PROLOGUE(name)
|
||||||
|
+# define ULP_POST_PROLOGUE(name)
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
/* Use ENTRY_TOCLESS for functions that make no use of r2 and
|
||||||
|
guarantee r2 is unchanged on exit. Any function that has @toc or
|
||||||
|
@got relocs uses r2. Functions that call other functions via the
|
||||||
|
@@ -174,19 +214,26 @@ BODY_LABEL(\name):
|
||||||
|
before the start of the function's code. */
|
||||||
|
#ifndef PROF
|
||||||
|
#define ENTRY_TOCLESS(name, ...) \
|
||||||
|
+ ULP_PRE_PROLOGUE(name); \
|
||||||
|
ENTRY_3 name, ## __VA_ARGS__; \
|
||||||
|
- cfi_startproc
|
||||||
|
+ cfi_startproc; \
|
||||||
|
+ ULP_POST_PROLOGUE(name)
|
||||||
|
|
||||||
|
#define ENTRY(name, ...) \
|
||||||
|
- ENTRY_TOCLESS(name, ## __VA_ARGS__); \
|
||||||
|
- LOCALENTRY(name)
|
||||||
|
+ ULP_PRE_PROLOGUE(name); \
|
||||||
|
+ ENTRY_3 name, ## __VA_ARGS__; \
|
||||||
|
+ cfi_startproc; \
|
||||||
|
+ LOCALENTRY(name); \
|
||||||
|
+ ULP_POST_PROLOGUE(name)
|
||||||
|
#else
|
||||||
|
/* The call to _mcount is potentially via the plt, so profiling code
|
||||||
|
is never free of an r2 use. */
|
||||||
|
#define ENTRY_TOCLESS(name, ...) \
|
||||||
|
+ ULP_PRE_PROLOGUE(name); \
|
||||||
|
ENTRY_3 name, ## __VA_ARGS__; \
|
||||||
|
cfi_startproc; \
|
||||||
|
- LOCALENTRY(name)
|
||||||
|
+ LOCALENTRY(name); \
|
||||||
|
+ ULP_POST_PROLOGUE(name)
|
||||||
|
|
||||||
|
#define ENTRY(name, ...) \
|
||||||
|
ENTRY_TOCLESS(name, ## __VA_ARGS__)
|
||||||
|
diff --git a/sysdeps/x86_64/Makefile b/sysdeps/x86_64/Makefile
|
||||||
|
index ce949dba27..44e9f38f4e 100644
|
||||||
|
--- a/sysdeps/x86_64/Makefile
|
||||||
|
+++ b/sysdeps/x86_64/Makefile
|
||||||
|
@@ -1,3 +1,8 @@
|
||||||
|
+# Add flags for Userspace Livepatching support.
|
||||||
|
+ifeq (yes,$(enable-userspace-livepatch))
|
||||||
|
++cflags += -fpatchable-function-entry=16,14
|
||||||
|
+endif
|
||||||
|
+
|
||||||
|
# The i387 `long double' is a distinct type we support.
|
||||||
|
long-double-fcts = yes
|
||||||
|
|
||||||
diff --git a/sysdeps/x86_64/multiarch/strcmp-avx2.S b/sysdeps/x86_64/multiarch/strcmp-avx2.S
|
diff --git a/sysdeps/x86_64/multiarch/strcmp-avx2.S b/sysdeps/x86_64/multiarch/strcmp-avx2.S
|
||||||
index 5bc1d90078..3ea96c0aa3 100644
|
index 5bc1d90078..3ea96c0aa3 100644
|
||||||
--- a/sysdeps/x86_64/multiarch/strcmp-avx2.S
|
--- a/sysdeps/x86_64/multiarch/strcmp-avx2.S
|
||||||
@@ -268,5 +363,5 @@ index db6e36b2dd..86a5d1b2be 100644
|
|||||||
/* This macro is for setting proper CFI with DW_CFA_expression describing
|
/* This macro is for setting proper CFI with DW_CFA_expression describing
|
||||||
the register as saved relative to %rsp instead of relative to the CFA.
|
the register as saved relative to %rsp instead of relative to the CFA.
|
||||||
--
|
--
|
||||||
2.44.0
|
2.49.0
|
||||||
|
|
||||||
|
@@ -1,645 +0,0 @@
|
|||||||
From 9831f98c266a8d56d1bf729b709c08e40375540c Mon Sep 17 00:00:00 2001
|
|
||||||
From: Florian Weimer <fweimer@redhat.com>
|
|
||||||
Date: Fri, 19 Apr 2024 14:38:17 +0200
|
|
||||||
Subject: [PATCH] login: Check default sizes of structs utmp, utmpx, lastlog
|
|
||||||
|
|
||||||
The default <utmp-size.h> is for ports with a 64-bit time_t.
|
|
||||||
Ports with a 32-bit time_t or with __WORDSIZE_TIME64_COMPAT32=1
|
|
||||||
need to override it.
|
|
||||||
|
|
||||||
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
|
||||||
(cherry picked from commit 4d4da5aab936504b2d3eca3146e109630d9093c4)
|
|
||||||
---
|
|
||||||
login/Makefile | 2 +-
|
|
||||||
login/tst-utmp-size.c | 33 +++++++++++++++++++++++++++++++++
|
|
||||||
sysdeps/arc/utmp-size.h | 3 +++
|
|
||||||
sysdeps/arm/utmp-size.h | 2 ++
|
|
||||||
sysdeps/csky/utmp-size.h | 2 ++
|
|
||||||
sysdeps/generic/utmp-size.h | 23 +++++++++++++++++++++++
|
|
||||||
sysdeps/hppa/utmp-size.h | 2 ++
|
|
||||||
sysdeps/m68k/utmp-size.h | 3 +++
|
|
||||||
sysdeps/microblaze/utmp-size.h | 2 ++
|
|
||||||
sysdeps/mips/utmp-size.h | 2 ++
|
|
||||||
sysdeps/nios2/utmp-size.h | 2 ++
|
|
||||||
sysdeps/or1k/utmp-size.h | 3 +++
|
|
||||||
sysdeps/powerpc/utmp-size.h | 2 ++
|
|
||||||
sysdeps/riscv/utmp-size.h | 2 ++
|
|
||||||
sysdeps/sh/utmp-size.h | 2 ++
|
|
||||||
sysdeps/sparc/utmp-size.h | 2 ++
|
|
||||||
sysdeps/x86/utmp-size.h | 2 ++
|
|
||||||
17 files changed, 88 insertions(+), 1 deletion(-)
|
|
||||||
create mode 100644 login/tst-utmp-size.c
|
|
||||||
create mode 100644 sysdeps/arc/utmp-size.h
|
|
||||||
create mode 100644 sysdeps/arm/utmp-size.h
|
|
||||||
create mode 100644 sysdeps/csky/utmp-size.h
|
|
||||||
create mode 100644 sysdeps/generic/utmp-size.h
|
|
||||||
create mode 100644 sysdeps/hppa/utmp-size.h
|
|
||||||
create mode 100644 sysdeps/m68k/utmp-size.h
|
|
||||||
create mode 100644 sysdeps/microblaze/utmp-size.h
|
|
||||||
create mode 100644 sysdeps/mips/utmp-size.h
|
|
||||||
create mode 100644 sysdeps/nios2/utmp-size.h
|
|
||||||
create mode 100644 sysdeps/or1k/utmp-size.h
|
|
||||||
create mode 100644 sysdeps/powerpc/utmp-size.h
|
|
||||||
create mode 100644 sysdeps/riscv/utmp-size.h
|
|
||||||
create mode 100644 sysdeps/sh/utmp-size.h
|
|
||||||
create mode 100644 sysdeps/sparc/utmp-size.h
|
|
||||||
create mode 100644 sysdeps/x86/utmp-size.h
|
|
||||||
|
|
||||||
diff --git a/login/Makefile b/login/Makefile
|
|
||||||
index 1e22008a61..b26ac42bfc 100644
|
|
||||||
--- a/login/Makefile
|
|
||||||
+++ b/login/Makefile
|
|
||||||
@@ -44,7 +44,7 @@ subdir-dirs = programs
|
|
||||||
vpath %.c programs
|
|
||||||
|
|
||||||
tests := tst-utmp tst-utmpx tst-grantpt tst-ptsname tst-getlogin tst-updwtmpx \
|
|
||||||
- tst-pututxline-lockfail tst-pututxline-cache
|
|
||||||
+ tst-pututxline-lockfail tst-pututxline-cache tst-utmp-size
|
|
||||||
|
|
||||||
# Empty compatibility library for old binaries.
|
|
||||||
extra-libs := libutil
|
|
||||||
diff --git a/login/tst-utmp-size.c b/login/tst-utmp-size.c
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000000..1b7f7ff042
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/login/tst-utmp-size.c
|
|
||||||
@@ -0,0 +1,33 @@
|
|
||||||
+/* Check expected sizes of struct utmp, struct utmpx, struct lastlog.
|
|
||||||
+ Copyright (C) 2024 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 <utmp.h>
|
|
||||||
+#include <utmpx.h>
|
|
||||||
+#include <utmp-size.h>
|
|
||||||
+
|
|
||||||
+static int
|
|
||||||
+do_test (void)
|
|
||||||
+{
|
|
||||||
+ _Static_assert (sizeof (struct utmp) == UTMP_SIZE, "struct utmp size");
|
|
||||||
+ _Static_assert (sizeof (struct utmpx) == UTMP_SIZE, "struct utmpx size");
|
|
||||||
+ _Static_assert (sizeof (struct lastlog) == LASTLOG_SIZE,
|
|
||||||
+ "struct lastlog size");
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+#include <support/test-driver.c>
|
|
||||||
diff --git a/sysdeps/arc/utmp-size.h b/sysdeps/arc/utmp-size.h
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000000..a247fcd3da
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/sysdeps/arc/utmp-size.h
|
|
||||||
@@ -0,0 +1,3 @@
|
|
||||||
+/* arc has less padding than other architectures with 64-bit time_t. */
|
|
||||||
+#define UTMP_SIZE 392
|
|
||||||
+#define LASTLOG_SIZE 296
|
|
||||||
diff --git a/sysdeps/arm/utmp-size.h b/sysdeps/arm/utmp-size.h
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000000..8f21ebe1b6
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/sysdeps/arm/utmp-size.h
|
|
||||||
@@ -0,0 +1,2 @@
|
|
||||||
+#define UTMP_SIZE 384
|
|
||||||
+#define LASTLOG_SIZE 292
|
|
||||||
diff --git a/sysdeps/csky/utmp-size.h b/sysdeps/csky/utmp-size.h
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000000..8f21ebe1b6
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/sysdeps/csky/utmp-size.h
|
|
||||||
@@ -0,0 +1,2 @@
|
|
||||||
+#define UTMP_SIZE 384
|
|
||||||
+#define LASTLOG_SIZE 292
|
|
||||||
diff --git a/sysdeps/generic/utmp-size.h b/sysdeps/generic/utmp-size.h
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000000..89dbe878b0
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/sysdeps/generic/utmp-size.h
|
|
||||||
@@ -0,0 +1,23 @@
|
|
||||||
+/* Expected sizes of utmp-related structures stored in files. 64-bit version.
|
|
||||||
+ Copyright (C) 2024 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/>. */
|
|
||||||
+
|
|
||||||
+/* Expected size, in bytes, of struct utmp and struct utmpx. */
|
|
||||||
+#define UTMP_SIZE 400
|
|
||||||
+
|
|
||||||
+/* Expected size, in bytes, of struct lastlog. */
|
|
||||||
+#define LASTLOG_SIZE 296
|
|
||||||
diff --git a/sysdeps/hppa/utmp-size.h b/sysdeps/hppa/utmp-size.h
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000000..8f21ebe1b6
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/sysdeps/hppa/utmp-size.h
|
|
||||||
@@ -0,0 +1,2 @@
|
|
||||||
+#define UTMP_SIZE 384
|
|
||||||
+#define LASTLOG_SIZE 292
|
|
||||||
diff --git a/sysdeps/m68k/utmp-size.h b/sysdeps/m68k/utmp-size.h
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000000..5946685819
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/sysdeps/m68k/utmp-size.h
|
|
||||||
@@ -0,0 +1,3 @@
|
|
||||||
+/* m68k has 2-byte alignment. */
|
|
||||||
+#define UTMP_SIZE 382
|
|
||||||
+#define LASTLOG_SIZE 292
|
|
||||||
diff --git a/sysdeps/microblaze/utmp-size.h b/sysdeps/microblaze/utmp-size.h
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000000..8f21ebe1b6
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/sysdeps/microblaze/utmp-size.h
|
|
||||||
@@ -0,0 +1,2 @@
|
|
||||||
+#define UTMP_SIZE 384
|
|
||||||
+#define LASTLOG_SIZE 292
|
|
||||||
diff --git a/sysdeps/mips/utmp-size.h b/sysdeps/mips/utmp-size.h
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000000..8f21ebe1b6
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/sysdeps/mips/utmp-size.h
|
|
||||||
@@ -0,0 +1,2 @@
|
|
||||||
+#define UTMP_SIZE 384
|
|
||||||
+#define LASTLOG_SIZE 292
|
|
||||||
diff --git a/sysdeps/nios2/utmp-size.h b/sysdeps/nios2/utmp-size.h
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000000..8f21ebe1b6
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/sysdeps/nios2/utmp-size.h
|
|
||||||
@@ -0,0 +1,2 @@
|
|
||||||
+#define UTMP_SIZE 384
|
|
||||||
+#define LASTLOG_SIZE 292
|
|
||||||
diff --git a/sysdeps/or1k/utmp-size.h b/sysdeps/or1k/utmp-size.h
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000000..6b3653aa4d
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/sysdeps/or1k/utmp-size.h
|
|
||||||
@@ -0,0 +1,3 @@
|
|
||||||
+/* or1k has less padding than other architectures with 64-bit time_t. */
|
|
||||||
+#define UTMP_SIZE 392
|
|
||||||
+#define LASTLOG_SIZE 296
|
|
||||||
diff --git a/sysdeps/powerpc/utmp-size.h b/sysdeps/powerpc/utmp-size.h
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000000..8f21ebe1b6
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/sysdeps/powerpc/utmp-size.h
|
|
||||||
@@ -0,0 +1,2 @@
|
|
||||||
+#define UTMP_SIZE 384
|
|
||||||
+#define LASTLOG_SIZE 292
|
|
||||||
diff --git a/sysdeps/riscv/utmp-size.h b/sysdeps/riscv/utmp-size.h
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000000..8f21ebe1b6
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/sysdeps/riscv/utmp-size.h
|
|
||||||
@@ -0,0 +1,2 @@
|
|
||||||
+#define UTMP_SIZE 384
|
|
||||||
+#define LASTLOG_SIZE 292
|
|
||||||
diff --git a/sysdeps/sh/utmp-size.h b/sysdeps/sh/utmp-size.h
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000000..8f21ebe1b6
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/sysdeps/sh/utmp-size.h
|
|
||||||
@@ -0,0 +1,2 @@
|
|
||||||
+#define UTMP_SIZE 384
|
|
||||||
+#define LASTLOG_SIZE 292
|
|
||||||
diff --git a/sysdeps/sparc/utmp-size.h b/sysdeps/sparc/utmp-size.h
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000000..8f21ebe1b6
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/sysdeps/sparc/utmp-size.h
|
|
||||||
@@ -0,0 +1,2 @@
|
|
||||||
+#define UTMP_SIZE 384
|
|
||||||
+#define LASTLOG_SIZE 292
|
|
||||||
diff --git a/sysdeps/x86/utmp-size.h b/sysdeps/x86/utmp-size.h
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000000..8f21ebe1b6
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/sysdeps/x86/utmp-size.h
|
|
||||||
@@ -0,0 +1,2 @@
|
|
||||||
+#define UTMP_SIZE 384
|
|
||||||
+#define LASTLOG_SIZE 292
|
|
||||||
--
|
|
||||||
2.45.0
|
|
||||||
|
|
||||||
From 836d43b98973e0845b739ff5d3aad3af09dc7d0f Mon Sep 17 00:00:00 2001
|
|
||||||
From: Florian Weimer <fweimer@redhat.com>
|
|
||||||
Date: Fri, 19 Apr 2024 14:38:17 +0200
|
|
||||||
Subject: [PATCH] login: structs utmp, utmpx, lastlog _TIME_BITS independence
|
|
||||||
(bug 30701)
|
|
||||||
|
|
||||||
These structs describe file formats under /var/log, and should not
|
|
||||||
depend on the definition of _TIME_BITS. This is achieved by
|
|
||||||
defining __WORDSIZE_TIME64_COMPAT32 to 1 on 32-bit ports that
|
|
||||||
support 32-bit time_t values (where __time_t is 32 bits).
|
|
||||||
|
|
||||||
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
|
||||||
(cherry picked from commit 9abdae94c7454c45e02e97e4ed1eb1b1915d13d8)
|
|
||||||
---
|
|
||||||
bits/wordsize.h | 6 ++++--
|
|
||||||
login/Makefile | 4 +++-
|
|
||||||
login/tst-utmp-size-64.c | 2 ++
|
|
||||||
sysdeps/arm/bits/wordsize.h | 21 +++++++++++++++++++
|
|
||||||
sysdeps/csky/bits/wordsize.h | 21 +++++++++++++++++++
|
|
||||||
sysdeps/m68k/bits/wordsize.h | 21 +++++++++++++++++++
|
|
||||||
sysdeps/microblaze/bits/wordsize.h | 21 +++++++++++++++++++
|
|
||||||
sysdeps/mips/bits/wordsize.h | 6 +-----
|
|
||||||
sysdeps/nios2/bits/wordsize.h | 21 +++++++++++++++++++
|
|
||||||
sysdeps/powerpc/powerpc32/bits/wordsize.h | 3 +--
|
|
||||||
sysdeps/powerpc/powerpc64/bits/wordsize.h | 3 +--
|
|
||||||
sysdeps/sh/bits/wordsize.h | 21 +++++++++++++++++++
|
|
||||||
sysdeps/sparc/sparc32/bits/wordsize.h | 2 +-
|
|
||||||
sysdeps/sparc/sparc64/bits/wordsize.h | 3 +--
|
|
||||||
sysdeps/unix/sysv/linux/hppa/bits/wordsize.h | 21 +++++++++++++++++++
|
|
||||||
.../unix/sysv/linux/powerpc/bits/wordsize.h | 3 +--
|
|
||||||
sysdeps/unix/sysv/linux/sparc/bits/wordsize.h | 3 +--
|
|
||||||
sysdeps/x86/bits/wordsize.h | 5 ++---
|
|
||||||
18 files changed, 165 insertions(+), 22 deletions(-)
|
|
||||||
create mode 100644 login/tst-utmp-size-64.c
|
|
||||||
create mode 100644 sysdeps/arm/bits/wordsize.h
|
|
||||||
create mode 100644 sysdeps/csky/bits/wordsize.h
|
|
||||||
create mode 100644 sysdeps/m68k/bits/wordsize.h
|
|
||||||
create mode 100644 sysdeps/microblaze/bits/wordsize.h
|
|
||||||
create mode 100644 sysdeps/nios2/bits/wordsize.h
|
|
||||||
create mode 100644 sysdeps/sh/bits/wordsize.h
|
|
||||||
create mode 100644 sysdeps/unix/sysv/linux/hppa/bits/wordsize.h
|
|
||||||
|
|
||||||
diff --git a/bits/wordsize.h b/bits/wordsize.h
|
|
||||||
index 14edae3a11..53013a9275 100644
|
|
||||||
--- a/bits/wordsize.h
|
|
||||||
+++ b/bits/wordsize.h
|
|
||||||
@@ -21,7 +21,9 @@
|
|
||||||
#define __WORDSIZE32_PTRDIFF_LONG
|
|
||||||
|
|
||||||
/* Set to 1 in order to force time types to be 32 bits instead of 64 bits in
|
|
||||||
- struct lastlog and struct utmp{,x} on 64-bit ports. This may be done in
|
|
||||||
+ struct lastlog and struct utmp{,x}. This may be done in
|
|
||||||
order to make 64-bit ports compatible with 32-bit ports. Set to 0 for
|
|
||||||
- 64-bit ports where the time types are 64-bits or for any 32-bit ports. */
|
|
||||||
+ 64-bit ports where the time types are 64-bits and new 32-bit ports
|
|
||||||
+ where time_t is 64 bits, and there is no companion architecture with
|
|
||||||
+ 32-bit time_t. */
|
|
||||||
#define __WORDSIZE_TIME64_COMPAT32
|
|
||||||
diff --git a/login/Makefile b/login/Makefile
|
|
||||||
index b26ac42bfc..f91190e3dc 100644
|
|
||||||
--- a/login/Makefile
|
|
||||||
+++ b/login/Makefile
|
|
||||||
@@ -44,7 +44,9 @@ subdir-dirs = programs
|
|
||||||
vpath %.c programs
|
|
||||||
|
|
||||||
tests := tst-utmp tst-utmpx tst-grantpt tst-ptsname tst-getlogin tst-updwtmpx \
|
|
||||||
- tst-pututxline-lockfail tst-pututxline-cache tst-utmp-size
|
|
||||||
+ tst-pututxline-lockfail tst-pututxline-cache tst-utmp-size tst-utmp-size-64
|
|
||||||
+
|
|
||||||
+CFLAGS-tst-utmp-size-64.c += -D_FILE_OFFSET_BITS=64 -D_TIME_BITS=64
|
|
||||||
|
|
||||||
# Empty compatibility library for old binaries.
|
|
||||||
extra-libs := libutil
|
|
||||||
diff --git a/login/tst-utmp-size-64.c b/login/tst-utmp-size-64.c
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000000..7a581a4c12
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/login/tst-utmp-size-64.c
|
|
||||||
@@ -0,0 +1,2 @@
|
|
||||||
+/* The on-disk layout must not change in time64 mode. */
|
|
||||||
+#include "tst-utmp-size.c"
|
|
||||||
diff --git a/sysdeps/arm/bits/wordsize.h b/sysdeps/arm/bits/wordsize.h
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000000..6ecbfe7c86
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/sysdeps/arm/bits/wordsize.h
|
|
||||||
@@ -0,0 +1,21 @@
|
|
||||||
+/* Copyright (C) 1999-2024 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/>. */
|
|
||||||
+
|
|
||||||
+#define __WORDSIZE 32
|
|
||||||
+#define __WORDSIZE_TIME64_COMPAT32 1
|
|
||||||
+#define __WORDSIZE32_SIZE_ULONG 0
|
|
||||||
+#define __WORDSIZE32_PTRDIFF_LONG 0
|
|
||||||
diff --git a/sysdeps/csky/bits/wordsize.h b/sysdeps/csky/bits/wordsize.h
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000000..6ecbfe7c86
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/sysdeps/csky/bits/wordsize.h
|
|
||||||
@@ -0,0 +1,21 @@
|
|
||||||
+/* Copyright (C) 1999-2024 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/>. */
|
|
||||||
+
|
|
||||||
+#define __WORDSIZE 32
|
|
||||||
+#define __WORDSIZE_TIME64_COMPAT32 1
|
|
||||||
+#define __WORDSIZE32_SIZE_ULONG 0
|
|
||||||
+#define __WORDSIZE32_PTRDIFF_LONG 0
|
|
||||||
diff --git a/sysdeps/m68k/bits/wordsize.h b/sysdeps/m68k/bits/wordsize.h
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000000..6ecbfe7c86
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/sysdeps/m68k/bits/wordsize.h
|
|
||||||
@@ -0,0 +1,21 @@
|
|
||||||
+/* Copyright (C) 1999-2024 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/>. */
|
|
||||||
+
|
|
||||||
+#define __WORDSIZE 32
|
|
||||||
+#define __WORDSIZE_TIME64_COMPAT32 1
|
|
||||||
+#define __WORDSIZE32_SIZE_ULONG 0
|
|
||||||
+#define __WORDSIZE32_PTRDIFF_LONG 0
|
|
||||||
diff --git a/sysdeps/microblaze/bits/wordsize.h b/sysdeps/microblaze/bits/wordsize.h
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000000..6ecbfe7c86
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/sysdeps/microblaze/bits/wordsize.h
|
|
||||||
@@ -0,0 +1,21 @@
|
|
||||||
+/* Copyright (C) 1999-2024 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/>. */
|
|
||||||
+
|
|
||||||
+#define __WORDSIZE 32
|
|
||||||
+#define __WORDSIZE_TIME64_COMPAT32 1
|
|
||||||
+#define __WORDSIZE32_SIZE_ULONG 0
|
|
||||||
+#define __WORDSIZE32_PTRDIFF_LONG 0
|
|
||||||
diff --git a/sysdeps/mips/bits/wordsize.h b/sysdeps/mips/bits/wordsize.h
|
|
||||||
index 57f0f2a22f..30dd3fd85d 100644
|
|
||||||
--- a/sysdeps/mips/bits/wordsize.h
|
|
||||||
+++ b/sysdeps/mips/bits/wordsize.h
|
|
||||||
@@ -19,11 +19,7 @@
|
|
||||||
|
|
||||||
#define __WORDSIZE _MIPS_SZPTR
|
|
||||||
|
|
||||||
-#if _MIPS_SIM == _ABI64
|
|
||||||
-# define __WORDSIZE_TIME64_COMPAT32 1
|
|
||||||
-#else
|
|
||||||
-# define __WORDSIZE_TIME64_COMPAT32 0
|
|
||||||
-#endif
|
|
||||||
+#define __WORDSIZE_TIME64_COMPAT32 1
|
|
||||||
|
|
||||||
#if __WORDSIZE == 32
|
|
||||||
#define __WORDSIZE32_SIZE_ULONG 0
|
|
||||||
diff --git a/sysdeps/nios2/bits/wordsize.h b/sysdeps/nios2/bits/wordsize.h
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000000..6ecbfe7c86
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/sysdeps/nios2/bits/wordsize.h
|
|
||||||
@@ -0,0 +1,21 @@
|
|
||||||
+/* Copyright (C) 1999-2024 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/>. */
|
|
||||||
+
|
|
||||||
+#define __WORDSIZE 32
|
|
||||||
+#define __WORDSIZE_TIME64_COMPAT32 1
|
|
||||||
+#define __WORDSIZE32_SIZE_ULONG 0
|
|
||||||
+#define __WORDSIZE32_PTRDIFF_LONG 0
|
|
||||||
diff --git a/sysdeps/powerpc/powerpc32/bits/wordsize.h b/sysdeps/powerpc/powerpc32/bits/wordsize.h
|
|
||||||
index 04ca9debf0..6993fb6b29 100644
|
|
||||||
--- a/sysdeps/powerpc/powerpc32/bits/wordsize.h
|
|
||||||
+++ b/sysdeps/powerpc/powerpc32/bits/wordsize.h
|
|
||||||
@@ -2,10 +2,9 @@
|
|
||||||
|
|
||||||
#if defined __powerpc64__
|
|
||||||
# define __WORDSIZE 64
|
|
||||||
-# define __WORDSIZE_TIME64_COMPAT32 1
|
|
||||||
#else
|
|
||||||
# define __WORDSIZE 32
|
|
||||||
-# define __WORDSIZE_TIME64_COMPAT32 0
|
|
||||||
# define __WORDSIZE32_SIZE_ULONG 0
|
|
||||||
# define __WORDSIZE32_PTRDIFF_LONG 0
|
|
||||||
#endif
|
|
||||||
+#define __WORDSIZE_TIME64_COMPAT32 1
|
|
||||||
diff --git a/sysdeps/powerpc/powerpc64/bits/wordsize.h b/sysdeps/powerpc/powerpc64/bits/wordsize.h
|
|
||||||
index 04ca9debf0..6993fb6b29 100644
|
|
||||||
--- a/sysdeps/powerpc/powerpc64/bits/wordsize.h
|
|
||||||
+++ b/sysdeps/powerpc/powerpc64/bits/wordsize.h
|
|
||||||
@@ -2,10 +2,9 @@
|
|
||||||
|
|
||||||
#if defined __powerpc64__
|
|
||||||
# define __WORDSIZE 64
|
|
||||||
-# define __WORDSIZE_TIME64_COMPAT32 1
|
|
||||||
#else
|
|
||||||
# define __WORDSIZE 32
|
|
||||||
-# define __WORDSIZE_TIME64_COMPAT32 0
|
|
||||||
# define __WORDSIZE32_SIZE_ULONG 0
|
|
||||||
# define __WORDSIZE32_PTRDIFF_LONG 0
|
|
||||||
#endif
|
|
||||||
+#define __WORDSIZE_TIME64_COMPAT32 1
|
|
||||||
diff --git a/sysdeps/sh/bits/wordsize.h b/sysdeps/sh/bits/wordsize.h
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000000..6ecbfe7c86
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/sysdeps/sh/bits/wordsize.h
|
|
||||||
@@ -0,0 +1,21 @@
|
|
||||||
+/* Copyright (C) 1999-2024 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/>. */
|
|
||||||
+
|
|
||||||
+#define __WORDSIZE 32
|
|
||||||
+#define __WORDSIZE_TIME64_COMPAT32 1
|
|
||||||
+#define __WORDSIZE32_SIZE_ULONG 0
|
|
||||||
+#define __WORDSIZE32_PTRDIFF_LONG 0
|
|
||||||
diff --git a/sysdeps/sparc/sparc32/bits/wordsize.h b/sysdeps/sparc/sparc32/bits/wordsize.h
|
|
||||||
index 4bbd2e63b4..a2e79e0fa9 100644
|
|
||||||
--- a/sysdeps/sparc/sparc32/bits/wordsize.h
|
|
||||||
+++ b/sysdeps/sparc/sparc32/bits/wordsize.h
|
|
||||||
@@ -1,6 +1,6 @@
|
|
||||||
/* Determine the wordsize from the preprocessor defines. */
|
|
||||||
|
|
||||||
#define __WORDSIZE 32
|
|
||||||
-#define __WORDSIZE_TIME64_COMPAT32 0
|
|
||||||
+#define __WORDSIZE_TIME64_COMPAT32 1
|
|
||||||
#define __WORDSIZE32_SIZE_ULONG 0
|
|
||||||
#define __WORDSIZE32_PTRDIFF_LONG 0
|
|
||||||
diff --git a/sysdeps/sparc/sparc64/bits/wordsize.h b/sysdeps/sparc/sparc64/bits/wordsize.h
|
|
||||||
index 2f66f10d72..ea103e5970 100644
|
|
||||||
--- a/sysdeps/sparc/sparc64/bits/wordsize.h
|
|
||||||
+++ b/sysdeps/sparc/sparc64/bits/wordsize.h
|
|
||||||
@@ -2,10 +2,9 @@
|
|
||||||
|
|
||||||
#if defined __arch64__ || defined __sparcv9
|
|
||||||
# define __WORDSIZE 64
|
|
||||||
-# define __WORDSIZE_TIME64_COMPAT32 1
|
|
||||||
#else
|
|
||||||
# define __WORDSIZE 32
|
|
||||||
-# define __WORDSIZE_TIME64_COMPAT32 0
|
|
||||||
# define __WORDSIZE32_SIZE_ULONG 0
|
|
||||||
# define __WORDSIZE32_PTRDIFF_LONG 0
|
|
||||||
#endif
|
|
||||||
+#define __WORDSIZE_TIME64_COMPAT32 1
|
|
||||||
diff --git a/sysdeps/unix/sysv/linux/hppa/bits/wordsize.h b/sysdeps/unix/sysv/linux/hppa/bits/wordsize.h
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000000..6ecbfe7c86
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/sysdeps/unix/sysv/linux/hppa/bits/wordsize.h
|
|
||||||
@@ -0,0 +1,21 @@
|
|
||||||
+/* Copyright (C) 1999-2024 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/>. */
|
|
||||||
+
|
|
||||||
+#define __WORDSIZE 32
|
|
||||||
+#define __WORDSIZE_TIME64_COMPAT32 1
|
|
||||||
+#define __WORDSIZE32_SIZE_ULONG 0
|
|
||||||
+#define __WORDSIZE32_PTRDIFF_LONG 0
|
|
||||||
diff --git a/sysdeps/unix/sysv/linux/powerpc/bits/wordsize.h b/sysdeps/unix/sysv/linux/powerpc/bits/wordsize.h
|
|
||||||
index 04ca9debf0..6993fb6b29 100644
|
|
||||||
--- a/sysdeps/unix/sysv/linux/powerpc/bits/wordsize.h
|
|
||||||
+++ b/sysdeps/unix/sysv/linux/powerpc/bits/wordsize.h
|
|
||||||
@@ -2,10 +2,9 @@
|
|
||||||
|
|
||||||
#if defined __powerpc64__
|
|
||||||
# define __WORDSIZE 64
|
|
||||||
-# define __WORDSIZE_TIME64_COMPAT32 1
|
|
||||||
#else
|
|
||||||
# define __WORDSIZE 32
|
|
||||||
-# define __WORDSIZE_TIME64_COMPAT32 0
|
|
||||||
# define __WORDSIZE32_SIZE_ULONG 0
|
|
||||||
# define __WORDSIZE32_PTRDIFF_LONG 0
|
|
||||||
#endif
|
|
||||||
+#define __WORDSIZE_TIME64_COMPAT32 1
|
|
||||||
diff --git a/sysdeps/unix/sysv/linux/sparc/bits/wordsize.h b/sysdeps/unix/sysv/linux/sparc/bits/wordsize.h
|
|
||||||
index 7562875ee2..ea103e5970 100644
|
|
||||||
--- a/sysdeps/unix/sysv/linux/sparc/bits/wordsize.h
|
|
||||||
+++ b/sysdeps/unix/sysv/linux/sparc/bits/wordsize.h
|
|
||||||
@@ -2,10 +2,9 @@
|
|
||||||
|
|
||||||
#if defined __arch64__ || defined __sparcv9
|
|
||||||
# define __WORDSIZE 64
|
|
||||||
-# define __WORDSIZE_TIME64_COMPAT32 1
|
|
||||||
#else
|
|
||||||
# define __WORDSIZE 32
|
|
||||||
# define __WORDSIZE32_SIZE_ULONG 0
|
|
||||||
# define __WORDSIZE32_PTRDIFF_LONG 0
|
|
||||||
-# define __WORDSIZE_TIME64_COMPAT32 0
|
|
||||||
#endif
|
|
||||||
+#define __WORDSIZE_TIME64_COMPAT32 1
|
|
||||||
diff --git a/sysdeps/x86/bits/wordsize.h b/sysdeps/x86/bits/wordsize.h
|
|
||||||
index 70f652bca1..3f40aa76f9 100644
|
|
||||||
--- a/sysdeps/x86/bits/wordsize.h
|
|
||||||
+++ b/sysdeps/x86/bits/wordsize.h
|
|
||||||
@@ -8,10 +8,9 @@
|
|
||||||
#define __WORDSIZE32_PTRDIFF_LONG 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
+#define __WORDSIZE_TIME64_COMPAT32 1
|
|
||||||
+
|
|
||||||
#ifdef __x86_64__
|
|
||||||
-# define __WORDSIZE_TIME64_COMPAT32 1
|
|
||||||
/* Both x86-64 and x32 use the 64-bit system call interface. */
|
|
||||||
# define __SYSCALL_WORDSIZE 64
|
|
||||||
-#else
|
|
||||||
-# define __WORDSIZE_TIME64_COMPAT32 0
|
|
||||||
#endif
|
|
||||||
--
|
|
||||||
2.45.0
|
|
||||||
|
|
Reference in New Issue
Block a user