musl: 1.1.20 -> 1.1.21

https://www.openwall.com/lists/musl/2019/01/21/8

\o/
This commit is contained in:
Will Dietz 2019-01-21 15:35:00 -06:00
parent b262be3260
commit 0450d28a1e
11 changed files with 5 additions and 462 deletions

View file

@ -1,37 +0,0 @@
From 4e4a162d9af283cf71f7310c497672e0c2b8ca3b Mon Sep 17 00:00:00 2001
From: Rich Felker <dalias@aerifal.cx>
Date: Tue, 4 Sep 2018 21:28:38 -0400
Subject: [PATCH 1/3] in pthread_mutex_trylock, EBUSY out more directly when
possible
avoid gratuitously setting up and tearing down the robust list pending
slot.
---
src/thread/pthread_mutex_trylock.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/thread/pthread_mutex_trylock.c b/src/thread/pthread_mutex_trylock.c
index 54876a61..783ca0c4 100644
--- a/src/thread/pthread_mutex_trylock.c
+++ b/src/thread/pthread_mutex_trylock.c
@@ -15,6 +15,7 @@ int __pthread_mutex_trylock_owner(pthread_mutex_t *m)
return 0;
}
if (own == 0x7fffffff) return ENOTRECOVERABLE;
+ if (own && (!(own & 0x40000000) || !(type & 4))) return EBUSY;
if (m->_m_type & 128) {
if (!self->robust_list.off) {
@@ -25,8 +26,7 @@ int __pthread_mutex_trylock_owner(pthread_mutex_t *m)
self->robust_list.pending = &m->_m_next;
}
- if ((own && (!(own & 0x40000000) || !(type & 4)))
- || a_cas(&m->_m_lock, old, tid) != old) {
+ if (a_cas(&m->_m_lock, old, tid) != old) {
self->robust_list.pending = 0;
return EBUSY;
}
--
2.19.0

View file

@ -1,41 +0,0 @@
From d1fa28860634af4f0efd70d533a756b51a45f83e Mon Sep 17 00:00:00 2001
From: Rich Felker <dalias@aerifal.cx>
Date: Tue, 4 Sep 2018 21:31:47 -0400
Subject: [PATCH 2/3] in pthread_mutex_timedlock, avoid repeatedly reading
mutex type field
compiler cannot cache immutable fields of the mutex object across
external calls it can't see, much less across atomics.
---
src/thread/pthread_mutex_timedlock.c | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/src/thread/pthread_mutex_timedlock.c b/src/thread/pthread_mutex_timedlock.c
index 0a240e79..f91f4a61 100644
--- a/src/thread/pthread_mutex_timedlock.c
+++ b/src/thread/pthread_mutex_timedlock.c
@@ -6,7 +6,8 @@ int __pthread_mutex_timedlock(pthread_mutex_t *restrict m, const struct timespec
&& !a_cas(&m->_m_lock, 0, EBUSY))
return 0;
- int r, t, priv = (m->_m_type & 128) ^ 128;
+ int type = m->_m_type;
+ int r, t, priv = (type & 128) ^ 128;
r = pthread_mutex_trylock(m);
if (r != EBUSY) return r;
@@ -15,9 +16,9 @@ int __pthread_mutex_timedlock(pthread_mutex_t *restrict m, const struct timespec
while (spins-- && m->_m_lock && !m->_m_waiters) a_spin();
while ((r=pthread_mutex_trylock(m)) == EBUSY) {
- if (!(r=m->_m_lock) || ((r&0x40000000) && (m->_m_type&4)))
+ if (!(r=m->_m_lock) || ((r&0x40000000) && (type&4)))
continue;
- if ((m->_m_type&3) == PTHREAD_MUTEX_ERRORCHECK
+ if ((type&3) == PTHREAD_MUTEX_ERRORCHECK
&& (r&0x7fffffff) == __pthread_self()->tid)
return EDEADLK;
--
2.19.0

View file

@ -1,35 +0,0 @@
From 2de29bc994029b903a366b8a4a9f8c3c3ee2be90 Mon Sep 17 00:00:00 2001
From: Rich Felker <dalias@aerifal.cx>
Date: Tue, 4 Sep 2018 22:56:57 -0400
Subject: [PATCH 3/3] fix namespace violation for c11 mutex functions
__pthread_mutex_timedlock is used to implement c11 mutex functions,
and therefore cannot call pthread_mutex_trylock by name.
---
src/thread/pthread_mutex_timedlock.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/src/thread/pthread_mutex_timedlock.c b/src/thread/pthread_mutex_timedlock.c
index f91f4a61..d2bd1960 100644
--- a/src/thread/pthread_mutex_timedlock.c
+++ b/src/thread/pthread_mutex_timedlock.c
@@ -1,5 +1,7 @@
#include "pthread_impl.h"
+int __pthread_mutex_trylock(pthread_mutex_t *);
+
int __pthread_mutex_timedlock(pthread_mutex_t *restrict m, const struct timespec *restrict at)
{
if ((m->_m_type&15) == PTHREAD_MUTEX_NORMAL
@@ -15,7 +17,7 @@ int __pthread_mutex_timedlock(pthread_mutex_t *restrict m, const struct timespec
int spins = 100;
while (spins-- && m->_m_lock && !m->_m_waiters) a_spin();
- while ((r=pthread_mutex_trylock(m)) == EBUSY) {
+ while ((r=__pthread_mutex_trylock(m)) == EBUSY) {
if (!(r=m->_m_lock) || ((r&0x40000000) && (type&4)))
continue;
if ((type&3) == PTHREAD_MUTEX_ERRORCHECK
--
2.19.0

View file

@ -28,12 +28,12 @@ let
in
stdenv.mkDerivation rec {
name = "musl-${version}";
version = "1.1.20";
pname = "musl";
version = "1.1.21";
src = fetchurl {
url = "https://www.musl-libc.org/releases/musl-${version}.tar.gz";
sha256 = "0q8dsjxl41dccscv9a0r78bs7jap57mn4mni5pwbbip6s1qqggj4";
url = "https://www.musl-libc.org/releases/${pname}-${version}.tar.gz";
sha256 = "0i2z52zgc86af1n1gjiz43hgd85mxjgvgn345zsybja9dxpvchn7";
};
enableParallelBuilding = true;
@ -56,29 +56,7 @@ stdenv.mkDerivation rec {
url = https://raw.githubusercontent.com/openwrt/openwrt/87606e25afac6776d1bbc67ed284434ec5a832b4/toolchain/musl/patches/300-relative.patch;
sha256 = "0hfadrycb60sm6hb6by4ycgaqc9sgrhh42k39v8xpmcvdzxrsq2n";
})
# Upstream bugfix, see: https://git.musl-libc.org/cgit/musl/commit/?id=0db393d3a77bb9f300a356c6a5484fc2dddb161d
# Explicitly flagged for inclusion by distributions using musl
./fix-file-locking-race.patch
# More specific error reporting
./tty-more-precise-errors.patch
# Use execveat to impl fexecve when avail (useful for containers)
./fexecve-execveat.patch
# improve behavior in few cases
./0001-in-pthread_mutex_trylock-EBUSY-out-more-directly-whe.patch
./0002-in-pthread_mutex_timedlock-avoid-repeatedly-reading-.patch
./0003-fix-namespace-violation-for-c11-mutex-functions.patch
# Fix getaddrinfo usage encountered sometimes in containers
./fix-getaddrinfo-regression-with-AI_ADDRCONFIG.patch
# name_to_handle_at
./name-to-handle-at.patch
./max-handle-sz-for-name-to-handle-at.patch
# stacksize bump (upstream)
./stacksize-bump.patch
];
preConfigure = ''
configureFlagsArray+=("--syslibdir=$out/lib")
'';
CFLAGS = [ "-fstack-protector-strong" ]
++ lib.optional stdenv.hostPlatform.isPower "-mlong-double-64";
@ -87,6 +65,7 @@ stdenv.mkDerivation rec {
"--enable-static"
"--enable-debug"
"--enable-wrapper=all"
"--syslibdir=${placeholder "out"}/lib"
];
outputs = [ "out" "dev" ];

View file

@ -1,33 +0,0 @@
From e36f80cba6d5eefcc1ee664f16c2c72054b83134 Mon Sep 17 00:00:00 2001
From: "Joseph C. Sible" <josephcsible@gmail.com>
Date: Sun, 2 Sep 2018 13:42:26 -0400
Subject: implement fexecve in terms of execveat when it exists
This lets fexecve work even when /proc isn't mounted.
---
src/process/fexecve.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/src/process/fexecve.c b/src/process/fexecve.c
index 6507b429..8be3f760 100644
--- a/src/process/fexecve.c
+++ b/src/process/fexecve.c
@@ -1,10 +1,15 @@
+#define _GNU_SOURCE
#include <unistd.h>
#include <errno.h>
+#include <fcntl.h>
+#include "syscall.h"
void __procfdname(char *, unsigned);
int fexecve(int fd, char *const argv[], char *const envp[])
{
+ int r = __syscall(SYS_execveat, fd, "", argv, envp, AT_EMPTY_PATH);
+ if (r != -ENOSYS) return __syscall_ret(r);
char buf[15 + 3*sizeof(int)];
__procfdname(buf, fd);
execve(buf, argv, envp);
--
cgit v1.2.1

View file

@ -1,54 +0,0 @@
From 0db393d3a77bb9f300a356c6a5484fc2dddb161d Mon Sep 17 00:00:00 2001
From: Kaarle Ritvanen <kaarle.ritvanen@datakunkku.fi>
Date: Tue, 18 Sep 2018 10:03:27 +0300
Subject: fix race condition in file locking
The condition occurs when
- thread #1 is holding the lock
- thread #2 is waiting for it on __futexwait
- thread #1 is about to release the lock and performs a_swap
- thread #3 enters the __lockfile function and manages to grab the lock
before thread #1 calls __wake, resetting the MAYBE_WAITERS flag
- thread #1 calls __wake
- thread #2 wakes up but goes again to __futexwait as the lock is
held by thread #3
- thread #3 releases the lock but does not call __wake as the
MAYBE_WAITERS flag is not set
This condition results in thread #2 not being woken up. This patch fixes
the problem by making the woken up thread ensure that the flag is
properly set before going to sleep again.
Mainainer's note: This fixes a regression introduced in commit
c21f750727515602a9e84f2a190ee8a0a2aeb2a1.
---
src/stdio/__lockfile.c | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/src/stdio/__lockfile.c b/src/stdio/__lockfile.c
index 2ff75d8a..0dcb2a42 100644
--- a/src/stdio/__lockfile.c
+++ b/src/stdio/__lockfile.c
@@ -8,13 +8,13 @@ int __lockfile(FILE *f)
int owner = f->lock, tid = __pthread_self()->tid;
if ((owner & ~MAYBE_WAITERS) == tid)
return 0;
- for (;;) {
- owner = a_cas(&f->lock, 0, tid);
- if (!owner) return 1;
- if (a_cas(&f->lock, owner, owner|MAYBE_WAITERS)==owner) break;
+ owner = a_cas(&f->lock, 0, tid);
+ if (!owner) return 1;
+ while ((owner = a_cas(&f->lock, 0, tid|MAYBE_WAITERS))) {
+ if ((owner & MAYBE_WAITERS) ||
+ a_cas(&f->lock, owner, owner|MAYBE_WAITERS)==owner)
+ __futexwait(&f->lock, owner|MAYBE_WAITERS, 1);
}
- while ((owner = a_cas(&f->lock, 0, tid|MAYBE_WAITERS)))
- __futexwait(&f->lock, owner, 1);
return 1;
}
--
cgit v1.2.1

View file

@ -1,52 +0,0 @@
From f381c118b2d4f7d914481d3cdc830ce41369b002 Mon Sep 17 00:00:00 2001
From: Rich Felker <dalias@aerifal.cx>
Date: Wed, 19 Sep 2018 18:03:22 -0400
Subject: [PATCH] fix getaddrinfo regression with AI_ADDRCONFIG on some
configurations
despite not being documented to do so in the standard or Linux
documentation, attempts to udp connect to 127.0.0.1 or ::1 generate
EADDRNOTAVAIL when the loopback device is not configured and there is
no default route for IPv6. this caused getaddrinfo with AI_ADDRCONFIG
to fail with EAI_SYSTEM and EADDRNOTAVAIL on some no-IPv6
configurations, rather than the intended behavior of detecting IPv6 as
unsuppported and producing IPv4-only results.
previously, only EAFNOSUPPORT was treated as unavailability of the
address family being probed. instead, treat all errors related to
inability to get an address or route as conclusive that the family
being probed is unsupported, and only fail with EAI_SYSTEM on other
errors.
further improvements may be desirable, such as reporting EAI_AGAIN
instead of EAI_SYSTEM for errors which are expected to be transient,
but this patch should suffice to fix the serious regression.
---
src/network/getaddrinfo.c | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/src/network/getaddrinfo.c b/src/network/getaddrinfo.c
index ba26847a..e33bfa28 100644
--- a/src/network/getaddrinfo.c
+++ b/src/network/getaddrinfo.c
@@ -76,7 +76,16 @@ int getaddrinfo(const char *restrict host, const char *restrict serv, const stru
close(s);
if (!r) continue;
}
- if (errno != EAFNOSUPPORT) return EAI_SYSTEM;
+ switch (errno) {
+ case EADDRNOTAVAIL:
+ case EAFNOSUPPORT:
+ case EHOSTUNREACH:
+ case ENETDOWN:
+ case ENETUNREACH:
+ break;
+ default:
+ return EAI_SYSTEM;
+ }
if (family == tf[i]) return EAI_NONAME;
family = tf[1-i];
}
--
2.19.0

View file

@ -1,26 +0,0 @@
From 7d7f44253f2d8cfd0a7adf9f918d88aa24d4e012 Mon Sep 17 00:00:00 2001
From: Khem Raj <raj.khem@gmail.com>
Date: Thu, 13 Sep 2018 07:00:05 -0700
Subject: [PATCH] define MAX_HANDLE_SZ for use with name_to_handle_at
MAX_HANDLE_SZ is described in name_to_handle_at() to contain maximum
expected size for a file handle
---
include/fcntl.h | 1 +
1 file changed, 1 insertion(+)
diff --git a/include/fcntl.h b/include/fcntl.h
index 99b21759..4d91338b 100644
--- a/include/fcntl.h
+++ b/include/fcntl.h
@@ -166,6 +166,7 @@ struct f_owner_ex {
};
#define FALLOC_FL_KEEP_SIZE 1
#define FALLOC_FL_PUNCH_HOLE 2
+#define MAX_HANDLE_SZ 128
#define SYNC_FILE_RANGE_WAIT_BEFORE 1
#define SYNC_FILE_RANGE_WRITE 2
#define SYNC_FILE_RANGE_WAIT_AFTER 4
--
2.19.0

View file

@ -1,71 +0,0 @@
From 3e14bbcd1979376b188bfabb816ff828608fb5d7 Mon Sep 17 00:00:00 2001
From: Khem Raj <raj.khem@gmail.com>
Date: Wed, 12 Sep 2018 18:02:11 -0700
Subject: [PATCH] wireup linux/name_to_handle_at and name_to_handle_at syscalls
---
include/fcntl.h | 7 +++++++
src/linux/name_to_handle_at.c | 10 ++++++++++
src/linux/open_by_handle_at.c | 8 ++++++++
3 files changed, 25 insertions(+)
create mode 100644 src/linux/name_to_handle_at.c
create mode 100644 src/linux/open_by_handle_at.c
diff --git a/include/fcntl.h b/include/fcntl.h
index 6d8edcd1..99b21759 100644
--- a/include/fcntl.h
+++ b/include/fcntl.h
@@ -155,6 +155,11 @@ int lockf(int, int, off_t);
#define F_OWNER_PID 1
#define F_OWNER_PGRP 2
#define F_OWNER_GID 2
+struct file_handle {
+ unsigned handle_bytes;
+ int handle_type;
+ unsigned char f_handle[];
+};
struct f_owner_ex {
int type;
pid_t pid;
@@ -170,6 +175,8 @@ struct f_owner_ex {
#define SPLICE_F_GIFT 8
int fallocate(int, int, off_t, off_t);
#define fallocate64 fallocate
+int name_to_handle_at(int, const char *, struct file_handle *, int *, int);
+int open_by_handle_at(int, struct file_handle *, int);
ssize_t readahead(int, off_t, size_t);
int sync_file_range(int, off_t, off_t, unsigned);
ssize_t vmsplice(int, const struct iovec *, size_t, unsigned);
diff --git a/src/linux/name_to_handle_at.c b/src/linux/name_to_handle_at.c
new file mode 100644
index 00000000..cd4075bd
--- /dev/null
+++ b/src/linux/name_to_handle_at.c
@@ -0,0 +1,10 @@
+#define _GNU_SOURCE
+#include <fcntl.h>
+#include "syscall.h"
+
+int name_to_handle_at(int dirfd, const char *pathname,
+ struct file_handle *handle, int *mount_id, int flags)
+{
+ return syscall(SYS_name_to_handle_at, dirfd,
+ pathname, handle, mount_id, flags);
+}
diff --git a/src/linux/open_by_handle_at.c b/src/linux/open_by_handle_at.c
new file mode 100644
index 00000000..1c9b6a2b
--- /dev/null
+++ b/src/linux/open_by_handle_at.c
@@ -0,0 +1,8 @@
+#define _GNU_SOURCE
+#include <fcntl.h>
+#include "syscall.h"
+
+int open_by_handle_at(int mount_fd, struct file_handle *handle, int flags)
+{
+ return syscall(SYS_open_by_handle_at, mount_fd, handle, flags);
+}
--
2.19.0

View file

@ -1,36 +0,0 @@
From c0058ab465e950c2c3302d2b62e21cc0b494224b Mon Sep 17 00:00:00 2001
From: Rich Felker <dalias@aerifal.cx>
Date: Tue, 18 Sep 2018 23:11:49 -0400
Subject: [PATCH 3/4] increase default thread stack/guard size
stack size default is increased from 80k to 128k. this coincides with
Linux's hard-coded default stack for the main thread (128k is
initially committed; growth beyond that up to ulimit is contingent on
additional allocation succeeding) and GNU ld's default PT_GNU_STACK
size for FDPIC, at least on sh.
guard size default is increased from 4k to 8k to reduce the risk of
guard page jumping on overflow, since use of just over 4k of stack is
common (PATH_MAX buffers, etc.).
---
src/internal/pthread_impl.h | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/internal/pthread_impl.h b/src/internal/pthread_impl.h
index e73a251f..d491f975 100644
--- a/src/internal/pthread_impl.h
+++ b/src/internal/pthread_impl.h
@@ -185,8 +185,8 @@ hidden void __inhibit_ptc(void);
extern hidden unsigned __default_stacksize;
extern hidden unsigned __default_guardsize;
-#define DEFAULT_STACK_SIZE 81920
-#define DEFAULT_GUARD_SIZE 4096
+#define DEFAULT_STACK_SIZE 131072
+#define DEFAULT_GUARD_SIZE 8192
#define DEFAULT_STACK_MAX (8<<20)
#define DEFAULT_GUARD_MAX (1<<20)
--
2.19.0

View file

@ -1,51 +0,0 @@
From c84971995b3a6d5118f9357c040572f4c78bcd55 Mon Sep 17 00:00:00 2001
From: Benjamin Peterson <benjamin@python.org>
Date: Thu, 13 Sep 2018 14:23:42 -0700
Subject: improve error handling of ttyname_r and isatty
POSIX allows ttyname(_r) and isatty to return EBADF if passed file
descriptor is invalid.
maintainer's note: these are optional ("may fail") errors, but it's
non-conforming for ttyname_r to return ENOTTY when it failed for a
different reason.
---
src/unistd/isatty.c | 6 +++++-
src/unistd/ttyname_r.c | 2 +-
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/src/unistd/isatty.c b/src/unistd/isatty.c
index c8badaf5..75a9c186 100644
--- a/src/unistd/isatty.c
+++ b/src/unistd/isatty.c
@@ -1,9 +1,13 @@
#include <unistd.h>
+#include <errno.h>
#include <sys/ioctl.h>
#include "syscall.h"
int isatty(int fd)
{
struct winsize wsz;
- return !__syscall(SYS_ioctl, fd, TIOCGWINSZ, &wsz);
+ unsigned long r = syscall(SYS_ioctl, fd, TIOCGWINSZ, &wsz);
+ if (r == 0) return 1;
+ if (errno != EBADF) errno = ENOTTY;
+ return 0;
}
diff --git a/src/unistd/ttyname_r.c b/src/unistd/ttyname_r.c
index cb364c29..82acb75e 100644
--- a/src/unistd/ttyname_r.c
+++ b/src/unistd/ttyname_r.c
@@ -9,7 +9,7 @@ int ttyname_r(int fd, char *name, size_t size)
char procname[sizeof "/proc/self/fd/" + 3*sizeof(int) + 2];
ssize_t l;
- if (!isatty(fd)) return ENOTTY;
+ if (!isatty(fd)) return errno;
__procfdname(procname, fd);
l = readlink(procname, name, size);
--
cgit v1.2.1