summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--system/musl/APKBUILD6
-rw-r--r--system/musl/amalgamation.patch366
-rw-r--r--system/musl/stdio.patch69
3 files changed, 439 insertions, 2 deletions
diff --git a/system/musl/APKBUILD b/system/musl/APKBUILD
index 0b6d3a959..dbb13a56f 100644
--- a/system/musl/APKBUILD
+++ b/system/musl/APKBUILD
@@ -1,7 +1,7 @@
# Maintainer: A. Wilcox <awilfox@adelielinux.org>
pkgname=musl
pkgver=1.1.21
-pkgrel=3
+pkgrel=4
pkgdesc="System library (libc) implementation"
url="https://www.musl-libc.org/"
arch="all"
@@ -27,6 +27,7 @@ source="https://www.musl-libc.org/releases/musl-$pkgver.tar.gz
handle-aux-at_base.patch
fgetspent_r.patch
gettext-preserve-errno.patch
+ stdio.patch
ldconfig
getent.c
@@ -120,11 +121,12 @@ utils() {
}
sha512sums="fa6c4cc012626c5e517e0e10926fc845e3aa5f863ffaceeb38ac5b9ce0af631a37f6b94f470997db09aa0d5e03f4f28a2db83484b0f98481bea2239c1989d363 musl-1.1.21.tar.gz
-3162b778101a46d9fb3a38927e3c4969781ccdabb9bb72de10d48ea31691215ecba605faee945ed86144a7e31fc948c31c2fee2881dc07897be3e82b6c6ff1e6 amalgamation.patch
+e2227bf201e13fc5a537bc47096dfa4d2ff45fc7ce5609a7c1d640e11215cf8a62d7652a4d17d25ab5c13406ef14fd4856397fc2056419fd1a83c8c37171fdc1 amalgamation.patch
88ae443dbb8e0a4368235bdc3a1c5c7b718495afa75e06deb8e01becc76cb1f0d6964589e2204fc749c9c1b3190b8b9ac1ae2c0099cab8e2ce3ec877103d4332 3001-make-real-lastlog-h.patch
6a7ff16d95b5d1be77e0a0fbb245491817db192176496a57b22ab037637d97a185ea0b0d19da687da66c2a2f5578e4343d230f399d49fe377d8f008410974238 handle-aux-at_base.patch
ded41235148930f8cf781538f7d63ecb0c65ea4e8ce792565f3649ee2523592a76b2a166785f0b145fc79f5852fd1fb1729a7a09110b3b8f85cba3912e790807 fgetspent_r.patch
db180e437b8b7582e4d2baf06b592b88a9f6e5a8f18b7afa81d7a707240a774273778f8fec1c5cbea2a137e00cca49ff08fe762c871be20c70b50104b7e8e1e1 gettext-preserve-errno.patch
+14862273d0facbec042f444dfa477d1793b16b68e058bf7038f492cb6e3f3c278b1c3ea8bd89816e4e8b847ffd48ac7c3abd55504769fccd02356f6f80af2fd4 stdio.patch
cce2f1eeb61e55674469c26871a573cce61d739c3defe9c8f56f2b774f6ba5435849ad542a6714120efddc98c297098e9c98a1a424ac593df2243d4aa479f9a9 ldconfig
378d70e65bcc65bb4e1415354cecfa54b0c1146dfb24474b69e418cdbf7ad730472cd09f6f103e1c99ba6c324c9560bccdf287f5889bbc3ef0bdf0e08da47413 getent.c
9d42d66fb1facce2b85dad919be5be819ee290bd26ca2db00982b2f8e055a0196290a008711cbe2b18ec9eee8d2270e3b3a4692c5a1b807013baa5c2b70a2bbf iconv.c"
diff --git a/system/musl/amalgamation.patch b/system/musl/amalgamation.patch
index d4d4465dc..fa118c910 100644
--- a/system/musl/amalgamation.patch
+++ b/system/musl/amalgamation.patch
@@ -280,3 +280,369 @@ index 03c5a77b..c423b825 100644
int ret = __clock_gettime(CLOCK_REALTIME, ts);
return ret < 0 ? 0 : base;
}
+diff --git a/src/stdio/setvbuf.c b/src/stdio/setvbuf.c
+index 06ea296c..523dddc8 100644
+--- a/src/stdio/setvbuf.c
++++ b/src/stdio/setvbuf.c
+@@ -12,13 +12,15 @@ int setvbuf(FILE *restrict f, char *restrict buf, int type, size_t size)
+
+ if (type == _IONBF) {
+ f->buf_size = 0;
+- } else {
++ } else if (type == _IOLBF || type == _IOFBF) {
+ if (buf && size >= UNGET) {
+ f->buf = (void *)(buf + UNGET);
+ f->buf_size = size - UNGET;
+ }
+ if (type == _IOLBF && f->buf_size)
+ f->lbf = '\n';
++ } else {
++ return -1;
+ }
+
+ f->flags |= F_SVB;
+diff --git a/src/unistd/getcwd.c b/src/unistd/getcwd.c
+index f407ffe0..4fd3a60c 100644
+--- a/src/unistd/getcwd.c
++++ b/src/unistd/getcwd.c
+@@ -15,8 +15,11 @@ char *getcwd(char *buf, size_t size)
+ return 0;
+ }
+ long ret = syscall(SYS_getcwd, buf, size);
+- if (ret < 0)
++ if (ret < 0) {
++ if (errno == ENAMETOOLONG)
++ errno = ENOMEM;
+ return 0;
++ }
+ if (ret == 0 || buf[0] != '/') {
+ errno = ENOENT;
+ return 0;
+diff --git a/include/tar.h b/include/tar.h
+index 2eba66ec..d15bd9b4 100644
+--- a/include/tar.h
++++ b/include/tar.h
+@@ -5,9 +5,7 @@
+
+ #define TSUID 04000
+ #define TSGID 02000
+-#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) || defined(_XOPEN_SOURCE)
+ #define TSVTX 01000
+-#endif
+ #define TUREAD 00400
+ #define TUWRITE 00200
+ #define TUEXEC 00100
+diff --git a/src/conf/fpathconf.c b/src/conf/fpathconf.c
+index b6a9d63e..83e47e87 100644
+--- a/src/conf/fpathconf.c
++++ b/src/conf/fpathconf.c
+@@ -5,7 +5,7 @@
+ long fpathconf(int fd, int name)
+ {
+ static const long values[] = {
+- [_PC_LINK_MAX] = _POSIX_LINK_MAX,
++ [_PC_LINK_MAX] = -1,
+ [_PC_MAX_CANON] = _POSIX_MAX_CANON,
+ [_PC_MAX_INPUT] = _POSIX_MAX_INPUT,
+ [_PC_NAME_MAX] = NAME_MAX,
+diff --git a/include/unistd.h b/include/unistd.h
+index 1bdd3292..cdb16c19 100644
+--- a/include/unistd.h
++++ b/include/unistd.h
+@@ -33,16 +33,23 @@ extern "C" {
+ #include <bits/alltypes.h>
+
+ int pipe(int [2]);
+-int pipe2(int [2], int);
+ int close(int);
+-int posix_close(int, int);
+ int dup(int);
+ int dup2(int, int);
+-int dup3(int, int, int);
+ off_t lseek(int, off_t, int);
+ int fsync(int);
+ int fdatasync(int);
+
++#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) \
++ || (defined(_XOPEN_SOURCE) && _XOPEN_SOURCE+0 > 700) \
++ || (defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE+0 > 200809L)
++int pipe2(int [2], int);
++int dup3(int, int, int);
++int posix_close(int, int);
++
++#define POSIX_CLOSE_RESTART 0
++#endif
++
+ ssize_t read(int, void *, size_t);
+ ssize_t write(int, const void *, size_t);
+ ssize_t pread(int, void *, size_t, off_t);
+@@ -200,8 +207,6 @@ int eaccess(const char *, int);
+ #define off64_t off_t
+ #endif
+
+-#define POSIX_CLOSE_RESTART 0
+-
+ #define _XOPEN_VERSION 700
+ #define _XOPEN_UNIX 1
+ #define _XOPEN_ENH_I18N 1
+diff --git a/src/misc/forkpty.c b/src/misc/forkpty.c
+index caf13adb..047eb7d6 100644
+--- a/src/misc/forkpty.c
++++ b/src/misc/forkpty.c
+@@ -1,3 +1,4 @@
++#define _GNU_SOURCE
+ #include <pty.h>
+ #include <utmp.h>
+ #include <unistd.h>
+diff --git a/src/misc/wordexp.c b/src/misc/wordexp.c
+index db83a69f..1ae03f9f 100644
+--- a/src/misc/wordexp.c
++++ b/src/misc/wordexp.c
+@@ -1,3 +1,4 @@
++#define _GNU_SOURCE
+ #include <wordexp.h>
+ #include <unistd.h>
+ #include <stdio.h>
+diff --git a/src/stdio/popen.c b/src/stdio/popen.c
+index 92cb57ee..1ff9e0d9 100644
+--- a/src/stdio/popen.c
++++ b/src/stdio/popen.c
+@@ -1,3 +1,4 @@
++#define _GNU_SOURCE
+ #include <fcntl.h>
+ #include <unistd.h>
+ #include <errno.h>
+diff --git a/src/unistd/faccessat.c b/src/unistd/faccessat.c
+index 76bbd4c7..d5e70608 100644
+--- a/src/unistd/faccessat.c
++++ b/src/unistd/faccessat.c
+@@ -1,3 +1,4 @@
++#define _GNU_SOURCE
+ #include <unistd.h>
+ #include <fcntl.h>
+ #include <sys/wait.h>
+diff --git a/include/fcntl.h b/include/fcntl.h
+index 4d91338b..04321887 100644
+--- a/include/fcntl.h
++++ b/include/fcntl.h
+@@ -36,8 +36,9 @@ int openat(int, const char *, int, ...);
+ int posix_fadvise(int, off_t, off_t, int);
+ int posix_fallocate(int, off_t, off_t);
+
+-#define O_SEARCH O_PATH
+-#define O_EXEC O_PATH
++#define O_SEARCH O_PATH
++#define O_EXEC O_PATH
++#define O_TTY_INIT 0
+
+ #define O_ACCMODE (03|O_SEARCH)
+ #define O_RDONLY 00
+diff --git a/src/dirent/fdopendir.c b/src/dirent/fdopendir.c
+index c377271d..d78fb87f 100644
+--- a/src/dirent/fdopendir.c
++++ b/src/dirent/fdopendir.c
+@@ -13,6 +13,10 @@ DIR *fdopendir(int fd)
+ if (fstat(fd, &st) < 0) {
+ return 0;
+ }
++ if (fcntl(fd, F_GETFL) & O_PATH) {
++ errno = EBADF;
++ return 0;
++ }
+ if (!S_ISDIR(st.st_mode)) {
+ errno = ENOTDIR;
+ return 0;
+diff --git a/src/unistd/renameat.c b/src/unistd/renameat.c
+index 12574822..07386407 100644
+--- a/src/unistd/renameat.c
++++ b/src/unistd/renameat.c
+@@ -1,7 +1,38 @@
++#include <errno.h>
++#include <libgen.h>
++#include <limits.h>
+ #include <stdio.h>
++#include <string.h>
+ #include "syscall.h"
+
+ int renameat(int oldfd, const char *old, int newfd, const char *new)
+ {
++ char old_copy[PATH_MAX+1], new_copy[PATH_MAX+1];
++ char *base;
++
++ if (strlen(old) > PATH_MAX || strlen(new) > PATH_MAX) {
++ errno = ENAMETOOLONG;
++ return -1;
++ }
++
++ if (strlen(old) == 0 || strlen(new) == 0) {
++ errno = ENOENT;
++ return -1;
++ }
++
++ strcpy(old_copy, old);
++ strcpy(new_copy, new);
++
++ base = basename(old_copy);
++ strncpy(old_copy, base, sizeof(old_copy));
++ base = basename(new_copy);
++ strncpy(new_copy, base, sizeof(new_copy));
++
++ if (strcmp(old_copy, ".") == 0 || strcmp(old_copy, "..") == 0 ||
++ strcmp(new_copy, ".") == 0 || strcmp(new_copy, "..") == 0) {
++ errno = EINVAL;
++ return -1;
++ }
++
+ return syscall(SYS_renameat, oldfd, old, newfd, new);
+ }
+diff --git a/src/unistd/renameat.c b/src/unistd/renameat.c
+index 07386407..7e850401 100644
+--- a/src/unistd/renameat.c
++++ b/src/unistd/renameat.c
+@@ -1,16 +1,23 @@
+ #include <errno.h>
++#include <fcntl.h>
+ #include <libgen.h>
+ #include <limits.h>
+ #include <stdio.h>
+ #include <string.h>
++#include <sys/stat.h>
++#include <sys/types.h>
++#include <unistd.h>
+ #include "syscall.h"
+
+ int renameat(int oldfd, const char *old, int newfd, const char *new)
+ {
+ char old_copy[PATH_MAX+1], new_copy[PATH_MAX+1];
+ char *base;
++ size_t old_size, new_size;
++ struct stat statbuf;
+
+- if (strlen(old) > PATH_MAX || strlen(new) > PATH_MAX) {
++ if ((old_size = strlen(old)) > PATH_MAX || \
++ (new_size = strlen(new)) > PATH_MAX) {
+ errno = ENAMETOOLONG;
+ return -1;
+ }
+@@ -34,5 +41,31 @@ int renameat(int oldfd, const char *old, int newfd, const char *new)
+ return -1;
+ }
+
++ /* The Linux kernel will fail when attempting to rename a symlink of a
++ directory with a trailing slash. We therefore have to handle this
++ case ourselves. */
++ if (old[old_size - 1] == '/') {
++ /* Calling stat(2) on a symlink to a dir with the trailing
++ slash causes stat(2) to return the actual directory instead
++ of the symlink itself. */
++ strcpy(old_copy, old);
++ old_copy[old_size - 1] = '\0';
++ if (fstatat(oldfd, old_copy, &statbuf, AT_SYMLINK_NOFOLLOW) == -1) {
++ return -1;
++ }
++ if (S_ISLNK(statbuf.st_mode)) {
++ if (fstatat(oldfd, old, &statbuf, 0) == -1) {
++ return -1;
++ }
++ if (S_ISDIR(statbuf.st_mode)) {
++ old = old_copy;
++ } else {
++ /* may as well not waste the syscall */
++ errno = ENOTDIR;
++ return -1;
++ }
++ }
++ }
++
+ return syscall(SYS_renameat, oldfd, old, newfd, new);
+ }
+diff --git a/src/unistd/renameat.c b/src/unistd/renameat.c
+index d0f31c21..e2f03d39 100644
+--- a/src/unistd/renameat.c
++++ b/src/unistd/renameat.c
+@@ -9,12 +9,31 @@
+ #include <unistd.h>
+ #include "syscall.h"
+
++static inline int test_symlink_dirness(int fd, const char *pathname)
++{
++ struct stat statbuf;
++ if (fstatat(fd, pathname, &statbuf, AT_SYMLINK_NOFOLLOW) == -1) {
++ return 1;
++ }
++ if (S_ISLNK(statbuf.st_mode)) {
++ if (fstatat(fd, pathname, &statbuf, 0) == -1) return 1;
++
++ if (S_ISDIR(statbuf.st_mode)) return 0;
++ else {
++ errno = ENOTDIR;
++ return -1;
++ }
++ }
++ return 1;
++}
++
+ int renameat(int oldfd, const char *old, int newfd, const char *new)
+ {
+ char old_copy[PATH_MAX+1], new_copy[PATH_MAX+1];
+ char *base;
+ size_t old_size, new_size;
+- struct stat statbuf;
++ struct stat oldstat, newstat;
++ int r;
+
+ if ((old_size = strlen(old)) > PATH_MAX || \
+ (new_size = strlen(new)) > PATH_MAX) {
+@@ -22,11 +41,18 @@ int renameat(int oldfd, const char *old, int newfd, const char *new)
+ return -1;
+ }
+
+- if (strlen(old) == 0 || strlen(new) == 0) {
++ if (old_size == 0 || new_size == 0) {
+ errno = ENOENT;
+ return -1;
+ }
+
++ /* Test equality of old and new.
++ If they both resolve to the same dentry, we do nothing. */
++ if (fstatat(oldfd, old, &oldstat, 0) == 0 && \
++ fstatat(newfd, new, &newstat, 0) == 0 && \
++ oldstat.st_dev == newstat.st_dev && \
++ oldstat.st_ino == newstat.st_ino) return 0;
++
+ strcpy(old_copy, old);
+ strcpy(new_copy, new);
+
+@@ -50,21 +76,17 @@ int renameat(int oldfd, const char *old, int newfd, const char *new)
+ of the symlink itself. */
+ strcpy(old_copy, old);
+ old_copy[old_size - 1] = '\0';
+- if (fstatat(oldfd, old_copy, &statbuf, AT_SYMLINK_NOFOLLOW) == -1) {
+- return -1;
+- }
+- if (S_ISLNK(statbuf.st_mode)) {
+- if (fstatat(oldfd, old, &statbuf, 0) == -1) {
+- return -1;
+- }
+- if (S_ISDIR(statbuf.st_mode)) {
+- old = old_copy;
+- } else {
+- /* may as well not waste the syscall */
+- errno = ENOTDIR;
+- return -1;
+- }
+- }
++ r = test_symlink_dirness(oldfd, old_copy);
++ if (r == 0) old = old_copy;
++ else if (r == -1) return -1;
++ }
++
++ if (new[new_size - 1] == '/') {
++ strcpy(new_copy, new);
++ new_copy[new_size - 1] = '\0';
++ r = test_symlink_dirness(newfd, new_copy);
++ if (r == 0) new = new_copy;
++ else if (r == -1) return -1;
+ }
+
+ return syscall(SYS_renameat, oldfd, old, newfd, new);
diff --git a/system/musl/stdio.patch b/system/musl/stdio.patch
new file mode 100644
index 000000000..9ddfa5738
--- /dev/null
+++ b/system/musl/stdio.patch
@@ -0,0 +1,69 @@
+diff --git a/include/alltypes.h.in b/include/alltypes.h.in
+index 622ca01..4cc879b 100644
+--- a/include/alltypes.h.in
++++ b/include/alltypes.h.in
+@@ -57,6 +57,7 @@ TYPEDEF struct { unsigned __attr; } pthread_condattr_t;
+ TYPEDEF struct { unsigned __attr; } pthread_barrierattr_t;
+ TYPEDEF struct { unsigned __attr[2]; } pthread_rwlockattr_t;
+
++STRUCT _IO_FILE { char __x; };
+ TYPEDEF struct _IO_FILE FILE;
+
+ TYPEDEF struct __mbstate_t { unsigned __opaque1, __opaque2; } mbstate_t;
+diff --git a/include/stdio.h b/include/stdio.h
+index afadd91..3604198 100644
+--- a/include/stdio.h
++++ b/include/stdio.h
+@@ -11,6 +11,10 @@ extern "C" {
+ #define __NEED___isoc_va_list
+ #define __NEED_size_t
+
++#if __STDC_VERSION__ < 201112L
++#define __NEED_struct__IO_FILE
++#endif
++
+ #if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
+ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) \
+ || defined(_BSD_SOURCE)
+diff --git a/include/wchar.h b/include/wchar.h
+index 369b1e9..88eb55b 100644
+--- a/include/wchar.h
++++ b/include/wchar.h
+@@ -14,6 +14,10 @@ extern "C" {
+ #define __NEED_wint_t
+ #define __NEED_mbstate_t
+
++#if __STDC_VERSION__ < 201112L
++#define __NEED_struct__IO_FILE
++#endif
++
+ #if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
+ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+ #define __NEED_locale_t
+diff --git a/src/include/stdio.h b/src/include/stdio.h
+index 534c690..fae3755 100644
+--- a/src/include/stdio.h
++++ b/src/include/stdio.h
+@@ -1,6 +1,8 @@
+ #ifndef STDIO_H
+ #define STDIO_H
+
++#define __DEFINED_struct__IO_FILE
++
+ #include "../../include/stdio.h"
+
+ #undef stdin
+diff --git a/src/include/wchar.h b/src/include/wchar.h
+index e69de29..79f5d0e 100644
+--- a/src/include/wchar.h
++++ b/src/include/wchar.h
+@@ -0,0 +1,9 @@
++#ifndef WCHAR_H
++#define WCHAR_H
++
++#define __DEFINED_struct__IO_FILE
++
++#include "../../include/wchar.h"
++
++#endif
++