diff options
Diffstat (limited to 'nixpkgs/pkgs/os-specific/linux/musl')
11 files changed, 577 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/os-specific/linux/musl/0001-in-pthread_mutex_trylock-EBUSY-out-more-directly-whe.patch b/nixpkgs/pkgs/os-specific/linux/musl/0001-in-pthread_mutex_trylock-EBUSY-out-more-directly-whe.patch new file mode 100644 index 000000000000..5e691ae99e6e --- /dev/null +++ b/nixpkgs/pkgs/os-specific/linux/musl/0001-in-pthread_mutex_trylock-EBUSY-out-more-directly-whe.patch @@ -0,0 +1,37 @@ +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 + diff --git a/nixpkgs/pkgs/os-specific/linux/musl/0002-in-pthread_mutex_timedlock-avoid-repeatedly-reading-.patch b/nixpkgs/pkgs/os-specific/linux/musl/0002-in-pthread_mutex_timedlock-avoid-repeatedly-reading-.patch new file mode 100644 index 000000000000..2f611fc467e7 --- /dev/null +++ b/nixpkgs/pkgs/os-specific/linux/musl/0002-in-pthread_mutex_timedlock-avoid-repeatedly-reading-.patch @@ -0,0 +1,41 @@ +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 + diff --git a/nixpkgs/pkgs/os-specific/linux/musl/0003-fix-namespace-violation-for-c11-mutex-functions.patch b/nixpkgs/pkgs/os-specific/linux/musl/0003-fix-namespace-violation-for-c11-mutex-functions.patch new file mode 100644 index 000000000000..783873732afd --- /dev/null +++ b/nixpkgs/pkgs/os-specific/linux/musl/0003-fix-namespace-violation-for-c11-mutex-functions.patch @@ -0,0 +1,35 @@ +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 + diff --git a/nixpkgs/pkgs/os-specific/linux/musl/default.nix b/nixpkgs/pkgs/os-specific/linux/musl/default.nix new file mode 100644 index 000000000000..6137a5942c26 --- /dev/null +++ b/nixpkgs/pkgs/os-specific/linux/musl/default.nix @@ -0,0 +1,141 @@ +{ stdenv, lib, fetchurl +, linuxHeaders ? null +, useBSDCompatHeaders ? true +}: +let + cdefs_h = fetchurl { + url = "http://git.alpinelinux.org/cgit/aports/plain/main/libc-dev/sys-cdefs.h"; + sha256 = "16l3dqnfq0f20rzbkhc38v74nqcsh9n3f343bpczqq8b1rz6vfrh"; + }; + queue_h = fetchurl { + url = "http://git.alpinelinux.org/cgit/aports/plain/main/libc-dev/sys-queue.h"; + sha256 = "12qm82id7zys92a1qh2l1qf2wqgq6jr4qlbjmqyfffz3s3nhfd61"; + }; + tree_h = fetchurl { + url = "http://git.alpinelinux.org/cgit/aports/plain/main/libc-dev/sys-tree.h"; + sha256 = "14igk6k00bnpfw660qhswagyhvr0gfqg4q55dxvaaq7ikfkrir71"; + }; + + # iconv tool, implemented by musl author. + # Original: http://git.etalabs.net/cgit/noxcuse/plain/src/iconv.c?id=02d288d89683e99fd18fe9f54d4e731a6c474a4f + # We use copy from Alpine which fixes error messages, see: + # https://git.alpinelinux.org/cgit/aports/commit/main/musl/iconv.c?id=a3d97e95f766c9c378194ee49361b375f093b26f + iconv_c = fetchurl { + name = "iconv.c"; + url = "https://git.alpinelinux.org/cgit/aports/plain/main/musl/iconv.c?id=a3d97e95f766c9c378194ee49361b375f093b26f"; + sha256 = "1mzxnc2ncq8lw9x6n7p00fvfklc9p3wfv28m68j0dfz5l8q2k6pp"; + }; + +in +stdenv.mkDerivation rec { + name = "musl-${version}"; + version = "1.1.20"; + + src = fetchurl { + url = "https://www.musl-libc.org/releases/musl-${version}.tar.gz"; + sha256 = "0q8dsjxl41dccscv9a0r78bs7jap57mn4mni5pwbbip6s1qqggj4"; + }; + + enableParallelBuilding = true; + + # Disable auto-adding stack protector flags, + # so musl can selectively disable as needed + hardeningDisable = [ "stackprotector" ]; + + # Leave these, be friendlier to debuggers/perf tools + # Don't force them on, but don't force off either + postPatch = '' + substituteInPlace configure \ + --replace -fno-unwind-tables "" \ + --replace -fno-asynchronous-unwind-tables "" + ''; + + patches = [ + # Minor touchup to build system making dynamic linker symlink relative + (fetchurl { + 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"; + + configureFlags = [ + "--enable-shared" + "--enable-static" + "--enable-debug" + "--enable-wrapper=all" + ]; + + outputs = [ "out" "dev" ]; + + dontDisableStatic = true; + separateDebugInfo = true; + + NIX_DONT_SET_RPATH = true; + + postInstall = '' + # Not sure why, but link in all but scsi directory as that's what uclibc/glibc do. + # Apparently glibc provides scsi itself? + (cd $dev/include && ln -s $(ls -d ${linuxHeaders}/include/* | grep -v "scsi$") .) + + # Strip debug out of the static library + $STRIP -S $out/lib/libc.a + mkdir -p $out/bin + + # Create 'ldd' symlink, builtin + ln -rs $out/lib/libc.so $out/bin/ldd + + # (impure) cc wrapper around musl for interactive usuage + for i in musl-gcc musl-clang ld.musl-clang; do + moveToOutput bin/$i $dev + done + moveToOutput lib/musl-gcc.specs $dev + substituteInPlace $dev/bin/musl-gcc \ + --replace $out/lib/musl-gcc.specs $dev/lib/musl-gcc.specs + + # provide 'iconv' utility, using just-built headers, libc/ldso + $CC ${iconv_c} -o $out/bin/iconv \ + -I$dev/include \ + -L$out/lib -Wl,-rpath=$out/lib \ + -lc \ + -B $out/lib \ + -Wl,-dynamic-linker=$(ls $out/lib/ld-*) + '' + lib.optionalString useBSDCompatHeaders '' + install -D ${queue_h} $dev/include/sys/queue.h + install -D ${cdefs_h} $dev/include/sys/cdefs.h + install -D ${tree_h} $dev/include/sys/tree.h + ''; + + passthru.linuxHeaders = linuxHeaders; + + meta = { + description = "An efficient, small, quality libc implementation"; + homepage = "http://www.musl-libc.org"; + license = lib.licenses.mit; + platforms = lib.platforms.linux; + maintainers = [ lib.maintainers.thoughtpolice ]; + }; +} diff --git a/nixpkgs/pkgs/os-specific/linux/musl/fexecve-execveat.patch b/nixpkgs/pkgs/os-specific/linux/musl/fexecve-execveat.patch new file mode 100644 index 000000000000..6b3894a916c8 --- /dev/null +++ b/nixpkgs/pkgs/os-specific/linux/musl/fexecve-execveat.patch @@ -0,0 +1,33 @@ +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 + diff --git a/nixpkgs/pkgs/os-specific/linux/musl/fix-file-locking-race.patch b/nixpkgs/pkgs/os-specific/linux/musl/fix-file-locking-race.patch new file mode 100644 index 000000000000..2ef91390a691 --- /dev/null +++ b/nixpkgs/pkgs/os-specific/linux/musl/fix-file-locking-race.patch @@ -0,0 +1,54 @@ +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 + diff --git a/nixpkgs/pkgs/os-specific/linux/musl/fix-getaddrinfo-regression-with-AI_ADDRCONFIG.patch b/nixpkgs/pkgs/os-specific/linux/musl/fix-getaddrinfo-regression-with-AI_ADDRCONFIG.patch new file mode 100644 index 000000000000..d603c16f8062 --- /dev/null +++ b/nixpkgs/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/nixpkgs/pkgs/os-specific/linux/musl/max-handle-sz-for-name-to-handle-at.patch b/nixpkgs/pkgs/os-specific/linux/musl/max-handle-sz-for-name-to-handle-at.patch new file mode 100644 index 000000000000..aa00b4619f86 --- /dev/null +++ b/nixpkgs/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/nixpkgs/pkgs/os-specific/linux/musl/name-to-handle-at.patch b/nixpkgs/pkgs/os-specific/linux/musl/name-to-handle-at.patch new file mode 100644 index 000000000000..10cd8a9947c8 --- /dev/null +++ b/nixpkgs/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/nixpkgs/pkgs/os-specific/linux/musl/stacksize-bump.patch b/nixpkgs/pkgs/os-specific/linux/musl/stacksize-bump.patch new file mode 100644 index 000000000000..fb5373005cbf --- /dev/null +++ b/nixpkgs/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 + diff --git a/nixpkgs/pkgs/os-specific/linux/musl/tty-more-precise-errors.patch b/nixpkgs/pkgs/os-specific/linux/musl/tty-more-precise-errors.patch new file mode 100644 index 000000000000..06b108559e46 --- /dev/null +++ b/nixpkgs/pkgs/os-specific/linux/musl/tty-more-precise-errors.patch @@ -0,0 +1,51 @@ +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 + |