mirror of
https://github.com/void-linux/void-packages.git
synced 2025-06-13 10:33:50 +02:00
musl: update to 1.2.5.
This commit is contained in:
parent
3344a31c41
commit
0780d5d7ac
40 changed files with 69 additions and 3409 deletions
|
@ -16,7 +16,7 @@
|
|||
# PLEASE NOTE: when multiple packages provide the same SONAME, the first
|
||||
# one (order top->bottom) is preferred over the next ones.
|
||||
#
|
||||
libc.so musl-1.1.24_7
|
||||
libc.so musl-1.2.5_1
|
||||
libc.so.6 glibc-2.41_1
|
||||
libm.so.6 glibc-2.41_1
|
||||
libpthread.so.0 glibc-2.41_1
|
||||
|
|
|
@ -1,42 +0,0 @@
|
|||
From 821083ac7b54eaa040d5a8ddc67c6206a175e0ca Mon Sep 17 00:00:00 2001
|
||||
From: Ariadne Conill <ariadne@dereferenced.org>
|
||||
Date: Sat, 1 Aug 2020 08:26:35 -0600
|
||||
Subject: [PATCH] implement reallocarray
|
||||
|
||||
reallocarray is an extension introduced by OpenBSD, which introduces
|
||||
calloc overflow checking to realloc.
|
||||
|
||||
glibc 2.28 introduced support for this function behind _GNU_SOURCE,
|
||||
while glibc 2.29 allows its usage in _DEFAULT_SOURCE.
|
||||
|
||||
diff --git a/include/stdlib.h b/include/stdlib.h
|
||||
index 194c2033..b54a051f 100644
|
||||
--- a/include/stdlib.h
|
||||
+++ b/include/stdlib.h
|
||||
@@ -145,6 +145,7 @@ int getloadavg(double *, int);
|
||||
int clearenv(void);
|
||||
#define WCOREDUMP(s) ((s) & 0x80)
|
||||
#define WIFCONTINUED(s) ((s) == 0xffff)
|
||||
+void *reallocarray (void *, size_t, size_t);
|
||||
#endif
|
||||
|
||||
#ifdef _GNU_SOURCE
|
||||
diff --git a/src/malloc/reallocarray.c b/src/malloc/reallocarray.c
|
||||
new file mode 100644
|
||||
index 00000000..4a6ebe46
|
||||
--- /dev/null
|
||||
+++ b/src/malloc/reallocarray.c
|
||||
@@ -0,0 +1,13 @@
|
||||
+#define _BSD_SOURCE
|
||||
+#include <errno.h>
|
||||
+#include <stdlib.h>
|
||||
+
|
||||
+void *reallocarray(void *ptr, size_t m, size_t n)
|
||||
+{
|
||||
+ if (n && m > -1 / n) {
|
||||
+ errno = ENOMEM;
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ return realloc(ptr, m * n);
|
||||
+}
|
|
@ -1,56 +0,0 @@
|
|||
>From 4d5aa20a94a2d3fae3e69289dc23ecafbd0c16c4 Mon Sep 17 00:00:00 2001
|
||||
From: Rich Felker <dalias@aerifal.cx>
|
||||
Date: Fri, 22 May 2020 17:35:14 -0400
|
||||
Subject: [PATCH 1/4] reorder thread list unlink in pthread_exit after all
|
||||
locks
|
||||
|
||||
since the backend for LOCK() skips locking if single-threaded, it's
|
||||
unsafe to make the process appear single-threaded before the last use
|
||||
of lock.
|
||||
|
||||
this fixes potential unsynchronized access to a linked list via
|
||||
__dl_thread_cleanup.
|
||||
---
|
||||
src/thread/pthread_create.c | 19 +++++++++++--------
|
||||
1 file changed, 11 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/src/thread/pthread_create.c b/src/thread/pthread_create.c
|
||||
index 5f491092..6a3b0c21 100644
|
||||
--- a/src/thread/pthread_create.c
|
||||
+++ b/src/thread/pthread_create.c
|
||||
@@ -90,14 +90,7 @@ _Noreturn void __pthread_exit(void *result)
|
||||
exit(0);
|
||||
}
|
||||
|
||||
- /* At this point we are committed to thread termination. Unlink
|
||||
- * the thread from the list. This change will not be visible
|
||||
- * until the lock is released, which only happens after SYS_exit
|
||||
- * has been called, via the exit futex address pointing at the lock. */
|
||||
- libc.threads_minus_1--;
|
||||
- self->next->prev = self->prev;
|
||||
- self->prev->next = self->next;
|
||||
- self->prev = self->next = self;
|
||||
+ /* At this point we are committed to thread termination. */
|
||||
|
||||
/* Process robust list in userspace to handle non-pshared mutexes
|
||||
* and the detached thread case where the robust list head will
|
||||
@@ -121,6 +114,16 @@ _Noreturn void __pthread_exit(void *result)
|
||||
__do_orphaned_stdio_locks();
|
||||
__dl_thread_cleanup();
|
||||
|
||||
+ /* Last, unlink thread from the list. This change will not be visible
|
||||
+ * until the lock is released, which only happens after SYS_exit
|
||||
+ * has been called, via the exit futex address pointing at the lock.
|
||||
+ * This needs to happen after any possible calls to LOCK() that might
|
||||
+ * skip locking if libc.threads_minus_1 is zero. */
|
||||
+ libc.threads_minus_1--;
|
||||
+ self->next->prev = self->prev;
|
||||
+ self->prev->next = self->next;
|
||||
+ self->prev = self->next = self;
|
||||
+
|
||||
/* This atomic potentially competes with a concurrent pthread_detach
|
||||
* call; the loser is responsible for freeing thread resources. */
|
||||
int state = a_cas(&self->detach_state, DT_JOINABLE, DT_EXITING);
|
||||
--
|
||||
2.21.0
|
||||
|
|
@ -1,78 +0,0 @@
|
|||
>From e01b5939b38aea5ecbe41670643199825874b26c Mon Sep 17 00:00:00 2001
|
||||
From: Rich Felker <dalias@aerifal.cx>
|
||||
Date: Thu, 21 May 2020 23:32:45 -0400
|
||||
Subject: [PATCH 2/4] don't use libc.threads_minus_1 as relaxed atomic for
|
||||
skipping locks
|
||||
|
||||
after all but the last thread exits, the next thread to observe
|
||||
libc.threads_minus_1==0 and conclude that it can skip locking fails to
|
||||
synchronize with any changes to memory that were made by the
|
||||
last-exiting thread. this can produce data races.
|
||||
|
||||
on some archs, at least x86, memory synchronization is unlikely to be
|
||||
a problem; however, with the inline locks in malloc, skipping the lock
|
||||
also eliminated the compiler barrier, and caused code that needed to
|
||||
re-check chunk in-use bits after obtaining the lock to reuse a stale
|
||||
value, possibly from before the process became single-threaded. this
|
||||
in turn produced corruption of the heap state.
|
||||
|
||||
some uses of libc.threads_minus_1 remain, especially for allocation of
|
||||
new TLS in the dynamic linker; otherwise, it could be removed
|
||||
entirely. it's made non-volatile to reflect that the remaining
|
||||
accesses are only made under lock on the thread list.
|
||||
|
||||
instead of libc.threads_minus_1, libc.threaded is now used for
|
||||
skipping locks. the difference is that libc.threaded is permanently
|
||||
true once an additional thread has been created. this will produce
|
||||
some performance regression in processes that are mostly
|
||||
single-threaded but occasionally creating threads. in the future it
|
||||
may be possible to bring back the full lock-skipping, but more care
|
||||
needs to be taken to produce a safe design.
|
||||
---
|
||||
src/internal/libc.h | 2 +-
|
||||
src/malloc/malloc.c | 2 +-
|
||||
src/thread/__lock.c | 2 +-
|
||||
3 files changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/src/internal/libc.h b/src/internal/libc.h
|
||||
index ac97dc7e..c0614852 100644
|
||||
--- a/src/internal/libc.h
|
||||
+++ b/src/internal/libc.h
|
||||
@@ -21,7 +21,7 @@ struct __libc {
|
||||
int can_do_threads;
|
||||
int threaded;
|
||||
int secure;
|
||||
- volatile int threads_minus_1;
|
||||
+ int threads_minus_1;
|
||||
size_t *auxv;
|
||||
struct tls_module *tls_head;
|
||||
size_t tls_size, tls_align, tls_cnt;
|
||||
diff --git a/src/malloc/malloc.c b/src/malloc/malloc.c
|
||||
index 96982596..2553a62e 100644
|
||||
--- a/src/malloc/malloc.c
|
||||
+++ b/src/malloc/malloc.c
|
||||
@@ -26,7 +26,7 @@ int __malloc_replaced;
|
||||
|
||||
static inline void lock(volatile int *lk)
|
||||
{
|
||||
- if (libc.threads_minus_1)
|
||||
+ if (libc.threaded)
|
||||
while(a_swap(lk, 1)) __wait(lk, lk+1, 1, 1);
|
||||
}
|
||||
|
||||
diff --git a/src/thread/__lock.c b/src/thread/__lock.c
|
||||
index 45557c88..5b9b144e 100644
|
||||
--- a/src/thread/__lock.c
|
||||
+++ b/src/thread/__lock.c
|
||||
@@ -18,7 +18,7 @@
|
||||
|
||||
void __lock(volatile int *l)
|
||||
{
|
||||
- if (!libc.threads_minus_1) return;
|
||||
+ if (!libc.threaded) return;
|
||||
/* fast path: INT_MIN for the lock, +1 for the congestion */
|
||||
int current = a_cas(l, 0, INT_MIN + 1);
|
||||
if (!current) return;
|
||||
--
|
||||
2.21.0
|
||||
|
|
@ -1,30 +0,0 @@
|
|||
>From f12888e9eb9eed60cc266b899dcafecb4752964a Mon Sep 17 00:00:00 2001
|
||||
From: Rich Felker <dalias@aerifal.cx>
|
||||
Date: Fri, 22 May 2020 17:25:38 -0400
|
||||
Subject: [PATCH 3/4] cut down size of some libc struct members
|
||||
|
||||
these are all flags that can be single-byte values.
|
||||
---
|
||||
src/internal/libc.h | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/src/internal/libc.h b/src/internal/libc.h
|
||||
index c0614852..d47f58e0 100644
|
||||
--- a/src/internal/libc.h
|
||||
+++ b/src/internal/libc.h
|
||||
@@ -18,9 +18,9 @@ struct tls_module {
|
||||
};
|
||||
|
||||
struct __libc {
|
||||
- int can_do_threads;
|
||||
- int threaded;
|
||||
- int secure;
|
||||
+ char can_do_threads;
|
||||
+ char threaded;
|
||||
+ char secure;
|
||||
int threads_minus_1;
|
||||
size_t *auxv;
|
||||
struct tls_module *tls_head;
|
||||
--
|
||||
2.21.0
|
||||
|
|
@ -1,102 +0,0 @@
|
|||
>From 8d81ba8c0bc6fe31136cb15c9c82ef4c24965040 Mon Sep 17 00:00:00 2001
|
||||
From: Rich Felker <dalias@aerifal.cx>
|
||||
Date: Fri, 22 May 2020 17:45:47 -0400
|
||||
Subject: [PATCH 4/4] restore lock-skipping for processes that return to
|
||||
single-threaded state
|
||||
|
||||
the design used here relies on the barrier provided by the first lock
|
||||
operation after the process returns to single-threaded state to
|
||||
synchronize with actions by the last thread that exited. by storing
|
||||
the intent to change modes in the same object used to detect whether
|
||||
locking is needed, it's possible to avoid an extra (possibly costly)
|
||||
memory load after the lock is taken.
|
||||
---
|
||||
src/internal/libc.h | 1 +
|
||||
src/malloc/malloc.c | 5 ++++-
|
||||
src/thread/__lock.c | 4 +++-
|
||||
src/thread/pthread_create.c | 8 ++++----
|
||||
4 files changed, 12 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/src/internal/libc.h b/src/internal/libc.h
|
||||
index d47f58e0..619bba86 100644
|
||||
--- a/src/internal/libc.h
|
||||
+++ b/src/internal/libc.h
|
||||
@@ -21,6 +21,7 @@ struct __libc {
|
||||
char can_do_threads;
|
||||
char threaded;
|
||||
char secure;
|
||||
+ volatile signed char need_locks;
|
||||
int threads_minus_1;
|
||||
size_t *auxv;
|
||||
struct tls_module *tls_head;
|
||||
diff --git a/src/malloc/malloc.c b/src/malloc/malloc.c
|
||||
index 2553a62e..a803d4c9 100644
|
||||
--- a/src/malloc/malloc.c
|
||||
+++ b/src/malloc/malloc.c
|
||||
@@ -26,8 +26,11 @@ int __malloc_replaced;
|
||||
|
||||
static inline void lock(volatile int *lk)
|
||||
{
|
||||
- if (libc.threaded)
|
||||
+ int need_locks = libc.need_locks;
|
||||
+ if (need_locks) {
|
||||
while(a_swap(lk, 1)) __wait(lk, lk+1, 1, 1);
|
||||
+ if (need_locks < 0) libc.need_locks = 0;
|
||||
+ }
|
||||
}
|
||||
|
||||
static inline void unlock(volatile int *lk)
|
||||
diff --git a/src/thread/__lock.c b/src/thread/__lock.c
|
||||
index 5b9b144e..60eece49 100644
|
||||
--- a/src/thread/__lock.c
|
||||
+++ b/src/thread/__lock.c
|
||||
@@ -18,9 +18,11 @@
|
||||
|
||||
void __lock(volatile int *l)
|
||||
{
|
||||
- if (!libc.threaded) return;
|
||||
+ int need_locks = libc.need_locks;
|
||||
+ if (!need_locks) return;
|
||||
/* fast path: INT_MIN for the lock, +1 for the congestion */
|
||||
int current = a_cas(l, 0, INT_MIN + 1);
|
||||
+ if (need_locks < 0) libc.need_locks = 0;
|
||||
if (!current) return;
|
||||
/* A first spin loop, for medium congestion. */
|
||||
for (unsigned i = 0; i < 10; ++i) {
|
||||
diff --git a/src/thread/pthread_create.c b/src/thread/pthread_create.c
|
||||
index 6a3b0c21..6bdfb44f 100644
|
||||
--- a/src/thread/pthread_create.c
|
||||
+++ b/src/thread/pthread_create.c
|
||||
@@ -118,8 +118,8 @@ _Noreturn void __pthread_exit(void *result)
|
||||
* until the lock is released, which only happens after SYS_exit
|
||||
* has been called, via the exit futex address pointing at the lock.
|
||||
* This needs to happen after any possible calls to LOCK() that might
|
||||
- * skip locking if libc.threads_minus_1 is zero. */
|
||||
- libc.threads_minus_1--;
|
||||
+ * skip locking if process appears single-threaded. */
|
||||
+ if (!--libc.threads_minus_1) libc.need_locks = -1;
|
||||
self->next->prev = self->prev;
|
||||
self->prev->next = self->next;
|
||||
self->prev = self->next = self;
|
||||
@@ -339,7 +339,7 @@ int __pthread_create(pthread_t *restrict res, const pthread_attr_t *restrict att
|
||||
~(1UL<<((SIGCANCEL-1)%(8*sizeof(long))));
|
||||
|
||||
__tl_lock();
|
||||
- libc.threads_minus_1++;
|
||||
+ if (!libc.threads_minus_1++) libc.need_locks = 1;
|
||||
ret = __clone((c11 ? start_c11 : start), stack, flags, args, &new->tid, TP_ADJ(new), &__thread_list_lock);
|
||||
|
||||
/* All clone failures translate to EAGAIN. If explicit scheduling
|
||||
@@ -363,7 +363,7 @@ int __pthread_create(pthread_t *restrict res, const pthread_attr_t *restrict att
|
||||
new->next->prev = new;
|
||||
new->prev->next = new;
|
||||
} else {
|
||||
- libc.threads_minus_1--;
|
||||
+ if (!--libc.threads_minus_1) libc.need_locks = 0;
|
||||
}
|
||||
__tl_unlock();
|
||||
__restore_sigs(&set);
|
||||
--
|
||||
2.21.0
|
||||
|
||||
|
|
@ -1,139 +0,0 @@
|
|||
From 98e688a9da5e7b2925dda17a2d6820dddf1fb287 Mon Sep 17 00:00:00 2001
|
||||
From: Ismael Luceno <ismael@iodev.co.uk>
|
||||
Date: Sun, 15 Aug 2021 17:51:57 +0200
|
||||
Subject: [PATCH] define NULL as nullptr when used in C++11 or later
|
||||
|
||||
This should be safer for casting and more compatible with existing code
|
||||
bases that wrongly assume it must be defined as a pointer.
|
||||
---
|
||||
include/locale.h | 4 +++-
|
||||
include/stddef.h | 4 +++-
|
||||
include/stdio.h | 4 +++-
|
||||
include/stdlib.h | 4 +++-
|
||||
include/string.h | 4 +++-
|
||||
include/time.h | 4 +++-
|
||||
include/unistd.h | 4 +++-
|
||||
include/wchar.h | 4 +++-
|
||||
8 files changed, 24 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/include/locale.h b/include/locale.h
|
||||
index ce384381c..11106fea8 100644
|
||||
--- a/include/locale.h
|
||||
+++ b/include/locale.h
|
||||
@@ -7,7 +7,9 @@ extern "C" {
|
||||
|
||||
#include <features.h>
|
||||
|
||||
-#ifdef __cplusplus
|
||||
+#if __cplusplus >= 201103L
|
||||
+#define NULL nullptr
|
||||
+#elif defined(__cplusplus)
|
||||
#define NULL 0L
|
||||
#else
|
||||
#define NULL ((void*)0)
|
||||
diff --git a/include/stddef.h b/include/stddef.h
|
||||
index bd7538535..f25b86396 100644
|
||||
--- a/include/stddef.h
|
||||
+++ b/include/stddef.h
|
||||
@@ -1,7 +1,9 @@
|
||||
#ifndef _STDDEF_H
|
||||
#define _STDDEF_H
|
||||
|
||||
-#ifdef __cplusplus
|
||||
+#if __cplusplus >= 201103L
|
||||
+#define NULL nullptr
|
||||
+#elif defined(__cplusplus)
|
||||
#define NULL 0L
|
||||
#else
|
||||
#define NULL ((void*)0)
|
||||
diff --git a/include/stdio.h b/include/stdio.h
|
||||
index 3604198c3..d1ed01f03 100644
|
||||
--- a/include/stdio.h
|
||||
+++ b/include/stdio.h
|
||||
@@ -25,7 +25,9 @@ extern "C" {
|
||||
|
||||
#include <bits/alltypes.h>
|
||||
|
||||
-#ifdef __cplusplus
|
||||
+#if __cplusplus >= 201103L
|
||||
+#define NULL nullptr
|
||||
+#elif defined(__cplusplus)
|
||||
#define NULL 0L
|
||||
#else
|
||||
#define NULL ((void*)0)
|
||||
diff --git a/include/stdlib.h b/include/stdlib.h
|
||||
index 7af86e3bc..b507ca33b 100644
|
||||
--- a/include/stdlib.h
|
||||
+++ b/include/stdlib.h
|
||||
@@ -7,7 +7,9 @@ extern "C" {
|
||||
|
||||
#include <features.h>
|
||||
|
||||
-#ifdef __cplusplus
|
||||
+#if __cplusplus >= 201103L
|
||||
+#define NULL nullptr
|
||||
+#elif defined(__cplusplus)
|
||||
#define NULL 0L
|
||||
#else
|
||||
#define NULL ((void*)0)
|
||||
diff --git a/include/string.h b/include/string.h
|
||||
index 795a2abcd..43ad0942e 100644
|
||||
--- a/include/string.h
|
||||
+++ b/include/string.h
|
||||
@@ -7,7 +7,9 @@ extern "C" {
|
||||
|
||||
#include <features.h>
|
||||
|
||||
-#ifdef __cplusplus
|
||||
+#if __cplusplus >= 201103L
|
||||
+#define NULL nullptr
|
||||
+#elif defined(__cplusplus)
|
||||
#define NULL 0L
|
||||
#else
|
||||
#define NULL ((void*)0)
|
||||
diff --git a/include/time.h b/include/time.h
|
||||
index 5494df183..3d9483720 100644
|
||||
--- a/include/time.h
|
||||
+++ b/include/time.h
|
||||
@@ -7,7 +7,9 @@ extern "C" {
|
||||
|
||||
#include <features.h>
|
||||
|
||||
-#ifdef __cplusplus
|
||||
+#if __cplusplus >= 201103L
|
||||
+#define NULL nullptr
|
||||
+#elif defined(__cplusplus)
|
||||
#define NULL 0L
|
||||
#else
|
||||
#define NULL ((void*)0)
|
||||
diff --git a/include/unistd.h b/include/unistd.h
|
||||
index 130640260..ee2dbe8af 100644
|
||||
--- a/include/unistd.h
|
||||
+++ b/include/unistd.h
|
||||
@@ -15,7 +15,9 @@ extern "C" {
|
||||
#define SEEK_CUR 1
|
||||
#define SEEK_END 2
|
||||
|
||||
-#ifdef __cplusplus
|
||||
+#if __cplusplus >= 201103L
|
||||
+#define NULL nullptr
|
||||
+#elif defined(__cplusplus)
|
||||
#define NULL 0L
|
||||
#else
|
||||
#define NULL ((void*)0)
|
||||
diff --git a/include/wchar.h b/include/wchar.h
|
||||
index 88eb55b18..ed5d774df 100644
|
||||
--- a/include/wchar.h
|
||||
+++ b/include/wchar.h
|
||||
@@ -38,7 +38,9 @@ extern "C" {
|
||||
#define WCHAR_MIN (-1-0x7fffffff+L'\0')
|
||||
#endif
|
||||
|
||||
-#ifdef __cplusplus
|
||||
+#if __cplusplus >= 201103L
|
||||
+#define NULL nullptr
|
||||
+#elif defined(__cplusplus)
|
||||
#define NULL 0L
|
||||
#else
|
||||
#define NULL ((void*)0)
|
||||
|
|
@ -1,113 +0,0 @@
|
|||
From 99d5098a885feae3ae8c32b407350d8ca85dd178 Mon Sep 17 00:00:00 2001
|
||||
From: Julien Ramseier <j.ramseier@gmail.com>
|
||||
Date: Sun, 18 Oct 2020 12:15:06 -0400
|
||||
Subject: update crypt_blowfish to support $2b$ prefix
|
||||
|
||||
Merge changes from Solar Designer's crypt_blowfish v1.3. This makes
|
||||
crypt_blowfish fully compatible with OpenBSD's bcrypt by adding
|
||||
support for the $2b$ prefix (which behaves the same as
|
||||
crypt_blowfish's $2y$).
|
||||
---
|
||||
src/crypt/crypt_blowfish.c | 38 +++++++++++++++++++++++---------------
|
||||
1 file changed, 23 insertions(+), 15 deletions(-)
|
||||
|
||||
(limited to 'src/crypt/crypt_blowfish.c')
|
||||
|
||||
diff --git a/src/crypt/crypt_blowfish.c b/src/crypt/crypt_blowfish.c
|
||||
index d3f79851..d722607b 100644
|
||||
--- a/src/crypt/crypt_blowfish.c
|
||||
+++ b/src/crypt/crypt_blowfish.c
|
||||
@@ -15,7 +15,7 @@
|
||||
* No copyright is claimed, and the software is hereby placed in the public
|
||||
* domain. In case this attempt to disclaim copyright and place the software
|
||||
* in the public domain is deemed null and void, then the software is
|
||||
- * Copyright (c) 1998-2012 Solar Designer and it is hereby released to the
|
||||
+ * Copyright (c) 1998-2014 Solar Designer and it is hereby released to the
|
||||
* general public under the following terms:
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@@ -31,12 +31,12 @@
|
||||
* you place this code and any modifications you make under a license
|
||||
* of your choice.
|
||||
*
|
||||
- * This implementation is mostly compatible with OpenBSD's bcrypt.c (prefix
|
||||
- * "$2a$") by Niels Provos <provos at citi.umich.edu>, and uses some of his
|
||||
- * ideas. The password hashing algorithm was designed by David Mazieres
|
||||
- * <dm at lcs.mit.edu>. For more information on the level of compatibility,
|
||||
- * please refer to the comments in BF_set_key() below and to the included
|
||||
- * crypt(3) man page.
|
||||
+ * This implementation is fully compatible with OpenBSD's bcrypt.c for prefix
|
||||
+ * "$2b$", originally by Niels Provos <provos at citi.umich.edu>, and it uses
|
||||
+ * some of his ideas. The password hashing algorithm was designed by David
|
||||
+ * Mazieres <dm at lcs.mit.edu>. For information on the level of
|
||||
+ * compatibility for bcrypt hash prefixes other than "$2b$", please refer to
|
||||
+ * the comments in BF_set_key() below and to the included crypt(3) man page.
|
||||
*
|
||||
* There's a paper on the algorithm that explains its design decisions:
|
||||
*
|
||||
@@ -533,6 +533,7 @@ static void BF_set_key(const char *key, BF_key expanded, BF_key initial,
|
||||
* Valid combinations of settings are:
|
||||
*
|
||||
* Prefix "$2a$": bug = 0, safety = 0x10000
|
||||
+ * Prefix "$2b$": bug = 0, safety = 0
|
||||
* Prefix "$2x$": bug = 1, safety = 0
|
||||
* Prefix "$2y$": bug = 0, safety = 0
|
||||
*/
|
||||
@@ -596,12 +597,14 @@ static void BF_set_key(const char *key, BF_key expanded, BF_key initial,
|
||||
initial[0] ^= sign;
|
||||
}
|
||||
|
||||
+static const unsigned char flags_by_subtype[26] = {
|
||||
+ 2, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 0
|
||||
+};
|
||||
+
|
||||
static char *BF_crypt(const char *key, const char *setting,
|
||||
char *output, BF_word min)
|
||||
{
|
||||
- static const unsigned char flags_by_subtype[26] =
|
||||
- {2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 0};
|
||||
struct {
|
||||
BF_ctx ctx;
|
||||
BF_key expanded_key;
|
||||
@@ -746,9 +749,11 @@ char *__crypt_blowfish(const char *key, const char *setting, char *output)
|
||||
{
|
||||
const char *test_key = "8b \xd0\xc1\xd2\xcf\xcc\xd8";
|
||||
const char *test_setting = "$2a$00$abcdefghijklmnopqrstuu";
|
||||
- static const char test_hash[2][34] =
|
||||
- {"VUrPmXD6q/nVSSp7pNDhCR9071IfIRe\0\x55", /* $2x$ */
|
||||
- "i1D709vfamulimlGcq0qq3UvuUasvEa\0\x55"}; /* $2a$, $2y$ */
|
||||
+ static const char test_hashes[2][34] = {
|
||||
+ "i1D709vfamulimlGcq0qq3UvuUasvEa\0\x55", /* 'a', 'b', 'y' */
|
||||
+ "VUrPmXD6q/nVSSp7pNDhCR9071IfIRe\0\x55", /* 'x' */
|
||||
+ };
|
||||
+ const char *test_hash = test_hashes[0];
|
||||
char *retval;
|
||||
const char *p;
|
||||
int ok;
|
||||
@@ -768,8 +773,11 @@ char *__crypt_blowfish(const char *key, const char *setting, char *output)
|
||||
* detected by the self-test.
|
||||
*/
|
||||
memcpy(buf.s, test_setting, sizeof(buf.s));
|
||||
- if (retval)
|
||||
+ if (retval) {
|
||||
+ unsigned int flags = flags_by_subtype[setting[2] - 'a'];
|
||||
+ test_hash = test_hashes[flags & 1];
|
||||
buf.s[2] = setting[2];
|
||||
+ }
|
||||
memset(buf.o, 0x55, sizeof(buf.o));
|
||||
buf.o[sizeof(buf.o) - 1] = 0;
|
||||
p = BF_crypt(test_key, buf.s, buf.o, 1);
|
||||
@@ -777,7 +785,7 @@ char *__crypt_blowfish(const char *key, const char *setting, char *output)
|
||||
ok = (p == buf.o &&
|
||||
!memcmp(p, buf.s, 7 + 22) &&
|
||||
!memcmp(p + (7 + 22),
|
||||
- test_hash[buf.s[2] & 1],
|
||||
+ test_hash,
|
||||
31 + 1 + 1 + 1));
|
||||
|
||||
{
|
||||
--
|
||||
cgit v1.2.1
|
||||
|
|
@ -1,64 +0,0 @@
|
|||
--- a/src/multibyte/wcsnrtombs.c
|
||||
+++ b/src/multibyte/wcsnrtombs.c
|
||||
@@ -1,41 +1,33 @@
|
||||
#include <wchar.h>
|
||||
+#include <limits.h>
|
||||
+#include <string.h>
|
||||
|
||||
size_t wcsnrtombs(char *restrict dst, const wchar_t **restrict wcs, size_t wn, size_t n, mbstate_t *restrict st)
|
||||
{
|
||||
- size_t l, cnt=0, n2;
|
||||
- char *s, buf[256];
|
||||
const wchar_t *ws = *wcs;
|
||||
- const wchar_t *tmp_ws;
|
||||
-
|
||||
- if (!dst) s = buf, n = sizeof buf;
|
||||
- else s = dst;
|
||||
-
|
||||
- while ( ws && n && ( (n2=wn)>=n || n2>32 ) ) {
|
||||
- if (n2>=n) n2=n;
|
||||
- tmp_ws = ws;
|
||||
- l = wcsrtombs(s, &ws, n2, 0);
|
||||
- if (!(l+1)) {
|
||||
- cnt = l;
|
||||
- n = 0;
|
||||
+ size_t cnt = 0;
|
||||
+ if (!dst) n=0;
|
||||
+ while (ws && wn) {
|
||||
+ char tmp[MB_LEN_MAX];
|
||||
+ size_t l = wcrtomb(n<MB_LEN_MAX ? tmp : dst, *ws, 0);
|
||||
+ if (l==-1) {
|
||||
+ cnt = -1;
|
||||
break;
|
||||
}
|
||||
- if (s != buf) {
|
||||
- s += l;
|
||||
+ if (dst) {
|
||||
+ if (n<MB_LEN_MAX) {
|
||||
+ if (l>n) break;
|
||||
+ memcpy(dst, tmp, l);
|
||||
+ }
|
||||
+ dst += l;
|
||||
n -= l;
|
||||
}
|
||||
- wn = ws ? wn - (ws - tmp_ws) : 0;
|
||||
- cnt += l;
|
||||
- }
|
||||
- if (ws) while (n && wn) {
|
||||
- l = wcrtomb(s, *ws, 0);
|
||||
- if ((l+1)<=1) {
|
||||
- if (!l) ws = 0;
|
||||
- else cnt = l;
|
||||
+ if (!*ws) {
|
||||
+ ws = 0;
|
||||
break;
|
||||
}
|
||||
- ws++; wn--;
|
||||
- /* safe - this loop runs fewer than sizeof(buf) times */
|
||||
- s+=l; n-=l;
|
||||
+ ws++;
|
||||
+ wn--;
|
||||
cnt += l;
|
||||
}
|
||||
if (dst) *wcs = ws;
|
||||
|
|
@ -1,37 +0,0 @@
|
|||
Use types compatible with glibc/kernel headers.
|
||||
|
||||
diff --git a/arch/aarch64/bits/signal.h b/arch/aarch64/bits/signal.h
|
||||
index b71261f5..5098c734 100644
|
||||
--- a/arch/aarch64/bits/signal.h
|
||||
+++ b/arch/aarch64/bits/signal.h
|
||||
@@ -11,7 +11,7 @@ typedef unsigned long greg_t;
|
||||
typedef unsigned long gregset_t[34];
|
||||
|
||||
typedef struct {
|
||||
- long double vregs[32];
|
||||
+ __uint128_t vregs[32];
|
||||
unsigned int fpsr;
|
||||
unsigned int fpcr;
|
||||
} fpregset_t;
|
||||
@@ -34,7 +34,7 @@ struct fpsimd_context {
|
||||
struct _aarch64_ctx head;
|
||||
unsigned int fpsr;
|
||||
unsigned int fpcr;
|
||||
- long double vregs[32];
|
||||
+ __uint128_t vregs[32];
|
||||
};
|
||||
struct esr_context {
|
||||
struct _aarch64_ctx head;
|
||||
diff --git a/arch/aarch64/bits/user.h b/arch/aarch64/bits/user.h
|
||||
index d12cdf7f..8a1002aa 100644
|
||||
--- a/arch/aarch64/bits/user.h
|
||||
+++ b/arch/aarch64/bits/user.h
|
||||
@@ -6,7 +6,7 @@ struct user_regs_struct {
|
||||
};
|
||||
|
||||
struct user_fpsimd_struct {
|
||||
- long double vregs[32];
|
||||
+ __uint128_t vregs[32];
|
||||
unsigned int fpsr;
|
||||
unsigned int fpcr;
|
||||
};
|
|
@ -1,77 +0,0 @@
|
|||
From 81cced6ebeb4419a78a8892ec7d7e28f5582d24a Mon Sep 17 00:00:00 2001
|
||||
From: Rich Felker <dalias@aerifal.cx>
|
||||
Date: Thu, 25 Jan 2024 12:02:34 -0500
|
||||
Subject: [PATCH] add preadv2 and pwritev2 syscall wrappers, flag value macros
|
||||
|
||||
---
|
||||
include/sys/uio.h | 7 +++++++
|
||||
src/linux/preadv2.c | 17 +++++++++++++++++
|
||||
src/linux/pwritev2.c | 17 +++++++++++++++++
|
||||
3 files changed, 41 insertions(+)
|
||||
create mode 100644 src/linux/preadv2.c
|
||||
create mode 100644 src/linux/pwritev2.c
|
||||
|
||||
diff --git a/include/sys/uio.h b/include/sys/uio.h
|
||||
index 90e5939ed..8b5e3de79 100644
|
||||
--- a/include/sys/uio.h
|
||||
+++ b/include/sys/uio.h
|
||||
@@ -39,6 +39,13 @@ ssize_t pwritev (int, const struct iovec *, int, off_t);
|
||||
#ifdef _GNU_SOURCE
|
||||
ssize_t process_vm_writev(pid_t, const struct iovec *, unsigned long, const struct iovec *, unsigned long, unsigned long);
|
||||
ssize_t process_vm_readv(pid_t, const struct iovec *, unsigned long, const struct iovec *, unsigned long, unsigned long);
|
||||
+ssize_t preadv2 (int, const struct iovec *, int, off_t, int);
|
||||
+ssize_t pwritev2 (int, const struct iovec *, int, off_t, int);
|
||||
+#define RWF_HIPRI 0x00000001
|
||||
+#define RWF_DSYNC 0x00000002
|
||||
+#define RWF_SYNC 0x00000004
|
||||
+#define RWF_NOWAIT 0x00000008
|
||||
+#define RWF_APPEND 0x00000010
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
diff --git a/src/linux/preadv2.c b/src/linux/preadv2.c
|
||||
new file mode 100644
|
||||
index 000000000..5e7ab70f1
|
||||
--- /dev/null
|
||||
+++ b/src/linux/preadv2.c
|
||||
@@ -0,0 +1,17 @@
|
||||
+#define _GNU_SOURCE
|
||||
+#include <sys/uio.h>
|
||||
+#include <unistd.h>
|
||||
+#include "syscall.h"
|
||||
+
|
||||
+ssize_t preadv2(int fd, const struct iovec *iov, int count, off_t ofs, int flags)
|
||||
+{
|
||||
+#ifdef SYS_preadv
|
||||
+ if (!flags) {
|
||||
+ if (ofs==-1) return readv(fd, iov, count);
|
||||
+ return syscall_cp(SYS_preadv, fd, iov, count,
|
||||
+ (long)(ofs), (long)(ofs>>32));
|
||||
+ }
|
||||
+#endif
|
||||
+ return syscall_cp(SYS_preadv2, fd, iov, count,
|
||||
+ (long)(ofs), (long)(ofs>>32), flags);
|
||||
+}
|
||||
diff --git a/src/linux/pwritev2.c b/src/linux/pwritev2.c
|
||||
new file mode 100644
|
||||
index 000000000..ece90d7ca
|
||||
--- /dev/null
|
||||
+++ b/src/linux/pwritev2.c
|
||||
@@ -0,0 +1,17 @@
|
||||
+#define _GNU_SOURCE
|
||||
+#include <sys/uio.h>
|
||||
+#include <unistd.h>
|
||||
+#include "syscall.h"
|
||||
+
|
||||
+ssize_t pwritev2(int fd, const struct iovec *iov, int count, off_t ofs, int flags)
|
||||
+{
|
||||
+#ifdef SYS_pwritev
|
||||
+ if (!flags) {
|
||||
+ if (ofs==-1) return writev(fd, iov, count);
|
||||
+ return syscall_cp(SYS_pwritev, fd, iov, count,
|
||||
+ (long)(ofs), (long)(ofs>>32));
|
||||
+ }
|
||||
+#endif
|
||||
+ return syscall_cp(SYS_pwritev2, fd, iov, count,
|
||||
+ (long)(ofs), (long)(ofs>>32), flags);
|
||||
+}
|
|
@ -1,55 +0,0 @@
|
|||
From bd3b9c4ca5e93f10f7fd891b8c07cc0c5dfd198f Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?=C3=89rico=20Rolim?= <ericonr@disroot.org>
|
||||
Date: Tue, 20 Apr 2021 16:15:15 -0300
|
||||
Subject: [PATCH] add pthread_getname_np function
|
||||
|
||||
based on the pthread_setname_np implementation
|
||||
---
|
||||
include/pthread.h | 1 +
|
||||
src/thread/pthread_getname_np.c | 25 +++++++++++++++++++++++++
|
||||
2 files changed, 26 insertions(+)
|
||||
create mode 100644 src/thread/pthread_getname_np.c
|
||||
|
||||
diff --git a/include/pthread.h b/include/pthread.h
|
||||
index 0492f26a6..89fd9ff7c 100644
|
||||
--- a/include/pthread.h
|
||||
+++ b/include/pthread.h
|
||||
@@ -221,6 +221,7 @@ int pthread_getaffinity_np(pthread_t, size_t, struct cpu_set_t *);
|
||||
int pthread_setaffinity_np(pthread_t, size_t, const struct cpu_set_t *);
|
||||
int pthread_getattr_np(pthread_t, pthread_attr_t *);
|
||||
int pthread_setname_np(pthread_t, const char *);
|
||||
+int pthread_getname_np(pthread_t, char *, size_t);
|
||||
int pthread_getattr_default_np(pthread_attr_t *);
|
||||
int pthread_setattr_default_np(const pthread_attr_t *);
|
||||
int pthread_tryjoin_np(pthread_t, void **);
|
||||
diff --git a/src/thread/pthread_getname_np.c b/src/thread/pthread_getname_np.c
|
||||
new file mode 100644
|
||||
index 000000000..48d1a294f
|
||||
--- /dev/null
|
||||
+++ b/src/thread/pthread_getname_np.c
|
||||
@@ -0,0 +1,25 @@
|
||||
+#define _GNU_SOURCE
|
||||
+#include <fcntl.h>
|
||||
+#include <unistd.h>
|
||||
+#include <sys/prctl.h>
|
||||
+
|
||||
+#include "pthread_impl.h"
|
||||
+
|
||||
+int pthread_getname_np(pthread_t thread, char *name, size_t len)
|
||||
+{
|
||||
+ int fd, cs, status = 0;
|
||||
+ char f[sizeof "/proc/self/task//comm" + 3*sizeof(int)];
|
||||
+
|
||||
+ if (len < 16) return ERANGE;
|
||||
+
|
||||
+ if (thread == pthread_self())
|
||||
+ return prctl(PR_GET_NAME, (unsigned long)name, 0UL, 0UL, 0UL) ? errno : 0;
|
||||
+
|
||||
+ snprintf(f, sizeof f, "/proc/self/task/%d/comm", thread->tid);
|
||||
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
|
||||
+ if ((fd = open(f, O_RDONLY|O_CLOEXEC)) < 0 || (len = read(fd, name, len)) < 0) status = errno;
|
||||
+ else name[len-1] = 0; /* remove trailing new line only if successful */
|
||||
+ if (fd >= 0) close(fd);
|
||||
+ pthread_setcancelstate(cs, 0);
|
||||
+ return status;
|
||||
+}
|
|
@ -1,201 +0,0 @@
|
|||
From b76f37fd5625d038141b52184956fb4b7838e9a5 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?=C3=89rico=20Nogueira?= <ericonr@disroot.org>
|
||||
Date: Tue, 9 Mar 2021 18:02:13 -0300
|
||||
Subject: [PATCH] add qsort_r and make qsort a wrapper around it
|
||||
|
||||
we make qsort a wrapper by providing a wrapper_cmp function that uses
|
||||
the extra argument as a function pointer. should be optimized to a tail
|
||||
call on most architectures, as long as it's built with
|
||||
-fomit-frame-pointer, so the performance impact should be minimal.
|
||||
|
||||
to keep the git history clean, for now qsort_r is implemented in qsort.c
|
||||
and qsort is implemented in qsort_nr.c. qsort.c also received a few
|
||||
trivial cleanups, including replacing (*cmp)() calls with cmp().
|
||||
qsort_nr.c contains only wrapper_cmp and qsort as a qsort_r wrapper
|
||||
itself.
|
||||
---
|
||||
include/stdlib.h | 1 +
|
||||
src/include/stdlib.h | 1 +
|
||||
src/stdlib/qsort.c | 37 ++++++++++++++++++++-----------------
|
||||
src/stdlib/qsort_nr.c | 14 ++++++++++++++
|
||||
4 files changed, 36 insertions(+), 17 deletions(-)
|
||||
create mode 100644 src/stdlib/qsort_nr.c
|
||||
|
||||
diff --git a/include/stdlib.h b/include/stdlib.h
|
||||
index b54a051fe..7af86e3bc 100644
|
||||
--- a/include/stdlib.h
|
||||
+++ b/include/stdlib.h
|
||||
@@ -146,6 +146,7 @@ int clearenv(void);
|
||||
#define WCOREDUMP(s) ((s) & 0x80)
|
||||
#define WIFCONTINUED(s) ((s) == 0xffff)
|
||||
void *reallocarray (void *, size_t, size_t);
|
||||
+void qsort_r (void *, size_t, size_t, int (*)(const void *, const void *, void *), void *);
|
||||
#endif
|
||||
|
||||
#ifdef _GNU_SOURCE
|
||||
diff --git a/src/include/stdlib.h b/src/include/stdlib.h
|
||||
index e9da20158..812b04de2 100644
|
||||
--- a/src/include/stdlib.h
|
||||
+++ b/src/include/stdlib.h
|
||||
@@ -8,6 +8,7 @@ hidden void __env_rm_add(char *, char *);
|
||||
hidden int __mkostemps(char *, int, int);
|
||||
hidden int __ptsname_r(int, char *, size_t);
|
||||
hidden char *__randname(char *);
|
||||
+hidden void __qsort_r (void *, size_t, size_t, int (*)(const void *, const void *, void *), void *);
|
||||
|
||||
hidden void *__libc_malloc(size_t);
|
||||
hidden void *__libc_malloc_impl(size_t);
|
||||
diff --git a/src/stdlib/qsort.c b/src/stdlib/qsort.c
|
||||
index da58fd317..314ddc29d 100644
|
||||
--- a/src/stdlib/qsort.c
|
||||
+++ b/src/stdlib/qsort.c
|
||||
@@ -24,6 +24,7 @@
|
||||
/* Smoothsort, an adaptive variant of Heapsort. Memory usage: O(1).
|
||||
Run time: Worst case O(n log n), close to O(n) in the mostly-sorted case. */
|
||||
|
||||
+#define _BSD_SOURCE
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@@ -31,7 +32,7 @@
|
||||
#include "atomic.h"
|
||||
#define ntz(x) a_ctz_l((x))
|
||||
|
||||
-typedef int (*cmpfun)(const void *, const void *);
|
||||
+typedef int (*cmpfun)(const void *, const void *, void *);
|
||||
|
||||
static inline int pntz(size_t p[2]) {
|
||||
int r = ntz(p[0] - 1);
|
||||
@@ -88,7 +89,7 @@ static inline void shr(size_t p[2], int n)
|
||||
p[1] >>= n;
|
||||
}
|
||||
|
||||
-static void sift(unsigned char *head, size_t width, cmpfun cmp, int pshift, size_t lp[])
|
||||
+static void sift(unsigned char *head, size_t width, cmpfun cmp, void *arg, int pshift, size_t lp[])
|
||||
{
|
||||
unsigned char *rt, *lf;
|
||||
unsigned char *ar[14 * sizeof(size_t) + 1];
|
||||
@@ -99,10 +100,10 @@ static void sift(unsigned char *head, size_t width, cmpfun cmp, int pshift, size
|
||||
rt = head - width;
|
||||
lf = head - width - lp[pshift - 2];
|
||||
|
||||
- if((*cmp)(ar[0], lf) >= 0 && (*cmp)(ar[0], rt) >= 0) {
|
||||
+ if(cmp(ar[0], lf, arg) >= 0 && cmp(ar[0], rt, arg) >= 0) {
|
||||
break;
|
||||
}
|
||||
- if((*cmp)(lf, rt) >= 0) {
|
||||
+ if(cmp(lf, rt, arg) >= 0) {
|
||||
ar[i++] = lf;
|
||||
head = lf;
|
||||
pshift -= 1;
|
||||
@@ -115,7 +116,7 @@ static void sift(unsigned char *head, size_t width, cmpfun cmp, int pshift, size
|
||||
cycle(width, ar, i);
|
||||
}
|
||||
|
||||
-static void trinkle(unsigned char *head, size_t width, cmpfun cmp, size_t pp[2], int pshift, int trusty, size_t lp[])
|
||||
+static void trinkle(unsigned char *head, size_t width, cmpfun cmp, void *arg, size_t pp[2], int pshift, int trusty, size_t lp[])
|
||||
{
|
||||
unsigned char *stepson,
|
||||
*rt, *lf;
|
||||
@@ -130,13 +131,13 @@ static void trinkle(unsigned char *head, size_t width, cmpfun cmp, size_t pp[2],
|
||||
ar[0] = head;
|
||||
while(p[0] != 1 || p[1] != 0) {
|
||||
stepson = head - lp[pshift];
|
||||
- if((*cmp)(stepson, ar[0]) <= 0) {
|
||||
+ if(cmp(stepson, ar[0], arg) <= 0) {
|
||||
break;
|
||||
}
|
||||
if(!trusty && pshift > 1) {
|
||||
rt = head - width;
|
||||
lf = head - width - lp[pshift - 2];
|
||||
- if((*cmp)(rt, stepson) >= 0 || (*cmp)(lf, stepson) >= 0) {
|
||||
+ if(cmp(rt, stepson, arg) >= 0 || cmp(lf, stepson, arg) >= 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -150,11 +151,11 @@ static void trinkle(unsigned char *head, size_t width, cmpfun cmp, size_t pp[2],
|
||||
}
|
||||
if(!trusty) {
|
||||
cycle(width, ar, i);
|
||||
- sift(head, width, cmp, pshift, lp);
|
||||
+ sift(head, width, cmp, arg, pshift, lp);
|
||||
}
|
||||
}
|
||||
|
||||
-void qsort(void *base, size_t nel, size_t width, cmpfun cmp)
|
||||
+void __qsort_r(void *base, size_t nel, size_t width, cmpfun cmp, void *arg)
|
||||
{
|
||||
size_t lp[12*sizeof(size_t)];
|
||||
size_t i, size = width * nel;
|
||||
@@ -173,16 +174,16 @@ void qsort(void *base, size_t nel, size_t width, cmpfun cmp)
|
||||
|
||||
while(head < high) {
|
||||
if((p[0] & 3) == 3) {
|
||||
- sift(head, width, cmp, pshift, lp);
|
||||
+ sift(head, width, cmp, arg, pshift, lp);
|
||||
shr(p, 2);
|
||||
pshift += 2;
|
||||
} else {
|
||||
if(lp[pshift - 1] >= high - head) {
|
||||
- trinkle(head, width, cmp, p, pshift, 0, lp);
|
||||
+ trinkle(head, width, cmp, arg, p, pshift, 0, lp);
|
||||
} else {
|
||||
- sift(head, width, cmp, pshift, lp);
|
||||
+ sift(head, width, cmp, arg, pshift, lp);
|
||||
}
|
||||
-
|
||||
+
|
||||
if(pshift == 1) {
|
||||
shl(p, 1);
|
||||
pshift = 0;
|
||||
@@ -191,12 +192,12 @@ void qsort(void *base, size_t nel, size_t width, cmpfun cmp)
|
||||
pshift = 1;
|
||||
}
|
||||
}
|
||||
-
|
||||
+
|
||||
p[0] |= 1;
|
||||
head += width;
|
||||
}
|
||||
|
||||
- trinkle(head, width, cmp, p, pshift, 0, lp);
|
||||
+ trinkle(head, width, cmp, arg, p, pshift, 0, lp);
|
||||
|
||||
while(pshift != 1 || p[0] != 1 || p[1] != 0) {
|
||||
if(pshift <= 1) {
|
||||
@@ -208,11 +209,13 @@ void qsort(void *base, size_t nel, size_t width, cmpfun cmp)
|
||||
pshift -= 2;
|
||||
p[0] ^= 7;
|
||||
shr(p, 1);
|
||||
- trinkle(head - lp[pshift] - width, width, cmp, p, pshift + 1, 1, lp);
|
||||
+ trinkle(head - lp[pshift] - width, width, cmp, arg, p, pshift + 1, 1, lp);
|
||||
shl(p, 1);
|
||||
p[0] |= 1;
|
||||
- trinkle(head - width, width, cmp, p, pshift, 1, lp);
|
||||
+ trinkle(head - width, width, cmp, arg, p, pshift, 1, lp);
|
||||
}
|
||||
head -= width;
|
||||
}
|
||||
}
|
||||
+
|
||||
+weak_alias(__qsort_r, qsort_r);
|
||||
diff --git a/src/stdlib/qsort_nr.c b/src/stdlib/qsort_nr.c
|
||||
new file mode 100644
|
||||
index 000000000..efe7ccecd
|
||||
--- /dev/null
|
||||
+++ b/src/stdlib/qsort_nr.c
|
||||
@@ -0,0 +1,14 @@
|
||||
+#define _BSD_SOURCE
|
||||
+#include <stdlib.h>
|
||||
+
|
||||
+typedef int (*cmpfun)(const void *, const void *);
|
||||
+
|
||||
+static int wrapper_cmp(const void *v1, const void *v2, void *cmp)
|
||||
+{
|
||||
+ return ((cmpfun)cmp)(v1, v2);
|
||||
+}
|
||||
+
|
||||
+void qsort(void *base, size_t nel, size_t width, cmpfun cmp)
|
||||
+{
|
||||
+ __qsort_r(base, nel, width, wrapper_cmp, cmp);
|
||||
+}
|
|
@ -1,24 +0,0 @@
|
|||
From 2507e7f5312e79620f6337935d0a6c9045ccba09 Mon Sep 17 00:00:00 2001
|
||||
From: Leah Neukirchen <leah@vuxu.org>
|
||||
Date: Sat, 11 Jan 2020 20:16:59 +0100
|
||||
Subject: [PATCH] define RLIMIT_RTTIME, bump RLIMIT_NLIMITS
|
||||
|
||||
This macro exists since Linux 2.6.25 and is defined in glibc since 2011.
|
||||
---
|
||||
include/sys/resource.h | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/include/sys/resource.h b/include/sys/resource.h
|
||||
index e0c86ae33..3068328d0 100644
|
||||
--- a/include/sys/resource.h
|
||||
+++ b/include/sys/resource.h
|
||||
@@ -90,7 +90,8 @@ int prlimit(pid_t, int, const struct rlimit *, struct rlimit *);
|
||||
#define RLIMIT_MSGQUEUE 12
|
||||
#define RLIMIT_NICE 13
|
||||
#define RLIMIT_RTPRIO 14
|
||||
-#define RLIMIT_NLIMITS 15
|
||||
+#define RLIMIT_RTTIME 15
|
||||
+#define RLIMIT_NLIMITS 16
|
||||
|
||||
#define RLIM_NLIMITS RLIMIT_NLIMITS
|
||||
|
|
@ -1,74 +0,0 @@
|
|||
From 7c71792e87691451f2a6b76348e83ad1889f1dcb Mon Sep 17 00:00:00 2001
|
||||
From: James Y Knight <jyknight@google.com>
|
||||
Date: Sun, 30 Jun 2019 21:55:20 -0400
|
||||
Subject: [PATCH] add support for SIGEV_THREAD_ID timers
|
||||
|
||||
This is like SIGEV_SIGNAL, but targeted to a particular thread's
|
||||
tid, rather than the process.
|
||||
---
|
||||
include/signal.h | 16 +++++++++++++---
|
||||
src/time/timer_create.c | 8 ++++++--
|
||||
2 files changed, 19 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/include/signal.h b/include/signal.h
|
||||
index fbdf667b2..9ed929e4f 100644
|
||||
--- a/include/signal.h
|
||||
+++ b/include/signal.h
|
||||
@@ -180,14 +180,24 @@ struct sigevent {
|
||||
union sigval sigev_value;
|
||||
int sigev_signo;
|
||||
int sigev_notify;
|
||||
- void (*sigev_notify_function)(union sigval);
|
||||
- pthread_attr_t *sigev_notify_attributes;
|
||||
- char __pad[56-3*sizeof(long)];
|
||||
+ union {
|
||||
+ char __pad[64 - 2*sizeof(int) - sizeof(union sigval)];
|
||||
+ pid_t sigev_notify_thread_id;
|
||||
+ struct {
|
||||
+ void (*sigev_notify_function)(union sigval);
|
||||
+ pthread_attr_t *sigev_notify_attributes;
|
||||
+ } __sev_thread;
|
||||
+ } __sev_fields;
|
||||
};
|
||||
|
||||
+#define sigev_notify_thread_id __sev_fields.sigev_notify_thread_id
|
||||
+#define sigev_notify_function __sev_fields.__sev_thread.sigev_notify_function
|
||||
+#define sigev_notify_attributes __sev_fields.__sev_thread.sigev_notify_attributes
|
||||
+
|
||||
#define SIGEV_SIGNAL 0
|
||||
#define SIGEV_NONE 1
|
||||
#define SIGEV_THREAD 2
|
||||
+#define SIGEV_THREAD_ID 4
|
||||
|
||||
int __libc_current_sigrtmin(void);
|
||||
int __libc_current_sigrtmax(void);
|
||||
diff --git a/src/time/timer_create.c b/src/time/timer_create.c
|
||||
index 5ddfda278..4bef23905 100644
|
||||
--- a/src/time/timer_create.c
|
||||
+++ b/src/time/timer_create.c
|
||||
@@ -71,11 +71,15 @@ int timer_create(clockid_t clk, struct sigevent *restrict evp, timer_t *restrict
|
||||
switch (evp ? evp->sigev_notify : SIGEV_SIGNAL) {
|
||||
case SIGEV_NONE:
|
||||
case SIGEV_SIGNAL:
|
||||
+ case SIGEV_THREAD_ID:
|
||||
if (evp) {
|
||||
ksev.sigev_value = evp->sigev_value;
|
||||
ksev.sigev_signo = evp->sigev_signo;
|
||||
ksev.sigev_notify = evp->sigev_notify;
|
||||
- ksev.sigev_tid = 0;
|
||||
+ if (evp->sigev_notify == SIGEV_THREAD_ID)
|
||||
+ ksev.sigev_tid = evp->sigev_notify_thread_id;
|
||||
+ else
|
||||
+ ksev.sigev_tid = 0;
|
||||
ksevp = &ksev;
|
||||
}
|
||||
if (syscall(SYS_timer_create, clk, ksevp, &timerid) < 0)
|
||||
@@ -107,7 +111,7 @@ int timer_create(clockid_t clk, struct sigevent *restrict evp, timer_t *restrict
|
||||
|
||||
ksev.sigev_value.sival_ptr = 0;
|
||||
ksev.sigev_signo = SIGTIMER;
|
||||
- ksev.sigev_notify = 4; /* SIGEV_THREAD_ID */
|
||||
+ ksev.sigev_notify = SIGEV_THREAD_ID;
|
||||
ksev.sigev_tid = td->tid;
|
||||
if (syscall(SYS_timer_create, clk, &ksev, &timerid) < 0)
|
||||
timerid = -1;
|
|
@ -1,49 +0,0 @@
|
|||
From a5aff1972c9e3981566414b09a28e331ccd2be5d Mon Sep 17 00:00:00 2001
|
||||
From: Rich Felker <dalias@aerifal.cx>
|
||||
Date: Thu, 17 Sep 2020 15:09:46 -0400
|
||||
Subject: [PATCH 237/513] avoid set*id/setrlimit misbehavior and hang in
|
||||
vforked/cloned child
|
||||
|
||||
taking the deprecated/dropped vfork spec strictly, doing pretty much
|
||||
anything but execve in the child is wrong and undefined. however,
|
||||
these are commonly needed operations to setup the child state before
|
||||
exec, and historical implementations tolerated them.
|
||||
|
||||
for single-threaded parents, these operations already worked as
|
||||
expected in the vforked child. however, due to the need for __synccall
|
||||
to synchronize id/resource limit changes among all threads, calling
|
||||
these functions in the vforked child of a multithreaded parent caused
|
||||
a misdirected broadcast signaling of all threads in the parent. these
|
||||
signals could kill the parent entirely if the synccall signal handler
|
||||
had never been installed in the parent, or could be ignored if it had,
|
||||
or could signal/kill one or more utterly wrong processes if the parent
|
||||
already terminated (due to vfork semantics, only possible via fatal
|
||||
signal) and the parent tids were recycled. in any case, the expected
|
||||
number of semaphore posts would never happen, so the child would
|
||||
permanently hang (with all signals blocked) waiting for them.
|
||||
|
||||
to mitigate this, and also make the normal usage case work as
|
||||
intended, treat the condition where the caller's actual tid does not
|
||||
match the tid in its thread structure as single-threaded, and bypass
|
||||
the entire synccall broadcast operation.
|
||||
---
|
||||
src/thread/synccall.c | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/thread/synccall.c b/src/thread/synccall.c
|
||||
index 648a6ad4..d58c851f 100644
|
||||
--- a/src/thread/synccall.c
|
||||
+++ b/src/thread/synccall.c
|
||||
@@ -63,7 +63,8 @@ void __synccall(void (*func)(void *), void *ctx)
|
||||
sem_init(&target_sem, 0, 0);
|
||||
sem_init(&caller_sem, 0, 0);
|
||||
|
||||
- if (!libc.threads_minus_1) goto single_threaded;
|
||||
+ if (!libc.threads_minus_1 || __syscall(SYS_gettid) != self->tid)
|
||||
+ goto single_threaded;
|
||||
|
||||
callback = func;
|
||||
context = ctx;
|
||||
--
|
||||
2.41.0
|
||||
|
|
@ -1,44 +0,0 @@
|
|||
From 725e17ed6dff4d0cd22487bb64470881e86a92e7 Mon Sep 17 00:00:00 2001
|
||||
From: Rich Felker <dalias@aerifal.cx>
|
||||
Date: Mon, 6 Nov 2023 08:26:19 -0500
|
||||
Subject: [PATCH] remove non-prototype declaration of basename from string.h
|
||||
|
||||
commit 37bb3cce4598c19288628e675eaf1cda6e96958f suppressed the
|
||||
declaration for C++, where it is wrongly interpreted as declaring the
|
||||
function as taking no arguments. with C23 removing non-prototype
|
||||
declarations, that problem is now also relevant to C.
|
||||
|
||||
the non-prototype declaration for basename originates with commit
|
||||
06aec8d7152dfb8360cb7ed9b3d7215ca0b0b500, where it was designed to
|
||||
avoid conflicts with programs which declare basename with the GNU
|
||||
signature taking const char *. that change was probably misguided, as
|
||||
it represents not only misaligned expectations with the caller, but
|
||||
also undefined behavior (calling a function that's been declared with
|
||||
the wrong type).
|
||||
|
||||
we could opt to fix the declaration, but since glibc, with the
|
||||
gratuitously incompatible GNU-basename function, seems to be the only
|
||||
implementation that declares it in string.h, it seems better to just
|
||||
remove the declaration. this provides some warning if applications are
|
||||
being built expecting the GNU behavior but not getting it. if we
|
||||
declared it here, it would only produce a warning if the caller also
|
||||
declares it themselves (rare) or if the caller attempts to pass a
|
||||
const-qualified pointer.
|
||||
---
|
||||
include/string.h | 3 ---
|
||||
1 file changed, 3 deletions(-)
|
||||
|
||||
diff --git a/include/string.h b/include/string.h
|
||||
index db73d2a9..83e2b946 100644
|
||||
--- a/include/string.h
|
||||
+++ b/include/string.h
|
||||
@@ -95,9 +95,6 @@ char *strchrnul(const char *, int);
|
||||
char *strcasestr(const char *, const char *);
|
||||
void *memrchr(const void *, int, size_t);
|
||||
void *mempcpy(void *, const void *, size_t);
|
||||
-#ifndef __cplusplus
|
||||
-char *basename();
|
||||
-#endif
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
|
@ -1,28 +0,0 @@
|
|||
From 2c00f95c1ac7dd50f53d9e361847ebd2513c8da0 Mon Sep 17 00:00:00 2001
|
||||
From: Rich Felker <dalias@aerifal.cx>
|
||||
Date: Sat, 3 Apr 2021 21:16:41 -0400
|
||||
Subject: [PATCH] make epoll_[p]wait a cancellation point
|
||||
|
||||
this is a Linux-specific function and not covered by POSIX's
|
||||
requirements for which interfaces are cancellation points, but glibc
|
||||
makes it one and existing software relies on it being one.
|
||||
|
||||
at some point a review for similar functions that should be made
|
||||
cancellation points should be done.
|
||||
|
||||
diff --git src/linux/epoll.c src/linux/epoll.c
|
||||
index deff5b10..93baa814 100644
|
||||
--- a/src/linux/epoll.c
|
||||
+++ b/src/linux/epoll.c
|
||||
@@ -24,9 +24,9 @@ int epoll_ctl(int fd, int op, int fd2, struct epoll_event *ev)
|
||||
|
||||
int epoll_pwait(int fd, struct epoll_event *ev, int cnt, int to, const sigset_t *sigs)
|
||||
{
|
||||
- int r = __syscall(SYS_epoll_pwait, fd, ev, cnt, to, sigs, _NSIG/8);
|
||||
+ int r = __syscall_cp(SYS_epoll_pwait, fd, ev, cnt, to, sigs, _NSIG/8);
|
||||
#ifdef SYS_epoll_wait
|
||||
- if (r==-ENOSYS && !sigs) r = __syscall(SYS_epoll_wait, fd, ev, cnt, to);
|
||||
+ if (r==-ENOSYS && !sigs) r = __syscall_cp(SYS_epoll_wait, fd, ev, cnt, to);
|
||||
#endif
|
||||
return __syscall_ret(r);
|
||||
}
|
|
@ -1,45 +0,0 @@
|
|||
From 55fb9a177316aa46c639d93dd0323d9a9a8c160c Mon Sep 17 00:00:00 2001
|
||||
From: Rich Felker <dalias@aerifal.cx>
|
||||
Date: Wed, 9 Sep 2020 21:55:11 -0400
|
||||
Subject: [PATCH] use new SYS_faccessat2 syscall to implement faccessat with
|
||||
flags
|
||||
|
||||
commit 0a05eace163cee9b08571d2ff9d90f5e82d9c228 implemented AT_EACCESS
|
||||
for faccessat with a horrible hack, creating a child process to change
|
||||
switch uid/gid and perform the access probe without making potentially
|
||||
irreversible changes to the caller's credentials. this was due to the
|
||||
syscall lacking a flags argument.
|
||||
|
||||
linux 5.8 introduced a new syscall, SYS_faccessat2, fixing this
|
||||
deficiency. use it if any flags are passed, and fallback to the old
|
||||
strategy on ENOSYS. continue using the old syscall when there are no
|
||||
flags.
|
||||
---
|
||||
src/unistd/faccessat.c | 11 ++++++++---
|
||||
1 file changed, 8 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/src/unistd/faccessat.c b/src/unistd/faccessat.c
|
||||
index 76bbd4c72..557503eb6 100644
|
||||
--- a/src/unistd/faccessat.c
|
||||
+++ b/src/unistd/faccessat.c
|
||||
@@ -25,12 +25,17 @@ static int checker(void *p)
|
||||
|
||||
int faccessat(int fd, const char *filename, int amode, int flag)
|
||||
{
|
||||
- if (!flag || (flag==AT_EACCESS && getuid()==geteuid() && getgid()==getegid()))
|
||||
- return syscall(SYS_faccessat, fd, filename, amode, flag);
|
||||
+ if (flag) {
|
||||
+ int ret = __syscall(SYS_faccessat2, fd, filename, amode, flag);
|
||||
+ if (ret != -ENOSYS) return __syscall_ret(ret);
|
||||
+ }
|
||||
|
||||
- if (flag != AT_EACCESS)
|
||||
+ if (flag & ~AT_EACCESS)
|
||||
return __syscall_ret(-EINVAL);
|
||||
|
||||
+ if (!flag || (getuid()==geteuid() && getgid()==getegid()))
|
||||
+ return syscall(SYS_faccessat, fd, filename, amode);
|
||||
+
|
||||
char stack[1024];
|
||||
sigset_t set;
|
||||
pid_t pid;
|
|
@ -1,61 +0,0 @@
|
|||
From f8bdc3048216f41eaaf655524fa286cfb1184a70 Mon Sep 17 00:00:00 2001
|
||||
From: Rich Felker <dalias@aerifal.cx>
|
||||
Date: Sun, 20 Feb 2022 20:11:14 -0500
|
||||
Subject: [PATCH] fix spurious failures by fgetws when buffer ends with partial
|
||||
character
|
||||
|
||||
commit a90d9da1d1b14d81c4f93e1a6d1a686c3312e4ba made fgetws look for
|
||||
changes to errno by fgetwc to detect encoding errors, since ISO C did
|
||||
not allow the implementation to set the stream's error flag in this
|
||||
case, and the fgetwc interface did not admit any other way to detect
|
||||
the error. however, the possibility of fgetwc setting errno to EILSEQ
|
||||
in the success path was overlooked, and in fact this can happen if the
|
||||
buffer ends with a partial character, causing mbtowc to be called with
|
||||
only part of the character available.
|
||||
|
||||
since that change was made, the C standard was amended to specify that
|
||||
fgetwc set the stream error flag on encoding errors, and commit
|
||||
511d70738bce11a67219d0132ce725c323d00e4e made it do so. thus, there is
|
||||
no longer any need for fgetws to poke at errno to handle encoding
|
||||
errors.
|
||||
|
||||
this commit reverts commit a90d9da1d1b14d81c4f93e1a6d1a686c3312e4ba
|
||||
and thereby fixes the problem.
|
||||
---
|
||||
src/stdio/fgetws.c | 7 +------
|
||||
1 file changed, 1 insertion(+), 6 deletions(-)
|
||||
|
||||
diff --git a/src/stdio/fgetws.c b/src/stdio/fgetws.c
|
||||
index b08b3049..195cb435 100644
|
||||
--- a/src/stdio/fgetws.c
|
||||
+++ b/src/stdio/fgetws.c
|
||||
@@ -1,6 +1,5 @@
|
||||
#include "stdio_impl.h"
|
||||
#include <wchar.h>
|
||||
-#include <errno.h>
|
||||
|
||||
wint_t __fgetwc_unlocked(FILE *);
|
||||
|
||||
@@ -12,10 +11,6 @@ wchar_t *fgetws(wchar_t *restrict s, int n, FILE *restrict f)
|
||||
|
||||
FLOCK(f);
|
||||
|
||||
- /* Setup a dummy errno so we can detect EILSEQ. This is
|
||||
- * the only way to catch encoding errors in the form of a
|
||||
- * partial character just before EOF. */
|
||||
- errno = EAGAIN;
|
||||
for (; n; n--) {
|
||||
wint_t c = __fgetwc_unlocked(f);
|
||||
if (c == WEOF) break;
|
||||
@@ -23,7 +18,7 @@ wchar_t *fgetws(wchar_t *restrict s, int n, FILE *restrict f)
|
||||
if (c == '\n') break;
|
||||
}
|
||||
*p = 0;
|
||||
- if (ferror(f) || errno==EILSEQ) p = s;
|
||||
+ if (ferror(f)) p = s;
|
||||
|
||||
FUNLOCK(f);
|
||||
|
||||
--
|
||||
2.41.0
|
||||
|
|
@ -1,80 +0,0 @@
|
|||
From 3b7b4155570b4b9054465785be2992c92cb7d7b1 Mon Sep 17 00:00:00 2001
|
||||
From: Rich Felker <dalias@aerifal.cx>
|
||||
Date: Wed, 9 Feb 2022 17:48:43 -0500
|
||||
Subject: fix out-of-bound read processing time zone data with distant-past
|
||||
dates
|
||||
|
||||
this bug goes back to commit 1cc81f5cb0df2b66a795ff0c26d7bbc4d16e13c6
|
||||
where zoneinfo file support was first added. in scan_trans, which
|
||||
searches for the appropriate local time/dst rule in effect at a given
|
||||
time, times prior to the second transition time caused the -1 slot of
|
||||
the index to be read to determine the previous rule in effect. this
|
||||
memory was always valid (part of another zoneinfo table in the mapped
|
||||
file) but the byte value read was then used to index another table,
|
||||
possibly going outside the bounds of the mmap. most of the time, the
|
||||
result was limited to misinterpretation of the rule in effect at that
|
||||
time (pre-1900s), but it could produce a crash if adjacent memory was
|
||||
not readable.
|
||||
|
||||
the root cause of the problem, however, was that the logic for this
|
||||
code path was all wrong. as documented in the comment, times before
|
||||
the first transition should be treated as using the lowest-numbered
|
||||
non-dst rule, or rule 0 if no non-dst rules exist. if the argument is
|
||||
in units of local time, however, the rule prior to the first
|
||||
transition is needed to determine if it falls before or after it, and
|
||||
that's where the -1 index was wrongly used.
|
||||
|
||||
instead, use the documented logic to find out what rule would be in
|
||||
effect before the first transition, and apply it as the offset if the
|
||||
argument was given in local time.
|
||||
|
||||
the new code has not been heavily tested, but no longer performs
|
||||
potentially out-of-bounds accesses, and successfully handles the 1883
|
||||
transition from local mean time to central standard time in the test
|
||||
case the error was reported for.
|
||||
---
|
||||
src/time/__tz.c | 26 ++++++++++++--------------
|
||||
1 file changed, 12 insertions(+), 14 deletions(-)
|
||||
|
||||
diff --git a/src/time/__tz.c b/src/time/__tz.c
|
||||
index 3e2fcdcb..c34b3eb7 100644
|
||||
--- a/src/time/__tz.c
|
||||
+++ b/src/time/__tz.c
|
||||
@@ -293,22 +293,20 @@ static size_t scan_trans(long long t, int local, size_t *alt)
|
||||
n = (index-trans)>>scale;
|
||||
if (a == n-1) return -1;
|
||||
if (a == 0) {
|
||||
- x = zi_read32(trans + (a<<scale));
|
||||
- if (scale == 3) x = x<<32 | zi_read32(trans + (a<<scale) + 4);
|
||||
+ x = zi_read32(trans);
|
||||
+ if (scale == 3) x = x<<32 | zi_read32(trans + 4);
|
||||
else x = (int32_t)x;
|
||||
- if (local) off = (int32_t)zi_read32(types + 6 * index[a-1]);
|
||||
+ /* Find the lowest non-DST type, or 0 if none. */
|
||||
+ size_t j = 0;
|
||||
+ for (size_t i=abbrevs-types; i; i-=6) {
|
||||
+ if (!types[i-6+4]) j = i-6;
|
||||
+ }
|
||||
+ if (local) off = (int32_t)zi_read32(types + j);
|
||||
+ /* If t is before first transition, use the above-found type
|
||||
+ * and the index-zero (after transition) type as the alt. */
|
||||
if (t - off < (int64_t)x) {
|
||||
- for (a=0; a<(abbrevs-types)/6; a++) {
|
||||
- if (types[6*a+4] != types[4]) break;
|
||||
- }
|
||||
- if (a == (abbrevs-types)/6) a = 0;
|
||||
- if (types[6*a+4]) {
|
||||
- *alt = a;
|
||||
- return 0;
|
||||
- } else {
|
||||
- *alt = 0;
|
||||
- return a;
|
||||
- }
|
||||
+ if (alt) *alt = index[0];
|
||||
+ return j/6;
|
||||
}
|
||||
}
|
||||
|
||||
--
|
||||
cgit v1.2.1
|
||||
|
|
@ -1,56 +0,0 @@
|
|||
From 2d0bbe6c788938d1332609c014eeebc1dff966ac Mon Sep 17 00:00:00 2001
|
||||
From: Rich Felker <dalias@aerifal.cx>
|
||||
Date: Mon, 26 Oct 2020 15:56:25 -0400
|
||||
Subject: fix pthread_cond_wait paired with with priority-inheritance mutex
|
||||
|
||||
pthread_cond_wait arranged for requeued waiters to wake when the mutex
|
||||
is unlocked by temporarily adjusting the mutex's waiter count. commit
|
||||
54ca677983d47529bab8752315ac1a2b49888870 broke this when introducing
|
||||
PI mutexes by repurposing the waiter count field of the mutex
|
||||
structure. since then, for PI mutexes, the waiter count adjustment was
|
||||
misinterpreted by the mutex locking code as indicating that the mutex
|
||||
is non a non-recoverable state.
|
||||
|
||||
it would be possible to special-case PI mutexes here, but instead just
|
||||
drop all adjustment of the waiters count, and instead use the lock
|
||||
word waiters bit for all mutex types. since the mutex is either held
|
||||
by the caller or in unrecoverable state at the time the bit is set, it
|
||||
will necessarily still be set at the time of any subsequent valid
|
||||
unlock operation, and this will produce the desired effect of waking
|
||||
the next waiter.
|
||||
|
||||
if waiter counts are entirely dropped at some point in the future this
|
||||
code should still work without modification.
|
||||
---
|
||||
src/thread/pthread_cond_timedwait.c | 11 +++++------
|
||||
1 file changed, 5 insertions(+), 6 deletions(-)
|
||||
|
||||
(limited to 'src/thread/pthread_cond_timedwait.c')
|
||||
|
||||
diff --git a/src/thread/pthread_cond_timedwait.c b/src/thread/pthread_cond_timedwait.c
|
||||
index d1501240..f5f37af1 100644
|
||||
--- a/src/thread/pthread_cond_timedwait.c
|
||||
+++ b/src/thread/pthread_cond_timedwait.c
|
||||
@@ -146,14 +146,13 @@ relock:
|
||||
|
||||
if (oldstate == WAITING) goto done;
|
||||
|
||||
- if (!node.next) a_inc(&m->_m_waiters);
|
||||
-
|
||||
/* Unlock the barrier that's holding back the next waiter, and
|
||||
* either wake it or requeue it to the mutex. */
|
||||
- if (node.prev)
|
||||
- unlock_requeue(&node.prev->barrier, &m->_m_lock, m->_m_type & 128);
|
||||
- else
|
||||
- a_dec(&m->_m_waiters);
|
||||
+ if (node.prev) {
|
||||
+ int val = m->_m_lock;
|
||||
+ if (val>0) a_cas(&m->_m_lock, val, val|0x80000000);
|
||||
+ unlock_requeue(&node.prev->barrier, &m->_m_lock, m->_m_type & (8|128));
|
||||
+ }
|
||||
|
||||
/* Since a signal was consumed, cancellation is not permitted. */
|
||||
if (e == ECANCELED) e = 0;
|
||||
--
|
||||
cgit v1.2.1
|
||||
|
|
@ -1,48 +0,0 @@
|
|||
From 27b2fc9d6db956359727a66c262f1e69995660aa Mon Sep 17 00:00:00 2001
|
||||
From: Rich Felker <dalias@aerifal.cx>
|
||||
Date: Fri, 30 Oct 2020 11:21:06 -0400
|
||||
Subject: fix missing-wake regression in pthread_cond_wait
|
||||
|
||||
the reasoning in commit 2d0bbe6c788938d1332609c014eeebc1dff966ac was
|
||||
not entirely correct. while it's true that setting the waiters flag
|
||||
ensures that the next unlock will perform a wake, it's possible that
|
||||
the wake is consumed by a mutex waiter that has no relationship with
|
||||
the condvar wait queue being processed, which then takes the mutex.
|
||||
when that thread subsequently unlocks, it sees no waiters, and leaves
|
||||
the rest of the condvar queue stuck.
|
||||
|
||||
bring back the waiter count adjustment, but skip it for PI mutexes,
|
||||
for which a successful lock-after-waiting always sets the waiters bit.
|
||||
if future changes are made to bring this same waiters-bit contract to
|
||||
all lock types, this can be reverted.
|
||||
---
|
||||
src/thread/pthread_cond_timedwait.c | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
(limited to 'src/thread/pthread_cond_timedwait.c')
|
||||
|
||||
diff --git a/src/thread/pthread_cond_timedwait.c b/src/thread/pthread_cond_timedwait.c
|
||||
index f5f37af1..a0cd4904 100644
|
||||
--- a/src/thread/pthread_cond_timedwait.c
|
||||
+++ b/src/thread/pthread_cond_timedwait.c
|
||||
@@ -146,12 +146,17 @@ relock:
|
||||
|
||||
if (oldstate == WAITING) goto done;
|
||||
|
||||
+ if (!node.next && !(m->_m_type & 8))
|
||||
+ a_inc(&m->_m_waiters);
|
||||
+
|
||||
/* Unlock the barrier that's holding back the next waiter, and
|
||||
* either wake it or requeue it to the mutex. */
|
||||
if (node.prev) {
|
||||
int val = m->_m_lock;
|
||||
if (val>0) a_cas(&m->_m_lock, val, val|0x80000000);
|
||||
unlock_requeue(&node.prev->barrier, &m->_m_lock, m->_m_type & (8|128));
|
||||
+ } else if (!!(m->_m_type & 8)) {
|
||||
+ a_dec(&m->_m_waiters);
|
||||
}
|
||||
|
||||
/* Since a signal was consumed, cancellation is not permitted. */
|
||||
--
|
||||
cgit v1.2.1
|
||||
|
|
@ -1,28 +0,0 @@
|
|||
From d91a6cf6e369a79587c5665fce9635e5634ca201 Mon Sep 17 00:00:00 2001
|
||||
From: Rich Felker <dalias@aerifal.cx>
|
||||
Date: Fri, 30 Oct 2020 16:50:08 -0400
|
||||
Subject: fix erroneous pthread_cond_wait mutex waiter count logic due to typo
|
||||
|
||||
introduced in commit 27b2fc9d6db956359727a66c262f1e69995660aa.
|
||||
---
|
||||
src/thread/pthread_cond_timedwait.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
(limited to 'src/thread/pthread_cond_timedwait.c')
|
||||
|
||||
diff --git a/src/thread/pthread_cond_timedwait.c b/src/thread/pthread_cond_timedwait.c
|
||||
index a0cd4904..6b761455 100644
|
||||
--- a/src/thread/pthread_cond_timedwait.c
|
||||
+++ b/src/thread/pthread_cond_timedwait.c
|
||||
@@ -155,7 +155,7 @@ relock:
|
||||
int val = m->_m_lock;
|
||||
if (val>0) a_cas(&m->_m_lock, val, val|0x80000000);
|
||||
unlock_requeue(&node.prev->barrier, &m->_m_lock, m->_m_type & (8|128));
|
||||
- } else if (!!(m->_m_type & 8)) {
|
||||
+ } else if (!(m->_m_type & 8)) {
|
||||
a_dec(&m->_m_waiters);
|
||||
}
|
||||
|
||||
--
|
||||
cgit v1.2.1
|
||||
|
|
@ -1,38 +0,0 @@
|
|||
From b50eb8c36c20f967bd0ed70c0b0db38a450886ba Mon Sep 17 00:00:00 2001
|
||||
From: Rich Felker <dalias@aerifal.cx>
|
||||
Date: Mon, 7 Nov 2022 22:17:55 -0500
|
||||
Subject: [PATCH] fix strverscmp comparison of digit sequence with non-digits
|
||||
|
||||
the rule that longest digit sequence not beginning with a zero is
|
||||
greater only applies when both sequences being compared are
|
||||
non-degenerate. this is spelled out explicitly in the man page, which
|
||||
may be deemed authoritative for this nonstandard function: "If one or
|
||||
both of these is empty, then return what strcmp(3) would have
|
||||
returned..."
|
||||
|
||||
we were wrongly treating any sequence of digits not beginning with a
|
||||
zero as greater than a non-digit in the other string.
|
||||
---
|
||||
src/string/strverscmp.c | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/src/string/strverscmp.c b/src/string/strverscmp.c
|
||||
index 4daf276d..16c1da22 100644
|
||||
--- a/src/string/strverscmp.c
|
||||
+++ b/src/string/strverscmp.c
|
||||
@@ -18,9 +18,9 @@ int strverscmp(const char *l0, const char *r0)
|
||||
else if (c!='0') z=0;
|
||||
}
|
||||
|
||||
- if (l[dp]!='0' && r[dp]!='0') {
|
||||
- /* If we're not looking at a digit sequence that began
|
||||
- * with a zero, longest digit string is greater. */
|
||||
+ if (l[dp]-'1'<9U && r[dp]-'1'<9U) {
|
||||
+ /* If we're looking at non-degenerate digit sequences starting
|
||||
+ * with nonzero digits, longest digit string is greater. */
|
||||
for (j=i; isdigit(l[j]); j++)
|
||||
if (!isdigit(r[j])) return 1;
|
||||
if (isdigit(r[j])) return -1;
|
||||
--
|
||||
2.41.0
|
||||
|
|
@ -1,49 +0,0 @@
|
|||
From d49cf07541bb54a5ac7aec1feec8514db33db8ea Mon Sep 17 00:00:00 2001
|
||||
From: Rich Felker <dalias@aerifal.cx>
|
||||
Date: Mon, 17 Aug 2020 20:12:53 -0400
|
||||
Subject: [PATCH] add gettid function
|
||||
|
||||
this is a prerequisite for addition of other interfaces that use
|
||||
kernel tids, including futex and SIGEV_THREAD_ID.
|
||||
|
||||
there is some ambiguity as to whether the semantic return type should
|
||||
be int or pid_t. either way, futex API imposes a contract that the
|
||||
values fit in int (excluding some upper reserved bits). glibc used
|
||||
pid_t, so in the interest of not having gratuitous mismatch (the
|
||||
underlying types are the same anyway), pid_t is used here as well.
|
||||
|
||||
while conceptually this is a syscall, the copy stored in the thread
|
||||
structure is always valid in all contexts where it's valid to call
|
||||
libc functions, so it's used to avoid the syscall.
|
||||
---
|
||||
include/unistd.h | 1 +
|
||||
src/linux/gettid.c | 8 ++++++++
|
||||
2 files changed, 9 insertions(+)
|
||||
create mode 100644 src/linux/gettid.c
|
||||
|
||||
diff --git a/include/unistd.h b/include/unistd.h
|
||||
index 7bcbff943..07584a23e 100644
|
||||
--- a/include/unistd.h
|
||||
+++ b/include/unistd.h
|
||||
@@ -190,6 +190,7 @@ int syncfs(int);
|
||||
int euidaccess(const char *, int);
|
||||
int eaccess(const char *, int);
|
||||
ssize_t copy_file_range(int, off_t *, int, off_t *, size_t, unsigned);
|
||||
+pid_t gettid(void);
|
||||
#endif
|
||||
|
||||
#if defined(_LARGEFILE64_SOURCE) || defined(_GNU_SOURCE)
|
||||
diff --git a/src/linux/gettid.c b/src/linux/gettid.c
|
||||
new file mode 100644
|
||||
index 000000000..70767137e
|
||||
--- /dev/null
|
||||
+++ b/src/linux/gettid.c
|
||||
@@ -0,0 +1,8 @@
|
||||
+#define _GNU_SOURCE
|
||||
+#include <unistd.h>
|
||||
+#include "pthread_impl.h"
|
||||
+
|
||||
+pid_t gettid(void)
|
||||
+{
|
||||
+ return __pthread_self()->tid;
|
||||
+}
|
|
@ -1,219 +0,0 @@
|
|||
From 29ff7599a448232f2527841c2362643d246cee36 Mon Sep 17 00:00:00 2001
|
||||
From: Rich Felker <dalias@aerifal.cx>
|
||||
Date: Mon, 30 Nov 2020 12:14:47 -0500
|
||||
Subject: [PATCH] implement realpath directly instead of using procfs readlink
|
||||
|
||||
inability to use realpath in chroot/container without procfs access
|
||||
and at early boot prior to mount of /proc has been an ongoing issue,
|
||||
and it turns out realpath was one of the last remaining interfaces
|
||||
that needed procfs for its core functionality. during investigation
|
||||
while reimplementing, it was determined that there were also serious
|
||||
problems with the procfs-based implementation. most seriously it was
|
||||
unsafe on pre-O_PATH kernels, and unlike other places where O_PATH was
|
||||
used, the unsafety was hard or impossible to fix because O_NOFOLLOW
|
||||
can't be used (since the whole purpose was to follow symlinks).
|
||||
|
||||
the new implementation is a direct one, performing readlink on each
|
||||
path component to resolve it. an explicit stack, as opposed to
|
||||
recursion, is used to represent the remaining components to be
|
||||
processed. the stack starts out holding just the input string, and
|
||||
reading a link pushes the link contents onto the stack.
|
||||
|
||||
unlike many other implementations, this one does not call getcwd
|
||||
initially for relative pathnames. instead it accumulates initial ..
|
||||
components to be applied to the working directory if the result is
|
||||
still a relative path. this avoids calling getcwd (which may fail) at
|
||||
all when symlink traversal will eventually yield an absolute path. it
|
||||
also doesn't use any form of stat operation; instead it arranges for
|
||||
readlink to tell it when a non-directory is used in a context where a
|
||||
directory is needed. this minimizes the number of syscalls needed,
|
||||
avoids accessing inodes when the directory table suffices, and reduces
|
||||
the amount of code pulled in for static linking.
|
||||
---
|
||||
src/misc/realpath.c | 159 +++++++++++++++++++++++++++++++++++++-------
|
||||
1 file changed, 136 insertions(+), 23 deletions(-)
|
||||
|
||||
diff --git a/src/misc/realpath.c b/src/misc/realpath.c
|
||||
index d2708e59d..db8b74dc8 100644
|
||||
--- a/src/misc/realpath.c
|
||||
+++ b/src/misc/realpath.c
|
||||
@@ -1,43 +1,156 @@
|
||||
#include <stdlib.h>
|
||||
#include <limits.h>
|
||||
-#include <sys/stat.h>
|
||||
-#include <fcntl.h>
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
-#include "syscall.h"
|
||||
+
|
||||
+static size_t slash_len(const char *s)
|
||||
+{
|
||||
+ const char *s0 = s;
|
||||
+ while (*s == '/') s++;
|
||||
+ return s-s0;
|
||||
+}
|
||||
|
||||
char *realpath(const char *restrict filename, char *restrict resolved)
|
||||
{
|
||||
- int fd;
|
||||
- ssize_t r;
|
||||
- struct stat st1, st2;
|
||||
- char buf[15+3*sizeof(int)];
|
||||
- char tmp[PATH_MAX];
|
||||
+ char stack[PATH_MAX+1];
|
||||
+ char output[PATH_MAX];
|
||||
+ size_t p, q, l, l0, cnt=0, nup=0;
|
||||
+ int check_dir=0;
|
||||
|
||||
if (!filename) {
|
||||
errno = EINVAL;
|
||||
return 0;
|
||||
}
|
||||
+ l = strnlen(filename, sizeof stack);
|
||||
+ if (!l) {
|
||||
+ errno = ENOENT;
|
||||
+ return 0;
|
||||
+ }
|
||||
+ if (l >= PATH_MAX) goto toolong;
|
||||
+ p = sizeof stack - l - 1;
|
||||
+ q = 0;
|
||||
+ memcpy(stack+p, filename, l+1);
|
||||
+
|
||||
+ /* Main loop. Each iteration pops the next part from stack of
|
||||
+ * remaining path components and consumes any slashes that follow.
|
||||
+ * If not a link, it's moved to output; if a link, contents are
|
||||
+ * pushed to the stack. */
|
||||
+restart:
|
||||
+ for (; ; p+=slash_len(stack+p)) {
|
||||
+ /* If stack starts with /, the whole component is / or //
|
||||
+ * and the output state must be reset. */
|
||||
+ if (stack[p] == '/') {
|
||||
+ check_dir=0;
|
||||
+ nup=0;
|
||||
+ q=0;
|
||||
+ output[q++] = '/';
|
||||
+ p++;
|
||||
+ /* Initial // is special. */
|
||||
+ if (stack[p] == '/' && stack[p+1] != '/')
|
||||
+ output[q++] = '/';
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
+ char *z = __strchrnul(stack+p, '/');
|
||||
+ l0 = l = z-(stack+p);
|
||||
|
||||
- fd = sys_open(filename, O_PATH|O_NONBLOCK|O_CLOEXEC);
|
||||
- if (fd < 0) return 0;
|
||||
- __procfdname(buf, fd);
|
||||
+ if (!l && !check_dir) break;
|
||||
|
||||
- r = readlink(buf, tmp, sizeof tmp - 1);
|
||||
- if (r < 0) goto err;
|
||||
- tmp[r] = 0;
|
||||
+ /* Skip any . component but preserve check_dir status. */
|
||||
+ if (l==1 && stack[p]=='.') {
|
||||
+ p += l;
|
||||
+ continue;
|
||||
+ }
|
||||
|
||||
- fstat(fd, &st1);
|
||||
- r = stat(tmp, &st2);
|
||||
- if (r<0 || st1.st_dev != st2.st_dev || st1.st_ino != st2.st_ino) {
|
||||
- if (!r) errno = ELOOP;
|
||||
- goto err;
|
||||
+ /* Copy next component onto output at least temporarily, to
|
||||
+ * call readlink, but wait to advance output position until
|
||||
+ * determining it's not a link. */
|
||||
+ if (q && output[q-1] != '/') {
|
||||
+ if (!p) goto toolong;
|
||||
+ stack[--p] = '/';
|
||||
+ l++;
|
||||
+ }
|
||||
+ if (q+l >= PATH_MAX) goto toolong;
|
||||
+ memcpy(output+q, stack+p, l);
|
||||
+ output[q+l] = 0;
|
||||
+ p += l;
|
||||
+
|
||||
+ int up = 0;
|
||||
+ if (l0==2 && stack[p-2]=='.' && stack[p-1]=='.') {
|
||||
+ up = 1;
|
||||
+ /* Any non-.. path components we could cancel start
|
||||
+ * after nup repetitions of the 3-byte string "../";
|
||||
+ * if there are none, accumulate .. components to
|
||||
+ * later apply to cwd, if needed. */
|
||||
+ if (q <= 3*nup) {
|
||||
+ nup++;
|
||||
+ q += l;
|
||||
+ continue;
|
||||
+ }
|
||||
+ /* When previous components are already known to be
|
||||
+ * directories, processing .. can skip readlink. */
|
||||
+ if (!check_dir) goto skip_readlink;
|
||||
+ }
|
||||
+ ssize_t k = readlink(output, stack, p);
|
||||
+ if (k==p) goto toolong;
|
||||
+ if (!k) {
|
||||
+ errno = ENOENT;
|
||||
+ return 0;
|
||||
+ }
|
||||
+ if (k<0) {
|
||||
+ if (errno != EINVAL) return 0;
|
||||
+skip_readlink:
|
||||
+ check_dir = 0;
|
||||
+ if (up) {
|
||||
+ while(q && output[q-1]!='/') q--;
|
||||
+ if (q>1 && (q>2 || output[0]!='/')) q--;
|
||||
+ continue;
|
||||
+ }
|
||||
+ if (l0) q += l;
|
||||
+ check_dir = stack[p];
|
||||
+ continue;
|
||||
+ }
|
||||
+ if (++cnt == SYMLOOP_MAX) {
|
||||
+ errno = ELOOP;
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ /* If link contents end in /, strip any slashes already on
|
||||
+ * stack to avoid /->// or //->/// or spurious toolong. */
|
||||
+ if (stack[k-1]=='/') while (stack[p]=='/') p++;
|
||||
+ p -= k;
|
||||
+ memmove(stack+p, stack, k);
|
||||
+
|
||||
+ /* Skip the stack advancement in case we have a new
|
||||
+ * absolute base path. */
|
||||
+ goto restart;
|
||||
}
|
||||
|
||||
- __syscall(SYS_close, fd);
|
||||
- return resolved ? strcpy(resolved, tmp) : strdup(tmp);
|
||||
-err:
|
||||
- __syscall(SYS_close, fd);
|
||||
+ output[q] = 0;
|
||||
+
|
||||
+ if (output[0] != '/') {
|
||||
+ if (!getcwd(stack, sizeof stack)) return 0;
|
||||
+ l = strlen(stack);
|
||||
+ /* Cancel any initial .. components. */
|
||||
+ p = 0;
|
||||
+ while (nup--) {
|
||||
+ while(l>1 && stack[l-1]!='/') l--;
|
||||
+ if (l>1) l--;
|
||||
+ p += 2;
|
||||
+ if (p<q) p++;
|
||||
+ }
|
||||
+ if (q-p && stack[l-1]!='/') stack[l++] = '/';
|
||||
+ if (l + (q-p) + 1 >= PATH_MAX) goto toolong;
|
||||
+ memmove(output + l, output + p, q - p + 1);
|
||||
+ memcpy(output, stack, l);
|
||||
+ q = l + q-p;
|
||||
+ }
|
||||
+
|
||||
+ if (resolved) return memcpy(resolved, output, q+1);
|
||||
+ else return strdup(output);
|
||||
+
|
||||
+toolong:
|
||||
+ errno = ENAMETOOLONG;
|
||||
return 0;
|
||||
}
|
|
@ -1,21 +0,0 @@
|
|||
From e48e99c112246fb580596404074445cb25d7858d Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?=C3=89rico=20Rolim?= <ericonr@disroot.org>
|
||||
Date: Mon, 4 Jan 2021 22:48:34 -0300
|
||||
Subject: [PATCH] suppress isascii() macro for C++
|
||||
|
||||
analogous to commit a60457c84a4b59ab564d7f4abb660a70283ba98d.
|
||||
|
||||
diff --git include/ctype.h include/ctype.h
|
||||
index 7936536f..32bcef4d 100644
|
||||
--- a/include/ctype.h
|
||||
+++ b/include/ctype.h
|
||||
@@ -64,7 +64,9 @@ int isascii(int);
|
||||
int toascii(int);
|
||||
#define _tolower(a) ((a)|0x20)
|
||||
#define _toupper(a) ((a)&0x5f)
|
||||
+#ifndef __cplusplus
|
||||
#define isascii(a) (0 ? isascii(a) : (unsigned)(a) < 128)
|
||||
+#endif
|
||||
|
||||
#endif
|
||||
|
|
@ -1,394 +0,0 @@
|
|||
--- a/arch/aarch64/bits/syscall.h.in
|
||||
+++ b/arch/aarch64/bits/syscall.h.in
|
||||
@@ -287,4 +287,21 @@
|
||||
#define __NR_fsconfig 431
|
||||
#define __NR_fsmount 432
|
||||
#define __NR_fspick 433
|
||||
+#define __NR_pidfd_open 434
|
||||
+#define __NR_clone3 435
|
||||
+#define __NR_close_range 436
|
||||
+#define __NR_openat2 437
|
||||
+#define __NR_pidfd_getfd 438
|
||||
+#define __NR_faccessat2 439
|
||||
+#define __NR_process_madvise 440
|
||||
+#define __NR_epoll_pwait2 441
|
||||
+#define __NR_mount_setattr 442
|
||||
+#define __NR_landlock_create_ruleset 444
|
||||
+#define __NR_landlock_add_rule 445
|
||||
+#define __NR_landlock_restrict_self 446
|
||||
+#define __NR_process_mrelease 448
|
||||
+#define __NR_futex_waitv 449
|
||||
+#define __NR_set_mempolicy_home_node 450
|
||||
+#define __NR_cachestat 451
|
||||
+#define __NR_fchmodat2 452
|
||||
|
||||
--- a/arch/arm/bits/syscall.h.in
|
||||
+++ b/arch/arm/bits/syscall.h.in
|
||||
@@ -387,6 +387,23 @@
|
||||
#define __NR_fsconfig 431
|
||||
#define __NR_fsmount 432
|
||||
#define __NR_fspick 433
|
||||
+#define __NR_pidfd_open 434
|
||||
+#define __NR_clone3 435
|
||||
+#define __NR_close_range 436
|
||||
+#define __NR_openat2 437
|
||||
+#define __NR_pidfd_getfd 438
|
||||
+#define __NR_faccessat2 439
|
||||
+#define __NR_process_madvise 440
|
||||
+#define __NR_epoll_pwait2 441
|
||||
+#define __NR_mount_setattr 442
|
||||
+#define __NR_landlock_create_ruleset 444
|
||||
+#define __NR_landlock_add_rule 445
|
||||
+#define __NR_landlock_restrict_self 446
|
||||
+#define __NR_process_mrelease 448
|
||||
+#define __NR_futex_waitv 449
|
||||
+#define __NR_set_mempolicy_home_node 450
|
||||
+#define __NR_cachestat 451
|
||||
+#define __NR_fchmodat2 452
|
||||
|
||||
#define __ARM_NR_breakpoint 0x0f0001
|
||||
#define __ARM_NR_cacheflush 0x0f0002
|
||||
--- a/arch/i386/bits/syscall.h.in
|
||||
+++ b/arch/i386/bits/syscall.h.in
|
||||
@@ -424,4 +424,22 @@
|
||||
#define __NR_fsconfig 431
|
||||
#define __NR_fsmount 432
|
||||
#define __NR_fspick 433
|
||||
+#define __NR_pidfd_open 434
|
||||
+#define __NR_clone3 435
|
||||
+#define __NR_close_range 436
|
||||
+#define __NR_openat2 437
|
||||
+#define __NR_pidfd_getfd 438
|
||||
+#define __NR_faccessat2 439
|
||||
+#define __NR_process_madvise 440
|
||||
+#define __NR_epoll_pwait2 441
|
||||
+#define __NR_mount_setattr 442
|
||||
+#define __NR_landlock_create_ruleset 444
|
||||
+#define __NR_landlock_add_rule 445
|
||||
+#define __NR_landlock_restrict_self 446
|
||||
+#define __NR_memfd_secret 447
|
||||
+#define __NR_process_mrelease 448
|
||||
+#define __NR_futex_waitv 449
|
||||
+#define __NR_set_mempolicy_home_node 450
|
||||
+#define __NR_cachestat 451
|
||||
+#define __NR_fchmodat2 452
|
||||
|
||||
--- a/arch/m68k/bits/syscall.h.in
|
||||
+++ b/arch/m68k/bits/syscall.h.in
|
||||
@@ -404,3 +404,21 @@
|
||||
#define __NR_fsconfig 431
|
||||
#define __NR_fsmount 432
|
||||
#define __NR_fspick 433
|
||||
+#define __NR_pidfd_open 434
|
||||
+#define __NR_clone3 435
|
||||
+#define __NR_close_range 436
|
||||
+#define __NR_openat2 437
|
||||
+#define __NR_pidfd_getfd 438
|
||||
+#define __NR_faccessat2 439
|
||||
+#define __NR_process_madvise 440
|
||||
+#define __NR_epoll_pwait2 441
|
||||
+#define __NR_mount_setattr 442
|
||||
+#define __NR_landlock_create_ruleset 444
|
||||
+#define __NR_landlock_add_rule 445
|
||||
+#define __NR_landlock_restrict_self 446
|
||||
+#define __NR_process_mrelease 448
|
||||
+#define __NR_futex_waitv 449
|
||||
+#define __NR_set_mempolicy_home_node 450
|
||||
+#define __NR_cachestat 451
|
||||
+#define __NR_fchmodat2 452
|
||||
+
|
||||
--- a/arch/microblaze/bits/syscall.h.in
|
||||
+++ b/arch/microblaze/bits/syscall.h.in
|
||||
@@ -425,4 +425,21 @@
|
||||
#define __NR_fsconfig 431
|
||||
#define __NR_fsmount 432
|
||||
#define __NR_fspick 433
|
||||
+#define __NR_pidfd_open 434
|
||||
+#define __NR_clone3 435
|
||||
+#define __NR_close_range 436
|
||||
+#define __NR_openat2 437
|
||||
+#define __NR_pidfd_getfd 438
|
||||
+#define __NR_faccessat2 439
|
||||
+#define __NR_process_madvise 440
|
||||
+#define __NR_epoll_pwait2 441
|
||||
+#define __NR_mount_setattr 442
|
||||
+#define __NR_landlock_create_ruleset 444
|
||||
+#define __NR_landlock_add_rule 445
|
||||
+#define __NR_landlock_restrict_self 446
|
||||
+#define __NR_process_mrelease 448
|
||||
+#define __NR_futex_waitv 449
|
||||
+#define __NR_set_mempolicy_home_node 450
|
||||
+#define __NR_cachestat 451
|
||||
+#define __NR_fchmodat2 452
|
||||
|
||||
--- a/arch/mips/bits/syscall.h.in
|
||||
+++ b/arch/mips/bits/syscall.h.in
|
||||
@@ -406,4 +406,21 @@
|
||||
#define __NR_fsconfig 4431
|
||||
#define __NR_fsmount 4432
|
||||
#define __NR_fspick 4433
|
||||
+#define __NR_pidfd_open 4434
|
||||
+#define __NR_clone3 4435
|
||||
+#define __NR_close_range 4436
|
||||
+#define __NR_openat2 4437
|
||||
+#define __NR_pidfd_getfd 4438
|
||||
+#define __NR_faccessat2 4439
|
||||
+#define __NR_process_madvise 4440
|
||||
+#define __NR_epoll_pwait2 4441
|
||||
+#define __NR_mount_setattr 4442
|
||||
+#define __NR_landlock_create_ruleset 4444
|
||||
+#define __NR_landlock_add_rule 4445
|
||||
+#define __NR_landlock_restrict_self 4446
|
||||
+#define __NR_process_mrelease 4448
|
||||
+#define __NR_futex_waitv 4449
|
||||
+#define __NR_set_mempolicy_home_node 4450
|
||||
+#define __NR_cachestat 4451
|
||||
+#define __NR_fchmodat2 4452
|
||||
|
||||
--- a/arch/mips64/bits/syscall.h.in
|
||||
+++ b/arch/mips64/bits/syscall.h.in
|
||||
@@ -336,4 +336,21 @@
|
||||
#define __NR_fsconfig 5431
|
||||
#define __NR_fsmount 5432
|
||||
#define __NR_fspick 5433
|
||||
+#define __NR_pidfd_open 5434
|
||||
+#define __NR_clone3 5435
|
||||
+#define __NR_close_range 5436
|
||||
+#define __NR_openat2 5437
|
||||
+#define __NR_pidfd_getfd 5438
|
||||
+#define __NR_faccessat2 5439
|
||||
+#define __NR_process_madvise 5440
|
||||
+#define __NR_epoll_pwait2 5441
|
||||
+#define __NR_mount_setattr 5442
|
||||
+#define __NR_landlock_create_ruleset 5444
|
||||
+#define __NR_landlock_add_rule 5445
|
||||
+#define __NR_landlock_restrict_self 5446
|
||||
+#define __NR_process_mrelease 5448
|
||||
+#define __NR_futex_waitv 5449
|
||||
+#define __NR_set_mempolicy_home_node 5450
|
||||
+#define __NR_cachestat 5451
|
||||
+#define __NR_fchmodat2 5452
|
||||
|
||||
--- a/arch/mipsn32/bits/syscall.h.in
|
||||
+++ b/arch/mipsn32/bits/syscall.h.in
|
||||
@@ -360,4 +360,21 @@
|
||||
#define __NR_fsconfig 6431
|
||||
#define __NR_fsmount 6432
|
||||
#define __NR_fspick 6433
|
||||
+#define __NR_pidfd_open 6434
|
||||
+#define __NR_clone3 6435
|
||||
+#define __NR_close_range 6436
|
||||
+#define __NR_openat2 6437
|
||||
+#define __NR_pidfd_getfd 6438
|
||||
+#define __NR_faccessat2 6439
|
||||
+#define __NR_process_madvise 6440
|
||||
+#define __NR_epoll_pwait2 6441
|
||||
+#define __NR_mount_setattr 6442
|
||||
+#define __NR_landlock_create_ruleset 6444
|
||||
+#define __NR_landlock_add_rule 6445
|
||||
+#define __NR_landlock_restrict_self 6446
|
||||
+#define __NR_process_mrelease 6448
|
||||
+#define __NR_futex_waitv 6449
|
||||
+#define __NR_set_mempolicy_home_node 6450
|
||||
+#define __NR_cachestat 6451
|
||||
+#define __NR_fchmodat2 6452
|
||||
|
||||
--- a/arch/or1k/bits/syscall.h.in
|
||||
+++ b/arch/or1k/bits/syscall.h.in
|
||||
@@ -309,4 +309,21 @@
|
||||
#define __NR_fsconfig 431
|
||||
#define __NR_fsmount 432
|
||||
#define __NR_fspick 433
|
||||
+#define __NR_pidfd_open 434
|
||||
+#define __NR_clone3 435
|
||||
+#define __NR_close_range 436
|
||||
+#define __NR_openat2 437
|
||||
+#define __NR_pidfd_getfd 438
|
||||
+#define __NR_faccessat2 439
|
||||
+#define __NR_process_madvise 440
|
||||
+#define __NR_epoll_pwait2 441
|
||||
+#define __NR_mount_setattr 442
|
||||
+#define __NR_landlock_create_ruleset 444
|
||||
+#define __NR_landlock_add_rule 445
|
||||
+#define __NR_landlock_restrict_self 446
|
||||
+#define __NR_process_mrelease 448
|
||||
+#define __NR_futex_waitv 449
|
||||
+#define __NR_set_mempolicy_home_node 450
|
||||
+#define __NR_cachestat 451
|
||||
+#define __NR_fchmodat2 452
|
||||
|
||||
--- a/arch/powerpc64/bits/syscall.h.in
|
||||
+++ b/arch/powerpc64/bits/syscall.h.in
|
||||
@@ -385,4 +385,21 @@
|
||||
#define __NR_fsconfig 431
|
||||
#define __NR_fsmount 432
|
||||
#define __NR_fspick 433
|
||||
+#define __NR_pidfd_open 434
|
||||
+#define __NR_clone3 435
|
||||
+#define __NR_close_range 436
|
||||
+#define __NR_openat2 437
|
||||
+#define __NR_pidfd_getfd 438
|
||||
+#define __NR_faccessat2 439
|
||||
+#define __NR_process_madvise 440
|
||||
+#define __NR_epoll_pwait2 441
|
||||
+#define __NR_mount_setattr 442
|
||||
+#define __NR_landlock_create_ruleset 444
|
||||
+#define __NR_landlock_add_rule 445
|
||||
+#define __NR_landlock_restrict_self 446
|
||||
+#define __NR_process_mrelease 448
|
||||
+#define __NR_futex_waitv 449
|
||||
+#define __NR_set_mempolicy_home_node 450
|
||||
+#define __NR_cachestat 451
|
||||
+#define __NR_fchmodat2 452
|
||||
|
||||
--- a/arch/powerpc/bits/syscall.h.in
|
||||
+++ b/arch/powerpc/bits/syscall.h.in
|
||||
@@ -413,4 +413,21 @@
|
||||
#define __NR_fsconfig 431
|
||||
#define __NR_fsmount 432
|
||||
#define __NR_fspick 433
|
||||
+#define __NR_pidfd_open 434
|
||||
+#define __NR_clone3 435
|
||||
+#define __NR_close_range 436
|
||||
+#define __NR_openat2 437
|
||||
+#define __NR_pidfd_getfd 438
|
||||
+#define __NR_faccessat2 439
|
||||
+#define __NR_process_madvise 440
|
||||
+#define __NR_epoll_pwait2 441
|
||||
+#define __NR_mount_setattr 442
|
||||
+#define __NR_landlock_create_ruleset 444
|
||||
+#define __NR_landlock_add_rule 445
|
||||
+#define __NR_landlock_restrict_self 446
|
||||
+#define __NR_process_mrelease 448
|
||||
+#define __NR_futex_waitv 449
|
||||
+#define __NR_set_mempolicy_home_node 450
|
||||
+#define __NR_cachestat 451
|
||||
+#define __NR_fchmodat2 452
|
||||
|
||||
--- a/arch/riscv64/bits/syscall.h.in
|
||||
+++ b/arch/riscv64/bits/syscall.h.in
|
||||
@@ -287,6 +287,23 @@
|
||||
#define __NR_fsconfig 431
|
||||
#define __NR_fsmount 432
|
||||
#define __NR_fspick 433
|
||||
+#define __NR_pidfd_open 434
|
||||
+#define __NR_clone3 435
|
||||
+#define __NR_close_range 436
|
||||
+#define __NR_openat2 437
|
||||
+#define __NR_pidfd_getfd 438
|
||||
+#define __NR_faccessat2 439
|
||||
+#define __NR_process_madvise 440
|
||||
+#define __NR_epoll_pwait2 441
|
||||
+#define __NR_mount_setattr 442
|
||||
+#define __NR_landlock_create_ruleset 444
|
||||
+#define __NR_landlock_add_rule 445
|
||||
+#define __NR_landlock_restrict_self 446
|
||||
+#define __NR_process_mrelease 448
|
||||
+#define __NR_futex_waitv 449
|
||||
+#define __NR_set_mempolicy_home_node 450
|
||||
+#define __NR_cachestat 451
|
||||
+#define __NR_fchmodat2 452
|
||||
|
||||
#define __NR_sysriscv __NR_arch_specific_syscall
|
||||
#define __NR_riscv_flush_icache (__NR_sysriscv + 15)
|
||||
--- a/arch/s390x/bits/syscall.h.in
|
||||
+++ b/arch/s390x/bits/syscall.h.in
|
||||
@@ -350,4 +350,22 @@
|
||||
#define __NR_fsconfig 431
|
||||
#define __NR_fsmount 432
|
||||
#define __NR_fspick 433
|
||||
+#define __NR_pidfd_open 434
|
||||
+#define __NR_clone3 435
|
||||
+#define __NR_close_range 436
|
||||
+#define __NR_openat2 437
|
||||
+#define __NR_pidfd_getfd 438
|
||||
+#define __NR_faccessat2 439
|
||||
+#define __NR_process_madvise 440
|
||||
+#define __NR_epoll_pwait2 441
|
||||
+#define __NR_mount_setattr 442
|
||||
+#define __NR_landlock_create_ruleset 444
|
||||
+#define __NR_landlock_add_rule 445
|
||||
+#define __NR_landlock_restrict_self 446
|
||||
+#define __NR_memfd_secret 447
|
||||
+#define __NR_process_mrelease 448
|
||||
+#define __NR_futex_waitv 449
|
||||
+#define __NR_set_mempolicy_home_node 450
|
||||
+#define __NR_cachestat 451
|
||||
+#define __NR_fchmodat2 452
|
||||
|
||||
--- a/arch/sh/bits/syscall.h.in
|
||||
+++ b/arch/sh/bits/syscall.h.in
|
||||
@@ -397,4 +397,21 @@
|
||||
#define __NR_fsconfig 431
|
||||
#define __NR_fsmount 432
|
||||
#define __NR_fspick 433
|
||||
+#define __NR_pidfd_open 434
|
||||
+#define __NR_clone3 435
|
||||
+#define __NR_close_range 436
|
||||
+#define __NR_openat2 437
|
||||
+#define __NR_pidfd_getfd 438
|
||||
+#define __NR_faccessat2 439
|
||||
+#define __NR_process_madvise 440
|
||||
+#define __NR_epoll_pwait2 441
|
||||
+#define __NR_mount_setattr 442
|
||||
+#define __NR_landlock_create_ruleset 444
|
||||
+#define __NR_landlock_add_rule 445
|
||||
+#define __NR_landlock_restrict_self 446
|
||||
+#define __NR_process_mrelease 448
|
||||
+#define __NR_futex_waitv 449
|
||||
+#define __NR_set_mempolicy_home_node 450
|
||||
+#define __NR_cachestat 451
|
||||
+#define __NR_fchmodat2 452
|
||||
|
||||
--- a/arch/x32/bits/syscall.h.in
|
||||
+++ b/arch/x32/bits/syscall.h.in
|
||||
@@ -296,6 +296,24 @@
|
||||
#define __NR_fsconfig (0x40000000 + 431)
|
||||
#define __NR_fsmount (0x40000000 + 432)
|
||||
#define __NR_fspick (0x40000000 + 433)
|
||||
+#define __NR_pidfd_open (0x40000000 + 434)
|
||||
+#define __NR_clone3 (0x40000000 + 435)
|
||||
+#define __NR_close_range (0x40000000 + 436)
|
||||
+#define __NR_openat2 (0x40000000 + 437)
|
||||
+#define __NR_pidfd_getfd (0x40000000 + 438)
|
||||
+#define __NR_faccessat2 (0x40000000 + 439)
|
||||
+#define __NR_process_madvise (0x40000000 + 440)
|
||||
+#define __NR_epoll_pwait2 (0x40000000 + 441)
|
||||
+#define __NR_mount_setattr (0x40000000 + 442)
|
||||
+#define __NR_landlock_create_ruleset (0x40000000 + 444)
|
||||
+#define __NR_landlock_add_rule (0x40000000 + 445)
|
||||
+#define __NR_landlock_restrict_self (0x40000000 + 446)
|
||||
+#define __NR_memfd_secret (0x40000000 + 447)
|
||||
+#define __NR_process_mrelease (0x40000000 + 448)
|
||||
+#define __NR_futex_waitv (0x40000000 + 449)
|
||||
+#define __NR_set_mempolicy_home_node (0x40000000 + 450)
|
||||
+#define __NR_cachestat (0x40000000 + 451)
|
||||
+#define __NR_fchmodat2 (0x40000000 + 452)
|
||||
|
||||
#define __NR_rt_sigaction (0x40000000 + 512)
|
||||
#define __NR_rt_sigreturn (0x40000000 + 513)
|
||||
--- a/arch/x86_64/bits/syscall.h.in
|
||||
+++ b/arch/x86_64/bits/syscall.h.in
|
||||
@@ -343,4 +343,22 @@
|
||||
#define __NR_fsconfig 431
|
||||
#define __NR_fsmount 432
|
||||
#define __NR_fspick 433
|
||||
+#define __NR_pidfd_open 434
|
||||
+#define __NR_clone3 435
|
||||
+#define __NR_close_range 436
|
||||
+#define __NR_openat2 437
|
||||
+#define __NR_pidfd_getfd 438
|
||||
+#define __NR_faccessat2 439
|
||||
+#define __NR_process_madvise 440
|
||||
+#define __NR_epoll_pwait2 441
|
||||
+#define __NR_mount_setattr 442
|
||||
+#define __NR_landlock_create_ruleset 444
|
||||
+#define __NR_landlock_add_rule 445
|
||||
+#define __NR_landlock_restrict_self 446
|
||||
+#define __NR_memfd_secret 447
|
||||
+#define __NR_process_mrelease 448
|
||||
+#define __NR_futex_waitv 449
|
||||
+#define __NR_set_mempolicy_home_node 450
|
||||
+#define __NR_cachestat 451
|
||||
+#define __NR_fchmodat2 452
|
||||
|
|
@ -1,38 +0,0 @@
|
|||
commit c2518a8efb6507f1b41c3b12e03b06f8f2317a1f
|
||||
Author: Rich Felker <dalias@aerifal.cx>
|
||||
Date: Sat Oct 19 15:53:43 2019 -0400
|
||||
|
||||
use struct pt_regs * rather than void * for powerpc[64] sigcontext regs
|
||||
|
||||
this is to match the kernel and glibc interfaces. here, struct pt_regs
|
||||
is an incomplete type, but that's harmless, and if it's completed by
|
||||
inclusion of another header then members of the struct pointed to by
|
||||
the regs member can be accessed directly without going through a cast
|
||||
or intermediate pointer object.
|
||||
|
||||
diff --git a/arch/powerpc/bits/signal.h b/arch/powerpc/bits/signal.h
|
||||
index 06efb11c..c1bf3caf 100644
|
||||
--- a/arch/powerpc/bits/signal.h
|
||||
+++ b/arch/powerpc/bits/signal.h
|
||||
@@ -28,7 +28,7 @@ struct sigcontext {
|
||||
int signal;
|
||||
unsigned long handler;
|
||||
unsigned long oldmask;
|
||||
- void *regs;
|
||||
+ struct pt_regs *regs;
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
diff --git a/arch/powerpc64/bits/signal.h b/arch/powerpc64/bits/signal.h
|
||||
index 4dec22a5..d5493b18 100644
|
||||
--- a/arch/powerpc64/bits/signal.h
|
||||
+++ b/arch/powerpc64/bits/signal.h
|
||||
@@ -32,7 +32,7 @@ typedef struct sigcontext {
|
||||
int _pad0;
|
||||
unsigned long handler;
|
||||
unsigned long oldmask;
|
||||
- void *regs;
|
||||
+ struct pt_regs *regs;
|
||||
gregset_t gp_regs;
|
||||
fpregset_t fp_regs;
|
||||
vrregset_t *v_regs;
|
|
@ -1,31 +0,0 @@
|
|||
commit c9f48cde0a22641ce3daf54596a9ecebdab91435
|
||||
Author: Rich Felker <dalias@aerifal.cx>
|
||||
Date: Sat Oct 19 15:39:45 2019 -0400
|
||||
|
||||
fix fpregset_t type on powerpc64
|
||||
|
||||
the userspace ucontext API has this as an array rather than a
|
||||
structure.
|
||||
|
||||
commit 3c59a868956636bc8adafb1b168d090897692532 fixed the
|
||||
corresponding mistake for vrregset_t, namely that the original
|
||||
powerpc64 port used a mix of types from 32-bit powerpc and powerpc64
|
||||
rather than matching the 64-bit types.
|
||||
|
||||
diff --git a/arch/powerpc64/bits/signal.h b/arch/powerpc64/bits/signal.h
|
||||
index 2cc0604c..4dec22a5 100644
|
||||
--- a/arch/powerpc64/bits/signal.h
|
||||
+++ b/arch/powerpc64/bits/signal.h
|
||||
@@ -9,11 +9,7 @@
|
||||
#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
|
||||
|
||||
typedef unsigned long greg_t, gregset_t[48];
|
||||
-
|
||||
-typedef struct {
|
||||
- double fpregs[32];
|
||||
- double fpscr;
|
||||
-} fpregset_t;
|
||||
+typedef double fpregset_t[33];
|
||||
|
||||
typedef struct {
|
||||
#ifdef __GNUC__
|
|
@ -11,14 +11,14 @@ diff --git configure configure
|
|||
index 8680128..f1ca58e 100755
|
||||
--- a/configure
|
||||
+++ b/configure
|
||||
@@ -645,6 +645,7 @@ fi
|
||||
if test "$ARCH" = "powerpc" ; then
|
||||
trycppif "__NO_FPRS__ && !_SOFT_FLOAT" "$t" && fail \
|
||||
"$0: error: compiler's floating point configuration is unsupported"
|
||||
+trycppif __LITTLE_ENDIAN__ "$t" && SUBARCH=${SUBARCH}le
|
||||
trycppif _SOFT_FLOAT "$t" && SUBARCH=${SUBARCH}-sf
|
||||
@@ -707,6 +707,7 @@ trycppif __mips_soft_float "$t" && SUBAR
|
||||
fi
|
||||
|
||||
if test "$ARCH" = "powerpc" ; then
|
||||
+trycppif __LITTLE_ENDIAN__ "$t" && SUBARCH=${SUBARCH}le
|
||||
trycppif "_SOFT_FLOAT || __NO_FPRS__" "$t" && SUBARCH=${SUBARCH}-sf
|
||||
printf "checking whether compiler can use 'd' constraint in asm... "
|
||||
echo 'double f(double x) { __asm__ ("fabs %0, %1" : "=d"(x) : "d"(x)); return x; }' > "$tmpc"
|
||||
--
|
||||
2.29.2
|
||||
|
||||
|
|
|
@ -1,255 +0,0 @@
|
|||
From ea71a9004e08030a15d45186e263fd2b0c51cc25 Mon Sep 17 00:00:00 2001
|
||||
From: Rich Felker <dalias@aerifal.cx>
|
||||
Date: Mon, 24 Aug 2020 22:04:52 -0400
|
||||
Subject: [PATCH 3/5] deduplicate TP_ADJ logic out of each arch, replace with
|
||||
TP_OFFSET
|
||||
|
||||
the only part of TP_ADJ that was not uniquely determined by
|
||||
TLS_ABOVE_TP was the 0x7000 adjustment used mainly on mips and powerpc
|
||||
variants.
|
||||
---
|
||||
arch/aarch64/pthread_arch.h | 1 -
|
||||
arch/arm/pthread_arch.h | 1 -
|
||||
arch/i386/pthread_arch.h | 2 --
|
||||
arch/m68k/pthread_arch.h | 2 +-
|
||||
arch/microblaze/pthread_arch.h | 2 --
|
||||
arch/mips/pthread_arch.h | 2 +-
|
||||
arch/mips64/pthread_arch.h | 2 +-
|
||||
arch/mipsn32/pthread_arch.h | 2 +-
|
||||
arch/or1k/pthread_arch.h | 1 -
|
||||
arch/powerpc/pthread_arch.h | 2 +-
|
||||
arch/powerpc64/pthread_arch.h | 2 +-
|
||||
arch/riscv64/pthread_arch.h | 1 -
|
||||
arch/s390x/pthread_arch.h | 2 --
|
||||
arch/sh/pthread_arch.h | 1 -
|
||||
arch/x32/pthread_arch.h | 2 --
|
||||
arch/x86_64/pthread_arch.h | 2 --
|
||||
src/internal/pthread_impl.h | 10 ++++++++++
|
||||
17 files changed, 16 insertions(+), 21 deletions(-)
|
||||
|
||||
diff --git a/arch/aarch64/pthread_arch.h b/arch/aarch64/pthread_arch.h
|
||||
index e64b126d..f3c005c7 100644
|
||||
--- a/arch/aarch64/pthread_arch.h
|
||||
+++ b/arch/aarch64/pthread_arch.h
|
||||
@@ -7,6 +7,5 @@ static inline struct pthread *__pthread_self()
|
||||
|
||||
#define TLS_ABOVE_TP
|
||||
#define GAP_ABOVE_TP 16
|
||||
-#define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread))
|
||||
|
||||
#define MC_PC pc
|
||||
diff --git a/arch/arm/pthread_arch.h b/arch/arm/pthread_arch.h
|
||||
index e689ea21..48640985 100644
|
||||
--- a/arch/arm/pthread_arch.h
|
||||
+++ b/arch/arm/pthread_arch.h
|
||||
@@ -28,6 +28,5 @@ static inline pthread_t __pthread_self()
|
||||
|
||||
#define TLS_ABOVE_TP
|
||||
#define GAP_ABOVE_TP 8
|
||||
-#define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread))
|
||||
|
||||
#define MC_PC arm_pc
|
||||
diff --git a/arch/i386/pthread_arch.h b/arch/i386/pthread_arch.h
|
||||
index 6f600b9e..32570a17 100644
|
||||
--- a/arch/i386/pthread_arch.h
|
||||
+++ b/arch/i386/pthread_arch.h
|
||||
@@ -5,6 +5,4 @@ static inline struct pthread *__pthread_self()
|
||||
return self;
|
||||
}
|
||||
|
||||
-#define TP_ADJ(p) (p)
|
||||
-
|
||||
#define MC_PC gregs[REG_EIP]
|
||||
diff --git a/arch/m68k/pthread_arch.h b/arch/m68k/pthread_arch.h
|
||||
index 02d5b8a0..7c9990c2 100644
|
||||
--- a/arch/m68k/pthread_arch.h
|
||||
+++ b/arch/m68k/pthread_arch.h
|
||||
@@ -6,8 +6,8 @@ static inline struct pthread *__pthread_self()
|
||||
|
||||
#define TLS_ABOVE_TP
|
||||
#define GAP_ABOVE_TP 0
|
||||
-#define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread) + 0x7000)
|
||||
|
||||
+#define TP_OFFSET 0x7000
|
||||
#define DTP_OFFSET 0x8000
|
||||
|
||||
#define MC_PC gregs[R_PC]
|
||||
diff --git a/arch/microblaze/pthread_arch.h b/arch/microblaze/pthread_arch.h
|
||||
index f6ba8de9..c327f4eb 100644
|
||||
--- a/arch/microblaze/pthread_arch.h
|
||||
+++ b/arch/microblaze/pthread_arch.h
|
||||
@@ -5,6 +5,4 @@ static inline struct pthread *__pthread_self()
|
||||
return self;
|
||||
}
|
||||
|
||||
-#define TP_ADJ(p) (p)
|
||||
-
|
||||
#define MC_PC regs.pc
|
||||
diff --git a/arch/mips/pthread_arch.h b/arch/mips/pthread_arch.h
|
||||
index 1e7839ea..c22eb34d 100644
|
||||
--- a/arch/mips/pthread_arch.h
|
||||
+++ b/arch/mips/pthread_arch.h
|
||||
@@ -12,8 +12,8 @@ static inline struct pthread *__pthread_self()
|
||||
|
||||
#define TLS_ABOVE_TP
|
||||
#define GAP_ABOVE_TP 0
|
||||
-#define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread) + 0x7000)
|
||||
|
||||
+#define TP_OFFSET 0x7000
|
||||
#define DTP_OFFSET 0x8000
|
||||
|
||||
#define MC_PC pc
|
||||
diff --git a/arch/mips64/pthread_arch.h b/arch/mips64/pthread_arch.h
|
||||
index 1e7839ea..c22eb34d 100644
|
||||
--- a/arch/mips64/pthread_arch.h
|
||||
+++ b/arch/mips64/pthread_arch.h
|
||||
@@ -12,8 +12,8 @@ static inline struct pthread *__pthread_self()
|
||||
|
||||
#define TLS_ABOVE_TP
|
||||
#define GAP_ABOVE_TP 0
|
||||
-#define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread) + 0x7000)
|
||||
|
||||
+#define TP_OFFSET 0x7000
|
||||
#define DTP_OFFSET 0x8000
|
||||
|
||||
#define MC_PC pc
|
||||
diff --git a/arch/mipsn32/pthread_arch.h b/arch/mipsn32/pthread_arch.h
|
||||
index 1e7839ea..c22eb34d 100644
|
||||
--- a/arch/mipsn32/pthread_arch.h
|
||||
+++ b/arch/mipsn32/pthread_arch.h
|
||||
@@ -12,8 +12,8 @@ static inline struct pthread *__pthread_self()
|
||||
|
||||
#define TLS_ABOVE_TP
|
||||
#define GAP_ABOVE_TP 0
|
||||
-#define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread) + 0x7000)
|
||||
|
||||
+#define TP_OFFSET 0x7000
|
||||
#define DTP_OFFSET 0x8000
|
||||
|
||||
#define MC_PC pc
|
||||
diff --git a/arch/or1k/pthread_arch.h b/arch/or1k/pthread_arch.h
|
||||
index 1b806f89..76d0a8bc 100644
|
||||
--- a/arch/or1k/pthread_arch.h
|
||||
+++ b/arch/or1k/pthread_arch.h
|
||||
@@ -13,6 +13,5 @@ static inline struct pthread *__pthread_self()
|
||||
|
||||
#define TLS_ABOVE_TP
|
||||
#define GAP_ABOVE_TP 0
|
||||
-#define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread))
|
||||
|
||||
#define MC_PC regs.pc
|
||||
diff --git a/arch/powerpc/pthread_arch.h b/arch/powerpc/pthread_arch.h
|
||||
index ae0f28d6..9697046b 100644
|
||||
--- a/arch/powerpc/pthread_arch.h
|
||||
+++ b/arch/powerpc/pthread_arch.h
|
||||
@@ -7,8 +7,8 @@ static inline struct pthread *__pthread_self()
|
||||
|
||||
#define TLS_ABOVE_TP
|
||||
#define GAP_ABOVE_TP 0
|
||||
-#define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread) + 0x7000)
|
||||
|
||||
+#define TP_OFFSET 0x7000
|
||||
#define DTP_OFFSET 0x8000
|
||||
|
||||
// the kernel calls the ip "nip", it's the first saved value after the 32
|
||||
diff --git a/arch/powerpc64/pthread_arch.h b/arch/powerpc64/pthread_arch.h
|
||||
index 79c3ecd8..e9dba43f 100644
|
||||
--- a/arch/powerpc64/pthread_arch.h
|
||||
+++ b/arch/powerpc64/pthread_arch.h
|
||||
@@ -7,8 +7,8 @@ static inline struct pthread *__pthread_self()
|
||||
|
||||
#define TLS_ABOVE_TP
|
||||
#define GAP_ABOVE_TP 0
|
||||
-#define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread) + 0x7000)
|
||||
|
||||
+#define TP_OFFSET 0x7000
|
||||
#define DTP_OFFSET 0x8000
|
||||
|
||||
// the kernel calls the ip "nip", it's the first saved value after the 32
|
||||
diff --git a/arch/riscv64/pthread_arch.h b/arch/riscv64/pthread_arch.h
|
||||
index db414b17..50f0868d 100644
|
||||
--- a/arch/riscv64/pthread_arch.h
|
||||
+++ b/arch/riscv64/pthread_arch.h
|
||||
@@ -7,7 +7,6 @@ static inline struct pthread *__pthread_self()
|
||||
|
||||
#define TLS_ABOVE_TP
|
||||
#define GAP_ABOVE_TP 0
|
||||
-#define TP_ADJ(p) ((char *)p + sizeof(struct pthread))
|
||||
|
||||
#define DTP_OFFSET 0x800
|
||||
|
||||
diff --git a/arch/s390x/pthread_arch.h b/arch/s390x/pthread_arch.h
|
||||
index e2251f1f..5d22546b 100644
|
||||
--- a/arch/s390x/pthread_arch.h
|
||||
+++ b/arch/s390x/pthread_arch.h
|
||||
@@ -9,6 +9,4 @@ static inline struct pthread *__pthread_self()
|
||||
return self;
|
||||
}
|
||||
|
||||
-#define TP_ADJ(p) (p)
|
||||
-
|
||||
#define MC_PC psw.addr
|
||||
diff --git a/arch/sh/pthread_arch.h b/arch/sh/pthread_arch.h
|
||||
index 3ee9c1a9..c2252908 100644
|
||||
--- a/arch/sh/pthread_arch.h
|
||||
+++ b/arch/sh/pthread_arch.h
|
||||
@@ -7,7 +7,6 @@ static inline struct pthread *__pthread_self()
|
||||
|
||||
#define TLS_ABOVE_TP
|
||||
#define GAP_ABOVE_TP 8
|
||||
-#define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread))
|
||||
|
||||
#define MC_PC sc_pc
|
||||
|
||||
diff --git a/arch/x32/pthread_arch.h b/arch/x32/pthread_arch.h
|
||||
index f640a1a1..fa452839 100644
|
||||
--- a/arch/x32/pthread_arch.h
|
||||
+++ b/arch/x32/pthread_arch.h
|
||||
@@ -5,8 +5,6 @@ static inline struct pthread *__pthread_self()
|
||||
return self;
|
||||
}
|
||||
|
||||
-#define TP_ADJ(p) (p)
|
||||
-
|
||||
#define MC_PC gregs[REG_RIP]
|
||||
|
||||
#define CANARY canary2
|
||||
diff --git a/arch/x86_64/pthread_arch.h b/arch/x86_64/pthread_arch.h
|
||||
index 65e880c6..1c64a840 100644
|
||||
--- a/arch/x86_64/pthread_arch.h
|
||||
+++ b/arch/x86_64/pthread_arch.h
|
||||
@@ -5,6 +5,4 @@ static inline struct pthread *__pthread_self()
|
||||
return self;
|
||||
}
|
||||
|
||||
-#define TP_ADJ(p) (p)
|
||||
-
|
||||
#define MC_PC gregs[REG_RIP]
|
||||
diff --git a/src/internal/pthread_impl.h b/src/internal/pthread_impl.h
|
||||
index 5749a336..3c2bd767 100644
|
||||
--- a/src/internal/pthread_impl.h
|
||||
+++ b/src/internal/pthread_impl.h
|
||||
@@ -105,10 +105,20 @@ struct __timer {
|
||||
#define CANARY canary
|
||||
#endif
|
||||
|
||||
+#ifndef TP_OFFSET
|
||||
+#define TP_OFFSET 0
|
||||
+#endif
|
||||
+
|
||||
#ifndef DTP_OFFSET
|
||||
#define DTP_OFFSET 0
|
||||
#endif
|
||||
|
||||
+#ifdef TLS_ABOVE_TP
|
||||
+#define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread) + TP_OFFSET)
|
||||
+#else
|
||||
+#define TP_ADJ(p) (p)
|
||||
+#endif
|
||||
+
|
||||
#ifndef tls_mod_off_t
|
||||
#define tls_mod_off_t size_t
|
||||
#endif
|
||||
--
|
||||
2.47.0
|
||||
|
|
@ -1,368 +0,0 @@
|
|||
From 3a5b9ae7cf656648c80fe155a5239d9b4fb4c485 Mon Sep 17 00:00:00 2001
|
||||
From: Rich Felker <dalias@aerifal.cx>
|
||||
Date: Mon, 24 Aug 2020 22:23:08 -0400
|
||||
Subject: [PATCH 1/2] deduplicate __pthread_self thread pointer adjustment out
|
||||
of each arch
|
||||
|
||||
the adjustment made is entirely a function of TLS_ABOVE_TP and
|
||||
TP_OFFSET. aside from avoiding repetition of the TP_OFFSET value and
|
||||
arithmetic, this change makes pthread_arch.h independent of the
|
||||
definition of struct __pthread from pthread_impl.h. this in turn will
|
||||
allow inclusion of pthread_arch.h to be moved to the top of
|
||||
pthread_impl.h so that it can influence the definition of the
|
||||
structure.
|
||||
|
||||
previously, arch files were very inconsistent about the type used for
|
||||
the thread pointer. this change unifies the new __get_tp interface to
|
||||
always use uintptr_t, which is the most correct when performing
|
||||
arithmetic that may involve addresses outside the actual pointed-to
|
||||
object (due to TP_OFFSET).
|
||||
---
|
||||
arch/aarch64/pthread_arch.h | 8 ++++----
|
||||
arch/arm/pthread_arch.h | 16 ++++++++--------
|
||||
arch/i386/pthread_arch.h | 8 ++++----
|
||||
arch/m68k/pthread_arch.h | 5 ++---
|
||||
arch/microblaze/pthread_arch.h | 8 ++++----
|
||||
arch/mips/pthread_arch.h | 8 ++++----
|
||||
arch/mips64/pthread_arch.h | 8 ++++----
|
||||
arch/mipsn32/pthread_arch.h | 8 ++++----
|
||||
arch/or1k/pthread_arch.h | 9 ++++-----
|
||||
arch/powerpc/pthread_arch.h | 6 +++---
|
||||
arch/powerpc64/pthread_arch.h | 6 +++---
|
||||
arch/riscv64/pthread_arch.h | 6 +++---
|
||||
arch/s390x/pthread_arch.h | 8 ++++----
|
||||
arch/sh/pthread_arch.h | 8 ++++----
|
||||
arch/x32/pthread_arch.h | 8 ++++----
|
||||
arch/x86_64/pthread_arch.h | 8 ++++----
|
||||
src/internal/pthread_impl.h | 2 ++
|
||||
17 files changed, 65 insertions(+), 65 deletions(-)
|
||||
|
||||
diff --git a/arch/aarch64/pthread_arch.h b/arch/aarch64/pthread_arch.h
|
||||
index f3c005c7..3909616c 100644
|
||||
--- a/arch/aarch64/pthread_arch.h
|
||||
+++ b/arch/aarch64/pthread_arch.h
|
||||
@@ -1,8 +1,8 @@
|
||||
-static inline struct pthread *__pthread_self()
|
||||
+static inline uintptr_t __get_tp()
|
||||
{
|
||||
- char *self;
|
||||
- __asm__ ("mrs %0,tpidr_el0" : "=r"(self));
|
||||
- return (void*)(self - sizeof(struct pthread));
|
||||
+ uintptr_t tp;
|
||||
+ __asm__ ("mrs %0,tpidr_el0" : "=r"(tp));
|
||||
+ return tp;
|
||||
}
|
||||
|
||||
#define TLS_ABOVE_TP
|
||||
diff --git a/arch/arm/pthread_arch.h b/arch/arm/pthread_arch.h
|
||||
index 48640985..157e2eae 100644
|
||||
--- a/arch/arm/pthread_arch.h
|
||||
+++ b/arch/arm/pthread_arch.h
|
||||
@@ -1,11 +1,11 @@
|
||||
#if ((__ARM_ARCH_6K__ || __ARM_ARCH_6KZ__ || __ARM_ARCH_6ZK__) && !__thumb__) \
|
||||
|| __ARM_ARCH_7A__ || __ARM_ARCH_7R__ || __ARM_ARCH >= 7
|
||||
|
||||
-static inline pthread_t __pthread_self()
|
||||
+static inline uintptr_t __get_tp()
|
||||
{
|
||||
- char *p;
|
||||
- __asm__ ( "mrc p15,0,%0,c13,c0,3" : "=r"(p) );
|
||||
- return (void *)(p-sizeof(struct pthread));
|
||||
+ uintptr_t tp;
|
||||
+ __asm__ ( "mrc p15,0,%0,c13,c0,3" : "=r"(tp) );
|
||||
+ return tp;
|
||||
}
|
||||
|
||||
#else
|
||||
@@ -16,12 +16,12 @@ static inline pthread_t __pthread_self()
|
||||
#define BLX "blx"
|
||||
#endif
|
||||
|
||||
-static inline pthread_t __pthread_self()
|
||||
+static inline uintptr_t __get_tp()
|
||||
{
|
||||
extern hidden uintptr_t __a_gettp_ptr;
|
||||
- register uintptr_t p __asm__("r0");
|
||||
- __asm__ ( BLX " %1" : "=r"(p) : "r"(__a_gettp_ptr) : "cc", "lr" );
|
||||
- return (void *)(p-sizeof(struct pthread));
|
||||
+ register uintptr_t tp __asm__("r0");
|
||||
+ __asm__ ( BLX " %1" : "=r"(tp) : "r"(__a_gettp_ptr) : "cc", "lr" );
|
||||
+ return tp;
|
||||
}
|
||||
|
||||
#endif
|
||||
diff --git a/arch/i386/pthread_arch.h b/arch/i386/pthread_arch.h
|
||||
index 32570a17..a639c382 100644
|
||||
--- a/arch/i386/pthread_arch.h
|
||||
+++ b/arch/i386/pthread_arch.h
|
||||
@@ -1,8 +1,8 @@
|
||||
-static inline struct pthread *__pthread_self()
|
||||
+static inline uintptr_t __get_tp()
|
||||
{
|
||||
- struct pthread *self;
|
||||
- __asm__ ("movl %%gs:0,%0" : "=r" (self) );
|
||||
- return self;
|
||||
+ uintptr_t tp;
|
||||
+ __asm__ ("movl %%gs:0,%0" : "=r" (tp) );
|
||||
+ return tp;
|
||||
}
|
||||
|
||||
#define MC_PC gregs[REG_EIP]
|
||||
diff --git a/arch/m68k/pthread_arch.h b/arch/m68k/pthread_arch.h
|
||||
index 7c9990c2..5bea4e1a 100644
|
||||
--- a/arch/m68k/pthread_arch.h
|
||||
+++ b/arch/m68k/pthread_arch.h
|
||||
@@ -1,7 +1,6 @@
|
||||
-static inline struct pthread *__pthread_self()
|
||||
+static inline uintptr_t __get_tp()
|
||||
{
|
||||
- uintptr_t tp = __syscall(SYS_get_thread_area);
|
||||
- return (pthread_t)(tp - 0x7000 - sizeof(struct pthread));
|
||||
+ return __syscall(SYS_get_thread_area);
|
||||
}
|
||||
|
||||
#define TLS_ABOVE_TP
|
||||
diff --git a/arch/microblaze/pthread_arch.h b/arch/microblaze/pthread_arch.h
|
||||
index c327f4eb..ff26624e 100644
|
||||
--- a/arch/microblaze/pthread_arch.h
|
||||
+++ b/arch/microblaze/pthread_arch.h
|
||||
@@ -1,8 +1,8 @@
|
||||
-static inline struct pthread *__pthread_self()
|
||||
+static inline uintptr_t __get_tp()
|
||||
{
|
||||
- struct pthread *self;
|
||||
- __asm__ ("ori %0, r21, 0" : "=r" (self) );
|
||||
- return self;
|
||||
+ uintptr_t tp;
|
||||
+ __asm__ ("ori %0, r21, 0" : "=r" (tp) );
|
||||
+ return tp;
|
||||
}
|
||||
|
||||
#define MC_PC regs.pc
|
||||
diff --git a/arch/mips/pthread_arch.h b/arch/mips/pthread_arch.h
|
||||
index c22eb34d..c45347ab 100644
|
||||
--- a/arch/mips/pthread_arch.h
|
||||
+++ b/arch/mips/pthread_arch.h
|
||||
@@ -1,13 +1,13 @@
|
||||
-static inline struct pthread *__pthread_self()
|
||||
+static inline uintptr_t __get_tp()
|
||||
{
|
||||
#if __mips_isa_rev < 2
|
||||
- register char *tp __asm__("$3");
|
||||
+ register uintptr_t tp __asm__("$3");
|
||||
__asm__ (".word 0x7c03e83b" : "=r" (tp) );
|
||||
#else
|
||||
- char *tp;
|
||||
+ uintptr_t tp;
|
||||
__asm__ ("rdhwr %0, $29" : "=r" (tp) );
|
||||
#endif
|
||||
- return (pthread_t)(tp - 0x7000 - sizeof(struct pthread));
|
||||
+ return tp;
|
||||
}
|
||||
|
||||
#define TLS_ABOVE_TP
|
||||
diff --git a/arch/mips64/pthread_arch.h b/arch/mips64/pthread_arch.h
|
||||
index c22eb34d..c45347ab 100644
|
||||
--- a/arch/mips64/pthread_arch.h
|
||||
+++ b/arch/mips64/pthread_arch.h
|
||||
@@ -1,13 +1,13 @@
|
||||
-static inline struct pthread *__pthread_self()
|
||||
+static inline uintptr_t __get_tp()
|
||||
{
|
||||
#if __mips_isa_rev < 2
|
||||
- register char *tp __asm__("$3");
|
||||
+ register uintptr_t tp __asm__("$3");
|
||||
__asm__ (".word 0x7c03e83b" : "=r" (tp) );
|
||||
#else
|
||||
- char *tp;
|
||||
+ uintptr_t tp;
|
||||
__asm__ ("rdhwr %0, $29" : "=r" (tp) );
|
||||
#endif
|
||||
- return (pthread_t)(tp - 0x7000 - sizeof(struct pthread));
|
||||
+ return tp;
|
||||
}
|
||||
|
||||
#define TLS_ABOVE_TP
|
||||
diff --git a/arch/mipsn32/pthread_arch.h b/arch/mipsn32/pthread_arch.h
|
||||
index c22eb34d..c45347ab 100644
|
||||
--- a/arch/mipsn32/pthread_arch.h
|
||||
+++ b/arch/mipsn32/pthread_arch.h
|
||||
@@ -1,13 +1,13 @@
|
||||
-static inline struct pthread *__pthread_self()
|
||||
+static inline uintptr_t __get_tp()
|
||||
{
|
||||
#if __mips_isa_rev < 2
|
||||
- register char *tp __asm__("$3");
|
||||
+ register uintptr_t tp __asm__("$3");
|
||||
__asm__ (".word 0x7c03e83b" : "=r" (tp) );
|
||||
#else
|
||||
- char *tp;
|
||||
+ uintptr_t tp;
|
||||
__asm__ ("rdhwr %0, $29" : "=r" (tp) );
|
||||
#endif
|
||||
- return (pthread_t)(tp - 0x7000 - sizeof(struct pthread));
|
||||
+ return tp;
|
||||
}
|
||||
|
||||
#define TLS_ABOVE_TP
|
||||
diff --git a/arch/or1k/pthread_arch.h b/arch/or1k/pthread_arch.h
|
||||
index 76d0a8bc..f75ea7e4 100644
|
||||
--- a/arch/or1k/pthread_arch.h
|
||||
+++ b/arch/or1k/pthread_arch.h
|
||||
@@ -1,14 +1,13 @@
|
||||
-/* or1k use variant I, but with the twist that tp points to the end of TCB */
|
||||
-static inline struct pthread *__pthread_self()
|
||||
+static inline uintptr_t __get_tp()
|
||||
{
|
||||
#ifdef __clang__
|
||||
- char *tp;
|
||||
+ uintptr_t tp;
|
||||
__asm__ ("l.ori %0, r10, 0" : "=r" (tp) );
|
||||
#else
|
||||
- register char *tp __asm__("r10");
|
||||
+ register uintptr_t tp __asm__("r10");
|
||||
__asm__ ("" : "=r" (tp) );
|
||||
#endif
|
||||
- return (struct pthread *) (tp - sizeof(struct pthread));
|
||||
+ return tp;
|
||||
}
|
||||
|
||||
#define TLS_ABOVE_TP
|
||||
diff --git a/arch/powerpc/pthread_arch.h b/arch/powerpc/pthread_arch.h
|
||||
index 9697046b..a0947763 100644
|
||||
--- a/arch/powerpc/pthread_arch.h
|
||||
+++ b/arch/powerpc/pthread_arch.h
|
||||
@@ -1,8 +1,8 @@
|
||||
-static inline struct pthread *__pthread_self()
|
||||
+static inline uintptr_t __get_tp()
|
||||
{
|
||||
- register char *tp __asm__("r2");
|
||||
+ register uintptr_t tp __asm__("r2");
|
||||
__asm__ ("" : "=r" (tp) );
|
||||
- return (pthread_t)(tp - 0x7000 - sizeof(struct pthread));
|
||||
+ return tp;
|
||||
}
|
||||
|
||||
#define TLS_ABOVE_TP
|
||||
diff --git a/arch/powerpc64/pthread_arch.h b/arch/powerpc64/pthread_arch.h
|
||||
index e9dba43f..08a557d2 100644
|
||||
--- a/arch/powerpc64/pthread_arch.h
|
||||
+++ b/arch/powerpc64/pthread_arch.h
|
||||
@@ -1,8 +1,8 @@
|
||||
-static inline struct pthread *__pthread_self()
|
||||
+static inline uintptr_t __get_tp()
|
||||
{
|
||||
- register char *tp __asm__("r13");
|
||||
+ register uintptr_t tp __asm__("r13");
|
||||
__asm__ ("" : "=r" (tp) );
|
||||
- return (pthread_t)(tp - 0x7000 - sizeof(struct pthread));
|
||||
+ return tp;
|
||||
}
|
||||
|
||||
#define TLS_ABOVE_TP
|
||||
diff --git a/arch/riscv64/pthread_arch.h b/arch/riscv64/pthread_arch.h
|
||||
index 50f0868d..a20d7fba 100644
|
||||
--- a/arch/riscv64/pthread_arch.h
|
||||
+++ b/arch/riscv64/pthread_arch.h
|
||||
@@ -1,8 +1,8 @@
|
||||
-static inline struct pthread *__pthread_self()
|
||||
+static inline uintptr_t __get_tp()
|
||||
{
|
||||
- char *tp;
|
||||
+ uintptr_t tp;
|
||||
__asm__ __volatile__("mv %0, tp" : "=r"(tp));
|
||||
- return (void *)(tp - sizeof(struct pthread));
|
||||
+ return tp;
|
||||
}
|
||||
|
||||
#define TLS_ABOVE_TP
|
||||
diff --git a/arch/s390x/pthread_arch.h b/arch/s390x/pthread_arch.h
|
||||
index 5d22546b..e54fec3f 100644
|
||||
--- a/arch/s390x/pthread_arch.h
|
||||
+++ b/arch/s390x/pthread_arch.h
|
||||
@@ -1,12 +1,12 @@
|
||||
-static inline struct pthread *__pthread_self()
|
||||
+static inline uintptr_t __get_tp()
|
||||
{
|
||||
- struct pthread *self;
|
||||
+ uintptr_t tp;
|
||||
__asm__ (
|
||||
"ear %0, %%a0\n"
|
||||
"sllg %0, %0, 32\n"
|
||||
"ear %0, %%a1\n"
|
||||
- : "=r"(self));
|
||||
- return self;
|
||||
+ : "=r"(tp));
|
||||
+ return tp;
|
||||
}
|
||||
|
||||
#define MC_PC psw.addr
|
||||
diff --git a/arch/sh/pthread_arch.h b/arch/sh/pthread_arch.h
|
||||
index c2252908..0fcf70d2 100644
|
||||
--- a/arch/sh/pthread_arch.h
|
||||
+++ b/arch/sh/pthread_arch.h
|
||||
@@ -1,8 +1,8 @@
|
||||
-static inline struct pthread *__pthread_self()
|
||||
+static inline uintptr_t __get_tp()
|
||||
{
|
||||
- char *self;
|
||||
- __asm__ ("stc gbr,%0" : "=r" (self) );
|
||||
- return (struct pthread *) (self - sizeof(struct pthread));
|
||||
+ uintptr_t tp;
|
||||
+ __asm__ ("stc gbr,%0" : "=r" (tp) );
|
||||
+ return tp;
|
||||
}
|
||||
|
||||
#define TLS_ABOVE_TP
|
||||
diff --git a/arch/x32/pthread_arch.h b/arch/x32/pthread_arch.h
|
||||
index fa452839..6e2495da 100644
|
||||
--- a/arch/x32/pthread_arch.h
|
||||
+++ b/arch/x32/pthread_arch.h
|
||||
@@ -1,8 +1,8 @@
|
||||
-static inline struct pthread *__pthread_self()
|
||||
+static inline uintptr_t __get_tp()
|
||||
{
|
||||
- struct pthread *self;
|
||||
- __asm__ ("mov %%fs:0,%0" : "=r" (self) );
|
||||
- return self;
|
||||
+ uintptr_t tp;
|
||||
+ __asm__ ("mov %%fs:0,%0" : "=r" (tp) );
|
||||
+ return tp;
|
||||
}
|
||||
|
||||
#define MC_PC gregs[REG_RIP]
|
||||
diff --git a/arch/x86_64/pthread_arch.h b/arch/x86_64/pthread_arch.h
|
||||
index 1c64a840..c8c63f2e 100644
|
||||
--- a/arch/x86_64/pthread_arch.h
|
||||
+++ b/arch/x86_64/pthread_arch.h
|
||||
@@ -1,8 +1,8 @@
|
||||
-static inline struct pthread *__pthread_self()
|
||||
+static inline uintptr_t __get_tp()
|
||||
{
|
||||
- struct pthread *self;
|
||||
- __asm__ ("mov %%fs:0,%0" : "=r" (self) );
|
||||
- return self;
|
||||
+ uintptr_t tp;
|
||||
+ __asm__ ("mov %%fs:0,%0" : "=r" (tp) );
|
||||
+ return tp;
|
||||
}
|
||||
|
||||
#define MC_PC gregs[REG_RIP]
|
||||
diff --git a/src/internal/pthread_impl.h b/src/internal/pthread_impl.h
|
||||
index 3c2bd767..58e06136 100644
|
||||
--- a/src/internal/pthread_impl.h
|
||||
+++ b/src/internal/pthread_impl.h
|
||||
@@ -115,8 +115,10 @@ struct __timer {
|
||||
|
||||
#ifdef TLS_ABOVE_TP
|
||||
#define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread) + TP_OFFSET)
|
||||
+#define __pthread_self() ((pthread_t)(__get_tp() - sizeof(struct __pthread) - TP_OFFSET))
|
||||
#else
|
||||
#define TP_ADJ(p) (p)
|
||||
+#define __pthread_self() ((pthread_t)__get_tp())
|
||||
#endif
|
||||
|
||||
#ifndef tls_mod_off_t
|
||||
--
|
||||
2.47.0
|
||||
|
|
@ -1,165 +0,0 @@
|
|||
From 57f6e85c9de417fef5eece2a5b00c1104321f543 Mon Sep 17 00:00:00 2001
|
||||
From: Rich Felker <dalias@aerifal.cx>
|
||||
Date: Mon, 24 Aug 2020 22:45:51 -0400
|
||||
Subject: [PATCH 2/2] remove redundant pthread struct members repeated for
|
||||
layout purposes
|
||||
|
||||
dtv_copy, canary2, and canary_at_end existed solely to match multiple
|
||||
ABI and asm-accessed layouts simultaneously. now that pthread_arch.h
|
||||
can be included before struct __pthread is defined, the struct layout
|
||||
can depend on macros defined by pthread_arch.h.
|
||||
---
|
||||
arch/powerpc/pthread_arch.h | 2 --
|
||||
arch/powerpc64/pthread_arch.h | 2 --
|
||||
arch/x32/pthread_arch.h | 2 +-
|
||||
ldso/dynlink.c | 2 +-
|
||||
src/env/__init_tls.c | 2 +-
|
||||
src/env/__stack_chk_fail.c | 2 +-
|
||||
src/internal/pthread_impl.h | 23 ++++++++++++++---------
|
||||
src/thread/pthread_create.c | 2 +-
|
||||
8 files changed, 19 insertions(+), 18 deletions(-)
|
||||
|
||||
diff --git a/arch/powerpc/pthread_arch.h b/arch/powerpc/pthread_arch.h
|
||||
index a0947763..42e88b07 100644
|
||||
--- a/arch/powerpc/pthread_arch.h
|
||||
+++ b/arch/powerpc/pthread_arch.h
|
||||
@@ -14,5 +14,3 @@ static inline uintptr_t __get_tp()
|
||||
// the kernel calls the ip "nip", it's the first saved value after the 32
|
||||
// GPRs.
|
||||
#define MC_PC gregs[32]
|
||||
-
|
||||
-#define CANARY canary_at_end
|
||||
diff --git a/arch/powerpc64/pthread_arch.h b/arch/powerpc64/pthread_arch.h
|
||||
index 08a557d2..1b7b9079 100644
|
||||
--- a/arch/powerpc64/pthread_arch.h
|
||||
+++ b/arch/powerpc64/pthread_arch.h
|
||||
@@ -14,5 +14,3 @@ static inline uintptr_t __get_tp()
|
||||
// the kernel calls the ip "nip", it's the first saved value after the 32
|
||||
// GPRs.
|
||||
#define MC_PC gp_regs[32]
|
||||
-
|
||||
-#define CANARY canary_at_end
|
||||
diff --git a/arch/x32/pthread_arch.h b/arch/x32/pthread_arch.h
|
||||
index 6e2495da..c1e7716d 100644
|
||||
--- a/arch/x32/pthread_arch.h
|
||||
+++ b/arch/x32/pthread_arch.h
|
||||
@@ -7,6 +7,6 @@ static inline uintptr_t __get_tp()
|
||||
|
||||
#define MC_PC gregs[REG_RIP]
|
||||
|
||||
-#define CANARY canary2
|
||||
+#define CANARY_PAD
|
||||
|
||||
#define tls_mod_off_t unsigned long long
|
||||
diff --git a/ldso/dynlink.c b/ldso/dynlink.c
|
||||
index d3d4ddd2..f7474743 100644
|
||||
--- a/ldso/dynlink.c
|
||||
+++ b/ldso/dynlink.c
|
||||
@@ -1579,7 +1579,7 @@ static void install_new_tls(void)
|
||||
|
||||
/* Install new dtv for each thread. */
|
||||
for (j=0, td=self; !j || td!=self; j++, td=td->next) {
|
||||
- td->dtv = td->dtv_copy = newdtv[j];
|
||||
+ td->dtv = newdtv[j];
|
||||
}
|
||||
|
||||
__tl_unlock();
|
||||
diff --git a/src/env/__init_tls.c b/src/env/__init_tls.c
|
||||
index 772baba3..a93141ed 100644
|
||||
--- a/src/env/__init_tls.c
|
||||
+++ b/src/env/__init_tls.c
|
||||
@@ -67,7 +67,7 @@ void *__copy_tls(unsigned char *mem)
|
||||
}
|
||||
#endif
|
||||
dtv[0] = libc.tls_cnt;
|
||||
- td->dtv = td->dtv_copy = dtv;
|
||||
+ td->dtv = dtv;
|
||||
return td;
|
||||
}
|
||||
|
||||
diff --git a/src/env/__stack_chk_fail.c b/src/env/__stack_chk_fail.c
|
||||
index e32596d1..bf5a280a 100644
|
||||
--- a/src/env/__stack_chk_fail.c
|
||||
+++ b/src/env/__stack_chk_fail.c
|
||||
@@ -9,7 +9,7 @@ void __init_ssp(void *entropy)
|
||||
if (entropy) memcpy(&__stack_chk_guard, entropy, sizeof(uintptr_t));
|
||||
else __stack_chk_guard = (uintptr_t)&__stack_chk_guard * 1103515245;
|
||||
|
||||
- __pthread_self()->CANARY = __stack_chk_guard;
|
||||
+ __pthread_self()->canary = __stack_chk_guard;
|
||||
}
|
||||
|
||||
void __stack_chk_fail(void)
|
||||
diff --git a/src/internal/pthread_impl.h b/src/internal/pthread_impl.h
|
||||
index 58e06136..4d709bbc 100644
|
||||
--- a/src/internal/pthread_impl.h
|
||||
+++ b/src/internal/pthread_impl.h
|
||||
@@ -11,16 +11,25 @@
|
||||
#include "atomic.h"
|
||||
#include "futex.h"
|
||||
|
||||
+#include "pthread_arch.h"
|
||||
+
|
||||
#define pthread __pthread
|
||||
|
||||
struct pthread {
|
||||
/* Part 1 -- these fields may be external or
|
||||
* internal (accessed via asm) ABI. Do not change. */
|
||||
struct pthread *self;
|
||||
+#ifndef TLS_ABOVE_TP
|
||||
uintptr_t *dtv;
|
||||
+#endif
|
||||
struct pthread *prev, *next; /* non-ABI */
|
||||
uintptr_t sysinfo;
|
||||
- uintptr_t canary, canary2;
|
||||
+#ifndef TLS_ABOVE_TP
|
||||
+#ifdef CANARY_PAD
|
||||
+ uintptr_t canary_pad;
|
||||
+#endif
|
||||
+ uintptr_t canary;
|
||||
+#endif
|
||||
|
||||
/* Part 2 -- implementation details, non-ABI. */
|
||||
int tid;
|
||||
@@ -52,8 +61,10 @@ struct pthread {
|
||||
|
||||
/* Part 3 -- the positions of these fields relative to
|
||||
* the end of the structure is external and internal ABI. */
|
||||
- uintptr_t canary_at_end;
|
||||
- uintptr_t *dtv_copy;
|
||||
+#ifdef TLS_ABOVE_TP
|
||||
+ uintptr_t canary;
|
||||
+ uintptr_t *dtv;
|
||||
+#endif
|
||||
};
|
||||
|
||||
enum {
|
||||
@@ -99,12 +110,6 @@ struct __timer {
|
||||
#define _b_waiters2 __u.__vi[4]
|
||||
#define _b_inst __u.__p[3]
|
||||
|
||||
-#include "pthread_arch.h"
|
||||
-
|
||||
-#ifndef CANARY
|
||||
-#define CANARY canary
|
||||
-#endif
|
||||
-
|
||||
#ifndef TP_OFFSET
|
||||
#define TP_OFFSET 0
|
||||
#endif
|
||||
diff --git a/src/thread/pthread_create.c b/src/thread/pthread_create.c
|
||||
index 10f1b7d8..55744155 100644
|
||||
--- a/src/thread/pthread_create.c
|
||||
+++ b/src/thread/pthread_create.c
|
||||
@@ -314,7 +314,7 @@ int __pthread_create(pthread_t *restrict res, const pthread_attr_t *restrict att
|
||||
new->detach_state = DT_JOINABLE;
|
||||
}
|
||||
new->robust_list.head = &new->robust_list.head;
|
||||
- new->CANARY = self->CANARY;
|
||||
+ new->canary = self->canary;
|
||||
new->sysinfo = self->sysinfo;
|
||||
|
||||
/* Setup argument structure for the new thread on its stack.
|
||||
--
|
||||
2.47.0
|
||||
|
|
@ -1,29 +0,0 @@
|
|||
From 56f0631d9553dc06530ff661527cf1fcd595a0d1 Mon Sep 17 00:00:00 2001
|
||||
From: Drew DeVault <sir@cmpwn.com>
|
||||
Date: Sat, 5 Dec 2020 18:10:06 +0000
|
||||
Subject: [PATCH] riscv64: fix inconsistent ucontext_t struct tag
|
||||
|
||||
ucontext.h depends on the internal struct tag name for namespacing
|
||||
reasons, and the intent was always for it to be consistent across
|
||||
archs anyway.
|
||||
---
|
||||
arch/riscv64/bits/signal.h | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/arch/riscv64/bits/signal.h b/arch/riscv64/bits/signal.h
|
||||
index b006334f7..287367db7 100644
|
||||
--- a/arch/riscv64/bits/signal.h
|
||||
+++ b/arch/riscv64/bits/signal.h
|
||||
@@ -60,10 +60,10 @@ struct sigaltstack {
|
||||
size_t ss_size;
|
||||
};
|
||||
|
||||
-typedef struct ucontext_t
|
||||
+typedef struct __ucontext
|
||||
{
|
||||
unsigned long uc_flags;
|
||||
- struct ucontext_t *uc_link;
|
||||
+ struct __ucontext *uc_link;
|
||||
stack_t uc_stack;
|
||||
sigset_t uc_sigmask;
|
||||
mcontext_t uc_mcontext;
|
|
@ -1,201 +0,0 @@
|
|||
From b817541f1cfd38e4b81257b3215e276ea9d0fc61 Mon Sep 17 00:00:00 2001
|
||||
From: Duncan Bellamy <dunk@denkimushi.com>
|
||||
Date: Wed, 31 Aug 2022 20:07:34 +0100
|
||||
Subject: [PATCH] add statx interface using syscall, fallback to fstatat
|
||||
|
||||
---
|
||||
include/sys/stat.h | 55 ++++++++++++++++++++++++++++++++++++++++++++++
|
||||
src/linux/statx.c | 42 +++++++++++++++++++++++++++++++++++
|
||||
2 files changed, 97 insertions(+)
|
||||
create mode 100644 src/linux/statx.c
|
||||
|
||||
diff --git a/include/sys/stat.h b/include/sys/stat.h
|
||||
index e6d0049c..6690192d 100644
|
||||
--- a/include/sys/stat.h
|
||||
+++ b/include/sys/stat.h
|
||||
@@ -18,6 +18,13 @@ extern "C" {
|
||||
#define __NEED_blkcnt_t
|
||||
#define __NEED_struct_timespec
|
||||
|
||||
+#ifdef _GNU_SOURCE
|
||||
+#define __NEED_int64_t
|
||||
+#define __NEED_uint64_t
|
||||
+#define __NEED_uint32_t
|
||||
+#define __NEED_uint16_t
|
||||
+#endif
|
||||
+
|
||||
#include <bits/alltypes.h>
|
||||
|
||||
#include <bits/stat.h>
|
||||
@@ -98,6 +105,54 @@ int lchmod(const char *, mode_t);
|
||||
#define S_IEXEC S_IXUSR
|
||||
#endif
|
||||
|
||||
+#if defined(_GNU_SOURCE)
|
||||
+#define STATX_TYPE 1U
|
||||
+#define STATX_MODE 2U
|
||||
+#define STATX_NLINK 4U
|
||||
+#define STATX_UID 8U
|
||||
+#define STATX_GID 0x10U
|
||||
+#define STATX_ATIME 0x20U
|
||||
+#define STATX_MTIME 0x40U
|
||||
+#define STATX_CTIME 0x80U
|
||||
+#define STATX_INO 0x100U
|
||||
+#define STATX_SIZE 0x200U
|
||||
+#define STATX_BLOCKS 0x400U
|
||||
+#define STATX_BASIC_STATS 0x7ffU
|
||||
+#define STATX_BTIME 0x800U
|
||||
+#define STATX_ALL 0xfffU
|
||||
+
|
||||
+struct statx_timestamp {
|
||||
+ int64_t tv_sec;
|
||||
+ uint32_t tv_nsec, __pad;
|
||||
+};
|
||||
+
|
||||
+struct statx {
|
||||
+ uint32_t stx_mask;
|
||||
+ uint32_t stx_blksize;
|
||||
+ uint64_t stx_attributes;
|
||||
+ uint32_t stx_nlink;
|
||||
+ uint32_t stx_uid;
|
||||
+ uint32_t stx_gid;
|
||||
+ uint16_t stx_mode;
|
||||
+ uint16_t __pad0[1];
|
||||
+ uint64_t stx_ino;
|
||||
+ uint64_t stx_size;
|
||||
+ uint64_t stx_blocks;
|
||||
+ uint64_t stx_attributes_mask;
|
||||
+ struct statx_timestamp stx_atime;
|
||||
+ struct statx_timestamp stx_btime;
|
||||
+ struct statx_timestamp stx_ctime;
|
||||
+ struct statx_timestamp stx_mtime;
|
||||
+ uint32_t stx_rdev_major;
|
||||
+ uint32_t stx_rdev_minor;
|
||||
+ uint32_t stx_dev_major;
|
||||
+ uint32_t stx_dev_minor;
|
||||
+ uint64_t __pad1[14];
|
||||
+};
|
||||
+
|
||||
+int statx(int, const char *__restrict, int, unsigned, struct statx *__restrict);
|
||||
+#endif
|
||||
+
|
||||
#if defined(_LARGEFILE64_SOURCE) || defined(_GNU_SOURCE)
|
||||
#define stat64 stat
|
||||
#define fstat64 fstat
|
||||
diff --git a/src/linux/statx.c b/src/linux/statx.c
|
||||
new file mode 100644
|
||||
index 00000000..4616bff4
|
||||
--- /dev/null
|
||||
+++ b/src/linux/statx.c
|
||||
@@ -0,0 +1,42 @@
|
||||
+#define _GNU_SOURCE
|
||||
+#include <sys/stat.h>
|
||||
+#include <string.h>
|
||||
+#include <syscall.h>
|
||||
+#include <sys/sysmacros.h>
|
||||
+#include <errno.h>
|
||||
+
|
||||
+int statx(int dirfd, const char *restrict path, int flags, unsigned mask, struct statx *restrict stx)
|
||||
+{
|
||||
+ int ret = __syscall(SYS_statx, dirfd, path, flags, mask, stx);
|
||||
+
|
||||
+#ifndef SYS_fstatat
|
||||
+ return __syscall_ret(ret);
|
||||
+#endif
|
||||
+
|
||||
+ if (ret != -ENOSYS) return __syscall_ret(ret);
|
||||
+
|
||||
+ struct stat st;
|
||||
+ ret = fstatat(dirfd, path, &st, flags);
|
||||
+ if (ret) return ret;
|
||||
+
|
||||
+ stx->stx_dev_major = major(st.st_dev);
|
||||
+ stx->stx_dev_minor = minor(st.st_dev);
|
||||
+ stx->stx_ino = st.st_ino;
|
||||
+ stx->stx_mode = st.st_mode;
|
||||
+ stx->stx_nlink = st.st_nlink;
|
||||
+ stx->stx_uid = st.st_uid;
|
||||
+ stx->stx_gid = st.st_gid;
|
||||
+ stx->stx_size = st.st_size;
|
||||
+ stx->stx_blksize = st.st_blksize;
|
||||
+ stx->stx_blocks = st.st_blocks;
|
||||
+ stx->stx_atime.tv_sec = st.st_atim.tv_sec;
|
||||
+ stx->stx_atime.tv_nsec = st.st_atim.tv_nsec;
|
||||
+ stx->stx_mtime.tv_sec = st.st_mtim.tv_sec;
|
||||
+ stx->stx_mtime.tv_nsec = st.st_mtim.tv_nsec;
|
||||
+ stx->stx_ctime.tv_sec = st.st_ctim.tv_sec;
|
||||
+ stx->stx_ctime.tv_nsec = st.st_ctim.tv_nsec;
|
||||
+ stx->stx_btime = (struct statx_timestamp){.tv_sec=0, .tv_nsec=0};
|
||||
+ stx->stx_mask = STATX_BASIC_STATS;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
|
||||
From 251cbb6366403a056b39638264932c82d18ec610 Mon Sep 17 00:00:00 2001
|
||||
From: Gabriel Ravier <gabravier@gmail.com>
|
||||
Date: Fri, 13 Sep 2024 22:00:15 +0200
|
||||
Subject: [PATCH] statx: fix ENOSYS emulation not setting stx_rdev_*
|
||||
|
||||
The current implementation of the statx function fails to set the
|
||||
values of stx->stx_rdev_major and stx->stx_rdev_minor if the statx
|
||||
syscall fails with ENOSYS and thus the statx function has to fall back
|
||||
on fstatat-based emulation.
|
||||
---
|
||||
src/linux/statx.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/src/linux/statx.c b/src/linux/statx.c
|
||||
index 4616bff4a..5f6dde923 100644
|
||||
--- a/src/linux/statx.c
|
||||
+++ b/src/linux/statx.c
|
||||
@@ -21,6 +21,8 @@ int statx(int dirfd, const char *restrict path, int flags, unsigned mask, struct
|
||||
|
||||
stx->stx_dev_major = major(st.st_dev);
|
||||
stx->stx_dev_minor = minor(st.st_dev);
|
||||
+ stx->stx_rdev_major = major(st.st_rdev);
|
||||
+ stx->stx_rdev_minor = minor(st.st_rdev);
|
||||
stx->stx_ino = st.st_ino;
|
||||
stx->stx_mode = st.st_mode;
|
||||
stx->stx_nlink = st.st_nlink;
|
||||
|
||||
From 4ca8c267768e371930ef7ec9593a5f8b44a7f810 Mon Sep 17 00:00:00 2001
|
||||
From: Rich Felker <dalias@aerifal.cx>
|
||||
Date: Fri, 13 Sep 2024 17:08:11 -0400
|
||||
Subject: [PATCH] statx: fix uninitialized attributes/mask in fallback path
|
||||
|
||||
commit b817541f1cfd38e4b81257b3215e276ea9d0fc61 introduced statx with
|
||||
a fallback using fstatat, but failed to fill in stx_rdev_major/minor
|
||||
and stx_attributes[_mask]. the rdev omission has been addressed
|
||||
separately. rather than explicitly zeroing the attributes and their
|
||||
mask, pre-fill the entire structure with zeros. this will also cover
|
||||
the padding adjacent to stx_mode, in case it's ever used in the
|
||||
future.
|
||||
|
||||
explicit zeroing of stx_btime is removed since, with this change, it
|
||||
will already be pre-zeroed. as an aside, zeroing it was not strictly
|
||||
necessary, since STATX_BASIC_STATS does not include STATX_BTIME and
|
||||
thus does not indicate any validity for it.
|
||||
---
|
||||
src/linux/statx.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/linux/statx.c b/src/linux/statx.c
|
||||
index 5f6dde92..4fb96e4b 100644
|
||||
--- a/src/linux/statx.c
|
||||
+++ b/src/linux/statx.c
|
||||
@@ -19,6 +19,7 @@ int statx(int dirfd, const char *restrict path, int flags, unsigned mask, struct
|
||||
ret = fstatat(dirfd, path, &st, flags);
|
||||
if (ret) return ret;
|
||||
|
||||
+ *stx = (struct statx){0};
|
||||
stx->stx_dev_major = major(st.st_dev);
|
||||
stx->stx_dev_minor = minor(st.st_dev);
|
||||
stx->stx_rdev_major = major(st.st_rdev);
|
||||
@@ -37,7 +38,6 @@ int statx(int dirfd, const char *restrict path, int flags, unsigned mask, struct
|
||||
stx->stx_mtime.tv_nsec = st.st_mtim.tv_nsec;
|
||||
stx->stx_ctime.tv_sec = st.st_ctim.tv_sec;
|
||||
stx->stx_ctime.tv_nsec = st.st_ctim.tv_nsec;
|
||||
- stx->stx_btime = (struct statx_timestamp){.tv_sec=0, .tv_nsec=0};
|
||||
stx->stx_mask = STATX_BASIC_STATS;
|
||||
|
||||
return 0;
|
|
@ -1,59 +0,0 @@
|
|||
From e2fa720be7024cce4fc489f3877476d35da48ee2 Mon Sep 17 00:00:00 2001
|
||||
From: Rich Felker <dalias@aerifal.cx>
|
||||
Date: Mon, 23 Nov 2020 19:44:19 -0500
|
||||
Subject: [PATCH] work around linux bug in readlink syscall with zero buffer
|
||||
size
|
||||
|
||||
linux fails with EINVAL when a zero buffer size is passed to the
|
||||
syscall. this is non-conforming because POSIX already defines EINVAL
|
||||
with a significantly different meaning: the target is not a symlink.
|
||||
|
||||
since the request is semantically valid, patch it up by using a dummy
|
||||
buffer of length one, and truncating the return value to zero if it
|
||||
succeeds.
|
||||
---
|
||||
src/unistd/readlink.c | 11 +++++++++--
|
||||
src/unistd/readlinkat.c | 9 ++++++++-
|
||||
2 files changed, 17 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/src/unistd/readlink.c b/src/unistd/readlink.c
|
||||
index a152d5249..32f4537f9 100644
|
||||
--- a/src/unistd/readlink.c
|
||||
+++ b/src/unistd/readlink.c
|
||||
@@ -4,9 +4,16 @@
|
||||
|
||||
ssize_t readlink(const char *restrict path, char *restrict buf, size_t bufsize)
|
||||
{
|
||||
+ char dummy[1];
|
||||
+ if (!bufsize) {
|
||||
+ buf = dummy;
|
||||
+ bufsize = 1;
|
||||
+ }
|
||||
#ifdef SYS_readlink
|
||||
- return syscall(SYS_readlink, path, buf, bufsize);
|
||||
+ int r = __syscall(SYS_readlink, path, buf, bufsize);
|
||||
#else
|
||||
- return syscall(SYS_readlinkat, AT_FDCWD, path, buf, bufsize);
|
||||
+ int r = __syscall(SYS_readlinkat, AT_FDCWD, path, buf, bufsize);
|
||||
#endif
|
||||
+ if (buf == dummy && r > 0) r = 0;
|
||||
+ return __syscall_ret(r);
|
||||
}
|
||||
diff --git a/src/unistd/readlinkat.c b/src/unistd/readlinkat.c
|
||||
index 9af45cd5a..f79d3d142 100644
|
||||
--- a/src/unistd/readlinkat.c
|
||||
+++ b/src/unistd/readlinkat.c
|
||||
@@ -3,5 +3,12 @@
|
||||
|
||||
ssize_t readlinkat(int fd, const char *restrict path, char *restrict buf, size_t bufsize)
|
||||
{
|
||||
- return syscall(SYS_readlinkat, fd, path, buf, bufsize);
|
||||
+ char dummy[1];
|
||||
+ if (!bufsize) {
|
||||
+ buf = dummy;
|
||||
+ bufsize = 1;
|
||||
+ }
|
||||
+ int r = __syscall(SYS_readlinkat, fd, path, buf, bufsize);
|
||||
+ if (buf == dummy && r > 0) r = 0;
|
||||
+ return __syscall_ret(r);
|
||||
}
|
55
srcpkgs/musl/patches/x86_64-O_LARGEFILE.patch
Normal file
55
srcpkgs/musl/patches/x86_64-O_LARGEFILE.patch
Normal file
|
@ -0,0 +1,55 @@
|
|||
This reverts https://github.com/bminor/musl/commit/b8b729bd22c28c9116c2fce65dce207a35299c26 to avoid rebuilding a bunch of software
|
||||
on x86_64 for now.
|
||||
|
||||
This patch can be removed later.
|
||||
|
||||
diff -rup /dev/null musl-1.2.5/arch/x86_64/bits/fcntl.h
|
||||
--- /dev/null 2025-04-29 23:07:31.036000071 -0700
|
||||
+++ musl-1.2.5/arch/x86_64/bits/fcntl.h 2025-05-10 21:53:47.733952721 -0700
|
||||
@@ -0,0 +1,46 @@
|
||||
+#define O_CREAT 0100
|
||||
+#define O_EXCL 0200
|
||||
+#define O_NOCTTY 0400
|
||||
+#define O_TRUNC 01000
|
||||
+#define O_APPEND 02000
|
||||
+#define O_NONBLOCK 04000
|
||||
+#define O_DSYNC 010000
|
||||
+#define O_SYNC 04010000
|
||||
+#define O_RSYNC 04010000
|
||||
+#define O_DIRECTORY 0200000
|
||||
+#define O_NOFOLLOW 0400000
|
||||
+#define O_CLOEXEC 02000000
|
||||
+
|
||||
+#define O_ASYNC 020000
|
||||
+#define O_DIRECT 040000
|
||||
+#define O_LARGEFILE 0
|
||||
+#define O_NOATIME 01000000
|
||||
+#define O_PATH 010000000
|
||||
+#define O_TMPFILE 020200000
|
||||
+#define O_NDELAY O_NONBLOCK
|
||||
+
|
||||
+#define F_DUPFD 0
|
||||
+#define F_GETFD 1
|
||||
+#define F_SETFD 2
|
||||
+#define F_GETFL 3
|
||||
+#define F_SETFL 4
|
||||
+
|
||||
+#define F_SETOWN 8
|
||||
+#define F_GETOWN 9
|
||||
+#define F_SETSIG 10
|
||||
+#define F_GETSIG 11
|
||||
+
|
||||
+#if __LONG_MAX == 0x7fffffffL
|
||||
+#define F_GETLK 12
|
||||
+#define F_SETLK 13
|
||||
+#define F_SETLKW 14
|
||||
+#else
|
||||
+#define F_GETLK 5
|
||||
+#define F_SETLK 6
|
||||
+#define F_SETLKW 7
|
||||
+#endif
|
||||
+
|
||||
+#define F_SETOWN_EX 15
|
||||
+#define F_GETOWN_EX 16
|
||||
+
|
||||
+#define F_GETOWNER_UIDS 17
|
|
@ -1,8 +1,7 @@
|
|||
# Template file for 'musl'
|
||||
pkgname=musl
|
||||
reverts="1.2.0_1"
|
||||
version=1.1.24
|
||||
revision=26
|
||||
version=1.2.5
|
||||
revision=1
|
||||
archs="*-musl"
|
||||
bootstrap=yes
|
||||
build_style=gnu-configure
|
||||
|
@ -12,11 +11,15 @@ maintainer="Enno Boland <gottox@voidlinux.org>"
|
|||
license="MIT"
|
||||
homepage="https://musl.libc.org/"
|
||||
distfiles="https://musl.libc.org/releases/musl-${version}.tar.gz"
|
||||
checksum=1370c9a812b2cf2a7d92802510cca0058cc37e66a7bedd70051f0a34015022a3
|
||||
checksum=a9a118bbe84d8764da0ea0d28b3ab3fae8477fc7e4085d90102b8596fc7c75e4
|
||||
|
||||
nostrip_files="libc.so"
|
||||
shlib_provides="libc.so"
|
||||
|
||||
if [ "$XBPS_TARGET_WORDSIZE" -eq 32 ]; then
|
||||
broken="use musl1.1"
|
||||
fi
|
||||
|
||||
post_build() {
|
||||
$CC $CFLAGS $LDFLAGS -fpie ${FILESDIR}/getent.c -o getent
|
||||
$CC $CFLAGS $LDFLAGS -fpie ${FILESDIR}/getconf.c -o getconf
|
||||
|
|
Loading…
Add table
Reference in a new issue