diff options
author | Will Dietz <github@wdtz.org> | 2018-09-25 00:38:23 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-09-25 00:38:23 -0500 |
commit | f02c8e29d7b03e58dfd403e1f916aa730658a1d5 (patch) | |
tree | 7e62564443980903c248af9f979e0b9f4c3eb375 | |
parent | 93b30a8809854b740894b603760e86d62da53d04 (diff) | |
parent | d3a0aa22da1f3583c80338e21a7b42a78032e7ab (diff) | |
download | nixlib-f02c8e29d7b03e58dfd403e1f916aa730658a1d5.tar nixlib-f02c8e29d7b03e58dfd403e1f916aa730658a1d5.tar.gz nixlib-f02c8e29d7b03e58dfd403e1f916aa730658a1d5.tar.bz2 nixlib-f02c8e29d7b03e58dfd403e1f916aa730658a1d5.tar.lz nixlib-f02c8e29d7b03e58dfd403e1f916aa730658a1d5.tar.xz nixlib-f02c8e29d7b03e58dfd403e1f916aa730658a1d5.tar.zst nixlib-f02c8e29d7b03e58dfd403e1f916aa730658a1d5.zip |
Merge pull request #47308 from dtzWill/update/musl-upstream-fixes
musl: pick upstream fixes and improvements
5 files changed, 195 insertions, 3 deletions
diff --git a/pkgs/os-specific/linux/musl/default.nix b/pkgs/os-specific/linux/musl/default.nix index 376d824a0438..6137a5942c26 100644 --- a/pkgs/os-specific/linux/musl/default.nix +++ b/pkgs/os-specific/linux/musl/default.nix @@ -64,9 +64,16 @@ stdenv.mkDerivation rec { # 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 + ./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") diff --git a/pkgs/os-specific/linux/musl/fix-getaddrinfo-regression-with-AI_ADDRCONFIG.patch b/pkgs/os-specific/linux/musl/fix-getaddrinfo-regression-with-AI_ADDRCONFIG.patch new file mode 100644 index 000000000000..d603c16f8062 --- /dev/null +++ b/pkgs/os-specific/linux/musl/fix-getaddrinfo-regression-with-AI_ADDRCONFIG.patch @@ -0,0 +1,52 @@ +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 + diff --git a/pkgs/os-specific/linux/musl/max-handle-sz-for-name-to-handle-at.patch b/pkgs/os-specific/linux/musl/max-handle-sz-for-name-to-handle-at.patch new file mode 100644 index 000000000000..aa00b4619f86 --- /dev/null +++ b/pkgs/os-specific/linux/musl/max-handle-sz-for-name-to-handle-at.patch @@ -0,0 +1,26 @@ +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 + diff --git a/pkgs/os-specific/linux/musl/name-to-handle-at.patch b/pkgs/os-specific/linux/musl/name-to-handle-at.patch new file mode 100644 index 000000000000..10cd8a9947c8 --- /dev/null +++ b/pkgs/os-specific/linux/musl/name-to-handle-at.patch @@ -0,0 +1,71 @@ +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 + diff --git a/pkgs/os-specific/linux/musl/stacksize-bump.patch b/pkgs/os-specific/linux/musl/stacksize-bump.patch new file mode 100644 index 000000000000..fb5373005cbf --- /dev/null +++ b/pkgs/os-specific/linux/musl/stacksize-bump.patch @@ -0,0 +1,36 @@ +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 + |